This is an automated email from the ASF dual-hosted git repository.
yufei pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new d753a95e4 Add DefaultConfigurationStoreDecorator to support inject
callContext for DefaultConfigurationStore (#1505)
d753a95e4 is described below
commit d753a95e4ae1724e87db8a0a3a925094f354ee67
Author: gh-yzou <[email protected]>
AuthorDate: Wed May 21 10:43:44 2025 -0700
Add DefaultConfigurationStoreDecorator to support inject callContext for
DefaultConfigurationStore (#1505)
---
.../quarkus/admin/ManagementServiceTest.java | 3 +-
.../quarkus/admin/PolarisAuthzTestBase.java | 39 ++---
.../service/quarkus/auth/JWTRSAKeyPairTest.java | 12 +-
.../service/quarkus/catalog/GetConfigTest.java | 2 -
.../quarkus/catalog/IcebergCatalogTest.java | 2 +
.../quarkus/catalog/IcebergCatalogViewTest.java | 1 +
...PolarisGenericTableCatalogHandlerAuthzTest.java | 2 +
.../catalog/PolarisGenericTableCatalogTest.java | 1 +
.../catalog/PolicyCatalogHandlerAuthzTest.java | 2 +
.../service/quarkus/catalog/PolicyCatalogTest.java | 1 +
.../config/DefaultConfigurationStoreTest.java | 165 +++++++--------------
.../quarkus/task/TableCleanupTaskHandlerTest.java | 2 +
.../service/config/DefaultConfigurationStore.java | 48 +++---
.../org/apache/polaris/service/TestServices.java | 20 ++-
14 files changed, 130 insertions(+), 170 deletions(-)
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java
index ff42c384a..181edd62e 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/admin/ManagementServiceTest.java
@@ -51,7 +51,6 @@ import
org.apache.polaris.core.persistence.dao.entity.EntityResult;
import org.apache.polaris.core.secrets.UnsafeInMemorySecretsManager;
import org.apache.polaris.service.TestServices;
import org.apache.polaris.service.admin.PolarisAdminService;
-import org.apache.polaris.service.config.DefaultConfigurationStore;
import org.apache.polaris.service.config.ReservedProperties;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -220,7 +219,7 @@ public class ManagementServiceTest {
return "";
}
},
- new PolarisAuthorizerImpl(new DefaultConfigurationStore(Map.of())),
+ new PolarisAuthorizerImpl(services.configurationStore()),
new ReservedProperties() {
@Override
public List<String> prefixes() {
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java
index d3a2b0dba..9bec65ab4 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/admin/PolarisAuthzTestBase.java
@@ -26,7 +26,6 @@ import com.google.common.collect.ImmutableMap;
import io.quarkus.test.junit.QuarkusMock;
import io.quarkus.test.junit.QuarkusTestProfile;
import jakarta.annotation.Nonnull;
-import jakarta.annotation.Nullable;
import jakarta.enterprise.context.RequestScoped;
import jakarta.enterprise.inject.Alternative;
import jakarta.inject.Inject;
@@ -56,7 +55,6 @@ import org.apache.polaris.core.admin.model.StorageConfigInfo;
import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal;
import org.apache.polaris.core.auth.PolarisAuthorizer;
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.context.CallContext;
import org.apache.polaris.core.context.RealmContext;
@@ -85,7 +83,6 @@ import
org.apache.polaris.service.catalog.iceberg.CatalogHandlerUtils;
import org.apache.polaris.service.catalog.iceberg.IcebergCatalog;
import org.apache.polaris.service.catalog.io.FileIOFactory;
import org.apache.polaris.service.catalog.policy.PolicyCatalog;
-import org.apache.polaris.service.config.DefaultConfigurationStore;
import org.apache.polaris.service.config.RealmEntityManagerFactory;
import org.apache.polaris.service.config.ReservedProperties;
import org.apache.polaris.service.context.catalog.CallContextCatalogFactory;
@@ -123,6 +120,10 @@ public abstract class PolarisAuthzTestBase {
"polaris.features.\"SUPPORTED_CATALOG_STORAGE_TYPES\"",
"[\"FILE\",\"S3\"]",
"polaris.readiness.ignore-severe-issues",
+ "true",
+ "polaris.features.\"ENABLE_GENERIC_TABLES\"",
+ "true",
+
"polaris.features.\"ENFORCE_PRINCIPAL_CREDENTIAL_ROTATION_REQUIRED_CHECKING\"",
"true");
}
}
@@ -183,12 +184,6 @@ public abstract class PolarisAuthzTestBase {
new Schema(
required(3, "id", Types.IntegerType.get(), "unique ID 🤪"),
required(4, "data", Types.StringType.get()));
- protected final PolarisAuthorizer polarisAuthorizer =
- new PolarisAuthorizerImpl(
- new DefaultConfigurationStore(
- Map.of(
-
FeatureConfiguration.ENFORCE_PRINCIPAL_CREDENTIAL_ROTATION_REQUIRED_CHECKING.key,
- true)));
protected final ReservedProperties reservedProperties =
ReservedProperties.NONE;
@Inject protected MetaStoreManagerFactory managerFactory;
@@ -200,6 +195,7 @@ public abstract class PolarisAuthzTestBase {
@Inject protected FileIOFactory fileIOFactory;
@Inject protected PolarisEventListener polarisEventListener;
@Inject protected CatalogHandlerUtils catalogHandlerUtils;
+ @Inject protected PolarisConfigurationStore configurationStore;
protected IcebergCatalog baseCatalog;
protected PolarisGenericTableCatalog genericTableCatalog;
@@ -213,6 +209,7 @@ public abstract class PolarisAuthzTestBase {
protected PrincipalEntity principalEntity;
protected CallContext callContext;
protected AuthenticatedPolarisPrincipal authenticatedRoot;
+ protected PolarisAuthorizer polarisAuthorizer;
private PolarisCallContext polarisContext;
@@ -227,33 +224,17 @@ public abstract class PolarisAuthzTestBase {
@BeforeEach
public void before(TestInfo testInfo) {
RealmContext realmContext = testInfo::getDisplayName;
+ QuarkusMock.installMockForType(realmContext, RealmContext.class);
metaStoreManager =
managerFactory.getOrCreateMetaStoreManager(realmContext);
userSecretsManager =
userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext);
- Map<String, Object> configMap =
- Map.of(
- "ALLOW_SPECIFYING_FILE_IO_IMPL",
- true,
- "ALLOW_INSECURE_STORAGE_TYPES",
- true,
- "ALLOW_EXTERNAL_METADATA_FILE_LOCATION",
- true,
- "SUPPORTED_CATALOG_STORAGE_TYPES",
- List.of("FILE", "S3"),
- "ENABLE_GENERIC_TABLES",
- true);
+ polarisAuthorizer = new PolarisAuthorizerImpl(configurationStore);
+
polarisContext =
new PolarisCallContext(
managerFactory.getOrCreateSessionSupplier(realmContext).get(),
diagServices,
- new PolarisConfigurationStore() {
- @Override
- public <T> @Nullable T getConfiguration(PolarisCallContext ctx,
String configName) {
- @SuppressWarnings("unchecked")
- var r = (T) configMap.get(configName);
- return r;
- }
- },
+ configurationStore,
clock);
this.entityManager =
realmEntityManagerFactory.getOrCreateEntityManager(realmContext);
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/auth/JWTRSAKeyPairTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/auth/JWTRSAKeyPairTest.java
index 84ca59926..a7dcc10a8 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/auth/JWTRSAKeyPairTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/auth/JWTRSAKeyPairTest.java
@@ -24,12 +24,14 @@ import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
+import io.quarkus.test.junit.QuarkusTest;
+import jakarta.inject.Inject;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
-import java.util.HashMap;
import org.apache.polaris.core.PolarisCallContext;
+import org.apache.polaris.core.config.PolarisConfigurationStore;
import org.apache.polaris.core.entity.PolarisBaseEntity;
import org.apache.polaris.core.entity.PolarisEntitySubType;
import org.apache.polaris.core.entity.PolarisEntityType;
@@ -43,13 +45,15 @@ import org.apache.polaris.service.auth.PemUtils;
import org.apache.polaris.service.auth.TokenBroker;
import org.apache.polaris.service.auth.TokenRequestValidator;
import org.apache.polaris.service.auth.TokenResponse;
-import org.apache.polaris.service.config.DefaultConfigurationStore;
import org.apache.polaris.service.types.TokenType;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
+@QuarkusTest
public class JWTRSAKeyPairTest {
+ @Inject protected PolarisConfigurationStore configurationStore;
+
@Test
public void testSuccessfulTokenGeneration() throws Exception {
Path privateFileLocation = Files.createTempFile("test-private", ".pem");
@@ -59,8 +63,8 @@ public class JWTRSAKeyPairTest {
final String clientId = "test-client-id";
final String scope = "PRINCIPAL_ROLE:TEST";
- DefaultConfigurationStore store = new DefaultConfigurationStore(new
HashMap<>());
- PolarisCallContext polarisCallContext = new PolarisCallContext(null, null,
store, null);
+ PolarisCallContext polarisCallContext =
+ new PolarisCallContext(null, null, configurationStore, null);
PolarisMetaStoreManager metastoreManager =
Mockito.mock(PolarisMetaStoreManager.class);
String mainSecret = "client-secret";
PolarisPrincipalSecrets principalSecrets =
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/GetConfigTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/GetConfigTest.java
index c497cee6a..858edb1fa 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/GetConfigTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/GetConfigTest.java
@@ -21,7 +21,6 @@ package org.apache.polaris.service.quarkus.catalog;
import static jakarta.ws.rs.core.Response.Status.CREATED;
import static org.assertj.core.api.Assertions.assertThat;
-import io.quarkus.test.junit.QuarkusTest;
import jakarta.ws.rs.core.Response;
import java.util.List;
import java.util.Map;
@@ -33,7 +32,6 @@ import org.apache.polaris.service.TestServices;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-@QuarkusTest
public class GetConfigTest {
@ParameterizedTest
@ValueSource(booleans = {true, false})
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java
index 3bd8f45aa..6d77a3459 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogTest.java
@@ -246,6 +246,7 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
.formatted(
testInfo.getTestMethod().map(Method::getName).orElse("test"),
System.nanoTime());
RealmContext realmContext = () -> realmName;
+ QuarkusMock.installMockForType(realmContext, RealmContext.class);
metaStoreManager =
managerFactory.getOrCreateMetaStoreManager(realmContext);
userSecretsManager =
userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext);
polarisContext =
@@ -254,6 +255,7 @@ public abstract class IcebergCatalogTest extends
CatalogTests<IcebergCatalog> {
diagServices,
configurationStore,
Clock.systemDefaultZone());
+
entityManager =
new PolarisEntityManager(
metaStoreManager, new StorageCredentialCache(),
createEntityCache(metaStoreManager));
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java
index 0ac72a1b5..70fe9304b 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/IcebergCatalogViewTest.java
@@ -166,6 +166,7 @@ public class IcebergCatalogViewTest extends
ViewCatalogTests<IcebergCatalog> {
.formatted(
testInfo.getTestMethod().map(Method::getName).orElse("test"),
System.nanoTime());
RealmContext realmContext = () -> realmName;
+ QuarkusMock.installMockForType(realmContext, RealmContext.class);
metaStoreManager =
managerFactory.getOrCreateMetaStoreManager(realmContext);
userSecretsManager =
userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext);
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogHandlerAuthzTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogHandlerAuthzTest.java
index 0f9fd3190..6deb37bb3 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogHandlerAuthzTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogHandlerAuthzTest.java
@@ -19,6 +19,7 @@
package org.apache.polaris.service.quarkus.catalog;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.TestProfile;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -31,6 +32,7 @@ import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@QuarkusTest
+@TestProfile(PolarisAuthzTestBase.Profile.class)
public class PolarisGenericTableCatalogHandlerAuthzTest extends
PolarisAuthzTestBase {
private GenericTableCatalogHandler newWrapper() {
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java
index 267fbb386..c5c5755fd 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisGenericTableCatalogTest.java
@@ -168,6 +168,7 @@ public class PolarisGenericTableCatalogTest {
.formatted(
testInfo.getTestMethod().map(Method::getName).orElse("test"),
System.nanoTime());
RealmContext realmContext = () -> realmName;
+ QuarkusMock.installMockForType(realmContext, RealmContext.class);
metaStoreManager =
managerFactory.getOrCreateMetaStoreManager(realmContext);
userSecretsManager =
userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext);
polarisContext =
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogHandlerAuthzTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogHandlerAuthzTest.java
index c2aea07e3..e4505ebe5 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogHandlerAuthzTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogHandlerAuthzTest.java
@@ -19,6 +19,7 @@
package org.apache.polaris.service.quarkus.catalog;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.TestProfile;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
@@ -38,6 +39,7 @@ import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@QuarkusTest
+@TestProfile(PolarisAuthzTestBase.Profile.class)
public class PolicyCatalogHandlerAuthzTest extends PolarisAuthzTestBase {
private PolicyCatalogHandler newWrapper() {
return newWrapper(Set.of());
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java
index e94f70c63..3bea67411 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolicyCatalogTest.java
@@ -192,6 +192,7 @@ public class PolicyCatalogTest {
.formatted(
testInfo.getTestMethod().map(Method::getName).orElse("test"),
System.nanoTime());
RealmContext realmContext = () -> realmName;
+ QuarkusMock.installMockForType(realmContext, RealmContext.class);
metaStoreManager =
managerFactory.getOrCreateMetaStoreManager(realmContext);
userSecretsManager =
userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext);
polarisContext =
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/config/DefaultConfigurationStoreTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/config/DefaultConfigurationStoreTest.java
index ddd1026d9..67a8e8e6a 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/config/DefaultConfigurationStoreTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/config/DefaultConfigurationStoreTest.java
@@ -28,17 +28,14 @@ import jakarta.inject.Inject;
import java.time.Clock;
import java.util.Map;
import org.apache.polaris.core.PolarisCallContext;
-import org.apache.polaris.core.PolarisDefaultDiagServiceImpl;
import org.apache.polaris.core.PolarisDiagnostics;
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.context.RealmContext;
import org.apache.polaris.core.entity.CatalogEntity;
import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
import org.apache.polaris.service.config.DefaultConfigurationStore;
import org.apache.polaris.service.config.FeaturesConfiguration;
-import
org.apache.polaris.service.persistence.InMemoryPolarisMetaStoreManagerFactory;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -47,9 +44,14 @@ import org.junit.jupiter.api.TestInfo;
@QuarkusTest
@TestProfile(DefaultConfigurationStoreTest.Profile.class)
public class DefaultConfigurationStoreTest {
+ // the key whose value is set to `false` for all realms
private static final String falseByDefaultKey =
"ALLOW_SPECIFYING_FILE_IO_IMPL";
+ // the key whose value is set to `true` for all realms
private static final String trueByDefaultKey = "ENABLE_GENERIC_TABLES";
private static final String realmOne = "realm1";
+ private static final String realmTwo = "realm2";
+ private static final RealmContext realmOneContext = () -> realmOne;
+ private static final RealmContext realmTwoContext = () -> realmTwo;
public static class Profile implements QuarkusTestProfile {
@@ -58,12 +60,15 @@ public class DefaultConfigurationStoreTest {
return Map.of(
"polaris.realm-context.realms",
"realm1,realm2",
- String.format("polaris.features.\"%s\"", falseByDefaultKey),
- "true",
String.format("polaris.features.\"%s\"", trueByDefaultKey),
+ "true",
+ String.format("polaris.features.\"%s\"", falseByDefaultKey),
"false",
String.format(
"polaris.features.realm-overrides.\"%s\".\"%s\"", realmOne,
falseByDefaultKey),
+ "true",
+ String.format(
+ "polaris.features.realm-overrides.\"%s\".\"%s\"", realmTwo,
trueByDefaultKey),
"false");
}
}
@@ -94,126 +99,60 @@ public class DefaultConfigurationStoreTest {
@Test
public void testGetConfiguration() {
- DefaultConfigurationStore defaultConfigurationStore =
- new DefaultConfigurationStore(Map.of("key1", 1, "key2", "value"));
- InMemoryPolarisMetaStoreManagerFactory metastoreFactory =
- new InMemoryPolarisMetaStoreManagerFactory();
- PolarisCallContext callCtx =
- new PolarisCallContext(
- metastoreFactory.getOrCreateSessionSupplier(() -> "realm1").get(),
- new PolarisDefaultDiagServiceImpl());
- Object value = defaultConfigurationStore.getConfiguration(callCtx,
"missingKeyWithoutDefault");
+ Object value = configurationStore.getConfiguration(polarisContext,
"missingKeyWithoutDefault");
assertThat(value).isNull();
Object defaultValue =
- defaultConfigurationStore.getConfiguration(
- callCtx, "missingKeyWithDefault", "defaultValue");
+ configurationStore.getConfiguration(
+ polarisContext, "missingKeyWithDefault", "defaultValue");
assertThat(defaultValue).isEqualTo("defaultValue");
- Integer keyOne = defaultConfigurationStore.getConfiguration(callCtx,
"key1");
- assertThat(keyOne).isEqualTo(1);
- String keyTwo = defaultConfigurationStore.getConfiguration(callCtx,
"key2");
- assertThat(keyTwo).isEqualTo("value");
+
+ // the falseByDefaultKey is set to false for all realms in
Profile.getConfigOverrides
+ assertThat((Boolean) configurationStore.getConfiguration(polarisContext,
falseByDefaultKey))
+ .isFalse();
+ // the trueByDefaultKey is set to true for all realms in
Profile.getConfigOverrides
+ assertThat((Boolean) configurationStore.getConfiguration(polarisContext,
trueByDefaultKey))
+ .isTrue();
}
@Test
public void testGetRealmConfiguration() {
- int defaultKeyOneValue = 1;
- String defaultKeyTwoValue = "value";
-
- int realm1KeyOneValue = 2;
- int realm2KeyOneValue = 3;
- String realm2KeyTwoValue = "value3";
- DefaultConfigurationStore defaultConfigurationStore =
- new DefaultConfigurationStore(
- Map.of("key1", defaultKeyOneValue, "key2", defaultKeyTwoValue),
- Map.of(
- "realm1",
- Map.of("key1", realm1KeyOneValue),
- "realm2",
- Map.of("key1", realm2KeyOneValue, "key2", realm2KeyTwoValue)));
- InMemoryPolarisMetaStoreManagerFactory metastoreFactory =
- new InMemoryPolarisMetaStoreManagerFactory();
-
- // check realm1 values
- PolarisCallContext realm1Ctx =
- new PolarisCallContext(
- metastoreFactory.getOrCreateSessionSupplier(() -> "realm1").get(),
- new PolarisDefaultDiagServiceImpl());
- Object value =
- defaultConfigurationStore.getConfiguration(realm1Ctx,
"missingKeyWithoutDefault");
- assertThat(value).isNull();
- Object defaultValue =
- defaultConfigurationStore.getConfiguration(
- realm1Ctx, "missingKeyWithDefault", "defaultValue");
- assertThat(defaultValue).isEqualTo("defaultValue");
- CallContext.setCurrentContext(CallContext.of(() -> "realm1", realm1Ctx));
- Integer keyOneRealm1 =
defaultConfigurationStore.getConfiguration(realm1Ctx, "key1");
- assertThat(keyOneRealm1).isEqualTo(realm1KeyOneValue);
- String keyTwoRealm1 =
defaultConfigurationStore.getConfiguration(realm1Ctx, "key2");
- assertThat(keyTwoRealm1).isEqualTo(defaultKeyTwoValue);
-
- // check realm2 values
- PolarisCallContext realm2Ctx =
- new PolarisCallContext(
- metastoreFactory.getOrCreateSessionSupplier(() -> "realm2").get(),
- new PolarisDefaultDiagServiceImpl());
- CallContext.setCurrentContext(CallContext.of(() -> "realm2", realm2Ctx));
- Integer keyOneRealm2 =
defaultConfigurationStore.getConfiguration(realm2Ctx, "key1");
- assertThat(keyOneRealm2).isEqualTo(realm2KeyOneValue);
- String keyTwoRealm2 =
defaultConfigurationStore.getConfiguration(realm2Ctx, "key2");
- assertThat(keyTwoRealm2).isEqualTo(realm2KeyTwoValue);
-
- // realm3 has no realm-overrides, so just returns default values
- PolarisCallContext realm3Ctx =
- new PolarisCallContext(
- metastoreFactory.getOrCreateSessionSupplier(() -> "realm3").get(),
- new PolarisDefaultDiagServiceImpl());
- CallContext.setCurrentContext(CallContext.of(() -> "realm3", realm3Ctx));
- Integer keyOneRealm3 =
defaultConfigurationStore.getConfiguration(realm3Ctx, "key1");
- assertThat(keyOneRealm3).isEqualTo(defaultKeyOneValue);
- String keyTwoRealm3 =
defaultConfigurationStore.getConfiguration(realm3Ctx, "key2");
- assertThat(keyTwoRealm3).isEqualTo(defaultKeyTwoValue);
- }
-
- // TODO simplify once DefaultConfigrationStore doesn't rely on
CallContext.getCurrentContext
- private void setCurrentRealm(String realmName) {
- RealmContext realmContext = () -> realmName;
- QuarkusMock.installMockForType(realmContext, RealmContext.class);
- CallContext.setCurrentContext(
- new CallContext() {
- @Override
- public RealmContext getRealmContext() {
- return realmContext;
- }
-
- @Override
- public PolarisCallContext getPolarisCallContext() {
- return CallContext.getCurrentContext().getPolarisCallContext();
- }
+ // check the realmOne configuration
+ QuarkusMock.installMockForType(realmOneContext, RealmContext.class);
+ // the falseByDefaultKey is set to `false` for all realms, but overwrite
with value `true` for
+ // realmOne.
+ assertThat((Boolean) configurationStore.getConfiguration(polarisContext,
falseByDefaultKey))
+ .isTrue();
+ // the trueByDefaultKey is set to `false` for all realms, no overwrite for
realmOne
+ assertThat((Boolean) configurationStore.getConfiguration(polarisContext,
trueByDefaultKey))
+ .isTrue();
- @Override
- public Map<String, Object> contextVariables() {
- return CallContext.getCurrentContext().contextVariables();
- }
- });
+ // check the realmTwo configuration
+ QuarkusMock.installMockForType(realmTwoContext, RealmContext.class);
+ // the falseByDefaultKey is set to `false` for all realms, no overwrite
for realmTwo
+ assertThat((Boolean) configurationStore.getConfiguration(polarisContext,
falseByDefaultKey))
+ .isFalse();
+ // the trueByDefaultKey is set to `false` for all realms, and overwrite
with value `false` for
+ // realmTwo
+ assertThat((Boolean) configurationStore.getConfiguration(polarisContext,
trueByDefaultKey))
+ .isFalse();
}
@Test
public void testInjectedConfigurationStore() {
- // Feature override makes this `false`
- boolean featureOverrideValue =
+ // the default value for trueByDefaultKey is `true`
+ boolean featureDefaultValue =
configurationStore.getConfiguration(polarisContext, trueByDefaultKey);
- assertThat(featureOverrideValue).isFalse();
+ assertThat(featureDefaultValue).isTrue();
- // Feature override value makes this `true`
- setCurrentRealm("not-" + realmOne);
- boolean realmOverrideValue =
- configurationStore.getConfiguration(polarisContext, falseByDefaultKey);
- assertThat(realmOverrideValue).isTrue();
+ QuarkusMock.installMockForType(realmTwoContext, RealmContext.class);
+ // the value for falseByDefaultKey is `false`, and no realm override for
realmTwo
+ boolean realmTwoValue =
configurationStore.getConfiguration(polarisContext, falseByDefaultKey);
+ assertThat(realmTwoValue).isFalse();
- // Now, realm override value makes this `false`
- setCurrentRealm(realmOne);
- realmOverrideValue = configurationStore.getConfiguration(polarisContext,
falseByDefaultKey);
- assertThat(realmOverrideValue).isFalse();
+ // Now, realmOne override falseByDefaultKey to `True`
+ QuarkusMock.installMockForType(realmOneContext, RealmContext.class);
+ boolean realmOneValue =
configurationStore.getConfiguration(polarisContext, falseByDefaultKey);
+ assertThat(realmOneValue).isTrue();
assertThat(configurationStore).isInstanceOf(DefaultConfigurationStore.class);
}
@@ -226,12 +165,16 @@ public class DefaultConfigurationStoreTest {
.containsKeys(falseByDefaultKey, trueByDefaultKey)
.allSatisfy((key, value) ->
assertThat(value).doesNotContain(realmOne));
- assertThat(featuresConfiguration.realmOverrides()).hasSize(1);
+ assertThat(featuresConfiguration.realmOverrides()).hasSize(2);
assertThat(featuresConfiguration.realmOverrides()).containsKey(realmOne);
assertThat(featuresConfiguration.realmOverrides().get(realmOne).overrides()).hasSize(1);
assertThat(featuresConfiguration.realmOverrides().get(realmOne).overrides())
.containsKey(falseByDefaultKey);
+
+
assertThat(featuresConfiguration.realmOverrides().get(realmTwo).overrides()).hasSize(1);
+
assertThat(featuresConfiguration.realmOverrides().get(realmTwo).overrides())
+ .containsKey(trueByDefaultKey);
}
@Test
diff --git
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/task/TableCleanupTaskHandlerTest.java
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/task/TableCleanupTaskHandlerTest.java
index 5e39028c9..d4147252f 100644
---
a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/task/TableCleanupTaskHandlerTest.java
+++
b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/task/TableCleanupTaskHandlerTest.java
@@ -20,6 +20,7 @@ package org.apache.polaris.service.quarkus.task;
import static org.assertj.core.api.Assertions.assertThat;
+import io.quarkus.test.junit.QuarkusMock;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.annotation.Nonnull;
import jakarta.inject.Inject;
@@ -98,6 +99,7 @@ class TableCleanupTaskHandlerTest {
@BeforeEach
void setup() {
+ QuarkusMock.installMockForType(realmContext, RealmContext.class);
PolarisCallContext polarisCallContext =
new PolarisCallContext(
metaStoreManagerFactory.getOrCreateSessionSupplier(realmContext).get(),
diff --git
a/service/common/src/main/java/org/apache/polaris/service/config/DefaultConfigurationStore.java
b/service/common/src/main/java/org/apache/polaris/service/config/DefaultConfigurationStore.java
index 8d9fd0e43..5bc4fe51c 100644
---
a/service/common/src/main/java/org/apache/polaris/service/config/DefaultConfigurationStore.java
+++
b/service/common/src/main/java/org/apache/polaris/service/config/DefaultConfigurationStore.java
@@ -22,47 +22,55 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Instance;
import jakarta.inject.Inject;
import java.util.Map;
+import java.util.Optional;
import org.apache.polaris.core.PolarisCallContext;
import org.apache.polaris.core.config.PolarisConfigurationStore;
-import org.apache.polaris.core.context.CallContext;
+import org.apache.polaris.core.context.RealmContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@ApplicationScoped
public class DefaultConfigurationStore implements PolarisConfigurationStore {
+ Logger LOGGER = LoggerFactory.getLogger(DefaultConfigurationStore.class);
private final Map<String, Object> defaults;
private final Map<String, Map<String, Object>> realmOverrides;
+ @Inject private Instance<RealmContext> realmContextInstance;
// FIXME the whole PolarisConfigurationStore + PolarisConfiguration needs to
be refactored
// to become a proper Quarkus configuration object
@Inject
public DefaultConfigurationStore(
ObjectMapper objectMapper, FeaturesConfiguration configurations) {
- this(
- configurations.parseDefaults(objectMapper),
- configurations.parseRealmOverrides(objectMapper));
- }
-
- public DefaultConfigurationStore(Map<String, Object> defaults) {
- this(defaults, Map.of());
- }
-
- public DefaultConfigurationStore(
- Map<String, Object> defaults, Map<String, Map<String, Object>>
realmOverrides) {
- this.defaults = Map.copyOf(defaults);
- this.realmOverrides = Map.copyOf(realmOverrides);
+ this.defaults = Map.copyOf(configurations.parseDefaults(objectMapper));
+ this.realmOverrides =
Map.copyOf(configurations.parseRealmOverrides(objectMapper));
}
@Override
public <T> @Nullable T getConfiguration(@Nonnull PolarisCallContext ctx,
String configName) {
- String realm =
CallContext.getCurrentContext().getRealmContext().getRealmIdentifier();
+ if (!realmContextInstance.isUnsatisfied()) {
+ RealmContext realmContext = realmContextInstance.get();
+ String realm = realmContext.getRealmIdentifier();
+ LOGGER.debug("Get configuration value for {} with realm {}", configName,
realm);
+ @SuppressWarnings("unchecked")
+ T confgValue =
+ (T)
+ Optional.ofNullable(realmOverrides.getOrDefault(realm,
Map.of()).get(configName))
+ .orElseGet(() -> getDefaultConfiguration(configName));
+ return confgValue;
+ } else {
+ LOGGER.debug(
+ "No RealmContext is injected when lookup value for configuration {}
", configName);
+ return getDefaultConfiguration(configName);
+ }
+ }
+
+ private <T> @Nullable T getDefaultConfiguration(String configName) {
@SuppressWarnings("unchecked")
- T confgValue =
- (T)
- realmOverrides
- .getOrDefault(realm, Map.of())
- .getOrDefault(configName, defaults.get(configName));
+ T confgValue = (T) defaults.get(configName);
return confgValue;
}
}
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 4301fe993..b9b72fb63 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
@@ -20,6 +20,8 @@ package org.apache.polaris.service;
import com.google.auth.oauth2.AccessToken;
import com.google.auth.oauth2.GoogleCredentials;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
import jakarta.ws.rs.core.SecurityContext;
import java.security.Principal;
import java.time.Clock;
@@ -53,7 +55,6 @@ import
org.apache.polaris.service.catalog.iceberg.CatalogHandlerUtils;
import org.apache.polaris.service.catalog.iceberg.IcebergCatalogAdapter;
import org.apache.polaris.service.catalog.io.FileIOFactory;
import org.apache.polaris.service.catalog.io.MeasuredFileIOFactory;
-import org.apache.polaris.service.config.DefaultConfigurationStore;
import org.apache.polaris.service.config.RealmEntityManagerFactory;
import org.apache.polaris.service.config.ReservedProperties;
import org.apache.polaris.service.context.catalog.CallContextCatalogFactory;
@@ -93,6 +94,21 @@ public record TestServices(
PolarisConfigurationStore,
FileIOFactory> {}
+ private static class MockedConfigurationStore implements
PolarisConfigurationStore {
+ private final Map<String, Object> defaults;
+
+ public MockedConfigurationStore(Map<String, Object> defaults) {
+ this.defaults = Map.copyOf(defaults);
+ }
+
+ @Override
+ public <T> @Nullable T getConfiguration(@Nonnull PolarisCallContext ctx,
String configName) {
+ @SuppressWarnings("unchecked")
+ T confgValue = (T) defaults.get(configName);
+ return confgValue;
+ }
+ }
+
public static Builder builder() {
return new Builder();
}
@@ -126,7 +142,7 @@ public record TestServices(
}
public TestServices build() {
- DefaultConfigurationStore configurationStore = new
DefaultConfigurationStore(config);
+ PolarisConfigurationStore configurationStore = new
MockedConfigurationStore(config);
PolarisDiagnostics polarisDiagnostics =
Mockito.mock(PolarisDiagnostics.class);
PolarisAuthorizer authorizer = Mockito.mock(PolarisAuthorizer.class);