diff --git a/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkPolarisMetaStoreManagerFactory.java b/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkPolarisMetaStoreManagerFactory.java index 9f7af1a268..492f61668d 100644 --- a/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkPolarisMetaStoreManagerFactory.java +++ b/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkPolarisMetaStoreManagerFactory.java @@ -25,7 +25,6 @@ import jakarta.inject.Inject; import java.nio.file.Path; import org.apache.polaris.core.PolarisDiagnostics; -import org.apache.polaris.core.config.PolarisConfigurationStore; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.LocalPolarisMetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; @@ -47,13 +46,12 @@ public class EclipseLinkPolarisMetaStoreManagerFactory @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; protected EclipseLinkPolarisMetaStoreManagerFactory() { - this(null, null); + this(null); } @Inject - protected EclipseLinkPolarisMetaStoreManagerFactory( - PolarisDiagnostics diagnostics, PolarisConfigurationStore configurationStore) { - super(diagnostics, configurationStore); + protected EclipseLinkPolarisMetaStoreManagerFactory(PolarisDiagnostics diagnostics) { + super(diagnostics); } @Override diff --git a/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java b/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java index 7f4368c364..1a688ca57c 100644 --- a/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java +++ b/persistence/relational-jdbc/src/main/java/org/apache/polaris/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java @@ -31,7 +31,7 @@ import org.apache.polaris.core.PolarisCallContext; 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.RealmConfig; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.PolarisEntity; @@ -78,7 +78,6 @@ public class JdbcMetaStoreManagerFactory implements MetaStoreManagerFactory { @Inject PolarisStorageIntegrationProvider storageIntegrationProvider; @Inject Instance dataSource; @Inject RelationalJdbcConfiguration relationalJdbcConfiguration; - @Inject PolarisConfigurationStore configurationStore; protected JdbcMetaStoreManagerFactory() {} @@ -221,23 +220,23 @@ public synchronized Supplier getOrCreateSessionSupplier( @Override public synchronized StorageCredentialCache getOrCreateStorageCredentialCache( - RealmContext realmContext) { + RealmContext realmContext, RealmConfig realmConfig) { if (!storageCredentialCacheMap.containsKey(realmContext.getRealmIdentifier())) { storageCredentialCacheMap.put( - realmContext.getRealmIdentifier(), - new StorageCredentialCache(realmContext, configurationStore)); + realmContext.getRealmIdentifier(), new StorageCredentialCache(realmConfig)); } return storageCredentialCacheMap.get(realmContext.getRealmIdentifier()); } @Override - public synchronized EntityCache getOrCreateEntityCache(RealmContext realmContext) { + public synchronized EntityCache getOrCreateEntityCache( + RealmContext realmContext, RealmConfig realmConfig) { if (!entityCacheMap.containsKey(realmContext.getRealmIdentifier())) { PolarisMetaStoreManager metaStoreManager = getOrCreateMetaStoreManager(realmContext); entityCacheMap.put( realmContext.getRealmIdentifier(), - new InMemoryEntityCache(realmContext, configurationStore, metaStoreManager)); + new InMemoryEntityCache(realmConfig, metaStoreManager)); } return entityCacheMap.get(realmContext.getRealmIdentifier()); diff --git a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java index 9e5a7a8b42..cf2a0cca4c 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java @@ -22,6 +22,8 @@ import java.time.Clock; import java.time.ZoneId; import org.apache.polaris.core.config.PolarisConfigurationStore; +import org.apache.polaris.core.config.RealmConfig; +import org.apache.polaris.core.config.RealmConfigImpl; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.BasePersistence; @@ -42,8 +44,9 @@ public class PolarisCallContext implements CallContext { private final Clock clock; - // will make it final once we remove deprecated constructor - private RealmContext realmContext = null; + private final RealmContext realmContext; + + private final RealmConfig realmConfig; public PolarisCallContext( @Nonnull RealmContext realmContext, @@ -56,17 +59,19 @@ public PolarisCallContext( this.diagServices = diagServices; this.configurationStore = configurationStore; this.clock = clock; + this.realmConfig = new RealmConfigImpl(this.configurationStore, this.realmContext); } public PolarisCallContext( @Nonnull RealmContext realmContext, @Nonnull BasePersistence metaStore, @Nonnull PolarisDiagnostics diagServices) { - this.realmContext = realmContext; - this.metaStore = metaStore; - this.diagServices = diagServices; - this.configurationStore = new PolarisConfigurationStore() {}; - this.clock = Clock.system(ZoneId.systemDefault()); + this( + realmContext, + metaStore, + diagServices, + new PolarisConfigurationStore() {}, + Clock.system(ZoneId.systemDefault())); } public BasePersistence getMetaStore() { @@ -77,10 +82,6 @@ public PolarisDiagnostics getDiagServices() { return diagServices; } - public PolarisConfigurationStore getConfigurationStore() { - return configurationStore; - } - public Clock getClock() { return clock; } @@ -90,6 +91,11 @@ public RealmContext getRealmContext() { return realmContext; } + @Override + public RealmConfig getRealmConfig() { + return realmConfig; + } + @Override public PolarisCallContext getPolarisCallContext() { return this; diff --git a/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisAuthorizerImpl.java b/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisAuthorizerImpl.java index d480d52076..6b582e7a77 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisAuthorizerImpl.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisAuthorizerImpl.java @@ -114,7 +114,6 @@ import java.util.stream.Collectors; import org.apache.iceberg.exceptions.ForbiddenException; import org.apache.polaris.core.config.FeatureConfiguration; -import org.apache.polaris.core.config.PolarisConfigurationStore; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.entity.PolarisBaseEntity; import org.apache.polaris.core.entity.PolarisEntityConstants; @@ -531,12 +530,8 @@ public class PolarisAuthorizerImpl implements PolarisAuthorizer { List.of(TABLE_DETACH_POLICY, CATALOG_MANAGE_METADATA, CATALOG_MANAGE_CONTENT)); } - private final PolarisConfigurationStore featureConfig; - @Inject - public PolarisAuthorizerImpl(PolarisConfigurationStore featureConfig) { - this.featureConfig = featureConfig; - } + public PolarisAuthorizerImpl() {} /** * Checks whether the {@code grantedPrivilege} is sufficient to confer {@code desiredPrivilege}, @@ -583,9 +578,10 @@ public void authorizeOrThrow( @Nullable List targets, @Nullable List secondaries) { boolean enforceCredentialRotationRequiredState = - featureConfig.getConfiguration( - callContext.getRealmContext(), - FeatureConfiguration.ENFORCE_PRINCIPAL_CREDENTIAL_ROTATION_REQUIRED_CHECKING); + callContext + .getRealmConfig() + .getConfig( + FeatureConfiguration.ENFORCE_PRINCIPAL_CREDENTIAL_ROTATION_REQUIRED_CHECKING); if (enforceCredentialRotationRequiredState && authenticatedPrincipal .getPrincipalEntity() diff --git a/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java b/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java index d8ec613207..2f69e898e2 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/config/FeatureConfiguration.java @@ -49,11 +49,7 @@ protected FeatureConfiguration( */ public static void enforceFeatureEnabledOrThrow( CallContext callContext, FeatureConfiguration featureConfig) { - boolean enabled = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration(callContext.getRealmContext(), featureConfig); + boolean enabled = callContext.getRealmConfig().getConfig(featureConfig); if (!enabled) { throw new UnsupportedOperationException("Feature not enabled: " + featureConfig.key()); } diff --git a/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java new file mode 100644 index 0000000000..7443b1875e --- /dev/null +++ b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfig.java @@ -0,0 +1,66 @@ +/* + * 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.core.config; + +import jakarta.annotation.Nullable; +import org.apache.polaris.core.entity.CatalogEntity; + +/** Realm-specific configuration used to retrieve runtime parameters. */ +public interface RealmConfig { + + /** + * Retrieve the current value for a configuration key. May be null if not set. + * + * @param the type of the configuration value + * @param configName the name of the configuration key to check + * @return the current value set for the configuration key, or null if not set + */ + @Nullable T getConfig(String configName); + + /** + * Retrieve the current value for a configuration key. If not set, return the non-null default + * value. + * + * @param the type of the configuration value + * @param configName the name of the configuration key to check + * @param defaultValue the default value if the configuration key has no value + * @return the current value or the supplied default value + */ + T getConfig(String configName, T defaultValue); + + /** + * Retrieve the current value for a configuration. + * + * @param the type of the configuration value + * @param config the configuration to load + * @return the current value set for the configuration key or null if not set + */ + T getConfig(PolarisConfiguration config); + + /** + * Retrieve the current value for a configuration, overriding with a catalog config if it is + * present. + * + * @param the type of the configuration value + * @param config the configuration to load + * @param catalogEntity the catalog to check for an override + * @return the current value set for the configuration key or null if not set + */ + T getConfig(PolarisConfiguration config, CatalogEntity catalogEntity); +} diff --git a/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.java b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.java new file mode 100644 index 0000000000..5d93c833b8 --- /dev/null +++ b/polaris-core/src/main/java/org/apache/polaris/core/config/RealmConfigImpl.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.core.config; + +import jakarta.annotation.Nullable; +import org.apache.polaris.core.context.RealmContext; +import org.apache.polaris.core.entity.CatalogEntity; + +public class RealmConfigImpl implements RealmConfig { + + private final PolarisConfigurationStore configurationStore; + private final RealmContext realmContext; + + public RealmConfigImpl(PolarisConfigurationStore configurationStore, RealmContext realmContext) { + this.configurationStore = configurationStore; + this.realmContext = realmContext; + } + + @Override + public @Nullable T getConfig(String configName) { + return configurationStore.getConfiguration(realmContext, configName); + } + + @Override + public T getConfig(String configName, T defaultValue) { + return configurationStore.getConfiguration(realmContext, configName, defaultValue); + } + + @Override + public T getConfig(PolarisConfiguration config) { + return configurationStore.getConfiguration(realmContext, config); + } + + @Override + public T getConfig(PolarisConfiguration config, CatalogEntity catalogEntity) { + return configurationStore.getConfiguration(realmContext, catalogEntity, config); + } +} diff --git a/polaris-core/src/main/java/org/apache/polaris/core/context/CallContext.java b/polaris-core/src/main/java/org/apache/polaris/core/context/CallContext.java index 84fec60ae8..7164cfc752 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/context/CallContext.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/context/CallContext.java @@ -19,6 +19,7 @@ package org.apache.polaris.core.context; import org.apache.polaris.core.PolarisCallContext; +import org.apache.polaris.core.config.RealmConfig; /** * Stores elements associated with an individual REST request such as RealmContext, caller @@ -53,4 +54,6 @@ static void unsetCurrentContext() { * @return the inner context used for delegating services */ PolarisCallContext getPolarisCallContext(); + + RealmConfig getRealmConfig(); } diff --git a/polaris-core/src/main/java/org/apache/polaris/core/entity/CatalogEntity.java b/polaris-core/src/main/java/org/apache/polaris/core/entity/CatalogEntity.java index 2061fd86ac..e0d2089a7b 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/entity/CatalogEntity.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/entity/CatalogEntity.java @@ -313,11 +313,8 @@ private void validateMaxAllowedLocations( CallContext callContext, Collection allowedLocations) { int maxAllowedLocations = callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - BehaviorChangeConfiguration.STORAGE_CONFIGURATION_MAX_LOCATIONS); + .getRealmConfig() + .getConfig(BehaviorChangeConfiguration.STORAGE_CONFIGURATION_MAX_LOCATIONS); if (maxAllowedLocations != -1 && allowedLocations.size() > maxAllowedLocations) { throw new IllegalArgumentException( String.format( diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java index dad33646e7..08bda144ce 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java @@ -1508,9 +1508,8 @@ private void revokeGrantRecord( PolarisObjectMapperUtil.parseTaskState(entity); long taskAgeTimeout = callCtx - .getConfigurationStore() - .getConfiguration( - callCtx.getRealmContext(), + .getRealmConfig() + .getConfig( PolarisTaskConstants.TASK_TIMEOUT_MILLIS_CONFIG, PolarisTaskConstants.TASK_TIMEOUT_MILLIS); return taskState == null 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 747991636a..b4dc153f5b 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 @@ -26,7 +26,7 @@ import org.apache.polaris.core.PolarisCallContext; 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.RealmConfig; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.PolarisEntity; @@ -64,14 +64,9 @@ public abstract class LocalPolarisMetaStoreManagerFactory LoggerFactory.getLogger(LocalPolarisMetaStoreManagerFactory.class); private final PolarisDiagnostics diagnostics; - private final PolarisConfigurationStore configurationStore; - private boolean bootstrap; - protected LocalPolarisMetaStoreManagerFactory( - @Nonnull PolarisDiagnostics diagnostics, - @Nonnull PolarisConfigurationStore configurationStore) { + protected LocalPolarisMetaStoreManagerFactory(@Nonnull PolarisDiagnostics diagnostics) { this.diagnostics = diagnostics; - this.configurationStore = configurationStore; } protected abstract StoreType createBackingStore(@Nonnull PolarisDiagnostics diagnostics); @@ -179,23 +174,23 @@ public synchronized Supplier getOrCreateSessionSupplie @Override public synchronized StorageCredentialCache getOrCreateStorageCredentialCache( - RealmContext realmContext) { + RealmContext realmContext, RealmConfig realmConfig) { if (!storageCredentialCacheMap.containsKey(realmContext.getRealmIdentifier())) { storageCredentialCacheMap.put( - realmContext.getRealmIdentifier(), - new StorageCredentialCache(realmContext, configurationStore)); + realmContext.getRealmIdentifier(), new StorageCredentialCache(realmConfig)); } return storageCredentialCacheMap.get(realmContext.getRealmIdentifier()); } @Override - public synchronized EntityCache getOrCreateEntityCache(RealmContext realmContext) { + public synchronized EntityCache getOrCreateEntityCache( + RealmContext realmContext, RealmConfig realmConfig) { if (!entityCacheMap.containsKey(realmContext.getRealmIdentifier())) { PolarisMetaStoreManager metaStoreManager = getOrCreateMetaStoreManager(realmContext); entityCacheMap.put( realmContext.getRealmIdentifier(), - new InMemoryEntityCache(realmContext, configurationStore, metaStoreManager)); + new InMemoryEntityCache(realmConfig, metaStoreManager)); } return entityCacheMap.get(realmContext.getRealmIdentifier()); diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/MetaStoreManagerFactory.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/MetaStoreManagerFactory.java index 5b5dadaa0f..865abc03aa 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/MetaStoreManagerFactory.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/MetaStoreManagerFactory.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.function.Supplier; +import org.apache.polaris.core.config.RealmConfig; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.bootstrap.BootstrapOptions; import org.apache.polaris.core.persistence.bootstrap.RootCredentialsSet; @@ -35,9 +36,10 @@ public interface MetaStoreManagerFactory { Supplier getOrCreateSessionSupplier(RealmContext realmContext); - StorageCredentialCache getOrCreateStorageCredentialCache(RealmContext realmContext); + StorageCredentialCache getOrCreateStorageCredentialCache( + RealmContext realmContext, RealmConfig realmConfig); - EntityCache getOrCreateEntityCache(RealmContext realmContext); + EntityCache getOrCreateEntityCache(RealmContext realmContext, RealmConfig realmConfig); Map bootstrapRealms( Iterable realms, RootCredentialsSet rootCredentialsSet); diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCache.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCache.java index 3e1fc3ec66..36c44ea259 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCache.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCache.java @@ -30,8 +30,7 @@ import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.config.BehaviorChangeConfiguration; import org.apache.polaris.core.config.FeatureConfiguration; -import org.apache.polaris.core.config.PolarisConfigurationStore; -import org.apache.polaris.core.context.RealmContext; +import org.apache.polaris.core.config.RealmConfig; import org.apache.polaris.core.entity.PolarisBaseEntity; import org.apache.polaris.core.entity.PolarisEntityType; import org.apache.polaris.core.entity.PolarisGrantRecord; @@ -60,9 +59,7 @@ public class InMemoryEntityCache implements EntityCache { * @param polarisMetaStoreManager the meta store manager implementation */ public InMemoryEntityCache( - @Nonnull RealmContext realmContext, - @Nonnull PolarisConfigurationStore configurationStore, - @Nonnull PolarisMetaStoreManager polarisMetaStoreManager) { + @Nonnull RealmConfig realmConfig, @Nonnull PolarisMetaStoreManager polarisMetaStoreManager) { // by name cache this.byName = new ConcurrentHashMap<>(); @@ -79,9 +76,7 @@ public InMemoryEntityCache( } }; - long weigherTarget = - configurationStore.getConfiguration( - realmContext, FeatureConfiguration.ENTITY_CACHE_WEIGHER_TARGET); + long weigherTarget = realmConfig.getConfig(FeatureConfiguration.ENTITY_CACHE_WEIGHER_TARGET); Caffeine byIdBuilder = Caffeine.newBuilder() .maximumWeight(weigherTarget) @@ -90,8 +85,7 @@ public InMemoryEntityCache( .removalListener(removalListener); // Set the removal listener boolean useSoftValues = - configurationStore.getConfiguration( - realmContext, BehaviorChangeConfiguration.ENTITY_CACHE_SOFT_VALUES); + realmConfig.getConfig(BehaviorChangeConfiguration.ENTITY_CACHE_SOFT_VALUES); if (useSoftValues) { byIdBuilder.softValues(); } diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java index 1286b67e76..e79dafcf54 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java @@ -1960,9 +1960,8 @@ private PolarisEntityResolver resolveSecurableToRoleGrant( PolarisObjectMapperUtil.parseTaskState(entity); long taskAgeTimeout = callCtx - .getConfigurationStore() - .getConfiguration( - callCtx.getRealmContext(), + .getRealmConfig() + .getConfig( PolarisTaskConstants.TASK_TIMEOUT_MILLIS_CONFIG, PolarisTaskConstants.TASK_TIMEOUT_MILLIS); return taskState == null diff --git a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java index d5e1e7167c..b389fd92f9 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java @@ -80,11 +80,7 @@ public class PolarisEndpoints { public static Set getSupportedGenericTableEndpoints(CallContext callContext) { // add the generic table endpoints as supported endpoints if generic table feature is enabled. boolean genericTableEnabled = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.ENABLE_GENERIC_TABLES); + callContext.getRealmConfig().getConfig(FeatureConfiguration.ENABLE_GENERIC_TABLES); return genericTableEnabled ? GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); } @@ -95,11 +91,7 @@ public static Set getSupportedGenericTableEndpoints(CallContext callCo */ public static Set getSupportedPolicyEndpoints(CallContext callContext) { boolean policyStoreEnabled = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.ENABLE_POLICY_STORE); + callContext.getRealmConfig().getConfig(FeatureConfiguration.ENABLE_POLICY_STORE); return policyStoreEnabled ? POLICY_STORE_ENDPOINTS : ImmutableSet.of(); } } diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/InMemoryStorageIntegration.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/InMemoryStorageIntegration.java index 4ec58ff713..e108025295 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/storage/InMemoryStorageIntegration.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/InMemoryStorageIntegration.java @@ -78,11 +78,7 @@ public InMemoryStorageIntegration(String identifierOrId) { boolean allowWildcardLocation = Optional.ofNullable(CallContext.getCurrentContext()) - .map( - ctx -> - ctx.getPolarisCallContext() - .getConfigurationStore() - .getConfiguration(ctx.getRealmContext(), "ALLOW_WILDCARD_LOCATION", false)) + .map(ctx -> ctx.getRealmConfig().getConfig("ALLOW_WILDCARD_LOCATION", false)) .orElse(false); if (allowWildcardLocation && allowedLocationStrings.contains("*")) { diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java index 1d391015fe..26ccb062a2 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageConfigurationInfo.java @@ -163,11 +163,8 @@ public static Optional forEntityPath( CatalogEntity catalog = CatalogEntity.of(entityPath.get(0)); boolean allowEscape = callContext - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - catalog, - FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION); + .getRealmConfig() + .getConfig(FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION, catalog); if (!allowEscape && catalog.getCatalogType() != Catalog.TypeEnum.EXTERNAL && baseLocation != null) { diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/aws/AwsCredentialsStorageIntegration.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/aws/AwsCredentialsStorageIntegration.java index 189c574dd8..b473c077ad 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/storage/aws/AwsCredentialsStorageIntegration.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/aws/AwsCredentialsStorageIntegration.java @@ -73,10 +73,7 @@ public EnumMap getSubscopedCreds( @Nonnull Set allowedReadLocations, @Nonnull Set allowedWriteLocations) { int storageCredentialDurationSeconds = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration(callContext.getRealmContext(), STORAGE_CREDENTIAL_DURATION_SECONDS); + callContext.getRealmConfig().getConfig(STORAGE_CREDENTIAL_DURATION_SECONDS); AssumeRoleRequest.Builder request = AssumeRoleRequest.builder() .externalId(storageConfig.getExternalId()) diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/azure/AzureCredentialsStorageIntegration.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/azure/AzureCredentialsStorageIntegration.java index 39bd363d49..232994a374 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/storage/azure/AzureCredentialsStorageIntegration.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/azure/AzureCredentialsStorageIntegration.java @@ -127,10 +127,7 @@ public EnumMap getSubscopedCreds( // clock skew between the client and server, OffsetDateTime startTime = start.truncatedTo(ChronoUnit.SECONDS).atOffset(ZoneOffset.UTC); int intendedDurationSeconds = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration(callContext.getRealmContext(), STORAGE_CREDENTIAL_DURATION_SECONDS); + callContext.getRealmConfig().getConfig(STORAGE_CREDENTIAL_DURATION_SECONDS); OffsetDateTime intendedEndTime = start.plusSeconds(intendedDurationSeconds).atOffset(ZoneOffset.UTC); OffsetDateTime maxAllowedEndTime = diff --git a/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCache.java b/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCache.java index e3a7a4f13f..99a16d87ec 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCache.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/storage/cache/StorageCredentialCache.java @@ -32,8 +32,7 @@ import org.apache.iceberg.exceptions.UnprocessableEntityException; import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.config.FeatureConfiguration; -import org.apache.polaris.core.config.PolarisConfigurationStore; -import org.apache.polaris.core.context.RealmContext; +import org.apache.polaris.core.config.RealmConfig; import org.apache.polaris.core.entity.PolarisEntity; import org.apache.polaris.core.entity.PolarisEntityType; import org.apache.polaris.core.persistence.dao.entity.ScopedCredentialsResult; @@ -50,14 +49,11 @@ public class StorageCredentialCache { private static final long CACHE_MAX_NUMBER_OF_ENTRIES = 10_000L; private final LoadingCache cache; - private final RealmContext realmContext; - private final PolarisConfigurationStore configurationStore; + private final RealmConfig realmConfig; /** Initialize the creds cache */ - public StorageCredentialCache( - RealmContext realmContext, PolarisConfigurationStore configurationStore) { - this.realmContext = realmContext; - this.configurationStore = configurationStore; + public StorageCredentialCache(RealmConfig realmConfig) { + this.realmConfig = realmConfig; cache = Caffeine.newBuilder() .maximumSize(CACHE_MAX_NUMBER_OF_ENTRIES) @@ -82,11 +78,9 @@ public StorageCredentialCache( /** How long credentials should remain in the cache. */ private long maxCacheDurationMs() { var cacheDurationSeconds = - configurationStore.getConfiguration( - realmContext, FeatureConfiguration.STORAGE_CREDENTIAL_CACHE_DURATION_SECONDS); + realmConfig.getConfig(FeatureConfiguration.STORAGE_CREDENTIAL_CACHE_DURATION_SECONDS); var credentialDurationSeconds = - configurationStore.getConfiguration( - realmContext, FeatureConfiguration.STORAGE_CREDENTIAL_DURATION_SECONDS); + realmConfig.getConfig(FeatureConfiguration.STORAGE_CREDENTIAL_DURATION_SECONDS); if (cacheDurationSeconds >= credentialDurationSeconds) { throw new IllegalArgumentException( String.format( diff --git a/polaris-core/src/test/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCacheTest.java b/polaris-core/src/test/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCacheTest.java index 945f1ccb6b..78e9a50689 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCacheTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/persistence/cache/InMemoryEntityCacheTest.java @@ -103,8 +103,7 @@ public InMemoryEntityCacheTest() { * @return new cache for the entity store */ InMemoryEntityCache allocateNewCache() { - return new InMemoryEntityCache( - callCtx.getRealmContext(), callCtx.getConfigurationStore(), this.metaStoreManager); + return new InMemoryEntityCache(callCtx.getRealmConfig(), this.metaStoreManager); } @Test diff --git a/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java b/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java index 85776bd23e..d7dcf71f85 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/storage/cache/StorageCredentialCacheTest.java @@ -76,7 +76,7 @@ public StorageCredentialCacheTest() { } private StorageCredentialCache newStorageCredentialCache() { - return new StorageCredentialCache(callCtx.getRealmContext(), callCtx.getConfigurationStore()); + return new StorageCredentialCache(callCtx.getRealmConfig()); } @Test diff --git a/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/BaseResolverTest.java b/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/BaseResolverTest.java index 1a7a827315..30fab4fb00 100644 --- a/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/BaseResolverTest.java +++ b/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/BaseResolverTest.java @@ -468,9 +468,7 @@ private Resolver allocateResolver( // create a new cache if needs be if (cache == null) { - this.cache = - new InMemoryEntityCache( - callCtx().getRealmContext(), callCtx().getConfigurationStore(), metaStoreManager()); + this.cache = new InMemoryEntityCache(callCtx().getRealmConfig(), metaStoreManager()); } boolean allRoles = principalRolesScope == null; Optional> roleEntities = diff --git a/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java b/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java index 8b8588514b..0cd0533eba 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/quarkus/config/QuarkusProducers.java @@ -41,6 +41,7 @@ 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.RealmConfig; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.BasePersistence; @@ -99,15 +100,14 @@ public Clock clock() { @Produces @ApplicationScoped - public StorageCredentialCache storageCredentialCache( - RealmContext realmContext, PolarisConfigurationStore configurationStore) { - return new StorageCredentialCache(realmContext, configurationStore); + public StorageCredentialCache storageCredentialCache(RealmConfig realmConfig) { + return new StorageCredentialCache(realmConfig); } @Produces @ApplicationScoped - public PolarisAuthorizer polarisAuthorizer(PolarisConfigurationStore configurationStore) { - return new PolarisAuthorizerImpl(configurationStore); + public PolarisAuthorizer polarisAuthorizer() { + return new PolarisAuthorizerImpl(); } @Produces @@ -138,6 +138,12 @@ public CallContext polarisCallContext( realmContext, metaStoreSession, diagServices, configurationStore, clock); } + @Produces + @RequestScoped + public RealmConfig realmContext(CallContext callContext) { + return callContext.getRealmConfig(); + } + // Polaris service beans - selected from @Identifier-annotated beans @Produces diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java index 3cb8216d87..319a0e354c 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java @@ -230,7 +230,7 @@ public String getAuthenticationScheme() { return ""; } }, - new PolarisAuthorizerImpl(services.configurationStore()), + new PolarisAuthorizerImpl(), new ReservedProperties() { @Override public List prefixes() { diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java index f568e54b71..536e994b9d 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java @@ -235,7 +235,7 @@ public void before(TestInfo testInfo) { metaStoreManager = managerFactory.getOrCreateMetaStoreManager(realmContext); userSecretsManager = userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext); - polarisAuthorizer = new PolarisAuthorizerImpl(configurationStore); + polarisAuthorizer = new PolarisAuthorizerImpl(); polarisContext = new PolarisCallContext( diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisS3InteroperabilityTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisS3InteroperabilityTest.java index 4a3312292e..2e8d7ccd1b 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisS3InteroperabilityTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisS3InteroperabilityTest.java @@ -76,7 +76,7 @@ private static String makeTableLocation( public PolarisS3InteroperabilityTest() { TestServices.FileIOFactorySupplier fileIOFactorySupplier = - (entityManagerFactory, metaStoreManagerFactory, configurationStore) -> + (entityManagerFactory, metaStoreManagerFactory) -> (FileIOFactory) (callContext, ioImplClassName, diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/CatalogNoEntityCacheTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/CatalogNoEntityCacheTest.java index 895b6ab81e..f2e0bb662f 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/CatalogNoEntityCacheTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/CatalogNoEntityCacheTest.java @@ -21,6 +21,7 @@ import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; import jakarta.annotation.Nullable; +import org.apache.polaris.core.config.RealmConfig; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; import org.apache.polaris.core.persistence.cache.InMemoryEntityCache; @@ -30,7 +31,8 @@ public class CatalogNoEntityCacheTest extends IcebergCatalogTest { @Nullable @Override - protected InMemoryEntityCache createEntityCache(PolarisMetaStoreManager metaStoreManager) { + protected InMemoryEntityCache createEntityCache( + RealmConfig realmConfig, PolarisMetaStoreManager metaStoreManager) { return null; } } diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogHandlerAuthzTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogHandlerAuthzTest.java index 4d89d55234..c6d848636d 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogHandlerAuthzTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogHandlerAuthzTest.java @@ -55,7 +55,6 @@ import org.apache.polaris.core.admin.model.PrincipalWithCredentialsCredentials; import org.apache.polaris.core.admin.model.StorageConfigInfo; import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal; -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.entity.CatalogEntity; @@ -1792,7 +1791,7 @@ public void testSendNotificationSufficientPrivileges() { PolarisCallContextCatalogFactory factory = new PolarisCallContextCatalogFactory( - new RealmEntityManagerFactory(null) { + new RealmEntityManagerFactory(null, null) { @Override public PolarisEntityManager getOrCreateEntityManager(RealmContext realmContext) { return entityManager; @@ -1801,8 +1800,7 @@ public PolarisEntityManager getOrCreateEntityManager(RealmContext realmContext) managerFactory, userSecretsManagerFactory, Mockito.mock(), - new DefaultFileIOFactory( - realmEntityManagerFactory, managerFactory, new PolarisConfigurationStore() {}), + new DefaultFileIOFactory(realmEntityManagerFactory, managerFactory), polarisEventListener) { @Override public Catalog createCallContextCatalog( diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java index 8534e18eaf..4742575cb2 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java @@ -99,6 +99,7 @@ import org.apache.polaris.core.auth.PolarisAuthorizerImpl; import org.apache.polaris.core.config.FeatureConfiguration; import org.apache.polaris.core.config.PolarisConfigurationStore; +import org.apache.polaris.core.config.RealmConfig; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.CatalogEntity; @@ -255,10 +256,6 @@ public Map getConfigOverrides() { private TestPolarisEventListener testPolarisEventListener; private ReservedProperties reservedProperties; - protected String getRealmName() { - return realmName; - } - @BeforeAll public static void setUpMocks() { PolarisStorageIntegrationProviderImpl mock = @@ -268,7 +265,7 @@ public static void setUpMocks() { @Nullable protected abstract InMemoryEntityCache createEntityCache( - PolarisMetaStoreManager metaStoreManager); + RealmConfig realmConfig, PolarisMetaStoreManager metaStoreManager); @BeforeEach @SuppressWarnings("unchecked") @@ -292,8 +289,8 @@ public void before(TestInfo testInfo) { entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(realmContext, configurationStore), - createEntityCache(metaStoreManager)); + new StorageCredentialCache(polarisContext.getRealmConfig()), + createEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); PrincipalEntity rootEntity = new PrincipalEntity( @@ -323,7 +320,7 @@ public void before(TestInfo testInfo) { metaStoreManager, userSecretsManager, securityContext, - new PolarisAuthorizerImpl(new PolarisConfigurationStore() {}), + new PolarisAuthorizerImpl(), reservedProperties); String storageLocation = "s3://my-bucket/path/to/data"; @@ -355,10 +352,9 @@ public void before(TestInfo testInfo) { .asCatalog())); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory); + new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); this.fileIOFactory = - new DefaultFileIOFactory( - realmEntityManagerFactory, metaStoreManagerFactory, configurationStore); + new DefaultFileIOFactory(realmEntityManagerFactory, metaStoreManagerFactory); StsClient stsClient = Mockito.mock(StsClient.class); when(stsClient.assumeRole(isA(AssumeRoleRequest.class))) @@ -990,9 +986,8 @@ public void testValidateNotificationFailToCreateFileIO() { FileIOFactory fileIOFactory = spy( new DefaultFileIOFactory( - new RealmEntityManagerFactory(metaStoreManagerFactory), - metaStoreManagerFactory, - configurationStore)); + new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore), + metaStoreManagerFactory)); IcebergCatalog catalog = new IcebergCatalog( entityManager, @@ -1356,9 +1351,8 @@ public void testUpdateNotificationCreateTableWithLocalFilePrefix() { TableMetadataParser.toJson(createSampleTableMetadata(metadataLocation)).getBytes(UTF_8)); if (!polarisContext - .getConfigurationStore() - .getConfiguration( - polarisContext.getRealmContext(), FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES) + .getRealmConfig() + .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES) .contains("FILE")) { Assertions.assertThatThrownBy(() -> catalog.sendNotification(table, request)) .isInstanceOf(ForbiddenException.class) @@ -1424,9 +1418,8 @@ public void testUpdateNotificationCreateTableWithHttpPrefix() { TableMetadataParser.toJson(createSampleTableMetadata(metadataLocation)).getBytes(UTF_8)); if (!polarisContext - .getConfigurationStore() - .getConfiguration( - polarisContext.getRealmContext(), FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES) + .getRealmConfig() + .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES) .contains("FILE")) { Assertions.assertThatThrownBy(() -> catalog.sendNotification(table, request)) .isInstanceOf(ForbiddenException.class) @@ -1446,9 +1439,8 @@ public void testUpdateNotificationCreateTableWithHttpPrefix() { TableMetadataParser.toJson(createSampleTableMetadata(metadataLocation)).getBytes(UTF_8)); if (!polarisContext - .getConfigurationStore() - .getConfiguration( - polarisContext.getRealmContext(), FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES) + .getRealmConfig() + .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES) .contains("FILE")) { Assertions.assertThatThrownBy(() -> catalog.sendNotification(table, newRequest)) .isInstanceOf(ForbiddenException.class) @@ -1885,9 +1877,8 @@ public void testDropTableWithPurge() { FileIO fileIO = new TaskFileIOSupplier( new DefaultFileIOFactory( - new RealmEntityManagerFactory(metaStoreManagerFactory), - metaStoreManagerFactory, - configurationStore)) + new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore), + metaStoreManagerFactory)) .apply(taskEntity, polarisContext); Assertions.assertThat(fileIO).isNotNull().isInstanceOf(ExceptionMappingFileIO.class); Assertions.assertThat(((ExceptionMappingFileIO) fileIO).getInnerIo()) @@ -2030,9 +2021,8 @@ public void testFileIOWrapper() { MeasuredFileIOFactory measured = new MeasuredFileIOFactory( - new RealmEntityManagerFactory(metaStoreManagerFactory), - metaStoreManagerFactory, - configurationStore); + new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore), + metaStoreManagerFactory); IcebergCatalog catalog = new IcebergCatalog( entityManager, diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java index b1c2d5aef5..e7727cba14 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java @@ -179,8 +179,8 @@ public void before(TestInfo testInfo) { PolarisEntityManager entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(realmContext, configurationStore), - new InMemoryEntityCache(realmContext, configurationStore, metaStoreManager)); + new StorageCredentialCache(polarisContext.getRealmConfig()), + new InMemoryEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); CallContext.setCurrentContext(polarisContext); @@ -211,7 +211,7 @@ public void before(TestInfo testInfo) { metaStoreManager, userSecretsManager, securityContext, - new PolarisAuthorizerImpl(new PolarisConfigurationStore() {}), + new PolarisAuthorizerImpl(), reservedProperties); adminService.createCatalog( new CreateCatalogRequest( @@ -236,9 +236,8 @@ public void before(TestInfo testInfo) { polarisContext, entityManager, securityContext, CATALOG_NAME); FileIOFactory fileIOFactory = new DefaultFileIOFactory( - new RealmEntityManagerFactory(metaStoreManagerFactory), - metaStoreManagerFactory, - configurationStore); + new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore), + metaStoreManagerFactory); testPolarisEventListener = (TestPolarisEventListener) polarisEventListener; this.catalog = diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogWithEntityCacheTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogWithEntityCacheTest.java index 3c59dff186..40fddc1970 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogWithEntityCacheTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogWithEntityCacheTest.java @@ -21,6 +21,7 @@ import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; import jakarta.annotation.Nullable; +import org.apache.polaris.core.config.RealmConfig; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; import org.apache.polaris.core.persistence.cache.InMemoryEntityCache; @@ -30,7 +31,8 @@ public class PolarisCatalogWithEntityCacheTest extends IcebergCatalogTest { @Nullable @Override - protected InMemoryEntityCache createEntityCache(PolarisMetaStoreManager metaStoreManager) { - return new InMemoryEntityCache(() -> getRealmName(), configurationStore, metaStoreManager); + protected InMemoryEntityCache createEntityCache( + RealmConfig realmConfig, PolarisMetaStoreManager metaStoreManager) { + return new InMemoryEntityCache(realmConfig, metaStoreManager); } } diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java index 6fcd4f4782..80adcb7422 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java @@ -171,8 +171,8 @@ public void before(TestInfo testInfo) { entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(realmContext, configurationStore), - new InMemoryEntityCache(realmContext, configurationStore, metaStoreManager)); + new StorageCredentialCache(polarisContext.getRealmConfig()), + new InMemoryEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); PrincipalEntity rootEntity = new PrincipalEntity( @@ -201,7 +201,7 @@ public void before(TestInfo testInfo) { metaStoreManager, userSecretsManager, securityContext, - new PolarisAuthorizerImpl(new PolarisConfigurationStore() {}), + new PolarisAuthorizerImpl(), reservedProperties); String storageLocation = "s3://my-bucket/path/to/data"; @@ -237,10 +237,9 @@ public void before(TestInfo testInfo) { polarisContext, entityManager, securityContext, CATALOG_NAME); TaskExecutor taskExecutor = Mockito.mock(); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory); + new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); this.fileIOFactory = - new DefaultFileIOFactory( - realmEntityManagerFactory, metaStoreManagerFactory, configurationStore); + new DefaultFileIOFactory(realmEntityManagerFactory, metaStoreManagerFactory); StsClient stsClient = Mockito.mock(StsClient.class); when(stsClient.assumeRole(isA(AssumeRoleRequest.class))) diff --git a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java index 5b75dff833..f03356d55b 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java @@ -197,8 +197,8 @@ public void before(TestInfo testInfo) { entityManager = new PolarisEntityManager( metaStoreManager, - new StorageCredentialCache(realmContext, configurationStore), - new InMemoryEntityCache(realmContext, configurationStore, metaStoreManager)); + new StorageCredentialCache(polarisContext.getRealmConfig()), + new InMemoryEntityCache(polarisContext.getRealmConfig(), metaStoreManager)); callContext = polarisContext; @@ -229,7 +229,7 @@ public void before(TestInfo testInfo) { metaStoreManager, userSecretsManager, securityContext, - new PolarisAuthorizerImpl(new PolarisConfigurationStore() {}), + new PolarisAuthorizerImpl(), reservedProperties); String storageLocation = "s3://my-bucket/path/to/data"; @@ -263,10 +263,9 @@ public void before(TestInfo testInfo) { callContext, entityManager, securityContext, CATALOG_NAME); TaskExecutor taskExecutor = Mockito.mock(); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory); + new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); this.fileIOFactory = - new DefaultFileIOFactory( - realmEntityManagerFactory, metaStoreManagerFactory, configurationStore); + new DefaultFileIOFactory(realmEntityManagerFactory, metaStoreManagerFactory); StsClient stsClient = Mockito.mock(StsClient.class); when(stsClient.assumeRole(isA(AssumeRoleRequest.class))) diff --git a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java index df046f6c41..9ef57701d4 100644 --- a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java +++ b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java @@ -605,11 +605,7 @@ private String terminateWithSlash(String path) { */ private boolean catalogOverlapsWithExistingCatalog(CatalogEntity catalogEntity) { boolean allowOverlappingCatalogUrls = - getCurrentPolarisContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.ALLOW_OVERLAPPING_CATALOG_URLS); - + callContext.getRealmConfig().getConfig(FeatureConfiguration.ALLOW_OVERLAPPING_CATALOG_URLS); if (allowOverlappingCatalogUrls) { return false; } @@ -743,11 +739,8 @@ public PolarisEntity createCatalog(CreateCatalogRequest catalogRequest) { Map processedSecretReferences = Map.of(); List supportedAuthenticationTypes = callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES) + .getRealmConfig() + .getConfig(FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES) .stream() .map(s -> s.toUpperCase(Locale.ROOT)) .toList(); @@ -799,12 +792,8 @@ public void deleteCatalog(String name) { findCatalogByName(name) .orElseThrow(() -> new NotFoundException("Catalog %s not found", name)); // TODO: Handle return value in case of concurrent modification - PolarisCallContext polarisCallContext = callContext.getPolarisCallContext(); boolean cleanup = - polarisCallContext - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.CLEANUP_ON_CATALOG_DROP); + callContext.getRealmConfig().getConfig(FeatureConfiguration.CLEANUP_ON_CATALOG_DROP); DropEntityResult dropEntityResult = metaStoreManager.dropEntityIfExists( getCurrentPolarisContext(), null, entity, Map.of(), cleanup); diff --git a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java index 071e6b61aa..c9d36eb6b5 100644 --- a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java +++ b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java @@ -27,7 +27,6 @@ import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.exceptions.NotAuthorizedException; -import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.admin.model.AddGrantRequest; import org.apache.polaris.core.admin.model.AuthenticationParameters; import org.apache.polaris.core.admin.model.Catalog; @@ -154,13 +153,10 @@ public Response createCatalog( } private void validateStorageConfig(StorageConfigInfo storageConfigInfo) { - PolarisCallContext polarisCallContext = callContext.getPolarisCallContext(); List allowedStorageTypes = - polarisCallContext - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES); + callContext + .getRealmConfig() + .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES); if (!allowedStorageTypes.contains(storageConfigInfo.getStorageType().name())) { LOGGER .atWarn() @@ -188,11 +184,8 @@ private void validateConnectionConfigInfo(ConnectionConfigInfo connectionConfigI String connectionType = connectionConfigInfo.getConnectionType().name(); List supportedConnectionTypes = callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES) + .getRealmConfig() + .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES) .stream() .map(s -> s.toUpperCase(Locale.ROOT)) .toList(); @@ -206,11 +199,8 @@ private void validateAuthenticationParameters(AuthenticationParameters authentic String authenticationType = authenticationParameters.getAuthenticationType().name(); List supportedAuthenticationTypes = callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES) + .getRealmConfig() + .getConfig(FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES) .stream() .map(s -> s.toUpperCase(Locale.ROOT)) .toList(); diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/CatalogHandlerUtils.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/CatalogHandlerUtils.java index 480aafe7aa..294daaf52d 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/CatalogHandlerUtils.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/CatalogHandlerUtils.java @@ -95,8 +95,7 @@ import org.apache.iceberg.view.ViewOperations; import org.apache.iceberg.view.ViewRepresentation; import org.apache.polaris.core.config.FeatureConfiguration; -import org.apache.polaris.core.config.PolarisConfigurationStore; -import org.apache.polaris.core.context.RealmContext; +import org.apache.polaris.core.config.RealmConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -128,13 +127,10 @@ public class CatalogHandlerUtils { private final boolean rollbackCompactionEnabled; @Inject - public CatalogHandlerUtils( - RealmContext realmContext, PolarisConfigurationStore configurationStore) { + public CatalogHandlerUtils(RealmConfig realmConfig) { this( - configurationStore.getConfiguration( - realmContext, FeatureConfiguration.ICEBERG_COMMIT_MAX_RETRIES), - configurationStore.getConfiguration( - realmContext, FeatureConfiguration.ICEBERG_ROLLBACK_COMPACTION_ON_CONFLICTS)); + realmConfig.getConfig(FeatureConfiguration.ICEBERG_COMMIT_MAX_RETRIES), + realmConfig.getConfig(FeatureConfiguration.ICEBERG_ROLLBACK_COMPACTION_ON_CONFLICTS)); } @VisibleForTesting diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java index 5c0e6b18d3..1a8e769008 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java @@ -93,9 +93,8 @@ import org.apache.polaris.core.catalog.PolarisCatalogHelpers; import org.apache.polaris.core.config.BehaviorChangeConfiguration; import org.apache.polaris.core.config.FeatureConfiguration; -import org.apache.polaris.core.config.PolarisConfigurationStore; +import org.apache.polaris.core.config.RealmConfig; import org.apache.polaris.core.context.CallContext; -import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.CatalogEntity; import org.apache.polaris.core.entity.LocationBasedEntity; import org.apache.polaris.core.entity.NamespaceEntity; @@ -344,10 +343,9 @@ public TableOperations newTableOps( @Override protected TableOperations newTableOps(TableIdentifier tableIdentifier) { boolean makeMetadataCurrentOnCommit = - getCurrentPolarisContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), + callContext + .getRealmConfig() + .getConfig( BehaviorChangeConfiguration.TABLE_OPERATIONS_MAKE_METADATA_CURRENT_ON_COMMIT); return newTableOps(tableIdentifier, makeMetadataCurrentOnCommit); } @@ -517,11 +515,7 @@ private void createNamespaceInternal( // Set / suffix boolean requireTrailingSlash = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION); + callContext.getRealmConfig().getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION); if (requireTrailingSlash && !baseLocation.endsWith("/")) { baseLocation += "/"; } @@ -536,10 +530,8 @@ private void createNamespaceInternal( .setBaseLocation(baseLocation) .build(); if (!callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) { + .getRealmConfig() + .getConfig(FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) { LOGGER.debug("Validating no overlap for {} with sibling tables or namespaces", namespace); validateNoLocationOverlap(entity, resolvedParent.getRawFullPath()); } else { @@ -669,7 +661,6 @@ public boolean dropNamespace(Namespace namespace) throws NamespaceNotEmptyExcept PolarisEntity leafEntity = resolvedEntities.getRawLeafEntity(); // drop if exists and is empty - PolarisCallContext polarisCallContext = callContext.getPolarisCallContext(); DropEntityResult dropEntityResult = getMetaStoreManager() .dropEntityIfExists( @@ -677,11 +668,9 @@ public boolean dropNamespace(Namespace namespace) throws NamespaceNotEmptyExcept PolarisEntity.toCoreList(catalogPath), leafEntity, Map.of(), - polarisCallContext - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - FeatureConfiguration.CLEANUP_ON_NAMESPACE_DROP)); + callContext + .getRealmConfig() + .getConfig(FeatureConfiguration.CLEANUP_ON_NAMESPACE_DROP)); if (!dropEntityResult.isSuccess() && dropEntityResult.failedBecauseNotEmpty()) { throw new NamespaceNotEmptyException("Namespace %s is not empty", namespace); @@ -707,10 +696,8 @@ public boolean setProperties(Namespace namespace, Map properties new PolarisEntity.Builder(entity).setProperties(newProperties).build(); if (!callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) { + .getRealmConfig() + .getConfig(FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) { LOGGER.debug("Validating no overlap with sibling tables or namespaces"); validateNoLocationOverlap( NamespaceEntity.of(updatedEntity), resolvedEntities.getRawParentPath()); @@ -892,7 +879,6 @@ public AccessConfig getAccessConfig( callContext, entityManager, getCredentialVendor(), - callContext.getPolarisCallContext().getConfigurationStore(), tableIdentifier, getLocationsAllowedToBeAccessed(tableMetadata), storageActions, @@ -924,23 +910,17 @@ private String buildPrefixedLocation(TableIdentifier tableIdentifier) { */ private String applyDefaultLocationObjectStoragePrefix( TableIdentifier tableIdentifier, String location) { - RealmContext realmContext = callContext.getRealmContext(); - PolarisConfigurationStore configurationStore = - callContext.getPolarisCallContext().getConfigurationStore(); + RealmConfig realmConfig = callContext.getRealmConfig(); boolean prefixEnabled = - configurationStore.getConfiguration( - realmContext, - catalogEntity, - FeatureConfiguration.DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED); + realmConfig.getConfig( + FeatureConfiguration.DEFAULT_LOCATION_OBJECT_STORAGE_PREFIX_ENABLED, catalogEntity); boolean allowUnstructuredTableLocation = - configurationStore.getConfiguration( - realmContext, catalogEntity, FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION); + realmConfig.getConfig( + FeatureConfiguration.ALLOW_UNSTRUCTURED_TABLE_LOCATION, catalogEntity); boolean allowTableLocationOverlap = - configurationStore.getConfiguration( - realmContext, catalogEntity, FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP); + realmConfig.getConfig(FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP, catalogEntity); boolean optimizedSiblingCheck = - configurationStore.getConfiguration( - realmContext, catalogEntity, FeatureConfiguration.OPTIMIZED_SIBLING_CHECK); + realmConfig.getConfig(FeatureConfiguration.OPTIMIZED_SIBLING_CHECK, catalogEntity); if (location != null) { return location; } else if (!prefixEnabled) { @@ -1094,11 +1074,8 @@ private void validateLocationsForTableLike( () -> { List allowedStorageTypes = callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES); + .getRealmConfig() + .getConfig(FeatureConfiguration.SUPPORTED_CATALOG_STORAGE_TYPES); if (!allowedStorageTypes.contains(StorageConfigInfo.StorageTypeEnum.FILE.name())) { List invalidLocations = locations.stream() @@ -1125,19 +1102,12 @@ private void validateNoLocationOverlap( PolarisEntity entity) { boolean validateViewOverlap = callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - BehaviorChangeConfiguration.VALIDATE_VIEW_LOCATION_OVERLAP); + .getRealmConfig() + .getConfig(BehaviorChangeConfiguration.VALIDATE_VIEW_LOCATION_OVERLAP); if (callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - catalog, - FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP)) { + .getRealmConfig() + .getConfig(FeatureConfiguration.ALLOW_TABLE_LOCATION_OVERLAP, catalog)) { LOGGER.debug("Skipping location overlap validation for identifier '{}'", identifier); } else if (validateViewOverlap || entity.getSubType().equals(PolarisEntitySubType.ICEBERG_TABLE)) { @@ -1171,11 +1141,7 @@ private void validateNoLocationO // Attempt to directly query for siblings boolean useOptimizedSiblingCheck = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.OPTIMIZED_SIBLING_CHECK); + callContext.getRealmConfig().getConfig(FeatureConfiguration.OPTIMIZED_SIBLING_CHECK); if (useOptimizedSiblingCheck) { Optional> directSiblingCheckResult = getMetaStoreManager().hasOverlappingSiblings(callContext.getPolarisCallContext(), entity); @@ -1526,7 +1492,6 @@ public void doCommit(TableMetadata base, TableMetadata metadata) { resolvedTableEntities == null ? resolvedEntityView.getResolvedPath(tableIdentifier.namespace()).getRawFullPath() : resolvedTableEntities.getRawParentPath(); - CatalogEntity catalog = CatalogEntity.of(resolvedNamespace.getFirst()); if (base == null || !metadata.location().equals(base.location()) @@ -1567,7 +1532,7 @@ public void doCommit(TableMetadata base, TableMetadata metadata) { resolvedStorageEntity.getRawLeafEntity())); // and that the metadata file points to a location within the table's directory structure if (metadata.metadataFileLocation() != null) { - validateMetadataFileInTableDir(tableIdentifier, metadata, catalog); + validateMetadataFileInTableDir(tableIdentifier, metadata); } } @@ -2101,20 +2066,13 @@ protected void refreshFromMetadataLocation( } } - private void validateMetadataFileInTableDir( - TableIdentifier identifier, TableMetadata metadata, CatalogEntity catalog) { - PolarisCallContext polarisCallContext = callContext.getPolarisCallContext(); + private void validateMetadataFileInTableDir(TableIdentifier identifier, TableMetadata metadata) { boolean allowEscape = - polarisCallContext - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.ALLOW_EXTERNAL_TABLE_LOCATION); + callContext.getRealmConfig().getConfig(FeatureConfiguration.ALLOW_EXTERNAL_TABLE_LOCATION); if (!allowEscape - && !polarisCallContext - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - FeatureConfiguration.ALLOW_EXTERNAL_METADATA_FILE_LOCATION)) { + && !callContext + .getRealmConfig() + .getConfig(FeatureConfiguration.ALLOW_EXTERNAL_METADATA_FILE_LOCATION)) { LOGGER.debug( "Validating base location {} for table {} in metadata file {}", metadata.location(), @@ -2314,11 +2272,7 @@ private void createTableLike( IcebergTableLikeEntity icebergTableLikeEntity = IcebergTableLikeEntity.of(entity); // Set / suffix boolean requireTrailingSlash = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION); + callContext.getRealmConfig().getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION); if (requireTrailingSlash && icebergTableLikeEntity.getBaseLocation() != null && !icebergTableLikeEntity.getBaseLocation().endsWith("/")) { @@ -2383,11 +2337,7 @@ private void updateTableLike(TableIdentifier identifier, PolarisEntity entity) { // Set / suffix boolean requireTrailingSlash = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION); + callContext.getRealmConfig().getConfig(FeatureConfiguration.ADD_TRAILING_SLASH_TO_LOCATION); if (requireTrailingSlash && icebergTableLikeEntity.getBaseLocation() != null && !icebergTableLikeEntity.getBaseLocation().endsWith("/")) { @@ -2448,12 +2398,8 @@ private void updateTableLike(TableIdentifier identifier, PolarisEntity entity) { if (catalogPath != null && !catalogPath.isEmpty() && purge) { boolean dropWithPurgeEnabled = callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - catalogEntity, - FeatureConfiguration.DROP_WITH_PURGE_ENABLED); + .getRealmConfig() + .getConfig(FeatureConfiguration.DROP_WITH_PURGE_ENABLED, catalogEntity); if (!dropWithPurgeEnabled) { throw new ForbiddenException( String.format( @@ -2597,10 +2543,7 @@ private boolean sendNotificationForTableLike( validateLocationForTableLike(tableIdentifier, tableMetadata.location()); // finally, validate that the metadata file is within the table directory - validateMetadataFileInTableDir( - tableIdentifier, - tableMetadata, - CatalogEntity.of(resolvedParent.getRawFullPath().getFirst())); + validateMetadataFileInTableDir(tableIdentifier, tableMetadata); // TODO: These might fail due to concurrent update; we need to do a retry in those cases. if (null == existingLocation) { @@ -2694,19 +2637,10 @@ private void blockedUserSpecifiedWriteLocation(Map properties) { } } - /** Helper to retrieve dynamic context-based configuration that has a boolean value. */ - private Boolean getBooleanContextConfiguration(String configKey, boolean defaultValue) { - return callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration(callContext.getRealmContext(), configKey, defaultValue); - } - private int getMaxMetadataRefreshRetries() { - var ctx = callContext.getPolarisCallContext(); - return ctx.getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), FeatureConfiguration.MAX_METADATA_REFRESH_RETRIES); + return callContext + .getRealmConfig() + .getConfig(FeatureConfiguration.MAX_METADATA_REFRESH_RETRIES); } /** Build a {@link PageToken} from a string and page size. */ @@ -2714,12 +2648,8 @@ private PageToken buildPageToken(@Nullable String tokenString, @Nullable Integer boolean paginationEnabled = callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), - catalogEntity, - FeatureConfiguration.LIST_PAGINATION_ENABLED); + .getRealmConfig() + .getConfig(FeatureConfiguration.LIST_PAGINATION_ENABLED, catalogEntity); if (!paginationEnabled) { return PageToken.readEverything(); } else { diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java index c84253aa84..c0b0b3259c 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java @@ -76,7 +76,6 @@ import org.apache.polaris.core.auth.PolarisAuthorizableOperation; import org.apache.polaris.core.auth.PolarisAuthorizer; import org.apache.polaris.core.config.FeatureConfiguration; -import org.apache.polaris.core.config.PolarisConfigurationStore; import org.apache.polaris.core.connection.ConnectionConfigInfoDpo; import org.apache.polaris.core.connection.ConnectionType; import org.apache.polaris.core.connection.hadoop.HadoopConnectionConfigInfoDpo; @@ -698,22 +697,20 @@ public Optional loadTableWithAccessDelegationIfStale( .getDiagServices() .checkNotNull(catalogPath, "No catalog available for loadTable request"); CatalogEntity catalogEntity = CatalogEntity.of(catalogPath.getRawLeafEntity()); - PolarisConfigurationStore configurationStore = - callContext.getPolarisCallContext().getConfigurationStore(); LOGGER.info("Catalog type: {}", catalogEntity.getCatalogType()); LOGGER.info( "allow external catalog credential vending: {}", - configurationStore.getConfiguration( - callContext.getRealmContext(), - catalogEntity, - FeatureConfiguration.ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING)); + callContext + .getRealmConfig() + .getConfig( + FeatureConfiguration.ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING, catalogEntity)); if (catalogEntity .getCatalogType() .equals(org.apache.polaris.core.admin.model.Catalog.TypeEnum.EXTERNAL) - && !configurationStore.getConfiguration( - callContext.getRealmContext(), - catalogEntity, - FeatureConfiguration.ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING)) { + && !callContext + .getRealmConfig() + .getConfig( + FeatureConfiguration.ALLOW_EXTERNAL_CATALOG_CREDENTIAL_VENDING, catalogEntity)) { throw new ForbiddenException( "Access Delegation is not enabled for this catalog. Please consult applicable " + "documentation for the catalog config property '%s' to enable this feature", @@ -968,10 +965,8 @@ public void commitTransaction(CommitTransactionRequest commitTransactionRequest) .location() .equals(((MetadataUpdate.SetLocation) singleUpdate).location()) && !callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getRealmContext(), + .getRealmConfig() + .getConfig( FeatureConfiguration.ALLOW_NAMESPACE_LOCATION_OVERLAP)) { throw new BadRequestException( "Unsupported operation: commitTransaction containing SetLocation" diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java b/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java index db4874521a..bf4b05a69b 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/io/DefaultFileIOFactory.java @@ -31,7 +31,6 @@ import org.apache.iceberg.CatalogUtil; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.io.FileIO; -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.entity.PolarisEntity; @@ -57,16 +56,13 @@ public class DefaultFileIOFactory implements FileIOFactory { private final RealmEntityManagerFactory realmEntityManagerFactory; private final MetaStoreManagerFactory metaStoreManagerFactory; - private final PolarisConfigurationStore configurationStore; @Inject public DefaultFileIOFactory( RealmEntityManagerFactory realmEntityManagerFactory, - MetaStoreManagerFactory metaStoreManagerFactory, - PolarisConfigurationStore configurationStore) { + MetaStoreManagerFactory metaStoreManagerFactory) { this.realmEntityManagerFactory = realmEntityManagerFactory; this.metaStoreManagerFactory = metaStoreManagerFactory; - this.configurationStore = configurationStore; } @Override @@ -95,7 +91,6 @@ public FileIO loadFileIO( callContext, entityManager, credentialVendor, - configurationStore, identifier, tableLocations, storageActions, diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/io/FileIOUtil.java b/service/common/src/main/java/org/apache/polaris/service/catalog/io/FileIOUtil.java index db3771b96c..fcedcfe354 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/io/FileIOUtil.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/io/FileIOUtil.java @@ -22,7 +22,6 @@ import java.util.Set; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.polaris.core.config.FeatureConfiguration; -import org.apache.polaris.core.config.PolarisConfigurationStore; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.entity.PolarisEntity; import org.apache.polaris.core.entity.PolarisEntityConstants; @@ -79,17 +78,15 @@ public static AccessConfig refreshAccessConfig( CallContext callContext, PolarisEntityManager entityManager, PolarisCredentialVendor credentialVendor, - PolarisConfigurationStore configurationStore, TableIdentifier tableIdentifier, Set tableLocations, Set storageActions, PolarisEntity entity) { boolean skipCredentialSubscopingIndirection = - configurationStore.getConfiguration( - callContext.getRealmContext(), - FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION.key(), - FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION.defaultValue()); + callContext + .getRealmConfig() + .getConfig(FeatureConfiguration.SKIP_CREDENTIAL_SUBSCOPING_INDIRECTION); if (skipCredentialSubscopingIndirection) { LOGGER .atDebug() diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/io/WasbTranslatingFileIOFactory.java b/service/common/src/main/java/org/apache/polaris/service/catalog/io/WasbTranslatingFileIOFactory.java index a7074fdc00..0fa94ae307 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/io/WasbTranslatingFileIOFactory.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/io/WasbTranslatingFileIOFactory.java @@ -26,7 +26,6 @@ import java.util.Set; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.io.FileIO; -import org.apache.polaris.core.config.PolarisConfigurationStore; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisResolvedPathWrapper; @@ -43,11 +42,9 @@ public class WasbTranslatingFileIOFactory implements FileIOFactory { @Inject public WasbTranslatingFileIOFactory( RealmEntityManagerFactory realmEntityManagerFactory, - MetaStoreManagerFactory metaStoreManagerFactory, - PolarisConfigurationStore configurationStore) { + MetaStoreManagerFactory metaStoreManagerFactory) { defaultFileIOFactory = - new DefaultFileIOFactory( - realmEntityManagerFactory, metaStoreManagerFactory, configurationStore); + new DefaultFileIOFactory(realmEntityManagerFactory, metaStoreManagerFactory); } @Override diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/validation/IcebergPropertiesValidation.java b/service/common/src/main/java/org/apache/polaris/service/catalog/validation/IcebergPropertiesValidation.java index db512d852b..bc44e032d3 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/validation/IcebergPropertiesValidation.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/validation/IcebergPropertiesValidation.java @@ -44,13 +44,11 @@ public static String determineFileIOClassName( @Nonnull CallContext callContext, @Nonnull Map properties, @Nullable PolarisStorageConfigurationInfo storageConfigurationInfo) { - var ctx = callContext.getPolarisCallContext(); - var configStore = ctx.getConfigurationStore(); - var realmContext = callContext.getRealmContext(); - + var realmConfig = callContext.getPolarisCallContext().getRealmConfig(); var ioImpl = properties.get(CatalogProperties.FILE_IO_IMPL); + if (ioImpl != null) { - if (!configStore.getConfiguration(realmContext, ALLOW_SPECIFYING_FILE_IO_IMPL)) { + if (!realmConfig.getConfig(ALLOW_SPECIFYING_FILE_IO_IMPL)) { throw new ValidationException( "Cannot set property '%s' to '%s' for this catalog.", CatalogProperties.FILE_IO_IMPL, ioImpl); @@ -70,16 +68,13 @@ public static String determineFileIOClassName( if (ioImpl != null) { var storageType = StorageTypeFileIO.fromFileIoImplementation(ioImpl); if (storageType.validateAllowedStorageType() - && !configStore - .getConfiguration(realmContext, SUPPORTED_CATALOG_STORAGE_TYPES) - .contains(storageType.name())) { + && !realmConfig.getConfig(SUPPORTED_CATALOG_STORAGE_TYPES).contains(storageType.name())) { throw new ValidationException( "File IO implementation '%s', as storage type '%s' is not supported", ioImpl, storageType); } - if (!storageType.safe() - && !configStore.getConfiguration(realmContext, ALLOW_INSECURE_STORAGE_TYPES)) { + if (!storageType.safe() && !realmConfig.getConfig(ALLOW_INSECURE_STORAGE_TYPES)) { throw new ValidationException( "File IO implementation '%s' (storage type '%s') is considered insecure and must not be used", ioImpl, storageType); diff --git a/service/common/src/main/java/org/apache/polaris/service/config/RealmEntityManagerFactory.java b/service/common/src/main/java/org/apache/polaris/service/config/RealmEntityManagerFactory.java index 03799bd401..ff962dc639 100644 --- a/service/common/src/main/java/org/apache/polaris/service/config/RealmEntityManagerFactory.java +++ b/service/common/src/main/java/org/apache/polaris/service/config/RealmEntityManagerFactory.java @@ -22,6 +22,9 @@ import jakarta.inject.Inject; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.apache.polaris.core.config.PolarisConfigurationStore; +import org.apache.polaris.core.config.RealmConfig; +import org.apache.polaris.core.config.RealmConfigImpl; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisEntityManager; @@ -35,13 +38,17 @@ public class RealmEntityManagerFactory { private static final Logger LOGGER = LoggerFactory.getLogger(RealmEntityManagerFactory.class); private final MetaStoreManagerFactory metaStoreManagerFactory; + private final PolarisConfigurationStore configurationStore; // Key: realmIdentifier private final Map cachedEntityManagers = new ConcurrentHashMap<>(); @Inject - public RealmEntityManagerFactory(MetaStoreManagerFactory metaStoreManagerFactory) { + public RealmEntityManagerFactory( + MetaStoreManagerFactory metaStoreManagerFactory, + PolarisConfigurationStore configurationStore) { this.metaStoreManagerFactory = metaStoreManagerFactory; + this.configurationStore = configurationStore; } public PolarisEntityManager getOrCreateEntityManager(RealmContext context) { @@ -53,10 +60,11 @@ public PolarisEntityManager getOrCreateEntityManager(RealmContext context) { realm, r -> { LOGGER.info("Initializing new PolarisEntityManager for realm {}", r); + RealmConfig realmConfig = new RealmConfigImpl(configurationStore, context); return new PolarisEntityManager( metaStoreManagerFactory.getOrCreateMetaStoreManager(context), - metaStoreManagerFactory.getOrCreateStorageCredentialCache(context), - metaStoreManagerFactory.getOrCreateEntityCache(context)); + metaStoreManagerFactory.getOrCreateStorageCredentialCache(context, realmConfig), + metaStoreManagerFactory.getOrCreateEntityCache(context, realmConfig)); }); } } diff --git a/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java b/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java index 83908f0178..3f0b1a3552 100644 --- a/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java +++ b/service/common/src/main/java/org/apache/polaris/service/persistence/InMemoryAtomicOperationMetaStoreManagerFactory.java @@ -22,7 +22,6 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.apache.polaris.core.PolarisDiagnostics; -import org.apache.polaris.core.config.PolarisConfigurationStore; import org.apache.polaris.core.persistence.AtomicOperationMetaStoreManager; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider; @@ -37,15 +36,13 @@ public class InMemoryAtomicOperationMetaStoreManagerFactory extends InMemoryPolarisMetaStoreManagerFactory { public InMemoryAtomicOperationMetaStoreManagerFactory() { - super(null, null, null); + super(null, null); } @Inject public InMemoryAtomicOperationMetaStoreManagerFactory( - PolarisStorageIntegrationProvider storageIntegration, - PolarisDiagnostics diagnostics, - PolarisConfigurationStore configurationStore) { - super(storageIntegration, diagnostics, configurationStore); + PolarisStorageIntegrationProvider storageIntegration, PolarisDiagnostics diagnostics) { + super(storageIntegration, diagnostics); } @Override 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 367a57de63..895e5b51b1 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 @@ -29,7 +29,6 @@ import java.util.Set; import java.util.function.Supplier; import org.apache.polaris.core.PolarisDiagnostics; -import org.apache.polaris.core.config.PolarisConfigurationStore; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.LocalPolarisMetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; @@ -49,15 +48,13 @@ public class InMemoryPolarisMetaStoreManagerFactory private final Set bootstrappedRealms = new HashSet<>(); public InMemoryPolarisMetaStoreManagerFactory() { - this(null, null, null); + this(null, null); } @Inject public InMemoryPolarisMetaStoreManagerFactory( - PolarisStorageIntegrationProvider storageIntegration, - PolarisDiagnostics diagnostics, - PolarisConfigurationStore configurationStore) { - super(diagnostics, configurationStore); + PolarisStorageIntegrationProvider storageIntegration, PolarisDiagnostics diagnostics) { + super(diagnostics); this.storageIntegration = storageIntegration; } diff --git a/service/common/src/main/java/org/apache/polaris/service/task/TableCleanupTaskHandler.java b/service/common/src/main/java/org/apache/polaris/service/task/TableCleanupTaskHandler.java index 0fd353c51e..db74cbcaba 100644 --- a/service/common/src/main/java/org/apache/polaris/service/task/TableCleanupTaskHandler.java +++ b/service/common/src/main/java/org/apache/polaris/service/task/TableCleanupTaskHandler.java @@ -115,7 +115,7 @@ public boolean handleTask(TaskEntity cleanupTask, CallContext callContext) { Stream metadataFileCleanupTasks = getMetadataTaskStream( - cleanupTask, tableMetadata, fileIO, tableEntity, metaStoreManager, callContext); + cleanupTask, tableMetadata, tableEntity, metaStoreManager, callContext); List taskEntities = Stream.concat(manifestCleanupTasks, metadataFileCleanupTasks).toList(); @@ -198,15 +198,11 @@ private Stream getManifestTaskStream( private Stream getMetadataTaskStream( TaskEntity cleanupTask, TableMetadata tableMetadata, - FileIO fileIO, IcebergTableLikeEntity tableEntity, PolarisMetaStoreManager metaStoreManager, CallContext callContext) { PolarisCallContext polarisCallContext = callContext.getPolarisCallContext(); - int batchSize = - polarisCallContext - .getConfigurationStore() - .getConfiguration(callContext.getRealmContext(), BATCH_SIZE_CONFIG_KEY, 10); + int batchSize = callContext.getRealmConfig().getConfig(BATCH_SIZE_CONFIG_KEY, 10); return getMetadataFileBatches(tableMetadata, batchSize).stream() .map( metadataBatch -> { diff --git a/service/common/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java b/service/common/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java index fab1d7da41..a6d01ede47 100644 --- a/service/common/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java +++ b/service/common/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java @@ -24,7 +24,6 @@ import java.lang.reflect.Method; import java.util.List; -import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.admin.model.AuthenticationParameters; import org.apache.polaris.core.admin.model.Catalog; import org.apache.polaris.core.admin.model.CatalogProperties; @@ -35,9 +34,8 @@ import org.apache.polaris.core.admin.model.StorageConfigInfo; import org.apache.polaris.core.auth.PolarisAuthorizer; import org.apache.polaris.core.config.FeatureConfiguration; -import org.apache.polaris.core.config.PolarisConfigurationStore; +import org.apache.polaris.core.config.RealmConfig; import org.apache.polaris.core.context.CallContext; -import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.secrets.UserSecretsManagerFactory; import org.apache.polaris.service.config.RealmEntityManagerFactory; @@ -54,9 +52,7 @@ public class PolarisServiceImplTest { private PolarisAuthorizer polarisAuthorizer; private CallContext callContext; private ReservedProperties reservedProperties; - private PolarisCallContext polarisCallContext; - private PolarisConfigurationStore configurationStore; - private RealmContext realmContext; + private RealmConfig realmConfig; private PolarisServiceImpl polarisService; @@ -68,18 +64,13 @@ void setUp() { polarisAuthorizer = Mockito.mock(PolarisAuthorizer.class); callContext = Mockito.mock(CallContext.class); reservedProperties = Mockito.mock(ReservedProperties.class); - polarisCallContext = Mockito.mock(PolarisCallContext.class); - configurationStore = Mockito.mock(PolarisConfigurationStore.class); - realmContext = Mockito.mock(RealmContext.class); - - when(callContext.getPolarisCallContext()).thenReturn(polarisCallContext); - when(callContext.getRealmContext()).thenReturn(realmContext); - when(polarisCallContext.getConfigurationStore()).thenReturn(configurationStore); - when(configurationStore.getConfiguration( - realmContext, FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES)) + realmConfig = Mockito.mock(RealmConfig.class); + + when(callContext.getRealmConfig()).thenReturn(realmConfig); + when(realmConfig.getConfig(FeatureConfiguration.SUPPORTED_CATALOG_CONNECTION_TYPES)) .thenReturn(List.of("ICEBERG_REST")); - when(configurationStore.getConfiguration( - realmContext, FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES)) + when(realmConfig.getConfig( + FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES)) .thenReturn(List.of("OAUTH")); polarisService = diff --git a/service/common/src/test/java/org/apache/polaris/service/catalog/io/FileIOFactoryTest.java b/service/common/src/test/java/org/apache/polaris/service/catalog/io/FileIOFactoryTest.java index 1158632ebf..34a9531d23 100644 --- a/service/common/src/test/java/org/apache/polaris/service/catalog/io/FileIOFactoryTest.java +++ b/service/common/src/test/java/org/apache/polaris/service/catalog/io/FileIOFactoryTest.java @@ -104,10 +104,9 @@ public void before(TestInfo testInfo) { // Spy FileIOFactory and check if the credentials are passed to the FileIO TestServices.FileIOFactorySupplier fileIOFactorySupplier = - (entityManagerFactory, metaStoreManagerFactory, configurationStore) -> + (entityManagerFactory, metaStoreManagerFactory) -> Mockito.spy( - new DefaultFileIOFactory( - entityManagerFactory, metaStoreManagerFactory, configurationStore) { + new DefaultFileIOFactory(entityManagerFactory, metaStoreManagerFactory) { @Override FileIO loadFileIOInternal( @Nonnull String ioImplClassName, @Nonnull Map properties) { diff --git a/service/common/src/testFixtures/java/org/apache/polaris/service/TestServices.java b/service/common/src/testFixtures/java/org/apache/polaris/service/TestServices.java index 555a0da15b..e8f1950d5d 100644 --- a/service/common/src/testFixtures/java/org/apache/polaris/service/TestServices.java +++ b/service/common/src/testFixtures/java/org/apache/polaris/service/TestServices.java @@ -30,6 +30,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.function.BiFunction; import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.PolarisDiagnostics; import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal; @@ -65,7 +66,6 @@ import org.apache.polaris.service.secrets.UnsafeInMemorySecretsManagerFactory; import org.apache.polaris.service.storage.PolarisStorageIntegrationProviderImpl; import org.apache.polaris.service.task.TaskExecutor; -import org.assertj.core.util.TriFunction; import org.mockito.Mockito; import software.amazon.awssdk.services.sts.StsClient; @@ -89,11 +89,7 @@ public record TestServices( @FunctionalInterface public interface FileIOFactorySupplier - extends TriFunction< - RealmEntityManagerFactory, - MetaStoreManagerFactory, - PolarisConfigurationStore, - FileIOFactory> {} + extends BiFunction {} private static class MockedConfigurationStore implements PolarisConfigurationStore { private final Map defaults; @@ -155,9 +151,9 @@ public TestServices build() { () -> GoogleCredentials.create(new AccessToken(GCP_ACCESS_TOKEN, new Date()))); InMemoryPolarisMetaStoreManagerFactory metaStoreManagerFactory = new InMemoryPolarisMetaStoreManagerFactory( - storageIntegrationProvider, polarisDiagnostics, configurationStore); + storageIntegrationProvider, polarisDiagnostics); RealmEntityManagerFactory realmEntityManagerFactory = - new RealmEntityManagerFactory(metaStoreManagerFactory) {}; + new RealmEntityManagerFactory(metaStoreManagerFactory, configurationStore); UserSecretsManagerFactory userSecretsManagerFactory = new UnsafeInMemorySecretsManagerFactory(); @@ -178,8 +174,7 @@ public TestServices build() { userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext); FileIOFactory fileIOFactory = - fileIOFactorySupplier.apply( - realmEntityManagerFactory, metaStoreManagerFactory, configurationStore); + fileIOFactorySupplier.apply(realmEntityManagerFactory, metaStoreManagerFactory); TaskExecutor taskExecutor = Mockito.mock(TaskExecutor.class); @@ -196,7 +191,7 @@ public TestServices build() { ReservedProperties reservedProperties = ReservedProperties.NONE; CatalogHandlerUtils catalogHandlerUtils = - new CatalogHandlerUtils(callContext.getRealmContext(), configurationStore); + new CatalogHandlerUtils(callContext.getRealmConfig()); IcebergCatalogAdapter catalogService = new IcebergCatalogAdapter( diff --git a/service/common/src/testFixtures/java/org/apache/polaris/service/catalog/io/MeasuredFileIOFactory.java b/service/common/src/testFixtures/java/org/apache/polaris/service/catalog/io/MeasuredFileIOFactory.java index abfb6e8c30..bdaa3e955a 100644 --- a/service/common/src/testFixtures/java/org/apache/polaris/service/catalog/io/MeasuredFileIOFactory.java +++ b/service/common/src/testFixtures/java/org/apache/polaris/service/catalog/io/MeasuredFileIOFactory.java @@ -29,7 +29,6 @@ import java.util.function.Supplier; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.io.FileIO; -import org.apache.polaris.core.config.PolarisConfigurationStore; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.apache.polaris.core.persistence.PolarisResolvedPathWrapper; @@ -55,11 +54,9 @@ public class MeasuredFileIOFactory implements FileIOFactory { @Inject public MeasuredFileIOFactory( RealmEntityManagerFactory realmEntityManagerFactory, - MetaStoreManagerFactory metaStoreManagerFactory, - PolarisConfigurationStore configurationStore) { + MetaStoreManagerFactory metaStoreManagerFactory) { defaultFileIOFactory = - new DefaultFileIOFactory( - realmEntityManagerFactory, metaStoreManagerFactory, configurationStore); + new DefaultFileIOFactory(realmEntityManagerFactory, metaStoreManagerFactory); } @Override