Skip to content

Commit cd1ebb5

Browse files
authored
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).
1 parent 2eff46d commit cd1ebb5

File tree

4 files changed

+36
-10
lines changed

4 files changed

+36
-10
lines changed

polaris-core/src/main/java/org/apache/polaris/core/persistence/LocalPolarisMetaStoreManagerFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ public synchronized Map<String, PrincipalSecretsResult> bootstrapRealms(
118118
PrincipalSecretsResult secretsResult =
119119
bootstrapServiceAndCreatePolarisPrincipalForRealm(
120120
realmContext, metaStoreManagerMap.get(realmContext.getRealmIdentifier()));
121+
122+
if (rootCredentialsSet.credentials().containsKey(realm)) {
123+
LOGGER.info("Bootstrapped realm {} using preset credentials.", realm);
124+
}
125+
121126
results.put(realmContext.getRealmIdentifier(), secretsResult);
122127
}
123128
}

quarkus/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
4646
import org.apache.polaris.core.persistence.PolarisEntityManager;
4747
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
48+
import org.apache.polaris.core.persistence.bootstrap.RootCredentialsSet;
4849
import org.apache.polaris.core.storage.cache.StorageCredentialCache;
4950
import org.apache.polaris.service.auth.ActiveRolesProvider;
5051
import org.apache.polaris.service.auth.Authenticator;
@@ -55,7 +56,6 @@
5556
import org.apache.polaris.service.context.RealmContextConfiguration;
5657
import org.apache.polaris.service.context.RealmContextFilter;
5758
import org.apache.polaris.service.context.RealmContextResolver;
58-
import org.apache.polaris.service.persistence.InMemoryPolarisMetaStoreManagerFactory;
5959
import org.apache.polaris.service.quarkus.auth.QuarkusAuthenticationConfiguration;
6060
import org.apache.polaris.service.quarkus.catalog.io.QuarkusFileIOConfiguration;
6161
import org.apache.polaris.service.quarkus.context.QuarkusRealmContextConfiguration;
@@ -154,12 +154,14 @@ public MetaStoreManagerFactory metaStoreManagerFactory(
154154
* Eagerly initialize the in-memory default realm on startup, so that users can check the
155155
* credentials printed to stdout immediately.
156156
*/
157-
public void maybeInitializeInMemoryRealm(
157+
public void maybeBootstrap(
158158
@Observes StartupEvent event,
159159
MetaStoreManagerFactory factory,
160+
QuarkusPersistenceConfiguration config,
160161
RealmContextConfiguration realmContextConfiguration) {
161-
if (factory instanceof InMemoryPolarisMetaStoreManagerFactory) {
162-
((InMemoryPolarisMetaStoreManagerFactory) factory).onStartup(realmContextConfiguration);
162+
if (config.isAutoBootstrap()) {
163+
RootCredentialsSet rootCredentialsSet = RootCredentialsSet.fromEnvironment();
164+
factory.bootstrapRealms(realmContextConfiguration.realms(), rootCredentialsSet);
163165
}
164166
}
165167

quarkus/service/src/main/java/org/apache/polaris/service/quarkus/persistence/QuarkusPersistenceConfiguration.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
package org.apache.polaris.service.quarkus.persistence;
2020

2121
import io.smallrye.config.ConfigMapping;
22+
import io.smallrye.config.WithDefault;
23+
import java.util.Set;
2224

2325
@ConfigMapping(prefix = "polaris.persistence")
2426
public interface QuarkusPersistenceConfiguration {
@@ -28,4 +30,11 @@ public interface QuarkusPersistenceConfiguration {
2830
* org.apache.polaris.core.persistence.MetaStoreManagerFactory} identifier.
2931
*/
3032
String type();
33+
34+
@WithDefault("in-memory")
35+
Set<String> autoBootstrapTypes();
36+
37+
default boolean isAutoBootstrap() {
38+
return autoBootstrapTypes().contains(type());
39+
}
3140
}

service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryPolarisMetaStoreManagerFactory.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@
3232
import org.apache.polaris.core.context.RealmContext;
3333
import org.apache.polaris.core.persistence.LocalPolarisMetaStoreManagerFactory;
3434
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
35+
import org.apache.polaris.core.persistence.bootstrap.RootCredentials;
3536
import org.apache.polaris.core.persistence.bootstrap.RootCredentialsSet;
3637
import org.apache.polaris.core.persistence.dao.entity.PrincipalSecretsResult;
3738
import org.apache.polaris.core.persistence.transactional.TransactionalPersistence;
3839
import org.apache.polaris.core.persistence.transactional.TreeMapMetaStore;
3940
import org.apache.polaris.core.persistence.transactional.TreeMapTransactionalPersistenceImpl;
4041
import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider;
41-
import org.apache.polaris.service.context.RealmContextConfiguration;
4242

4343
@ApplicationScoped
4444
@Identifier("in-memory")
@@ -59,10 +59,6 @@ public InMemoryPolarisMetaStoreManagerFactory(
5959
this.storageIntegration = storageIntegration;
6060
}
6161

62-
public void onStartup(RealmContextConfiguration realmContextConfiguration) {
63-
bootstrapRealmsAndPrintCredentials(realmContextConfiguration.realms());
64-
}
65-
6662
@Override
6763
protected TreeMapMetaStore createBackingStore(@Nonnull PolarisDiagnostics diagnostics) {
6864
return new TreeMapMetaStore(diagnostics);
@@ -100,10 +96,22 @@ public synchronized Supplier<TransactionalPersistence> getOrCreateSessionSupplie
10096

10197
private void bootstrapRealmsAndPrintCredentials(List<String> realms) {
10298
RootCredentialsSet rootCredentialsSet = RootCredentialsSet.fromEnvironment();
103-
Map<String, PrincipalSecretsResult> results = this.bootstrapRealms(realms, rootCredentialsSet);
99+
this.bootstrapRealms(realms, rootCredentialsSet);
104100
bootstrappedRealms.addAll(realms);
101+
}
105102

103+
@Override
104+
public Map<String, PrincipalSecretsResult> bootstrapRealms(
105+
Iterable<String> realms, RootCredentialsSet rootCredentialsSet) {
106+
Map<String, PrincipalSecretsResult> results = super.bootstrapRealms(realms, rootCredentialsSet);
107+
108+
Map<String, RootCredentials> presetCredentials = rootCredentialsSet.credentials();
106109
for (String realmId : realms) {
110+
if (presetCredentials.containsKey(realmId)) {
111+
// Credentials provided in the runtime env... no need to print
112+
continue;
113+
}
114+
107115
PrincipalSecretsResult principalSecrets = results.get(realmId);
108116

109117
String msg =
@@ -114,5 +122,7 @@ private void bootstrapRealmsAndPrintCredentials(List<String> realms) {
114122
principalSecrets.getPrincipalSecrets().getMainSecret());
115123
System.out.println(msg);
116124
}
125+
126+
return results;
117127
}
118128
}

0 commit comments

Comments
 (0)