From fa87e261d9ead155fe71289fb1c2c308a430dd43 Mon Sep 17 00:00:00 2001 From: Benoit Moriceau Date: Fri, 9 Dec 2022 12:35:28 -0800 Subject: [PATCH] Bmoric/convert destination controller micronaut (#20269) * tmp * Fix build * tmp * Tmp * tmp * tmp * Tmp * tmp * tmp * Clean up * tmp * Convert Connection Api Controller * Tmp * PR Comments * convert openapiapicontroller to micronaut (#20258) * convert openapiapicontroller to micronaut * merge health/openapi locations into one entry * Fix bean * Add JsonSchemaValidator as a Bean * Fix build * Format * Format * Test fix * Pr comments * Remove media type * Format * Remove media type * Format * format * Add missing airbyte api client Co-authored-by: Cole Snodgrass --- .../airbyte/api/client/AirbyteApiClient.java | 2 +- airbyte-proxy/nginx-auth.conf.template | 4 +- airbyte-proxy/nginx-no-auth.conf.template | 4 +- .../java/io/airbyte/server/ServerFactory.java | 7 ---- .../server/apis/DestinationApiController.java | 33 ++++++++++----- .../apis/binders/DestinationApiBinder.java | 21 ---------- .../apis/factories/DestinationApiFactory.java | 40 ------------------- .../server/config/ApplicationBeanFactory.java | 8 ++++ .../converters/ConfigurationUpdate.java | 2 + .../server/handlers/DestinationHandler.java | 2 + 10 files changed, 39 insertions(+), 84 deletions(-) delete mode 100644 airbyte-server/src/main/java/io/airbyte/server/apis/binders/DestinationApiBinder.java delete mode 100644 airbyte-server/src/main/java/io/airbyte/server/apis/factories/DestinationApiFactory.java diff --git a/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java b/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java index bbf1eb9748c22..c981c585dd70a 100644 --- a/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java +++ b/airbyte-api/src/main/java/io/airbyte/api/client/AirbyteApiClient.java @@ -63,7 +63,7 @@ public class AirbyteApiClient { public AirbyteApiClient(final ApiClient apiClient, final ApiClient micronautApiClient) { connectionApi = new ConnectionApi(micronautApiClient); destinationDefinitionApi = new DestinationDefinitionApi(apiClient); - destinationApi = new DestinationApi(apiClient); + destinationApi = new DestinationApi(micronautApiClient); destinationSpecificationApi = new DestinationDefinitionSpecificationApi(apiClient); jobsApi = new JobsApi(apiClient); logsApi = new PatchedLogsApi(apiClient); diff --git a/airbyte-proxy/nginx-auth.conf.template b/airbyte-proxy/nginx-auth.conf.template index 625a6a6a8e211..f4afada3ea82a 100644 --- a/airbyte-proxy/nginx-auth.conf.template +++ b/airbyte-proxy/nginx-auth.conf.template @@ -38,7 +38,7 @@ http { } } - location ~ ^/api/v1/(connections|operations)/.* { + location ~ ^/api/v1/(connections|destinations|operations)/.* { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -93,7 +93,7 @@ http { } } - location ~ ^/api/v1/(connections|operations)/.* { + location ~ ^/api/v1/(connections|destinations|operations)/.* { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/airbyte-proxy/nginx-no-auth.conf.template b/airbyte-proxy/nginx-no-auth.conf.template index b3794e8bbcff6..664a048bbcbd4 100644 --- a/airbyte-proxy/nginx-no-auth.conf.template +++ b/airbyte-proxy/nginx-no-auth.conf.template @@ -20,7 +20,7 @@ http { proxy_pass "${PROXY_PASS_MICRONAUT_API}"; } - location ~ ^/api/v1/(connections|operations)/.* { + location ~ ^/api/v1/(connections|destinations|operations)/.* { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -48,7 +48,7 @@ http { proxy_pass "${PROXY_PASS_MICRONAUT_API}"; } - location ~ ^/api/v1/(connections|operations)/.* { + location ~ ^/api/v1/(connections|destinations|operations)/.* { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java b/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java index 0a47296f31bf9..9c869a29021dd 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java +++ b/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java @@ -13,7 +13,6 @@ import io.airbyte.config.persistence.SecretsRepositoryWriter; import io.airbyte.db.Database; import io.airbyte.persistence.job.JobPersistence; -import io.airbyte.server.apis.DestinationApiController; import io.airbyte.server.apis.DestinationDefinitionApiController; import io.airbyte.server.apis.DestinationDefinitionSpecificationApiController; import io.airbyte.server.apis.DestinationOauthApiController; @@ -30,7 +29,6 @@ import io.airbyte.server.apis.StateApiController; import io.airbyte.server.apis.WebBackendApiController; import io.airbyte.server.apis.WorkspaceApiController; -import io.airbyte.server.apis.binders.DestinationApiBinder; import io.airbyte.server.apis.binders.DestinationDefinitionApiBinder; import io.airbyte.server.apis.binders.DestinationDefinitionSpecificationApiBinder; import io.airbyte.server.apis.binders.DestinationOauthApiBinder; @@ -45,7 +43,6 @@ import io.airbyte.server.apis.binders.StateApiBinder; import io.airbyte.server.apis.binders.WebBackendApiBinder; import io.airbyte.server.apis.binders.WorkspaceApiBinder; -import io.airbyte.server.apis.factories.DestinationApiFactory; import io.airbyte.server.apis.factories.DestinationDefinitionApiFactory; import io.airbyte.server.apis.factories.DestinationDefinitionSpecificationApiFactory; import io.airbyte.server.apis.factories.DestinationOauthApiFactory; @@ -160,8 +157,6 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul final WebBackendCheckUpdatesHandler webBackendCheckUpdatesHandler) { final Map mdc = MDC.getCopyOfContextMap(); - DestinationApiFactory.setValues(destinationApiHandler, schedulerHandler, mdc); - DestinationDefinitionApiFactory.setValues(destinationDefinitionsHandler); DestinationDefinitionSpecificationApiFactory.setValues(schedulerHandler); @@ -192,7 +187,6 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul // server configuration final Set> componentClasses = Set.of( - DestinationApiController.class, DestinationDefinitionApiController.class, DestinationDefinitionSpecificationApiController.class, DestinationOauthApiController.class, @@ -211,7 +205,6 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul WorkspaceApiController.class); final Set components = Set.of( - new DestinationApiBinder(), new DestinationDefinitionApiBinder(), new DestinationDefinitionSpecificationApiBinder(), new DestinationOauthApiBinder(), diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java index 8cbdbb5cd6d0c..208e39e1fbfd6 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java @@ -16,61 +16,72 @@ import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.server.handlers.DestinationHandler; import io.airbyte.server.handlers.SchedulerHandler; -import javax.ws.rs.Path; +import io.micronaut.http.annotation.Body; +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Post; import lombok.AllArgsConstructor; -@Path("/v1/destinations") +@Controller("/api/v1/destinations") @AllArgsConstructor public class DestinationApiController implements DestinationApi { private final DestinationHandler destinationHandler; private final SchedulerHandler schedulerHandler; + @Post(uri = "/check_connection") @Override - public CheckConnectionRead checkConnectionToDestination(final DestinationIdRequestBody destinationIdRequestBody) { + public CheckConnectionRead checkConnectionToDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) { return ApiHelper.execute(() -> schedulerHandler.checkDestinationConnectionFromDestinationId(destinationIdRequestBody)); } + @Post(uri = "/check_connection_for_update") @Override - public CheckConnectionRead checkConnectionToDestinationForUpdate(final DestinationUpdate destinationUpdate) { + public CheckConnectionRead checkConnectionToDestinationForUpdate(@Body final DestinationUpdate destinationUpdate) { return ApiHelper.execute(() -> schedulerHandler.checkDestinationConnectionFromDestinationIdForUpdate(destinationUpdate)); } + @Post(uri = "/clone") @Override - public DestinationRead cloneDestination(final DestinationCloneRequestBody destinationCloneRequestBody) { + public DestinationRead cloneDestination(@Body final DestinationCloneRequestBody destinationCloneRequestBody) { return ApiHelper.execute(() -> destinationHandler.cloneDestination(destinationCloneRequestBody)); } + @Post(uri = "/create") @Override - public DestinationRead createDestination(final DestinationCreate destinationCreate) { + public DestinationRead createDestination(@Body final DestinationCreate destinationCreate) { return ApiHelper.execute(() -> destinationHandler.createDestination(destinationCreate)); } + @Post(uri = "/delete") @Override - public void deleteDestination(final DestinationIdRequestBody destinationIdRequestBody) { + public void deleteDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) { ApiHelper.execute(() -> { destinationHandler.deleteDestination(destinationIdRequestBody); return null; }); } + @Post(uri = "/get") @Override - public DestinationRead getDestination(final DestinationIdRequestBody destinationIdRequestBody) { + public DestinationRead getDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) { return ApiHelper.execute(() -> destinationHandler.getDestination(destinationIdRequestBody)); } + @Post(uri = "/list") @Override - public DestinationReadList listDestinationsForWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody) { + public DestinationReadList listDestinationsForWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> destinationHandler.listDestinationsForWorkspace(workspaceIdRequestBody)); } + @Post(uri = "/search") @Override - public DestinationReadList searchDestinations(final DestinationSearch destinationSearch) { + public DestinationReadList searchDestinations(@Body final DestinationSearch destinationSearch) { return ApiHelper.execute(() -> destinationHandler.searchDestinations(destinationSearch)); } + @Post(uri = "/update") @Override - public DestinationRead updateDestination(final DestinationUpdate destinationUpdate) { + public DestinationRead updateDestination(@Body final DestinationUpdate destinationUpdate) { return ApiHelper.execute(() -> destinationHandler.updateDestination(destinationUpdate)); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/binders/DestinationApiBinder.java b/airbyte-server/src/main/java/io/airbyte/server/apis/binders/DestinationApiBinder.java deleted file mode 100644 index a1ae3cd38e8a8..0000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/binders/DestinationApiBinder.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.server.apis.binders; - -import io.airbyte.server.apis.DestinationApiController; -import io.airbyte.server.apis.factories.DestinationApiFactory; -import org.glassfish.hk2.utilities.binding.AbstractBinder; -import org.glassfish.jersey.process.internal.RequestScoped; - -public class DestinationApiBinder extends AbstractBinder { - - @Override - protected void configure() { - bindFactory(DestinationApiFactory.class) - .to(DestinationApiController.class) - .in(RequestScoped.class); - } - -} diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/factories/DestinationApiFactory.java b/airbyte-server/src/main/java/io/airbyte/server/apis/factories/DestinationApiFactory.java deleted file mode 100644 index 2dcd6aa627140..0000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/factories/DestinationApiFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.server.apis.factories; - -import io.airbyte.server.apis.DestinationApiController; -import io.airbyte.server.handlers.DestinationHandler; -import io.airbyte.server.handlers.SchedulerHandler; -import java.util.Map; -import org.glassfish.hk2.api.Factory; -import org.slf4j.MDC; - -public class DestinationApiFactory implements Factory { - - private static DestinationHandler destinationHandler; - private static SchedulerHandler schedulerHandler; - private static Map mdc; - - public static void setValues(final DestinationHandler destinationHandler, - final SchedulerHandler schedulerHandler, - final Map mdc) { - DestinationApiFactory.destinationHandler = destinationHandler; - DestinationApiFactory.schedulerHandler = schedulerHandler; - DestinationApiFactory.mdc = mdc; - } - - @Override - public DestinationApiController provide() { - MDC.setContextMap(DestinationApiFactory.mdc); - - return new DestinationApiController(destinationHandler, schedulerHandler); - } - - @Override - public void dispose(final DestinationApiController instance) { - /* no op */ - } - -} diff --git a/airbyte-server/src/main/java/io/airbyte/server/config/ApplicationBeanFactory.java b/airbyte-server/src/main/java/io/airbyte/server/config/ApplicationBeanFactory.java index 0dcf0d74338ba..83e40ddc5f6e9 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/config/ApplicationBeanFactory.java +++ b/airbyte-server/src/main/java/io/airbyte/server/config/ApplicationBeanFactory.java @@ -13,6 +13,7 @@ import io.airbyte.config.Configs.DeploymentMode; import io.airbyte.config.Configs.TrackingStrategy; import io.airbyte.config.persistence.ConfigRepository; +import io.airbyte.config.persistence.split_secrets.JsonSecretsProcessor; import io.airbyte.persistence.job.JobPersistence; import io.airbyte.persistence.job.WebUrlHelper; import io.airbyte.persistence.job.tracker.JobTracker; @@ -85,6 +86,13 @@ public Path workspaceRoot(@Value("${airbyte.workspace.root}") final String works return Path.of(workspaceRoot); } + @Singleton + public JsonSecretsProcessor jsonSecretsProcessor(final FeatureFlags featureFlags) { + return JsonSecretsProcessor.builder() + .copySecrets(false) + .build(); + } + private T convertToEnum(final String value, final Function creatorFunction, final T defaultValue) { return StringUtils.isNotEmpty(value) ? creatorFunction.apply(value.toUpperCase(Locale.ROOT)) : defaultValue; } diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/ConfigurationUpdate.java b/airbyte-server/src/main/java/io/airbyte/server/converters/ConfigurationUpdate.java index f4ac339423cd1..8eaf31178ac71 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/ConfigurationUpdate.java +++ b/airbyte-server/src/main/java/io/airbyte/server/converters/ConfigurationUpdate.java @@ -16,9 +16,11 @@ import io.airbyte.config.persistence.split_secrets.JsonSecretsProcessor; import io.airbyte.protocol.models.ConnectorSpecification; import io.airbyte.validation.json.JsonValidationException; +import jakarta.inject.Singleton; import java.io.IOException; import java.util.UUID; +@Singleton public class ConfigurationUpdate { private final ConfigRepository configRepository; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationHandler.java index a828448c77a9b..1e95070775594 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationHandler.java @@ -30,11 +30,13 @@ import io.airbyte.server.converters.ConfigurationUpdate; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; +import jakarta.inject.Singleton; import java.io.IOException; import java.util.List; import java.util.UUID; import java.util.function.Supplier; +@Singleton public class DestinationHandler { private final ConnectionsHandler connectionsHandler;