Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 4 additions & 58 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.13</version>
<groupId>com.dnastack.starter</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>4.0.0-rc2-9-gd79f5a8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

Expand All @@ -18,35 +18,11 @@

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${version.joda}</version>
</dependency>
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-bom</artifactId>
<type>pom</type>
<version>${jdbi.version}</version>
<scope>import</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

Expand All @@ -57,16 +33,7 @@
<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
<maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- DNAstack Libs-->
<dnastack-token-validator.version>1.0.18</dnastack-token-validator.version>
<audit-event-logger.version>1.0.20</audit-event-logger.version>
<oauth-client-factory.version>1.0.5</oauth-client-factory.version>
<!-- Pin Jackson to 2.18.x: dnastack-oauth-client-factory-spring-starter 1.0.5 uses
removed-in-2.19 PropertyNamingStrategy.SNAKE_CASE API. Remove when bumping the lib. -->
<jackson-bom.version>2.18.6</jackson-bom.version>
<!-- Other -->
<spring-cloud.version>2021.0.9</spring-cloud.version>
<jdbi.version>3.49.5</jdbi.version>
<version.okhttp>4.12.0</version.okhttp>
<version.trino>359</version.trino>
<version.guava>32.1.3-jre</version.guava>
Expand All @@ -76,10 +43,7 @@
<assertj.version>3.27.7</assertj.version>
<feign.version>13.6</feign.version>
<feign-form.version>3.8.0</feign-form.version>
<logback-extensions.version>1.0.1</logback-extensions.version>
<logback.version>1.5.25</logback.version>
<lombok.version>1.18.42</lombok.version>
<resilience4j.version>2.3.0</resilience4j.version>

<!-- Testing - Java 23 support. These overrides can be removed when we upgrade spring-boot-starter-parent to a version that supports Java 23. -->
<mockito.version>5.20.0</mockito.version>
Expand Down Expand Up @@ -169,7 +133,7 @@
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
<artifactId>micrometer-tracing-bridge-otel</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
Expand Down Expand Up @@ -261,62 +225,44 @@
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-retry</artifactId>
<version>${resilience4j.version}</version>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-core</artifactId>
<version>${resilience4j.version}</version>
</dependency>

<!--Supporting-->
<dependency>
<groupId>com.dnastack</groupId>
<artifactId>dnastack-token-validator</artifactId>
<version>${dnastack-token-validator.version}</version>
</dependency>

<!-- Audit Event Logger -->
<dependency>
<groupId>com.dnastack</groupId>
<artifactId>spring-boot-audit-event-logger</artifactId>
<version>${audit-event-logger.version}</version>
<exclusions>
<exclusion>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-metrics-micrometer</artifactId>
</exclusion>
<exclusion>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>com.dnastack</groupId>
<artifactId>dnastack-oauth-client-factory-spring-starter</artifactId>
<version>${oauth-client-factory.version}</version>
</dependency>

<!-- Customized Logging -->
<dependency>
<groupId>com.dnastack</groupId>
<artifactId>logback-extensions</artifactId>
<version>${logback-extensions.version}</version>
</dependency>

<!-- Zonky Test-->
<dependency>
<groupId>io.zonky.test</groupId>
<artifactId>embedded-database-spring-test</artifactId>
<version>2.6.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.zonky.test</groupId>
<artifactId>embedded-postgres</artifactId>
<version>2.1.1</version>
<scope>test</scope>
</dependency>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.dnastack.ga4gh.dataconnect;

import brave.Tracing;
import com.dnastack.auth.JwtTokenParser;
import com.dnastack.auth.JwtTokenParserFactory;
import com.dnastack.auth.PermissionChecker;
import com.dnastack.auth.PermissionCheckerFactory;
import com.dnastack.auth.client.OidcHttpClient;
import com.dnastack.auth.client.TokenActionsHttpClientFactory;
import com.dnastack.auth.keyresolver.CachingIssuerPubKeyJwksResolver;
import com.dnastack.auth.keyresolver.IssuerPubKeyStaticResolver;
Expand All @@ -21,8 +21,10 @@
import io.jsonwebtoken.JwsHeader;
import io.jsonwebtoken.JwtException;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.observation.ObservationRegistry;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
Expand Down Expand Up @@ -96,9 +98,14 @@ public OkHttpClient httpClient() {
}

@Bean
public TrinoClient getTrinoClient(OkHttpClient httpClient, Tracing tracing, ServiceAccountAuthenticator accountAuthenticator, MeterRegistry registry) {
public TrinoClient getTrinoClient(OkHttpClient httpClient, io.micrometer.tracing.Tracer tracer, ServiceAccountAuthenticator accountAuthenticator, MeterRegistry registry) {
return new TrinoTelemetryClient(
new TrinoHttpClient(tracing, httpClient, trinoDatasourceUrl, accountAuthenticator), registry);
new TrinoHttpClient(tracer, httpClient, trinoDatasourceUrl, accountAuthenticator), registry);
}

@Bean
public ConnectionPool tokenValidatorConnectionPool() {
return new ConnectionPool();
}

@Bean
Expand Down Expand Up @@ -210,7 +217,12 @@ public SecurityFilterChain configure(HttpSecurity http) throws Exception {
}

@Bean
public List<IssuerInfo> allowedIssuers(AuthConfig authConfig) {
public OidcHttpClient oidcHttpClient(ObservationRegistry observationRegistry, ConnectionPool tokenValidatorConnectionPool) {
return new OidcHttpClient(observationRegistry, tokenValidatorConnectionPool);
}

@Bean
public List<IssuerInfo> allowedIssuers(AuthConfig authConfig, OidcHttpClient oidcHttpClient) {
List<AuthConfig.IssuerConfig> issuers = authConfig.getTokenIssuers();
if (issuers == null || issuers.isEmpty()) {
throw new IllegalArgumentException("At least one token issuer must be defined");
Expand All @@ -224,7 +236,7 @@ public List<IssuerInfo> allowedIssuers(AuthConfig authConfig) {
.allowedAudiences(issuerConfig.getAudiences())
.publicKeyResolver(issuerConfig.getRsaPublicKey() != null
? new IssuerPubKeyStaticResolver(issuerUri, issuerConfig.getRsaPublicKey())
: new CachingIssuerPubKeyJwksResolver(issuerUri))
: CachingIssuerPubKeyJwksResolver.create(issuerUri, oidcHttpClient))
.build();
})
.toList();
Expand All @@ -236,10 +248,11 @@ public PermissionChecker permissionChecker(
List<IssuerInfo> allowedIssuers,
@Value("${app.url}") String policyEvaluationRequester,
@Value("${app.auth.token-issuers[0].issuer-uri}") String walletUrl,
Tracing tracing
ObservationRegistry observationRegistry,
ConnectionPool tokenValidatorConnectionPool
) {
String policyEvaluationUrl = stripTrailingSlashes(walletUrl) + "/policies/evaluations";
return PermissionCheckerFactory.create(allowedIssuers, policyEvaluationRequester, policyEvaluationUrl, tracing);
return PermissionCheckerFactory.create(allowedIssuers, policyEvaluationRequester, policyEvaluationUrl, observationRegistry, tokenValidatorConnectionPool);
}

private String stripTrailingSlashes(String url) {
Expand All @@ -251,8 +264,9 @@ private String stripTrailingSlashes(String url) {
}

@Bean
public JwtDecoder jwtDecoder(List<IssuerInfo> allowedIssuers, PermissionChecker permissionChecker, Tracing tracing) {
final JwtTokenParser jwtTokenParser = JwtTokenParserFactory.create(allowedIssuers, TokenActionsHttpClientFactory.create(tracing));
public JwtDecoder jwtDecoder(List<IssuerInfo> allowedIssuers, PermissionChecker permissionChecker, ObservationRegistry observationRegistry, ConnectionPool tokenValidatorConnectionPool) {
final JwtTokenParser jwtTokenParser = JwtTokenParserFactory.create(allowedIssuers,
TokenActionsHttpClientFactory.create(observationRegistry, tokenValidatorConnectionPool));
return (jwtToken) -> {
try {
permissionChecker.checkPermissions(jwtToken);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.dnastack.ga4gh.dataconnect.adapter.shared;

import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Value;

import java.util.Map;

@Value
@JsonNaming(PropertyNamingStrategy.KebabCaseStrategy.class)
@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy.class)
public class DataConnectAuthRequest {
String key;
String resourceType;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.dnastack.ga4gh.dataconnect.adapter.shared;

import brave.Tracer;
import io.micrometer.tracing.Tracer;
import com.dnastack.ga4gh.dataconnect.adapter.trino.exception.TableApiErrorException;
import com.dnastack.ga4gh.dataconnect.model.TableError;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -24,12 +24,12 @@ public ResponseEntity<?> handleAuthRequiredException(AuthRequiredException e) {
return ResponseEntity.status(401)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.header("WWW-Authenticate", "GA4GH-Search realm=\"" + escapeQuotes(cr.getKey()) + "\"")
.body(Map.of("authorization-request", cr, "trace_id", tracer.currentSpan().context().traceIdString()));
.body(Map.of("authorization-request", cr, "trace_id", tracer.currentSpan().context().traceId()));
}

@ExceptionHandler({TableApiErrorException.class})
public ResponseEntity<?> handleTableApiErrorException(TableApiErrorException throwable) {
String traceId = tracer.currentSpan().context().traceIdString();
String traceId = tracer.currentSpan().context().traceId();
TableError error = TableError.fromThrowable(throwable.getCause(), null);
log.error("Generating response with error that escaped controller: {}", error, throwable);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.dnastack.ga4gh.dataconnect.adapter.trino;

import brave.Tracing;
import com.dnastack.auth.cache.CachingConcurrentHashMap;
import com.dnastack.ga4gh.dataconnect.ApplicationConfig;
import com.dnastack.ga4gh.dataconnect.DataModelSupplier;
Expand All @@ -15,6 +14,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeType;
import com.google.common.collect.Streams;
import io.micrometer.tracing.Tracer;
import jakarta.servlet.http.HttpServletRequest;
import lombok.Getter;
import lombok.SneakyThrows;
Expand Down Expand Up @@ -86,14 +86,14 @@ public String toString() {

private final ObjectMapper objectMapper;

private final Tracing tracer;
private final Tracer tracer;

public TrinoDataConnectAdapter(
TrinoClient client,
Jdbi jdbi,
ApplicationConfig applicationConfig,
List<DataModelSupplier> dataModelSuppliers,
Tracing tracer,
Tracer tracer,
// We use CachingConcurrentHashMap to cache the schema and catalog names to increase performance
// When paginating through the tables
@Value("${app.caching.expire-after:PT5M}") Duration expireAfter,
Expand Down Expand Up @@ -309,7 +309,7 @@ private QueryJob createQueryJob(String queryId, String query, DataModel dataMode
QueryJob queryJob = QueryJob.builder()
.query(query)
.id(queryId)
.originalTraceId(tracer.currentTraceContext().get().traceIdString())
.originalTraceId(tracer.currentTraceContext().context().traceId())
.startedAt(currentTime)
.lastActivityAt(currentTime)
.schema(tableSchema)
Expand Down
Loading