From e9484a50ab86f16eb03e8d0c2d074d942b647846 Mon Sep 17 00:00:00 2001 From: Cole Snodgrass Date: Mon, 12 Dec 2022 14:11:13 -0800 Subject: [PATCH] convert WorkspaceApiController to micronaut (#20214) * wip; broken * convert WorkspaceApiController to micronaut * remove test controller * format * format * add @Body to SourceOauthApiController * consolidate nginx settings * remove unnecessary factories --- .../airbyte/api/client/AirbyteApiClient.java | 2 +- .../persistence/job/WorkspaceHelper.java | 4 +- airbyte-proxy/nginx-auth.conf.template | 4 +- airbyte-proxy/nginx-no-auth.conf.template | 4 +- airbyte-server/build.gradle | 4 +- .../java/io/airbyte/server/ServerApp.java | 4 +- .../java/io/airbyte/server/ServerFactory.java | 12 +----- .../server/apis/SourceOauthApiController.java | 7 ++-- .../server/apis/WorkspaceApiController.java | 37 +++++++++++------ .../apis/binders/WorkspaceApiBinder.java | 21 ---------- .../apis/factories/WorkspaceApiFactory.java | 29 -------------- .../server/config/HelperBeanFactory.java | 21 ---------- .../server/handlers/DestinationHandler.java | 38 +++++++++--------- .../server/handlers/SourceHandler.java | 40 ++++++++++--------- .../server/handlers/WorkspacesHandler.java | 7 ++++ .../src/main/resources/application.yml | 2 + 16 files changed, 95 insertions(+), 141 deletions(-) delete mode 100644 airbyte-server/src/main/java/io/airbyte/server/apis/binders/WorkspaceApiBinder.java delete mode 100644 airbyte-server/src/main/java/io/airbyte/server/apis/factories/WorkspaceApiFactory.java delete mode 100644 airbyte-server/src/main/java/io/airbyte/server/config/HelperBeanFactory.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 16f52d4c77ecad..51c6de5701b75e 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 @@ -71,7 +71,7 @@ public AirbyteApiClient(final ApiClient apiClient, final ApiClient micronautApiC sourceDefinitionApi = new SourceDefinitionApi(micronautApiClient); sourceApi = new SourceApi(micronautApiClient); sourceDefinitionSpecificationApi = new SourceDefinitionSpecificationApi(apiClient); - workspaceApi = new WorkspaceApi(apiClient); + workspaceApi = new WorkspaceApi(micronautApiClient); healthApi = new HealthApi(micronautApiClient); attemptApi = new AttemptApi(micronautApiClient); stateApi = new StateApi(micronautApiClient); diff --git a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/WorkspaceHelper.java b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/WorkspaceHelper.java index 66b24c82b25b1c..ceb76e1f07303c 100644 --- a/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/WorkspaceHelper.java +++ b/airbyte-persistence/job-persistence/src/main/java/io/airbyte/persistence/job/WorkspaceHelper.java @@ -18,6 +18,7 @@ import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.persistence.job.models.Job; import io.airbyte.validation.json.JsonValidationException; +import jakarta.inject.Singleton; import java.io.IOException; import java.util.Objects; import java.util.UUID; @@ -30,6 +31,7 @@ // scheduler:persistence in order to get workspace ids for configs (e.g. source). Our options are to // split this helper by database or put it in a new module. @SuppressWarnings("PMD.AvoidCatchingThrowable") +@Singleton public class WorkspaceHelper { private static final Logger LOGGER = LoggerFactory.getLogger(WorkspaceHelper.class); @@ -106,7 +108,7 @@ public UUID load(@NonNull final Long jobId) throws ConfigNotFoundException, IOEx * There are generally two kinds of helper methods present here. The first kind propagate exceptions * for the method backing the cache. The second ignores them. The former is meant to be used with * proper api calls, while the latter is meant to be use with asserts and precondtions checks. - * + *

* In API calls, distinguishing between various exceptions helps return the correct status code. */ diff --git a/airbyte-proxy/nginx-auth.conf.template b/airbyte-proxy/nginx-auth.conf.template index ef79ab533d2db9..854feff0aa6ab2 100644 --- a/airbyte-proxy/nginx-auth.conf.template +++ b/airbyte-proxy/nginx-auth.conf.template @@ -43,7 +43,7 @@ http { } } - location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state)/.* { + location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state|workspaces)/.* { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -103,7 +103,7 @@ http { } } - location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state)/.* { + location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state|workspaces)/.* { 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 b64f7b96689e4d..ac1e40866acae0 100644 --- a/airbyte-proxy/nginx-no-auth.conf.template +++ b/airbyte-proxy/nginx-no-auth.conf.template @@ -25,7 +25,7 @@ http { proxy_pass "${PROXY_PASS_MICRONAUT_API}"; } - location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state)/.* { +location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state|workspaces)/.* { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -58,7 +58,7 @@ http { proxy_pass "${PROXY_PASS_MICRONAUT_API}"; } - location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state)/.* { + location ~ ^/api/v1/(connections|destinations|destination_definitions|destination_definition_specifications|destination_oauths|operations|scheduler|source_oauths|sources|source_definitions|state|workspaces)/.* { 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/build.gradle b/airbyte-server/build.gradle index f9eb7626b96446..aa00568bb652c2 100644 --- a/airbyte-server/build.gradle +++ b/airbyte-server/build.gradle @@ -41,13 +41,15 @@ dependencies { annotationProcessor platform(libs.micronaut.bom) annotationProcessor libs.bundles.micronaut.annotation.processor + annotationProcessor libs.micronaut.jaxrs.processor implementation platform(libs.micronaut.bom) implementation libs.bundles.micronaut + implementation libs.micronaut.jaxrs.server // Ensure that the versions defined in deps.toml are used // instead of versions from transitive dependencies - implementation (libs.flyway.core) { + implementation(libs.flyway.core) { force = true } diff --git a/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java b/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java index bfd6376bbd4541..ac88419c4c0c0f 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java +++ b/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java @@ -188,8 +188,8 @@ public static ServerRunnable getServer(final ServerFactory apiFactory, final Optional ephemeralSecretPersistence = SecretPersistence.getEphemeral(configsDslContext, configs); final ConfigRepository configRepository = new ConfigRepository(configsDatabase); final SecretsRepositoryReader secretsRepositoryReader = new SecretsRepositoryReader(configRepository, secretsHydrator); - final SecretsRepositoryWriter secretsRepositoryWriter = - new SecretsRepositoryWriter(configRepository, secretPersistence, ephemeralSecretPersistence); + final SecretsRepositoryWriter secretsRepositoryWriter = new SecretsRepositoryWriter(configRepository, secretPersistence, + ephemeralSecretPersistence); LOGGER.info("Creating jobs persistence..."); final Database jobsDatabase = new Database(jobsDslContext); 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 a3b7f1153d671f..c59dc23d4d979b 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java +++ b/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java @@ -19,19 +19,16 @@ import io.airbyte.server.apis.SourceDefinitionSpecificationApiController; import io.airbyte.server.apis.StateApiController; import io.airbyte.server.apis.WebBackendApiController; -import io.airbyte.server.apis.WorkspaceApiController; import io.airbyte.server.apis.binders.JobsApiBinder; import io.airbyte.server.apis.binders.LogsApiBinder; import io.airbyte.server.apis.binders.NotificationApiBinder; import io.airbyte.server.apis.binders.SourceDefinitionSpecificationApiBinder; import io.airbyte.server.apis.binders.WebBackendApiBinder; -import io.airbyte.server.apis.binders.WorkspaceApiBinder; import io.airbyte.server.apis.factories.JobsApiFactory; import io.airbyte.server.apis.factories.LogsApiFactory; import io.airbyte.server.apis.factories.NotificationsApiFactory; import io.airbyte.server.apis.factories.SourceDefinitionSpecificationApiFactory; import io.airbyte.server.apis.factories.WebBackendApiFactory; -import io.airbyte.server.apis.factories.WorkspaceApiFactory; import io.airbyte.server.handlers.AttemptHandler; import io.airbyte.server.handlers.ConnectionsHandler; import io.airbyte.server.handlers.DestinationDefinitionsHandler; @@ -135,25 +132,20 @@ public ServerRunnable create(final SynchronousSchedulerClient synchronousSchedul WebBackendApiFactory.setValues(webBackendConnectionsHandler, webBackendGeographiesHandler, webBackendCheckUpdatesHandler); - WorkspaceApiFactory.setValues(workspacesHandler); - - // server configuration final Set> componentClasses = Set.of( JobsApiController.class, LogsApiController.class, NotificationsApiController.class, SourceDefinitionSpecificationApiController.class, StateApiController.class, - WebBackendApiController.class, - WorkspaceApiController.class); + WebBackendApiController.class); final Set components = Set.of( new JobsApiBinder(), new LogsApiBinder(), new NotificationApiBinder(), new SourceDefinitionSpecificationApiBinder(), - new WebBackendApiBinder(), - new WorkspaceApiBinder()); + new WebBackendApiBinder()); // construct server return new ServerApp(airbyteVersion, componentClasses, components); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java index 087f759330fb7d..9d57cf3c879834 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java @@ -10,6 +10,7 @@ import io.airbyte.api.model.generated.SetInstancewideSourceOauthParamsRequestBody; import io.airbyte.api.model.generated.SourceOauthConsentRequest; import io.airbyte.server.handlers.OAuthHandler; +import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; import java.util.Map; @@ -25,19 +26,19 @@ public SourceOauthApiController(final OAuthHandler oAuthHandler) { @Post("/complete_oauth") @Override - public Map completeSourceOAuth(final CompleteSourceOauthRequest completeSourceOauthRequest) { + public Map completeSourceOAuth(@Body final CompleteSourceOauthRequest completeSourceOauthRequest) { return ApiHelper.execute(() -> oAuthHandler.completeSourceOAuth(completeSourceOauthRequest)); } @Post("/get_consent_url") @Override - public OAuthConsentRead getSourceOAuthConsent(final SourceOauthConsentRequest sourceOauthConsentRequest) { + public OAuthConsentRead getSourceOAuthConsent(@Body final SourceOauthConsentRequest sourceOauthConsentRequest) { return ApiHelper.execute(() -> oAuthHandler.getSourceOAuthConsent(sourceOauthConsentRequest)); } @Post("/oauth_params/create") @Override - public void setInstancewideSourceOauthParams(final SetInstancewideSourceOauthParamsRequestBody setInstancewideSourceOauthParamsRequestBody) { + public void setInstancewideSourceOauthParams(@Body final SetInstancewideSourceOauthParamsRequestBody setInstancewideSourceOauthParamsRequestBody) { ApiHelper.execute(() -> { oAuthHandler.setSourceInstancewideOauthParams(setInstancewideSourceOauthParamsRequestBody); return null; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java index bfba9954cfaf3e..fa4242850d8470 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java @@ -15,63 +15,76 @@ import io.airbyte.api.model.generated.WorkspaceUpdate; import io.airbyte.api.model.generated.WorkspaceUpdateName; import io.airbyte.server.handlers.WorkspacesHandler; -import javax.ws.rs.Path; -import lombok.AllArgsConstructor; +import io.micronaut.http.annotation.Body; +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Post; -@Path("/v1/workspaces") -@AllArgsConstructor +@Controller("/api/v1/workspaces") public class WorkspaceApiController implements WorkspaceApi { private final WorkspacesHandler workspacesHandler; + public WorkspaceApiController(final WorkspacesHandler workspacesHandler) { + this.workspacesHandler = workspacesHandler; + } + + @Post("/create") @Override - public WorkspaceRead createWorkspace(final WorkspaceCreate workspaceCreate) { + public WorkspaceRead createWorkspace(@Body final WorkspaceCreate workspaceCreate) { return ApiHelper.execute(() -> workspacesHandler.createWorkspace(workspaceCreate)); } + @Post("/delete") @Override - public void deleteWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody) { + public void deleteWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) { ApiHelper.execute(() -> { workspacesHandler.deleteWorkspace(workspaceIdRequestBody); return null; }); } + @Post("/get") @Override - public WorkspaceRead getWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody) { + public WorkspaceRead getWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> workspacesHandler.getWorkspace(workspaceIdRequestBody)); } + @Post("/get_by_slug") @Override - public WorkspaceRead getWorkspaceBySlug(final SlugRequestBody slugRequestBody) { + public WorkspaceRead getWorkspaceBySlug(@Body final SlugRequestBody slugRequestBody) { return ApiHelper.execute(() -> workspacesHandler.getWorkspaceBySlug(slugRequestBody)); } + @Post("/list") @Override public WorkspaceReadList listWorkspaces() { return ApiHelper.execute(workspacesHandler::listWorkspaces); } + @Post("/update") @Override - public WorkspaceRead updateWorkspace(final WorkspaceUpdate workspaceUpdate) { + public WorkspaceRead updateWorkspace(@Body final WorkspaceUpdate workspaceUpdate) { return ApiHelper.execute(() -> workspacesHandler.updateWorkspace(workspaceUpdate)); } + @Post("/tag_feedback_status_as_done") @Override - public void updateWorkspaceFeedback(final WorkspaceGiveFeedback workspaceGiveFeedback) { + public void updateWorkspaceFeedback(@Body final WorkspaceGiveFeedback workspaceGiveFeedback) { ApiHelper.execute(() -> { workspacesHandler.setFeedbackDone(workspaceGiveFeedback); return null; }); } + @Post("/update_name") @Override - public WorkspaceRead updateWorkspaceName(final WorkspaceUpdateName workspaceUpdateName) { + public WorkspaceRead updateWorkspaceName(@Body final WorkspaceUpdateName workspaceUpdateName) { return ApiHelper.execute(() -> workspacesHandler.updateWorkspaceName(workspaceUpdateName)); } + @Post("/get_by_connection_id") @Override - public WorkspaceRead getWorkspaceByConnectionId(final ConnectionIdRequestBody connectionIdRequestBody) { + public WorkspaceRead getWorkspaceByConnectionId(@Body final ConnectionIdRequestBody connectionIdRequestBody) { return ApiHelper.execute(() -> workspacesHandler.getWorkspaceByConnectionId(connectionIdRequestBody)); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/binders/WorkspaceApiBinder.java b/airbyte-server/src/main/java/io/airbyte/server/apis/binders/WorkspaceApiBinder.java deleted file mode 100644 index f114235bac50b4..00000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/binders/WorkspaceApiBinder.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.WorkspaceApiController; -import io.airbyte.server.apis.factories.WorkspaceApiFactory; -import org.glassfish.hk2.utilities.binding.AbstractBinder; -import org.glassfish.jersey.process.internal.RequestScoped; - -public class WorkspaceApiBinder extends AbstractBinder { - - @Override - protected void configure() { - bindFactory(WorkspaceApiFactory.class) - .to(WorkspaceApiController.class) - .in(RequestScoped.class); - } - -} diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/factories/WorkspaceApiFactory.java b/airbyte-server/src/main/java/io/airbyte/server/apis/factories/WorkspaceApiFactory.java deleted file mode 100644 index 644c7fdadc9aa3..00000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/factories/WorkspaceApiFactory.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.server.apis.factories; - -import io.airbyte.server.apis.WorkspaceApiController; -import io.airbyte.server.handlers.WorkspacesHandler; -import org.glassfish.hk2.api.Factory; - -public class WorkspaceApiFactory implements Factory { - - private static WorkspacesHandler workspacesHandler; - - public static void setValues(final WorkspacesHandler workspacesHandler) { - WorkspaceApiFactory.workspacesHandler = workspacesHandler; - } - - @Override - public WorkspaceApiController provide() { - return new WorkspaceApiController(WorkspaceApiFactory.workspacesHandler); - } - - @Override - public void dispose(final WorkspaceApiController instance) { - /* no op */ - } - -} diff --git a/airbyte-server/src/main/java/io/airbyte/server/config/HelperBeanFactory.java b/airbyte-server/src/main/java/io/airbyte/server/config/HelperBeanFactory.java deleted file mode 100644 index 1f7b478f5acf8c..00000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/config/HelperBeanFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.server.config; - -import io.airbyte.config.persistence.ConfigRepository; -import io.airbyte.persistence.job.JobPersistence; -import io.airbyte.persistence.job.WorkspaceHelper; -import io.micronaut.context.annotation.Factory; -import jakarta.inject.Singleton; - -@Factory -public class HelperBeanFactory { - - @Singleton - public WorkspaceHelper workspaceHelper(final ConfigRepository configRepository, final JobPersistence jobPersistence) { - return new WorkspaceHelper(configRepository, jobPersistence); - } - -} 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 1e95070775594a..8961bc9118ef21 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,6 +30,7 @@ import io.airbyte.server.converters.ConfigurationUpdate; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; +import jakarta.inject.Inject; import jakarta.inject.Singleton; import java.io.IOException; import java.util.List; @@ -48,6 +49,25 @@ public class DestinationHandler { private final ConfigurationUpdate configurationUpdate; private final JsonSecretsProcessor secretsProcessor; + @Inject + public DestinationHandler(final ConfigRepository configRepository, + final SecretsRepositoryReader secretsRepositoryReader, + final SecretsRepositoryWriter secretsRepositoryWriter, + final JsonSchemaValidator integrationSchemaValidation, + final ConnectionsHandler connectionsHandler) { + this( + configRepository, + secretsRepositoryReader, + secretsRepositoryWriter, + integrationSchemaValidation, + connectionsHandler, + UUID::randomUUID, + JsonSecretsProcessor.builder() + .copySecrets(true) + .build(), + new ConfigurationUpdate(configRepository, secretsRepositoryReader)); + } + @VisibleForTesting DestinationHandler(final ConfigRepository configRepository, final SecretsRepositoryReader secretsRepositoryReader, @@ -67,24 +87,6 @@ public class DestinationHandler { this.secretsProcessor = secretsProcessor; } - public DestinationHandler(final ConfigRepository configRepository, - final SecretsRepositoryReader secretsRepositoryReader, - final SecretsRepositoryWriter secretsRepositoryWriter, - final JsonSchemaValidator integrationSchemaValidation, - final ConnectionsHandler connectionsHandler) { - this( - configRepository, - secretsRepositoryReader, - secretsRepositoryWriter, - integrationSchemaValidation, - connectionsHandler, - UUID::randomUUID, - JsonSecretsProcessor.builder() - .copySecrets(true) - .build(), - new ConfigurationUpdate(configRepository, secretsRepositoryReader)); - } - public DestinationRead createDestination(final DestinationCreate destinationCreate) throws ConfigNotFoundException, IOException, JsonValidationException { // validate configuration diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java index a08bb564921d43..a04556d82d1fb1 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java @@ -5,6 +5,7 @@ package io.airbyte.server.handlers; import com.fasterxml.jackson.databind.JsonNode; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; import io.airbyte.api.model.generated.ConnectionRead; import io.airbyte.api.model.generated.SourceCloneConfiguration; @@ -28,6 +29,7 @@ import io.airbyte.server.converters.ConfigurationUpdate; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; +import jakarta.inject.Inject; import jakarta.inject.Singleton; import java.io.IOException; import java.util.List; @@ -46,24 +48,7 @@ public class SourceHandler { private final ConfigurationUpdate configurationUpdate; private final JsonSecretsProcessor secretsProcessor; - SourceHandler(final ConfigRepository configRepository, - final SecretsRepositoryReader secretsRepositoryReader, - final SecretsRepositoryWriter secretsRepositoryWriter, - final JsonSchemaValidator integrationSchemaValidation, - final ConnectionsHandler connectionsHandler, - final Supplier uuidGenerator, - final JsonSecretsProcessor secretsProcessor, - final ConfigurationUpdate configurationUpdate) { - this.configRepository = configRepository; - this.secretsRepositoryReader = secretsRepositoryReader; - this.secretsRepositoryWriter = secretsRepositoryWriter; - validator = integrationSchemaValidation; - this.connectionsHandler = connectionsHandler; - this.uuidGenerator = uuidGenerator; - this.configurationUpdate = configurationUpdate; - this.secretsProcessor = secretsProcessor; - } - + @Inject public SourceHandler(final ConfigRepository configRepository, final SecretsRepositoryReader secretsRepositoryReader, final SecretsRepositoryWriter secretsRepositoryWriter, @@ -82,6 +67,25 @@ public SourceHandler(final ConfigRepository configRepository, new ConfigurationUpdate(configRepository, secretsRepositoryReader)); } + @VisibleForTesting + SourceHandler(final ConfigRepository configRepository, + final SecretsRepositoryReader secretsRepositoryReader, + final SecretsRepositoryWriter secretsRepositoryWriter, + final JsonSchemaValidator integrationSchemaValidation, + final ConnectionsHandler connectionsHandler, + final Supplier uuidGenerator, + final JsonSecretsProcessor secretsProcessor, + final ConfigurationUpdate configurationUpdate) { + this.configRepository = configRepository; + this.secretsRepositoryReader = secretsRepositoryReader; + this.secretsRepositoryWriter = secretsRepositoryWriter; + validator = integrationSchemaValidation; + this.connectionsHandler = connectionsHandler; + this.uuidGenerator = uuidGenerator; + this.configurationUpdate = configurationUpdate; + this.secretsProcessor = secretsProcessor; + } + public SourceRead createSource(final SourceCreate sourceCreate) throws ConfigNotFoundException, IOException, JsonValidationException { // validate configuration diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/WorkspacesHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/WorkspacesHandler.java index 63e88b7bbfefab..c135af9b957c52 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/WorkspacesHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/WorkspacesHandler.java @@ -26,6 +26,7 @@ import io.airbyte.api.model.generated.WorkspaceUpdate; import io.airbyte.api.model.generated.WorkspaceUpdateName; import io.airbyte.commons.enums.Enums; +import io.airbyte.commons.temporal.config.WorkerMode; import io.airbyte.config.StandardWorkspace; import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigRepository; @@ -38,6 +39,9 @@ import io.airbyte.server.errors.InternalServerKnownException; import io.airbyte.server.errors.ValueConflictKnownException; import io.airbyte.validation.json.JsonValidationException; +import io.micronaut.context.annotation.Requires; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; import java.io.IOException; import java.util.List; import java.util.UUID; @@ -47,6 +51,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton +@Requires(env = WorkerMode.CONTROL_PLANE) public class WorkspacesHandler { private static final Logger LOGGER = LoggerFactory.getLogger(WorkspacesHandler.class); @@ -58,6 +64,7 @@ public class WorkspacesHandler { private final Supplier uuidSupplier; private final Slugify slugify; + @Inject public WorkspacesHandler(final ConfigRepository configRepository, final SecretsRepositoryWriter secretsRepositoryWriter, final ConnectionsHandler connectionsHandler, diff --git a/airbyte-server/src/main/resources/application.yml b/airbyte-server/src/main/resources/application.yml index 3b6c04b20adf09..72826a35be1bcd 100644 --- a/airbyte-server/src/main/resources/application.yml +++ b/airbyte-server/src/main/resources/application.yml @@ -23,6 +23,8 @@ airbyte: initialization-timeout-ms: ${JOBS_DATABASE_INITIALIZATION_TIMEOUT_MS:60000} minimum-migration-version: ${JOBS_DATABASE_MINIMUM_FLYWAY_MIGRATION_VERSION} version: ${AIRBYTE_VERSION} + workspace: + root: ${WORKSPACE_ROOT} secret: persistence: ${SECRET_PERSISTENCE:TESTING_CONFIG_DB_TABLE} store: