This is an automated email from the ASF dual-hosted git repository.
emaynard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new cd1ebb516 Generalize bootstrapping in servers (#1313)
cd1ebb516 is described below
commit cd1ebb51638f9ac4244d848924fcdcd812748f81
Author: Dmitri Bourlatchkov <[email protected]>
AuthorDate: Tue Apr 8 13:41:57 2025 -0400
Generalize bootstrapping in servers (#1313)
* Remove `instanceof` checks from `QuarkusProducers`.
* Remove the now unused `onStartup` method from
`InMemoryPolarisMetaStoreManagerFactory`.
* Instead, call the good old `bootstrapRealms` method from
`QuarkusProducers`.
* Add new config property to control which MetaStore types are bootstrapped
automatically (defaults to `in-memory` as before).
* There is no bootstrap behaviour change in this PR, only refactorings to
simplify code.
* Add info log message to indicate when a realm is bootstrapped in runtime
using preset credentials.
Future enhancements may include pulling preset credentials from a secret
manager like Vault for bootstrapping (s discussed in comments on #1228).
---
.../LocalPolarisMetaStoreManagerFactory.java | 5 +++++
.../service/quarkus/config/QuarkusProducers.java | 10 ++++++----
.../QuarkusPersistenceConfiguration.java | 9 +++++++++
.../InMemoryPolarisMetaStoreManagerFactory.java | 22 ++++++++++++++++------
4 files changed, 36 insertions(+), 10 deletions(-)
diff --git
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java
index 429cbb5eb..7350b6b53 100644
---
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java
+++
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java
@@ -118,6 +118,11 @@ public abstract class
LocalPolarisMetaStoreManagerFactory<StoreType>
PrincipalSecretsResult secretsResult =
bootstrapServiceAndCreatePolarisPrincipalForRealm(
realmContext,
metaStoreManagerMap.get(realmContext.getRealmIdentifier()));
+
+ if (rootCredentialsSet.credentials().containsKey(realm)) {
+ LOGGER.info("Bootstrapped realm {} using preset credentials.",
realm);
+ }
+
results.put(realmContext.getRealmIdentifier(), secretsResult);
}
}
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 16b743979..ffab9a941 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
@@ -45,6 +45,7 @@ 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.bootstrap.RootCredentialsSet;
import org.apache.polaris.core.storage.cache.StorageCredentialCache;
import org.apache.polaris.service.auth.ActiveRolesProvider;
import org.apache.polaris.service.auth.Authenticator;
@@ -55,7 +56,6 @@ import
org.apache.polaris.service.config.RealmEntityManagerFactory;
import org.apache.polaris.service.context.RealmContextConfiguration;
import org.apache.polaris.service.context.RealmContextFilter;
import org.apache.polaris.service.context.RealmContextResolver;
-import
org.apache.polaris.service.persistence.InMemoryPolarisMetaStoreManagerFactory;
import
org.apache.polaris.service.quarkus.auth.QuarkusAuthenticationConfiguration;
import
org.apache.polaris.service.quarkus.catalog.io.QuarkusFileIOConfiguration;
import
org.apache.polaris.service.quarkus.context.QuarkusRealmContextConfiguration;
@@ -154,12 +154,14 @@ public class QuarkusProducers {
* Eagerly initialize the in-memory default realm on startup, so that users
can check the
* credentials printed to stdout immediately.
*/
- public void maybeInitializeInMemoryRealm(
+ public void maybeBootstrap(
@Observes StartupEvent event,
MetaStoreManagerFactory factory,
+ QuarkusPersistenceConfiguration config,
RealmContextConfiguration realmContextConfiguration) {
- if (factory instanceof InMemoryPolarisMetaStoreManagerFactory) {
- ((InMemoryPolarisMetaStoreManagerFactory)
factory).onStartup(realmContextConfiguration);
+ if (config.isAutoBootstrap()) {
+ RootCredentialsSet rootCredentialsSet =
RootCredentialsSet.fromEnvironment();
+ factory.bootstrapRealms(realmContextConfiguration.realms(),
rootCredentialsSet);
}
}
diff --git
a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/persistence/QuarkusPersistenceConfiguration.java
b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/persistence/QuarkusPersistenceConfiguration.java
index e6306d8c7..eb4ab6aa6 100644
---
a/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/persistence/QuarkusPersistenceConfiguration.java
+++
b/quarkus/service/src/main/java/org/apache/polaris/service/quarkus/persistence/QuarkusPersistenceConfiguration.java
@@ -19,6 +19,8 @@
package org.apache.polaris.service.quarkus.persistence;
import io.smallrye.config.ConfigMapping;
+import io.smallrye.config.WithDefault;
+import java.util.Set;
@ConfigMapping(prefix = "polaris.persistence")
public interface QuarkusPersistenceConfiguration {
@@ -28,4 +30,11 @@ public interface QuarkusPersistenceConfiguration {
* org.apache.polaris.core.persistence.MetaStoreManagerFactory} identifier.
*/
String type();
+
+ @WithDefault("in-memory")
+ Set<String> autoBootstrapTypes();
+
+ default boolean isAutoBootstrap() {
+ return autoBootstrapTypes().contains(type());
+ }
}
diff --git
a/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryPolarisMetaStoreManagerFactory.java
b/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryPolarisMetaStoreManagerFactory.java
index c65c84d19..2d51dcd53 100644
---
a/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryPolarisMetaStoreManagerFactory.java
+++
b/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryPolarisMetaStoreManagerFactory.java
@@ -32,13 +32,13 @@ import org.apache.polaris.core.PolarisDiagnostics;
import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.persistence.LocalPolarisMetaStoreManagerFactory;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
+import org.apache.polaris.core.persistence.bootstrap.RootCredentials;
import org.apache.polaris.core.persistence.bootstrap.RootCredentialsSet;
import org.apache.polaris.core.persistence.dao.entity.PrincipalSecretsResult;
import
org.apache.polaris.core.persistence.transactional.TransactionalPersistence;
import org.apache.polaris.core.persistence.transactional.TreeMapMetaStore;
import
org.apache.polaris.core.persistence.transactional.TreeMapTransactionalPersistenceImpl;
import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider;
-import org.apache.polaris.service.context.RealmContextConfiguration;
@ApplicationScoped
@Identifier("in-memory")
@@ -59,10 +59,6 @@ public class InMemoryPolarisMetaStoreManagerFactory
this.storageIntegration = storageIntegration;
}
- public void onStartup(RealmContextConfiguration realmContextConfiguration) {
- bootstrapRealmsAndPrintCredentials(realmContextConfiguration.realms());
- }
-
@Override
protected TreeMapMetaStore createBackingStore(@Nonnull PolarisDiagnostics
diagnostics) {
return new TreeMapMetaStore(diagnostics);
@@ -100,10 +96,22 @@ public class InMemoryPolarisMetaStoreManagerFactory
private void bootstrapRealmsAndPrintCredentials(List<String> realms) {
RootCredentialsSet rootCredentialsSet =
RootCredentialsSet.fromEnvironment();
- Map<String, PrincipalSecretsResult> results = this.bootstrapRealms(realms,
rootCredentialsSet);
+ this.bootstrapRealms(realms, rootCredentialsSet);
bootstrappedRealms.addAll(realms);
+ }
+ @Override
+ public Map<String, PrincipalSecretsResult> bootstrapRealms(
+ Iterable<String> realms, RootCredentialsSet rootCredentialsSet) {
+ Map<String, PrincipalSecretsResult> results =
super.bootstrapRealms(realms, rootCredentialsSet);
+
+ Map<String, RootCredentials> presetCredentials =
rootCredentialsSet.credentials();
for (String realmId : realms) {
+ if (presetCredentials.containsKey(realmId)) {
+ // Credentials provided in the runtime env... no need to print
+ continue;
+ }
+
PrincipalSecretsResult principalSecrets = results.get(realmId);
String msg =
@@ -114,5 +122,7 @@ public class InMemoryPolarisMetaStoreManagerFactory
principalSecrets.getPrincipalSecrets().getMainSecret());
System.out.println(msg);
}
+
+ return results;
}
}