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;
   }
 }

Reply via email to