From 21096dd7091162b13784f87591189bbbf64bd074 Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Mon, 31 Mar 2025 10:00:51 -0700 Subject: [PATCH 01/12] add change --- .../polaris/core/rest/PolarisEndpoint.java | 29 +++++++++ .../core/rest/PolarisResourcePaths.java | 55 +++++++++++++++++ .../core/rest/PolarisResourcePathsTest.java | 59 +++++++++++++++++++ .../quarkus/catalog/GetConfigTest.java | 31 ++++++++++ .../iceberg/IcebergCatalogAdapter.java | 15 +++++ 5 files changed, 189 insertions(+) create mode 100644 polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java create mode 100644 polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisResourcePaths.java create mode 100644 polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java create mode 100644 quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/GetConfigTest.java diff --git a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java new file mode 100644 index 0000000000..b99b7454cd --- /dev/null +++ b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java @@ -0,0 +1,29 @@ +/* + * 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.rest; + +import org.apache.iceberg.rest.Endpoint; + +public class PolarisEndpoint { + public static final Endpoint V1_LIST_GENERIC_TABLES = Endpoint.create("GET", PolarisResourcePaths.V1_GENERIC_TABLES); + public static final Endpoint V1_LOAD_GENERIC_TABLE = Endpoint.create("GET", PolarisResourcePaths.V1_GENERIC_TABLE); + public static final Endpoint V1_CREATE_GENERIC_ABLE = Endpoint.create("POST", PolarisResourcePaths.V1_GENERIC_TABLES); + public static final Endpoint V1_DELETE_GENERIC_TABLE = Endpoint.create("DELETE", PolarisResourcePaths.V1_GENERIC_TABLE); +} \ No newline at end of file diff --git a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisResourcePaths.java b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisResourcePaths.java new file mode 100644 index 0000000000..97fa750cde --- /dev/null +++ b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisResourcePaths.java @@ -0,0 +1,55 @@ +/* + * 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.rest; + +import com.google.common.base.Joiner; +import org.apache.iceberg.catalog.Namespace; +import org.apache.iceberg.catalog.TableIdentifier; +import org.apache.iceberg.rest.RESTUtil; + +import java.util.Map; + +public class PolarisResourcePaths { + private static final Joiner SLASH = Joiner.on("/").skipNulls(); + public static final String PREFIX = "prefix"; + + // Generic Table endpoints + public static final String V1_GENERIC_TABLES = "polaris/v1/{prefix}/namespaces/{namespace}/generic-tables"; + public static final String V1_GENERIC_TABLE = "polaris/v1/{prefix}/namespaces/{namespace}/generic-tables/{generic-table}"; + + private final String prefix; + + public PolarisResourcePaths(String prefix) { + this.prefix = prefix; + } + + public static PolarisResourcePaths forCatalogProperties(Map properties) { + return new PolarisResourcePaths(properties.get(PREFIX)); + } + + public String genericTables(Namespace ns) { + return SLASH.join("polaris", "v1", prefix, "namespaces", RESTUtil.encodeNamespace(ns), "generic-tables"); + } + + public String genericTable(TableIdentifier ident) { + return SLASH.join("polaris", "v1", prefix, "namespaces", RESTUtil.encodeNamespace(ident.namespace()), "generic-tables", RESTUtil.encodeString(ident.name())); + } + +} \ No newline at end of file diff --git a/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java b/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java new file mode 100644 index 0000000000..129bce6406 --- /dev/null +++ b/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java @@ -0,0 +1,59 @@ +/* + * 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.rest; + +import org.apache.iceberg.catalog.Namespace; +import org.apache.iceberg.catalog.TableIdentifier; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +public class PolarisResourcePathsTest { + private final String testPrefix = "polaris-test"; + + private PolarisResourcePaths paths; + + @BeforeEach + public void setUp() { + Map properties = new HashMap<>(); + properties.put(PolarisResourcePaths.PREFIX, testPrefix); + paths = PolarisResourcePaths.forCatalogProperties(properties); + } + + @Test + public void testGenericTablesPath() { + Namespace ns = Namespace.of("ns1", "ns2"); + String genericTablesPath = paths.genericTables(ns); + String expectedPath = String.format("polaris/v1/%s/namespaces/%s/generic-tables", testPrefix, "ns1%1Fns2"); + Assertions.assertThat(genericTablesPath).isEqualTo(expectedPath); + } + + @Test + public void testGenericTablePath() { + Namespace ns = Namespace.of("ns1"); + TableIdentifier ident = TableIdentifier.of(ns, "test-table"); + String genericTablePath = paths.genericTable(ident); + String expectedPath = String.format("polaris/v1/%s/namespaces/%s/generic-tables/%s", testPrefix, "ns1", "test-table"); + Assertions.assertThat(genericTablePath).isEqualTo(expectedPath); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..2c9f71bdb4 --- /dev/null +++ b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/GetConfigTest.java @@ -0,0 +1,31 @@ +/* + * 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.service.quarkus.catalog; + +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.QuarkusTestProfile; +import io.quarkus.test.junit.TestProfile; + +@QuarkusTest +@TestProfile(GetConfigTest.Profile.class) +public class GetConfigTest { + public static class Profile implements QuarkusTestProfile { + + } +} \ No newline at end of file diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java index 6db06cb01a..3b26581589 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java @@ -59,6 +59,8 @@ import org.apache.iceberg.rest.responses.LoadTableResponse; import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal; import org.apache.polaris.core.auth.PolarisAuthorizer; +import org.apache.polaris.core.config.FeatureConfiguration; +import org.apache.polaris.core.config.PolarisConfiguration; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.PolarisEntity; @@ -67,6 +69,7 @@ import org.apache.polaris.core.persistence.ResolvedPolarisEntity; import org.apache.polaris.core.persistence.resolver.Resolver; import org.apache.polaris.core.persistence.resolver.ResolverStatus; +import org.apache.polaris.core.rest.PolarisEndpoint; import org.apache.polaris.service.catalog.AccessDelegationMode; import org.apache.polaris.service.catalog.CatalogPrefixParser; import org.apache.polaris.service.catalog.api.IcebergRestCatalogApiService; @@ -127,6 +130,13 @@ public class IcebergCatalogAdapter .add(Endpoint.create("POST", ResourcePaths.V1_TRANSACTIONS_COMMIT)) .build(); + private static final Set GENERIC_TABLE_ENDPOINTS = ImmutableSet.builder() + .add(PolarisEndpoint.V1_LIST_GENERIC_TABLES) + .add(PolarisEndpoint.V1_CREATE_GENERIC_ABLE) + .add(PolarisEndpoint.V1_DELETE_GENERIC_TABLE) + .add(PolarisEndpoint.V1_LOAD_GENERIC_TABLE) + .build(); + private final RealmContext realmContext; private final CallContext callContext; private final CallContextCatalogFactory catalogFactory; @@ -702,6 +712,10 @@ public Response getConfig( PolarisEntity.of(resolvedReferenceCatalog.getEntity()).getPropertiesAsMap(); String prefix = prefixParser.catalogNameToPrefix(realmContext, warehouse); + + Set supportedGenericTableEndpoints = + PolarisConfiguration.loadConfig(FeatureConfiguration.ENABLE_GENERIC_TABLES) ? GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); + return Response.ok( ConfigResponse.builder() .withDefaults(properties) // catalog properties are defaults @@ -711,6 +725,7 @@ public Response getConfig( .addAll(DEFAULT_ENDPOINTS) .addAll(VIEW_ENDPOINTS) .addAll(COMMIT_ENDPOINT) + .addAll(supportedGenericTableEndpoints) .build()) .build()) .build(); From c56816ec21f57d4022a54dc3c5a02cc5842629ed Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Mon, 31 Mar 2025 15:36:32 -0700 Subject: [PATCH 02/12] add generic table endpoints to getConfig --- .../core/config/PolarisConfiguration.java | 18 +++++ .../polaris/core/rest/PolarisEndpoint.java | 15 ++-- .../core/rest/PolarisResourcePaths.java | 25 ++++--- .../core/rest/PolarisResourcePathsTest.java | 15 ++-- .../quarkus/catalog/GetConfigTest.java | 73 ++++++++++++++++++- .../iceberg/IcebergCatalogAdapter.java | 18 +++-- .../apache/polaris/service/TestServices.java | 7 +- 7 files changed, 138 insertions(+), 33 deletions(-) diff --git a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java index bcb3809881..83e22702d4 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java @@ -135,6 +135,24 @@ public static T loadConfig(PolarisConfiguration configuration) { .getConfiguration(callContext.getPolarisCallContext(), configuration); } + /** + * Returns the value of a `PolarisConfiguration` within the given callContext, or the default if + * no callContext is provided. + */ + public static T loadConfig(PolarisConfiguration configuration, CallContext callContext) { + if (callContext == null) { + LOGGER.warn( + String.format( + "No call context available; using %s = %s", + configuration.key, configuration.defaultValue)); + return configuration.defaultValue; + } + return callContext + .getPolarisCallContext() + .getConfigurationStore() + .getConfiguration(callContext.getPolarisCallContext(), configuration); + } + public static Builder builder() { return new Builder<>(); } diff --git a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java index b99b7454cd..1fe128dbd7 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java @@ -16,14 +16,17 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.polaris.core.rest; import org.apache.iceberg.rest.Endpoint; public class PolarisEndpoint { - public static final Endpoint V1_LIST_GENERIC_TABLES = Endpoint.create("GET", PolarisResourcePaths.V1_GENERIC_TABLES); - public static final Endpoint V1_LOAD_GENERIC_TABLE = Endpoint.create("GET", PolarisResourcePaths.V1_GENERIC_TABLE); - public static final Endpoint V1_CREATE_GENERIC_ABLE = Endpoint.create("POST", PolarisResourcePaths.V1_GENERIC_TABLES); - public static final Endpoint V1_DELETE_GENERIC_TABLE = Endpoint.create("DELETE", PolarisResourcePaths.V1_GENERIC_TABLE); -} \ No newline at end of file + public static final Endpoint V1_LIST_GENERIC_TABLES = + Endpoint.create("GET", PolarisResourcePaths.V1_GENERIC_TABLES); + public static final Endpoint V1_LOAD_GENERIC_TABLE = + Endpoint.create("GET", PolarisResourcePaths.V1_GENERIC_TABLE); + public static final Endpoint V1_CREATE_GENERIC_ABLE = + Endpoint.create("POST", PolarisResourcePaths.V1_GENERIC_TABLES); + public static final Endpoint V1_DELETE_GENERIC_TABLE = + Endpoint.create("DELETE", PolarisResourcePaths.V1_GENERIC_TABLE); +} diff --git a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisResourcePaths.java b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisResourcePaths.java index 97fa750cde..159a1a0148 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisResourcePaths.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisResourcePaths.java @@ -16,23 +16,23 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.polaris.core.rest; import com.google.common.base.Joiner; +import java.util.Map; import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.rest.RESTUtil; -import java.util.Map; - public class PolarisResourcePaths { private static final Joiner SLASH = Joiner.on("/").skipNulls(); public static final String PREFIX = "prefix"; // Generic Table endpoints - public static final String V1_GENERIC_TABLES = "polaris/v1/{prefix}/namespaces/{namespace}/generic-tables"; - public static final String V1_GENERIC_TABLE = "polaris/v1/{prefix}/namespaces/{namespace}/generic-tables/{generic-table}"; + public static final String V1_GENERIC_TABLES = + "polaris/v1/{prefix}/namespaces/{namespace}/generic-tables"; + public static final String V1_GENERIC_TABLE = + "polaris/v1/{prefix}/namespaces/{namespace}/generic-tables/{generic-table}"; private final String prefix; @@ -45,11 +45,18 @@ public static PolarisResourcePaths forCatalogProperties(Map prop } public String genericTables(Namespace ns) { - return SLASH.join("polaris", "v1", prefix, "namespaces", RESTUtil.encodeNamespace(ns), "generic-tables"); + return SLASH.join( + "polaris", "v1", prefix, "namespaces", RESTUtil.encodeNamespace(ns), "generic-tables"); } public String genericTable(TableIdentifier ident) { - return SLASH.join("polaris", "v1", prefix, "namespaces", RESTUtil.encodeNamespace(ident.namespace()), "generic-tables", RESTUtil.encodeString(ident.name())); + return SLASH.join( + "polaris", + "v1", + prefix, + "namespaces", + RESTUtil.encodeNamespace(ident.namespace()), + "generic-tables", + RESTUtil.encodeString(ident.name())); } - -} \ No newline at end of file +} diff --git a/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java b/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java index 129bce6406..3a6224893e 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java @@ -16,18 +16,16 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.polaris.core.rest; +import java.util.HashMap; +import java.util.Map; import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.HashMap; -import java.util.Map; - public class PolarisResourcePathsTest { private final String testPrefix = "polaris-test"; @@ -44,7 +42,8 @@ public void setUp() { public void testGenericTablesPath() { Namespace ns = Namespace.of("ns1", "ns2"); String genericTablesPath = paths.genericTables(ns); - String expectedPath = String.format("polaris/v1/%s/namespaces/%s/generic-tables", testPrefix, "ns1%1Fns2"); + String expectedPath = + String.format("polaris/v1/%s/namespaces/%s/generic-tables", testPrefix, "ns1%1Fns2"); Assertions.assertThat(genericTablesPath).isEqualTo(expectedPath); } @@ -53,7 +52,9 @@ public void testGenericTablePath() { Namespace ns = Namespace.of("ns1"); TableIdentifier ident = TableIdentifier.of(ns, "test-table"); String genericTablePath = paths.genericTable(ident); - String expectedPath = String.format("polaris/v1/%s/namespaces/%s/generic-tables/%s", testPrefix, "ns1", "test-table"); + String expectedPath = + String.format( + "polaris/v1/%s/namespaces/%s/generic-tables/%s", testPrefix, "ns1", "test-table"); Assertions.assertThat(genericTablePath).isEqualTo(expectedPath); } -} \ No newline at end of file +} 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 2c9f71bdb4..d904c8c7b5 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 @@ -18,14 +18,83 @@ */ 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 io.quarkus.test.junit.QuarkusTestProfile; import io.quarkus.test.junit.TestProfile; +import jakarta.ws.rs.core.Response; +import java.util.List; +import java.util.Map; +import org.apache.iceberg.rest.responses.ConfigResponse; +import org.apache.polaris.core.admin.model.*; +import org.apache.polaris.core.rest.PolarisEndpoint; +import org.apache.polaris.service.TestServices; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; @QuarkusTest @TestProfile(GetConfigTest.Profile.class) public class GetConfigTest { public static class Profile implements QuarkusTestProfile { - + @Override + public Map getConfigOverrides() { + return Map.of( + "polaris.features.defaults.\"ALLOW_SPECIFYING_FILE_IO_IMPL\"", + "true", + "polaris.features.defaults.\"INITIALIZE_DEFAULT_CATALOG_FILEIO_FOR_TEST\"", + "true", + "polaris.features.defaults.\"SUPPORTED_CATALOG_STORAGE_TYPES\"", + "[\"FILE\"]"); + } + } + + @ParameterizedTest + @ValueSource(booleans = {true, false}) + public void testGetConfig(boolean enableGenericTable) { + TestServices services = + TestServices.builder().config(Map.of("ENABLE_GENERIC_TABLES", enableGenericTable)).build(); + + FileStorageConfigInfo fileStorage = + FileStorageConfigInfo.builder(StorageConfigInfo.StorageTypeEnum.FILE) + .setAllowedLocations(List.of("file://")) + .build(); + String catalogName = "test-catalog"; + Catalog catalog = + PolarisCatalog.builder() + .setType(Catalog.TypeEnum.INTERNAL) + .setName(catalogName) + .setProperties(new CatalogProperties("file:///tmp/path/to/data")) + .setStorageConfigInfo(fileStorage) + .build(); + + Response response = + services + .catalogsApi() + .createCatalog( + new CreateCatalogRequest(catalog), + services.realmContext(), + services.securityContext()); + assertThat(response.getStatus()).isEqualTo(CREATED.getStatusCode()); + + response = + services + .restConfigurationApi() + .getConfig(catalogName, services.realmContext(), services.securityContext()); + ConfigResponse configResponse = response.readEntity(ConfigResponse.class); + assertThat(configResponse.overrides()).contains(Map.entry("prefix", catalogName)); + if (enableGenericTable) { + assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_CREATE_GENERIC_ABLE); + assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_DELETE_GENERIC_TABLE); + assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_LIST_GENERIC_TABLES); + assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_LOAD_GENERIC_TABLE); + } else { + assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoint.V1_CREATE_GENERIC_ABLE); + assertThat(configResponse.endpoints()) + .doesNotContain(PolarisEndpoint.V1_DELETE_GENERIC_TABLE); + assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoint.V1_LIST_GENERIC_TABLES); + assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoint.V1_LOAD_GENERIC_TABLE); + } } -} \ No newline at end of file +} diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java index 3b26581589..37644f2118 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java @@ -130,12 +130,13 @@ public class IcebergCatalogAdapter .add(Endpoint.create("POST", ResourcePaths.V1_TRANSACTIONS_COMMIT)) .build(); - private static final Set GENERIC_TABLE_ENDPOINTS = ImmutableSet.builder() - .add(PolarisEndpoint.V1_LIST_GENERIC_TABLES) - .add(PolarisEndpoint.V1_CREATE_GENERIC_ABLE) - .add(PolarisEndpoint.V1_DELETE_GENERIC_TABLE) - .add(PolarisEndpoint.V1_LOAD_GENERIC_TABLE) - .build(); + private static final Set GENERIC_TABLE_ENDPOINTS = + ImmutableSet.builder() + .add(PolarisEndpoint.V1_LIST_GENERIC_TABLES) + .add(PolarisEndpoint.V1_CREATE_GENERIC_ABLE) + .add(PolarisEndpoint.V1_DELETE_GENERIC_TABLE) + .add(PolarisEndpoint.V1_LOAD_GENERIC_TABLE) + .build(); private final RealmContext realmContext; private final CallContext callContext; @@ -713,8 +714,11 @@ public Response getConfig( String prefix = prefixParser.catalogNameToPrefix(realmContext, warehouse); + // add the generic table endpoints as supported endpoints if generic table feature is enabled. Set supportedGenericTableEndpoints = - PolarisConfiguration.loadConfig(FeatureConfiguration.ENABLE_GENERIC_TABLES) ? GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); + PolarisConfiguration.loadConfig(FeatureConfiguration.ENABLE_GENERIC_TABLES, callContext) + ? GENERIC_TABLE_ENDPOINTS + : ImmutableSet.of(); return Response.ok( ConfigResponse.builder() 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 c763af661c..d550217926 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 @@ -46,7 +46,7 @@ import org.apache.polaris.service.admin.api.PolarisCatalogsApi; import org.apache.polaris.service.catalog.DefaultCatalogPrefixParser; import org.apache.polaris.service.catalog.api.IcebergRestCatalogApi; -import org.apache.polaris.service.catalog.api.IcebergRestCatalogApiService; +import org.apache.polaris.service.catalog.api.IcebergRestConfigurationApi; import org.apache.polaris.service.catalog.iceberg.IcebergCatalogAdapter; import org.apache.polaris.service.catalog.io.FileIOFactory; import org.apache.polaris.service.catalog.io.MeasuredFileIOFactory; @@ -64,6 +64,7 @@ public record TestServices( PolarisCatalogsApi catalogsApi, IcebergRestCatalogApi restApi, + IcebergRestConfigurationApi restConfigurationApi, PolarisConfigurationStore configurationStore, PolarisDiagnostics polarisDiagnostics, RealmEntityManagerFactory entityManagerFactory, @@ -170,7 +171,7 @@ public Map contextVariables() { new PolarisCallContextCatalogFactory( realmEntityManagerFactory, metaStoreManagerFactory, taskExecutor, fileIOFactory); - IcebergRestCatalogApiService service = + IcebergCatalogAdapter service = new IcebergCatalogAdapter( realmContext, callContext, @@ -181,6 +182,7 @@ public Map contextVariables() { new DefaultCatalogPrefixParser()); IcebergRestCatalogApi restApi = new IcebergRestCatalogApi(service); + IcebergRestConfigurationApi restConfigurationApi = new IcebergRestConfigurationApi(service); CreatePrincipalResult createdPrincipal = metaStoreManager.createPrincipal( @@ -225,6 +227,7 @@ public String getAuthenticationScheme() { return new TestServices( catalogsApi, restApi, + restConfigurationApi, configurationStore, polarisDiagnostics, realmEntityManagerFactory, From 86b4b83c56c60474550d35dec3c597aa235b6fb1 Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Mon, 31 Mar 2025 17:08:24 -0700 Subject: [PATCH 03/12] remove a function --- .../core/config/PolarisConfiguration.java | 18 ------------------ .../catalog/iceberg/IcebergCatalogAdapter.java | 11 +++++++---- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java index 83e22702d4..bcb3809881 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/config/PolarisConfiguration.java @@ -135,24 +135,6 @@ public static T loadConfig(PolarisConfiguration configuration) { .getConfiguration(callContext.getPolarisCallContext(), configuration); } - /** - * Returns the value of a `PolarisConfiguration` within the given callContext, or the default if - * no callContext is provided. - */ - public static T loadConfig(PolarisConfiguration configuration, CallContext callContext) { - if (callContext == null) { - LOGGER.warn( - String.format( - "No call context available; using %s = %s", - configuration.key, configuration.defaultValue)); - return configuration.defaultValue; - } - return callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration(callContext.getPolarisCallContext(), configuration); - } - public static Builder builder() { return new Builder<>(); } diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java index 37644f2118..7d9cbd8da4 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java @@ -60,7 +60,6 @@ import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal; import org.apache.polaris.core.auth.PolarisAuthorizer; import org.apache.polaris.core.config.FeatureConfiguration; -import org.apache.polaris.core.config.PolarisConfiguration; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.PolarisEntity; @@ -715,10 +714,14 @@ public Response getConfig( String prefix = prefixParser.catalogNameToPrefix(realmContext, warehouse); // add the generic table endpoints as supported endpoints if generic table feature is enabled. + boolean genericTableEnabled = + callContext + .getPolarisCallContext() + .getConfigurationStore() + .getConfiguration( + callContext.getPolarisCallContext(), FeatureConfiguration.ENABLE_GENERIC_TABLES); Set supportedGenericTableEndpoints = - PolarisConfiguration.loadConfig(FeatureConfiguration.ENABLE_GENERIC_TABLES, callContext) - ? GENERIC_TABLE_ENDPOINTS - : ImmutableSet.of(); + genericTableEnabled ? GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); return Response.ok( ConfigResponse.builder() From 79fc51c6c3f16cc2ea3ec4ae8ec327b876bf42ba Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Tue, 1 Apr 2025 21:58:05 -0700 Subject: [PATCH 04/12] rebase and fix name --- .../java/org/apache/polaris/core/rest/PolarisEndpoint.java | 2 +- .../polaris/service/quarkus/catalog/GetConfigTest.java | 5 +++-- .../service/catalog/iceberg/IcebergCatalogAdapter.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java index 1fe128dbd7..09da26ad33 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java @@ -25,7 +25,7 @@ public class PolarisEndpoint { Endpoint.create("GET", PolarisResourcePaths.V1_GENERIC_TABLES); public static final Endpoint V1_LOAD_GENERIC_TABLE = Endpoint.create("GET", PolarisResourcePaths.V1_GENERIC_TABLE); - public static final Endpoint V1_CREATE_GENERIC_ABLE = + public static final Endpoint V1_CREATE_GENERIC_TABLE = Endpoint.create("POST", PolarisResourcePaths.V1_GENERIC_TABLES); public static final Endpoint V1_DELETE_GENERIC_TABLE = Endpoint.create("DELETE", PolarisResourcePaths.V1_GENERIC_TABLE); 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 d904c8c7b5..c3e0ce7568 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 @@ -85,12 +85,13 @@ public void testGetConfig(boolean enableGenericTable) { ConfigResponse configResponse = response.readEntity(ConfigResponse.class); assertThat(configResponse.overrides()).contains(Map.entry("prefix", catalogName)); if (enableGenericTable) { - assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_CREATE_GENERIC_ABLE); + assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_CREATE_GENERIC_TABLE); assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_DELETE_GENERIC_TABLE); assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_LIST_GENERIC_TABLES); assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_LOAD_GENERIC_TABLE); } else { - assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoint.V1_CREATE_GENERIC_ABLE); + assertThat(configResponse.endpoints()) + .doesNotContain(PolarisEndpoint.V1_CREATE_GENERIC_TABLE); assertThat(configResponse.endpoints()) .doesNotContain(PolarisEndpoint.V1_DELETE_GENERIC_TABLE); assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoint.V1_LIST_GENERIC_TABLES); diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java index 7d9cbd8da4..6745aad94f 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java @@ -132,7 +132,7 @@ public class IcebergCatalogAdapter private static final Set GENERIC_TABLE_ENDPOINTS = ImmutableSet.builder() .add(PolarisEndpoint.V1_LIST_GENERIC_TABLES) - .add(PolarisEndpoint.V1_CREATE_GENERIC_ABLE) + .add(PolarisEndpoint.V1_CREATE_GENERIC_TABLE) .add(PolarisEndpoint.V1_DELETE_GENERIC_TABLE) .add(PolarisEndpoint.V1_LOAD_GENERIC_TABLE) .build(); From 2eacecdc9f36f1709698dc1ebd8c098598e64f8b Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Wed, 2 Apr 2025 11:05:08 -0700 Subject: [PATCH 05/12] address feedbacks --- ...arisEndpoint.java => PolarisEndpoints.java} | 12 +++++++++++- .../core/rest/PolarisResourcePathsTest.java | 2 +- .../service/quarkus/catalog/GetConfigTest.java | 18 +++++++++--------- .../catalog/iceberg/IcebergCatalogAdapter.java | 12 ++---------- 4 files changed, 23 insertions(+), 21 deletions(-) rename polaris-core/src/main/java/org/apache/polaris/core/rest/{PolarisEndpoint.java => PolarisEndpoints.java} (78%) diff --git a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java similarity index 78% rename from polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java rename to polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java index 09da26ad33..15041e70b2 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoint.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/rest/PolarisEndpoints.java @@ -18,9 +18,11 @@ */ package org.apache.polaris.core.rest; +import com.google.common.collect.ImmutableSet; +import java.util.Set; import org.apache.iceberg.rest.Endpoint; -public class PolarisEndpoint { +public class PolarisEndpoints { public static final Endpoint V1_LIST_GENERIC_TABLES = Endpoint.create("GET", PolarisResourcePaths.V1_GENERIC_TABLES); public static final Endpoint V1_LOAD_GENERIC_TABLE = @@ -29,4 +31,12 @@ public class PolarisEndpoint { Endpoint.create("POST", PolarisResourcePaths.V1_GENERIC_TABLES); public static final Endpoint V1_DELETE_GENERIC_TABLE = Endpoint.create("DELETE", PolarisResourcePaths.V1_GENERIC_TABLE); + + public static final Set GENERIC_TABLE_ENDPOINTS = + ImmutableSet.builder() + .add(V1_LIST_GENERIC_TABLES) + .add(V1_CREATE_GENERIC_TABLE) + .add(V1_DELETE_GENERIC_TABLE) + .add(V1_LOAD_GENERIC_TABLE) + .build(); } diff --git a/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java b/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java index 3a6224893e..4572bb515f 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/rest/PolarisResourcePathsTest.java @@ -27,7 +27,7 @@ import org.junit.jupiter.api.Test; public class PolarisResourcePathsTest { - private final String testPrefix = "polaris-test"; + private static final String testPrefix = "polaris-test"; private PolarisResourcePaths paths; 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 c3e0ce7568..9d6597d4ee 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 @@ -29,7 +29,7 @@ import java.util.Map; import org.apache.iceberg.rest.responses.ConfigResponse; import org.apache.polaris.core.admin.model.*; -import org.apache.polaris.core.rest.PolarisEndpoint; +import org.apache.polaris.core.rest.PolarisEndpoints; import org.apache.polaris.service.TestServices; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -85,17 +85,17 @@ public void testGetConfig(boolean enableGenericTable) { ConfigResponse configResponse = response.readEntity(ConfigResponse.class); assertThat(configResponse.overrides()).contains(Map.entry("prefix", catalogName)); if (enableGenericTable) { - assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_CREATE_GENERIC_TABLE); - assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_DELETE_GENERIC_TABLE); - assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_LIST_GENERIC_TABLES); - assertThat(configResponse.endpoints()).contains(PolarisEndpoint.V1_LOAD_GENERIC_TABLE); + assertThat(configResponse.endpoints()).contains(PolarisEndpoints.V1_CREATE_GENERIC_TABLE); + assertThat(configResponse.endpoints()).contains(PolarisEndpoints.V1_DELETE_GENERIC_TABLE); + assertThat(configResponse.endpoints()).contains(PolarisEndpoints.V1_LIST_GENERIC_TABLES); + assertThat(configResponse.endpoints()).contains(PolarisEndpoints.V1_LOAD_GENERIC_TABLE); } else { assertThat(configResponse.endpoints()) - .doesNotContain(PolarisEndpoint.V1_CREATE_GENERIC_TABLE); + .doesNotContain(PolarisEndpoints.V1_CREATE_GENERIC_TABLE); assertThat(configResponse.endpoints()) - .doesNotContain(PolarisEndpoint.V1_DELETE_GENERIC_TABLE); - assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoint.V1_LIST_GENERIC_TABLES); - assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoint.V1_LOAD_GENERIC_TABLE); + .doesNotContain(PolarisEndpoints.V1_DELETE_GENERIC_TABLE); + assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoints.V1_LIST_GENERIC_TABLES); + assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoints.V1_LOAD_GENERIC_TABLE); } } } diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java index 6745aad94f..5df7180af1 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java @@ -68,7 +68,7 @@ import org.apache.polaris.core.persistence.ResolvedPolarisEntity; import org.apache.polaris.core.persistence.resolver.Resolver; import org.apache.polaris.core.persistence.resolver.ResolverStatus; -import org.apache.polaris.core.rest.PolarisEndpoint; +import org.apache.polaris.core.rest.PolarisEndpoints; import org.apache.polaris.service.catalog.AccessDelegationMode; import org.apache.polaris.service.catalog.CatalogPrefixParser; import org.apache.polaris.service.catalog.api.IcebergRestCatalogApiService; @@ -129,14 +129,6 @@ public class IcebergCatalogAdapter .add(Endpoint.create("POST", ResourcePaths.V1_TRANSACTIONS_COMMIT)) .build(); - private static final Set GENERIC_TABLE_ENDPOINTS = - ImmutableSet.builder() - .add(PolarisEndpoint.V1_LIST_GENERIC_TABLES) - .add(PolarisEndpoint.V1_CREATE_GENERIC_TABLE) - .add(PolarisEndpoint.V1_DELETE_GENERIC_TABLE) - .add(PolarisEndpoint.V1_LOAD_GENERIC_TABLE) - .build(); - private final RealmContext realmContext; private final CallContext callContext; private final CallContextCatalogFactory catalogFactory; @@ -721,7 +713,7 @@ public Response getConfig( .getConfiguration( callContext.getPolarisCallContext(), FeatureConfiguration.ENABLE_GENERIC_TABLES); Set supportedGenericTableEndpoints = - genericTableEnabled ? GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); + genericTableEnabled ? PolarisEndpoints.GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); return Response.ok( ConfigResponse.builder() From 07b0e7224ade53ec935b858dfd68c7432858aab6 Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Wed, 2 Apr 2025 11:08:37 -0700 Subject: [PATCH 06/12] spotless --- .../apache/polaris/service/quarkus/catalog/GetConfigTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 9d6597d4ee..b4e969b5f8 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 @@ -94,7 +94,8 @@ public void testGetConfig(boolean enableGenericTable) { .doesNotContain(PolarisEndpoints.V1_CREATE_GENERIC_TABLE); assertThat(configResponse.endpoints()) .doesNotContain(PolarisEndpoints.V1_DELETE_GENERIC_TABLE); - assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoints.V1_LIST_GENERIC_TABLES); + assertThat(configResponse.endpoints()) + .doesNotContain(PolarisEndpoints.V1_LIST_GENERIC_TABLES); assertThat(configResponse.endpoints()).doesNotContain(PolarisEndpoints.V1_LOAD_GENERIC_TABLE); } } From 99af56ab4d7345f88f3f8bf7bf25d6b20239e76f Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Wed, 2 Apr 2025 11:20:24 -0700 Subject: [PATCH 07/12] move all functions to PolarisEndpoints --- .../polaris/core/rest/PolarisEndpoints.java | 18 ++++++++++++++++++ .../catalog/iceberg/IcebergCatalogAdapter.java | 13 +------------ 2 files changed, 19 insertions(+), 12 deletions(-) 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 15041e70b2..2ea49bd7bb 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 @@ -21,6 +21,8 @@ import com.google.common.collect.ImmutableSet; import java.util.Set; import org.apache.iceberg.rest.Endpoint; +import org.apache.polaris.core.config.FeatureConfiguration; +import org.apache.polaris.core.context.CallContext; public class PolarisEndpoints { public static final Endpoint V1_LIST_GENERIC_TABLES = @@ -39,4 +41,20 @@ public class PolarisEndpoints { .add(V1_DELETE_GENERIC_TABLE) .add(V1_LOAD_GENERIC_TABLE) .build(); + + /** + * Get the generic table endpoints. Returns GENERIC_TABLE_ENDPOINTS if ENABLE_GENERIC_TABLES is + * set to true, otherwise, returns an empty set. + */ + 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.getPolarisCallContext(), FeatureConfiguration.ENABLE_GENERIC_TABLES); + + return genericTableEnabled ? PolarisEndpoints.GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); + } } diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java index 5df7180af1..06d447860a 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java @@ -59,7 +59,6 @@ import org.apache.iceberg.rest.responses.LoadTableResponse; import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal; import org.apache.polaris.core.auth.PolarisAuthorizer; -import org.apache.polaris.core.config.FeatureConfiguration; import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.PolarisEntity; @@ -705,16 +704,6 @@ public Response getConfig( String prefix = prefixParser.catalogNameToPrefix(realmContext, warehouse); - // add the generic table endpoints as supported endpoints if generic table feature is enabled. - boolean genericTableEnabled = - callContext - .getPolarisCallContext() - .getConfigurationStore() - .getConfiguration( - callContext.getPolarisCallContext(), FeatureConfiguration.ENABLE_GENERIC_TABLES); - Set supportedGenericTableEndpoints = - genericTableEnabled ? PolarisEndpoints.GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); - return Response.ok( ConfigResponse.builder() .withDefaults(properties) // catalog properties are defaults @@ -724,7 +713,7 @@ public Response getConfig( .addAll(DEFAULT_ENDPOINTS) .addAll(VIEW_ENDPOINTS) .addAll(COMMIT_ENDPOINT) - .addAll(supportedGenericTableEndpoints) + .addAll(PolarisEndpoints.getSupportedGenericTableEndpoints(callContext)) .build()) .build()) .build(); From e33f97bc53f1208abcf49ece2f813953fd68989d Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Wed, 2 Apr 2025 11:29:45 -0700 Subject: [PATCH 08/12] remove extra line --- .../polaris/service/catalog/iceberg/IcebergCatalogAdapter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java index 06d447860a..d4a3adb306 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java @@ -703,7 +703,6 @@ public Response getConfig( PolarisEntity.of(resolvedReferenceCatalog.getEntity()).getPropertiesAsMap(); String prefix = prefixParser.catalogNameToPrefix(realmContext, warehouse); - return Response.ok( ConfigResponse.builder() .withDefaults(properties) // catalog properties are defaults From 2d4998864a9d323385f0cf0ff51f0e26c61c3c1d Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Wed, 2 Apr 2025 13:42:17 -0700 Subject: [PATCH 09/12] Trigger Build From 1a01f456d2e7ae887aa5db742f2050bffc785106 Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Wed, 2 Apr 2025 14:58:24 -0700 Subject: [PATCH 10/12] Trigger Build From ba292fc9fd607edb7d0740a3e4d271b62c963f02 Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Wed, 2 Apr 2025 18:29:36 -0700 Subject: [PATCH 11/12] remove extra --- .../java/org/apache/polaris/core/rest/PolarisEndpoints.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2ea49bd7bb..edbfb14149 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 @@ -55,6 +55,6 @@ public static Set getSupportedGenericTableEndpoints(CallContext callCo .getConfiguration( callContext.getPolarisCallContext(), FeatureConfiguration.ENABLE_GENERIC_TABLES); - return genericTableEnabled ? PolarisEndpoints.GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); + return genericTableEnabled ? GENERIC_TABLE_ENDPOINTS : ImmutableSet.of(); } } From 0557bde9be2d50a94aab6251c505572d4492a213 Mon Sep 17 00:00:00 2001 From: Yun Zou Date: Wed, 2 Apr 2025 19:24:06 -0700 Subject: [PATCH 12/12] fix test --- .../quarkus/catalog/GetConfigTest.java | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) 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 b4e969b5f8..5e77d6aea3 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 @@ -22,11 +22,10 @@ import static org.assertj.core.api.Assertions.assertThat; import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.QuarkusTestProfile; -import io.quarkus.test.junit.TestProfile; import jakarta.ws.rs.core.Response; import java.util.List; import java.util.Map; +import java.util.UUID; import org.apache.iceberg.rest.responses.ConfigResponse; import org.apache.polaris.core.admin.model.*; import org.apache.polaris.core.rest.PolarisEndpoints; @@ -35,21 +34,7 @@ import org.junit.jupiter.params.provider.ValueSource; @QuarkusTest -@TestProfile(GetConfigTest.Profile.class) public class GetConfigTest { - public static class Profile implements QuarkusTestProfile { - @Override - public Map getConfigOverrides() { - return Map.of( - "polaris.features.defaults.\"ALLOW_SPECIFYING_FILE_IO_IMPL\"", - "true", - "polaris.features.defaults.\"INITIALIZE_DEFAULT_CATALOG_FILEIO_FOR_TEST\"", - "true", - "polaris.features.defaults.\"SUPPORTED_CATALOG_STORAGE_TYPES\"", - "[\"FILE\"]"); - } - } - @ParameterizedTest @ValueSource(booleans = {true, false}) public void testGetConfig(boolean enableGenericTable) { @@ -60,7 +45,7 @@ public void testGetConfig(boolean enableGenericTable) { FileStorageConfigInfo.builder(StorageConfigInfo.StorageTypeEnum.FILE) .setAllowedLocations(List.of("file://")) .build(); - String catalogName = "test-catalog"; + String catalogName = "test-catalog-" + UUID.randomUUID(); Catalog catalog = PolarisCatalog.builder() .setType(Catalog.TypeEnum.INTERNAL)