Skip to content

Generic Table/Policy Store: Move feature config check to Adapter and some small refactoring #1465

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@
*/
package org.apache.polaris.service.catalog.common;

import jakarta.ws.rs.core.SecurityContext;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import org.apache.iceberg.catalog.Namespace;
import org.apache.iceberg.exceptions.NotAuthorizedException;
import org.apache.iceberg.rest.RESTUtil;
import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal;

/**
* A common interface for adapters between the REST interface and {@link CatalogHandler}
Expand All @@ -31,4 +34,11 @@ public interface CatalogAdapter {
default Namespace decodeNamespace(String namespace) {
return RESTUtil.decodeNamespace(URLEncoder.encode(namespace, Charset.defaultCharset()));
}

default void validatePrincipal(SecurityContext securityContext) {
var authenticatedPrincipal = (AuthenticatedPolarisPrincipal) securityContext.getUserPrincipal();
if (authenticatedPrincipal == null) {
throw new NotAuthorizedException("Failed to find authenticatedPrincipal in SecurityContext");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.exceptions.NotAuthorizedException;
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.persistence.PolarisEntityManager;
import org.apache.polaris.core.persistence.PolarisMetaStoreManager;
import org.apache.polaris.service.catalog.CatalogPrefixParser;
import org.apache.polaris.service.catalog.api.PolarisCatalogGenericTableApiService;
import org.apache.polaris.service.catalog.common.CatalogAdapter;
import org.apache.polaris.service.types.CreateGenericTableRequest;
Expand All @@ -44,36 +44,41 @@ public class GenericTableCatalogAdapter

private static final Logger LOGGER = LoggerFactory.getLogger(GenericTableCatalogAdapter.class);

private final RealmContext realmContext;
private final CallContext callContext;
private final PolarisEntityManager entityManager;
private final PolarisMetaStoreManager metaStoreManager;
private final PolarisAuthorizer polarisAuthorizer;
private final CatalogPrefixParser prefixParser;

@Inject
public GenericTableCatalogAdapter(
RealmContext realmContext,
CallContext callContext,
PolarisEntityManager entityManager,
PolarisMetaStoreManager metaStoreManager,
PolarisAuthorizer polarisAuthorizer) {
PolarisAuthorizer polarisAuthorizer,
CatalogPrefixParser prefixParser) {
this.realmContext = realmContext;
this.callContext = callContext;
this.entityManager = entityManager;
this.metaStoreManager = metaStoreManager;
this.polarisAuthorizer = polarisAuthorizer;
this.prefixParser = prefixParser;
}

private GenericTableCatalogHandler newHandlerWrapper(
SecurityContext securityContext, String catalogName) {
var authenticatedPrincipal = (AuthenticatedPolarisPrincipal) securityContext.getUserPrincipal();
if (authenticatedPrincipal == null) {
throw new NotAuthorizedException("Failed to find authenticatedPrincipal in SecurityContext");
}
SecurityContext securityContext, String prefix) {
FeatureConfiguration.enforceFeatureEnabledOrThrow(
callContext, FeatureConfiguration.ENABLE_GENERIC_TABLES);
validatePrincipal(securityContext);

return new GenericTableCatalogHandler(
callContext,
entityManager,
metaStoreManager,
securityContext,
catalogName,
prefixParser.prefixToCatalogName(realmContext, prefix),
polarisAuthorizer);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.polaris.core.auth.PolarisAuthorizableOperation;
import org.apache.polaris.core.auth.PolarisAuthorizer;
import org.apache.polaris.core.config.FeatureConfiguration;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.entity.PolarisEntitySubType;
import org.apache.polaris.core.entity.table.GenericTableEntity;
Expand Down Expand Up @@ -53,21 +52,8 @@ public GenericTableCatalogHandler(
this.metaStoreManager = metaStoreManager;
}

public void enforceGenericTablesEnabledOrThrow() {
boolean enabled =
callContext
.getPolarisCallContext()
.getConfigurationStore()
.getConfiguration(
callContext.getPolarisCallContext(), FeatureConfiguration.ENABLE_GENERIC_TABLES);
if (!enabled) {
throw new UnsupportedOperationException("Generic table support is not enabled");
}
}

@Override
protected void initializeCatalog() {
enforceGenericTablesEnabledOrThrow();
this.genericTableCatalog =
new GenericTableCatalog(metaStoreManager, callContext, this.resolutionManifest);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,11 +182,7 @@ private Response withCatalog(

private IcebergCatalogHandler newHandlerWrapper(
SecurityContext securityContext, String catalogName) {
AuthenticatedPolarisPrincipal authenticatedPrincipal =
(AuthenticatedPolarisPrincipal) securityContext.getUserPrincipal();
if (authenticatedPrincipal == null) {
throw new NotAuthorizedException("Failed to find authenticatedPrincipal in SecurityContext");
}
validatePrincipal(securityContext);

return new IcebergCatalogHandler(
callContext,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,9 @@
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
import org.apache.iceberg.catalog.Namespace;
import org.apache.iceberg.exceptions.NotAuthorizedException;
import org.apache.iceberg.rest.RESTUtil;
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.persistence.PolarisEntityManager;
Expand Down Expand Up @@ -74,10 +73,9 @@ public PolicyCatalogAdapter(
}

private PolicyCatalogHandler newHandlerWrapper(SecurityContext securityContext, String prefix) {
var authenticatedPrincipal = (AuthenticatedPolarisPrincipal) securityContext.getUserPrincipal();
if (authenticatedPrincipal == null) {
throw new NotAuthorizedException("Failed to find authenticatedPrincipal in SecurityContext");
}
FeatureConfiguration.enforceFeatureEnabledOrThrow(
callContext, FeatureConfiguration.ENABLE_POLICY_STORE);
validatePrincipal(securityContext);

return new PolicyCatalogHandler(
callContext,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
import org.apache.polaris.core.auth.PolarisAuthorizableOperation;
import org.apache.polaris.core.auth.PolarisAuthorizer;
import org.apache.polaris.core.catalog.PolarisCatalogHelpers;
import org.apache.polaris.core.config.FeatureConfiguration;
import org.apache.polaris.core.context.CallContext;
import org.apache.polaris.core.entity.PolarisEntitySubType;
import org.apache.polaris.core.entity.PolarisEntityType;
Expand Down Expand Up @@ -73,8 +72,6 @@ public PolicyCatalogHandler(

@Override
protected void initializeCatalog() {
FeatureConfiguration.enforceFeatureEnabledOrThrow(
callContext, FeatureConfiguration.ENABLE_POLICY_STORE);
this.policyCatalog = new PolicyCatalog(metaStoreManager, callContext, this.resolutionManifest);
}

Expand Down