Skip to content

Commit e7eb59f

Browse files
authored
Remove getCurrentContext from InMemoryStorageIntegration (#2201)
1 parent 3d354f8 commit e7eb59f

File tree

5 files changed

+51
-33
lines changed

5 files changed

+51
-33
lines changed

polaris-core/src/main/java/org/apache/polaris/core/storage/InMemoryStorageIntegration.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,17 @@
2222
import java.util.HashMap;
2323
import java.util.List;
2424
import java.util.Map;
25-
import java.util.Optional;
2625
import java.util.Set;
2726
import java.util.function.Function;
2827
import java.util.stream.Collectors;
29-
import org.apache.polaris.core.context.CallContext;
28+
import org.apache.polaris.core.config.RealmConfig;
3029

3130
/**
3231
* Base class for in-memory implementations of {@link PolarisStorageIntegration}. A basic
33-
* implementation of {@link #validateAccessToLocations(PolarisStorageConfigurationInfo, Set, Set)}
34-
* is provided that checks to see that the list of locations being accessed is among the list of
35-
* {@link PolarisStorageConfigurationInfo#getAllowedLocations()}. Locations being accessed must be
36-
* equal to or a subdirectory of at least one of the allowed locations.
32+
* implementation of {@link #validateAccessToLocations(RealmConfig, PolarisStorageConfigurationInfo,
33+
* Set, Set)} is provided that checks to see that the list of locations being accessed is among the
34+
* list of {@link PolarisStorageConfigurationInfo#getAllowedLocations()}. Locations being accessed
35+
* must be equal to or a subdirectory of at least one of the allowed locations.
3736
*
3837
* @param <T>
3938
*/
@@ -56,6 +55,7 @@ public InMemoryStorageIntegration(String identifierOrId) {
5655
*/
5756
public static Map<String, Map<PolarisStorageActions, ValidationResult>>
5857
validateSubpathsOfAllowedLocations(
58+
@Nonnull RealmConfig realmConfig,
5959
@Nonnull PolarisStorageConfigurationInfo storageConfig,
6060
@Nonnull Set<PolarisStorageActions> actions,
6161
@Nonnull Set<String> locations) {
@@ -76,10 +76,7 @@ public InMemoryStorageIntegration(String identifierOrId) {
7676
List<StorageLocation> allowedLocations =
7777
allowedLocationStrings.stream().map(StorageLocation::of).collect(Collectors.toList());
7878

79-
boolean allowWildcardLocation =
80-
Optional.ofNullable(CallContext.getCurrentContext())
81-
.map(ctx -> ctx.getRealmConfig().getConfig("ALLOW_WILDCARD_LOCATION", false))
82-
.orElse(false);
79+
boolean allowWildcardLocation = realmConfig.getConfig("ALLOW_WILDCARD_LOCATION", false);
8380

8481
if (allowWildcardLocation && allowedLocationStrings.contains("*")) {
8582
return locations.stream()
@@ -122,9 +119,10 @@ public InMemoryStorageIntegration(String identifierOrId) {
122119
@Override
123120
@Nonnull
124121
public Map<String, Map<PolarisStorageActions, ValidationResult>> validateAccessToLocations(
122+
@Nonnull RealmConfig realmConfig,
125123
@Nonnull T storageConfig,
126124
@Nonnull Set<PolarisStorageActions> actions,
127125
@Nonnull Set<String> locations) {
128-
return validateSubpathsOfAllowedLocations(storageConfig, actions, locations);
126+
return validateSubpathsOfAllowedLocations(realmConfig, storageConfig, actions, locations);
129127
}
130128
}

polaris-core/src/main/java/org/apache/polaris/core/storage/PolarisStorageIntegration.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import jakarta.annotation.Nonnull;
2222
import java.util.Map;
2323
import java.util.Set;
24+
import org.apache.polaris.core.config.RealmConfig;
2425
import org.apache.polaris.core.context.CallContext;
2526

2627
/**
@@ -93,12 +94,14 @@ public abstract AccessConfig getSubscopedCreds(
9394
@Nonnull
9495
public abstract Map<String, Map<PolarisStorageActions, ValidationResult>>
9596
validateAccessToLocations(
97+
@Nonnull RealmConfig realmConfig,
9698
@Nonnull T storageConfig,
9799
@Nonnull Set<PolarisStorageActions> actions,
98100
@Nonnull Set<String> locations);
99101

100102
/**
101-
* Result of calling {@link #validateAccessToLocations(PolarisStorageConfigurationInfo, Set, Set)}
103+
* Result of calling {@link #validateAccessToLocations(RealmConfig,
104+
* PolarisStorageConfigurationInfo, Set, Set)}
102105
*/
103106
public static final class ValidationResult {
104107
private final boolean success;

polaris-core/src/test/java/org/apache/polaris/core/storage/InMemoryStorageIntegrationTest.java

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,12 @@
2020

2121
import jakarta.annotation.Nonnull;
2222
import jakarta.annotation.Nullable;
23-
import java.time.Clock;
2423
import java.util.List;
2524
import java.util.Map;
2625
import java.util.Set;
27-
import org.apache.polaris.core.PolarisCallContext;
28-
import org.apache.polaris.core.PolarisDefaultDiagServiceImpl;
2926
import org.apache.polaris.core.config.PolarisConfigurationStore;
27+
import org.apache.polaris.core.config.RealmConfig;
28+
import org.apache.polaris.core.config.RealmConfigImpl;
3029
import org.apache.polaris.core.context.CallContext;
3130
import org.apache.polaris.core.context.RealmContext;
3231
import org.apache.polaris.core.storage.aws.AwsStorageConfigurationInfo;
@@ -35,16 +34,20 @@
3534
import org.junit.jupiter.params.ParameterizedTest;
3635
import org.junit.jupiter.params.provider.CsvSource;
3736
import org.junit.jupiter.params.provider.ValueSource;
38-
import org.mockito.Mockito;
3937

4038
class InMemoryStorageIntegrationTest {
4139

40+
private static final RealmContext REALM_CONTEXT = () -> "realm";
41+
4242
@ParameterizedTest
4343
@CsvSource({"s3,s3", "s3,s3a", "s3a,s3", "s3a,s3a"})
4444
public void testValidateAccessToLocations(String allowedScheme, String locationScheme) {
45+
RealmConfig realmConfig =
46+
new RealmConfigImpl(new MockedConfigurationStore(Map.of()), REALM_CONTEXT);
4547
MockInMemoryStorageIntegration storage = new MockInMemoryStorageIntegration();
4648
Map<String, Map<PolarisStorageActions, PolarisStorageIntegration.ValidationResult>> result =
4749
storage.validateAccessToLocations(
50+
realmConfig,
4851
new AwsStorageConfigurationInfo(
4952
PolarisStorageConfigurationInfo.StorageType.S3,
5053
List.of(
@@ -96,24 +99,12 @@ public void testAwsAccountIdParsing() {
9699
@ValueSource(strings = {"s3", "s3a"})
97100
public void testValidateAccessToLocationsWithWildcard(String s3Scheme) {
98101
MockInMemoryStorageIntegration storage = new MockInMemoryStorageIntegration();
99-
Map<String, Boolean> config = Map.of("ALLOW_WILDCARD_LOCATION", true);
100-
PolarisCallContext polarisCallContext =
101-
new PolarisCallContext(
102-
() -> "testRealm",
103-
Mockito.mock(),
104-
new PolarisDefaultDiagServiceImpl(),
105-
new PolarisConfigurationStore() {
106-
@SuppressWarnings("unchecked")
107-
@Override
108-
public <T> @Nullable T getConfiguration(
109-
@Nonnull RealmContext ctx, String configName) {
110-
return (T) config.get(configName);
111-
}
112-
},
113-
Clock.systemUTC());
114-
CallContext.setCurrentContext(polarisCallContext);
102+
Map<String, Object> config = Map.of("ALLOW_WILDCARD_LOCATION", true);
103+
RealmConfig realmConfig =
104+
new RealmConfigImpl(new MockedConfigurationStore(config), REALM_CONTEXT);
115105
Map<String, Map<PolarisStorageActions, PolarisStorageIntegration.ValidationResult>> result =
116106
storage.validateAccessToLocations(
107+
realmConfig,
117108
new FileStorageConfigurationInfo(List.of("file://", "*")),
118109
Set.of(PolarisStorageActions.READ),
119110
Set.of(
@@ -151,8 +142,11 @@ public void testValidateAccessToLocationsWithWildcard(String s3Scheme) {
151142
@Test
152143
public void testValidateAccessToLocationsNoAllowedLocations() {
153144
MockInMemoryStorageIntegration storage = new MockInMemoryStorageIntegration();
145+
RealmConfig realmConfig =
146+
new RealmConfigImpl(new MockedConfigurationStore(Map.of()), REALM_CONTEXT);
154147
Map<String, Map<PolarisStorageActions, PolarisStorageIntegration.ValidationResult>> result =
155148
storage.validateAccessToLocations(
149+
realmConfig,
156150
new AwsStorageConfigurationInfo(
157151
PolarisStorageConfigurationInfo.StorageType.S3,
158152
List.of(),
@@ -185,8 +179,11 @@ public void testValidateAccessToLocationsNoAllowedLocations() {
185179
@Test
186180
public void testValidateAccessToLocationsWithPrefixOfAllowedLocation() {
187181
MockInMemoryStorageIntegration storage = new MockInMemoryStorageIntegration();
182+
RealmConfig realmConfig =
183+
new RealmConfigImpl(new MockedConfigurationStore(Map.of()), REALM_CONTEXT);
188184
Map<String, Map<PolarisStorageActions, PolarisStorageIntegration.ValidationResult>> result =
189185
storage.validateAccessToLocations(
186+
realmConfig,
190187
new AwsStorageConfigurationInfo(
191188
PolarisStorageConfigurationInfo.StorageType.S3,
192189
List.of("s3://bucket/path/to/warehouse"),
@@ -220,4 +217,19 @@ public AccessConfig getSubscopedCreds(
220217
return null;
221218
}
222219
}
220+
221+
private static class MockedConfigurationStore implements PolarisConfigurationStore {
222+
private final Map<String, Object> defaults;
223+
224+
public MockedConfigurationStore(Map<String, Object> defaults) {
225+
this.defaults = Map.copyOf(defaults);
226+
}
227+
228+
@Override
229+
public <T> @Nullable T getConfiguration(@Nonnull RealmContext realmContext, String configName) {
230+
@SuppressWarnings("unchecked")
231+
T confgValue = (T) defaults.get(configName);
232+
return confgValue;
233+
}
234+
}
223235
}

service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalog.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,10 @@ private void validateLocationsForTableLike(
10401040
Map<String, Map<PolarisStorageActions, PolarisStorageIntegration.ValidationResult>>
10411041
validationResults =
10421042
InMemoryStorageIntegration.validateSubpathsOfAllowedLocations(
1043-
storageConfigInfo, Set.of(PolarisStorageActions.ALL), locations);
1043+
callContext.getRealmConfig(),
1044+
storageConfigInfo,
1045+
Set.of(PolarisStorageActions.ALL),
1046+
locations);
10441047
validationResults
10451048
.values()
10461049
.forEach(

service/common/src/main/java/org/apache/polaris/service/storage/PolarisStorageIntegrationProviderImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.Optional;
3131
import java.util.Set;
3232
import java.util.function.Supplier;
33+
import org.apache.polaris.core.config.RealmConfig;
3334
import org.apache.polaris.core.context.CallContext;
3435
import org.apache.polaris.core.storage.AccessConfig;
3536
import org.apache.polaris.core.storage.PolarisStorageActions;
@@ -110,6 +111,7 @@ public AccessConfig getSubscopedCreds(
110111
@Override
111112
public @Nonnull Map<String, Map<PolarisStorageActions, ValidationResult>>
112113
validateAccessToLocations(
114+
@Nonnull RealmConfig realmConfig,
113115
@Nonnull T storageConfig,
114116
@Nonnull Set<PolarisStorageActions> actions,
115117
@Nonnull Set<String> locations) {

0 commit comments

Comments
 (0)