From 49518cd93985a1f9b01f7fb8b5e3a9e2fad317a8 Mon Sep 17 00:00:00 2001 From: Suresh Prakash <93120060+suresh-prakash@users.noreply.github.com> Date: Thu, 16 Nov 2023 14:02:38 +0530 Subject: [PATCH] Introduce default keys for typesafe config extractor (#184) --- .../model/config/DatabaseType.java | 4 + ...ypesafeConfigDatastoreConfigExtractor.java | 27 ++++++ ...afeConfigDatastoreConfigExtractorTest.java | 88 +++++++++++++++++++ 3 files changed, 119 insertions(+) diff --git a/document-store/src/main/java/org/hypertrace/core/documentstore/model/config/DatabaseType.java b/document-store/src/main/java/org/hypertrace/core/documentstore/model/config/DatabaseType.java index a779aa91..d8c1703e 100644 --- a/document-store/src/main/java/org/hypertrace/core/documentstore/model/config/DatabaseType.java +++ b/document-store/src/main/java/org/hypertrace/core/documentstore/model/config/DatabaseType.java @@ -3,8 +3,12 @@ import java.util.Arrays; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; +@Getter +@Accessors(fluent = true) @AllArgsConstructor(access = AccessLevel.PRIVATE) @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public enum DatabaseType { diff --git a/document-store/src/main/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractor.java b/document-store/src/main/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractor.java index 15f5273a..3086803a 100644 --- a/document-store/src/main/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractor.java +++ b/document-store/src/main/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractor.java @@ -13,6 +13,19 @@ @Value public class TypesafeConfigDatastoreConfigExtractor { + private static final String HOST_KEY = "host"; + private static final String PORT_KEY = "port"; + private static final String ENDPOINTS_KEY = "endpoints"; + private static final String AUTH_DB_KEY = "authDb"; + private static final String REPLICA_SET_KEY = "replicaSet"; + private static final String DATABASE_KEY = "database"; + private static final String USER_KEY = "user"; + private static final String PASSWORD_KEY = "password"; + private static final String APP_NAME_KEY = "appName"; + private static final String MAX_POOL_SIZE_KEY = "maxPoolSize"; + private static final String CONNECTION_ACCESS_TIMEOUT_KEY = "connectionAccessTimeout"; + private static final String CONNECTION_IDLE_TIME_KEY = "connectionIdleTime"; + @NonNull Config config; DatastoreConfigBuilder datastoreConfigBuilder; ConnectionConfigBuilder connectionConfigBuilder; @@ -40,6 +53,20 @@ private TypesafeConfigDatastoreConfigExtractor( this.connectionPoolConfigBuilder = ConnectionPoolConfig.builder(); this.datastoreConfigBuilder = DatastoreConfig.builder().type(type); this.endpointBuilder = Endpoint.builder(); + + final String dataStoreType = type.type(); + this.hostKey(dataStoreType + "." + HOST_KEY) + .portKey(dataStoreType + "." + PORT_KEY) + .keysForEndpoints(dataStoreType + "." + ENDPOINTS_KEY, HOST_KEY, PORT_KEY) + .authDatabaseKey(dataStoreType + "." + AUTH_DB_KEY) + .replicaSetKey(dataStoreType + "." + REPLICA_SET_KEY) + .databaseKey(dataStoreType + "." + DATABASE_KEY) + .usernameKey(dataStoreType + "." + USER_KEY) + .passwordKey(dataStoreType + "." + PASSWORD_KEY) + .applicationNameKey(APP_NAME_KEY) + .poolMaxConnectionsKey(MAX_POOL_SIZE_KEY) + .poolConnectionAccessTimeoutKey(CONNECTION_ACCESS_TIMEOUT_KEY) + .poolConnectionSurrenderTimeoutKey(CONNECTION_IDLE_TIME_KEY); } public static TypesafeConfigDatastoreConfigExtractor from( diff --git a/document-store/src/test/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractorTest.java b/document-store/src/test/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractorTest.java index 43b1ca41..f655d51f 100644 --- a/document-store/src/test/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractorTest.java +++ b/document-store/src/test/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractorTest.java @@ -245,6 +245,62 @@ void testBuildPostgresUsingTypeKey() { assertEquals(expected, config); } + @Test + void testBuildMongoUsingDefaultKeys() { + final ConnectionConfig config = + TypesafeConfigDatastoreConfigExtractor.from( + buildConfigMapUsingDefaultKeysForMongo(), TYPE_KEY) + .extract() + .connectionConfig(); + final ConnectionConfig expected = + ConnectionConfig.builder() + .type(DatabaseType.MONGO) + .addEndpoint(Endpoint.builder().host(host).port(port).build()) + .database(database) + .credentials( + ConnectionCredentials.builder() + .username(user) + .password(password) + .authDatabase(authDb) + .build()) + .applicationName(appName) + .connectionPoolConfig( + ConnectionPoolConfig.builder() + .maxConnections(maxConnections) + .connectionAccessTimeout(accessTimeout) + .connectionSurrenderTimeout(surrenderTimeout) + .build()) + .replicaSet(replicaSet) + .build(); + + assertEquals(expected, config); + } + + @Test + void testBuildPostgresUsingDefaultKeys() { + final ConnectionConfig config = + TypesafeConfigDatastoreConfigExtractor.from( + buildConfigMapWithDefaultKeysForPostgres(), TYPE_KEY) + .extract() + .connectionConfig(); + final ConnectionConfig expected = + ConnectionConfig.builder() + .type(DatabaseType.POSTGRES) + .addEndpoint(Endpoint.builder().host(host).port(port).build()) + .database(database) + .credentials(ConnectionCredentials.builder().username(user).password(password).build()) + .applicationName(appName) + .connectionPoolConfig( + ConnectionPoolConfig.builder() + .maxConnections(maxConnections) + .connectionAccessTimeout(accessTimeout) + .connectionSurrenderTimeout(surrenderTimeout) + .build()) + .build(); + + assertEquals(expected, config); + } + private Config buildConfigMap() { return ConfigFactory.parseMap( Map.ofEntries( @@ -261,6 +317,38 @@ private Config buildConfigMap() { entry(CONNECTION_SURRENDER_TIMEOUT_KEY, surrenderTimeout))); } + private Config buildConfigMapWithDefaultKeysForPostgres() { + return ConfigFactory.parseMap( + Map.ofEntries( + entry(TYPE_KEY, "postgres"), + entry("postgres.host", host), + entry("postgres.port", port), + entry("postgres.database", database), + entry("postgres.user", user), + entry("postgres.password", password), + entry("appName", appName), + entry("maxPoolSize", maxConnections), + entry("connectionAccessTimeout", accessTimeout), + entry("connectionIdleTime", surrenderTimeout))); + } + + private Config buildConfigMapUsingDefaultKeysForMongo() { + return ConfigFactory.parseMap( + Map.ofEntries( + entry(TYPE_KEY, "mongo"), + entry("mongo.host", host), + entry("mongo.port", port), + entry("mongo.database", database), + entry("mongo.user", user), + entry("mongo.password", password), + entry("mongo.authDb", authDb), + entry("appName", appName), + entry("mongo.replicaSet", replicaSet), + entry("maxPoolSize", maxConnections), + entry("connectionAccessTimeout", accessTimeout), + entry("connectionIdleTime", surrenderTimeout))); + } + private Config buildPostgresConfigMapUsingEndpointsKey() { return ConfigFactory.parseMap( Map.ofEntries(