This is an automated email from the ASF dual-hosted git repository.
yuqi4733 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 1636caf758 [#9586][followup] improvement(authz): Move check metalake
in use to server module (#9773)
1636caf758 is described below
commit 1636caf758a3507077dfcc32c7914ffefeb78693
Author: roryqi <[email protected]>
AuthorDate: Mon Jan 26 11:09:04 2026 +0800
[#9586][followup] improvement(authz): Move check metalake in use to server
module (#9773)
### What changes were proposed in this pull request?
Move check metalake in use to server module
### Why are the changes needed?
This is a follow up PR to optimize the code to avoid redundant check
### Does this PR introduce _any_ user-facing change?
No.
### How was this patch tested?
Existing tests.
---
.../gravitino/authorization/RoleManager.java | 7 --
.../gravitino/authorization/UserGroupManager.java | 23 -----
.../apache/gravitino/cache/ReverseIndexCache.java | 2 +-
.../apache/gravitino/metalake/MetalakeManager.java | 6 ++
.../authorization/TestAccessControlManager.java | 39 --------
.../TestAccessControlManagerForPermissions.java | 21 ----
.../authorization/jcasbin/JcasbinAuthorizer.java | 3 +-
.../gravitino/server/web/rest/GroupOperations.java | 14 ++-
.../web/rest/MetadataObjectRoleOperations.java | 2 +
.../gravitino/server/web/rest/OwnerOperations.java | 3 +
.../server/web/rest/PermissionOperations.java | 8 ++
.../gravitino/server/web/rest/RoleOperations.java | 14 ++-
.../gravitino/server/web/rest/UserOperations.java | 15 ++-
.../server/web/rest/TestGroupOperations.java | 83 ++++++++++++++--
.../web/rest/TestMetadataObjectRoleOperations.java | 25 ++++-
.../server/web/rest/TestOwnerOperations.java | 24 ++++-
.../server/web/rest/TestPermissionOperations.java | 107 ++++++++++++++++-----
.../server/web/rest/TestRoleOperations.java | 68 +++++++++++--
.../server/web/rest/TestUserOperations.java | 83 ++++++++++++++--
19 files changed, 388 insertions(+), 159 deletions(-)
diff --git
a/core/src/main/java/org/apache/gravitino/authorization/RoleManager.java
b/core/src/main/java/org/apache/gravitino/authorization/RoleManager.java
index 7ca615c290..94c35c3e8a 100644
--- a/core/src/main/java/org/apache/gravitino/authorization/RoleManager.java
+++ b/core/src/main/java/org/apache/gravitino/authorization/RoleManager.java
@@ -19,8 +19,6 @@
package org.apache.gravitino.authorization;
-import static org.apache.gravitino.metalake.MetalakeManager.checkMetalake;
-
import java.io.IOException;
import java.time.Instant;
import java.util.List;
@@ -66,7 +64,6 @@ class RoleManager {
Map<String, String> properties,
List<SecurableObject> securableObjects)
throws RoleAlreadyExistsException {
- checkMetalake(NameIdentifier.of(metalake), store);
RoleEntity roleEntity =
RoleEntity.builder()
.withId(idGenerator.nextId())
@@ -104,7 +101,6 @@ class RoleManager {
RoleEntity getRole(String metalake, String role) throws NoSuchRoleException {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
return getRoleEntity(AuthorizationUtils.ofRole(metalake, role));
} catch (NoSuchEntityException e) {
LOG.warn("Role {} does not exist in the metalake {}", role, metalake, e);
@@ -114,7 +110,6 @@ class RoleManager {
boolean deleteRole(String metalake, String role) {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
NameIdentifier ident = AuthorizationUtils.ofRole(metalake, role);
try {
@@ -139,7 +134,6 @@ class RoleManager {
String[] listRoleNames(String metalake) {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
Namespace namespace = AuthorizationUtils.ofRoleNamespace(metalake);
return store.list(namespace, RoleEntity.class,
Entity.EntityType.ROLE).stream()
.map(Role::name)
@@ -152,7 +146,6 @@ class RoleManager {
String[] listRoleNamesByObject(String metalake, MetadataObject object) {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
return store
.relationOperations()
diff --git
a/core/src/main/java/org/apache/gravitino/authorization/UserGroupManager.java
b/core/src/main/java/org/apache/gravitino/authorization/UserGroupManager.java
index 14f548cf6a..9a244212e1 100644
---
a/core/src/main/java/org/apache/gravitino/authorization/UserGroupManager.java
+++
b/core/src/main/java/org/apache/gravitino/authorization/UserGroupManager.java
@@ -18,8 +18,6 @@
*/
package org.apache.gravitino.authorization;
-import static org.apache.gravitino.metalake.MetalakeManager.checkMetalake;
-
import com.google.common.collect.Lists;
import java.io.IOException;
import java.time.Instant;
@@ -29,7 +27,6 @@ import org.apache.gravitino.Entity;
import org.apache.gravitino.Entity.EntityType;
import org.apache.gravitino.EntityAlreadyExistsException;
import org.apache.gravitino.EntityStore;
-import org.apache.gravitino.NameIdentifier;
import org.apache.gravitino.Namespace;
import org.apache.gravitino.exceptions.GroupAlreadyExistsException;
import org.apache.gravitino.exceptions.NoSuchEntityException;
@@ -38,7 +35,6 @@ import
org.apache.gravitino.exceptions.NoSuchMetalakeException;
import org.apache.gravitino.exceptions.NoSuchUserException;
import org.apache.gravitino.exceptions.UserAlreadyExistsException;
import org.apache.gravitino.meta.AuditInfo;
-import org.apache.gravitino.meta.BaseMetalake;
import org.apache.gravitino.meta.GroupEntity;
import org.apache.gravitino.meta.UserEntity;
import org.apache.gravitino.storage.IdGenerator;
@@ -66,7 +62,6 @@ class UserGroupManager {
User addUser(String metalake, String name) throws UserAlreadyExistsException
{
try {
- checkMetalake(NameIdentifier.of(metalake), store);
UserEntity userEntity =
UserEntity.builder()
.withId(idGenerator.nextId())
@@ -94,7 +89,6 @@ class UserGroupManager {
boolean removeUser(String metalake, String user) {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
return store.delete(AuthorizationUtils.ofUser(metalake, user),
Entity.EntityType.USER);
} catch (IOException ioe) {
LOG.error(
@@ -105,18 +99,8 @@ class UserGroupManager {
User getUser(String metalake, String user) throws NoSuchUserException {
try {
- // Only check metalake existence, not enabled status, to allow reading
user info
- // on disabled metalakes for internal operations like checkCurrentUser().
- try {
- store.get(NameIdentifier.of(metalake), Entity.EntityType.METALAKE,
BaseMetalake.class);
- } catch (NoSuchEntityException e) {
- LOG.error("Metalake {} does not exist", metalake, e);
- throw new NoSuchMetalakeException(METALAKE_DOES_NOT_EXIST_MSG,
metalake);
- }
-
return store.get(
AuthorizationUtils.ofUser(metalake, user), Entity.EntityType.USER,
UserEntity.class);
-
} catch (NoSuchEntityException e) {
LOG.warn("User {} does not exist in the metalake {}", user, metalake, e);
throw new
NoSuchUserException(AuthorizationUtils.USER_DOES_NOT_EXIST_MSG, user, metalake);
@@ -139,7 +123,6 @@ class UserGroupManager {
Group addGroup(String metalake, String group) throws
GroupAlreadyExistsException {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
GroupEntity groupEntity =
GroupEntity.builder()
.withId(idGenerator.nextId())
@@ -167,7 +150,6 @@ class UserGroupManager {
boolean removeGroup(String metalake, String group) {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
return store.delete(AuthorizationUtils.ofGroup(metalake, group),
Entity.EntityType.GROUP);
} catch (IOException ioe) {
LOG.error(
@@ -181,8 +163,6 @@ class UserGroupManager {
Group getGroup(String metalake, String group) {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
-
return store.get(
AuthorizationUtils.ofGroup(metalake, group),
Entity.EntityType.GROUP, GroupEntity.class);
} catch (NoSuchEntityException e) {
@@ -206,8 +186,6 @@ class UserGroupManager {
private User[] listUsersInternal(String metalake, boolean allFields) {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
-
Namespace namespace = AuthorizationUtils.ofUserNamespace(metalake);
return store
.list(namespace, UserEntity.class, Entity.EntityType.USER, allFields)
@@ -223,7 +201,6 @@ class UserGroupManager {
private Group[] listGroupInternal(String metalake, boolean allFields) {
try {
- checkMetalake(NameIdentifier.of(metalake), store);
Namespace namespace = AuthorizationUtils.ofGroupNamespace(metalake);
return store
.list(namespace, GroupEntity.class, EntityType.GROUP, allFields)
diff --git
a/core/src/main/java/org/apache/gravitino/cache/ReverseIndexCache.java
b/core/src/main/java/org/apache/gravitino/cache/ReverseIndexCache.java
index 49cc91e8b8..a2956dbf06 100644
--- a/core/src/main/java/org/apache/gravitino/cache/ReverseIndexCache.java
+++ b/core/src/main/java/org/apache/gravitino/cache/ReverseIndexCache.java
@@ -72,7 +72,7 @@ public class ReverseIndexCache {
* or the data will be in the memory forever.
*/
private final Map<EntityCacheKey, List<EntityCacheKey>>
entityToReverseIndexMap =
- Maps.newHashMap();
+ Maps.newConcurrentMap();
public ReverseIndexCache() {
this.reverseIndex = new ConcurrentRadixTree<>(new
DefaultCharArrayNodeFactory());
diff --git
a/core/src/main/java/org/apache/gravitino/metalake/MetalakeManager.java
b/core/src/main/java/org/apache/gravitino/metalake/MetalakeManager.java
index 5d586f718e..1bc5dfd13b 100644
--- a/core/src/main/java/org/apache/gravitino/metalake/MetalakeManager.java
+++ b/core/src/main/java/org/apache/gravitino/metalake/MetalakeManager.java
@@ -53,6 +53,7 @@ import org.apache.gravitino.meta.CatalogEntity;
import org.apache.gravitino.meta.SchemaVersion;
import org.apache.gravitino.storage.IdGenerator;
import org.apache.gravitino.utils.Executable;
+import org.apache.gravitino.utils.NameIdentifierUtil;
import org.apache.gravitino.utils.PrincipalUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -132,6 +133,11 @@ public class MetalakeManager implements
MetalakeDispatcher, Closeable {
}
}
+ public static void checkMetalakeInUse(String metalake) {
+ checkMetalake(
+ NameIdentifierUtil.ofMetalake(metalake),
GravitinoEnv.getInstance().entityStore());
+ }
+
/**
* Lists all in-use Metalakes.
*
diff --git
a/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManager.java
b/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManager.java
index 23e8a71f5f..0928d5d9f9 100644
---
a/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManager.java
+++
b/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManager.java
@@ -63,7 +63,6 @@ import org.apache.gravitino.connector.BaseCatalog;
import org.apache.gravitino.connector.authorization.AuthorizationPlugin;
import org.apache.gravitino.exceptions.GroupAlreadyExistsException;
import org.apache.gravitino.exceptions.NoSuchGroupException;
-import org.apache.gravitino.exceptions.NoSuchMetalakeException;
import org.apache.gravitino.exceptions.NoSuchRoleException;
import org.apache.gravitino.exceptions.NoSuchUserException;
import org.apache.gravitino.exceptions.RoleAlreadyExistsException;
@@ -205,10 +204,6 @@ public class TestAccessControlManager {
Assertions.assertEquals("testAddWithOptionalField", user.name());
Assertions.assertTrue(user.roles().isEmpty());
- // Test with NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class, () ->
accessControlManager.addUser("no-exist", "testAdd"));
-
// Test with UserAlreadyExistsException
Assertions.assertThrows(
UserAlreadyExistsException.class, () ->
accessControlManager.addUser(METALAKE, "testAdd"));
@@ -221,10 +216,6 @@ public class TestAccessControlManager {
User user = accessControlManager.getUser(METALAKE, "testGet");
Assertions.assertEquals("testGet", user.name());
- // Test with NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class, () ->
accessControlManager.getUser("no-exist", "testAdd"));
-
// Test to get non-existed user
Throwable exception =
Assertions.assertThrows(
@@ -236,11 +227,6 @@ public class TestAccessControlManager {
public void testRemoveUser() {
accessControlManager.addUser(METALAKE, "testRemove");
- // Test with NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class,
- () -> accessControlManager.removeUser("no-exist", "testAdd"));
-
// Test to remove user
boolean removed = accessControlManager.removeUser(METALAKE, "testRemove");
Assertions.assertTrue(removed);
@@ -264,12 +250,6 @@ public class TestAccessControlManager {
Arrays.sort(users, Comparator.comparing(User::name));
Assertions.assertArrayEquals(
expectUsernames,
Arrays.stream(users).map(User::name).toArray(String[]::new));
-
- // Test with NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class, () ->
accessControlManager.listUserNames("no-exist"));
- Assertions.assertThrows(
- NoSuchMetalakeException.class, () ->
accessControlManager.listUsers("no-exist"));
}
@Test
@@ -283,10 +263,6 @@ public class TestAccessControlManager {
Assertions.assertEquals("testAddWithOptionalField", group.name());
Assertions.assertTrue(group.roles().isEmpty());
- // Test with NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class, () ->
accessControlManager.addGroup("no-exist", "testAdd"));
-
// Test with GroupAlreadyExistsException
Assertions.assertThrows(
GroupAlreadyExistsException.class,
@@ -300,10 +276,6 @@ public class TestAccessControlManager {
Group group = accessControlManager.getGroup(METALAKE, "testGet");
Assertions.assertEquals("testGet", group.name());
- // Test with NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class, () ->
accessControlManager.getGroup("no-exist", "testAdd"));
-
// Test to get non-existed group
Throwable exception =
Assertions.assertThrows(
@@ -325,23 +297,12 @@ public class TestAccessControlManager {
Arrays.sort(groups, Comparator.comparing(Group::name));
Assertions.assertArrayEquals(
expectGroupNames,
Arrays.stream(groups).map(Group::name).toArray(String[]::new));
-
- // Test with NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class, () ->
accessControlManager.listGroupNames("no-exist"));
- Assertions.assertThrows(
- NoSuchMetalakeException.class, () ->
accessControlManager.listGroups("no-exist"));
}
@Test
public void testRemoveGroup() {
accessControlManager.addGroup(METALAKE, "testRemove");
- // Test with NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class,
- () -> accessControlManager.removeGroup("no-exist", "testAdd"));
-
// Test to remove group
boolean removed = accessControlManager.removeGroup(METALAKE, "testRemove");
Assertions.assertTrue(removed);
diff --git
a/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
b/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
index 4b9903538e..7a6564270b 100644
---
a/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
+++
b/core/src/test/java/org/apache/gravitino/authorization/TestAccessControlManagerForPermissions.java
@@ -46,7 +46,6 @@ import org.apache.gravitino.connector.BaseCatalog;
import org.apache.gravitino.connector.authorization.AuthorizationPlugin;
import org.apache.gravitino.exceptions.IllegalRoleException;
import org.apache.gravitino.exceptions.NoSuchGroupException;
-import org.apache.gravitino.exceptions.NoSuchMetalakeException;
import org.apache.gravitino.exceptions.NoSuchRoleException;
import org.apache.gravitino.exceptions.NoSuchUserException;
import org.apache.gravitino.lock.LockManager;
@@ -221,11 +220,6 @@ public class TestAccessControlManagerForPermissions {
user = accessControlManager.grantRolesToUser(METALAKE, ROLE, USER);
Assertions.assertEquals(1, user.roles().size());
- // Throw NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class,
- () -> accessControlManager.grantRolesToUser(notExist, ROLE, USER));
-
// Throw IllegalRoleException
Assertions.assertThrows(
IllegalRoleException.class,
@@ -255,11 +249,6 @@ public class TestAccessControlManagerForPermissions {
// Test authorization plugin
Mockito.verify(authorizationPlugin).onRevokedRolesFromUser(any(), any());
- // Throw NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class,
- () -> accessControlManager.revokeRolesFromUser(notExist, ROLE, USER));
-
// Throw IllegalRoleException
Assertions.assertThrows(
IllegalRoleException.class,
@@ -299,11 +288,6 @@ public class TestAccessControlManagerForPermissions {
group = accessControlManager.grantRolesToGroup(METALAKE, ROLE, GROUP);
Assertions.assertEquals(1, group.roles().size());
- // Throw NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class,
- () -> accessControlManager.grantRolesToGroup(notExist, ROLE, GROUP));
-
// Throw IllegalRoleException
Assertions.assertThrows(
IllegalRoleException.class,
@@ -334,11 +318,6 @@ public class TestAccessControlManagerForPermissions {
// Test authorization plugin
verify(authorizationPlugin).onRevokedRolesFromGroup(any(), any());
- // Throw NoSuchMetalakeException
- Assertions.assertThrows(
- NoSuchMetalakeException.class,
- () -> accessControlManager.revokeRolesFromGroup(notExist, ROLE,
GROUP));
-
// Throw IllegalRoleException
Assertions.assertThrows(
IllegalRoleException.class,
diff --git
a/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
b/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
index 54f6241a94..2b569933da 100644
---
a/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
+++
b/server-common/src/main/java/org/apache/gravitino/server/authorization/jcasbin/JcasbinAuthorizer.java
@@ -50,6 +50,7 @@ import org.apache.gravitino.authorization.AuthorizationUtils;
import org.apache.gravitino.authorization.GravitinoAuthorizer;
import org.apache.gravitino.authorization.Privilege;
import org.apache.gravitino.authorization.SecurableObject;
+import org.apache.gravitino.exceptions.NoSuchUserException;
import org.apache.gravitino.meta.RoleEntity;
import org.apache.gravitino.meta.UserEntity;
import org.apache.gravitino.server.authorization.MetadataIdConverter;
@@ -228,7 +229,7 @@ public class JcasbinAuthorizer implements
GravitinoAuthorizer {
try {
return
GravitinoEnv.getInstance().accessControlDispatcher().getUser(metalake,
currentUserName)
!= null;
- } catch (Exception e) {
+ } catch (NoSuchUserException e) {
LOG.warn("Can not get user {} in metalake {}", currentUserName,
metalake, e);
return false;
}
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
index 08ca7b7325..eea20c3ccb 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
@@ -45,6 +45,7 @@ import org.apache.gravitino.dto.responses.GroupResponse;
import org.apache.gravitino.dto.responses.NameListResponse;
import org.apache.gravitino.dto.responses.RemoveResponse;
import org.apache.gravitino.dto.util.DTOConverters;
+import org.apache.gravitino.metalake.MetalakeManager;
import org.apache.gravitino.metrics.MetricNames;
import org.apache.gravitino.server.authorization.NameBindings;
import
org.apache.gravitino.server.authorization.annotations.AuthorizationExpression;
@@ -82,10 +83,12 @@ public class GroupOperations {
try {
return Utils.doAs(
httpRequest,
- () ->
- Utils.ok(
- new GroupResponse(
-
DTOConverters.toDTO(accessControlManager.getGroup(metalake, group)))));
+ () -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
+ return Utils.ok(
+ new GroupResponse(
+
DTOConverters.toDTO(accessControlManager.getGroup(metalake, group))));
+ });
} catch (Exception e) {
return ExceptionHandlers.handleGroupException(OperationType.GET, group,
metalake, e);
}
@@ -105,6 +108,7 @@ public class GroupOperations {
httpRequest,
() -> {
request.validate();
+ MetalakeManager.checkMetalakeInUse(metalake);
return Utils.ok(
new GroupResponse(
DTOConverters.toDTO(
@@ -130,6 +134,7 @@ public class GroupOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
ownerDispatcher
.getOwner(
metalake, MetadataObjects.of(null, metalake,
MetadataObject.Type.METALAKE))
@@ -168,6 +173,7 @@ public class GroupOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
if (verbose) {
return Utils.ok(
new GroupListResponse(
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/MetadataObjectRoleOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/MetadataObjectRoleOperations.java
index 10c08857f6..225a2e5e6b 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/MetadataObjectRoleOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/MetadataObjectRoleOperations.java
@@ -34,6 +34,7 @@ import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.MetadataObjects;
import org.apache.gravitino.authorization.AccessControlDispatcher;
import org.apache.gravitino.dto.responses.NameListResponse;
+import org.apache.gravitino.metalake.MetalakeManager;
import org.apache.gravitino.metrics.MetricNames;
import org.apache.gravitino.server.authorization.MetadataAuthzHelper;
import org.apache.gravitino.server.authorization.NameBindings;
@@ -74,6 +75,7 @@ public class MetadataObjectRoleOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
String[] names =
accessControlDispatcher.listRoleNamesByObject(metalake, object);
names =
MetadataAuthzHelper.filterByExpression(
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
index c597aa1bea..cd1dcc6d15 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/OwnerOperations.java
@@ -43,6 +43,7 @@ import org.apache.gravitino.dto.requests.OwnerSetRequest;
import org.apache.gravitino.dto.responses.OwnerResponse;
import org.apache.gravitino.dto.responses.SetResponse;
import org.apache.gravitino.dto.util.DTOConverters;
+import org.apache.gravitino.metalake.MetalakeManager;
import org.apache.gravitino.metrics.MetricNames;
import org.apache.gravitino.server.authorization.NameBindings;
import
org.apache.gravitino.server.authorization.annotations.AuthorizationExpression;
@@ -87,6 +88,7 @@ public class OwnerOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
MetadataObjectUtil.checkMetadataObject(metalake, object);
Optional<Owner> owner = ownerDispatcher.getOwner(metalake, object);
if (owner.isPresent()) {
@@ -124,6 +126,7 @@ public class OwnerOperations {
httpRequest,
() -> {
request.validate();
+ MetalakeManager.checkMetalakeInUse(metalake);
MetadataObjectUtil.checkMetadataObject(metalake, object);
ownerDispatcher.setOwner(metalake, object, request.getName(),
request.getType());
return Utils.ok(new SetResponse(true));
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/PermissionOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/PermissionOperations.java
index 7481d21ed3..51337850f8 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/PermissionOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/PermissionOperations.java
@@ -54,6 +54,7 @@ import org.apache.gravitino.dto.responses.GroupResponse;
import org.apache.gravitino.dto.responses.RoleResponse;
import org.apache.gravitino.dto.responses.UserResponse;
import org.apache.gravitino.dto.util.DTOConverters;
+import org.apache.gravitino.metalake.MetalakeManager;
import org.apache.gravitino.metrics.MetricNames;
import org.apache.gravitino.server.authorization.NameBindings;
import
org.apache.gravitino.server.authorization.annotations.AuthorizationExpression;
@@ -91,6 +92,7 @@ public class PermissionOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
request.validate();
return Utils.ok(
new UserResponse(
@@ -119,6 +121,7 @@ public class PermissionOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
request.validate();
return Utils.ok(
new GroupResponse(
@@ -148,6 +151,7 @@ public class PermissionOperations {
httpRequest,
() -> {
request.validate();
+ MetalakeManager.checkMetalakeInUse(metalake);
return Utils.ok(
new UserResponse(
DTOConverters.toDTO(
@@ -176,6 +180,7 @@ public class PermissionOperations {
httpRequest,
() -> {
request.validate();
+ MetalakeManager.checkMetalakeInUse(metalake);
return Utils.ok(
new GroupResponse(
DTOConverters.toDTO(
@@ -212,6 +217,7 @@ public class PermissionOperations {
httpRequest,
() -> {
privilegeGrantRequest.validate();
+ MetalakeManager.checkMetalakeInUse(metalake);
for (PrivilegeDTO privilegeDTO :
privilegeGrantRequest.getPrivileges()) {
AuthorizationUtils.checkPrivilege(privilegeDTO, object,
metalake);
@@ -259,6 +265,7 @@ public class PermissionOperations {
httpRequest,
() -> {
privilegeRevokeRequest.validate();
+ MetalakeManager.checkMetalakeInUse(metalake);
for (PrivilegeDTO privilegeDTO :
privilegeRevokeRequest.getPrivileges()) {
AuthorizationUtils.checkPrivilege(privilegeDTO, object,
metalake);
@@ -299,6 +306,7 @@ public class PermissionOperations {
httpRequest,
() -> {
request.validate();
+ MetalakeManager.checkMetalakeInUse(metalake);
// Check update objects
List<SecurableObject> updatedObjects = Lists.newArrayList();
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
index 91981ab973..684ac03b6f 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
@@ -52,6 +52,7 @@ import org.apache.gravitino.dto.responses.RoleResponse;
import org.apache.gravitino.dto.util.DTOConverters;
import org.apache.gravitino.exceptions.IllegalMetadataObjectException;
import org.apache.gravitino.exceptions.NoSuchMetadataObjectException;
+import org.apache.gravitino.metalake.MetalakeManager;
import org.apache.gravitino.metrics.MetricNames;
import org.apache.gravitino.server.authorization.MetadataAuthzHelper;
import org.apache.gravitino.server.authorization.NameBindings;
@@ -89,6 +90,7 @@ public class RoleOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
String[] names = accessControlManager.listRoleNames(metalake);
names =
MetadataAuthzHelper.filterByExpression(
@@ -118,10 +120,12 @@ public class RoleOperations {
try {
return Utils.doAs(
httpRequest,
- () ->
- Utils.ok(
- new RoleResponse(
-
DTOConverters.toDTO(accessControlManager.getRole(metalake, role)))));
+ () -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
+ return Utils.ok(
+ new RoleResponse(
+ DTOConverters.toDTO(accessControlManager.getRole(metalake,
role))));
+ });
} catch (Exception e) {
return ExceptionHandlers.handleRoleException(OperationType.GET, role,
metalake, e);
}
@@ -142,6 +146,7 @@ public class RoleOperations {
httpRequest,
() -> {
request.validate();
+ MetalakeManager.checkMetalakeInUse(metalake);
Set<MetadataObject> metadataObjects = Sets.newHashSet();
for (SecurableObjectDTO object : request.getSecurableObjects()) {
MetadataObject metadataObject =
@@ -211,6 +216,7 @@ public class RoleOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
boolean deleted = accessControlManager.deleteRole(metalake, role);
if (!deleted) {
LOG.warn("Failed to delete role {} under metalake {}", role,
metalake);
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
index 2fc38033c8..5bce5e8fc9 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
@@ -45,6 +45,7 @@ import org.apache.gravitino.dto.responses.RemoveResponse;
import org.apache.gravitino.dto.responses.UserListResponse;
import org.apache.gravitino.dto.responses.UserResponse;
import org.apache.gravitino.dto.util.DTOConverters;
+import org.apache.gravitino.metalake.MetalakeManager;
import org.apache.gravitino.metrics.MetricNames;
import org.apache.gravitino.server.authorization.MetadataAuthzHelper;
import org.apache.gravitino.server.authorization.NameBindings;
@@ -90,10 +91,12 @@ public class UserOperations {
try {
return Utils.doAs(
httpRequest,
- () ->
- Utils.ok(
- new UserResponse(
-
DTOConverters.toDTO(accessControlManager.getUser(metalake, user)))));
+ () -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
+ return Utils.ok(
+ new UserResponse(
+ DTOConverters.toDTO(accessControlManager.getUser(metalake,
user))));
+ });
} catch (Exception e) {
return ExceptionHandlers.handleUserException(OperationType.GET, user,
metalake, e);
}
@@ -112,6 +115,7 @@ public class UserOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
if (verbose) {
User[] users = accessControlManager.listUsers(metalake);
users =
@@ -154,6 +158,7 @@ public class UserOperations {
httpRequest,
() -> {
request.validate();
+ MetalakeManager.checkMetalakeInUse(metalake);
return Utils.ok(
new UserResponse(
DTOConverters.toDTO(
@@ -179,6 +184,8 @@ public class UserOperations {
return Utils.doAs(
httpRequest,
() -> {
+ MetalakeManager.checkMetalakeInUse(metalake);
+
ownerManager
.getOwner(
metalake, MetadataObjects.of(null, metalake,
MetadataObject.Type.METALAKE))
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
index bac1657b00..64e6095dc3 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
@@ -38,11 +38,13 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.gravitino.Config;
+import org.apache.gravitino.EntityStore;
import org.apache.gravitino.GravitinoEnv;
import org.apache.gravitino.authorization.AccessControlManager;
import org.apache.gravitino.authorization.Group;
import org.apache.gravitino.authorization.Owner;
import org.apache.gravitino.authorization.OwnerDispatcher;
+import org.apache.gravitino.connector.PropertiesMetadata;
import org.apache.gravitino.dto.authorization.GroupDTO;
import org.apache.gravitino.dto.requests.GroupAddRequest;
import org.apache.gravitino.dto.responses.ErrorConstants;
@@ -52,10 +54,12 @@ import org.apache.gravitino.dto.responses.GroupResponse;
import org.apache.gravitino.dto.responses.NameListResponse;
import org.apache.gravitino.dto.responses.RemoveResponse;
import org.apache.gravitino.exceptions.GroupAlreadyExistsException;
+import org.apache.gravitino.exceptions.NoSuchEntityException;
import org.apache.gravitino.exceptions.NoSuchGroupException;
import org.apache.gravitino.exceptions.NoSuchMetalakeException;
import org.apache.gravitino.lock.LockManager;
import org.apache.gravitino.meta.AuditInfo;
+import org.apache.gravitino.meta.BaseMetalake;
import org.apache.gravitino.meta.GroupEntity;
import org.apache.gravitino.rest.RESTUtils;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
@@ -70,6 +74,7 @@ public class TestGroupOperations extends BaseOperationsTest {
private static final AccessControlManager manager =
mock(AccessControlManager.class);
private static final OwnerDispatcher ownerDispatcher =
mock(OwnerDispatcher.class);
+ private static final EntityStore entityStore = mock(EntityStore.class);
private static class MockServletRequestFactory extends
ServletRequestFactoryBase {
@Override
@@ -89,6 +94,7 @@ public class TestGroupOperations extends BaseOperationsTest {
FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new
LockManager(config), true);
FieldUtils.writeField(GravitinoEnv.getInstance(),
"accessControlDispatcher", manager, true);
FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher",
ownerDispatcher, true);
+ FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore",
entityStore, true);
}
@Override
@@ -114,12 +120,19 @@ public class TestGroupOperations extends
BaseOperationsTest {
}
@Test
- public void testAddGroup() {
+ public void testAddGroup() throws IOException {
GroupAddRequest req = new GroupAddRequest("group1");
Group group = buildGroup("group1");
when(manager.addGroup(any(), any())).thenReturn(group);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
// test with IllegalRequest
GroupAddRequest illegalReq = new GroupAddRequest("");
Response illegalResp =
@@ -147,7 +160,7 @@ public class TestGroupOperations extends BaseOperationsTest
{
Assertions.assertTrue(groupDTO.roles().isEmpty());
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).addGroup(any(), any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/groups")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -162,6 +175,12 @@ public class TestGroupOperations extends
BaseOperationsTest {
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw GroupAlreadyExistsException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new GroupAlreadyExistsException("mock
error")).when(manager).addGroup(any(), any());
Response resp2 =
target("/metalakes/metalake1/groups")
@@ -192,11 +211,18 @@ public class TestGroupOperations extends
BaseOperationsTest {
}
@Test
- public void testGetGroup() {
+ public void testGetGroup() throws IOException {
Group group = buildGroup("group1");
when(manager.getGroup(any(), any())).thenReturn(group);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/groups/group1")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -213,7 +239,7 @@ public class TestGroupOperations extends BaseOperationsTest
{
Assertions.assertTrue(groupDTO.roles().isEmpty());
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).getGroup(any(), any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/groups/group1")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -227,6 +253,12 @@ public class TestGroupOperations extends
BaseOperationsTest {
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw NoSuchGroupException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new NoSuchGroupException("mock
error")).when(manager).getGroup(any(), any());
Response resp2 =
target("/metalakes/metalake1/groups/group1")
@@ -257,9 +289,16 @@ public class TestGroupOperations extends
BaseOperationsTest {
}
@Test
- public void testListGroupNames() {
+ public void testListGroupNames() throws IOException {
when(manager.listGroupNames(any())).thenReturn(new String[] {"group"});
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/groups/")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -274,7 +313,7 @@ public class TestGroupOperations extends BaseOperationsTest
{
Assertions.assertEquals("group", listResponse.getNames()[0]);
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).listGroupNames(any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/groups/")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -288,6 +327,12 @@ public class TestGroupOperations extends
BaseOperationsTest {
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw internal RuntimeException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new RuntimeException("mock
error")).when(manager).listGroupNames(any());
Response resp3 =
target("/metalakes/metalake1/groups")
@@ -304,10 +349,17 @@ public class TestGroupOperations extends
BaseOperationsTest {
}
@Test
- public void testListGroups() {
+ public void testListGroups() throws IOException {
Group group = buildGroup("group");
when(manager.listGroups(any())).thenReturn(new Group[] {group});
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/groups/")
.queryParam("details", "true")
@@ -324,7 +376,7 @@ public class TestGroupOperations extends BaseOperationsTest
{
Assertions.assertEquals(group.roles(),
listResponse.getGroups()[0].roles());
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).listGroups(any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/groups/")
.queryParam("details", "true")
@@ -339,6 +391,12 @@ public class TestGroupOperations extends
BaseOperationsTest {
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw internal RuntimeException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new RuntimeException("mock
error")).when(manager).listGroups(any());
Response resp3 =
target("/metalakes/metalake1/groups")
@@ -356,7 +414,14 @@ public class TestGroupOperations extends
BaseOperationsTest {
}
@Test
- public void testRemoveGroup() {
+ public void testRemoveGroup() throws IOException {
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
// Delete the metalake owner
when(manager.removeGroup(any(), any())).thenReturn(true);
Owner owner = mock(Owner.class);
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestMetadataObjectRoleOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestMetadataObjectRoleOperations.java
index 19c545a08a..339953434a 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestMetadataObjectRoleOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestMetadataObjectRoleOperations.java
@@ -33,13 +33,17 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.gravitino.Config;
+import org.apache.gravitino.EntityStore;
import org.apache.gravitino.GravitinoEnv;
import org.apache.gravitino.authorization.AccessControlManager;
+import org.apache.gravitino.connector.PropertiesMetadata;
import org.apache.gravitino.dto.responses.ErrorConstants;
import org.apache.gravitino.dto.responses.ErrorResponse;
import org.apache.gravitino.dto.responses.NameListResponse;
+import org.apache.gravitino.exceptions.NoSuchEntityException;
import org.apache.gravitino.exceptions.NoSuchMetalakeException;
import org.apache.gravitino.lock.LockManager;
+import org.apache.gravitino.meta.BaseMetalake;
import org.apache.gravitino.rest.RESTUtils;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
@@ -53,6 +57,7 @@ import org.mockito.Mockito;
public class TestMetadataObjectRoleOperations extends JerseyTest {
private static final AccessControlManager manager =
mock(AccessControlManager.class);
+ private static final EntityStore entityStore = mock(EntityStore.class);
private static class MockServletRequestFactory extends
ServletRequestFactoryBase {
@Override
@@ -71,6 +76,7 @@ public class TestMetadataObjectRoleOperations extends
JerseyTest {
Mockito.doReturn(36000L).when(config).get(TREE_LOCK_CLEAN_INTERVAL);
FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new
LockManager(config), true);
FieldUtils.writeField(GravitinoEnv.getInstance(),
"accessControlDispatcher", manager, true);
+ FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore",
entityStore, true);
}
@Override
@@ -96,9 +102,16 @@ public class TestMetadataObjectRoleOperations extends
JerseyTest {
}
@Test
- public void testListRoleNames() {
+ public void testListRoleNames() throws IOException {
when(manager.listRoleNamesByObject(any(), any())).thenReturn(new String[]
{"role"});
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/objects/metalake/metalake1/roles/")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -113,9 +126,7 @@ public class TestMetadataObjectRoleOperations extends
JerseyTest {
Assertions.assertEquals("role", listResponse.getNames()[0]);
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock error"))
- .when(manager)
- .listRoleNamesByObject(any(), any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/objects/metalake/metalake1/roles/")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -129,6 +140,12 @@ public class TestMetadataObjectRoleOperations extends
JerseyTest {
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw internal RuntimeException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new RuntimeException("mock
error")).when(manager).listRoleNamesByObject(any(), any());
Response resp3 =
target("/metalakes/metalake1/objects/metalake/metalake1/roles")
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
index ac94fb44bc..5d0c6ff2b0 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestOwnerOperations.java
@@ -35,6 +35,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.gravitino.Config;
+import org.apache.gravitino.EntityStore;
import org.apache.gravitino.GravitinoEnv;
import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.MetadataObjects;
@@ -42,6 +43,7 @@ import
org.apache.gravitino.authorization.AccessControlDispatcher;
import org.apache.gravitino.authorization.Owner;
import org.apache.gravitino.authorization.OwnerManager;
import org.apache.gravitino.authorization.Role;
+import org.apache.gravitino.connector.PropertiesMetadata;
import org.apache.gravitino.dto.authorization.OwnerDTO;
import org.apache.gravitino.dto.requests.OwnerSetRequest;
import org.apache.gravitino.dto.responses.ErrorConstants;
@@ -52,6 +54,7 @@ import
org.apache.gravitino.exceptions.NoSuchMetadataObjectException;
import org.apache.gravitino.exceptions.NoSuchRoleException;
import org.apache.gravitino.exceptions.NotFoundException;
import org.apache.gravitino.lock.LockManager;
+import org.apache.gravitino.meta.BaseMetalake;
import org.apache.gravitino.metalake.MetalakeDispatcher;
import org.apache.gravitino.rest.RESTUtils;
import org.apache.gravitino.utils.MetadataObjectUtil;
@@ -68,6 +71,7 @@ class TestOwnerOperations extends BaseOperationsTest {
private static final MetalakeDispatcher metalakeDispatcher =
mock(MetalakeDispatcher.class);
private static final AccessControlDispatcher accessControlDispatcher =
mock(AccessControlDispatcher.class);
+ private static final EntityStore entityStore = mock(EntityStore.class);
private static class MockServletRequestFactory extends
ServletRequestFactoryBase {
@Override
@@ -90,6 +94,7 @@ class TestOwnerOperations extends BaseOperationsTest {
GravitinoEnv.getInstance(), "metalakeDispatcher", metalakeDispatcher,
true);
FieldUtils.writeField(
GravitinoEnv.getInstance(), "accessControlDispatcher",
accessControlDispatcher, true);
+ FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore",
entityStore, true);
}
@Override
@@ -115,7 +120,7 @@ class TestOwnerOperations extends BaseOperationsTest {
}
@Test
- void testGetOwnerForObject() {
+ void testGetOwnerForObject() throws IOException {
Owner owner =
new Owner() {
@Override
@@ -132,6 +137,13 @@ class TestOwnerOperations extends BaseOperationsTest {
when(manager.getOwner(any(), any())).thenReturn(Optional.of(owner));
when(metalakeDispatcher.metalakeExists(any())).thenReturn(true);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/owners/metalake/metalake1")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -199,8 +211,16 @@ class TestOwnerOperations extends BaseOperationsTest {
}
@Test
- void testSetOwnerForObject() {
+ void testSetOwnerForObject() throws IOException {
when(metalakeDispatcher.metalakeExists(any())).thenReturn(true);
+
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
OwnerSetRequest invalidRequest = new OwnerSetRequest(null,
Owner.Type.USER);
Response invalidResp =
target("/metalakes/metalake1/owners/metalake/metalake1")
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
index ba7f1b4456..6a18db9af7 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestPermissionOperations.java
@@ -37,6 +37,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.gravitino.Config;
+import org.apache.gravitino.EntityStore;
import org.apache.gravitino.GravitinoEnv;
import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.authorization.AccessControlManager;
@@ -48,6 +49,7 @@ import org.apache.gravitino.authorization.SecurableObject;
import org.apache.gravitino.authorization.SecurableObjects;
import org.apache.gravitino.authorization.User;
import org.apache.gravitino.catalog.TableDispatcher;
+import org.apache.gravitino.connector.PropertiesMetadata;
import org.apache.gravitino.dto.authorization.PrivilegeDTO;
import org.apache.gravitino.dto.authorization.SecurableObjectDTO;
import org.apache.gravitino.dto.requests.PrivilegeGrantRequest;
@@ -62,11 +64,14 @@ import org.apache.gravitino.dto.responses.RoleResponse;
import org.apache.gravitino.dto.responses.UserResponse;
import org.apache.gravitino.exceptions.IllegalPrivilegeException;
import org.apache.gravitino.exceptions.IllegalRoleException;
+import org.apache.gravitino.exceptions.NoSuchEntityException;
+import org.apache.gravitino.exceptions.NoSuchGroupException;
import org.apache.gravitino.exceptions.NoSuchMetadataObjectException;
import org.apache.gravitino.exceptions.NoSuchMetalakeException;
import org.apache.gravitino.exceptions.NoSuchUserException;
import org.apache.gravitino.lock.LockManager;
import org.apache.gravitino.meta.AuditInfo;
+import org.apache.gravitino.meta.BaseMetalake;
import org.apache.gravitino.meta.GroupEntity;
import org.apache.gravitino.meta.RoleEntity;
import org.apache.gravitino.meta.UserEntity;
@@ -85,6 +90,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
private static final AccessControlManager manager =
mock(AccessControlManager.class);
private static final MetalakeDispatcher metalakeDispatcher =
mock(MetalakeDispatcher.class);
private static final TableDispatcher tableDispatcher =
mock(TableDispatcher.class);
+ private static final EntityStore entityStore = mock(EntityStore.class);
private static class MockServletRequestFactory extends
ServletRequestFactoryBase {
@Override
@@ -106,6 +112,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
FieldUtils.writeField(
GravitinoEnv.getInstance(), "metalakeDispatcher", metalakeDispatcher,
true);
FieldUtils.writeField(GravitinoEnv.getInstance(), "tableDispatcher",
tableDispatcher, true);
+ FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore",
entityStore, true);
}
@Override
@@ -131,7 +138,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
}
@Test
- public void testGrantRolesToUser() {
+ public void testGrantRolesToUser() throws IOException {
UserEntity userEntity =
UserEntity.builder()
.withId(1L)
@@ -143,6 +150,13 @@ public class TestPermissionOperations extends
BaseOperationsTest {
.build();
when(manager.grantRolesToUser(any(), any(), any())).thenReturn(userEntity);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
RoleGrantRequest illegalReq = new RoleGrantRequest(null);
Response illegalResp =
target("/metalakes/metalake1/permissions/users/user/grant")
@@ -168,9 +182,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
Assertions.assertEquals(userEntity.name(), user.name());
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock error"))
- .when(manager)
- .grantRolesToUser(any(), any(), any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/permissions/users/user/grant")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -185,6 +197,12 @@ public class TestPermissionOperations extends
BaseOperationsTest {
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw NoSuchUserException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new NoSuchUserException("mock error"))
.when(manager)
.grantRolesToUser(any(), any(), any());
@@ -235,7 +253,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
}
@Test
- public void testGrantRolesToGroup() {
+ public void testGrantRolesToGroup() throws IOException {
GroupEntity groupEntity =
GroupEntity.builder()
.withId(1L)
@@ -247,7 +265,13 @@ public class TestPermissionOperations extends
BaseOperationsTest {
.build();
when(manager.grantRolesToGroup(any(), any(),
any())).thenReturn(groupEntity);
- // Test with Illegal request
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
RoleGrantRequest illegalReq = new RoleGrantRequest(null);
Response illegalResp =
target("/metalakes/metalake1/permissions/groups/group/grant")
@@ -257,7 +281,6 @@ public class TestPermissionOperations extends
BaseOperationsTest {
Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(),
illegalResp.getStatus());
RoleGrantRequest request = new
RoleGrantRequest(Lists.newArrayList("role1"));
-
Response resp =
target("/metalakes/metalake1/permissions/groups/group/grant")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -267,17 +290,14 @@ public class TestPermissionOperations extends
BaseOperationsTest {
Assertions.assertEquals(Response.Status.OK.getStatusCode(),
resp.getStatus());
Assertions.assertEquals(MediaType.APPLICATION_JSON_TYPE,
resp.getMediaType());
- GroupResponse grantResponse = resp.readEntity(GroupResponse.class);
- Assertions.assertEquals(0, grantResponse.getCode());
-
- Group group = grantResponse.getGroup();
+ GroupResponse groupResponse = resp.readEntity(GroupResponse.class);
+ Assertions.assertEquals(0, groupResponse.getCode());
+ Group group = groupResponse.getGroup();
Assertions.assertEquals(groupEntity.roles(), group.roles());
Assertions.assertEquals(groupEntity.name(), group.name());
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock error"))
- .when(manager)
- .grantRolesToGroup(any(), any(), any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/permissions/groups/group/grant")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -291,8 +311,14 @@ public class TestPermissionOperations extends
BaseOperationsTest {
Assertions.assertEquals(ErrorConstants.NOT_FOUND_CODE,
errorResponse.getCode());
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
- // Test to throw NoSuchUserException
- doThrow(new NoSuchUserException("mock error"))
+ // Test to throw NoSuchGroupException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
+ doThrow(new NoSuchGroupException("mock error"))
.when(manager)
.grantRolesToGroup(any(), any(), any());
resp1 =
@@ -306,7 +332,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
errorResponse = resp1.readEntity(ErrorResponse.class);
Assertions.assertEquals(ErrorConstants.NOT_FOUND_CODE,
errorResponse.getCode());
- Assertions.assertEquals(NoSuchUserException.class.getSimpleName(),
errorResponse.getType());
+ Assertions.assertEquals(NoSuchGroupException.class.getSimpleName(),
errorResponse.getType());
// Test to throw IllegalRoleException
doThrow(new IllegalRoleException("mock error"))
@@ -344,7 +370,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
}
@Test
- public void testRevokeRolesFromUser() {
+ public void testRevokeRolesFromUser() throws IOException {
UserEntity userEntity =
UserEntity.builder()
.withId(1L)
@@ -356,6 +382,13 @@ public class TestPermissionOperations extends
BaseOperationsTest {
.build();
when(manager.revokeRolesFromUser(any(), any(),
any())).thenReturn(userEntity);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
// Test with illegal request
RoleRevokeRequest illegalReq = new RoleRevokeRequest(null);
Response illegalResp =
@@ -416,7 +449,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
}
@Test
- public void testRevokeRolesFromGroup() {
+ public void testRevokeRolesFromGroup() throws IOException {
GroupEntity groupEntity =
GroupEntity.builder()
.withId(1L)
@@ -427,6 +460,14 @@ public class TestPermissionOperations extends
BaseOperationsTest {
AuditInfo.builder().withCreator("test").withCreateTime(Instant.now()).build())
.build();
when(manager.revokeRolesFromGroup(any(), any(),
any())).thenReturn(groupEntity);
+
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
// Test with illegal request
RoleRevokeRequest illegalReq = new RoleRevokeRequest(null);
Response illegalResp =
@@ -487,7 +528,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
}
@Test
- public void testGrantPrivilegesToRole() {
+ public void testGrantPrivilegesToRole() throws IOException {
RoleEntity roleEntity =
RoleEntity.builder()
.withId(1L)
@@ -501,6 +542,14 @@ public class TestPermissionOperations extends
BaseOperationsTest {
.build();
when(manager.grantPrivilegeToRole(any(), any(), any(),
any())).thenReturn(roleEntity);
when(metalakeDispatcher.metalakeExists(any())).thenReturn(true);
+
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
PrivilegeGrantRequest request =
new PrivilegeGrantRequest(
Lists.newArrayList(
@@ -570,7 +619,7 @@ public class TestPermissionOperations extends
BaseOperationsTest {
}
@Test
- public void testRevokePrivilegesFromRole() {
+ public void testRevokePrivilegesFromRole() throws IOException {
RoleEntity roleEntity =
RoleEntity.builder()
.withId(1L)
@@ -582,6 +631,13 @@ public class TestPermissionOperations extends
BaseOperationsTest {
when(manager.revokePrivilegesFromRole(any(), any(), any(),
any())).thenReturn(roleEntity);
when(metalakeDispatcher.metalakeExists(any())).thenReturn(true);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
// Test with illegal request
PrivilegeRevokeRequest illegalReq = new PrivilegeRevokeRequest(null);
Response illegalResp =
@@ -655,7 +711,14 @@ public class TestPermissionOperations extends
BaseOperationsTest {
}
@Test
- public void testOverridePrivileges() {
+ public void testOverridePrivileges() throws IOException {
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
SecurableObjectDTO[] updates =
new SecurableObjectDTO[] {
SecurableObjectDTO.builder()
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
index c2436cc284..e22a10c616 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
@@ -41,6 +41,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.gravitino.Config;
+import org.apache.gravitino.EntityStore;
import org.apache.gravitino.GravitinoEnv;
import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.authorization.AccessControlManager;
@@ -53,6 +54,7 @@ import org.apache.gravitino.catalog.FilesetDispatcher;
import org.apache.gravitino.catalog.SchemaDispatcher;
import org.apache.gravitino.catalog.TableDispatcher;
import org.apache.gravitino.catalog.TopicDispatcher;
+import org.apache.gravitino.connector.PropertiesMetadata;
import org.apache.gravitino.dto.authorization.PrivilegeDTO;
import org.apache.gravitino.dto.authorization.RoleDTO;
import org.apache.gravitino.dto.authorization.SecurableObjectDTO;
@@ -66,12 +68,14 @@ import org.apache.gravitino.dto.util.DTOConverters;
import org.apache.gravitino.exceptions.IllegalNamespaceException;
import org.apache.gravitino.exceptions.IllegalPrivilegeException;
import org.apache.gravitino.exceptions.NoSuchCatalogException;
+import org.apache.gravitino.exceptions.NoSuchEntityException;
import org.apache.gravitino.exceptions.NoSuchMetadataObjectException;
import org.apache.gravitino.exceptions.NoSuchMetalakeException;
import org.apache.gravitino.exceptions.NoSuchRoleException;
import org.apache.gravitino.exceptions.RoleAlreadyExistsException;
import org.apache.gravitino.lock.LockManager;
import org.apache.gravitino.meta.AuditInfo;
+import org.apache.gravitino.meta.BaseMetalake;
import org.apache.gravitino.meta.RoleEntity;
import org.apache.gravitino.metalake.MetalakeDispatcher;
import org.apache.gravitino.rest.RESTUtils;
@@ -93,6 +97,7 @@ public class TestRoleOperations extends BaseOperationsTest {
private static final TableDispatcher tableDispatcher =
mock(TableDispatcher.class);
private static final TopicDispatcher topicDispatcher =
mock(TopicDispatcher.class);
private static final FilesetDispatcher filesetDispatcher =
mock(FilesetDispatcher.class);
+ private static final EntityStore entityStore = mock(EntityStore.class);
private static class MockServletRequestFactory extends
ServletRequestFactoryBase {
@Override
@@ -118,6 +123,7 @@ public class TestRoleOperations extends BaseOperationsTest {
FieldUtils.writeField(GravitinoEnv.getInstance(), "tableDispatcher",
tableDispatcher, true);
FieldUtils.writeField(GravitinoEnv.getInstance(), "topicDispatcher",
topicDispatcher, true);
FieldUtils.writeField(GravitinoEnv.getInstance(), "filesetDispatcher",
filesetDispatcher, true);
+ FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore",
entityStore, true);
}
@Override
@@ -143,7 +149,7 @@ public class TestRoleOperations extends BaseOperationsTest {
}
@Test
- public void testCreateRole() throws IllegalAccessException,
NoSuchFieldException {
+ public void testCreateRole() throws IllegalAccessException,
NoSuchFieldException, IOException {
SecurableObject securableObject =
SecurableObjects.ofCatalog("catalog",
Lists.newArrayList(Privileges.UseCatalog.allow()));
SecurableObject anotherSecurableObject =
@@ -162,6 +168,13 @@ public class TestRoleOperations extends BaseOperationsTest
{
when(manager.createRole(any(), any(), any(), any())).thenReturn(role);
when(catalogDispatcher.catalogExists(any())).thenReturn(true);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
// Test with IllegalRequest
RoleCreateRequest illegalRequest = new RoleCreateRequest("role",
Collections.emptyMap(), null);
Response illegalResp =
@@ -265,9 +278,7 @@ public class TestRoleOperations extends BaseOperationsTest {
// Test to throw NoSuchMetalakeException
when(catalogDispatcher.catalogExists(any())).thenReturn(true);
- doThrow(new NoSuchMetalakeException("mock error"))
- .when(manager)
- .createRole(any(), any(), any(), any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/roles")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -282,6 +293,12 @@ public class TestRoleOperations extends BaseOperationsTest
{
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw RoleAlreadyExistsException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new RoleAlreadyExistsException("mock error"))
.when(manager)
.createRole(any(), any(), any(), any());
@@ -369,11 +386,18 @@ public class TestRoleOperations extends
BaseOperationsTest {
}
@Test
- public void testGetRole() {
+ public void testGetRole() throws IOException {
Role role = buildRole("role1");
when(manager.getRole(any(), any())).thenReturn(role);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/roles/role1")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -400,7 +424,7 @@ public class TestRoleOperations extends BaseOperationsTest {
roleDTO.securableObjects().get(0).privileges().get(0).condition());
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).getRole(any(), any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/roles/role1")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -414,6 +438,12 @@ public class TestRoleOperations extends BaseOperationsTest
{
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw NoSuchRoleException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new NoSuchRoleException("mock
error")).when(manager).getRole(any(), any());
Response resp2 =
target("/metalakes/metalake1/roles/role1")
@@ -444,9 +474,16 @@ public class TestRoleOperations extends BaseOperationsTest
{
}
@Test
- public void testDeleteRole() {
+ public void testDeleteRole() throws IOException {
when(manager.deleteRole(any(), any())).thenReturn(true);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/roles/role1")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -608,9 +645,16 @@ public class TestRoleOperations extends BaseOperationsTest
{
}
@Test
- public void testListRoleNames() {
+ public void testListRoleNames() throws IOException {
when(manager.listRoleNames(any())).thenReturn(new String[] {"role"});
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/roles/")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -625,7 +669,7 @@ public class TestRoleOperations extends BaseOperationsTest {
Assertions.assertEquals("role", listResponse.getNames()[0]);
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).listRoleNames(any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/roles/")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -639,6 +683,12 @@ public class TestRoleOperations extends BaseOperationsTest
{
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw internal RuntimeException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new RuntimeException("mock
error")).when(manager).listRoleNames(any());
Response resp3 =
target("/metalakes/metalake1/roles")
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
index 234e4e6bb7..bb82a5dcdc 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
@@ -37,11 +37,13 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.gravitino.Config;
+import org.apache.gravitino.EntityStore;
import org.apache.gravitino.GravitinoEnv;
import org.apache.gravitino.authorization.AccessControlManager;
import org.apache.gravitino.authorization.Owner;
import org.apache.gravitino.authorization.OwnerDispatcher;
import org.apache.gravitino.authorization.User;
+import org.apache.gravitino.connector.PropertiesMetadata;
import org.apache.gravitino.dto.authorization.UserDTO;
import org.apache.gravitino.dto.requests.UserAddRequest;
import org.apache.gravitino.dto.responses.ErrorConstants;
@@ -50,11 +52,13 @@ import org.apache.gravitino.dto.responses.NameListResponse;
import org.apache.gravitino.dto.responses.RemoveResponse;
import org.apache.gravitino.dto.responses.UserListResponse;
import org.apache.gravitino.dto.responses.UserResponse;
+import org.apache.gravitino.exceptions.NoSuchEntityException;
import org.apache.gravitino.exceptions.NoSuchMetalakeException;
import org.apache.gravitino.exceptions.NoSuchUserException;
import org.apache.gravitino.exceptions.UserAlreadyExistsException;
import org.apache.gravitino.lock.LockManager;
import org.apache.gravitino.meta.AuditInfo;
+import org.apache.gravitino.meta.BaseMetalake;
import org.apache.gravitino.meta.UserEntity;
import org.apache.gravitino.rest.RESTUtils;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
@@ -69,6 +73,7 @@ public class TestUserOperations extends BaseOperationsTest {
private static final AccessControlManager manager =
mock(AccessControlManager.class);
private static final OwnerDispatcher ownerDispatcher =
mock(OwnerDispatcher.class);
+ private static final EntityStore entityStore = mock(EntityStore.class);
private static class MockServletRequestFactory extends
ServletRequestFactoryBase {
@Override
@@ -88,6 +93,7 @@ public class TestUserOperations extends BaseOperationsTest {
FieldUtils.writeField(GravitinoEnv.getInstance(), "lockManager", new
LockManager(config), true);
FieldUtils.writeField(GravitinoEnv.getInstance(),
"accessControlDispatcher", manager, true);
FieldUtils.writeField(GravitinoEnv.getInstance(), "ownerDispatcher",
ownerDispatcher, true);
+ FieldUtils.writeField(GravitinoEnv.getInstance(), "entityStore",
entityStore, true);
}
@Override
@@ -113,12 +119,19 @@ public class TestUserOperations extends
BaseOperationsTest {
}
@Test
- public void testAddUser() {
+ public void testAddUser() throws IOException {
UserAddRequest req = new UserAddRequest("user1");
User user = buildUser("user1");
when(manager.addUser(any(), any())).thenReturn(user);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
// test with IllegalRequest
UserAddRequest illegalReq = new UserAddRequest("");
Response illegalResp =
@@ -146,7 +159,7 @@ public class TestUserOperations extends BaseOperationsTest {
Assertions.assertTrue(userDTO.roles().isEmpty());
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).addUser(any(), any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/users")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -161,6 +174,12 @@ public class TestUserOperations extends BaseOperationsTest
{
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw UserAlreadyExistsException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new UserAlreadyExistsException("mock
error")).when(manager).addUser(any(), any());
Response resp2 =
target("/metalakes/metalake1/users")
@@ -192,12 +211,19 @@ public class TestUserOperations extends
BaseOperationsTest {
}
@Test
- public void testGetUser() {
+ public void testGetUser() throws IOException {
User user = buildUser("user1");
when(manager.getUser(any(), any())).thenReturn(user);
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/users/user1")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -214,7 +240,7 @@ public class TestUserOperations extends BaseOperationsTest {
Assertions.assertTrue(userDTO.roles().isEmpty());
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).getUser(any(), any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/users/user1")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -228,6 +254,12 @@ public class TestUserOperations extends BaseOperationsTest
{
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw NoSuchUserException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new NoSuchUserException("mock
error")).when(manager).getUser(any(), any());
Response resp2 =
target("/metalakes/metalake1/users/user1")
@@ -268,7 +300,14 @@ public class TestUserOperations extends BaseOperationsTest
{
}
@Test
- public void testRemoveUser() {
+ public void testRemoveUser() throws IOException {
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
// Delete the metalake owner
when(manager.removeUser(any(), any())).thenReturn(true);
Owner owner = mock(Owner.class);
@@ -330,9 +369,16 @@ public class TestUserOperations extends BaseOperationsTest
{
}
@Test
- public void testListUsernames() {
+ public void testListUsernames() throws IOException {
when(manager.listUserNames(any())).thenReturn(new String[] {"user"});
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/users/")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -347,7 +393,7 @@ public class TestUserOperations extends BaseOperationsTest {
Assertions.assertEquals("user", listResponse.getNames()[0]);
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).listUserNames(any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/users/")
.request(MediaType.APPLICATION_JSON_TYPE)
@@ -361,6 +407,12 @@ public class TestUserOperations extends BaseOperationsTest
{
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw internal RuntimeException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake1 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata1 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata1.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake1.propertiesMetadata()).thenReturn(propertiesMetadata1);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake1);
doThrow(new RuntimeException("mock
error")).when(manager).listUserNames(any());
Response resp3 =
target("/metalakes/metalake1/users")
@@ -377,10 +429,17 @@ public class TestUserOperations extends
BaseOperationsTest {
}
@Test
- public void testListUsers() {
+ public void testListUsers() throws IOException {
User user = buildUser("user");
when(manager.listUsers(any())).thenReturn(new User[] {user});
+ // Mock metalake with in-use property
+ BaseMetalake metalake = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata = mock(PropertiesMetadata.class);
+ when(propertiesMetadata.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake.propertiesMetadata()).thenReturn(propertiesMetadata);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake);
+
Response resp =
target("/metalakes/metalake1/users/")
.queryParam("details", "true")
@@ -397,7 +456,7 @@ public class TestUserOperations extends BaseOperationsTest {
Assertions.assertEquals(user.roles(), listResponse.getUsers()[0].roles());
// Test to throw NoSuchMetalakeException
- doThrow(new NoSuchMetalakeException("mock
error")).when(manager).listUsers(any());
+ doThrow(new NoSuchEntityException("mock
error")).when(entityStore).get(any(), any(), any());
Response resp1 =
target("/metalakes/metalake1/users/")
.queryParam("details", "true")
@@ -412,6 +471,12 @@ public class TestUserOperations extends BaseOperationsTest
{
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
// Test to throw internal RuntimeException
+ Mockito.reset(entityStore);
+ BaseMetalake metalake2 = mock(BaseMetalake.class);
+ PropertiesMetadata propertiesMetadata2 = mock(PropertiesMetadata.class);
+ when(propertiesMetadata2.getOrDefault(any(), any())).thenReturn(true);
+ when(metalake2.propertiesMetadata()).thenReturn(propertiesMetadata2);
+ when(entityStore.get(any(), any(), any())).thenReturn(metalake2);
doThrow(new RuntimeException("mock error")).when(manager).listUsers(any());
Response resp3 =
target("/metalakes/metalake1/users")