diff --git a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/config/DbaasDatasourcePoolConfiguration.java b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/config/DbaasDatasourcePoolConfiguration.java index 79bec5499..175153820 100644 --- a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/config/DbaasDatasourcePoolConfiguration.java +++ b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/config/DbaasDatasourcePoolConfiguration.java @@ -76,6 +76,14 @@ public Properties getXaProperties(@Nullable String logicalDbName) { return properties; } + public String getInitialSql(@Nullable String logicalDbName) { + String initialSql = getDatasourceProperties().initialSql().orElse(""); + if (!StringUtil.isNullOrEmpty(logicalDbName) && getDatasourceProperties().datasources().containsKey(logicalDbName)) { + initialSql = getDatasourceProperties().datasources().get(logicalDbName).initialSql().orElse(""); + } + return initialSql; + } + public boolean isXa(@Nullable String logicalDbName) { if (!StringUtil.isNullOrEmpty(logicalDbName) && getDatasourceProperties().datasources().containsKey(logicalDbName)) { return getDatasourceProperties().datasources().get(logicalDbName).xa(); diff --git a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/config/properties/DatasourceProperties.java b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/config/properties/DatasourceProperties.java index fed5f46b0..aa487c66c 100644 --- a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/config/properties/DatasourceProperties.java +++ b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/config/properties/DatasourceProperties.java @@ -8,6 +8,7 @@ import io.smallrye.config.WithParentName; import java.util.Map; +import java.util.Optional; @ConfigMapping(prefix = "quarkus.dbaas") @ConfigRoot(phase = ConfigPhase.RUN_TIME) @@ -52,6 +53,12 @@ public interface DatasourceProperties { @WithDefault("false") boolean xa(); + /** + * initial sql + */ + @WithName("datasource.initial-sql") + Optional initialSql(); + /** * jdbc */ @@ -83,5 +90,11 @@ interface JDBCProperties { @WithName("xa") @WithDefault("false") boolean xa(); + + /** + * initial sql + */ + @WithName("initial-sql") + Optional initialSql(); } } diff --git a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/agroal/AgroalConnectionFactoryConfigurationBuilder.java b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/agroal/AgroalConnectionFactoryConfigurationBuilder.java index 75098fd62..c3053735e 100644 --- a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/agroal/AgroalConnectionFactoryConfigurationBuilder.java +++ b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/agroal/AgroalConnectionFactoryConfigurationBuilder.java @@ -50,6 +50,11 @@ public AgroalConnectionFactoryConfigurationBuilder xaProperties(Properties xaPro return this; } + public AgroalConnectionFactoryConfigurationBuilder initialSql(String initialSql) { + configurationHolder.initialSql = initialSql; + return this; + } + public AgroalConnectionFactoryConfiguration build() { return configurationHolder; } diff --git a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/impl/DbaaSPostgresDbCreationServiceImpl.java b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/impl/DbaaSPostgresDbCreationServiceImpl.java index d92d8bfb0..8486598f7 100644 --- a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/impl/DbaaSPostgresDbCreationServiceImpl.java +++ b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/main/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/impl/DbaaSPostgresDbCreationServiceImpl.java @@ -237,6 +237,7 @@ private AgroalDataSource createDatasource(String url, String username, String pa SimplePassword securityPassword = new SimplePassword(password); Properties jdbcProperties = dbaasPoolConfiguration.getJdbcProperties(logicalDbName); Properties xaProperties = dbaasPoolConfiguration.getXaProperties(logicalDbName); + String initialSql = dbaasPoolConfiguration.getInitialSql(logicalDbName); removeJdbcPrefixedProperties(connectionParams); if (connectionParams != null && !connectionParams.isEmpty()) { jdbcProperties.putAll(connectionParams); @@ -246,6 +247,7 @@ private AgroalDataSource createDatasource(String url, String username, String pa .jdbcUrl(url) .jdbcProperties(jdbcProperties) .xaProperties(xaProperties) + .initialSql(initialSql) .principal(new NamePrincipal(username)) .credential(securityPassword) .securityProvider(new DbaasSecurityProvider(securityPassword)) diff --git a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/test/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/impl/DbaaSPostgresDbCreationServiceImplTest.java b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/test/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/impl/DbaaSPostgresDbCreationServiceImplTest.java index aa059a6dd..55c982956 100644 --- a/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/test/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/impl/DbaaSPostgresDbCreationServiceImplTest.java +++ b/core-quarkus-extensions/dbaas-client/dbaas-datasource/runtime/src/test/java/com/netcracker/cloud/core/quarkus/dbaas/datasource/service/impl/DbaaSPostgresDbCreationServiceImplTest.java @@ -635,6 +635,66 @@ public void mustFreeResourcesOnMigrationFailure() { assertThrows(FlywayException.class, () -> dbaaSPostgresDbCreationService.getOrCreatePostgresDatabase(getServiceClassifier())); } + @Test + public void mustUseGlobalInitialSql() { + String globalInitialSql = "SET TIME ZONE 'UTC'"; + + DbaasDatasourcePoolConfiguration poolConfiguration = mock(DbaasDatasourcePoolConfiguration.class); + DatasourceProperties properties = mock(DatasourceProperties.class); + when(properties.debugDatasourceListeners()).thenReturn(false); + when(properties.globalJdbcProperties()).thenReturn(new HashMap<>()); + when(poolConfiguration.getDatasourceProperties()).thenReturn(properties); + when(poolConfiguration.getJdbcProperties(any())).thenCallRealMethod(); + when(poolConfiguration.getInitialSql(isNull())).thenReturn(globalInitialSql); + + when(dbaaSClient.getOrCreateDatabase(any(), anyString(), anyMap(), any(DatabaseConfig.class))) + .thenReturn(getPostgresDatabase("test-url", "test-username", "test-password")); + + DbaaSPostgresDbCreationServiceImpl service = dataSourceCreationServiceImplBuilder + .setDbaasPoolConfiguration(poolConfiguration) + .build(); + + PostgresDatabase result = service.getOrCreatePostgresDatabase(getTenantClassifier("test-tenant")); + + AgroalConnectionFactoryConfiguration config = ((AgroalDataSource) result.getConnectionProperties().getDataSource()) + .getConfiguration().connectionPoolConfiguration().connectionFactoryConfiguration(); + assertEquals(globalInitialSql, config.initialSql()); + } + + @Test + public void mustUsePerDbInitialSqlOverridesGlobal() { + String perDbInitialSql = "SET search_path TO my_schema"; + + DbaasDatasourcePoolConfiguration poolConfiguration = mock(DbaasDatasourcePoolConfiguration.class); + DatasourceProperties properties = mock(DatasourceProperties.class); + when(properties.debugDatasourceListeners()).thenReturn(false); + when(properties.globalJdbcProperties()).thenReturn(new HashMap<>()); + when(poolConfiguration.getDatasourceProperties()).thenReturn(properties); + when(poolConfiguration.getJdbcProperties(any())).thenCallRealMethod(); + when(poolConfiguration.getInitialSql(eq("configs"))).thenReturn(perDbInitialSql); + + AgroalConnectionPoolConfigurationFactory factory = mock(AgroalConnectionPoolConfigurationFactory.class); + doReturn(connectionPoolConfiguration).when(factory).createAgroalConnectionPoolConfiguration(any(), any()); + + DbaasDbClassifier classifier = getTenantClassifierWithLogicalDb("test-tenant"); + PostgresDatabase postgresDatabase = getPostgresDatabase("test-url", "test-username", "test-password"); + postgresDatabase.setClassifier(new TreeMap<>(classifier.asMap())); + when(dbaaSClient.getOrCreateDatabase(any(), anyString(), anyMap(), any(DatabaseConfig.class))) + .thenReturn(postgresDatabase); + + DbaaSPostgresDbCreationServiceImpl service = dataSourceCreationServiceImplBuilder + .setDbaasPoolConfiguration(poolConfiguration) + .setConnectionPoolConfigurationFactory(factory) + .build(); + + PostgresDatabase result = service.getOrCreatePostgresDatabase(classifier); + + AgroalConnectionFactoryConfiguration config = ((AgroalDataSource) result.getConnectionProperties().getDataSource()) + .getConfiguration().connectionPoolConfiguration().connectionFactoryConfiguration(); + assertEquals(perDbInitialSql, config.initialSql()); + verify(poolConfiguration, never()).getInitialSql(isNull()); + } + private DbaasDbClassifier getTenantClassifier(String tenantId) { Map params = new HashMap<>(); params.put("microserviceName", "test-service");