From 5a46a7dd7eab9d8ca8b849756b7945fad482e4f3 Mon Sep 17 00:00:00 2001 From: Christopher Lambert <1204398+XN137@users.noreply.github.com> Date: Wed, 10 Sep 2025 12:25:11 +0200 Subject: [PATCH] Inject PolarisAdminService into PolarisServiceImpl `PolarisServiceImpl` already is a request-scoped bean. if we apply the same to `PolarisAdminService` we can simply inject it into `PolarisServiceImpl`. --- .../core/auth/PolarisSecretsManager.java | 3 +- .../service/admin/PolarisAdminService.java | 23 +++-- .../service/admin/PolarisServiceImpl.java | 91 ++----------------- .../service/admin/PolarisServiceImplTest.java | 34 ++++--- .../apache/polaris/service/TestServices.java | 20 ++-- 5 files changed, 53 insertions(+), 118 deletions(-) diff --git a/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisSecretsManager.java b/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisSecretsManager.java index b60c318e13..28da598ef0 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisSecretsManager.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/auth/PolarisSecretsManager.java @@ -21,7 +21,6 @@ import jakarta.annotation.Nonnull; import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.persistence.dao.entity.PrincipalSecretsResult; -import software.amazon.awssdk.annotations.NotNull; /** Manages secrets for Polaris principals. */ public interface PolarisSecretsManager { @@ -74,7 +73,7 @@ PrincipalSecretsResult rotatePrincipalSecrets( PrincipalSecretsResult resetPrincipalSecrets( @Nonnull PolarisCallContext callCtx, long principalId, - @NotNull String resolvedClientId, + @Nonnull String resolvedClientId, String customClientSecret); /** diff --git a/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java b/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java index 23341d7640..682a17389e 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisAdminService.java @@ -24,7 +24,8 @@ import com.google.common.base.Strings; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import jakarta.validation.constraints.NotNull; +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; import jakarta.ws.rs.core.SecurityContext; import java.util.ArrayList; import java.util.Arrays; @@ -135,6 +136,7 @@ * provide different implementations of PolarisEntityManager to abstract away the implementation of * the persistence layer. */ +@RequestScoped public class PolarisAdminService { private static final Logger LOGGER = LoggerFactory.getLogger(PolarisAdminService.class); @@ -151,15 +153,16 @@ public class PolarisAdminService { // Initialized in the authorize methods. private PolarisResolutionManifest resolutionManifest = null; + @Inject public PolarisAdminService( - @NotNull PolarisDiagnostics diagnostics, - @NotNull CallContext callContext, - @NotNull ResolutionManifestFactory resolutionManifestFactory, - @NotNull PolarisMetaStoreManager metaStoreManager, - @NotNull UserSecretsManager userSecretsManager, - @NotNull SecurityContext securityContext, - @NotNull PolarisAuthorizer authorizer, - @NotNull ReservedProperties reservedProperties) { + @Nonnull PolarisDiagnostics diagnostics, + @Nonnull CallContext callContext, + @Nonnull ResolutionManifestFactory resolutionManifestFactory, + @Nonnull PolarisMetaStoreManager metaStoreManager, + @Nonnull UserSecretsManager userSecretsManager, + @Nonnull SecurityContext securityContext, + @Nonnull PolarisAuthorizer authorizer, + @Nonnull ReservedProperties reservedProperties) { this.callContext = callContext; this.realmConfig = callContext.getRealmConfig(); this.resolutionManifestFactory = resolutionManifestFactory; @@ -700,7 +703,7 @@ private Map extractSecretReferences( * @see #extractSecretReferences */ private boolean requiresSecretReferenceExtraction( - @NotNull ConnectionConfigInfo connectionConfigInfo) { + @Nonnull ConnectionConfigInfo connectionConfigInfo) { return connectionConfigInfo.getAuthenticationParameters().getAuthenticationType() != AuthenticationParameters.AuthenticationTypeEnum.IMPLICIT; } diff --git a/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java b/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java index 31bbd6cdd6..e8a1c5d99f 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/admin/PolarisServiceImpl.java @@ -27,9 +27,7 @@ import java.util.Locale; import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; -import org.apache.iceberg.exceptions.NotAuthorizedException; import org.apache.iceberg.rest.responses.ErrorResponse; -import org.apache.polaris.core.PolarisDiagnostics; import org.apache.polaris.core.admin.model.AddGrantRequest; import org.apache.polaris.core.admin.model.AuthenticationParameters; import org.apache.polaris.core.admin.model.AwsStorageConfigInfo; @@ -64,24 +62,16 @@ import org.apache.polaris.core.admin.model.UpdatePrincipalRequest; import org.apache.polaris.core.admin.model.UpdatePrincipalRoleRequest; import org.apache.polaris.core.admin.model.ViewGrant; -import org.apache.polaris.core.auth.PolarisAuthorizer; -import org.apache.polaris.core.auth.PolarisPrincipal; import org.apache.polaris.core.config.FeatureConfiguration; import org.apache.polaris.core.config.RealmConfig; -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; import org.apache.polaris.core.entity.PrincipalEntity; import org.apache.polaris.core.entity.PrincipalRoleEntity; -import org.apache.polaris.core.persistence.MetaStoreManagerFactory; -import org.apache.polaris.core.persistence.PolarisMetaStoreManager; import org.apache.polaris.core.persistence.dao.entity.BaseResult; import org.apache.polaris.core.persistence.dao.entity.PrivilegeResult; -import org.apache.polaris.core.persistence.resolver.ResolutionManifestFactory; -import org.apache.polaris.core.secrets.UserSecretsManager; -import org.apache.polaris.core.secrets.UserSecretsManagerFactory; import org.apache.polaris.service.admin.api.PolarisCatalogsApiService; import org.apache.polaris.service.admin.api.PolarisPrincipalRolesApiService; import org.apache.polaris.service.admin.api.PolarisPrincipalsApiService; @@ -99,57 +89,21 @@ public class PolarisServiceImpl PolarisPrincipalsApiService, PolarisPrincipalRolesApiService { private static final Logger LOGGER = LoggerFactory.getLogger(PolarisServiceImpl.class); - private final PolarisDiagnostics diagnostics; - private final ResolutionManifestFactory resolutionManifestFactory; - private final PolarisAuthorizer polarisAuthorizer; - private final MetaStoreManagerFactory metaStoreManagerFactory; - private final UserSecretsManagerFactory userSecretsManagerFactory; - private final CallContext callContext; private final RealmConfig realmConfig; private final ReservedProperties reservedProperties; private final PolarisEventListener polarisEventListener; + private final PolarisAdminService adminService; @Inject public PolarisServiceImpl( - PolarisDiagnostics diagnostics, - ResolutionManifestFactory resolutionManifestFactory, - MetaStoreManagerFactory metaStoreManagerFactory, - UserSecretsManagerFactory userSecretsManagerFactory, - PolarisAuthorizer polarisAuthorizer, - CallContext callContext, + RealmConfig realmConfig, ReservedProperties reservedProperties, - PolarisEventListener polarisEventListener) { - this.diagnostics = diagnostics; - this.resolutionManifestFactory = resolutionManifestFactory; - this.metaStoreManagerFactory = metaStoreManagerFactory; - this.userSecretsManagerFactory = userSecretsManagerFactory; - this.polarisAuthorizer = polarisAuthorizer; - this.callContext = callContext; - this.realmConfig = callContext.getRealmConfig(); + PolarisEventListener polarisEventListener, + PolarisAdminService adminService) { + this.realmConfig = realmConfig; this.reservedProperties = reservedProperties; this.polarisEventListener = polarisEventListener; - } - - private PolarisAdminService newAdminService( - RealmContext realmContext, SecurityContext securityContext) { - PolarisPrincipal authenticatedPrincipal = (PolarisPrincipal) securityContext.getUserPrincipal(); - if (authenticatedPrincipal == null) { - throw new NotAuthorizedException("Failed to find authenticatedPrincipal in SecurityContext"); - } - - PolarisMetaStoreManager metaStoreManager = - metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext); - UserSecretsManager userSecretsManager = - userSecretsManagerFactory.getOrCreateUserSecretsManager(realmContext); - return new PolarisAdminService( - diagnostics, - callContext, - resolutionManifestFactory, - metaStoreManager, - userSecretsManager, - securityContext, - polarisAuthorizer, - reservedProperties); + this.adminService = adminService; } private static Response toResponse(BaseResult result, Response.Status successStatus) { @@ -172,7 +126,6 @@ private static Response toResponse(BaseResult result, Response.Status successSta @Override public Response createCatalog( CreateCatalogRequest request, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); Catalog catalog = request.getCatalog(); validateStorageConfig(catalog.getStorageConfigInfo()); validateExternalCatalog(catalog); @@ -259,7 +212,6 @@ private void validateAuthenticationParameters(AuthenticationParameters authentic @Override 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(); } @@ -268,7 +220,6 @@ public Response deleteCatalog( @Override public Response getCatalog( String catalogName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); return Response.ok(adminService.getCatalog(catalogName).asCatalog()).build(); } @@ -279,7 +230,6 @@ public Response updateCatalog( UpdateCatalogRequest updateRequest, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); if (updateRequest.getStorageConfigInfo() != null) { validateStorageConfig(updateRequest.getStorageConfigInfo()); } @@ -289,7 +239,6 @@ public Response updateCatalog( /** From PolarisCatalogsApiService */ @Override public Response listCatalogs(RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); List catalogList = adminService.listCatalogs(); Catalogs catalogs = new Catalogs(catalogList); LOGGER.debug("listCatalogs returning: {}", catalogs); @@ -300,7 +249,6 @@ public Response listCatalogs(RealmContext realmContext, SecurityContext security @Override public Response createPrincipal( CreatePrincipalRequest request, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); PrincipalEntity principal = new PrincipalEntity.Builder() .setName(request.getPrincipal().getName()) @@ -334,7 +282,6 @@ public Response resetCredentials( if (safeResetPrincipalRequest.getClientSecret() != null) { validateClientSecret(safeResetPrincipalRequest.getClientSecret()); } - PolarisAdminService adminService = newAdminService(realmContext, securityContext); return Response.ok(adminService.resetCredentials(principalName, safeResetPrincipalRequest)) .build(); } @@ -343,7 +290,6 @@ public Response resetCredentials( @Override 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(); } @@ -352,7 +298,6 @@ public Response deletePrincipal( @Override public Response getPrincipal( String principalName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); return Response.ok(adminService.getPrincipal(principalName).asPrincipal()).build(); } @@ -363,7 +308,6 @@ public Response updatePrincipal( UpdatePrincipalRequest updateRequest, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); return Response.ok(adminService.updatePrincipal(principalName, updateRequest).asPrincipal()) .build(); } @@ -372,14 +316,12 @@ public Response updatePrincipal( @Override 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(RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); List principalList = adminService.listPrincipals(); Principals principals = new Principals(principalList); LOGGER.debug("listPrincipals returning: {}", principals); @@ -392,7 +334,6 @@ public Response createPrincipalRole( CreatePrincipalRoleRequest request, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); PrincipalRoleEntity entity = new PrincipalRoleEntity.Builder() .setName(request.getPrincipalRole().getName()) @@ -410,7 +351,6 @@ public Response createPrincipalRole( @Override 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(); } @@ -419,7 +359,6 @@ public Response deletePrincipalRole( @Override public Response getPrincipalRole( String principalRoleName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); return Response.ok(adminService.getPrincipalRole(principalRoleName).asPrincipalRole()).build(); } @@ -430,7 +369,6 @@ public Response updatePrincipalRole( UpdatePrincipalRoleRequest updateRequest, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); return Response.ok( adminService.updatePrincipalRole(principalRoleName, updateRequest).asPrincipalRole()) .build(); @@ -439,7 +377,6 @@ public Response updatePrincipalRole( /** From PolarisPrincipalRolesApiService */ @Override public Response listPrincipalRoles(RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); List principalRoleList = adminService.listPrincipalRoles(); PrincipalRoles principalRoles = new PrincipalRoles(principalRoleList); LOGGER.debug("listPrincipalRoles returning: {}", principalRoles); @@ -453,7 +390,6 @@ public Response createCatalogRole( CreateCatalogRoleRequest request, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); CatalogRoleEntity entity = new CatalogRoleEntity.Builder() .setName(request.getCatalogRole().getName()) @@ -474,7 +410,6 @@ public Response deleteCatalogRole( String catalogRoleName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); adminService.deleteCatalogRole(catalogName, catalogRoleName); return Response.status(Response.Status.NO_CONTENT).build(); } @@ -486,7 +421,6 @@ public Response getCatalogRole( String catalogRoleName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); return Response.ok(adminService.getCatalogRole(catalogName, catalogRoleName).asCatalogRole()) .build(); } @@ -499,7 +433,6 @@ public Response updateCatalogRole( UpdateCatalogRoleRequest updateRequest, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); return Response.ok( adminService .updateCatalogRole(catalogName, catalogRoleName, updateRequest) @@ -511,7 +444,6 @@ public Response updateCatalogRole( @Override public Response listCatalogRoles( String catalogName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); List catalogRoleList = adminService.listCatalogRoles(catalogName); CatalogRoles catalogRoles = new CatalogRoles(catalogRoleList); LOGGER.debug("listCatalogRoles returning: {}", catalogRoles); @@ -529,7 +461,6 @@ public Response assignPrincipalRole( "Assigning principalRole {} to principal {}", request.getPrincipalRole().getName(), principalName); - PolarisAdminService adminService = newAdminService(realmContext, securityContext); PrivilegeResult result = adminService.assignPrincipalRole(principalName, request.getPrincipalRole().getName()); return toResponse(result, Response.Status.CREATED); @@ -543,7 +474,6 @@ public Response revokePrincipalRole( RealmContext realmContext, SecurityContext securityContext) { LOGGER.info("Revoking principalRole {} from principal {}", principalRoleName, principalName); - PolarisAdminService adminService = newAdminService(realmContext, securityContext); PrivilegeResult result = adminService.revokePrincipalRole(principalName, principalRoleName); return toResponse(result, Response.Status.NO_CONTENT); } @@ -552,7 +482,6 @@ public Response revokePrincipalRole( @Override public Response listPrincipalRolesAssigned( String principalName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); List principalRoleList = adminService.listPrincipalRolesAssigned(principalName).stream() .map(PrincipalRoleEntity::new) @@ -576,7 +505,6 @@ public Response assignCatalogRoleToPrincipalRole( request.getCatalogRole().getName(), catalogName, principalRoleName); - PolarisAdminService adminService = newAdminService(realmContext, securityContext); PrivilegeResult result = adminService.assignCatalogRoleToPrincipalRole( principalRoleName, catalogName, request.getCatalogRole().getName()); @@ -596,7 +524,6 @@ public Response revokeCatalogRoleFromPrincipalRole( catalogRoleName, catalogName, principalRoleName); - PolarisAdminService adminService = newAdminService(realmContext, securityContext); PrivilegeResult result = adminService.revokeCatalogRoleFromPrincipalRole( principalRoleName, catalogName, catalogRoleName); @@ -607,7 +534,6 @@ public Response revokeCatalogRoleFromPrincipalRole( @Override public Response listAssigneePrincipalsForPrincipalRole( String principalRoleName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); List principalList = adminService.listAssigneePrincipalsForPrincipalRole(principalRoleName).stream() .map(PrincipalEntity::new) @@ -625,7 +551,6 @@ public Response listCatalogRolesForPrincipalRole( String catalogName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); List catalogRoleList = adminService.listCatalogRolesForPrincipalRole(principalRoleName, catalogName).stream() .map(CatalogRoleEntity::new) @@ -649,7 +574,6 @@ public Response addGrantToCatalogRole( grantRequest, catalogRoleName, catalogName); - PolarisAdminService adminService = newAdminService(realmContext, securityContext); PrivilegeResult result; switch (grantRequest.getGrant()) { // The per-securable-type Privilege enums must be exact String match for a subset of all @@ -744,7 +668,6 @@ public Response revokeGrantFromCatalogRole( return Response.status(501).build(); // not implemented } - PolarisAdminService adminService = newAdminService(realmContext, securityContext); PrivilegeResult result; switch (grantRequest.getGrant()) { // The per-securable-type Privilege enums must be exact String match for a subset of all @@ -828,7 +751,6 @@ public Response listAssigneePrincipalRolesForCatalogRole( String catalogRoleName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); List principalRoleList = adminService.listAssigneePrincipalRolesForCatalogRole(catalogName, catalogRoleName).stream() .map(PrincipalRoleEntity::new) @@ -846,7 +768,6 @@ public Response listGrantsForCatalogRole( String catalogRoleName, RealmContext realmContext, SecurityContext securityContext) { - PolarisAdminService adminService = newAdminService(realmContext, securityContext); List grantList = adminService.listGrantsForCatalogRole(catalogName, catalogRoleName); GrantResources grantResources = new GrantResources(grantList); diff --git a/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java b/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java index 1d22c48282..6bf88cbaec 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/admin/PolarisServiceImplTest.java @@ -22,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.when; +import jakarta.ws.rs.core.SecurityContext; import java.lang.reflect.Method; import java.util.List; import org.apache.polaris.core.PolarisDefaultDiagServiceImpl; @@ -35,12 +36,13 @@ import org.apache.polaris.core.admin.model.PolarisCatalog; import org.apache.polaris.core.admin.model.StorageConfigInfo; import org.apache.polaris.core.auth.PolarisAuthorizer; +import org.apache.polaris.core.auth.PolarisPrincipal; import org.apache.polaris.core.config.FeatureConfiguration; import org.apache.polaris.core.config.RealmConfig; import org.apache.polaris.core.context.CallContext; -import org.apache.polaris.core.persistence.MetaStoreManagerFactory; +import org.apache.polaris.core.persistence.PolarisMetaStoreManager; import org.apache.polaris.core.persistence.resolver.ResolutionManifestFactory; -import org.apache.polaris.core.secrets.UserSecretsManagerFactory; +import org.apache.polaris.core.secrets.UserSecretsManager; import org.apache.polaris.service.config.ReservedProperties; import org.apache.polaris.service.events.listeners.NoOpPolarisEventListener; import org.apache.polaris.service.events.listeners.PolarisEventListener; @@ -52,25 +54,29 @@ public class PolarisServiceImplTest { private final PolarisDiagnostics diagnostics = new PolarisDefaultDiagServiceImpl(); private ResolutionManifestFactory resolutionManifestFactory; - private MetaStoreManagerFactory metaStoreManagerFactory; - private UserSecretsManagerFactory userSecretsManagerFactory; + private PolarisMetaStoreManager metaStoreManager; + private UserSecretsManager userSecretsManager; private PolarisAuthorizer polarisAuthorizer; private CallContext callContext; private ReservedProperties reservedProperties; private RealmConfig realmConfig; private PolarisEventListener polarisEventListener; + private PolarisAdminService adminService; private PolarisServiceImpl polarisService; @BeforeEach void setUp() { resolutionManifestFactory = Mockito.mock(ResolutionManifestFactory.class); - metaStoreManagerFactory = Mockito.mock(MetaStoreManagerFactory.class); - userSecretsManagerFactory = Mockito.mock(UserSecretsManagerFactory.class); + metaStoreManager = Mockito.mock(PolarisMetaStoreManager.class); + userSecretsManager = Mockito.mock(UserSecretsManager.class); polarisAuthorizer = Mockito.mock(PolarisAuthorizer.class); callContext = Mockito.mock(CallContext.class); reservedProperties = Mockito.mock(ReservedProperties.class); realmConfig = Mockito.mock(RealmConfig.class); + SecurityContext securityContext = Mockito.mock(SecurityContext.class); + Mockito.when(securityContext.getUserPrincipal()) + .thenReturn(Mockito.mock(PolarisPrincipal.class)); polarisEventListener = new NoOpPolarisEventListener(); when(callContext.getRealmConfig()).thenReturn(realmConfig); @@ -80,16 +86,18 @@ void setUp() { FeatureConfiguration.SUPPORTED_EXTERNAL_CATALOG_AUTHENTICATION_TYPES)) .thenReturn(List.of("OAUTH")); - polarisService = - new PolarisServiceImpl( + adminService = + new PolarisAdminService( diagnostics, + callContext, resolutionManifestFactory, - metaStoreManagerFactory, - userSecretsManagerFactory, + metaStoreManager, + userSecretsManager, + securityContext, polarisAuthorizer, - callContext, - reservedProperties, - polarisEventListener); + reservedProperties); + polarisService = + new PolarisServiceImpl(realmConfig, reservedProperties, polarisEventListener, adminService); } @Test diff --git a/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java b/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java index 11ee88b0d0..d284a8e23c 100644 --- a/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java +++ b/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java @@ -56,6 +56,7 @@ import org.apache.polaris.core.secrets.UserSecretsManagerFactory; import org.apache.polaris.core.storage.cache.StorageCredentialCache; import org.apache.polaris.core.storage.cache.StorageCredentialCacheConfig; +import org.apache.polaris.service.admin.PolarisAdminService; import org.apache.polaris.service.admin.PolarisServiceImpl; import org.apache.polaris.service.admin.api.PolarisCatalogsApi; import org.apache.polaris.service.catalog.DefaultCatalogPrefixParser; @@ -278,17 +279,20 @@ public String getAuthenticationScheme() { } }; + PolarisAdminService adminService = + new PolarisAdminService( + diagnostics, + callContext, + resolutionManifestFactory, + metaStoreManager, + userSecretsManager, + securityContext, + authorizer, + reservedProperties); PolarisCatalogsApi catalogsApi = new PolarisCatalogsApi( new PolarisServiceImpl( - diagnostics, - resolutionManifestFactory, - metaStoreManagerFactory, - userSecretsManagerFactory, - authorizer, - callContext, - reservedProperties, - polarisEventListener)); + realmConfig, reservedProperties, polarisEventListener, adminService)); return new TestServices( clock,