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")


Reply via email to