This is an automated email from the ASF dual-hosted git repository.

liuxun 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 bea393441 [#5196] improve(auth-ranger): Refactor RangerSecurableObject 
class (#5222)
bea393441 is described below

commit bea3934418cb15dbd5377e9ea9be340e7e38ebea
Author: Xun <x...@datastrato.com>
AuthorDate: Wed Oct 23 22:18:43 2024 +0800

    [#5196] improve(auth-ranger): Refactor RangerSecurableObject class (#5222)
    
    ### What changes were proposed in this pull request?
    
    1. Add `RangerMetadataObject` class.
    
    ### Why are the changes needed?
    
    Currently, RangerSecurableObject extends MetadataObject, but Ranger
    managers meta types different with Gravitino, for example, Ranger
    doesn't have `METALAKE`, `ROLE`, So we need to Refactor
    RangerSecurableObject class.
    
    Fix: #5196
    
    ### Does this PR introduce _any_ user-facing change?
    
    N/A
    
    ### How was this patch tested?
    
    CI Passed.
---
 .../java/org/apache/gravitino/MetadataObjects.java |   5 +-
 .../ranger/RangerAuthorizationHivePlugin.java      | 118 ++++++++++++-------
 .../ranger/RangerAuthorizationPlugin.java          |  17 ++-
 .../authorization/ranger/RangerHelper.java         |  26 ++---
 .../authorization/ranger/RangerMetadataObject.java | 110 ++++++++++++++++++
 ...leObject.java => RangerMetadataObjectRule.java} |  24 +---
 .../ranger/RangerMetadataObjects.java              | 126 +++++++++++++++++++++
 .../ranger/RangerSecurableObject.java              |   3 +-
 .../ranger/RangerSecurableObjects.java             |  21 ++--
 .../test/RangerAuthorizationPluginIT.java}         |  47 ++++----
 .../ranger/integration/test/RangerHiveIT.java      |  66 +++++------
 build.gradle.kts                                   |   2 +-
 12 files changed, 408 insertions(+), 157 deletions(-)

diff --git a/api/src/main/java/org/apache/gravitino/MetadataObjects.java 
b/api/src/main/java/org/apache/gravitino/MetadataObjects.java
index a13036497..49fe60187 100644
--- a/api/src/main/java/org/apache/gravitino/MetadataObjects.java
+++ b/api/src/main/java/org/apache/gravitino/MetadataObjects.java
@@ -49,7 +49,8 @@ public class MetadataObjects {
     Preconditions.checkArgument(name != null, "Cannot create a metadata object 
with null name");
     Preconditions.checkArgument(type != null, "Cannot create a metadata object 
with no type");
 
-    return new MetadataObjectImpl(parent, name, type);
+    String fullName = parent == null ? name : DOT_JOINER.join(parent, name);
+    return parse(fullName, type);
   }
 
   /**
@@ -159,7 +160,7 @@ public class MetadataObjects {
    * @param names The names of the metadata object
    * @return The parent full name if it exists, otherwise null
    */
-  public static String getParentFullName(List<String> names) {
+  private static String getParentFullName(List<String> names) {
     if (names.size() <= 1) {
       return null;
     }
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHivePlugin.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHivePlugin.java
index 838385c8a..83031b764 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHivePlugin.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHivePlugin.java
@@ -60,6 +60,35 @@ public class RangerAuthorizationHivePlugin extends 
RangerAuthorizationPlugin {
     return instance;
   }
 
+  /** Validate different Ranger metadata object */
+  @Override
+  public void validateRangerMetadataObject(List<String> names, 
RangerMetadataObject.Type type)
+      throws IllegalArgumentException {
+    Preconditions.checkArgument(
+        names != null && !names.isEmpty(), "Cannot create a Ranger metadata 
object with no names");
+    Preconditions.checkArgument(
+        names.size() <= 3,
+        "Cannot create a Ranger metadata object with the name length which is 
greater than 3");
+    Preconditions.checkArgument(
+        type != null, "Cannot create a Ranger metadata object with no type");
+
+    Preconditions.checkArgument(
+        names.size() != 1 || type == RangerMetadataObject.Type.SCHEMA,
+        "If the length of names is 1, it must be the SCHEMA type");
+
+    Preconditions.checkArgument(
+        names.size() != 2 || type == RangerMetadataObject.Type.TABLE,
+        "If the length of names is 2, it must be the TABLE type");
+
+    Preconditions.checkArgument(
+        names.size() != 3 || type == RangerMetadataObject.Type.COLUMN,
+        "If the length of names is 3, it must be COLUMN");
+
+    for (String name : names) {
+      RangerMetadataObjects.checkName(name);
+    }
+  }
+
   @Override
   /** Set the default mapping Gravitino privilege name to the Ranger rule */
   public Map<Privilege.Name, Set<RangerPrivilege>> privilegesMappingRule() {
@@ -110,78 +139,79 @@ public class RangerAuthorizationHivePlugin extends 
RangerAuthorizationPlugin {
   }
 
   /** Translate the Gravitino securable object to the Ranger owner securable 
object. */
-  public List<RangerSecurableObject> translateOwner(MetadataObject 
metadataObject) {
+  public List<RangerSecurableObject> translateOwner(MetadataObject 
gravitinoMetadataObject) {
     List<RangerSecurableObject> rangerSecurableObjects = new ArrayList<>();
 
-    switch (metadataObject.type()) {
+    switch (gravitinoMetadataObject.type()) {
       case METALAKE:
       case CATALOG:
         // Add `*` for the SCHEMA permission
         rangerSecurableObjects.add(
-            RangerSecurableObjects.of(
+            generateRangerSecurableObject(
                 ImmutableList.of(RangerHelper.RESOURCE_ALL),
-                MetadataObject.Type.SCHEMA,
+                RangerMetadataObject.Type.SCHEMA,
                 ownerMappingRule()));
         // Add `*.*` for the TABLE permission
         rangerSecurableObjects.add(
-            RangerSecurableObjects.of(
+            generateRangerSecurableObject(
                 ImmutableList.of(RangerHelper.RESOURCE_ALL, 
RangerHelper.RESOURCE_ALL),
-                MetadataObject.Type.TABLE,
+                RangerMetadataObject.Type.TABLE,
                 ownerMappingRule()));
         // Add `*.*.*` for the COLUMN permission
         rangerSecurableObjects.add(
-            RangerSecurableObjects.of(
+            generateRangerSecurableObject(
                 ImmutableList.of(
                     RangerHelper.RESOURCE_ALL,
                     RangerHelper.RESOURCE_ALL,
                     RangerHelper.RESOURCE_ALL),
-                MetadataObject.Type.COLUMN,
+                RangerMetadataObject.Type.COLUMN,
                 ownerMappingRule()));
         break;
       case SCHEMA:
         // Add `{schema}` for the SCHEMA permission
         rangerSecurableObjects.add(
-            RangerSecurableObjects.of(
-                ImmutableList.of(metadataObject.name() /*Schema name*/),
-                MetadataObject.Type.SCHEMA,
+            generateRangerSecurableObject(
+                ImmutableList.of(gravitinoMetadataObject.name() /*Schema 
name*/),
+                RangerMetadataObject.Type.SCHEMA,
                 ownerMappingRule()));
         // Add `{schema}.*` for the TABLE permission
         rangerSecurableObjects.add(
-            RangerSecurableObjects.of(
-                ImmutableList.of(metadataObject.name() /*Schema name*/, 
RangerHelper.RESOURCE_ALL),
-                MetadataObject.Type.TABLE,
+            generateRangerSecurableObject(
+                ImmutableList.of(
+                    gravitinoMetadataObject.name() /*Schema name*/, 
RangerHelper.RESOURCE_ALL),
+                RangerMetadataObject.Type.TABLE,
                 ownerMappingRule()));
         // Add `{schema}.*.*` for the COLUMN permission
         rangerSecurableObjects.add(
-            RangerSecurableObjects.of(
+            generateRangerSecurableObject(
                 ImmutableList.of(
-                    metadataObject.name() /*Schema name*/,
+                    gravitinoMetadataObject.name() /*Schema name*/,
                     RangerHelper.RESOURCE_ALL,
                     RangerHelper.RESOURCE_ALL),
-                MetadataObject.Type.COLUMN,
+                RangerMetadataObject.Type.COLUMN,
                 ownerMappingRule()));
         break;
       case TABLE:
         // Add `{schema}.{table}` for the TABLE permission
         rangerSecurableObjects.add(
-            RangerSecurableObjects.of(
-                convertToRangerMetadataObject(metadataObject),
-                MetadataObject.Type.TABLE,
+            generateRangerSecurableObject(
+                convertToRangerMetadataObject(gravitinoMetadataObject),
+                RangerMetadataObject.Type.TABLE,
                 ownerMappingRule()));
         // Add `{schema}.{table}.*` for the COLUMN permission
         rangerSecurableObjects.add(
-            RangerSecurableObjects.of(
+            generateRangerSecurableObject(
                 Stream.concat(
-                        convertToRangerMetadataObject(metadataObject).stream(),
+                        
convertToRangerMetadataObject(gravitinoMetadataObject).stream(),
                         Stream.of(RangerHelper.RESOURCE_ALL))
                     .collect(Collectors.toList()),
-                MetadataObject.Type.COLUMN,
+                RangerMetadataObject.Type.COLUMN,
                 ownerMappingRule()));
         break;
       default:
         throw new AuthorizationPluginException(
             "The owner privilege is not supported for the securable object: 
%s",
-            metadataObject.type());
+            gravitinoMetadataObject.type());
     }
 
     return rangerSecurableObjects;
@@ -214,9 +244,9 @@ public class RangerAuthorizationHivePlugin extends 
RangerAuthorizationPlugin {
                     case CATALOG:
                       // Add Ranger privilege(`SELECT`) to SCHEMA(`*`)
                       rangerSecurableObjects.add(
-                          RangerSecurableObjects.of(
+                          generateRangerSecurableObject(
                               ImmutableList.of(RangerHelper.RESOURCE_ALL),
-                              MetadataObject.Type.SCHEMA,
+                              RangerMetadataObject.Type.SCHEMA,
                               rangerPrivileges));
                       break;
                     default:
@@ -231,9 +261,9 @@ public class RangerAuthorizationHivePlugin extends 
RangerAuthorizationPlugin {
                     case CATALOG:
                       // Add Ranger privilege(`CREATE`) to SCHEMA(`*`)
                       rangerSecurableObjects.add(
-                          RangerSecurableObjects.of(
+                          generateRangerSecurableObject(
                               ImmutableList.of(RangerHelper.RESOURCE_ALL),
-                              MetadataObject.Type.SCHEMA,
+                              RangerMetadataObject.Type.SCHEMA,
                               rangerPrivileges));
                       break;
                     default:
@@ -248,17 +278,17 @@ public class RangerAuthorizationHivePlugin extends 
RangerAuthorizationPlugin {
                     case CATALOG:
                       // Add Ranger privilege(`SELECT`) to SCHEMA(`*`)
                       rangerSecurableObjects.add(
-                          RangerSecurableObjects.of(
+                          generateRangerSecurableObject(
                               ImmutableList.of(RangerHelper.RESOURCE_ALL),
-                              MetadataObject.Type.SCHEMA,
+                              RangerMetadataObject.Type.SCHEMA,
                               rangerPrivileges));
                       break;
                     case SCHEMA:
                       // Add Ranger privilege(`SELECT`) to SCHEMA(`{schema}`)
                       rangerSecurableObjects.add(
-                          RangerSecurableObjects.of(
+                          generateRangerSecurableObject(
                               ImmutableList.of(securableObject.name() /*Schema 
name*/),
-                              MetadataObject.Type.SCHEMA,
+                              RangerMetadataObject.Type.SCHEMA,
                               rangerPrivileges));
                       break;
                     default:
@@ -275,38 +305,38 @@ public class RangerAuthorizationHivePlugin extends 
RangerAuthorizationPlugin {
                     case CATALOG:
                       // Add `*.*` for the TABLE permission
                       rangerSecurableObjects.add(
-                          RangerSecurableObjects.of(
+                          generateRangerSecurableObject(
                               ImmutableList.of(
                                   RangerHelper.RESOURCE_ALL, 
RangerHelper.RESOURCE_ALL),
-                              MetadataObject.Type.TABLE,
+                              RangerMetadataObject.Type.TABLE,
                               rangerPrivileges));
                       // Add `*.*.*` for the COLUMN permission
                       rangerSecurableObjects.add(
-                          RangerSecurableObjects.of(
+                          generateRangerSecurableObject(
                               ImmutableList.of(
                                   RangerHelper.RESOURCE_ALL,
                                   RangerHelper.RESOURCE_ALL,
                                   RangerHelper.RESOURCE_ALL),
-                              MetadataObject.Type.COLUMN,
+                              RangerMetadataObject.Type.COLUMN,
                               rangerPrivileges));
                       break;
                     case SCHEMA:
                       // Add `{schema}.*` for the TABLE permission
                       rangerSecurableObjects.add(
-                          RangerSecurableObjects.of(
+                          generateRangerSecurableObject(
                               ImmutableList.of(
                                   securableObject.name() /*Schema name*/,
                                   RangerHelper.RESOURCE_ALL),
-                              MetadataObject.Type.TABLE,
+                              RangerMetadataObject.Type.TABLE,
                               rangerPrivileges));
                       // Add `{schema}.*.*` for the COLUMN permission
                       rangerSecurableObjects.add(
-                          RangerSecurableObjects.of(
+                          generateRangerSecurableObject(
                               ImmutableList.of(
                                   securableObject.name() /*Schema name*/,
                                   RangerHelper.RESOURCE_ALL,
                                   RangerHelper.RESOURCE_ALL),
-                              MetadataObject.Type.COLUMN,
+                              RangerMetadataObject.Type.COLUMN,
                               rangerPrivileges));
                       break;
                     case TABLE:
@@ -317,18 +347,18 @@ public class RangerAuthorizationHivePlugin extends 
RangerAuthorizationPlugin {
                       } else {
                         // Add `{schema}.{table}` for the TABLE permission
                         rangerSecurableObjects.add(
-                            RangerSecurableObjects.of(
+                            generateRangerSecurableObject(
                                 convertToRangerMetadataObject(securableObject),
-                                MetadataObject.Type.TABLE,
+                                RangerMetadataObject.Type.TABLE,
                                 rangerPrivileges));
                         // Add `{schema}.{table}.*` for the COLUMN permission
                         rangerSecurableObjects.add(
-                            RangerSecurableObjects.of(
+                            generateRangerSecurableObject(
                                 Stream.concat(
                                         
convertToRangerMetadataObject(securableObject).stream(),
                                         Stream.of(RangerHelper.RESOURCE_ALL))
                                     .collect(Collectors.toList()),
-                                MetadataObject.Type.COLUMN,
+                                RangerMetadataObject.Type.COLUMN,
                                 rangerPrivileges));
                       }
                       break;
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationPlugin.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationPlugin.java
index b188b55dd..e0da6b904 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationPlugin.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationPlugin.java
@@ -67,7 +67,7 @@ import org.slf4j.LoggerFactory;
  * implement Gravitino Owner concept. <br>
  */
 public abstract class RangerAuthorizationPlugin
-    implements AuthorizationPlugin, RangerPrivilegesMappingProvider {
+    implements AuthorizationPlugin, RangerPrivilegesMappingProvider, 
RangerMetadataObjectRule {
   private static final Logger LOG = 
LoggerFactory.getLogger(RangerAuthorizationPlugin.class);
 
   protected final String rangerServiceName;
@@ -660,7 +660,20 @@ public abstract class RangerAuthorizationPlugin
   @Override
   public void close() throws IOException {}
 
-  boolean validAuthorizationOperation(List<SecurableObject> securableObjects) {
+  /** Generate different Ranger securable object */
+  public RangerSecurableObject generateRangerSecurableObject(
+      List<String> names, RangerMetadataObject.Type type, Set<RangerPrivilege> 
privileges) {
+    validateRangerMetadataObject(names, type);
+    RangerMetadataObject metadataObject =
+        new RangerMetadataObjects.RangerMetadataObjectImpl(
+            RangerMetadataObjects.getParentFullName(names),
+            RangerMetadataObjects.getLastName(names),
+            type);
+    return new RangerSecurableObjects.RangerSecurableObjectImpl(
+        metadataObject.parent(), metadataObject.name(), metadataObject.type(), 
privileges);
+  }
+
+  public boolean validAuthorizationOperation(List<SecurableObject> 
securableObjects) {
     return securableObjects.stream()
         .allMatch(
             securableObject -> {
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHelper.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHelper.java
index 12a99fd61..dde7b7328 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHelper.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerHelper.java
@@ -28,10 +28,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang.StringUtils;
-import org.apache.gravitino.MetadataObject;
 import org.apache.gravitino.authorization.Owner;
 import org.apache.gravitino.authorization.Privilege;
-import org.apache.gravitino.authorization.SecurableObjects;
 import org.apache.gravitino.exceptions.AuthorizationPluginException;
 import org.apache.ranger.RangerClient;
 import org.apache.ranger.RangerServiceException;
@@ -192,12 +190,12 @@ public class RangerHelper {
   /**
    * Find the managed policy for the ranger securable object.
    *
-   * @param rangerSecurableObject The ranger securable object to find the 
managed policy.
+   * @param rangerMetadataObject The ranger securable object to find the 
managed policy.
    * @return The managed policy for the metadata object.
    */
-  public RangerPolicy findManagedPolicy(RangerSecurableObject 
rangerSecurableObject)
+  public RangerPolicy findManagedPolicy(RangerMetadataObject 
rangerMetadataObject)
       throws AuthorizationPluginException {
-    List<String> nsMetadataObj = getMetadataObjectNames(rangerSecurableObject);
+    List<String> nsMetadataObj = rangerMetadataObject.names();
 
     Map<String, String> searchFilters = new HashMap<>();
     Map<String, String> preciseFilters = new HashMap<>();
@@ -395,23 +393,13 @@ public class RangerHelper {
             });
   }
 
-  private static List<String> getMetadataObjectNames(MetadataObject 
metadataObject) {
-    List<String> nsMetadataObject =
-        
Lists.newArrayList(SecurableObjects.DOT_SPLITTER.splitToList(metadataObject.fullName()));
-    if (nsMetadataObject.size() > 4) {
-      // The max level of the securable object is `catalog.db.table.column`
-      throw new RuntimeException("The length of the securable object should 
not be greater than 4");
-    }
-    return nsMetadataObject;
-  }
-
-  protected RangerPolicy createPolicyAddResources(MetadataObject 
metadataObject) {
+  protected RangerPolicy createPolicyAddResources(RangerMetadataObject 
metadataObject) {
     RangerPolicy policy = new RangerPolicy();
     policy.setService(rangerServiceName);
     policy.setName(metadataObject.fullName());
     
policy.setPolicyLabels(Lists.newArrayList(RangerHelper.MANAGED_BY_GRAVITINO));
 
-    List<String> nsMetadataObject = getMetadataObjectNames(metadataObject);
+    List<String> nsMetadataObject = metadataObject.names();
 
     for (int i = 0; i < nsMetadataObject.size(); i++) {
       RangerPolicy.RangerPolicyResource policyResource =
@@ -421,7 +409,7 @@ public class RangerHelper {
     return policy;
   }
 
-  protected RangerPolicy addOwnerToNewPolicy(MetadataObject metadataObject, 
Owner newOwner) {
+  protected RangerPolicy addOwnerToNewPolicy(RangerMetadataObject 
metadataObject, Owner newOwner) {
     RangerPolicy policy = createPolicyAddResources(metadataObject);
 
     ownerPrivileges.forEach(
@@ -444,7 +432,7 @@ public class RangerHelper {
   }
 
   protected RangerPolicy addOwnerRoleToNewPolicy(
-      MetadataObject metadataObject, String ownerRoleName) {
+      RangerMetadataObject metadataObject, String ownerRoleName) {
     RangerPolicy policy = createPolicyAddResources(metadataObject);
 
     ownerPrivileges.forEach(
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java
new file mode 100644
index 000000000..08df90d0f
--- /dev/null
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObject.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.authorization.ranger;
+
+import java.util.List;
+import javax.annotation.Nullable;
+import org.apache.gravitino.MetadataObject;
+import org.apache.gravitino.annotation.Unstable;
+
+/**
+ * The Ranger MetadataObject is the basic unit of the Gravitino system. It 
represents the Apache
+ * Ranger metadata object in the Apache Gravitino system. The object can be a 
catalog, schema,
+ * table, column, etc.
+ */
+@Unstable
+public interface RangerMetadataObject {
+  /**
+   * The type of object in the Ranger system. Every type will map one kind of 
the entity of the
+   * Gravitino type system.
+   */
+  enum Type {
+    /** A schema is a sub collection of the catalog. The schema can contain 
tables, columns, etc. */
+    SCHEMA(MetadataObject.Type.SCHEMA),
+    /** A table is mapped the table of relational data sources like Apache 
Hive, MySQL, etc. */
+    TABLE(MetadataObject.Type.TABLE),
+    /** A column is a sub-collection of the table that represents a group of 
same type data. */
+    COLUMN(MetadataObject.Type.COLUMN);
+
+    private final MetadataObject.Type metadataType;
+
+    Type(MetadataObject.Type type) {
+      this.metadataType = type;
+    }
+
+    public MetadataObject.Type getMetadataType() {
+      return metadataType;
+    }
+
+    public static Type fromMetadataType(MetadataObject.Type metadataType) {
+      for (Type type : Type.values()) {
+        if (type.getMetadataType() == metadataType) {
+          return type;
+        }
+      }
+      throw new IllegalArgumentException(
+          "No matching RangerMetadataObject.Type for " + metadataType);
+    }
+  }
+
+  /**
+   * The parent full name of the object. If the object doesn't have parent, 
this method will return
+   * null.
+   *
+   * @return The parent full name of the object.
+   */
+  @Nullable
+  String parent();
+
+  /**
+   * The name of th object.
+   *
+   * @return The name of the object.
+   */
+  String name();
+
+  /**
+   * The all name list of th object.
+   *
+   * @return The name list of the object.
+   */
+  List<String> names();
+
+  /**
+   * The full name of th object. Full name will be separated by "." to 
represent a string identifier
+   * of the object, like catalog, catalog.table, etc.
+   *
+   * @return The name of the object.
+   */
+  default String fullName() {
+    if (parent() == null) {
+      return name();
+    } else {
+      return parent() + "." + name();
+    }
+  }
+
+  /**
+   * The type of the object.
+   *
+   * @return The type of the object.
+   */
+  Type type();
+}
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjectRule.java
similarity index 52%
copy from 
authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java
copy to 
authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjectRule.java
index 3cdc4e514..a8de00518 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjectRule.java
@@ -19,24 +19,10 @@
 package org.apache.gravitino.authorization.ranger;
 
 import java.util.List;
-import org.apache.gravitino.MetadataObject;
-import org.apache.gravitino.annotation.Unstable;
 
-/**
- * The Ranger securable object is the entity which access can be granted. 
Unless allowed by a grant,
- * access is denied. <br>
- * You can use the helper class `RangerSecurableObjects` to create the Ranger 
securable object which
- * you need. <br>
- * There is a clear difference between Ranger's Securable Object and 
Gravitino's Securable Object,
- * Ranger's Securable Object does not have the concept of `METALAKE`, so it 
needs to be defined
- * specifically.
- */
-@Unstable
-public interface RangerSecurableObject extends MetadataObject {
-  /**
-   * The privileges of the Ranger securable object.
-   *
-   * @return The privileges of the securable object.
-   */
-  List<RangerPrivilege> privileges();
+/** Different underlying datasource have different Ranger metadata object 
rules */
+interface RangerMetadataObjectRule {
+  /** Validate different underlying datasource Ranger metadata object */
+  void validateRangerMetadataObject(List<String> names, 
RangerMetadataObject.Type type)
+      throws IllegalArgumentException;
 }
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjects.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjects.java
new file mode 100644
index 000000000..de2002df1
--- /dev/null
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerMetadataObjects.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.authorization.ranger;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.apache.gravitino.MetadataObject;
+
+/** The helper class for {@link RangerMetadataObject}. */
+public class RangerMetadataObjects {
+  private static final Splitter DOT_SPLITTER = Splitter.on('.');
+
+  private static final Joiner DOT_JOINER = Joiner.on('.');
+
+  private RangerMetadataObjects() {}
+
+  /**
+   * Get the parent full name of the given full name.
+   *
+   * @param names The names of the metadata object
+   * @return The parent full name if it exists, otherwise null
+   */
+  public static String getParentFullName(List<String> names) {
+    if (names.size() <= 1) {
+      return null;
+    }
+
+    return DOT_JOINER.join(names.subList(0, names.size() - 1));
+  }
+
+  static String getLastName(List<String> names) {
+    Preconditions.checkArgument(names.size() > 0, "Cannot get the last name of 
an empty list");
+    return names.get(names.size() - 1);
+  }
+
+  static void checkName(String name) {
+    Preconditions.checkArgument(name != null, "Cannot create a metadata object 
with null name");
+  }
+
+  /** The implementation of the {@link MetadataObject}. */
+  public static class RangerMetadataObjectImpl implements RangerMetadataObject 
{
+    private final String name;
+
+    private final String parent;
+
+    private final RangerMetadataObject.Type type;
+
+    /**
+     * Create the metadata object with the given name, parent and type.
+     *
+     * @param parent The parent of the metadata object
+     * @param name The name of the metadata object
+     * @param type The type of the metadata object
+     */
+    public RangerMetadataObjectImpl(String parent, String name, 
RangerMetadataObject.Type type) {
+      this.parent = parent;
+      this.name = name;
+      this.type = type;
+    }
+
+    @Override
+    public String name() {
+      return name;
+    }
+
+    @Override
+    public List<String> names() {
+      return Lists.newArrayList(DOT_SPLITTER.splitToList(fullName()));
+    }
+
+    @Override
+    public String parent() {
+      return parent;
+    }
+
+    @Override
+    public Type type() {
+      return type;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (this == o) {
+        return true;
+      }
+
+      if (!(o instanceof RangerMetadataObjectImpl)) {
+        return false;
+      }
+
+      RangerMetadataObjectImpl that = (RangerMetadataObjectImpl) o;
+      return java.util.Objects.equals(name, that.name)
+          && java.util.Objects.equals(parent, that.parent)
+          && type == that.type;
+    }
+
+    @Override
+    public int hashCode() {
+      return java.util.Objects.hash(name, parent, type);
+    }
+
+    @Override
+    public String toString() {
+      return "MetadataObject: [fullName=" + fullName() + "], [type=" + type + 
"]";
+    }
+  }
+}
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java
index 3cdc4e514..da3311a17 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObject.java
@@ -19,7 +19,6 @@
 package org.apache.gravitino.authorization.ranger;
 
 import java.util.List;
-import org.apache.gravitino.MetadataObject;
 import org.apache.gravitino.annotation.Unstable;
 
 /**
@@ -32,7 +31,7 @@ import org.apache.gravitino.annotation.Unstable;
  * specifically.
  */
 @Unstable
-public interface RangerSecurableObject extends MetadataObject {
+public interface RangerSecurableObject extends RangerMetadataObject {
   /**
    * The privileges of the Ranger securable object.
    *
diff --git 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObjects.java
 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObjects.java
index 6405e3e4c..999f78684 100644
--- 
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObjects.java
+++ 
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerSecurableObjects.java
@@ -22,23 +22,13 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import java.util.List;
 import java.util.Set;
-import org.apache.gravitino.MetadataObject;
-import org.apache.gravitino.MetadataObjects;
-import org.apache.gravitino.MetadataObjects.MetadataObjectImpl;
+import 
org.apache.gravitino.authorization.ranger.RangerMetadataObjects.RangerMetadataObjectImpl;
 
 /** The helper class for {@link RangerSecurableObject}. */
 public class RangerSecurableObjects {
-  public static RangerSecurableObject of(
-      List<String> names, MetadataObject.Type type, Set<RangerPrivilege> 
privileges) {
-    MetadataObject metadataObject =
-        MetadataObjects.of(
-            MetadataObjects.getParentFullName(names), names.get(names.size() - 
1), type);
-    return new RangerSecurableObjectImpl(
-        metadataObject.parent(), metadataObject.name(), type, privileges);
-  }
-
-  private static class RangerSecurableObjectImpl extends MetadataObjectImpl
+  public static class RangerSecurableObjectImpl extends 
RangerMetadataObjectImpl
       implements RangerSecurableObject {
+
     private final List<RangerPrivilege> privileges;
 
     /**
@@ -49,7 +39,10 @@ public class RangerSecurableObjects {
      * @param type The type of the metadata object
      */
     public RangerSecurableObjectImpl(
-        String parent, String name, Type type, Set<RangerPrivilege> 
privileges) {
+        String parent,
+        String name,
+        RangerMetadataObject.Type type,
+        Set<RangerPrivilege> privileges) {
       super(parent, name, type);
       this.privileges = ImmutableList.copyOf(Sets.newHashSet(privileges));
     }
diff --git 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/TestRangerAuthorizationPlugin.java
 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationPluginIT.java
similarity index 93%
rename from 
authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/TestRangerAuthorizationPlugin.java
rename to 
authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationPluginIT.java
index d4f314dd7..32eb58d18 100644
--- 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/TestRangerAuthorizationPlugin.java
+++ 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationPluginIT.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.gravitino.authorization.ranger;
+package org.apache.gravitino.authorization.ranger.integration.test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -28,12 +28,16 @@ import org.apache.gravitino.authorization.Privilege;
 import org.apache.gravitino.authorization.Privileges;
 import org.apache.gravitino.authorization.SecurableObject;
 import org.apache.gravitino.authorization.SecurableObjects;
-import org.apache.gravitino.authorization.ranger.integration.test.RangerITEnv;
+import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
+import org.apache.gravitino.authorization.ranger.RangerMetadataObject;
+import org.apache.gravitino.authorization.ranger.RangerSecurableObject;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 
-public class TestRangerAuthorizationPlugin {
+@Tag("gravitino-docker-test")
+public class RangerAuthorizationPluginIT {
   private static RangerAuthorizationPlugin rangerAuthPlugin;
 
   @BeforeAll
@@ -53,7 +57,8 @@ public class TestRangerAuthorizationPlugin {
         rangerAuthPlugin.translatePrivilege(createSchemaInMetalake);
     Assertions.assertEquals(1, createSchemaInMetalake1.size());
     Assertions.assertEquals("*", createSchemaInMetalake1.get(0).fullName());
-    Assertions.assertEquals(MetadataObject.Type.SCHEMA, 
createSchemaInMetalake1.get(0).type());
+    Assertions.assertEquals(
+        RangerMetadataObject.Type.SCHEMA, 
createSchemaInMetalake1.get(0).type());
 
     SecurableObject createSchemaInCatalog =
         SecurableObjects.parse(
@@ -64,7 +69,7 @@ public class TestRangerAuthorizationPlugin {
         rangerAuthPlugin.translatePrivilege(createSchemaInCatalog);
     Assertions.assertEquals(1, createSchemaInCatalog1.size());
     Assertions.assertEquals("*", createSchemaInCatalog1.get(0).fullName());
-    Assertions.assertEquals(MetadataObject.Type.SCHEMA, 
createSchemaInCatalog1.get(0).type());
+    Assertions.assertEquals(RangerMetadataObject.Type.SCHEMA, 
createSchemaInCatalog1.get(0).type());
 
     for (Privilege privilege :
         ImmutableList.of(
@@ -79,9 +84,9 @@ public class TestRangerAuthorizationPlugin {
       List<RangerSecurableObject> metalake1 = 
rangerAuthPlugin.translatePrivilege(metalake);
       Assertions.assertEquals(2, metalake1.size());
       Assertions.assertEquals("*.*", metalake1.get(0).fullName());
-      Assertions.assertEquals(MetadataObject.Type.TABLE, 
metalake1.get(0).type());
+      Assertions.assertEquals(RangerMetadataObject.Type.TABLE, 
metalake1.get(0).type());
       Assertions.assertEquals("*.*.*", metalake1.get(1).fullName());
-      Assertions.assertEquals(MetadataObject.Type.COLUMN, 
metalake1.get(1).type());
+      Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, 
metalake1.get(1).type());
 
       SecurableObject catalog =
           SecurableObjects.parse(
@@ -91,9 +96,9 @@ public class TestRangerAuthorizationPlugin {
       List<RangerSecurableObject> catalog1 = 
rangerAuthPlugin.translatePrivilege(catalog);
       Assertions.assertEquals(2, catalog1.size());
       Assertions.assertEquals("*.*", catalog1.get(0).fullName());
-      Assertions.assertEquals(MetadataObject.Type.TABLE, 
catalog1.get(0).type());
+      Assertions.assertEquals(RangerMetadataObject.Type.TABLE, 
catalog1.get(0).type());
       Assertions.assertEquals("*.*.*", catalog1.get(1).fullName());
-      Assertions.assertEquals(MetadataObject.Type.COLUMN, 
catalog1.get(1).type());
+      Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, 
catalog1.get(1).type());
 
       SecurableObject schema =
           SecurableObjects.parse(
@@ -103,9 +108,9 @@ public class TestRangerAuthorizationPlugin {
       List<RangerSecurableObject> schema1 = 
rangerAuthPlugin.translatePrivilege(schema);
       Assertions.assertEquals(2, schema1.size());
       Assertions.assertEquals("schema1.*", schema1.get(0).fullName());
-      Assertions.assertEquals(MetadataObject.Type.TABLE, 
schema1.get(0).type());
+      Assertions.assertEquals(RangerMetadataObject.Type.TABLE, 
schema1.get(0).type());
       Assertions.assertEquals("schema1.*.*", schema1.get(1).fullName());
-      Assertions.assertEquals(MetadataObject.Type.COLUMN, 
schema1.get(1).type());
+      Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, 
schema1.get(1).type());
 
       if (!privilege.equals(Privileges.CreateTable.allow())) {
         // `CREATE_TABLE` not support securable object for table, So ignore 
check for table.
@@ -117,9 +122,9 @@ public class TestRangerAuthorizationPlugin {
         List<RangerSecurableObject> table1 = 
rangerAuthPlugin.translatePrivilege(table);
         Assertions.assertEquals(2, table1.size());
         Assertions.assertEquals("schema1.table1", table1.get(0).fullName());
-        Assertions.assertEquals(MetadataObject.Type.TABLE, 
table1.get(0).type());
+        Assertions.assertEquals(RangerMetadataObject.Type.TABLE, 
table1.get(0).type());
         Assertions.assertEquals("schema1.table1.*", table1.get(1).fullName());
-        Assertions.assertEquals(MetadataObject.Type.COLUMN, 
table1.get(1).type());
+        Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, 
table1.get(1).type());
       }
     }
   }
@@ -132,31 +137,31 @@ public class TestRangerAuthorizationPlugin {
       List<RangerSecurableObject> metalakeOwner = 
rangerAuthPlugin.translateOwner(metalake);
       Assertions.assertEquals(3, metalakeOwner.size());
       Assertions.assertEquals("*", metalakeOwner.get(0).fullName());
-      Assertions.assertEquals(MetadataObject.Type.SCHEMA, 
metalakeOwner.get(0).type());
+      Assertions.assertEquals(RangerMetadataObject.Type.SCHEMA, 
metalakeOwner.get(0).type());
       Assertions.assertEquals("*.*", metalakeOwner.get(1).fullName());
-      Assertions.assertEquals(MetadataObject.Type.TABLE, 
metalakeOwner.get(1).type());
+      Assertions.assertEquals(RangerMetadataObject.Type.TABLE, 
metalakeOwner.get(1).type());
       Assertions.assertEquals("*.*.*", metalakeOwner.get(2).fullName());
-      Assertions.assertEquals(MetadataObject.Type.COLUMN, 
metalakeOwner.get(2).type());
+      Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, 
metalakeOwner.get(2).type());
     }
 
     MetadataObject schema = MetadataObjects.parse("catalog1.schema1", 
MetadataObject.Type.SCHEMA);
     List<RangerSecurableObject> schemaOwner = 
rangerAuthPlugin.translateOwner(schema);
     Assertions.assertEquals(3, schemaOwner.size());
     Assertions.assertEquals("schema1", schemaOwner.get(0).fullName());
-    Assertions.assertEquals(MetadataObject.Type.SCHEMA, 
schemaOwner.get(0).type());
+    Assertions.assertEquals(RangerMetadataObject.Type.SCHEMA, 
schemaOwner.get(0).type());
     Assertions.assertEquals("schema1.*", schemaOwner.get(1).fullName());
-    Assertions.assertEquals(MetadataObject.Type.TABLE, 
schemaOwner.get(1).type());
+    Assertions.assertEquals(RangerMetadataObject.Type.TABLE, 
schemaOwner.get(1).type());
     Assertions.assertEquals("schema1.*.*", schemaOwner.get(2).fullName());
-    Assertions.assertEquals(MetadataObject.Type.COLUMN, 
schemaOwner.get(2).type());
+    Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, 
schemaOwner.get(2).type());
 
     MetadataObject table =
         MetadataObjects.parse("catalog1.schema1.table1", 
MetadataObject.Type.TABLE);
     List<RangerSecurableObject> tableOwner = 
rangerAuthPlugin.translateOwner(table);
     Assertions.assertEquals(2, tableOwner.size());
     Assertions.assertEquals("schema1.table1", tableOwner.get(0).fullName());
-    Assertions.assertEquals(MetadataObject.Type.TABLE, 
tableOwner.get(0).type());
+    Assertions.assertEquals(RangerMetadataObject.Type.TABLE, 
tableOwner.get(0).type());
     Assertions.assertEquals("schema1.table1.*", tableOwner.get(1).fullName());
-    Assertions.assertEquals(MetadataObject.Type.COLUMN, 
tableOwner.get(1).type());
+    Assertions.assertEquals(RangerMetadataObject.Type.COLUMN, 
tableOwner.get(1).type());
   }
 
   @Test
diff --git 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveIT.java
 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveIT.java
index eba00a188..c105d42fd 100644
--- 
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveIT.java
+++ 
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerHiveIT.java
@@ -18,7 +18,6 @@
  */
 package org.apache.gravitino.authorization.ranger.integration.test;
 
-import static org.apache.gravitino.authorization.SecurableObjects.DOT_SPLITTER;
 import static 
org.apache.gravitino.authorization.ranger.integration.test.RangerITEnv.currentFunName;
 import static 
org.apache.gravitino.authorization.ranger.integration.test.RangerITEnv.verifyRoleInRanger;
 
@@ -43,9 +42,9 @@ import org.apache.gravitino.authorization.SecurableObject;
 import org.apache.gravitino.authorization.SecurableObjects;
 import org.apache.gravitino.authorization.ranger.RangerAuthorizationPlugin;
 import org.apache.gravitino.authorization.ranger.RangerHelper;
+import org.apache.gravitino.authorization.ranger.RangerMetadataObject;
 import org.apache.gravitino.authorization.ranger.RangerPrivileges;
 import org.apache.gravitino.authorization.ranger.RangerSecurableObject;
-import org.apache.gravitino.authorization.ranger.RangerSecurableObjects;
 import org.apache.gravitino.authorization.ranger.reference.RangerDefines;
 import org.apache.gravitino.integration.test.util.GravitinoITUtils;
 import org.apache.gravitino.meta.AuditInfo;
@@ -249,9 +248,9 @@ public class RangerHiveIT {
         GravitinoITUtils.genRandomName(currentFunName()));
     // findManagedPolicy function use precise search, so return null
     RangerSecurableObject rangerSecurableObject =
-        RangerSecurableObjects.of(
+        rangerAuthHivePlugin.generateRangerSecurableObject(
             ImmutableList.of(String.format("%s3", dbName), "tab1"),
-            MetadataObject.Type.TABLE,
+            RangerMetadataObject.Type.TABLE,
             ImmutableSet.of(
                 new RangerPrivileges.RangerHivePrivilegeImpl(
                     RangerPrivileges.RangerHivePrivilege.ALL, 
Privilege.Condition.ALLOW)));
@@ -515,7 +514,11 @@ public class RangerHiveIT {
     String userName = "user1";
     rangerAuthHivePlugin.onOwnerSet(
         oldMetadataObject, null, new MockOwner(userName, Owner.Type.USER));
-    verifyOwnerInRanger(oldMetadataObject, Lists.newArrayList(userName));
+    rangerAuthHivePlugin.translateOwner(oldMetadataObject).stream()
+        .forEach(
+            rangerSecurableObject -> {
+              verifyOwnerInRanger(rangerSecurableObject, 
Lists.newArrayList(userName));
+            });
 
     SecurableObject oldSecurableObject =
         SecurableObjects.parse(
@@ -552,13 +555,21 @@ public class RangerHiveIT {
             .withSecurableObjects(Lists.newArrayList(newSecurableObject))
             .build();
     verifyRoleInRanger(rangerAuthHivePlugin, verifyRole);
-    verifyOwnerInRanger(oldMetadataObject, Lists.newArrayList(userName));
+    rangerAuthHivePlugin.translateOwner(oldMetadataObject).stream()
+        .forEach(
+            rangerSecurableObject -> {
+              verifyOwnerInRanger(rangerSecurableObject, 
Lists.newArrayList(userName));
+            });
 
     // Delete the role
     Assertions.assertTrue(rangerAuthHivePlugin.onRoleDeleted(verifyRole));
     // Because these metaobjects have an owner, so the policy will not be 
deleted.
     assertFindManagedPolicy(role, true);
-    verifyOwnerInRanger(oldMetadataObject, Lists.newArrayList(userName));
+    rangerAuthHivePlugin.translateOwner(oldMetadataObject).stream()
+        .forEach(
+            rangerSecurableObject -> {
+              verifyOwnerInRanger(rangerSecurableObject, 
Lists.newArrayList(userName));
+            });
   }
 
   @Test
@@ -899,7 +910,12 @@ public class RangerHiveIT {
     String ownerName = "owner1";
     rangerAuthHivePlugin.onOwnerSet(
         securableObject1, null, new MockOwner(ownerName, Owner.Type.USER));
-    verifyOwnerInRanger(securableObject1, Lists.newArrayList(ownerName), null, 
null, null);
+    rangerAuthHivePlugin.translateOwner(securableObject1).stream()
+        .forEach(
+            rangerSecurableObject -> {
+              verifyOwnerInRanger(
+                  rangerSecurableObject, Lists.newArrayList(ownerName), null, 
null, null);
+            });
 
     RoleEntity role1 =
         RoleEntity.builder()
@@ -1277,23 +1293,13 @@ public class RangerHiveIT {
     assertFindManagedPolicy(role3, true);
   }
 
-  private static String generatePolicyName(MetadataObject metadataObject) {
-    List<String> nsMetadataObject =
-        
Lists.newArrayList(SecurableObjects.DOT_SPLITTER.splitToList(metadataObject.fullName()));
-    if (!(metadataObject instanceof RangerSecurableObject)
-        && metadataObject.type() != MetadataObject.Type.METALAKE) {
-      nsMetadataObject.remove(0); // remove `catalog`
-    }
-    return String.join(".", nsMetadataObject);
-  }
-
   /**
    * Verify the Gravitino role in Ranger service
    *
    * <p>metadataObject: the Gravitino securable object to be verified
    */
   private void verifyOwnerInRanger(
-      MetadataObject metadataObject,
+      RangerMetadataObject metadataObject,
       List<String> includeUsers,
       List<String> excludeUsers,
       List<String> includeGroups,
@@ -1301,7 +1307,7 @@ public class RangerHiveIT {
       List<String> includeRoles,
       List<String> excludeRoles) {
     // Find policy by each metadata Object
-    String policyName = generatePolicyName(metadataObject);
+    String policyName = metadataObject.fullName();
     RangerPolicy policy;
     try {
       policy = 
RangerITEnv.rangerClient.getPolicy(RangerITEnv.RANGER_HIVE_REPO_NAME, 
policyName);
@@ -1315,13 +1321,7 @@ public class RangerHiveIT {
     
Assertions.assertTrue(policy.getPolicyLabels().contains(RangerHelper.MANAGED_BY_GRAVITINO));
 
     // verify namespace
-    List<String> metaObjNamespaces =
-        
Lists.newArrayList(DOT_SPLITTER.splitToList(metadataObject.fullName()));
-    if (!(metadataObject instanceof RangerSecurableObject)
-        && metadataObject.type() != MetadataObject.Type.METALAKE) {
-      metaObjNamespaces.remove(0); // skip catalog
-    }
-
+    List<String> metaObjNamespaces = metadataObject.names();
     List<String> rolePolicies = new ArrayList<>();
     for (int i = 0; i < metaObjNamespaces.size(); i++) {
       rolePolicies.add(
@@ -1402,21 +1402,21 @@ public class RangerHiveIT {
             });
   }
 
-  private void verifyOwnerInRanger(MetadataObject metadataObject) {
+  private void verifyOwnerInRanger(RangerMetadataObject metadataObject) {
     verifyOwnerInRanger(metadataObject, null, null, null, null, null, null);
   }
 
-  private void verifyOwnerInRanger(MetadataObject metadataObject, List<String> 
includeUsers) {
+  private void verifyOwnerInRanger(RangerMetadataObject metadataObject, 
List<String> includeUsers) {
     verifyOwnerInRanger(metadataObject, includeUsers, null, null, null, null, 
null);
   }
 
   private void verifyOwnerInRanger(
-      MetadataObject metadataObject, List<String> includeUsers, List<String> 
excludeUsers) {
+      RangerMetadataObject metadataObject, List<String> includeUsers, 
List<String> excludeUsers) {
     verifyOwnerInRanger(metadataObject, includeUsers, excludeUsers, null, 
null, null, null);
   }
 
   private void verifyOwnerInRanger(
-      MetadataObject metadataObject,
+      RangerMetadataObject metadataObject,
       List<String> includeUsers,
       List<String> excludeUsers,
       List<String> includeGroups) {
@@ -1425,7 +1425,7 @@ public class RangerHiveIT {
   }
 
   private void verifyOwnerInRanger(
-      MetadataObject metadataObject,
+      RangerMetadataObject metadataObject,
       List<String> includeUsers,
       List<String> excludeUsers,
       List<String> includeGroups,
@@ -1435,7 +1435,7 @@ public class RangerHiveIT {
   }
 
   private void verifyOwnerInRanger(
-      MetadataObject metadataObject,
+      RangerMetadataObject metadataObject,
       List<String> includeUsers,
       List<String> excludeUsers,
       List<String> includeGroups,
diff --git a/build.gradle.kts b/build.gradle.kts
index b954aaf10..d4eaee1e1 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -146,7 +146,7 @@ allprojects {
           "$1"
         )
 
-        targetExclude("**/build/**")
+        targetExclude("**/build/**", "**/.pnpm/***")
       }
 
       kotlinGradle {

Reply via email to