diff --git a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/TestServices.java b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/TestServices.java index 6bc0be0a5f..153dc35a02 100644 --- a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/TestServices.java +++ b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/TestServices.java @@ -44,8 +44,6 @@ import org.apache.polaris.service.catalog.io.FileIOFactory; import org.apache.polaris.service.config.DefaultConfigurationStore; import org.apache.polaris.service.config.RealmEntityManagerFactory; -import org.apache.polaris.service.context.CallContextCatalogFactory; -import org.apache.polaris.service.context.PolarisCallContextCatalogFactory; import org.apache.polaris.service.persistence.InMemoryPolarisMetaStoreManagerFactory; import org.apache.polaris.service.quarkus.catalog.io.TestFileIOFactory; import org.apache.polaris.service.storage.PolarisStorageIntegrationProviderImpl; @@ -98,28 +96,19 @@ public static TestServices inMemory(FileIOFactory ioFactory, Map PolarisEntityManager entityManager = realmEntityManagerFactory.getOrCreateEntityManager(testRealm); - CallContextCatalogFactory callContextFactory = - new PolarisCallContextCatalogFactory( - entityManager, - metaStoreManager, - session, - configurationStore, - polarisDiagnostics, - Mockito.mock(TaskExecutor.class), - ioFactory); - PolarisAuthorizer authorizer = Mockito.mock(PolarisAuthorizer.class); IcebergRestCatalogApiService service = new IcebergCatalogAdapter( testRealm, - callContextFactory, entityManager, metaStoreManager, session, configurationStore, polarisDiagnostics, - authorizer); + authorizer, + Mockito.mock(TaskExecutor.class), + ioFactory); IcebergRestCatalogApi restApi = new IcebergRestCatalogApi(service); 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 ed802c9fc4..fcb6851b89 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,8 +26,6 @@ import io.quarkus.test.junit.QuarkusMock; import io.quarkus.test.junit.QuarkusTestProfile; import jakarta.annotation.Nonnull; -import jakarta.enterprise.context.RequestScoped; -import jakarta.enterprise.inject.Alternative; import jakarta.inject.Inject; import jakarta.ws.rs.core.SecurityContext; import java.io.IOException; @@ -39,7 +37,6 @@ import java.util.stream.Collectors; import org.apache.iceberg.CatalogProperties; import org.apache.iceberg.Schema; -import org.apache.iceberg.catalog.Catalog; import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.exceptions.ForbiddenException; @@ -68,17 +65,13 @@ import org.apache.polaris.core.persistence.PolarisEntityManager; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; import org.apache.polaris.core.persistence.PolarisMetaStoreSession; -import org.apache.polaris.core.persistence.resolver.PolarisResolutionManifest; import org.apache.polaris.service.admin.PolarisAdminService; import org.apache.polaris.service.catalog.BasePolarisCatalog; import org.apache.polaris.service.catalog.io.DefaultFileIOFactory; -import org.apache.polaris.service.catalog.io.FileIOFactory; import org.apache.polaris.service.config.DefaultConfigurationStore; import org.apache.polaris.service.config.RealmEntityManagerFactory; -import org.apache.polaris.service.context.PolarisCallContextCatalogFactory; import org.apache.polaris.service.quarkus.catalog.PolarisPassthroughResolutionView; import org.apache.polaris.service.storage.PolarisStorageIntegrationProviderImpl; -import org.apache.polaris.service.task.TaskExecutor; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -91,11 +84,6 @@ public abstract class PolarisAuthzTestBase { public static class Profile implements QuarkusTestProfile { - @Override - public Set> getEnabledAlternatives() { - return Set.of(TestPolarisCallContextCatalogFactory.class); - } - @Override public Map getConfigOverrides() { return Map.of( @@ -231,6 +219,8 @@ public void before(TestInfo testInfo) { .setName(CATALOG_NAME) .setCatalogType("INTERNAL") .setDefaultBaseLocation(storageLocation) + .addProperty( + CatalogProperties.FILE_IO_IMPL, "org.apache.iceberg.inmemory.InMemoryFileIO") .setStorageConfigurationInfo(storageConfigModel, storageLocation) .build()); @@ -331,7 +321,7 @@ public void after() { Mockito.when(securityContext.getUserPrincipal()).thenReturn(p); Set principalRoleNames = loadPrincipalRolesNames(p); Mockito.when(securityContext.isUserInRole(Mockito.anyString())) - .thenAnswer(invocation -> principalRoleNames.contains(invocation.getArgument(0))); + .thenAnswer(invocation -> principalRoleNames.contains((String) invocation.getArgument(0))); return securityContext; } @@ -413,53 +403,6 @@ private void initBaseCatalog() { CatalogProperties.FILE_IO_IMPL, "org.apache.iceberg.inmemory.InMemoryFileIO")); } - @Alternative - @RequestScoped - public static class TestPolarisCallContextCatalogFactory - extends PolarisCallContextCatalogFactory { - - public TestPolarisCallContextCatalogFactory() { - super(null, null, null, null, null, null, null); - } - - @Inject - public TestPolarisCallContextCatalogFactory( - PolarisEntityManager entityManager, - PolarisMetaStoreManager metaStoreManager, - PolarisMetaStoreSession metaStoreSession, - PolarisConfigurationStore configurationStore, - PolarisDiagnostics diagnostics, - TaskExecutor taskExecutor, - FileIOFactory fileIOFactory) { - super( - entityManager, - metaStoreManager, - metaStoreSession, - configurationStore, - diagnostics, - taskExecutor, - fileIOFactory); - } - - @Override - public Catalog createCallContextCatalog( - RealmContext realmContext, - AuthenticatedPolarisPrincipal authenticatedPolarisPrincipal, - SecurityContext securityContext, - final PolarisResolutionManifest resolvedManifest) { - // This depends on the BasePolarisCatalog allowing calling initialize multiple times - // to override the previous config. - Catalog catalog = - super.createCallContextCatalog( - realmContext, authenticatedPolarisPrincipal, securityContext, resolvedManifest); - catalog.initialize( - CATALOG_NAME, - ImmutableMap.of( - CatalogProperties.FILE_IO_IMPL, "org.apache.iceberg.inmemory.InMemoryFileIO")); - return catalog; - } - } - /** * Tests each "sufficient" privilege individually by invoking {@code grantAction} for each set of * privileges, running the action being tested, revoking after each test set, and also ensuring diff --git a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogHandlerWrapperAuthzTest.java b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogHandlerWrapperAuthzTest.java index 4cff22227a..4a78570e1a 100644 --- a/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogHandlerWrapperAuthzTest.java +++ b/quarkus/service/src/test/java/org/apache/polaris/service/quarkus/catalog/PolarisCatalogHandlerWrapperAuthzTest.java @@ -18,7 +18,6 @@ */ package org.apache.polaris.service.quarkus.catalog; -import com.google.common.collect.ImmutableMap; import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; import jakarta.ws.rs.core.SecurityContext; @@ -34,7 +33,6 @@ import org.apache.iceberg.SortOrder; import org.apache.iceberg.TableMetadata; import org.apache.iceberg.TableMetadataParser; -import org.apache.iceberg.catalog.Catalog; import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.exceptions.ForbiddenException; @@ -54,17 +52,13 @@ import org.apache.polaris.core.admin.model.PrincipalWithCredentialsCredentials; import org.apache.polaris.core.admin.model.StorageConfigInfo; import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal; -import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.CatalogEntity; import org.apache.polaris.core.entity.CatalogRoleEntity; import org.apache.polaris.core.entity.PolarisPrivilege; import org.apache.polaris.core.entity.PrincipalEntity; import org.apache.polaris.core.persistence.PolarisMetaStoreManager; -import org.apache.polaris.core.persistence.resolver.PolarisResolutionManifest; import org.apache.polaris.service.catalog.PolarisCatalogHandlerWrapper; import org.apache.polaris.service.catalog.io.DefaultFileIOFactory; -import org.apache.polaris.service.context.CallContextCatalogFactory; -import org.apache.polaris.service.context.PolarisCallContextCatalogFactory; import org.apache.polaris.service.quarkus.admin.PolarisAuthzTestBase; import org.apache.polaris.service.types.NotificationRequest; import org.apache.polaris.service.types.NotificationType; @@ -90,27 +84,24 @@ private PolarisCatalogHandlerWrapper newWrapper() { } private PolarisCatalogHandlerWrapper newWrapper(Set activatedPrincipalRoles) { - return newWrapper(activatedPrincipalRoles, CATALOG_NAME, newCatalogFactory()); + return newWrapper(activatedPrincipalRoles, CATALOG_NAME); } private PolarisCatalogHandlerWrapper newWrapper( - Set activatedPrincipalRoles, String catalogName, CallContextCatalogFactory factory) { + Set activatedPrincipalRoles, String catalogName) { final AuthenticatedPolarisPrincipal authenticatedPrincipal = new AuthenticatedPolarisPrincipal(principalEntity, activatedPrincipalRoles); - return new PolarisCatalogHandlerWrapper( - realmContext, - metaStoreSession, - configurationStore, - diagServices, - entityManager, - metaStoreManager, - securityContext(authenticatedPrincipal, activatedPrincipalRoles), - factory, - catalogName, - polarisAuthorizer); + SecurityContext securityContext = + securityContext(authenticatedPrincipal, activatedPrincipalRoles); + return newWrapper(securityContext, catalogName); } private PolarisCatalogHandlerWrapper newWrapper(SecurityContext securityContext) { + return newWrapper(securityContext, CATALOG_NAME); + } + + private PolarisCatalogHandlerWrapper newWrapper( + SecurityContext securityContext, String catalogName) { return new PolarisCatalogHandlerWrapper( realmContext, metaStoreSession, @@ -119,18 +110,8 @@ private PolarisCatalogHandlerWrapper newWrapper(SecurityContext securityContext) entityManager, metaStoreManager, securityContext, - newCatalogFactory(), - CATALOG_NAME, - polarisAuthorizer); - } - - private CallContextCatalogFactory newCatalogFactory() { - return new TestPolarisCallContextCatalogFactory( - entityManager, - metaStoreManager, - metaStoreSession, - configurationStore, - diagServices, + catalogName, + polarisAuthorizer, Mockito.mock(), new DefaultFileIOFactory()); } @@ -1637,6 +1618,8 @@ public void testSendNotificationSufficientPrivileges() { .setName(externalCatalog) .setDefaultBaseLocation(storageLocation) .setStorageConfigurationInfo(storageConfigModel, storageLocation) + .addProperty( + CatalogProperties.FILE_IO_IMPL, "org.apache.iceberg.inmemory.InMemoryFileIO") .setCatalogType("EXTERNAL") .build()); adminService.createCatalogRole( @@ -1699,48 +1682,23 @@ public void testSendNotificationSufficientPrivileges() { validatePayload.setTimestamp(530950845L); validateRequest.setPayload(validatePayload); - PolarisCallContextCatalogFactory factory = - new PolarisCallContextCatalogFactory( - entityManager, - metaStoreManager, - metaStoreSession, - configurationStore, - diagServices, - Mockito.mock(), - new DefaultFileIOFactory()) { - @Override - public Catalog createCallContextCatalog( - RealmContext realmContext, - AuthenticatedPolarisPrincipal authenticatedPolarisPrincipal, - SecurityContext securityContext, - PolarisResolutionManifest resolvedManifest) { - Catalog catalog = - super.createCallContextCatalog( - realmContext, authenticatedPolarisPrincipal, securityContext, resolvedManifest); - String fileIoImpl = "org.apache.iceberg.inmemory.InMemoryFileIO"; - catalog.initialize( - externalCatalog, ImmutableMap.of(CatalogProperties.FILE_IO_IMPL, fileIoImpl)); - - try (FileIO fileIO = - CatalogUtil.loadFileIO(fileIoImpl, Map.of(), new Configuration())) { - TableMetadata tableMetadata = - TableMetadata.buildFromEmpty() - .addSchema(SCHEMA, SCHEMA.highestFieldId()) - .setLocation( - String.format( - "%s/bucket/table/metadata/v1.metadata.json", storageLocation)) - .addPartitionSpec(PartitionSpec.unpartitioned()) - .addSortOrder(SortOrder.unsorted()) - .assignUUID() - .build(); - TableMetadataParser.overwrite( - tableMetadata, fileIO.newOutputFile(createPayload.getMetadataLocation())); - TableMetadataParser.overwrite( - tableMetadata, fileIO.newOutputFile(updatePayload.getMetadataLocation())); - } - return catalog; - } - }; + try (FileIO fileIO = + CatalogUtil.loadFileIO( + "org.apache.iceberg.inmemory.InMemoryFileIO", Map.of(), new Configuration())) { + TableMetadata tableMetadata = + TableMetadata.buildFromEmpty() + .addSchema(SCHEMA, SCHEMA.highestFieldId()) + .setLocation( + String.format("%s/bucket/table/metadata/v1.metadata.json", storageLocation)) + .addPartitionSpec(PartitionSpec.unpartitioned()) + .addSortOrder(SortOrder.unsorted()) + .assignUUID() + .build(); + TableMetadataParser.overwrite( + tableMetadata, fileIO.newOutputFile(createPayload.getMetadataLocation())); + TableMetadataParser.overwrite( + tableMetadata, fileIO.newOutputFile(updatePayload.getMetadataLocation())); + } List> sufficientPrivilegeSets = List.of( @@ -1764,19 +1722,18 @@ public Catalog createCallContextCatalog( doTestSufficientPrivilegeSets( sufficientPrivilegeSets, () -> { - newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog, factory) + newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog) .sendNotification(table, createRequest); - newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog, factory) + newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog) .sendNotification(table, updateRequest); - newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog, factory) - .sendNotification(table, dropRequest); - newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog, factory) + newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog).sendNotification(table, dropRequest); + newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog) .sendNotification(table, validateRequest); }, () -> { - newWrapper(Set.of(PRINCIPAL_ROLE2), externalCatalog, factory) + newWrapper(Set.of(PRINCIPAL_ROLE2), externalCatalog) .dropNamespace(Namespace.of("extns1", "extns2")); - newWrapper(Set.of(PRINCIPAL_ROLE2), externalCatalog, factory) + newWrapper(Set.of(PRINCIPAL_ROLE2), externalCatalog) .dropNamespace(Namespace.of("extns1")); }, PRINCIPAL_NAME, @@ -1786,7 +1743,7 @@ public Catalog createCallContextCatalog( doTestSufficientPrivilegeSets( sufficientPrivilegeSets, () -> { - newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog, factory) + newWrapper(Set.of(PRINCIPAL_ROLE1), externalCatalog) .sendNotification(table, validateRequest); }, null /* cleanupAction */, diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/IcebergCatalogAdapter.java b/service/common/src/main/java/org/apache/polaris/service/catalog/IcebergCatalogAdapter.java index 337b1f12f4..f03b8b03c9 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/IcebergCatalogAdapter.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/IcebergCatalogAdapter.java @@ -68,7 +68,8 @@ import org.apache.polaris.core.persistence.resolver.ResolverStatus; import org.apache.polaris.service.catalog.api.IcebergRestCatalogApiService; import org.apache.polaris.service.catalog.api.IcebergRestConfigurationApiService; -import org.apache.polaris.service.context.CallContextCatalogFactory; +import org.apache.polaris.service.catalog.io.FileIOFactory; +import org.apache.polaris.service.task.TaskExecutor; import org.apache.polaris.service.types.CommitTableRequest; import org.apache.polaris.service.types.CommitViewRequest; import org.apache.polaris.service.types.NotificationRequest; @@ -119,32 +120,35 @@ public class IcebergCatalogAdapter .build(); private final RealmContext realmContext; - private final CallContextCatalogFactory catalogFactory; private final PolarisMetaStoreManager metaStoreManager; private final PolarisEntityManager entityManager; private final PolarisMetaStoreSession session; private final PolarisConfigurationStore configurationStore; private final PolarisDiagnostics diagnostics; private final PolarisAuthorizer polarisAuthorizer; + private final TaskExecutor taskExecutor; + private final FileIOFactory fileIOFactory; @Inject public IcebergCatalogAdapter( RealmContext realmContext, - CallContextCatalogFactory catalogFactory, PolarisEntityManager entityManager, PolarisMetaStoreManager metaStoreManager, PolarisMetaStoreSession session, PolarisConfigurationStore configurationStore, PolarisDiagnostics diagnostics, - PolarisAuthorizer polarisAuthorizer) { + PolarisAuthorizer polarisAuthorizer, + TaskExecutor taskExecutor, + FileIOFactory fileIOFactory) { this.realmContext = realmContext; - this.catalogFactory = catalogFactory; this.entityManager = entityManager; this.metaStoreManager = metaStoreManager; this.session = session; this.configurationStore = configurationStore; this.diagnostics = diagnostics; this.polarisAuthorizer = polarisAuthorizer; + this.taskExecutor = taskExecutor; + this.fileIOFactory = fileIOFactory; } /** @@ -182,9 +186,10 @@ private PolarisCatalogHandlerWrapper newHandlerWrapper( entityManager, metaStoreManager, securityContext, - catalogFactory, catalogName, - polarisAuthorizer); + polarisAuthorizer, + taskExecutor, + fileIOFactory); } @Override diff --git a/service/common/src/main/java/org/apache/polaris/service/catalog/PolarisCatalogHandlerWrapper.java b/service/common/src/main/java/org/apache/polaris/service/catalog/PolarisCatalogHandlerWrapper.java index 95c8c48561..26befcedc6 100644 --- a/service/common/src/main/java/org/apache/polaris/service/catalog/PolarisCatalogHandlerWrapper.java +++ b/service/common/src/main/java/org/apache/polaris/service/catalog/PolarisCatalogHandlerWrapper.java @@ -20,21 +20,26 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Maps; +import jakarta.annotation.Nonnull; import jakarta.ws.rs.core.SecurityContext; import java.io.Closeable; import java.io.IOException; +import java.nio.file.Paths; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import org.apache.iceberg.BaseMetadataTable; import org.apache.iceberg.BaseTable; +import org.apache.iceberg.CatalogProperties; import org.apache.iceberg.MetadataUpdate; import org.apache.iceberg.PartitionSpec; import org.apache.iceberg.SortOrder; @@ -79,6 +84,7 @@ import org.apache.polaris.core.catalog.PolarisCatalogHelpers; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.entity.CatalogEntity; +import org.apache.polaris.core.entity.PolarisBaseEntity; import org.apache.polaris.core.entity.PolarisEntitySubType; import org.apache.polaris.core.entity.PolarisEntityType; import org.apache.polaris.core.persistence.PolarisEntityManager; @@ -90,7 +96,8 @@ import org.apache.polaris.core.persistence.resolver.ResolverPath; import org.apache.polaris.core.persistence.resolver.ResolverStatus; import org.apache.polaris.core.storage.PolarisStorageActions; -import org.apache.polaris.service.context.CallContextCatalogFactory; +import org.apache.polaris.service.catalog.io.FileIOFactory; +import org.apache.polaris.service.task.TaskExecutor; import org.apache.polaris.service.types.NotificationRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -123,7 +130,8 @@ public class PolarisCatalogHandlerWrapper implements AutoCloseable { private final AuthenticatedPolarisPrincipal authenticatedPrincipal; private final SecurityContext securityContext; private final PolarisAuthorizer authorizer; - private final CallContextCatalogFactory catalogFactory; + private final TaskExecutor taskExecutor; + private final FileIOFactory fileIOFactory; // Initialized in the authorize methods. private PolarisResolutionManifest resolutionManifest = null; @@ -142,9 +150,10 @@ public PolarisCatalogHandlerWrapper( PolarisEntityManager entityManager, PolarisMetaStoreManager metaStoreManager, SecurityContext securityContext, - CallContextCatalogFactory catalogFactory, String catalogName, - PolarisAuthorizer authorizer) { + PolarisAuthorizer authorizer, + TaskExecutor taskExecutor, + FileIOFactory fileIOFactory) { this.realmContext = realmContext; this.session = session; this.entityManager = entityManager; @@ -162,7 +171,8 @@ public PolarisCatalogHandlerWrapper( this.authenticatedPrincipal = (AuthenticatedPolarisPrincipal) securityContext.getUserPrincipal(); this.authorizer = authorizer; - this.catalogFactory = catalogFactory; + this.taskExecutor = taskExecutor; + this.fileIOFactory = fileIOFactory; } /** @@ -194,14 +204,53 @@ public void close() throws IOException { } private void initializeCatalog() { - this.baseCatalog = - catalogFactory.createCallContextCatalog( - realmContext, authenticatedPrincipal, securityContext, resolutionManifest); + PolarisBaseEntity baseCatalogEntity = + resolutionManifest.getResolvedReferenceCatalogEntity().getRawLeafEntity(); + CatalogEntity catalog = CatalogEntity.of(baseCatalogEntity); + + String realm = realmContext.getRealmIdentifier(); + String catalogKey = realm + "/" + catalogName; + LOGGER.info("Initializing new BasePolarisCatalog for key: {}", catalogKey); + + Map catalogProperties = new HashMap<>(catalog.getPropertiesAsMap()); + String defaultBaseLocation = catalog.getDefaultBaseLocation(); + LOGGER.info("Looked up defaultBaseLocation {} for catalog {}", defaultBaseLocation, catalogKey); + catalogProperties.put( + CatalogProperties.WAREHOUSE_LOCATION, + Objects.requireNonNullElseGet( + defaultBaseLocation, + () -> Paths.get(WAREHOUSE_LOCATION_BASEDIR, catalogKey).toString())); + + this.baseCatalog = createBasePolarisCatalog(catalogProperties); this.namespaceCatalog = (baseCatalog instanceof SupportsNamespaces) ? (SupportsNamespaces) baseCatalog : null; this.viewCatalog = (baseCatalog instanceof ViewCatalog) ? (ViewCatalog) baseCatalog : null; } + private static final String WAREHOUSE_LOCATION_BASEDIR = + "/tmp/iceberg_rest_server_warehouse_data/"; + + @Nonnull + protected Catalog createBasePolarisCatalog(Map catalogProperties) { + + BasePolarisCatalog catalogInstance = + new BasePolarisCatalog( + realmContext, + entityManager, + metaStoreManager, + session, + configurationStore, + diagnostics, + resolutionManifest, + securityContext, + taskExecutor, + fileIOFactory); + + // TODO: The initialize properties might need to take more from the CatalogEntity. + catalogInstance.initialize(catalogName, catalogProperties); + return catalogInstance; + } + private void authorizeBasicNamespaceOperationOrThrow( PolarisAuthorizableOperation op, Namespace namespace) { authorizeBasicNamespaceOperationOrThrow(op, namespace, null, null); diff --git a/service/common/src/main/java/org/apache/polaris/service/context/CallContextCatalogFactory.java b/service/common/src/main/java/org/apache/polaris/service/context/CallContextCatalogFactory.java deleted file mode 100644 index b300aa322b..0000000000 --- a/service/common/src/main/java/org/apache/polaris/service/context/CallContextCatalogFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.context; - -import jakarta.ws.rs.core.SecurityContext; -import org.apache.iceberg.catalog.Catalog; -import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal; -import org.apache.polaris.core.context.RealmContext; -import org.apache.polaris.core.persistence.resolver.PolarisResolutionManifest; - -public interface CallContextCatalogFactory { - Catalog createCallContextCatalog( - RealmContext realmContext, - AuthenticatedPolarisPrincipal authenticatedPrincipal, - SecurityContext securityContext, - PolarisResolutionManifest resolvedManifest); -} diff --git a/service/common/src/main/java/org/apache/polaris/service/context/PolarisCallContextCatalogFactory.java b/service/common/src/main/java/org/apache/polaris/service/context/PolarisCallContextCatalogFactory.java deleted file mode 100644 index 85773a3bc8..0000000000 --- a/service/common/src/main/java/org/apache/polaris/service/context/PolarisCallContextCatalogFactory.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * 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.context; - -import jakarta.enterprise.context.RequestScoped; -import jakarta.inject.Inject; -import jakarta.ws.rs.core.SecurityContext; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import org.apache.iceberg.CatalogProperties; -import org.apache.iceberg.catalog.Catalog; -import org.apache.polaris.core.PolarisConfigurationStore; -import org.apache.polaris.core.PolarisDiagnostics; -import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal; -import org.apache.polaris.core.context.RealmContext; -import org.apache.polaris.core.entity.CatalogEntity; -import org.apache.polaris.core.entity.PolarisBaseEntity; -import org.apache.polaris.core.persistence.PolarisEntityManager; -import org.apache.polaris.core.persistence.PolarisMetaStoreManager; -import org.apache.polaris.core.persistence.PolarisMetaStoreSession; -import org.apache.polaris.core.persistence.resolver.PolarisResolutionManifest; -import org.apache.polaris.service.catalog.BasePolarisCatalog; -import org.apache.polaris.service.catalog.io.FileIOFactory; -import org.apache.polaris.service.task.TaskExecutor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@RequestScoped -public class PolarisCallContextCatalogFactory implements CallContextCatalogFactory { - private static final Logger LOGGER = - LoggerFactory.getLogger(PolarisCallContextCatalogFactory.class); - - private static final String WAREHOUSE_LOCATION_BASEDIR = - "/tmp/iceberg_rest_server_warehouse_data/"; - - private final PolarisEntityManager entityManager; - private final PolarisMetaStoreManager metaStoreManager; - private final PolarisMetaStoreSession metaStoreSession; - private final PolarisConfigurationStore configurationStore; - private final PolarisDiagnostics diagnostics; - private final TaskExecutor taskExecutor; - private final FileIOFactory fileIOFactory; - - @Inject - public PolarisCallContextCatalogFactory( - PolarisEntityManager entityManager, - PolarisMetaStoreManager metaStoreManager, - PolarisMetaStoreSession metaStoreSession, - PolarisConfigurationStore configurationStore, - PolarisDiagnostics diagnostics, - TaskExecutor taskExecutor, - FileIOFactory fileIOFactory) { - this.entityManager = entityManager; - this.metaStoreManager = metaStoreManager; - this.metaStoreSession = metaStoreSession; - this.configurationStore = configurationStore; - this.diagnostics = diagnostics; - this.taskExecutor = taskExecutor; - this.fileIOFactory = fileIOFactory; - } - - @Override - public Catalog createCallContextCatalog( - RealmContext realmContext, - AuthenticatedPolarisPrincipal authenticatedPrincipal, - SecurityContext securityContext, - final PolarisResolutionManifest resolvedManifest) { - PolarisBaseEntity baseCatalogEntity = - resolvedManifest.getResolvedReferenceCatalogEntity().getRawLeafEntity(); - String catalogName = baseCatalogEntity.getName(); - - String realm = realmContext.getRealmIdentifier(); - String catalogKey = realm + "/" + catalogName; - LOGGER.info("Initializing new BasePolarisCatalog for key: {}", catalogKey); - - BasePolarisCatalog catalogInstance = - new BasePolarisCatalog( - realmContext, - entityManager, - metaStoreManager, - metaStoreSession, - configurationStore, - diagnostics, - resolvedManifest, - securityContext, - taskExecutor, - fileIOFactory); - - CatalogEntity catalog = CatalogEntity.of(baseCatalogEntity); - Map catalogProperties = new HashMap<>(catalog.getPropertiesAsMap()); - String defaultBaseLocation = catalog.getDefaultBaseLocation(); - LOGGER.info("Looked up defaultBaseLocation {} for catalog {}", defaultBaseLocation, catalogKey); - catalogProperties.put( - CatalogProperties.WAREHOUSE_LOCATION, - Objects.requireNonNullElseGet( - defaultBaseLocation, - () -> Paths.get(WAREHOUSE_LOCATION_BASEDIR, catalogKey).toString())); - - // TODO: The initialize properties might need to take more from CallContext and the - // CatalogEntity. - catalogInstance.initialize(catalogName, catalogProperties); - - return catalogInstance; - } -}