From 9de9f51f1683561173742181989949a14988021d Mon Sep 17 00:00:00 2001 From: Prashant Date: Sat, 26 Apr 2025 23:24:37 -0700 Subject: [PATCH 1/8] Intial commit --- .../relational/jdbc/JdbcDatasource.java | 26 +++++++++ .../jdbc/JdbcMetaStoreManagerFactory.java | 11 ++-- quarkus/admin/build.gradle.kts | 3 +- .../config/QuarkusJdbcDataSource.java | 56 +++++++++++++++++++ .../admintool/config/QuarkusProducers.java | 12 ++++ ...gresRelationalJdbcLifeCycleManagement.java | 14 ++--- 6 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcDatasource.java create mode 100644 quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusJdbcDataSource.java diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcDatasource.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcDatasource.java new file mode 100644 index 0000000000..2805777930 --- /dev/null +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcDatasource.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.polaris.extension.persistence.relational.jdbc; + +import javax.sql.DataSource; + +public interface JdbcDatasource { + DataSource fromRealmId(String realmId); +} diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java index f19194f33d..323b649fe3 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java @@ -73,7 +73,7 @@ public class JdbcMetaStoreManagerFactory implements MetaStoreManagerFactory { protected final PolarisDiagnostics diagServices = new PolarisDefaultDiagServiceImpl(); @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; - @Inject Instance dataSource; + @Inject JdbcDatasource jdbcDatasource; protected JdbcMetaStoreManagerFactory() {} @@ -93,7 +93,7 @@ protected PolarisMetaStoreManager createNewMetaStoreManager() { private void initializeForRealm( RealmContext realmContext, RootCredentialsSet rootCredentialsSet, boolean isBootstrap) { - DatasourceOperations databaseOperations = getDatasourceOperations(isBootstrap); + DatasourceOperations databaseOperations = getDatasourceOperations(isBootstrap, realmContext.getRealmIdentifier()); sessionSupplierMap.put( realmContext.getRealmIdentifier(), () -> @@ -107,12 +107,13 @@ private void initializeForRealm( metaStoreManagerMap.put(realmContext.getRealmIdentifier(), metaStoreManager); } - private DatasourceOperations getDatasourceOperations(boolean isBootstrap) { - DatasourceOperations databaseOperations = new DatasourceOperations(dataSource.get()); + private DatasourceOperations getDatasourceOperations(boolean isBootstrap, String realmId) { + DataSource datasource = jdbcDatasource.fromRealmId(realmId); + DatasourceOperations databaseOperations = new DatasourceOperations(datasource); if (isBootstrap) { try { DatabaseType databaseType; - try (Connection connection = dataSource.get().getConnection()) { + try (Connection connection = datasource.getConnection()) { String productName = connection.getMetaData().getDatabaseProductName(); databaseType = DatabaseType.fromDisplayName(productName); } diff --git a/quarkus/admin/build.gradle.kts b/quarkus/admin/build.gradle.kts index 7b19a132a7..a8bc442d1c 100644 --- a/quarkus/admin/build.gradle.kts +++ b/quarkus/admin/build.gradle.kts @@ -44,9 +44,8 @@ dependencies { implementation(project(":polaris-api-iceberg-service")) runtimeOnly(project(":polaris-eclipselink")) - runtimeOnly(project(":polaris-relational-jdbc")) + implementation(project(":polaris-relational-jdbc")) runtimeOnly("org.postgresql:postgresql") - implementation("io.quarkus:quarkus-jdbc-postgresql") implementation(enforcedPlatform(libs.quarkus.bom)) implementation("io.quarkus:quarkus-picocli") diff --git a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusJdbcDataSource.java b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusJdbcDataSource.java new file mode 100644 index 0000000000..eca4004fad --- /dev/null +++ b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusJdbcDataSource.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.polaris.admintool.config; + +import io.quarkus.arc.InstanceHandle; +import org.apache.polaris.extension.persistence.relational.jdbc.JdbcDatasource; + +import javax.sql.DataSource; +import java.util.ArrayList; +import java.util.List; + +public class QuarkusJdbcDataSource implements JdbcDatasource { + private List> dataSources; + + public static final String DEFAULT_DATA_SOURCE_NAME = ""; + + public QuarkusJdbcDataSource(List> dataSources) { + this.dataSources = dataSources; + } + + @Override + public DataSource fromRealmId(String realmId) { + for (InstanceHandle handle : dataSources) { + String name = handle.getBean().getName(); + name = name == null ? DEFAULT_DATA_SOURCE_NAME : unquoteDataSourceName(name); + if (name.equals(realmId)) { + return handle.get(); + } + } + throw new IllegalStateException("No datasource configured with name: " + realmId); + } + + public static String unquoteDataSourceName(String dataSourceName) { + if (dataSourceName.startsWith("\"") && dataSourceName.endsWith("\"")) { + dataSourceName = dataSourceName.substring(1, dataSourceName.length() - 1); + } + return dataSourceName; + } +} diff --git a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java index 07ad023629..f93547f4f9 100644 --- a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java +++ b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java @@ -18,6 +18,8 @@ */ package org.apache.polaris.admintool.config; +import io.quarkus.arc.All; +import io.quarkus.arc.InstanceHandle; import io.smallrye.common.annotation.Identifier; import jakarta.annotation.Nullable; import jakarta.enterprise.context.ApplicationScoped; @@ -25,6 +27,8 @@ import jakarta.enterprise.inject.Instance; import jakarta.enterprise.inject.Produces; import java.time.Clock; +import java.util.List; + import org.apache.polaris.core.PolarisDefaultDiagServiceImpl; import org.apache.polaris.core.PolarisDiagnostics; import org.apache.polaris.core.config.PolarisConfigurationStore; @@ -32,8 +36,11 @@ import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo; import org.apache.polaris.core.storage.PolarisStorageIntegration; import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider; +import org.apache.polaris.extension.persistence.relational.jdbc.JdbcDatasource; import org.eclipse.microprofile.config.inject.ConfigProperty; +import javax.sql.DataSource; + public class QuarkusProducers { @Produces @@ -76,4 +83,9 @@ public PolarisConfigurationStore configurationStore() { // A configuration store is not required when running the admin tool. return new PolarisConfigurationStore() {}; } + + @Produces + public JdbcDatasource jdbcDatasource(@All List> dataSources) { + return new QuarkusJdbcDataSource(dataSources); + } } diff --git a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java index 9dc230722f..0da09c8d06 100644 --- a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java +++ b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java @@ -56,16 +56,16 @@ public Map start() { return Map.of( "polaris.persistence.type", "relational-jdbc", - "quarkus.datasource.db-kind", + "quarkus.datasource.realm1.db-kind", "pgsql", - "quarkus.datasource.jdbc.url", + "quarkus.datasource.realm1.active", + "true", + "quarkus.datasource.realm1.jdbc.url", postgres.getJdbcUrl(), - "quarkus.datasource.username", + "quarkus.datasource.realm1.username", postgres.getUsername(), - "quarkus.datasource.password", - postgres.getPassword(), - "quarkus.datasource.jdbc.initial-size", - "10"); + "quarkus.datasource.realm1.password", + postgres.getPassword()); } @Override From 879378e58e643a1f9c1010fdd4a488de743f2794 Mon Sep 17 00:00:00 2001 From: Prashant Date: Sun, 27 Apr 2025 23:52:10 -0700 Subject: [PATCH 2/8] WIP multiple DS --- .../src/main/resources/application.properties | 14 ++++++++ .../jdbc/RelationalJdbcAdminProfile.java | 2 +- .../apache/polaris/admintool/jdbc/init.sql | 30 +++++++++++++++++ ...gresRelationalJdbcLifeCycleManagement.java | 32 +++++++++++-------- 4 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 quarkus/admin/src/testFixtures/resources/org/apache/polaris/admintool/jdbc/init.sql diff --git a/quarkus/admin/src/main/resources/application.properties b/quarkus/admin/src/main/resources/application.properties index 6665be818d..8b53644e4b 100644 --- a/quarkus/admin/src/main/resources/application.properties +++ b/quarkus/admin/src/main/resources/application.properties @@ -50,3 +50,17 @@ quarkus.index-dependency.guava.artifact-id=guava quarkus.index-dependency.protobuf.group-id=com.google.protobuf quarkus.index-dependency.protobuf.artifact-id=protobuf-java quarkus.datasource.devservices.image-name=postgres:17-alpine + +quarkus.datasource.\"realm1\".db-kind=pgsql +quarkus.datasource.\"realm1\".jdbc.url=polaris +quarkus.datasource.\"realm1\".username=polaris +quarkus.datasource.\"realm1\".password=polaris +quarkus.datasource.\"realm2\".db-kind=pgsql +quarkus.datasource.\"realm2\".jdbc.url=polaris +quarkus.datasource.\"realm2\".username=polaris +quarkus.datasource.\"realm2\".password=polaris +quarkus.datasource.\"realm3\".db-kind=pgsql +quarkus.datasource.\"realm3\".jdbc.url=polaris +quarkus.datasource.\"realm3\".username=polaris +quarkus.datasource.\"realm3\".password=polaris + diff --git a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java index a64002983d..4cc0db2624 100644 --- a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java +++ b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java @@ -36,6 +36,6 @@ public List testResources() { return List.of( new TestResourceEntry( PostgresRelationalJdbcLifeCycleManagement.class, - Map.of(INIT_SCRIPT, "org/apache/polaris/admintool/init.sql"))); + Map.of(INIT_SCRIPT, "org/apache/polaris/admintool/jdbc/init.sql"))); } } diff --git a/quarkus/admin/src/testFixtures/resources/org/apache/polaris/admintool/jdbc/init.sql b/quarkus/admin/src/testFixtures/resources/org/apache/polaris/admintool/jdbc/init.sql new file mode 100644 index 0000000000..a6037243b1 --- /dev/null +++ b/quarkus/admin/src/testFixtures/resources/org/apache/polaris/admintool/jdbc/init.sql @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +-- Create two more databases for testing. The first database, polaris_realm1, is created +-- during container initialization. See PostgresTestResourceLifecycleManager. + +-- Note: the database names must follow the pattern polaris_{realm}. That's the pattern +-- specified by the persistence.xml file used in tests. + +CREATE DATABASE realm2; +GRANT ALL PRIVILEGES ON DATABASE realm2 TO polaris; + +CREATE DATABASE realm3; +GRANT ALL PRIVILEGES ON DATABASE realm3 TO polaris; diff --git a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java index 0da09c8d06..e4a8094211 100644 --- a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java +++ b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java @@ -53,19 +53,25 @@ public Map start() { context.containerNetworkId().ifPresent(postgres::withNetworkMode); postgres.start(); - return Map.of( - "polaris.persistence.type", - "relational-jdbc", - "quarkus.datasource.realm1.db-kind", - "pgsql", - "quarkus.datasource.realm1.active", - "true", - "quarkus.datasource.realm1.jdbc.url", - postgres.getJdbcUrl(), - "quarkus.datasource.realm1.username", - postgres.getUsername(), - "quarkus.datasource.realm1.password", - postgres.getPassword()); + // Use Map.ofEntries to create the map with more than 10 entries + return Map.ofEntries( + Map.entry("polaris.persistence.type", "relational-jdbc"), + Map.entry("quarkus.datasource.realm1.db-kind", "pgsql"), + Map.entry("quarkus.datasource.realm1.active", "true"), + Map.entry("quarkus.datasource.realm1.jdbc.url", postgres.getJdbcUrl()), + Map.entry("quarkus.datasource.realm1.username", postgres.getUsername()), + Map.entry("quarkus.datasource.realm1.password", postgres.getPassword()), + Map.entry("quarkus.datasource.realm2.db-kind", "pgsql"), + Map.entry("quarkus.datasource.realm2.active", "true"), + Map.entry("quarkus.datasource.realm2.jdbc.url", postgres.getJdbcUrl().replace("realm1", "realm2")), + Map.entry("quarkus.datasource.realm2.username", postgres.getUsername()), + Map.entry("quarkus.datasource.realm2.password", postgres.getPassword()), + Map.entry("quarkus.datasource.realm3.db-kind", "pgsql"), + Map.entry("quarkus.datasource.realm3.active", "true"), + Map.entry("quarkus.datasource.realm3.jdbc.url", postgres.getJdbcUrl().replace("realm1", "realm3")), + Map.entry("quarkus.datasource.realm3.username", postgres.getUsername()), + Map.entry("quarkus.datasource.realm3.password", postgres.getPassword()) + ); } @Override From 5c62e8586ca9ac491a791f1d9c9d4f45535da4fc Mon Sep 17 00:00:00 2001 From: Prashant Date: Mon, 28 Apr 2025 08:34:46 -0700 Subject: [PATCH 3/8] [WIP] Support multiple DS --- .../relational-jdbc/build.gradle.kts | 1 + .../relational/jdbc/DatasourceOperations.java | 9 ++- ...atasource.java => DatasourceSupplier.java} | 5 +- .../jdbc/JdbcBasePersistenceImpl.java | 6 ++ .../jdbc/JdbcMetaStoreManagerFactory.java | 6 +- .../jdbc/RelationalJdbcConfiguration.java | 27 +++++++++ .../config/QuarkusDatasourceSupplier.java | 54 +++++++++++++++++ .../config/QuarkusJdbcDataSource.java | 56 ------------------ .../admintool/config/QuarkusProducers.java | 13 ++-- .../src/main/resources/application.properties | 28 +++++---- .../jdbc/RelationalJdbcAdminProfile.java | 6 +- quarkus/service/build.gradle.kts | 2 +- .../config/QuarkusDatasourceSupplier.java | 54 +++++++++++++++++ .../quarkus/config/QuarkusProducers.java | 13 ++++ ...gresRelationalJdbcLifeCycleManagement.java | 59 +++++++++++++------ 15 files changed, 236 insertions(+), 103 deletions(-) rename extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/{JdbcDatasource.java => DatasourceSupplier.java} (91%) create mode 100644 extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java create mode 100644 quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusDatasourceSupplier.java delete mode 100644 quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusJdbcDataSource.java create mode 100644 quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusDatasourceSupplier.java diff --git a/extension/persistence/relational-jdbc/build.gradle.kts b/extension/persistence/relational-jdbc/build.gradle.kts index 82f67c8a5a..d343d833e1 100644 --- a/extension/persistence/relational-jdbc/build.gradle.kts +++ b/extension/persistence/relational-jdbc/build.gradle.kts @@ -32,6 +32,7 @@ dependencies { compileOnly(libs.jakarta.inject.api) implementation(libs.smallrye.common.annotation) // @Identifier + compileOnly(libs.smallrye.config.core) testImplementation(libs.mockito.junit.jupiter) diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceOperations.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceOperations.java index 6fec8e67fe..5ef1455bec 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceOperations.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceOperations.java @@ -38,7 +38,8 @@ public class DatasourceOperations { - private static final String CONSTRAINT_VIOLATION_SQL_CODE = "23505"; + private static final String CONSTRAINT_VIOLATION_SQL_CODE_POSTGRES = "23505"; + private static final String TABLE_DOES_NOT_EXIST_SQL_CODE_POSTGRES = "42P01"; private final DataSource datasource; @@ -182,7 +183,11 @@ public interface TransactionCallback { } public boolean isConstraintViolation(SQLException e) { - return CONSTRAINT_VIOLATION_SQL_CODE.equals(e.getSQLState()); + return CONSTRAINT_VIOLATION_SQL_CODE_POSTGRES.equals(e.getSQLState()); + } + + public boolean isTableNotExists(SQLException e) { + return TABLE_DOES_NOT_EXIST_SQL_CODE_POSTGRES.equals(e.getSQLState()); } private Connection borrowConnection() throws SQLException { diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcDatasource.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceSupplier.java similarity index 91% rename from extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcDatasource.java rename to extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceSupplier.java index 2805777930..0156701561 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcDatasource.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceSupplier.java @@ -16,11 +16,10 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.polaris.extension.persistence.relational.jdbc; import javax.sql.DataSource; -public interface JdbcDatasource { - DataSource fromRealmId(String realmId); +public interface DatasourceSupplier { + DataSource fromRealmId(String realmId); } diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcBasePersistenceImpl.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcBasePersistenceImpl.java index 5ffce813f9..457c1325a9 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcBasePersistenceImpl.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcBasePersistenceImpl.java @@ -315,6 +315,12 @@ private PolarisBaseEntity getPolarisBaseEntity(String query) { return results.getFirst(); } } catch (SQLException e) { + // This look-up is used for checking if the realm is bootstrap or not. + // If we have 1 DB per realm it might happen that the realm is not boostrap + // at all. + if (datasourceOperations.isTableNotExists(e)) { + return null; + } throw new RuntimeException( String.format("Failed to retrieve polaris entity due to %s", e.getMessage()), e); } diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java index 323b649fe3..7aa0031d02 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java @@ -21,7 +21,6 @@ import io.smallrye.common.annotation.Identifier; import jakarta.annotation.Nullable; import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Instance; import jakarta.inject.Inject; import java.sql.Connection; import java.sql.SQLException; @@ -73,7 +72,7 @@ public class JdbcMetaStoreManagerFactory implements MetaStoreManagerFactory { protected final PolarisDiagnostics diagServices = new PolarisDefaultDiagServiceImpl(); @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; - @Inject JdbcDatasource jdbcDatasource; + @Inject DatasourceSupplier jdbcDatasource; protected JdbcMetaStoreManagerFactory() {} @@ -93,7 +92,8 @@ protected PolarisMetaStoreManager createNewMetaStoreManager() { private void initializeForRealm( RealmContext realmContext, RootCredentialsSet rootCredentialsSet, boolean isBootstrap) { - DatasourceOperations databaseOperations = getDatasourceOperations(isBootstrap, realmContext.getRealmIdentifier()); + DatasourceOperations databaseOperations = + getDatasourceOperations(isBootstrap, realmContext.getRealmIdentifier()); sessionSupplierMap.put( realmContext.getRealmIdentifier(), () -> diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java new file mode 100644 index 0000000000..83c58de58a --- /dev/null +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.polaris.extension.persistence.relational.jdbc; + +import io.smallrye.config.ConfigMapping; +import java.util.Map; + +@ConfigMapping(prefix = "polaris.relation.jdbc") +public interface RelationalJdbcConfiguration { + Map datasource(); +} diff --git a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusDatasourceSupplier.java b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusDatasourceSupplier.java new file mode 100644 index 0000000000..9d083a29c1 --- /dev/null +++ b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusDatasourceSupplier.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.polaris.admintool.config; + +import io.quarkus.arc.InstanceHandle; +import java.util.List; +import javax.sql.DataSource; +import org.apache.polaris.extension.persistence.relational.jdbc.DatasourceSupplier; +import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; + +public class QuarkusDatasourceSupplier implements DatasourceSupplier { + private final List> dataSources; + private final RelationalJdbcConfiguration relationalJdbcConfiguration; + + public static final String DEFAULT_DATA_SOURCE_NAME = ""; + + public QuarkusDatasourceSupplier( + RelationalJdbcConfiguration relationalJdbcConfiguration, + List> dataSources) { + this.relationalJdbcConfiguration = relationalJdbcConfiguration; + this.dataSources = dataSources; + } + + @Override + public DataSource fromRealmId(String realmId) { + String dataSourceName = + relationalJdbcConfiguration.datasource().getOrDefault(realmId, DEFAULT_DATA_SOURCE_NAME); + for (InstanceHandle handle : dataSources) { + String name = handle.getBean().getName(); + name = name == null ? DEFAULT_DATA_SOURCE_NAME : name; + // if realm isolation is DB then there should be only one DS configured. + if (name.equals(dataSourceName)) { + return handle.get(); + } + } + throw new IllegalStateException("No datasource configured with name: " + realmId); + } +} diff --git a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusJdbcDataSource.java b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusJdbcDataSource.java deleted file mode 100644 index eca4004fad..0000000000 --- a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusJdbcDataSource.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.polaris.admintool.config; - -import io.quarkus.arc.InstanceHandle; -import org.apache.polaris.extension.persistence.relational.jdbc.JdbcDatasource; - -import javax.sql.DataSource; -import java.util.ArrayList; -import java.util.List; - -public class QuarkusJdbcDataSource implements JdbcDatasource { - private List> dataSources; - - public static final String DEFAULT_DATA_SOURCE_NAME = ""; - - public QuarkusJdbcDataSource(List> dataSources) { - this.dataSources = dataSources; - } - - @Override - public DataSource fromRealmId(String realmId) { - for (InstanceHandle handle : dataSources) { - String name = handle.getBean().getName(); - name = name == null ? DEFAULT_DATA_SOURCE_NAME : unquoteDataSourceName(name); - if (name.equals(realmId)) { - return handle.get(); - } - } - throw new IllegalStateException("No datasource configured with name: " + realmId); - } - - public static String unquoteDataSourceName(String dataSourceName) { - if (dataSourceName.startsWith("\"") && dataSourceName.endsWith("\"")) { - dataSourceName = dataSourceName.substring(1, dataSourceName.length() - 1); - } - return dataSourceName; - } -} diff --git a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java index f93547f4f9..130e956947 100644 --- a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java +++ b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java @@ -28,7 +28,7 @@ import jakarta.enterprise.inject.Produces; import java.time.Clock; import java.util.List; - +import javax.sql.DataSource; import org.apache.polaris.core.PolarisDefaultDiagServiceImpl; import org.apache.polaris.core.PolarisDiagnostics; import org.apache.polaris.core.config.PolarisConfigurationStore; @@ -36,11 +36,10 @@ import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo; import org.apache.polaris.core.storage.PolarisStorageIntegration; import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider; -import org.apache.polaris.extension.persistence.relational.jdbc.JdbcDatasource; +import org.apache.polaris.extension.persistence.relational.jdbc.DatasourceSupplier; +import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; import org.eclipse.microprofile.config.inject.ConfigProperty; -import javax.sql.DataSource; - public class QuarkusProducers { @Produces @@ -85,7 +84,9 @@ public PolarisConfigurationStore configurationStore() { } @Produces - public JdbcDatasource jdbcDatasource(@All List> dataSources) { - return new QuarkusJdbcDataSource(dataSources); + public DatasourceSupplier jdbcDatasource( + RelationalJdbcConfiguration relationalJdbcConfiguration, + @All List> dataSources) { + return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, dataSources); } } diff --git a/quarkus/admin/src/main/resources/application.properties b/quarkus/admin/src/main/resources/application.properties index 8b53644e4b..e5c4c5856f 100644 --- a/quarkus/admin/src/main/resources/application.properties +++ b/quarkus/admin/src/main/resources/application.properties @@ -51,16 +51,20 @@ quarkus.index-dependency.protobuf.group-id=com.google.protobuf quarkus.index-dependency.protobuf.artifact-id=protobuf-java quarkus.datasource.devservices.image-name=postgres:17-alpine -quarkus.datasource.\"realm1\".db-kind=pgsql -quarkus.datasource.\"realm1\".jdbc.url=polaris -quarkus.datasource.\"realm1\".username=polaris -quarkus.datasource.\"realm1\".password=polaris -quarkus.datasource.\"realm2\".db-kind=pgsql -quarkus.datasource.\"realm2\".jdbc.url=polaris -quarkus.datasource.\"realm2\".username=polaris -quarkus.datasource.\"realm2\".password=polaris -quarkus.datasource.\"realm3\".db-kind=pgsql -quarkus.datasource.\"realm3\".jdbc.url=polaris -quarkus.datasource.\"realm3\".username=polaris -quarkus.datasource.\"realm3\".password=polaris +#quarkus.datasource.db-kind=pgsql +#quarkus.datasource.jdbc.url=polaris +#quarkus.datasource.username=polaris +#quarkus.datasource.password=polaris +quarkus.datasource.\"realm1_ds\".db-kind=pgsql +quarkus.datasource.\"realm1_ds\".jdbc.url=polaris +quarkus.datasource.\"realm1_ds\".username=polaris +quarkus.datasource.\"realm1_ds\".password=polaris +quarkus.datasource.\"realm2_ds\".db-kind=pgsql +quarkus.datasource.\"realm2_ds\".jdbc.url=polaris +quarkus.datasource.\"realm2_ds\".username=polaris +quarkus.datasource.\"realm2_ds\".password=polaris +quarkus.datasource.\"realm3_ds\".db-kind=pgsql +quarkus.datasource.\"realm3_ds\".jdbc.url=polaris +quarkus.datasource.\"realm3_ds\".username=polaris +quarkus.datasource.\"realm3_ds\".password=polaris diff --git a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java index 4cc0db2624..2d477347bc 100644 --- a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java +++ b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java @@ -36,6 +36,10 @@ public List testResources() { return List.of( new TestResourceEntry( PostgresRelationalJdbcLifeCycleManagement.class, - Map.of(INIT_SCRIPT, "org/apache/polaris/admintool/jdbc/init.sql"))); + Map.of( + INIT_SCRIPT, + "org/apache/polaris/admintool/jdbc/init.sql", + "databases", + "realm1,realm2,realm3"))); } } diff --git a/quarkus/service/build.gradle.kts b/quarkus/service/build.gradle.kts index 97b3daa0de..20aced3f77 100644 --- a/quarkus/service/build.gradle.kts +++ b/quarkus/service/build.gradle.kts @@ -108,7 +108,7 @@ dependencies { testImplementation("software.amazon.awssdk:kms") testImplementation("software.amazon.awssdk:dynamodb") - runtimeOnly(project(":polaris-relational-jdbc")) + implementation(project(":polaris-relational-jdbc")) runtimeOnly("io.quarkus:quarkus-jdbc-postgresql") { exclude(group = "org.antlr", module = "antlr4-runtime") exclude(group = "org.scala-lang", module = "scala-library") diff --git a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusDatasourceSupplier.java b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusDatasourceSupplier.java new file mode 100644 index 0000000000..68aed7a8d5 --- /dev/null +++ b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusDatasourceSupplier.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.polaris.service.quarkus.config; + +import io.quarkus.arc.InstanceHandle; +import java.util.List; +import javax.sql.DataSource; +import org.apache.polaris.extension.persistence.relational.jdbc.DatasourceSupplier; +import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; + +public class QuarkusDatasourceSupplier implements DatasourceSupplier { + private final List> dataSources; + private final RelationalJdbcConfiguration relationalJdbcConfiguration; + + public static final String DEFAULT_DATA_SOURCE_NAME = ""; + + public QuarkusDatasourceSupplier( + RelationalJdbcConfiguration relationalJdbcConfiguration, + List> dataSources) { + this.relationalJdbcConfiguration = relationalJdbcConfiguration; + this.dataSources = dataSources; + } + + @Override + public DataSource fromRealmId(String realmId) { + String dataSourceName = + relationalJdbcConfiguration.datasource().getOrDefault(realmId, DEFAULT_DATA_SOURCE_NAME); + for (InstanceHandle handle : dataSources) { + String name = handle.getBean().getName(); + name = name == null ? DEFAULT_DATA_SOURCE_NAME : name; + // if realm isolation is DB then there should be only one DS configured. + if (name.equals(dataSourceName)) { + return handle.get(); + } + } + throw new IllegalStateException("No datasource configured with name: " + realmId); + } +} diff --git a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java index 625e57e45d..59de2af914 100644 --- a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java +++ b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java @@ -18,6 +18,8 @@ */ package org.apache.polaris.service.quarkus.config; +import io.quarkus.arc.All; +import io.quarkus.arc.InstanceHandle; import io.quarkus.runtime.StartupEvent; import io.smallrye.common.annotation.Identifier; import io.smallrye.context.SmallRyeManagedExecutor; @@ -32,6 +34,8 @@ import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.core.Context; import java.time.Clock; +import java.util.List; +import javax.sql.DataSource; import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.PolarisDefaultDiagServiceImpl; import org.apache.polaris.core.PolarisDiagnostics; @@ -49,6 +53,8 @@ import org.apache.polaris.core.secrets.UserSecretsManager; import org.apache.polaris.core.secrets.UserSecretsManagerFactory; import org.apache.polaris.core.storage.cache.StorageCredentialCache; +import org.apache.polaris.extension.persistence.relational.jdbc.DatasourceSupplier; +import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; import org.apache.polaris.service.auth.ActiveRolesProvider; import org.apache.polaris.service.auth.Authenticator; import org.apache.polaris.service.auth.TokenBrokerFactory; @@ -258,6 +264,13 @@ public ActiveRolesProvider activeRolesProvider( return activeRolesProviders.select(Identifier.Literal.of(persistenceType)).get(); } + @Produces + public DatasourceSupplier datasourceSupplier( + RelationalJdbcConfiguration relationalJdbcConfiguration, + @All List> datasourceSuppliers) { + return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, datasourceSuppliers); + } + public void closeTaskExecutor(@Disposes @Identifier("task-executor") ManagedExecutor executor) { executor.close(); } diff --git a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java index e4a8094211..94be84e709 100644 --- a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java +++ b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java @@ -21,21 +21,31 @@ import io.quarkus.test.common.DevServicesContext; import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; + +import java.util.List; import java.util.Map; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.HashMap; + import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; public class PostgresRelationalJdbcLifeCycleManagement implements QuarkusTestResourceLifecycleManager, DevServicesContext.ContextAware { public static final String INIT_SCRIPT = "init-script"; + public static final String DATABASES = "databases"; private PostgreSQLContainer postgres; private String initScript; + private List databases; private DevServicesContext context; @Override public void init(Map initArgs) { initScript = initArgs.get(INIT_SCRIPT); + String databases = initArgs.get(DATABASES); + this.databases = databases == null ? new ArrayList<>() : Arrays.asList(databases.split(",")); } @Override @@ -53,25 +63,36 @@ public Map start() { context.containerNetworkId().ifPresent(postgres::withNetworkMode); postgres.start(); - // Use Map.ofEntries to create the map with more than 10 entries - return Map.ofEntries( - Map.entry("polaris.persistence.type", "relational-jdbc"), - Map.entry("quarkus.datasource.realm1.db-kind", "pgsql"), - Map.entry("quarkus.datasource.realm1.active", "true"), - Map.entry("quarkus.datasource.realm1.jdbc.url", postgres.getJdbcUrl()), - Map.entry("quarkus.datasource.realm1.username", postgres.getUsername()), - Map.entry("quarkus.datasource.realm1.password", postgres.getPassword()), - Map.entry("quarkus.datasource.realm2.db-kind", "pgsql"), - Map.entry("quarkus.datasource.realm2.active", "true"), - Map.entry("quarkus.datasource.realm2.jdbc.url", postgres.getJdbcUrl().replace("realm1", "realm2")), - Map.entry("quarkus.datasource.realm2.username", postgres.getUsername()), - Map.entry("quarkus.datasource.realm2.password", postgres.getPassword()), - Map.entry("quarkus.datasource.realm3.db-kind", "pgsql"), - Map.entry("quarkus.datasource.realm3.active", "true"), - Map.entry("quarkus.datasource.realm3.jdbc.url", postgres.getJdbcUrl().replace("realm1", "realm3")), - Map.entry("quarkus.datasource.realm3.username", postgres.getUsername()), - Map.entry("quarkus.datasource.realm3.password", postgres.getPassword()) - ); + Map props = new HashMap<>(); + props.put("polaris.persistence.type", "relational-jdbc"); + + if (!databases.isEmpty()) { + for (String database : databases) { + // polaris.relation.jdbc.datasource.realm=realm_ds + props.put(String.format("polaris.relation.jdbc.datasource.%s", database), database + "_ds"); + props.put(String.format("quarkus.datasource.%s.db-kind", database + "_ds"), "pgsql"); + props.put(String.format("quarkus.datasource.%s.active", database + "_ds"), "true"); + props.put(String.format("quarkus.datasource.%s.jdbc.url", database + "_ds"), postgres.getJdbcUrl().replace("realm1", database)); + props.put(String.format("quarkus.datasource.%s.username", database + "_ds"), postgres.getUsername()); + props.put(String.format("quarkus.datasource.%s.password", database + "_ds"), postgres.getPassword()); + } + } else { + return Map.of( + "polaris.persistence.type", + "relational-jdbc", + "quarkus.datasource.db-kind", + "pgsql", + "quarkus.datasource.jdbc.url", + postgres.getJdbcUrl(), + "quarkus.datasource.username", + postgres.getUsername(), + "quarkus.datasource.password", + postgres.getPassword(), + "quarkus.datasource.jdbc.initial-size", + "10"); + } + + return props; } @Override From f2fa9b5ef278126bd1b4642987228814c7c69ef4 Mon Sep 17 00:00:00 2001 From: Prashant Date: Mon, 28 Apr 2025 21:41:28 -0700 Subject: [PATCH 4/8] code-refactor --- bom/build.gradle.kts | 2 +- gradle/projects.main.properties | 2 +- quarkus/admin/build.gradle.kts | 2 +- .../admintool/config/QuarkusProducers.java | 9 ++-- .../jdbc/RelationalJdbcAdminProfile.java | 4 +- .../build.gradle.kts | 2 + ...gresRelationalJdbcLifeCycleManagement.java | 49 +++++++++-------- .../commons}/QuarkusDatasourceSupplier.java | 6 +-- .../commons/RelationalJdbcProfile.java | 2 +- quarkus/service/build.gradle.kts | 2 +- .../jdbc/JdbcQuarkusApplicationIT.java | 2 +- .../jdbc/JdbcQuarkusManagementServiceIT.java | 2 +- .../jdbc/JdbcQuarkusPolicyServiceIT.java | 2 +- .../jdbc/JdbcQuarkusViewFileIT.java | 2 +- .../it/relational/jdbc/JdbcRestCatalogIT.java | 2 +- .../config/QuarkusDatasourceSupplier.java | 54 ------------------- .../quarkus/config/QuarkusProducers.java | 7 +-- 17 files changed, 52 insertions(+), 99 deletions(-) rename quarkus/{test-commons => commons}/build.gradle.kts (93%) rename quarkus/{test-commons/src/main/java/org/apache/polaris/test => commons/src/main/java/org/apache/polaris}/commons/PostgresRelationalJdbcLifeCycleManagement.java (77%) rename quarkus/{admin/src/main/java/org/apache/polaris/admintool/config => commons/src/main/java/org/apache/polaris/commons}/QuarkusDatasourceSupplier.java (92%) rename quarkus/{test-commons/src/main/java/org/apache/polaris/test => commons/src/main/java/org/apache/polaris}/commons/RelationalJdbcProfile.java (97%) delete mode 100644 quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusDatasourceSupplier.java diff --git a/bom/build.gradle.kts b/bom/build.gradle.kts index 4fc33d96c2..ca465625a7 100644 --- a/bom/build.gradle.kts +++ b/bom/build.gradle.kts @@ -46,7 +46,7 @@ dependencies { api(project(":polaris-jpa-model")) api(project(":polaris-quarkus-admin")) - api(project(":polaris-quarkus-test-commons")) + api(project(":polaris-quarkus-commons")) api(project(":polaris-quarkus-defaults")) api(project(":polaris-quarkus-server")) api(project(":polaris-quarkus-service")) diff --git a/gradle/projects.main.properties b/gradle/projects.main.properties index 6161eee47b..aa3651394e 100644 --- a/gradle/projects.main.properties +++ b/gradle/projects.main.properties @@ -30,7 +30,7 @@ polaris-quarkus-service=quarkus/service polaris-quarkus-server=quarkus/server polaris-quarkus-spark-tests=quarkus/spark-tests polaris-quarkus-admin=quarkus/admin -polaris-quarkus-test-commons=quarkus/test-commons +polaris-quarkus-commons=quarkus/commons polaris-quarkus-run-script=quarkus/run-script polaris-eclipselink=extension/persistence/eclipselink polaris-jpa-model=extension/persistence/jpa-model diff --git a/quarkus/admin/build.gradle.kts b/quarkus/admin/build.gradle.kts index a8bc442d1c..7365d041cf 100644 --- a/quarkus/admin/build.gradle.kts +++ b/quarkus/admin/build.gradle.kts @@ -53,7 +53,7 @@ dependencies { implementation("org.jboss.slf4j:slf4j-jboss-logmanager") - testImplementation(project(":polaris-quarkus-test-commons")) + implementation(project(":polaris-quarkus-commons")) testFixturesApi(project(":polaris-core")) testFixturesApi(enforcedPlatform(libs.quarkus.bom)) diff --git a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java index 130e956947..fa6c32f5ee 100644 --- a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java +++ b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java @@ -29,6 +29,7 @@ import java.time.Clock; import java.util.List; import javax.sql.DataSource; +import org.apache.polaris.commons.QuarkusDatasourceSupplier; import org.apache.polaris.core.PolarisDefaultDiagServiceImpl; import org.apache.polaris.core.PolarisDiagnostics; import org.apache.polaris.core.config.PolarisConfigurationStore; @@ -84,9 +85,9 @@ public PolarisConfigurationStore configurationStore() { } @Produces - public DatasourceSupplier jdbcDatasource( - RelationalJdbcConfiguration relationalJdbcConfiguration, - @All List> dataSources) { - return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, dataSources); + public DatasourceSupplier datasourceSupplier( + @Any RelationalJdbcConfiguration relationalJdbcConfiguration, + @All List> datasources) { + return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, datasources); } } diff --git a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java index 2d477347bc..9a447e23ee 100644 --- a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java +++ b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java @@ -22,8 +22,8 @@ import java.util.List; import java.util.Map; -import org.apache.polaris.test.commons.PostgresRelationalJdbcLifeCycleManagement; -import org.apache.polaris.test.commons.RelationalJdbcProfile; +import org.apache.polaris.commons.PostgresRelationalJdbcLifeCycleManagement; +import org.apache.polaris.commons.RelationalJdbcProfile; public class RelationalJdbcAdminProfile extends RelationalJdbcProfile { @Override diff --git a/quarkus/test-commons/build.gradle.kts b/quarkus/commons/build.gradle.kts similarity index 93% rename from quarkus/test-commons/build.gradle.kts rename to quarkus/commons/build.gradle.kts index b3813c90be..a4e3623fe6 100644 --- a/quarkus/test-commons/build.gradle.kts +++ b/quarkus/commons/build.gradle.kts @@ -35,6 +35,8 @@ java { dependencies { implementation(enforcedPlatform(libs.quarkus.bom)) + implementation("io.quarkus:quarkus-arc") + implementation(project(":polaris-relational-jdbc")) implementation("io.quarkus:quarkus-junit5") implementation(platform(libs.testcontainers.bom)) implementation("org.testcontainers:testcontainers") diff --git a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java b/quarkus/commons/src/main/java/org/apache/polaris/commons/PostgresRelationalJdbcLifeCycleManagement.java similarity index 77% rename from quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java rename to quarkus/commons/src/main/java/org/apache/polaris/commons/PostgresRelationalJdbcLifeCycleManagement.java index 94be84e709..13058e707a 100644 --- a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java +++ b/quarkus/commons/src/main/java/org/apache/polaris/commons/PostgresRelationalJdbcLifeCycleManagement.java @@ -16,18 +16,15 @@ * specific language governing permissions and limitations * under the License. */ - -package org.apache.polaris.test.commons; +package org.apache.polaris.commons; import io.quarkus.test.common.DevServicesContext; import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; - -import java.util.List; -import java.util.Map; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; - +import java.util.List; +import java.util.Map; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @@ -53,7 +50,7 @@ public void init(Map initArgs) { public Map start() { postgres = new PostgreSQLContainer<>(DockerImageName.parse("postgres:17-alpine")) - .withDatabaseName("polaris_db") + .withDatabaseName("realm1") .withUsername("polaris") .withPassword("polaris"); @@ -72,24 +69,30 @@ public Map start() { props.put(String.format("polaris.relation.jdbc.datasource.%s", database), database + "_ds"); props.put(String.format("quarkus.datasource.%s.db-kind", database + "_ds"), "pgsql"); props.put(String.format("quarkus.datasource.%s.active", database + "_ds"), "true"); - props.put(String.format("quarkus.datasource.%s.jdbc.url", database + "_ds"), postgres.getJdbcUrl().replace("realm1", database)); - props.put(String.format("quarkus.datasource.%s.username", database + "_ds"), postgres.getUsername()); - props.put(String.format("quarkus.datasource.%s.password", database + "_ds"), postgres.getPassword()); + props.put( + String.format("quarkus.datasource.%s.jdbc.url", database + "_ds"), + postgres.getJdbcUrl().replace("realm1", database)); + props.put( + String.format("quarkus.datasource.%s.username", database + "_ds"), + postgres.getUsername()); + props.put( + String.format("quarkus.datasource.%s.password", database + "_ds"), + postgres.getPassword()); } } else { return Map.of( - "polaris.persistence.type", - "relational-jdbc", - "quarkus.datasource.db-kind", - "pgsql", - "quarkus.datasource.jdbc.url", - postgres.getJdbcUrl(), - "quarkus.datasource.username", - postgres.getUsername(), - "quarkus.datasource.password", - postgres.getPassword(), - "quarkus.datasource.jdbc.initial-size", - "10"); + "polaris.persistence.type", + "relational-jdbc", + "quarkus.datasource.db-kind", + "pgsql", + "quarkus.datasource.jdbc.url", + postgres.getJdbcUrl(), + "quarkus.datasource.username", + postgres.getUsername(), + "quarkus.datasource.password", + postgres.getPassword(), + "quarkus.datasource.jdbc.initial-size", + "10"); } return props; diff --git a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusDatasourceSupplier.java b/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java similarity index 92% rename from quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusDatasourceSupplier.java rename to quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java index 9d083a29c1..199f281b5f 100644 --- a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusDatasourceSupplier.java +++ b/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.admintool.config; +package org.apache.polaris.commons; import io.quarkus.arc.InstanceHandle; import java.util.List; @@ -25,8 +25,8 @@ import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; public class QuarkusDatasourceSupplier implements DatasourceSupplier { - private final List> dataSources; - private final RelationalJdbcConfiguration relationalJdbcConfiguration; + private List> dataSources; + private RelationalJdbcConfiguration relationalJdbcConfiguration; public static final String DEFAULT_DATA_SOURCE_NAME = ""; diff --git a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/RelationalJdbcProfile.java b/quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcProfile.java similarity index 97% rename from quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/RelationalJdbcProfile.java rename to quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcProfile.java index 38f7bd61a0..375bbc7c39 100644 --- a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/RelationalJdbcProfile.java +++ b/quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcProfile.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.test.commons; +package org.apache.polaris.commons; import io.quarkus.test.junit.QuarkusTestProfile; import java.util.List; diff --git a/quarkus/service/build.gradle.kts b/quarkus/service/build.gradle.kts index 20aced3f77..9f91463ab9 100644 --- a/quarkus/service/build.gradle.kts +++ b/quarkus/service/build.gradle.kts @@ -124,7 +124,7 @@ dependencies { testImplementation(libs.threeten.extra) testImplementation(libs.hawkular.agent.prometheus.scraper) - testImplementation(project(":polaris-quarkus-test-commons")) + implementation(project(":polaris-quarkus-commons")) testImplementation("io.quarkus:quarkus-junit5") testImplementation(platform(libs.testcontainers.bom)) testImplementation("org.testcontainers:testcontainers") diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java index dd718db732..59482a425e 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; +import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisApplicationIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java index 0961889fd6..67a4bbbe3a 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; +import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisManagementServiceIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java index 5907fe5515..1142926398 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; +import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisPolicyServiceIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java index 7471032a52..d0b8960d09 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; +import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisRestCatalogViewFileIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java index 59b35fe912..f4fdd15368 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; +import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisRestCatalogIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusDatasourceSupplier.java b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusDatasourceSupplier.java deleted file mode 100644 index 68aed7a8d5..0000000000 --- a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusDatasourceSupplier.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.polaris.service.quarkus.config; - -import io.quarkus.arc.InstanceHandle; -import java.util.List; -import javax.sql.DataSource; -import org.apache.polaris.extension.persistence.relational.jdbc.DatasourceSupplier; -import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; - -public class QuarkusDatasourceSupplier implements DatasourceSupplier { - private final List> dataSources; - private final RelationalJdbcConfiguration relationalJdbcConfiguration; - - public static final String DEFAULT_DATA_SOURCE_NAME = ""; - - public QuarkusDatasourceSupplier( - RelationalJdbcConfiguration relationalJdbcConfiguration, - List> dataSources) { - this.relationalJdbcConfiguration = relationalJdbcConfiguration; - this.dataSources = dataSources; - } - - @Override - public DataSource fromRealmId(String realmId) { - String dataSourceName = - relationalJdbcConfiguration.datasource().getOrDefault(realmId, DEFAULT_DATA_SOURCE_NAME); - for (InstanceHandle handle : dataSources) { - String name = handle.getBean().getName(); - name = name == null ? DEFAULT_DATA_SOURCE_NAME : name; - // if realm isolation is DB then there should be only one DS configured. - if (name.equals(dataSourceName)) { - return handle.get(); - } - } - throw new IllegalStateException("No datasource configured with name: " + realmId); - } -} diff --git a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java index 59de2af914..3034000b64 100644 --- a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java +++ b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java @@ -36,6 +36,7 @@ import java.time.Clock; import java.util.List; import javax.sql.DataSource; +import org.apache.polaris.commons.QuarkusDatasourceSupplier; import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.PolarisDefaultDiagServiceImpl; import org.apache.polaris.core.PolarisDiagnostics; @@ -266,9 +267,9 @@ public ActiveRolesProvider activeRolesProvider( @Produces public DatasourceSupplier datasourceSupplier( - RelationalJdbcConfiguration relationalJdbcConfiguration, - @All List> datasourceSuppliers) { - return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, datasourceSuppliers); + @Any RelationalJdbcConfiguration relationalJdbcConfiguration, + @All List> datasources) { + return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, datasources); } public void closeTaskExecutor(@Disposes @Identifier("task-executor") ManagedExecutor executor) { From 14ceabd986c2b159a54e60a52c89cbb00bc2753a Mon Sep 17 00:00:00 2001 From: Prashant Date: Tue, 29 Apr 2025 19:07:33 -0700 Subject: [PATCH 5/8] make all work --- bom/build.gradle.kts | 1 + .../jdbc/RelationalJdbcConfiguration.java | 7 +- gradle/projects.main.properties | 1 + quarkus/admin/build.gradle.kts | 1 + .../jdbc/RelationalJdbcAdminProfile.java | 4 +- quarkus/commons/build.gradle.kts | 4 -- .../commons/QuarkusDatasourceSupplier.java | 39 +++++++---- .../main/resources/application-it.properties | 5 +- .../src/main/resources/application.properties | 5 ++ quarkus/service/build.gradle.kts | 1 + .../jdbc/JdbcQuarkusApplicationIT.java | 2 +- .../jdbc/JdbcQuarkusManagementServiceIT.java | 2 +- .../jdbc/JdbcQuarkusPolicyServiceIT.java | 2 +- .../jdbc/JdbcQuarkusViewFileIT.java | 2 +- .../it/relational/jdbc/JdbcRestCatalogIT.java | 2 +- quarkus/test-commons/build.gradle.kts | 42 ++++++++++++ ...gresRelationalJdbcLifeCycleManagement.java | 68 ++++++++++--------- .../test}/commons/RelationalJdbcProfile.java | 2 +- 18 files changed, 130 insertions(+), 60 deletions(-) create mode 100644 quarkus/test-commons/build.gradle.kts rename quarkus/{commons/src/main/java/org/apache/polaris => test-commons/src/main/java/org/apache/polaris/test}/commons/PostgresRelationalJdbcLifeCycleManagement.java (62%) rename quarkus/{commons/src/main/java/org/apache/polaris => test-commons/src/main/java/org/apache/polaris/test}/commons/RelationalJdbcProfile.java (97%) diff --git a/bom/build.gradle.kts b/bom/build.gradle.kts index ca465625a7..097a425067 100644 --- a/bom/build.gradle.kts +++ b/bom/build.gradle.kts @@ -47,6 +47,7 @@ dependencies { api(project(":polaris-quarkus-admin")) api(project(":polaris-quarkus-commons")) + api(project(":polaris-quarkus-test-commons")) api(project(":polaris-quarkus-defaults")) api(project(":polaris-quarkus-server")) api(project(":polaris-quarkus-service")) diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java index 83c58de58a..0caf78b320 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java @@ -20,8 +20,11 @@ import io.smallrye.config.ConfigMapping; import java.util.Map; +import java.util.Optional; -@ConfigMapping(prefix = "polaris.relation.jdbc") +@ConfigMapping(prefix = "polaris.relation.jdbc.datasource") public interface RelationalJdbcConfiguration { - Map datasource(); + Map realm(); + + Optional defaultDatasource(); } diff --git a/gradle/projects.main.properties b/gradle/projects.main.properties index aa3651394e..0e2060bbf6 100644 --- a/gradle/projects.main.properties +++ b/gradle/projects.main.properties @@ -31,6 +31,7 @@ polaris-quarkus-server=quarkus/server polaris-quarkus-spark-tests=quarkus/spark-tests polaris-quarkus-admin=quarkus/admin polaris-quarkus-commons=quarkus/commons +polaris-quarkus-test-commons=quarkus/test-commons polaris-quarkus-run-script=quarkus/run-script polaris-eclipselink=extension/persistence/eclipselink polaris-jpa-model=extension/persistence/jpa-model diff --git a/quarkus/admin/build.gradle.kts b/quarkus/admin/build.gradle.kts index 7365d041cf..77e0d70953 100644 --- a/quarkus/admin/build.gradle.kts +++ b/quarkus/admin/build.gradle.kts @@ -54,6 +54,7 @@ dependencies { implementation("org.jboss.slf4j:slf4j-jboss-logmanager") implementation(project(":polaris-quarkus-commons")) + testImplementation(project(":polaris-quarkus-test-commons")) testFixturesApi(project(":polaris-core")) testFixturesApi(enforcedPlatform(libs.quarkus.bom)) diff --git a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java index 9a447e23ee..2d477347bc 100644 --- a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java +++ b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java @@ -22,8 +22,8 @@ import java.util.List; import java.util.Map; -import org.apache.polaris.commons.PostgresRelationalJdbcLifeCycleManagement; -import org.apache.polaris.commons.RelationalJdbcProfile; +import org.apache.polaris.test.commons.PostgresRelationalJdbcLifeCycleManagement; +import org.apache.polaris.test.commons.RelationalJdbcProfile; public class RelationalJdbcAdminProfile extends RelationalJdbcProfile { @Override diff --git a/quarkus/commons/build.gradle.kts b/quarkus/commons/build.gradle.kts index a4e3623fe6..c72b11544c 100644 --- a/quarkus/commons/build.gradle.kts +++ b/quarkus/commons/build.gradle.kts @@ -37,8 +37,4 @@ dependencies { implementation(enforcedPlatform(libs.quarkus.bom)) implementation("io.quarkus:quarkus-arc") implementation(project(":polaris-relational-jdbc")) - implementation("io.quarkus:quarkus-junit5") - implementation(platform(libs.testcontainers.bom)) - implementation("org.testcontainers:testcontainers") - implementation("org.testcontainers:postgresql") } diff --git a/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java b/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java index 199f281b5f..9438b13307 100644 --- a/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java +++ b/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java @@ -21,14 +21,15 @@ import io.quarkus.arc.InstanceHandle; import java.util.List; import javax.sql.DataSource; + import org.apache.polaris.extension.persistence.relational.jdbc.DatasourceSupplier; import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; public class QuarkusDatasourceSupplier implements DatasourceSupplier { - private List> dataSources; - private RelationalJdbcConfiguration relationalJdbcConfiguration; + private final List> dataSources; + private final RelationalJdbcConfiguration relationalJdbcConfiguration; - public static final String DEFAULT_DATA_SOURCE_NAME = ""; + private static final String DEFAULT_DATA_SOURCE_NAME = "default"; public QuarkusDatasourceSupplier( RelationalJdbcConfiguration relationalJdbcConfiguration, @@ -39,16 +40,28 @@ public QuarkusDatasourceSupplier( @Override public DataSource fromRealmId(String realmId) { - String dataSourceName = - relationalJdbcConfiguration.datasource().getOrDefault(realmId, DEFAULT_DATA_SOURCE_NAME); - for (InstanceHandle handle : dataSources) { - String name = handle.getBean().getName(); - name = name == null ? DEFAULT_DATA_SOURCE_NAME : name; - // if realm isolation is DB then there should be only one DS configured. - if (name.equals(dataSourceName)) { - return handle.get(); - } + // check if the mapping of realm to DS exists, otherwise fall back to default + String dataSourceName = relationalJdbcConfiguration.realm().getOrDefault( + realmId, + relationalJdbcConfiguration.defaultDatasource().orElse(null) + ); + + // if neither mapping exists nor default DS exists, fail + if (dataSourceName == null) { + throw new IllegalStateException(String.format( + "No datasource configured with name: %s nor default datasource configured", realmId)); } - throw new IllegalStateException("No datasource configured with name: " + realmId); + + // check if there is actually a datasource of that dataSourceName + return dataSources.stream() + .filter(ds -> { + String name = ds.getBean().getName(); + name = name == null ? DEFAULT_DATA_SOURCE_NAME : name; + return name.equals(dataSourceName); + }) + .map(InstanceHandle::get) + .findFirst() + .orElseThrow(() -> new IllegalStateException(String.format( + "No datasource configured with name: %s", dataSourceName))); } } diff --git a/quarkus/defaults/src/main/resources/application-it.properties b/quarkus/defaults/src/main/resources/application-it.properties index 4419d4d590..4351694a19 100644 --- a/quarkus/defaults/src/main/resources/application-it.properties +++ b/quarkus/defaults/src/main/resources/application-it.properties @@ -46,4 +46,7 @@ polaris.realm-context.realms=POLARIS,OTHER polaris.storage.gcp.token=token polaris.storage.gcp.lifespan=PT1H - +quarkus.datasource.realm1_ds.db-kind=pgsql +quarkus.datasource.realm1_ds.jdbc.url=polaris +quarkus.datasource.realm1_ds.username=polaris +quarkus.datasource.realm1_ds.password=polaris diff --git a/quarkus/defaults/src/main/resources/application.properties b/quarkus/defaults/src/main/resources/application.properties index c7676b2ba0..f344e8352b 100644 --- a/quarkus/defaults/src/main/resources/application.properties +++ b/quarkus/defaults/src/main/resources/application.properties @@ -173,3 +173,8 @@ quarkus.index-dependency.protobuf.artifact-id=protobuf-java # force the locale, just in case the system's using another default locale quarkus.default-locale=en_US +# TODO: remove this, its there to make the custom ds work. +quarkus.datasource.realm1_ds.db-kind=pgsql +quarkus.datasource.realm1_ds.jdbc.url=polaris +quarkus.datasource.realm1_ds.username=polaris +quarkus.datasource.realm1_ds.password=polaris diff --git a/quarkus/service/build.gradle.kts b/quarkus/service/build.gradle.kts index 9f91463ab9..b9e3176277 100644 --- a/quarkus/service/build.gradle.kts +++ b/quarkus/service/build.gradle.kts @@ -125,6 +125,7 @@ dependencies { testImplementation(libs.hawkular.agent.prometheus.scraper) implementation(project(":polaris-quarkus-commons")) + testImplementation(project(":polaris-quarkus-test-commons")) testImplementation("io.quarkus:quarkus-junit5") testImplementation(platform(libs.testcontainers.bom)) testImplementation("org.testcontainers:testcontainers") diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java index 59482a425e..dd718db732 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; -import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisApplicationIntegrationTest; +import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java index 67a4bbbe3a..0961889fd6 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; -import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisManagementServiceIntegrationTest; +import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java index 1142926398..5907fe5515 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; -import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisPolicyServiceIntegrationTest; +import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java index d0b8960d09..7471032a52 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; -import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisRestCatalogViewFileIntegrationTest; +import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java index f4fdd15368..59b35fe912 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java @@ -20,8 +20,8 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; -import org.apache.polaris.commons.RelationalJdbcProfile; import org.apache.polaris.service.it.test.PolarisRestCatalogIntegrationTest; +import org.apache.polaris.test.commons.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/test-commons/build.gradle.kts b/quarkus/test-commons/build.gradle.kts new file mode 100644 index 0000000000..9f6dde554a --- /dev/null +++ b/quarkus/test-commons/build.gradle.kts @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +plugins { + alias(libs.plugins.jandex) + id("java-test-fixtures") +} + +configurations.all { + exclude(group = "org.antlr", module = "antlr4-runtime") + exclude(group = "org.scala-lang", module = "scala-library") + exclude(group = "org.scala-lang", module = "scala-reflect") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 +} + +dependencies { + implementation(enforcedPlatform(libs.quarkus.bom)) + implementation("io.quarkus:quarkus-junit5") + implementation(platform(libs.testcontainers.bom)) + implementation("org.testcontainers:testcontainers") + implementation("org.testcontainers:postgresql") +} \ No newline at end of file diff --git a/quarkus/commons/src/main/java/org/apache/polaris/commons/PostgresRelationalJdbcLifeCycleManagement.java b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java similarity index 62% rename from quarkus/commons/src/main/java/org/apache/polaris/commons/PostgresRelationalJdbcLifeCycleManagement.java rename to quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java index 13058e707a..1adbc8f4a3 100644 --- a/quarkus/commons/src/main/java/org/apache/polaris/commons/PostgresRelationalJdbcLifeCycleManagement.java +++ b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.commons; +package org.apache.polaris.test.commons; import io.quarkus.test.common.DevServicesContext; import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; @@ -60,41 +60,45 @@ public Map start() { context.containerNetworkId().ifPresent(postgres::withNetworkMode); postgres.start(); - Map props = new HashMap<>(); - props.put("polaris.persistence.type", "relational-jdbc"); - if (!databases.isEmpty()) { - for (String database : databases) { - // polaris.relation.jdbc.datasource.realm=realm_ds - props.put(String.format("polaris.relation.jdbc.datasource.%s", database), database + "_ds"); - props.put(String.format("quarkus.datasource.%s.db-kind", database + "_ds"), "pgsql"); - props.put(String.format("quarkus.datasource.%s.active", database + "_ds"), "true"); - props.put( - String.format("quarkus.datasource.%s.jdbc.url", database + "_ds"), - postgres.getJdbcUrl().replace("realm1", database)); - props.put( - String.format("quarkus.datasource.%s.username", database + "_ds"), - postgres.getUsername()); - props.put( - String.format("quarkus.datasource.%s.password", database + "_ds"), - postgres.getPassword()); - } + if (databases.isEmpty()) { + Map props = generateDataSourceProps(List.of("realm1")); + // make realm1_ds as the default ds + props.put("polaris.relation.jdbc.datasource.default-datasource", "realm1_ds"); + return props; } else { - return Map.of( - "polaris.persistence.type", - "relational-jdbc", - "quarkus.datasource.db-kind", - "pgsql", - "quarkus.datasource.jdbc.url", - postgres.getJdbcUrl(), - "quarkus.datasource.username", - postgres.getUsername(), - "quarkus.datasource.password", - postgres.getPassword(), - "quarkus.datasource.jdbc.initial-size", - "10"); + Map allProps = new HashMap<>(); + allProps.putAll(generateDataSourceMappingProps(databases)); + allProps.putAll(generateDataSourceProps(databases)); + return allProps; + } + } + + private Map generateDataSourceProps(List dataSources) { + Map props = new HashMap<>(); + props.put("polaris.persistence.type", "relational-jdbc"); + for (String database : dataSources) { + props.put(String.format("quarkus.datasource.%s.db-kind", database + "_ds"), "pgsql"); + props.put(String.format("quarkus.datasource.%s.active", database + "_ds"), "true"); + props.put( + String.format("quarkus.datasource.%s.jdbc.url", database + "_ds"), + postgres.getJdbcUrl().replace("realm1", database)); + props.put( + String.format("quarkus.datasource.%s.username", database + "_ds"), + postgres.getUsername()); + props.put( + String.format("quarkus.datasource.%s.password", database + "_ds"), + postgres.getPassword()); } + return props; + } + private Map generateDataSourceMappingProps(List realms) { + Map props = new HashMap<>(); + // polaris.relation.jdbc.datasource.realm=realm_ds + for (String database : realms) { + props.put(String.format("polaris.relation.jdbc.datasource.realm.%s", database), database + "_ds"); + } return props; } diff --git a/quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcProfile.java b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/RelationalJdbcProfile.java similarity index 97% rename from quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcProfile.java rename to quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/RelationalJdbcProfile.java index 375bbc7c39..38f7bd61a0 100644 --- a/quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcProfile.java +++ b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/RelationalJdbcProfile.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.commons; +package org.apache.polaris.test.commons; import io.quarkus.test.junit.QuarkusTestProfile; import java.util.List; From 80304c3bca7cba52e8ca2febe06014cb9717dd40 Mon Sep 17 00:00:00 2001 From: Prashant Date: Wed, 30 Apr 2025 09:25:41 -0700 Subject: [PATCH 6/8] Address review feedback --- .../persistence/relational-jdbc/build.gradle.kts | 1 - .../jdbc/JdbcMetaStoreManagerFactory.java | 1 + polaris-core/build.gradle.kts | 1 + .../core/config}/RelationalJdbcConfiguration.java | 7 ++++++- .../core/persistence}/DatasourceSupplier.java | 2 +- quarkus/admin/build.gradle.kts | 2 +- .../polaris/admintool/config/QuarkusProducers.java | 4 ++-- quarkus/commons/build.gradle.kts | 2 ++ .../polaris/commons/QuarkusDatasourceSupplier.java | 4 ++-- quarkus/service/build.gradle.kts | 13 ++++++------- .../service/quarkus/config/QuarkusProducers.java | 4 ++-- 11 files changed, 24 insertions(+), 17 deletions(-) rename {extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc => polaris-core/src/main/java/org/apache/polaris/core/config}/RelationalJdbcConfiguration.java (82%) rename {extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc => polaris-core/src/main/java/org/apache/polaris/core/persistence}/DatasourceSupplier.java (93%) diff --git a/extension/persistence/relational-jdbc/build.gradle.kts b/extension/persistence/relational-jdbc/build.gradle.kts index d343d833e1..82f67c8a5a 100644 --- a/extension/persistence/relational-jdbc/build.gradle.kts +++ b/extension/persistence/relational-jdbc/build.gradle.kts @@ -32,7 +32,6 @@ dependencies { compileOnly(libs.jakarta.inject.api) implementation(libs.smallrye.common.annotation) // @Identifier - compileOnly(libs.smallrye.config.core) testImplementation(libs.mockito.junit.jupiter) diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java index 7aa0031d02..956f6953c7 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java @@ -40,6 +40,7 @@ import org.apache.polaris.core.entity.PolarisPrincipalSecrets; import org.apache.polaris.core.persistence.AtomicOperationMetaStoreManager; import org.apache.polaris.core.persistence.BasePersistence; +import org.apache.polaris.core.persistence.DatasourceSupplier; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; import org.apache.polaris.core.persistence.PrincipalSecretsGenerator; diff --git a/polaris-core/build.gradle.kts b/polaris-core/build.gradle.kts index 340dfc472e..9553741043 100644 --- a/polaris-core/build.gradle.kts +++ b/polaris-core/build.gradle.kts @@ -70,6 +70,7 @@ dependencies { implementation(libs.jakarta.validation.api) implementation(libs.jakarta.ws.rs.api) implementation(libs.smallrye.common.annotation) + compileOnly(libs.smallrye.config.core) // @ConfigMap implementation("org.apache.iceberg:iceberg-aws") implementation(platform(libs.awssdk.bom)) diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java b/polaris-core/src/main/java/org/apache/polaris/core/config/RelationalJdbcConfiguration.java similarity index 82% rename from extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java rename to polaris-core/src/main/java/org/apache/polaris/core/config/RelationalJdbcConfiguration.java index 0caf78b320..fe2b9bfeb0 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcConfiguration.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/config/RelationalJdbcConfiguration.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.extension.persistence.relational.jdbc; +package org.apache.polaris.core.config; import io.smallrye.config.ConfigMapping; import java.util.Map; @@ -24,7 +24,12 @@ @ConfigMapping(prefix = "polaris.relation.jdbc.datasource") public interface RelationalJdbcConfiguration { + /** realmId to configured Datasource name mapping. */ Map realm(); + /** + * Default datasource name to be used for a realmId when there is no mapping of realmId to + * Datasource name present. + */ Optional defaultDatasource(); } diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceSupplier.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/DatasourceSupplier.java similarity index 93% rename from extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceSupplier.java rename to polaris-core/src/main/java/org/apache/polaris/core/persistence/DatasourceSupplier.java index 0156701561..7daa3a6a9c 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/DatasourceSupplier.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/DatasourceSupplier.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.extension.persistence.relational.jdbc; +package org.apache.polaris.core.persistence; import javax.sql.DataSource; diff --git a/quarkus/admin/build.gradle.kts b/quarkus/admin/build.gradle.kts index 77e0d70953..b560660f9f 100644 --- a/quarkus/admin/build.gradle.kts +++ b/quarkus/admin/build.gradle.kts @@ -44,7 +44,7 @@ dependencies { implementation(project(":polaris-api-iceberg-service")) runtimeOnly(project(":polaris-eclipselink")) - implementation(project(":polaris-relational-jdbc")) + runtimeOnly(project(":polaris-relational-jdbc")) runtimeOnly("org.postgresql:postgresql") implementation("io.quarkus:quarkus-jdbc-postgresql") implementation(enforcedPlatform(libs.quarkus.bom)) diff --git a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java index fa6c32f5ee..9af3faa647 100644 --- a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java +++ b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java @@ -33,12 +33,12 @@ import org.apache.polaris.core.PolarisDefaultDiagServiceImpl; import org.apache.polaris.core.PolarisDiagnostics; import org.apache.polaris.core.config.PolarisConfigurationStore; +import org.apache.polaris.core.config.RelationalJdbcConfiguration; +import org.apache.polaris.core.persistence.DatasourceSupplier; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo; import org.apache.polaris.core.storage.PolarisStorageIntegration; import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider; -import org.apache.polaris.extension.persistence.relational.jdbc.DatasourceSupplier; -import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; import org.eclipse.microprofile.config.inject.ConfigProperty; public class QuarkusProducers { diff --git a/quarkus/commons/build.gradle.kts b/quarkus/commons/build.gradle.kts index c72b11544c..af2d70091a 100644 --- a/quarkus/commons/build.gradle.kts +++ b/quarkus/commons/build.gradle.kts @@ -34,6 +34,8 @@ java { } dependencies { + implementation(project(":polaris-core")) + implementation(enforcedPlatform(libs.quarkus.bom)) implementation(enforcedPlatform(libs.quarkus.bom)) implementation("io.quarkus:quarkus-arc") implementation(project(":polaris-relational-jdbc")) diff --git a/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java b/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java index 9438b13307..ee41a9fc39 100644 --- a/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java +++ b/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java @@ -22,8 +22,8 @@ import java.util.List; import javax.sql.DataSource; -import org.apache.polaris.extension.persistence.relational.jdbc.DatasourceSupplier; -import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; +import org.apache.polaris.core.persistence.DatasourceSupplier; +import org.apache.polaris.core.config.RelationalJdbcConfiguration; public class QuarkusDatasourceSupplier implements DatasourceSupplier { private final List> dataSources; diff --git a/quarkus/service/build.gradle.kts b/quarkus/service/build.gradle.kts index b9e3176277..2670366324 100644 --- a/quarkus/service/build.gradle.kts +++ b/quarkus/service/build.gradle.kts @@ -51,6 +51,11 @@ dependencies { implementation("io.quarkus:quarkus-security") implementation("io.quarkus:quarkus-smallrye-context-propagation") implementation("io.quarkus:quarkus-smallrye-fault-tolerance") + runtimeOnly("io.quarkus:quarkus-jdbc-postgresql") { + exclude(group = "org.antlr", module = "antlr4-runtime") + exclude(group = "org.scala-lang", module = "scala-library") + exclude(group = "org.scala-lang", module = "scala-reflect") + } implementation(libs.jakarta.enterprise.cdi.api) implementation(libs.jakarta.inject.api) @@ -107,13 +112,7 @@ dependencies { testImplementation("software.amazon.awssdk:glue") testImplementation("software.amazon.awssdk:kms") testImplementation("software.amazon.awssdk:dynamodb") - - implementation(project(":polaris-relational-jdbc")) - runtimeOnly("io.quarkus:quarkus-jdbc-postgresql") { - exclude(group = "org.antlr", module = "antlr4-runtime") - exclude(group = "org.scala-lang", module = "scala-library") - exclude(group = "org.scala-lang", module = "scala-reflect") - } + testImplementation(project(":polaris-relational-jdbc")) testImplementation(platform(libs.quarkus.bom)) testImplementation("io.quarkus:quarkus-junit5") testImplementation("io.quarkus:quarkus-junit5-mockito") diff --git a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java index 3034000b64..8f7fad3c23 100644 --- a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java +++ b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java @@ -44,9 +44,11 @@ import org.apache.polaris.core.auth.PolarisAuthorizer; import org.apache.polaris.core.auth.PolarisAuthorizerImpl; import org.apache.polaris.core.config.PolarisConfigurationStore; +import org.apache.polaris.core.config.RelationalJdbcConfiguration; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.BasePersistence; +import org.apache.polaris.core.persistence.DatasourceSupplier; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisEntityManager; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; @@ -54,8 +56,6 @@ import org.apache.polaris.core.secrets.UserSecretsManager; import org.apache.polaris.core.secrets.UserSecretsManagerFactory; import org.apache.polaris.core.storage.cache.StorageCredentialCache; -import org.apache.polaris.extension.persistence.relational.jdbc.DatasourceSupplier; -import org.apache.polaris.extension.persistence.relational.jdbc.RelationalJdbcConfiguration; import org.apache.polaris.service.auth.ActiveRolesProvider; import org.apache.polaris.service.auth.Authenticator; import org.apache.polaris.service.auth.TokenBrokerFactory; From 643273294d9d58edb4bfa687838fb7938955b16a Mon Sep 17 00:00:00 2001 From: Prashant Date: Wed, 30 Apr 2025 14:57:10 -0700 Subject: [PATCH 7/8] Address review comments --- polaris-core/build.gradle.kts | 1 - .../admintool/config/QuarkusProducers.java | 14 -------------- quarkus/commons/build.gradle.kts | 5 +++-- .../commons/QuarkusDatasourceSupplier.java | 10 +++++++--- .../commons}/RelationalJdbcConfiguration.java | 7 +++++-- .../quarkus/config/QuarkusProducers.java | 19 ++++++------------- ...gresRelationalJdbcLifeCycleManagement.java | 2 +- 7 files changed, 22 insertions(+), 36 deletions(-) rename {polaris-core/src/main/java/org/apache/polaris/core/config => quarkus/commons/src/main/java/org/apache/polaris/commons}/RelationalJdbcConfiguration.java (90%) diff --git a/polaris-core/build.gradle.kts b/polaris-core/build.gradle.kts index 9553741043..340dfc472e 100644 --- a/polaris-core/build.gradle.kts +++ b/polaris-core/build.gradle.kts @@ -70,7 +70,6 @@ dependencies { implementation(libs.jakarta.validation.api) implementation(libs.jakarta.ws.rs.api) implementation(libs.smallrye.common.annotation) - compileOnly(libs.smallrye.config.core) // @ConfigMap implementation("org.apache.iceberg:iceberg-aws") implementation(platform(libs.awssdk.bom)) diff --git a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java index 9af3faa647..07ad023629 100644 --- a/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java +++ b/quarkus/admin/src/main/java/org/apache/polaris/admintool/config/QuarkusProducers.java @@ -18,8 +18,6 @@ */ package org.apache.polaris.admintool.config; -import io.quarkus.arc.All; -import io.quarkus.arc.InstanceHandle; import io.smallrye.common.annotation.Identifier; import jakarta.annotation.Nullable; import jakarta.enterprise.context.ApplicationScoped; @@ -27,14 +25,9 @@ import jakarta.enterprise.inject.Instance; import jakarta.enterprise.inject.Produces; import java.time.Clock; -import java.util.List; -import javax.sql.DataSource; -import org.apache.polaris.commons.QuarkusDatasourceSupplier; import org.apache.polaris.core.PolarisDefaultDiagServiceImpl; import org.apache.polaris.core.PolarisDiagnostics; import org.apache.polaris.core.config.PolarisConfigurationStore; -import org.apache.polaris.core.config.RelationalJdbcConfiguration; -import org.apache.polaris.core.persistence.DatasourceSupplier; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo; import org.apache.polaris.core.storage.PolarisStorageIntegration; @@ -83,11 +76,4 @@ public PolarisConfigurationStore configurationStore() { // A configuration store is not required when running the admin tool. return new PolarisConfigurationStore() {}; } - - @Produces - public DatasourceSupplier datasourceSupplier( - @Any RelationalJdbcConfiguration relationalJdbcConfiguration, - @All List> datasources) { - return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, datasources); - } } diff --git a/quarkus/commons/build.gradle.kts b/quarkus/commons/build.gradle.kts index af2d70091a..d6855b9796 100644 --- a/quarkus/commons/build.gradle.kts +++ b/quarkus/commons/build.gradle.kts @@ -35,8 +35,9 @@ java { dependencies { implementation(project(":polaris-core")) - implementation(enforcedPlatform(libs.quarkus.bom)) + implementation(project(":polaris-relational-jdbc")) + + compileOnly(libs.smallrye.config.core) // @ConfigMap implementation(enforcedPlatform(libs.quarkus.bom)) implementation("io.quarkus:quarkus-arc") - implementation(project(":polaris-relational-jdbc")) } diff --git a/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java b/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java index ee41a9fc39..3ea01c6e11 100644 --- a/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java +++ b/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java @@ -18,22 +18,26 @@ */ package org.apache.polaris.commons; +import io.quarkus.arc.All; import io.quarkus.arc.InstanceHandle; import java.util.List; import javax.sql.DataSource; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.apache.polaris.core.persistence.DatasourceSupplier; -import org.apache.polaris.core.config.RelationalJdbcConfiguration; +@ApplicationScoped public class QuarkusDatasourceSupplier implements DatasourceSupplier { private final List> dataSources; private final RelationalJdbcConfiguration relationalJdbcConfiguration; private static final String DEFAULT_DATA_SOURCE_NAME = "default"; + @Inject public QuarkusDatasourceSupplier( RelationalJdbcConfiguration relationalJdbcConfiguration, - List> dataSources) { + @All List> dataSources) { this.relationalJdbcConfiguration = relationalJdbcConfiguration; this.dataSources = dataSources; } @@ -41,7 +45,7 @@ public QuarkusDatasourceSupplier( @Override public DataSource fromRealmId(String realmId) { // check if the mapping of realm to DS exists, otherwise fall back to default - String dataSourceName = relationalJdbcConfiguration.realm().getOrDefault( + String dataSourceName = relationalJdbcConfiguration.realms().getOrDefault( realmId, relationalJdbcConfiguration.defaultDatasource().orElse(null) ); diff --git a/polaris-core/src/main/java/org/apache/polaris/core/config/RelationalJdbcConfiguration.java b/quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcConfiguration.java similarity index 90% rename from polaris-core/src/main/java/org/apache/polaris/core/config/RelationalJdbcConfiguration.java rename to quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcConfiguration.java index fe2b9bfeb0..4d7805cab1 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/config/RelationalJdbcConfiguration.java +++ b/quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcConfiguration.java @@ -16,16 +16,19 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.core.config; +package org.apache.polaris.commons; import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithParentName; + import java.util.Map; import java.util.Optional; @ConfigMapping(prefix = "polaris.relation.jdbc.datasource") public interface RelationalJdbcConfiguration { /** realmId to configured Datasource name mapping. */ - Map realm(); + @WithParentName + Map realms(); /** * Default datasource name to be used for a realmId when there is no mapping of realmId to diff --git a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java index 8f7fad3c23..5ada2d90b4 100644 --- a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java +++ b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java @@ -18,8 +18,6 @@ */ package org.apache.polaris.service.quarkus.config; -import io.quarkus.arc.All; -import io.quarkus.arc.InstanceHandle; import io.quarkus.runtime.StartupEvent; import io.smallrye.common.annotation.Identifier; import io.smallrye.context.SmallRyeManagedExecutor; @@ -34,9 +32,6 @@ import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.core.Context; import java.time.Clock; -import java.util.List; -import javax.sql.DataSource; -import org.apache.polaris.commons.QuarkusDatasourceSupplier; import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.PolarisDefaultDiagServiceImpl; import org.apache.polaris.core.PolarisDiagnostics; @@ -44,11 +39,9 @@ import org.apache.polaris.core.auth.PolarisAuthorizer; import org.apache.polaris.core.auth.PolarisAuthorizerImpl; import org.apache.polaris.core.config.PolarisConfigurationStore; -import org.apache.polaris.core.config.RelationalJdbcConfiguration; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.BasePersistence; -import org.apache.polaris.core.persistence.DatasourceSupplier; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisEntityManager; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; @@ -265,12 +258,12 @@ public ActiveRolesProvider activeRolesProvider( return activeRolesProviders.select(Identifier.Literal.of(persistenceType)).get(); } - @Produces - public DatasourceSupplier datasourceSupplier( - @Any RelationalJdbcConfiguration relationalJdbcConfiguration, - @All List> datasources) { - return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, datasources); - } + // @Produces + // public DatasourceSupplier datasourceSupplier( + // @Any RelationalJdbcConfiguration relationalJdbcConfiguration, + // @All List> datasources) { + // return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, datasources); + // } public void closeTaskExecutor(@Disposes @Identifier("task-executor") ManagedExecutor executor) { executor.close(); diff --git a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java index 1adbc8f4a3..8cca125d03 100644 --- a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java +++ b/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java @@ -97,7 +97,7 @@ private Map generateDataSourceMappingProps(List realms) Map props = new HashMap<>(); // polaris.relation.jdbc.datasource.realm=realm_ds for (String database : realms) { - props.put(String.format("polaris.relation.jdbc.datasource.realm.%s", database), database + "_ds"); + props.put(String.format("polaris.relation.jdbc.datasource.%s", database), database + "_ds"); } return props; } From 32bb4b9817c2d7d6c2b3f8c240cd8d6f999d5f8a Mon Sep 17 00:00:00 2001 From: Prashant Date: Wed, 30 Apr 2025 15:07:22 -0700 Subject: [PATCH 8/8] Address Alex feedback --- bom/build.gradle.kts | 4 +-- gradle/projects.main.properties | 4 +-- quarkus/admin/build.gradle.kts | 4 +-- .../jdbc/RelationalJdbcAdminProfile.java | 4 +-- quarkus/{commons => common}/build.gradle.kts | 0 .../common}/QuarkusDatasourceSupplier.java | 2 +- .../common}/RelationalJdbcConfiguration.java | 4 +-- quarkus/service/build.gradle.kts | 4 +-- .../jdbc/JdbcQuarkusApplicationIT.java | 2 +- .../jdbc/JdbcQuarkusManagementServiceIT.java | 2 +- .../jdbc/JdbcQuarkusPolicyServiceIT.java | 2 +- .../jdbc/JdbcQuarkusViewFileIT.java | 2 +- .../it/relational/jdbc/JdbcRestCatalogIT.java | 2 +- .../quarkus/config/QuarkusProducers.java | 17 +++++------- .../build.gradle.kts | 26 +++++++++---------- ...gresRelationalJdbcLifeCycleManagement.java | 6 ++--- .../test/common}/RelationalJdbcProfile.java | 2 +- 17 files changed, 42 insertions(+), 45 deletions(-) rename quarkus/{commons => common}/build.gradle.kts (100%) rename quarkus/{commons/src/main/java/org/apache/polaris/commons => common/src/main/java/org/apache/polaris/common}/QuarkusDatasourceSupplier.java (98%) rename quarkus/{commons/src/main/java/org/apache/polaris/commons => common/src/main/java/org/apache/polaris/common}/RelationalJdbcConfiguration.java (92%) rename quarkus/{test-commons => test-common}/build.gradle.kts (58%) rename quarkus/{test-commons/src/main/java/org/apache/polaris/test/commons => test-common/src/main/java/org/apache/polaris/test/common}/PostgresRelationalJdbcLifeCycleManagement.java (94%) rename quarkus/{test-commons/src/main/java/org/apache/polaris/test/commons => test-common/src/main/java/org/apache/polaris/test/common}/RelationalJdbcProfile.java (97%) diff --git a/bom/build.gradle.kts b/bom/build.gradle.kts index 097a425067..c1c0554242 100644 --- a/bom/build.gradle.kts +++ b/bom/build.gradle.kts @@ -46,8 +46,8 @@ dependencies { api(project(":polaris-jpa-model")) api(project(":polaris-quarkus-admin")) - api(project(":polaris-quarkus-commons")) - api(project(":polaris-quarkus-test-commons")) + api(project(":polaris-quarkus-common")) + api(project(":polaris-quarkus-test-common")) api(project(":polaris-quarkus-defaults")) api(project(":polaris-quarkus-server")) api(project(":polaris-quarkus-service")) diff --git a/gradle/projects.main.properties b/gradle/projects.main.properties index 0e2060bbf6..e75ee28aca 100644 --- a/gradle/projects.main.properties +++ b/gradle/projects.main.properties @@ -30,8 +30,8 @@ polaris-quarkus-service=quarkus/service polaris-quarkus-server=quarkus/server polaris-quarkus-spark-tests=quarkus/spark-tests polaris-quarkus-admin=quarkus/admin -polaris-quarkus-commons=quarkus/commons -polaris-quarkus-test-commons=quarkus/test-commons +polaris-quarkus-common=quarkus/common +polaris-quarkus-test-common=quarkus/test-common polaris-quarkus-run-script=quarkus/run-script polaris-eclipselink=extension/persistence/eclipselink polaris-jpa-model=extension/persistence/jpa-model diff --git a/quarkus/admin/build.gradle.kts b/quarkus/admin/build.gradle.kts index b560660f9f..fd94d96316 100644 --- a/quarkus/admin/build.gradle.kts +++ b/quarkus/admin/build.gradle.kts @@ -53,8 +53,8 @@ dependencies { implementation("org.jboss.slf4j:slf4j-jboss-logmanager") - implementation(project(":polaris-quarkus-commons")) - testImplementation(project(":polaris-quarkus-test-commons")) + implementation(project(":polaris-quarkus-common")) + testImplementation(project(":polaris-quarkus-test-common")) testFixturesApi(project(":polaris-core")) testFixturesApi(enforcedPlatform(libs.quarkus.bom)) diff --git a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java index 2d477347bc..6eec8b0db9 100644 --- a/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java +++ b/quarkus/admin/src/test/java/org/apache/polaris/admintool/relational/jdbc/RelationalJdbcAdminProfile.java @@ -22,8 +22,8 @@ import java.util.List; import java.util.Map; -import org.apache.polaris.test.commons.PostgresRelationalJdbcLifeCycleManagement; -import org.apache.polaris.test.commons.RelationalJdbcProfile; +import org.apache.polaris.test.common.PostgresRelationalJdbcLifeCycleManagement; +import org.apache.polaris.test.common.RelationalJdbcProfile; public class RelationalJdbcAdminProfile extends RelationalJdbcProfile { @Override diff --git a/quarkus/commons/build.gradle.kts b/quarkus/common/build.gradle.kts similarity index 100% rename from quarkus/commons/build.gradle.kts rename to quarkus/common/build.gradle.kts diff --git a/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java b/quarkus/common/src/main/java/org/apache/polaris/common/QuarkusDatasourceSupplier.java similarity index 98% rename from quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java rename to quarkus/common/src/main/java/org/apache/polaris/common/QuarkusDatasourceSupplier.java index 3ea01c6e11..11c5952218 100644 --- a/quarkus/commons/src/main/java/org/apache/polaris/commons/QuarkusDatasourceSupplier.java +++ b/quarkus/common/src/main/java/org/apache/polaris/common/QuarkusDatasourceSupplier.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.commons; +package org.apache.polaris.common; import io.quarkus.arc.All; import io.quarkus.arc.InstanceHandle; diff --git a/quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcConfiguration.java b/quarkus/common/src/main/java/org/apache/polaris/common/RelationalJdbcConfiguration.java similarity index 92% rename from quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcConfiguration.java rename to quarkus/common/src/main/java/org/apache/polaris/common/RelationalJdbcConfiguration.java index 4d7805cab1..f07fbaa65a 100644 --- a/quarkus/commons/src/main/java/org/apache/polaris/commons/RelationalJdbcConfiguration.java +++ b/quarkus/common/src/main/java/org/apache/polaris/common/RelationalJdbcConfiguration.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.commons; +package org.apache.polaris.common; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithParentName; @@ -24,7 +24,7 @@ import java.util.Map; import java.util.Optional; -@ConfigMapping(prefix = "polaris.relation.jdbc.datasource") +@ConfigMapping(prefix = "polaris.relational.jdbc.datasource") public interface RelationalJdbcConfiguration { /** realmId to configured Datasource name mapping. */ @WithParentName diff --git a/quarkus/service/build.gradle.kts b/quarkus/service/build.gradle.kts index 2670366324..7258ed1c6d 100644 --- a/quarkus/service/build.gradle.kts +++ b/quarkus/service/build.gradle.kts @@ -123,8 +123,8 @@ dependencies { testImplementation(libs.threeten.extra) testImplementation(libs.hawkular.agent.prometheus.scraper) - implementation(project(":polaris-quarkus-commons")) - testImplementation(project(":polaris-quarkus-test-commons")) + implementation(project(":polaris-quarkus-common")) + testImplementation(project(":polaris-quarkus-test-common")) testImplementation("io.quarkus:quarkus-junit5") testImplementation(platform(libs.testcontainers.bom)) testImplementation("org.testcontainers:testcontainers") diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java index dd718db732..1298061f9e 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusApplicationIT.java @@ -21,7 +21,7 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; import org.apache.polaris.service.it.test.PolarisApplicationIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; +import org.apache.polaris.test.common.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java index 0961889fd6..ec29d4db3d 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusManagementServiceIT.java @@ -21,7 +21,7 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; import org.apache.polaris.service.it.test.PolarisManagementServiceIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; +import org.apache.polaris.test.common.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java index 5907fe5515..4891f1654e 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusPolicyServiceIT.java @@ -21,7 +21,7 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; import org.apache.polaris.service.it.test.PolarisPolicyServiceIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; +import org.apache.polaris.test.common.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java index 7471032a52..e39b65190a 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcQuarkusViewFileIT.java @@ -21,7 +21,7 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; import org.apache.polaris.service.it.test.PolarisRestCatalogViewFileIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; +import org.apache.polaris.test.common.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java index 59b35fe912..9a03540940 100644 --- a/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java +++ b/quarkus/service/src/intTest/java/org/apache/polaris/service/quarkus/it/relational/jdbc/JdbcRestCatalogIT.java @@ -21,7 +21,7 @@ import io.quarkus.test.junit.QuarkusIntegrationTest; import io.quarkus.test.junit.TestProfile; import org.apache.polaris.service.it.test.PolarisRestCatalogIntegrationTest; -import org.apache.polaris.test.commons.RelationalJdbcProfile; +import org.apache.polaris.test.common.RelationalJdbcProfile; @TestProfile(RelationalJdbcProfile.class) @QuarkusIntegrationTest diff --git a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java index 5ada2d90b4..5ecddc65f8 100644 --- a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java +++ b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java @@ -41,10 +41,7 @@ import org.apache.polaris.core.config.PolarisConfigurationStore; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; -import org.apache.polaris.core.persistence.BasePersistence; -import org.apache.polaris.core.persistence.MetaStoreManagerFactory; -import org.apache.polaris.core.persistence.PolarisEntityManager; -import org.apache.polaris.core.persistence.PolarisMetaStoreManager; +import org.apache.polaris.core.persistence.*; import org.apache.polaris.core.persistence.bootstrap.RootCredentialsSet; import org.apache.polaris.core.secrets.UserSecretsManager; import org.apache.polaris.core.secrets.UserSecretsManagerFactory; @@ -258,12 +255,12 @@ public ActiveRolesProvider activeRolesProvider( return activeRolesProviders.select(Identifier.Literal.of(persistenceType)).get(); } - // @Produces - // public DatasourceSupplier datasourceSupplier( - // @Any RelationalJdbcConfiguration relationalJdbcConfiguration, - // @All List> datasources) { - // return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, datasources); - // } + // @Produces + // public DatasourceSupplier datasourceSupplier( + // @Any RelationalJdbcConfiguration relationalJdbcConfiguration, + // @All List> datasources) { + // return new QuarkusDatasourceSupplier(relationalJdbcConfiguration, datasources); + // } public void closeTaskExecutor(@Disposes @Identifier("task-executor") ManagedExecutor executor) { executor.close(); diff --git a/quarkus/test-commons/build.gradle.kts b/quarkus/test-common/build.gradle.kts similarity index 58% rename from quarkus/test-commons/build.gradle.kts rename to quarkus/test-common/build.gradle.kts index 9f6dde554a..b3813c90be 100644 --- a/quarkus/test-commons/build.gradle.kts +++ b/quarkus/test-common/build.gradle.kts @@ -18,25 +18,25 @@ */ plugins { - alias(libs.plugins.jandex) - id("java-test-fixtures") + alias(libs.plugins.jandex) + id("java-test-fixtures") } configurations.all { - exclude(group = "org.antlr", module = "antlr4-runtime") - exclude(group = "org.scala-lang", module = "scala-library") - exclude(group = "org.scala-lang", module = "scala-reflect") + exclude(group = "org.antlr", module = "antlr4-runtime") + exclude(group = "org.scala-lang", module = "scala-library") + exclude(group = "org.scala-lang", module = "scala-reflect") } java { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } dependencies { - implementation(enforcedPlatform(libs.quarkus.bom)) - implementation("io.quarkus:quarkus-junit5") - implementation(platform(libs.testcontainers.bom)) - implementation("org.testcontainers:testcontainers") - implementation("org.testcontainers:postgresql") -} \ No newline at end of file + implementation(enforcedPlatform(libs.quarkus.bom)) + implementation("io.quarkus:quarkus-junit5") + implementation(platform(libs.testcontainers.bom)) + implementation("org.testcontainers:testcontainers") + implementation("org.testcontainers:postgresql") +} diff --git a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java b/quarkus/test-common/src/main/java/org/apache/polaris/test/common/PostgresRelationalJdbcLifeCycleManagement.java similarity index 94% rename from quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java rename to quarkus/test-common/src/main/java/org/apache/polaris/test/common/PostgresRelationalJdbcLifeCycleManagement.java index 8cca125d03..3e764aaa24 100644 --- a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/PostgresRelationalJdbcLifeCycleManagement.java +++ b/quarkus/test-common/src/main/java/org/apache/polaris/test/common/PostgresRelationalJdbcLifeCycleManagement.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.test.commons; +package org.apache.polaris.test.common; import io.quarkus.test.common.DevServicesContext; import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; @@ -64,7 +64,7 @@ public Map start() { if (databases.isEmpty()) { Map props = generateDataSourceProps(List.of("realm1")); // make realm1_ds as the default ds - props.put("polaris.relation.jdbc.datasource.default-datasource", "realm1_ds"); + props.put("polaris.relational.jdbc.datasource.default-datasource", "realm1_ds"); return props; } else { Map allProps = new HashMap<>(); @@ -97,7 +97,7 @@ private Map generateDataSourceMappingProps(List realms) Map props = new HashMap<>(); // polaris.relation.jdbc.datasource.realm=realm_ds for (String database : realms) { - props.put(String.format("polaris.relation.jdbc.datasource.%s", database), database + "_ds"); + props.put(String.format("polaris.relational.jdbc.datasource.%s", database), database + "_ds"); } return props; } diff --git a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/RelationalJdbcProfile.java b/quarkus/test-common/src/main/java/org/apache/polaris/test/common/RelationalJdbcProfile.java similarity index 97% rename from quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/RelationalJdbcProfile.java rename to quarkus/test-common/src/main/java/org/apache/polaris/test/common/RelationalJdbcProfile.java index 38f7bd61a0..fa48a80bd6 100644 --- a/quarkus/test-commons/src/main/java/org/apache/polaris/test/commons/RelationalJdbcProfile.java +++ b/quarkus/test-common/src/main/java/org/apache/polaris/test/common/RelationalJdbcProfile.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.test.commons; +package org.apache.polaris.test.common; import io.quarkus.test.junit.QuarkusTestProfile; import java.util.List;