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 429cbb5eb4..7350b6b536 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 synchronized Map bootstrapRealms( 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 16b7439791..ffab9a9412 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.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.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 MetaStoreManagerFactory metaStoreManagerFactory( * 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 5c3223f696..db5d84ebfc 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 @@ -20,6 +20,8 @@ import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; +import io.smallrye.config.WithDefault; +import java.util.Set; @StaticInitSafe @ConfigMapping(prefix = "polaris.persistence") @@ -30,4 +32,11 @@ public interface QuarkusPersistenceConfiguration { * org.apache.polaris.core.persistence.MetaStoreManagerFactory} identifier. */ String type(); + + @WithDefault("in-memory") + Set 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 c65c84d196..2d51dcd539 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.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 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 synchronized Supplier getOrCreateSessionSupplie private void bootstrapRealmsAndPrintCredentials(List realms) { RootCredentialsSet rootCredentialsSet = RootCredentialsSet.fromEnvironment(); - Map results = this.bootstrapRealms(realms, rootCredentialsSet); + this.bootstrapRealms(realms, rootCredentialsSet); bootstrappedRealms.addAll(realms); + } + @Override + public Map bootstrapRealms( + Iterable realms, RootCredentialsSet rootCredentialsSet) { + Map results = super.bootstrapRealms(realms, rootCredentialsSet); + + Map 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 @@ private void bootstrapRealmsAndPrintCredentials(List realms) { principalSecrets.getPrincipalSecrets().getMainSecret()); System.out.println(msg); } + + return results; } }