diff --git a/airbyte-analytics/src/main/java/io/airbyte/analytics/LoggingTrackingClient.java b/airbyte-analytics/src/main/java/io/airbyte/analytics/LoggingTrackingClient.java index d3ecf81688c2..d753e07687eb 100644 --- a/airbyte-analytics/src/main/java/io/airbyte/analytics/LoggingTrackingClient.java +++ b/airbyte-analytics/src/main/java/io/airbyte/analytics/LoggingTrackingClient.java @@ -39,7 +39,7 @@ public void track(final UUID workspaceId, final String action) { @Override public void track(final UUID workspaceId, final String action, final Map metadata) { LOGGER.info("track. version: {}, userId: {}, action: {}, metadata: {}", - identityFetcher.apply(workspaceId).getAirbyteVersion(), + identityFetcher.apply(workspaceId).getAirbyteVersion().serialize(), identityFetcher.apply(workspaceId).getCustomerId(), action, metadata); diff --git a/airbyte-analytics/src/main/java/io/airbyte/analytics/SegmentTrackingClient.java b/airbyte-analytics/src/main/java/io/airbyte/analytics/SegmentTrackingClient.java index 8fe948615a29..678e4bf6d41e 100644 --- a/airbyte-analytics/src/main/java/io/airbyte/analytics/SegmentTrackingClient.java +++ b/airbyte-analytics/src/main/java/io/airbyte/analytics/SegmentTrackingClient.java @@ -52,7 +52,7 @@ public void identify(final UUID workspaceId) { final Map identityMetadata = new HashMap<>(); // deployment - identityMetadata.put(AIRBYTE_VERSION_KEY, trackingIdentity.getAirbyteVersion()); + identityMetadata.put(AIRBYTE_VERSION_KEY, trackingIdentity.getAirbyteVersion().serialize()); identityMetadata.put("deployment_mode", deployment.getDeploymentMode()); identityMetadata.put("deployment_env", deployment.getDeploymentEnv()); identityMetadata.put("deployment_id", deployment.getDeploymentId()); @@ -88,7 +88,7 @@ public void track(final UUID workspaceId, final String action) { public void track(final UUID workspaceId, final String action, final Map metadata) { final Map mapCopy = new HashMap<>(metadata); final TrackingIdentity trackingIdentity = identityFetcher.apply(workspaceId); - mapCopy.put(AIRBYTE_VERSION_KEY, trackingIdentity.getAirbyteVersion()); + mapCopy.put(AIRBYTE_VERSION_KEY, trackingIdentity.getAirbyteVersion().serialize()); if (!metadata.isEmpty()) { trackingIdentity.getEmail().ifPresent(email -> mapCopy.put("email", email)); } diff --git a/airbyte-analytics/src/main/java/io/airbyte/analytics/TrackingClientSingleton.java b/airbyte-analytics/src/main/java/io/airbyte/analytics/TrackingClientSingleton.java index 420295054bc4..27072a8fd4ba 100644 --- a/airbyte-analytics/src/main/java/io/airbyte/analytics/TrackingClientSingleton.java +++ b/airbyte-analytics/src/main/java/io/airbyte/analytics/TrackingClientSingleton.java @@ -5,6 +5,7 @@ package io.airbyte.analytics; import com.google.common.annotations.VisibleForTesting; +import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs; import io.airbyte.config.StandardWorkspace; import io.airbyte.config.persistence.ConfigNotFoundException; @@ -38,7 +39,7 @@ static void initialize(final TrackingClient trackingClient) { public static void initialize(final Configs.TrackingStrategy trackingStrategy, final Deployment deployment, final String airbyteRole, - final String airbyteVersion, + final AirbyteVersion airbyteVersion, final ConfigRepository configRepository) { initialize(createTrackingClient( trackingStrategy, @@ -53,7 +54,7 @@ private static void initialize() { } @VisibleForTesting - static TrackingIdentity getTrackingIdentity(final ConfigRepository configRepository, final String airbyteVersion, final UUID workspaceId) { + static TrackingIdentity getTrackingIdentity(final ConfigRepository configRepository, final AirbyteVersion airbyteVersion, final UUID workspaceId) { try { final StandardWorkspace workspace = configRepository.getStandardWorkspace(workspaceId, true); String email = null; diff --git a/airbyte-analytics/src/main/java/io/airbyte/analytics/TrackingIdentity.java b/airbyte-analytics/src/main/java/io/airbyte/analytics/TrackingIdentity.java index be087f9955cd..f7acd96296cd 100644 --- a/airbyte-analytics/src/main/java/io/airbyte/analytics/TrackingIdentity.java +++ b/airbyte-analytics/src/main/java/io/airbyte/analytics/TrackingIdentity.java @@ -4,13 +4,14 @@ package io.airbyte.analytics; +import io.airbyte.commons.version.AirbyteVersion; import java.util.Objects; import java.util.Optional; import java.util.UUID; public class TrackingIdentity { - private final String airbyteVersion; + private final AirbyteVersion airbyteVersion; private final UUID customerId; private final String email; private final Boolean anonymousDataCollection; @@ -22,7 +23,7 @@ public static TrackingIdentity empty() { } public TrackingIdentity( - final String airbyteVersion, + final AirbyteVersion airbyteVersion, final UUID customerId, final String email, final Boolean anonymousDataCollection, @@ -36,7 +37,7 @@ public TrackingIdentity( this.securityUpdates = securityUpdates; } - public String getAirbyteVersion() { + public AirbyteVersion getAirbyteVersion() { return airbyteVersion; } diff --git a/airbyte-analytics/src/test/java/io/airbyte/analytics/SegmentTrackingClientTest.java b/airbyte-analytics/src/test/java/io/airbyte/analytics/SegmentTrackingClientTest.java index 4f36ca00bdb9..e782c4ee66d9 100644 --- a/airbyte-analytics/src/test/java/io/airbyte/analytics/SegmentTrackingClientTest.java +++ b/airbyte-analytics/src/test/java/io/airbyte/analytics/SegmentTrackingClientTest.java @@ -13,6 +13,7 @@ import com.segment.analytics.Analytics; import com.segment.analytics.messages.IdentifyMessage; import com.segment.analytics.messages.TrackMessage; +import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs; import io.airbyte.config.Configs.WorkerEnvironment; import java.util.Map; @@ -25,7 +26,7 @@ class SegmentTrackingClientTest { - private static final String AIRBYTE_VERSION = "dev"; + private static final AirbyteVersion AIRBYTE_VERSION = new AirbyteVersion("dev"); private static final Deployment DEPLOYMENT = new Deployment(Configs.DeploymentMode.OSS, UUID.randomUUID(), WorkerEnvironment.DOCKER); private static final String EMAIL = "a@airbyte.io"; private static final TrackingIdentity IDENTITY = new TrackingIdentity(AIRBYTE_VERSION, UUID.randomUUID(), EMAIL, false, false, true); @@ -59,7 +60,7 @@ void testIdentify() { .put("deployment_env", DEPLOYMENT.getDeploymentEnv()) .put("deployment_mode", DEPLOYMENT.getDeploymentMode()) .put("deployment_id", DEPLOYMENT.getDeploymentId()) - .put("airbyte_version", AIRBYTE_VERSION) + .put("airbyte_version", AIRBYTE_VERSION.serialize()) .put("email", IDENTITY.getEmail().get()) .put("anonymized", IDENTITY.isAnonymousDataCollection()) .put("subscribed_newsletter", IDENTITY.isNews()) @@ -85,7 +86,7 @@ void testIdentifyWithRole() { .put("deployment_env", DEPLOYMENT.getDeploymentEnv()) .put("deployment_mode", DEPLOYMENT.getDeploymentMode()) .put("deployment_id", DEPLOYMENT.getDeploymentId()) - .put("airbyte_version", AIRBYTE_VERSION) + .put("airbyte_version", AIRBYTE_VERSION.serialize()) .put("email", IDENTITY.getEmail().get()) .put("anonymized", IDENTITY.isAnonymousDataCollection()) .put("subscribed_newsletter", IDENTITY.isNews()) @@ -99,7 +100,7 @@ void testIdentifyWithRole() { @Test void testTrack() { final ArgumentCaptor mockBuilder = ArgumentCaptor.forClass(TrackMessage.Builder.class); - final ImmutableMap metadata = ImmutableMap.of("airbyte_version", AIRBYTE_VERSION); + final ImmutableMap metadata = ImmutableMap.of("airbyte_version", AIRBYTE_VERSION.serialize()); segmentTrackingClient.track(WORKSPACE_ID, "jump"); @@ -116,7 +117,7 @@ void testTrackWithMetadata() { final ImmutableMap metadata = ImmutableMap.of( "height", "80 meters", "email", EMAIL, - "airbyte_version", AIRBYTE_VERSION); + "airbyte_version", AIRBYTE_VERSION.serialize()); segmentTrackingClient.track(WORKSPACE_ID, "jump", metadata); diff --git a/airbyte-analytics/src/test/java/io/airbyte/analytics/TrackingClientSingletonTest.java b/airbyte-analytics/src/test/java/io/airbyte/analytics/TrackingClientSingletonTest.java index c7d80fd4c1f3..055b6fa52cdd 100644 --- a/airbyte-analytics/src/test/java/io/airbyte/analytics/TrackingClientSingletonTest.java +++ b/airbyte-analytics/src/test/java/io/airbyte/analytics/TrackingClientSingletonTest.java @@ -9,6 +9,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs; import io.airbyte.config.Configs.WorkerEnvironment; import io.airbyte.config.StandardWorkspace; @@ -24,7 +25,7 @@ class TrackingClientSingletonTest { private static final UUID WORKSPACE_ID = UUID.randomUUID(); - private static final String AIRBYTE_VERSION = "dev"; + private static final AirbyteVersion AIRBYTE_VERSION = new AirbyteVersion("dev"); private static final String EMAIL = "a@airbyte.io"; private static final Deployment DEPLOYMENT = new Deployment(Configs.DeploymentMode.OSS, UUID.randomUUID(), WorkerEnvironment.DOCKER); private static final TrackingIdentity IDENTITY = new TrackingIdentity(AIRBYTE_VERSION, UUID.randomUUID(), EMAIL, false, false, true); diff --git a/airbyte-commons/src/main/java/io/airbyte/commons/version/AirbyteVersion.java b/airbyte-commons/src/main/java/io/airbyte/commons/version/AirbyteVersion.java index 588bdbaf6a48..c953139ad927 100644 --- a/airbyte-commons/src/main/java/io/airbyte/commons/version/AirbyteVersion.java +++ b/airbyte-commons/src/main/java/io/airbyte/commons/version/AirbyteVersion.java @@ -5,6 +5,7 @@ package io.airbyte.commons.version; import com.google.common.base.Preconditions; +import java.util.Objects; /** * The AirbyteVersion identifies the version of the database used internally by Airbyte services. @@ -166,4 +167,22 @@ public static AirbyteVersion versionWithoutPatch(final String airbyteVersion) { return versionWithoutPatch(new AirbyteVersion(airbyteVersion)); } + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final AirbyteVersion that = (AirbyteVersion) o; + return Objects.equals(version, that.version) && Objects.equals(major, that.major) && Objects.equals(minor, that.minor) + && Objects.equals(patch, that.patch); + } + + @Override + public int hashCode() { + return Objects.hash(version, major, minor, patch); + } + } diff --git a/airbyte-config/models/src/main/java/io/airbyte/config/Configs.java b/airbyte-config/models/src/main/java/io/airbyte/config/Configs.java index 33ffd0e16e71..99b1fc370915 100644 --- a/airbyte-config/models/src/main/java/io/airbyte/config/Configs.java +++ b/airbyte-config/models/src/main/java/io/airbyte/config/Configs.java @@ -4,6 +4,7 @@ package io.airbyte.config; +import io.airbyte.commons.version.AirbyteVersion; import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -13,7 +14,7 @@ public interface Configs { String getAirbyteRole(); - String getAirbyteVersion(); + AirbyteVersion getAirbyteVersion(); String getAirbyteApiHost(); diff --git a/airbyte-config/models/src/main/java/io/airbyte/config/EnvConfigs.java b/airbyte-config/models/src/main/java/io/airbyte/config/EnvConfigs.java index 5ce2d5b73159..cb61f7710eb8 100644 --- a/airbyte-config/models/src/main/java/io/airbyte/config/EnvConfigs.java +++ b/airbyte-config/models/src/main/java/io/airbyte/config/EnvConfigs.java @@ -7,6 +7,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.base.Strings; +import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.helpers.LogClientSingleton; import java.nio.file.Path; import java.util.Arrays; @@ -117,8 +118,8 @@ public int getAirbyteApiPort() { } @Override - public String getAirbyteVersion() { - return getEnsureEnv(AIRBYTE_VERSION); + public AirbyteVersion getAirbyteVersion() { + return new AirbyteVersion(getEnsureEnv(AIRBYTE_VERSION)); } @Override diff --git a/airbyte-config/models/src/test/java/io/airbyte/config/EnvConfigsTest.java b/airbyte-config/models/src/test/java/io/airbyte/config/EnvConfigsTest.java index 88fa5fa3746b..d27096b23ae6 100644 --- a/airbyte-config/models/src/test/java/io/airbyte/config/EnvConfigsTest.java +++ b/airbyte-config/models/src/test/java/io/airbyte/config/EnvConfigsTest.java @@ -6,6 +6,7 @@ import static org.mockito.Mockito.when; +import io.airbyte.commons.version.AirbyteVersion; import java.nio.file.Paths; import java.util.List; import java.util.Map; @@ -47,7 +48,7 @@ void testAirbyteVersion() { Assertions.assertThrows(IllegalArgumentException.class, () -> config.getAirbyteVersion()); when(function.apply(EnvConfigs.AIRBYTE_VERSION)).thenReturn("dev"); - Assertions.assertEquals("dev", config.getAirbyteVersion()); + Assertions.assertEquals(new AirbyteVersion("dev"), config.getAirbyteVersion()); } @Test diff --git a/airbyte-scheduler/app/src/main/java/io/airbyte/scheduler/app/SchedulerApp.java b/airbyte-scheduler/app/src/main/java/io/airbyte/scheduler/app/SchedulerApp.java index 48a7e506a779..5081a5b5f832 100644 --- a/airbyte-scheduler/app/src/main/java/io/airbyte/scheduler/app/SchedulerApp.java +++ b/airbyte-scheduler/app/src/main/java/io/airbyte/scheduler/app/SchedulerApp.java @@ -221,7 +221,7 @@ public static void main(final String[] args) throws IOException, InterruptedExce workspaceRoot, jobPersistence); AirbyteVersion.assertIsCompatible( - new AirbyteVersion(configs.getAirbyteVersion()), + configs.getAirbyteVersion(), jobPersistence.getVersion().map(AirbyteVersion::new).orElseThrow()); TrackingClientSingleton.initialize( 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 a798ea817f5e..a806a27d6097 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java +++ b/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java @@ -75,11 +75,11 @@ public class ServerApp implements ServerRunnable { * wouldn't run */ private static final AirbyteVersion KUBE_SUPPORT_FOR_AUTOMATIC_MIGRATION = new AirbyteVersion("0.26.5-alpha"); - private final String airbyteVersion; + private final AirbyteVersion airbyteVersion; private final Set> customComponentClasses; private final Set customComponents; - public ServerApp(final String airbyteVersion, + public ServerApp(final AirbyteVersion airbyteVersion, final Set> customComponentClasses, final Set customComponents) { this.airbyteVersion = airbyteVersion; @@ -120,7 +120,7 @@ public void start() throws Exception { server.start(); final String banner = MoreResources.readResource("banner/banner.txt"); - LOGGER.info(banner + String.format("Version: %s\n", airbyteVersion)); + LOGGER.info(banner + String.format("Version: %s\n", airbyteVersion.serialize())); server.join(); } @@ -199,7 +199,7 @@ public static ServerRunnable getServer(final ServerFactory apiFactory, final Con // if no workspace exists, we create one so the user starts out with a place to add configuration. createWorkspaceIfNoneExists(configRepository); - final AirbyteVersion airbyteVersion = new AirbyteVersion(configs.getAirbyteVersion()); + final AirbyteVersion airbyteVersion = configs.getAirbyteVersion(); if (jobPersistence.getVersion().isEmpty()) { LOGGER.info(String.format("Setting Database version to %s...", airbyteVersion)); jobPersistence.setVersion(airbyteVersion.serialize()); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java index 98cb14b3be3e..3b2dc4f0e846 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/ConfigurationApi.java @@ -81,7 +81,6 @@ import io.airbyte.api.model.WorkspaceReadList; import io.airbyte.api.model.WorkspaceUpdate; import io.airbyte.commons.io.FileTtlManager; -import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs; import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigPersistence; @@ -193,7 +192,7 @@ public ConfigurationApi(final ConfigRepository configRepository, webBackendDestinationsHandler = new WebBackendDestinationsHandler(destinationHandler, configRepository, trackingClient); healthCheckHandler = new HealthCheckHandler(configRepository); archiveHandler = new ArchiveHandler( - new AirbyteVersion(configs.getAirbyteVersion()), + configs.getAirbyteVersion(), configRepository, jobPersistence, seed, diff --git a/airbyte-server/src/test/java/io/airbyte/server/apis/ConfigurationApiTest.java b/airbyte-server/src/test/java/io/airbyte/server/apis/ConfigurationApiTest.java index 89f00a6dcd94..cdb7b8c07d03 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/apis/ConfigurationApiTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/apis/ConfigurationApiTest.java @@ -10,6 +10,7 @@ import io.airbyte.analytics.TrackingClient; import io.airbyte.commons.io.FileTtlManager; +import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs; import io.airbyte.config.persistence.ConfigPersistence; import io.airbyte.config.persistence.ConfigRepository; @@ -25,7 +26,7 @@ public class ConfigurationApiTest { @Test void testImportDefinitions() { final Configs configs = mock(Configs.class); - when(configs.getAirbyteVersion()).thenReturn("0.1.0-alpha"); + when(configs.getAirbyteVersion()).thenReturn(new AirbyteVersion("0.1.0-alpha")); when(configs.getWebappUrl()).thenReturn("http://localhost"); final ConfigurationApi configurationApi = new ConfigurationApi(