This is an automated email from the ASF dual-hosted git repository.
adutra pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new 261c4fa0 Pass RealmContext instance to all API methods (#566)
261c4fa0 is described below
commit 261c4fa05fa577a22af3f9e116b495c3ed119f6c
Author: Alexandre Dutra <[email protected]>
AuthorDate: Thu Dec 19 13:55:42 2024 +0100
Pass RealmContext instance to all API methods (#566)
---
api/iceberg-service/build.gradle.kts | 2 +
api/management-service/build.gradle.kts | 1 +
server-templates/api.mustache | 6 +-
server-templates/apiService.mustache | 4 +-
server-templates/apiServiceImpl.mustache | 4 +-
.../polaris/service/admin/PolarisServiceImpl.java | 183 +++++++++++++--------
.../service/auth/DefaultOAuth2ApiService.java | 6 +-
.../polaris/service/auth/TestOAuth2ApiService.java | 12 +-
.../service/catalog/BasePolarisCatalog.java | 5 +-
.../service/catalog/IcebergCatalogAdapter.java | 147 +++++++++++------
10 files changed, 242 insertions(+), 128 deletions(-)
diff --git a/api/iceberg-service/build.gradle.kts
b/api/iceberg-service/build.gradle.kts
index 09201bff..0b05626e 100644
--- a/api/iceberg-service/build.gradle.kts
+++ b/api/iceberg-service/build.gradle.kts
@@ -23,6 +23,8 @@ plugins {
}
dependencies {
+ implementation(project(":polaris-core"))
+
implementation(platform(libs.iceberg.bom))
implementation("org.apache.iceberg:iceberg-api")
implementation("org.apache.iceberg:iceberg-core")
diff --git a/api/management-service/build.gradle.kts
b/api/management-service/build.gradle.kts
index d0a6315d..548c1259 100644
--- a/api/management-service/build.gradle.kts
+++ b/api/management-service/build.gradle.kts
@@ -24,6 +24,7 @@ plugins {
dependencies {
implementation(project(":polaris-api-management-model"))
+ implementation(project(":polaris-core"))
compileOnly(platform(libs.jackson.bom))
compileOnly("com.fasterxml.jackson.core:jackson-annotations")
diff --git a/server-templates/api.mustache b/server-templates/api.mustache
index e84ab9db..5979bf8b 100644
--- a/server-templates/api.mustache
+++ b/server-templates/api.mustache
@@ -54,6 +54,8 @@ import {{javaxPackage}}.ws.rs.core.SecurityContext;
import {{javaxPackage}}.inject.Inject;
+import org.apache.polaris.core.context.RealmContext;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -105,7 +107,7 @@ public class {{classname}} {
@Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}},
{{/-last}}{{/produces}} }){{/hasProduces}}{{#hasAuthMethods}}
{{#authMethods}}{{#isOAuth}}@RolesAllowed({
{{#scopes}}"{{scope}}"{{^-last}}, {{/-last}}{{/scopes}}
}){{/isOAuth}}{{/authMethods}}{{/hasAuthMethods}}
@Timed("{{metricsPrefix}}.{{baseName}}.{{nickname}}")
- public Response {{nickname}}({{#isMultipart}}MultipartFormDataInput
input,{{/isMultipart}}{{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{^isMultipart}}{{>formParams}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}@Context
SecurityContext securityContext) {
+ public Response {{nickname}}({{#isMultipart}}MultipartFormDataInput
input,{{/isMultipart}}{{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{^isMultipart}}{{>formParams}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}@Context
RealmContext realmContext,@Context SecurityContext securityContext) {
{{! Don't log form or header params in case there are secrets, e.g., OAuth
tokens }}
LOGGER.atDebug().setMessage("Invoking {{baseName}} with params")
.addKeyValue("operation",
"{{nickname}}"){{#allParams}}{{^isHeaderParam}}{{^isFormParam}}
@@ -113,7 +115,7 @@ public class {{classname}} {
.log();
Response ret =
-
service.{{nickname}}({{#isMultipart}}input,{{/isMultipart}}{{#allParams}}{{^isMultipart}}{{paramName}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}}{{paramName}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}securityContext);
+
service.{{nickname}}({{#isMultipart}}input,{{/isMultipart}}{{#allParams}}{{^isMultipart}}{{paramName}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}}{{paramName}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}realmContext,securityContext);
LOGGER.debug("Completed execution of {{nickname}} API with status code
{}", ret.getStatus());
return ret;
}
diff --git a/server-templates/apiService.mustache
b/server-templates/apiService.mustache
index 27b1211b..19e9e8d6 100644
--- a/server-templates/apiService.mustache
+++ b/server-templates/apiService.mustache
@@ -35,6 +35,8 @@ import {{javaxPackage}}.validation.Valid;
import {{javaxPackage}}.ws.rs.core.Response;
import {{javaxPackage}}.ws.rs.core.SecurityContext;
+import org.apache.polaris.core.context.RealmContext;
+
{{!
Note that this template is copied from
https://github.com/OpenAPITools/openapi-generator/blob/783e68c7acbbdcbb2282d167d1644b069f12d486/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/apiService.mustache
It is here to remove some unsupported imports and to update the default
implementation to return a
@@ -52,7 +54,7 @@ It is here to remove some unsupported imports and to update
the default implemen
{{#operations}}
public interface {{classname}}Service {
{{#operation}}
- default Response {{nickname}}({{#isMultipart}}MultipartFormDataInput
input,{{/isMultipart}}{{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{^isMultipart}}{{>serviceFormParams}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}SecurityContext
securityContext) {
+ default Response {{nickname}}({{#isMultipart}}MultipartFormDataInput
input,{{/isMultipart}}{{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{^isMultipart}}{{>serviceFormParams}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}RealmContext
realmContext,SecurityContext securityContext) {
return Response.status(501).build(); // not implemented
}
{{/operation}}
diff --git a/server-templates/apiServiceImpl.mustache
b/server-templates/apiServiceImpl.mustache
index 80ae2018..4eb50646 100644
--- a/server-templates/apiServiceImpl.mustache
+++ b/server-templates/apiServiceImpl.mustache
@@ -36,6 +36,8 @@ import {{javaxPackage}}.validation.Valid;
import {{javaxPackage}}.ws.rs.core.Response;
import {{javaxPackage}}.ws.rs.core.SecurityContext;
+import org.apache.polaris.core.context.RealmContext;
+
{{!
Note that this template is copied from
https://github.com/OpenAPITools/openapi-generator/blob/783e68c7acbbdcbb2282d167d1644b069f12d486/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/apiServiceImpl.mustache
It is here to remove some unsupported imports (ApiResponseMessage,
openapi.tools.*)
@@ -53,7 +55,7 @@ It is here to remove some unsupported imports
(ApiResponseMessage, openapi.tools
{{#operations}}
public class {{classname}}ServiceImpl implements {{classname}}Service {
{{#operation}}
- public Response {{nickname}}({{#isMultipart}}MultipartFormDataInput
input,{{/isMultipart}}{{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{^isMultipart}}{{>serviceFormParams}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}SecurityContext
securityContext) {
+ public Response {{nickname}}({{#isMultipart}}MultipartFormDataInput
input,{{/isMultipart}}{{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{^isMultipart}}{{>serviceFormParams}},{{/isMultipart}}{{#isMultipart}}{{^isFormParam}},{{/isFormParam}}{{/isMultipart}}{{/allParams}}RealmContext
realmContext,SecurityContext securityContext) {
return Response.status(501).build(); // not implemented
}
{{/operation}}
diff --git
a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java
b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java
index 7d6901d4..49b7a3bb 100644
---
a/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java
+++
b/service/common/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java
@@ -58,6 +58,7 @@ import org.apache.polaris.core.admin.model.ViewGrant;
import org.apache.polaris.core.auth.AuthenticatedPolarisPrincipal;
import org.apache.polaris.core.auth.PolarisAuthorizer;
import org.apache.polaris.core.context.CallContext;
+import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.entity.CatalogEntity;
import org.apache.polaris.core.entity.CatalogRoleEntity;
import org.apache.polaris.core.entity.PolarisPrivilege;
@@ -93,8 +94,8 @@ public class PolarisServiceImpl
this.polarisAuthorizer = polarisAuthorizer;
}
- private PolarisAdminService newAdminService(SecurityContext securityContext)
{
- CallContext callContext = CallContext.getCurrentContext();
+ private PolarisAdminService newAdminService(
+ RealmContext realmContext, SecurityContext securityContext) {
AuthenticatedPolarisPrincipal authenticatedPrincipal =
(AuthenticatedPolarisPrincipal) securityContext.getUserPrincipal();
if (authenticatedPrincipal == null) {
@@ -102,17 +103,23 @@ public class PolarisServiceImpl
}
PolarisEntityManager entityManager =
-
entityManagerFactory.getOrCreateEntityManager(callContext.getRealmContext());
+ entityManagerFactory.getOrCreateEntityManager(realmContext);
PolarisMetaStoreManager metaStoreManager =
-
metaStoreManagerFactory.getOrCreateMetaStoreManager(callContext.getRealmContext());
+ metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
return new PolarisAdminService(
- callContext, entityManager, metaStoreManager, authenticatedPrincipal,
polarisAuthorizer);
+ // FIXME remove call to CallContext.getCurrentContext()
+ CallContext.getCurrentContext(),
+ entityManager,
+ metaStoreManager,
+ authenticatedPrincipal,
+ polarisAuthorizer);
}
/** From PolarisCatalogsApiService */
@Override
- public Response createCatalog(CreateCatalogRequest request, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response createCatalog(
+ CreateCatalogRequest request, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
Catalog catalog = request.getCatalog();
validateStorageConfig(catalog.getStorageConfigInfo());
Catalog newCatalog =
@@ -123,8 +130,7 @@ public class PolarisServiceImpl
}
private void validateStorageConfig(StorageConfigInfo storageConfigInfo) {
- CallContext callContext = CallContext.getCurrentContext();
- PolarisCallContext polarisCallContext =
callContext.getPolarisCallContext();
+ PolarisCallContext polarisCallContext =
CallContext.getCurrentContext().getPolarisCallContext();
List<String> allowedStorageTypes =
polarisCallContext
.getConfigurationStore()
@@ -142,24 +148,29 @@ public class PolarisServiceImpl
/** From PolarisCatalogsApiService */
@Override
- public Response deleteCatalog(String catalogName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response deleteCatalog(
+ String catalogName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
adminService.deleteCatalog(catalogName);
return Response.status(Response.Status.NO_CONTENT).build();
}
/** From PolarisCatalogsApiService */
@Override
- public Response getCatalog(String catalogName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response getCatalog(
+ String catalogName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
return
Response.ok(adminService.getCatalog(catalogName).asCatalog()).build();
}
/** From PolarisCatalogsApiService */
@Override
public Response updateCatalog(
- String catalogName, UpdateCatalogRequest updateRequest, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String catalogName,
+ UpdateCatalogRequest updateRequest,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
if (updateRequest.getStorageConfigInfo() != null) {
validateStorageConfig(updateRequest.getStorageConfigInfo());
}
@@ -168,8 +179,8 @@ public class PolarisServiceImpl
/** From PolarisCatalogsApiService */
@Override
- public Response listCatalogs(SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response listCatalogs(RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
List<Catalog> catalogList =
adminService.listCatalogs().stream()
.map(CatalogEntity::new)
@@ -182,8 +193,9 @@ public class PolarisServiceImpl
/** From PolarisPrincipalsApiService */
@Override
- public Response createPrincipal(CreatePrincipalRequest request,
SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response createPrincipal(
+ CreatePrincipalRequest request, RealmContext realmContext,
SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
PrincipalEntity principal =
PrincipalEntity.fromPrincipal(request.getPrincipal());
if (Boolean.TRUE.equals(request.getCredentialRotationRequired())) {
principal =
@@ -196,39 +208,45 @@ public class PolarisServiceImpl
/** From PolarisPrincipalsApiService */
@Override
- public Response deletePrincipal(String principalName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response deletePrincipal(
+ String principalName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
adminService.deletePrincipal(principalName);
return Response.status(Response.Status.NO_CONTENT).build();
}
/** From PolarisPrincipalsApiService */
@Override
- public Response getPrincipal(String principalName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response getPrincipal(
+ String principalName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
return
Response.ok(adminService.getPrincipal(principalName).asPrincipal()).build();
}
/** From PolarisPrincipalsApiService */
@Override
public Response updatePrincipal(
- String principalName, UpdatePrincipalRequest updateRequest,
SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String principalName,
+ UpdatePrincipalRequest updateRequest,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
return Response.ok(adminService.updatePrincipal(principalName,
updateRequest).asPrincipal())
.build();
}
/** From PolarisPrincipalsApiService */
@Override
- public Response rotateCredentials(String principalName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response rotateCredentials(
+ String principalName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
return Response.ok(adminService.rotateCredentials(principalName)).build();
}
/** From PolarisPrincipalsApiService */
@Override
- public Response listPrincipals(SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response listPrincipals(RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
List<Principal> principalList =
adminService.listPrincipals().stream()
.map(PrincipalEntity::new)
@@ -242,8 +260,10 @@ public class PolarisServiceImpl
/** From PolarisPrincipalRolesApiService */
@Override
public Response createPrincipalRole(
- CreatePrincipalRoleRequest request, SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ CreatePrincipalRoleRequest request,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
PrincipalRole newPrincipalRole =
new PrincipalRoleEntity(
adminService.createPrincipalRole(
@@ -255,16 +275,18 @@ public class PolarisServiceImpl
/** From PolarisPrincipalRolesApiService */
@Override
- public Response deletePrincipalRole(String principalRoleName,
SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response deletePrincipalRole(
+ String principalRoleName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
adminService.deletePrincipalRole(principalRoleName);
return Response.status(Response.Status.NO_CONTENT).build();
}
/** From PolarisPrincipalRolesApiService */
@Override
- public Response getPrincipalRole(String principalRoleName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response getPrincipalRole(
+ String principalRoleName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
return
Response.ok(adminService.getPrincipalRole(principalRoleName).asPrincipalRole()).build();
}
@@ -273,8 +295,9 @@ public class PolarisServiceImpl
public Response updatePrincipalRole(
String principalRoleName,
UpdatePrincipalRoleRequest updateRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
return Response.ok(
adminService.updatePrincipalRole(principalRoleName,
updateRequest).asPrincipalRole())
.build();
@@ -282,8 +305,8 @@ public class PolarisServiceImpl
/** From PolarisPrincipalRolesApiService */
@Override
- public Response listPrincipalRoles(SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response listPrincipalRoles(RealmContext realmContext,
SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
List<PrincipalRole> principalRoleList =
adminService.listPrincipalRoles().stream()
.map(PrincipalRoleEntity::new)
@@ -297,8 +320,11 @@ public class PolarisServiceImpl
/** From PolarisCatalogsApiService */
@Override
public Response createCatalogRole(
- String catalogName, CreateCatalogRoleRequest request, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String catalogName,
+ CreateCatalogRoleRequest request,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
CatalogRole newCatalogRole =
new CatalogRoleEntity(
adminService.createCatalogRole(
@@ -311,8 +337,11 @@ public class PolarisServiceImpl
/** From PolarisCatalogsApiService */
@Override
public Response deleteCatalogRole(
- String catalogName, String catalogRoleName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String catalogName,
+ String catalogRoleName,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
adminService.deleteCatalogRole(catalogName, catalogRoleName);
return Response.status(Response.Status.NO_CONTENT).build();
}
@@ -320,8 +349,11 @@ public class PolarisServiceImpl
/** From PolarisCatalogsApiService */
@Override
public Response getCatalogRole(
- String catalogName, String catalogRoleName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String catalogName,
+ String catalogRoleName,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
return Response.ok(adminService.getCatalogRole(catalogName,
catalogRoleName).asCatalogRole())
.build();
}
@@ -332,8 +364,9 @@ public class PolarisServiceImpl
String catalogName,
String catalogRoleName,
UpdateCatalogRoleRequest updateRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
return Response.ok(
adminService
.updateCatalogRole(catalogName, catalogRoleName, updateRequest)
@@ -343,8 +376,9 @@ public class PolarisServiceImpl
/** From PolarisCatalogsApiService */
@Override
- public Response listCatalogRoles(String catalogName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ public Response listCatalogRoles(
+ String catalogName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
List<CatalogRole> catalogRoleList =
adminService.listCatalogRoles(catalogName).stream()
.map(CatalogRoleEntity::new)
@@ -358,12 +392,15 @@ public class PolarisServiceImpl
/** From PolarisPrincipalsApiService */
@Override
public Response assignPrincipalRole(
- String principalName, GrantPrincipalRoleRequest request, SecurityContext
securityContext) {
+ String principalName,
+ GrantPrincipalRoleRequest request,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
LOGGER.info(
"Assigning principalRole {} to principal {}",
request.getPrincipalRole().getName(),
principalName);
- PolarisAdminService adminService = newAdminService(securityContext);
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
adminService.assignPrincipalRole(principalName,
request.getPrincipalRole().getName());
return Response.status(Response.Status.CREATED).build();
}
@@ -371,9 +408,12 @@ public class PolarisServiceImpl
/** From PolarisPrincipalsApiService */
@Override
public Response revokePrincipalRole(
- String principalName, String principalRoleName, SecurityContext
securityContext) {
+ String principalName,
+ String principalRoleName,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
LOGGER.info("Revoking principalRole {} from principal {}",
principalRoleName, principalName);
- PolarisAdminService adminService = newAdminService(securityContext);
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
adminService.revokePrincipalRole(principalName, principalRoleName);
return Response.status(Response.Status.NO_CONTENT).build();
}
@@ -381,8 +421,8 @@ public class PolarisServiceImpl
/** From PolarisPrincipalsApiService */
@Override
public Response listPrincipalRolesAssigned(
- String principalName, SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String principalName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
List<PrincipalRole> principalRoleList =
adminService.listPrincipalRolesAssigned(principalName).stream()
.map(PrincipalRoleEntity::new)
@@ -399,13 +439,14 @@ public class PolarisServiceImpl
String principalRoleName,
String catalogName,
GrantCatalogRoleRequest request,
+ RealmContext realmContext,
SecurityContext securityContext) {
LOGGER.info(
"Assigning catalogRole {} in catalog {} to principalRole {}",
request.getCatalogRole().getName(),
catalogName,
principalRoleName);
- PolarisAdminService adminService = newAdminService(securityContext);
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
adminService.assignCatalogRoleToPrincipalRole(
principalRoleName, catalogName, request.getCatalogRole().getName());
return Response.status(Response.Status.CREATED).build();
@@ -417,13 +458,14 @@ public class PolarisServiceImpl
String principalRoleName,
String catalogName,
String catalogRoleName,
+ RealmContext realmContext,
SecurityContext securityContext) {
LOGGER.info(
"Revoking catalogRole {} in catalog {} from principalRole {}",
catalogRoleName,
catalogName,
principalRoleName);
- PolarisAdminService adminService = newAdminService(securityContext);
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
adminService.revokeCatalogRoleFromPrincipalRole(
principalRoleName, catalogName, catalogRoleName);
return Response.status(Response.Status.NO_CONTENT).build();
@@ -432,8 +474,8 @@ public class PolarisServiceImpl
/** From PolarisPrincipalRolesApiService */
@Override
public Response listAssigneePrincipalsForPrincipalRole(
- String principalRoleName, SecurityContext securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String principalRoleName, RealmContext realmContext, SecurityContext
securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
List<Principal> principalList =
adminService.listAssigneePrincipalsForPrincipalRole(principalRoleName).stream()
.map(PrincipalEntity::new)
@@ -447,8 +489,11 @@ public class PolarisServiceImpl
/** From PolarisPrincipalRolesApiService */
@Override
public Response listCatalogRolesForPrincipalRole(
- String principalRoleName, String catalogName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String principalRoleName,
+ String catalogName,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
List<CatalogRole> catalogRoleList =
adminService.listCatalogRolesForPrincipalRole(principalRoleName,
catalogName).stream()
.map(CatalogRoleEntity::new)
@@ -465,13 +510,14 @@ public class PolarisServiceImpl
String catalogName,
String catalogRoleName,
AddGrantRequest grantRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
LOGGER.info(
"Adding grant {} to catalogRole {} in catalog {}",
grantRequest,
catalogRoleName,
catalogName);
- PolarisAdminService adminService = newAdminService(securityContext);
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
switch (grantRequest.getGrant()) {
// The per-securable-type Privilege enums must be exact String match
for a subset of all
// PolarisPrivilege values.
@@ -535,6 +581,7 @@ public class PolarisServiceImpl
String catalogRoleName,
Boolean cascade,
RevokeGrantRequest grantRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
LOGGER.info(
"Revoking grant {} from catalogRole {} in catalog {}",
@@ -546,7 +593,7 @@ public class PolarisServiceImpl
return Response.status(501).build(); // not implemented
}
- PolarisAdminService adminService = newAdminService(securityContext);
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
switch (grantRequest.getGrant()) {
// The per-securable-type Privilege enums must be exact String match
for a subset of all
// PolarisPrivilege values.
@@ -606,8 +653,11 @@ public class PolarisServiceImpl
/** From PolarisCatalogsApiService */
@Override
public Response listAssigneePrincipalRolesForCatalogRole(
- String catalogName, String catalogRoleName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String catalogName,
+ String catalogRoleName,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
List<PrincipalRole> principalRoleList =
adminService.listAssigneePrincipalRolesForCatalogRole(catalogName,
catalogRoleName).stream()
.map(PrincipalRoleEntity::new)
@@ -621,8 +671,11 @@ public class PolarisServiceImpl
/** From PolarisCatalogsApiService */
@Override
public Response listGrantsForCatalogRole(
- String catalogName, String catalogRoleName, SecurityContext
securityContext) {
- PolarisAdminService adminService = newAdminService(securityContext);
+ String catalogName,
+ String catalogRoleName,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ PolarisAdminService adminService = newAdminService(realmContext,
securityContext);
List<GrantResource> grantList =
adminService.listGrantsForCatalogRole(catalogName, catalogRoleName);
GrantResources grantResources = new GrantResources(grantList);
diff --git
a/service/common/src/main/java/org/apache/polaris/service/auth/DefaultOAuth2ApiService.java
b/service/common/src/main/java/org/apache/polaris/service/auth/DefaultOAuth2ApiService.java
index 6cb202da..3edbd9c7 100644
---
a/service/common/src/main/java/org/apache/polaris/service/auth/DefaultOAuth2ApiService.java
+++
b/service/common/src/main/java/org/apache/polaris/service/auth/DefaultOAuth2ApiService.java
@@ -28,7 +28,7 @@ import org.apache.commons.codec.binary.Base64;
import org.apache.hadoop.hdfs.web.oauth2.OAuth2Constants;
import org.apache.iceberg.rest.auth.OAuth2Properties;
import org.apache.iceberg.rest.responses.OAuthTokenResponse;
-import org.apache.polaris.core.context.CallContext;
+import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.service.catalog.api.IcebergRestOAuth2ApiService;
import org.apache.polaris.service.types.TokenType;
import org.slf4j.Logger;
@@ -58,10 +58,10 @@ public class DefaultOAuth2ApiService implements
IcebergRestOAuth2ApiService {
TokenType subjectTokenType,
String actorToken,
TokenType actorTokenType,
+ RealmContext realmContext,
SecurityContext securityContext) {
- TokenBroker tokenBroker =
-
tokenBrokerFactory.apply(CallContext.getCurrentContext().getRealmContext());
+ TokenBroker tokenBroker = tokenBrokerFactory.apply(realmContext);
if (!tokenBroker.supportsGrantType(grantType)) {
return
OAuthUtils.getResponseFromError(OAuthTokenErrorResponse.Error.unsupported_grant_type);
}
diff --git
a/service/common/src/main/java/org/apache/polaris/service/auth/TestOAuth2ApiService.java
b/service/common/src/main/java/org/apache/polaris/service/auth/TestOAuth2ApiService.java
index d0479362..b23530bc 100644
---
a/service/common/src/main/java/org/apache/polaris/service/auth/TestOAuth2ApiService.java
+++
b/service/common/src/main/java/org/apache/polaris/service/auth/TestOAuth2ApiService.java
@@ -29,6 +29,7 @@ import org.apache.iceberg.exceptions.NotAuthorizedException;
import org.apache.polaris.core.PolarisCallContext;
import
org.apache.polaris.core.auth.PolarisSecretsManager.PrincipalSecretsResult;
import org.apache.polaris.core.context.CallContext;
+import org.apache.polaris.core.context.RealmContext;
import org.apache.polaris.core.entity.PolarisEntitySubType;
import org.apache.polaris.core.entity.PolarisEntityType;
import org.apache.polaris.core.persistence.MetaStoreManagerFactory;
@@ -56,9 +57,10 @@ public class TestOAuth2ApiService implements
IcebergRestOAuth2ApiService {
TokenType subjectTokenType,
String actorToken,
TokenType actorTokenType,
+ RealmContext realmContext,
SecurityContext securityContext) {
Map<String, Object> response = new HashMap<>();
- String principalName = getPrincipalName(clientId);
+ String principalName = getPrincipalName(clientId, realmContext);
response.put(
"access_token",
"principal:"
@@ -66,7 +68,7 @@ public class TestOAuth2ApiService implements
IcebergRestOAuth2ApiService {
+ ";password:"
+ clientSecret
+ ";realm:"
- +
CallContext.getCurrentContext().getRealmContext().getRealmIdentifier()
+ + realmContext.getRealmIdentifier()
+ ";role:"
+ scope.replaceAll(BasePolarisAuthenticator.PRINCIPAL_ROLE_PREFIX,
""));
response.put("token_type", "bearer");
@@ -75,10 +77,10 @@ public class TestOAuth2ApiService implements
IcebergRestOAuth2ApiService {
return Response.ok(response).build();
}
- private String getPrincipalName(String clientId) {
+ private String getPrincipalName(String clientId, RealmContext realmContext) {
PolarisMetaStoreManager metaStoreManager =
- metaStoreManagerFactory.getOrCreateMetaStoreManager(
- CallContext.getCurrentContext().getRealmContext());
+ metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
+ // FIXME remove call to CallContext.getCurrentContext()
PolarisCallContext polarisCallContext =
CallContext.getCurrentContext().getPolarisCallContext();
PrincipalSecretsResult secretsResult =
metaStoreManager.loadPrincipalSecrets(polarisCallContext, clientId);
diff --git
a/service/common/src/main/java/org/apache/polaris/service/catalog/BasePolarisCatalog.java
b/service/common/src/main/java/org/apache/polaris/service/catalog/BasePolarisCatalog.java
index 56fc2468..83f8fe96 100644
---
a/service/common/src/main/java/org/apache/polaris/service/catalog/BasePolarisCatalog.java
+++
b/service/common/src/main/java/org/apache/polaris/service/catalog/BasePolarisCatalog.java
@@ -251,7 +251,7 @@ public class BasePolarisCatalog extends
BaseMetastoreViewCatalog
CatalogProperties.FILE_IO_IMPL);
}
}
- CallContext.getCurrentContext().closeables().addCloseable(this);
+ callContext.closeables().addCloseable(this);
this.closeableGroup = new CloseableGroup();
closeableGroup.addCloseable(metricsReporter());
closeableGroup.setSuppressCloseFailure(true);
@@ -435,8 +435,7 @@ public class BasePolarisCatalog extends
BaseMetastoreViewCatalog
"Scheduled cleanup task {} for table {}",
dropEntityResult.getCleanupTaskId(),
tableIdentifier);
- taskExecutor.addTaskHandlerContext(
- dropEntityResult.getCleanupTaskId(),
CallContext.getCurrentContext());
+ taskExecutor.addTaskHandlerContext(dropEntityResult.getCleanupTaskId(),
callContext);
}
return true;
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 926fcfe8..483778cc 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
@@ -127,8 +127,7 @@ public class IcebergCatalogAdapter
}
private PolarisCatalogHandlerWrapper newHandlerWrapper(
- SecurityContext securityContext, String catalogName) {
- CallContext callContext = CallContext.getCurrentContext();
+ RealmContext realmContext, SecurityContext securityContext, String
catalogName) {
AuthenticatedPolarisPrincipal authenticatedPrincipal =
(AuthenticatedPolarisPrincipal) securityContext.getUserPrincipal();
if (authenticatedPrincipal == null) {
@@ -136,12 +135,13 @@ public class IcebergCatalogAdapter
}
PolarisEntityManager entityManager =
-
entityManagerFactory.getOrCreateEntityManager(callContext.getRealmContext());
+ entityManagerFactory.getOrCreateEntityManager(realmContext);
return new PolarisCatalogHandlerWrapper(
- callContext,
+ // FIXME remove call to CallContext.getCurrentContext()
+ CallContext.getCurrentContext(),
entityManager,
-
metaStoreManagerFactory.getOrCreateMetaStoreManager(callContext.getRealmContext()),
+ metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext),
authenticatedPrincipal,
catalogFactory,
catalogName,
@@ -152,9 +152,11 @@ public class IcebergCatalogAdapter
public Response createNamespace(
String prefix,
CreateNamespaceRequest createNamespaceRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
return Response.ok(
- newHandlerWrapper(securityContext,
prefix).createNamespace(createNamespaceRequest))
+ newHandlerWrapper(realmContext, securityContext, prefix)
+ .createNamespace(createNamespaceRequest))
.build();
}
@@ -164,20 +166,22 @@ public class IcebergCatalogAdapter
String pageToken,
Integer pageSize,
String parent,
+ RealmContext realmContext,
SecurityContext securityContext) {
Optional<Namespace> namespaceOptional =
Optional.ofNullable(parent).map(IcebergCatalogAdapter::decodeNamespace);
return Response.ok(
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.listNamespaces(namespaceOptional.orElse(Namespace.of())))
.build();
}
@Override
public Response loadNamespaceMetadata(
- String prefix, String namespace, SecurityContext securityContext) {
+ String prefix, String namespace, RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
- return Response.ok(newHandlerWrapper(securityContext,
prefix).loadNamespaceMetadata(ns))
+ return Response.ok(
+ newHandlerWrapper(realmContext, securityContext,
prefix).loadNamespaceMetadata(ns))
.build();
}
@@ -187,16 +191,17 @@ public class IcebergCatalogAdapter
@Override
public Response namespaceExists(
- String prefix, String namespace, SecurityContext securityContext) {
+ String prefix, String namespace, RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
- newHandlerWrapper(securityContext, prefix).namespaceExists(ns);
+ newHandlerWrapper(realmContext, securityContext,
prefix).namespaceExists(ns);
return Response.status(Response.Status.NO_CONTENT).build();
}
@Override
- public Response dropNamespace(String prefix, String namespace,
SecurityContext securityContext) {
+ public Response dropNamespace(
+ String prefix, String namespace, RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
- newHandlerWrapper(securityContext, prefix).dropNamespace(ns);
+ newHandlerWrapper(realmContext, securityContext, prefix).dropNamespace(ns);
return Response.status(Response.Status.NO_CONTENT).build();
}
@@ -205,10 +210,11 @@ public class IcebergCatalogAdapter
String prefix,
String namespace,
UpdateNamespacePropertiesRequest updateNamespacePropertiesRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
return Response.ok(
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.updateNamespaceProperties(ns,
updateNamespacePropertiesRequest))
.build();
}
@@ -229,6 +235,7 @@ public class IcebergCatalogAdapter
String namespace,
CreateTableRequest createTableRequest,
String accessDelegationMode,
+ RealmContext realmContext,
SecurityContext securityContext) {
EnumSet<AccessDelegationMode> delegationModes =
parseAccessDelegationModes(accessDelegationMode);
@@ -236,22 +243,23 @@ public class IcebergCatalogAdapter
if (createTableRequest.stageCreate()) {
if (delegationModes.isEmpty()) {
return Response.ok(
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.createTableStaged(ns, createTableRequest))
.build();
} else {
return Response.ok(
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.createTableStagedWithWriteDelegation(ns,
createTableRequest))
.build();
}
} else if (delegationModes.isEmpty()) {
return Response.ok(
- newHandlerWrapper(securityContext, prefix).createTableDirect(ns,
createTableRequest))
+ newHandlerWrapper(realmContext, securityContext, prefix)
+ .createTableDirect(ns, createTableRequest))
.build();
} else {
return Response.ok(
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.createTableDirectWithWriteDelegation(ns,
createTableRequest))
.build();
}
@@ -263,9 +271,11 @@ public class IcebergCatalogAdapter
String namespace,
String pageToken,
Integer pageSize,
+ RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
- return Response.ok(newHandlerWrapper(securityContext,
prefix).listTables(ns)).build();
+ return Response.ok(newHandlerWrapper(realmContext, securityContext,
prefix).listTables(ns))
+ .build();
}
@Override
@@ -275,6 +285,7 @@ public class IcebergCatalogAdapter
String table,
String accessDelegationMode,
String snapshots,
+ RealmContext realmContext,
SecurityContext securityContext) {
EnumSet<AccessDelegationMode> delegationModes =
parseAccessDelegationModes(accessDelegationMode);
@@ -282,11 +293,12 @@ public class IcebergCatalogAdapter
TableIdentifier tableIdentifier = TableIdentifier.of(ns,
RESTUtil.decodeString(table));
if (delegationModes.isEmpty()) {
return Response.ok(
- newHandlerWrapper(securityContext,
prefix).loadTable(tableIdentifier, snapshots))
+ newHandlerWrapper(realmContext, securityContext, prefix)
+ .loadTable(tableIdentifier, snapshots))
.build();
} else {
return Response.ok(
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.loadTableWithAccessDelegation(tableIdentifier, snapshots))
.build();
}
@@ -294,10 +306,14 @@ public class IcebergCatalogAdapter
@Override
public Response tableExists(
- String prefix, String namespace, String table, SecurityContext
securityContext) {
+ String prefix,
+ String namespace,
+ String table,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
TableIdentifier tableIdentifier = TableIdentifier.of(ns,
RESTUtil.decodeString(table));
- newHandlerWrapper(securityContext, prefix).tableExists(tableIdentifier);
+ newHandlerWrapper(realmContext, securityContext,
prefix).tableExists(tableIdentifier);
return Response.status(Response.Status.NO_CONTENT).build();
}
@@ -307,14 +323,16 @@ public class IcebergCatalogAdapter
String namespace,
String table,
Boolean purgeRequested,
+ RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
TableIdentifier tableIdentifier = TableIdentifier.of(ns,
RESTUtil.decodeString(table));
if (purgeRequested != null && purgeRequested) {
- newHandlerWrapper(securityContext,
prefix).dropTableWithPurge(tableIdentifier);
+ newHandlerWrapper(realmContext, securityContext,
prefix).dropTableWithPurge(tableIdentifier);
} else {
- newHandlerWrapper(securityContext,
prefix).dropTableWithoutPurge(tableIdentifier);
+ newHandlerWrapper(realmContext, securityContext, prefix)
+ .dropTableWithoutPurge(tableIdentifier);
}
return Response.status(Response.Status.NO_CONTENT).build();
}
@@ -324,17 +342,22 @@ public class IcebergCatalogAdapter
String prefix,
String namespace,
RegisterTableRequest registerTableRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
return Response.ok(
- newHandlerWrapper(securityContext, prefix).registerTable(ns,
registerTableRequest))
+ newHandlerWrapper(realmContext, securityContext, prefix)
+ .registerTable(ns, registerTableRequest))
.build();
}
@Override
public Response renameTable(
- String prefix, RenameTableRequest renameTableRequest, SecurityContext
securityContext) {
- newHandlerWrapper(securityContext, prefix).renameTable(renameTableRequest);
+ String prefix,
+ RenameTableRequest renameTableRequest,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ newHandlerWrapper(realmContext, securityContext,
prefix).renameTable(renameTableRequest);
return Response.ok(javax.ws.rs.core.Response.Status.NO_CONTENT).build();
}
@@ -344,18 +367,19 @@ public class IcebergCatalogAdapter
String namespace,
String table,
CommitTableRequest commitTableRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
TableIdentifier tableIdentifier = TableIdentifier.of(ns,
RESTUtil.decodeString(table));
if (PolarisCatalogHandlerWrapper.isCreate(commitTableRequest)) {
return Response.ok(
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.updateTableForStagedCreate(tableIdentifier,
commitTableRequest))
.build();
} else {
return Response.ok(
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.updateTable(tableIdentifier, commitTableRequest))
.build();
}
@@ -366,9 +390,12 @@ public class IcebergCatalogAdapter
String prefix,
String namespace,
CreateViewRequest createViewRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
- return Response.ok(newHandlerWrapper(securityContext,
prefix).createView(ns, createViewRequest))
+ return Response.ok(
+ newHandlerWrapper(realmContext, securityContext, prefix)
+ .createView(ns, createViewRequest))
.build();
}
@@ -378,42 +405,60 @@ public class IcebergCatalogAdapter
String namespace,
String pageToken,
Integer pageSize,
+ RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
- return Response.ok(newHandlerWrapper(securityContext,
prefix).listViews(ns)).build();
+ return Response.ok(newHandlerWrapper(realmContext, securityContext,
prefix).listViews(ns))
+ .build();
}
@Override
public Response loadView(
- String prefix, String namespace, String view, SecurityContext
securityContext) {
+ String prefix,
+ String namespace,
+ String view,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
TableIdentifier tableIdentifier = TableIdentifier.of(ns,
RESTUtil.decodeString(view));
- return Response.ok(newHandlerWrapper(securityContext,
prefix).loadView(tableIdentifier))
+ return Response.ok(
+ newHandlerWrapper(realmContext, securityContext,
prefix).loadView(tableIdentifier))
.build();
}
@Override
public Response viewExists(
- String prefix, String namespace, String view, SecurityContext
securityContext) {
+ String prefix,
+ String namespace,
+ String view,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
TableIdentifier tableIdentifier = TableIdentifier.of(ns,
RESTUtil.decodeString(view));
- newHandlerWrapper(securityContext, prefix).viewExists(tableIdentifier);
+ newHandlerWrapper(realmContext, securityContext,
prefix).viewExists(tableIdentifier);
return Response.status(Response.Status.NO_CONTENT).build();
}
@Override
public Response dropView(
- String prefix, String namespace, String view, SecurityContext
securityContext) {
+ String prefix,
+ String namespace,
+ String view,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
TableIdentifier tableIdentifier = TableIdentifier.of(ns,
RESTUtil.decodeString(view));
- newHandlerWrapper(securityContext, prefix).dropView(tableIdentifier);
+ newHandlerWrapper(realmContext, securityContext,
prefix).dropView(tableIdentifier);
return Response.status(Response.Status.NO_CONTENT).build();
}
@Override
public Response renameView(
- String prefix, RenameTableRequest renameTableRequest, SecurityContext
securityContext) {
- newHandlerWrapper(securityContext, prefix).renameView(renameTableRequest);
+ String prefix,
+ RenameTableRequest renameTableRequest,
+ RealmContext realmContext,
+ SecurityContext securityContext) {
+ newHandlerWrapper(realmContext, securityContext,
prefix).renameView(renameTableRequest);
return Response.status(Response.Status.NO_CONTENT).build();
}
@@ -423,11 +468,12 @@ public class IcebergCatalogAdapter
String namespace,
String view,
CommitViewRequest commitViewRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
TableIdentifier tableIdentifier = TableIdentifier.of(ns,
RESTUtil.decodeString(view));
return Response.ok(
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.replaceView(tableIdentifier, commitViewRequest))
.build();
}
@@ -436,8 +482,10 @@ public class IcebergCatalogAdapter
public Response commitTransaction(
String prefix,
CommitTransactionRequest commitTransactionRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
- newHandlerWrapper(securityContext,
prefix).commitTransaction(commitTransactionRequest);
+ newHandlerWrapper(realmContext, securityContext, prefix)
+ .commitTransaction(commitTransactionRequest);
return Response.status(Response.Status.NO_CONTENT).build();
}
@@ -447,6 +495,7 @@ public class IcebergCatalogAdapter
String namespace,
String table,
ReportMetricsRequest reportMetricsRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
return Response.status(Response.Status.NO_CONTENT).build();
}
@@ -457,17 +506,19 @@ public class IcebergCatalogAdapter
String namespace,
String table,
NotificationRequest notificationRequest,
+ RealmContext realmContext,
SecurityContext securityContext) {
Namespace ns = decodeNamespace(namespace);
TableIdentifier tableIdentifier = TableIdentifier.of(ns,
RESTUtil.decodeString(table));
- newHandlerWrapper(securityContext, prefix)
+ newHandlerWrapper(realmContext, securityContext, prefix)
.sendNotification(tableIdentifier, notificationRequest);
return Response.status(Response.Status.NO_CONTENT).build();
}
/** From IcebergRestConfigurationApiService. */
@Override
- public Response getConfig(String warehouse, SecurityContext securityContext)
{
+ public Response getConfig(
+ String warehouse, RealmContext realmContext, SecurityContext
securityContext) {
// 'warehouse' as an input here is catalogName.
// 'warehouse' as an output will be treated by the client as a default
catalog
// storage
@@ -480,8 +531,7 @@ public class IcebergCatalogAdapter
// TODO: Push this down into PolarisCatalogHandlerWrapper for authorizing
"any" catalog
// role in this catalog.
PolarisEntityManager entityManager =
- entityManagerFactory.getOrCreateEntityManager(
- CallContext.getCurrentContext().getRealmContext());
+ entityManagerFactory.getOrCreateEntityManager(realmContext);
AuthenticatedPolarisPrincipal authenticatedPrincipal =
(AuthenticatedPolarisPrincipal) securityContext.getUserPrincipal();
if (authenticatedPrincipal == null) {
@@ -490,9 +540,10 @@ public class IcebergCatalogAdapter
if (warehouse == null) {
throw new BadRequestException("Please specify a warehouse");
}
+ // FIXME remove call to CallContext.getCurrentContext()
+ CallContext callContext = CallContext.getCurrentContext();
Resolver resolver =
- entityManager.prepareResolver(
- CallContext.getCurrentContext(), authenticatedPrincipal,
warehouse);
+ entityManager.prepareResolver(callContext, authenticatedPrincipal,
warehouse);
ResolverStatus resolverStatus = resolver.resolveAll();
if (!resolverStatus.getStatus().equals(ResolverStatus.StatusEnum.SUCCESS))
{
throw new NotFoundException("Unable to find warehouse %s", warehouse);