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 32a7df410f [#6133] Improvement(core): Supports to get Fileset schema
location in the AuthorizationUtils (#6211)
32a7df410f is described below
commit 32a7df410f30b7ff773f5a8d9fe14469a986329d
Author: Lord of Abyss <[email protected]>
AuthorDate: Fri Mar 28 14:11:00 2025 +0800
[#6133] Improvement(core): Supports to get Fileset schema location in the
AuthorizationUtils (#6211)
### What changes were proposed in this pull request?
Supports get Fileset schema location in the AuthorizationUtils
A Fileset can be uniquely identified using
`metalake.catalog.schema.fileset`. The logic for retrieving the schema
is as follows:
Check the type of `catalogObj.type()`:
- If it is `RELATIONAL`, determine whether the `provider` is Hive. If it
is a Hive table, retrieve its `LOCATION` property.
- If it is `FILESET`, determine whether it implements
`HasPropertyMetadata`:
1. If it does, use the `schemaPropertiesMetadata()` method to retrieve
the path.
2. If it does not implement `HasPropertyMetadata`, check whether it
contains any Fileset objects:
1. If it does not, convert the catalog object to `FilesetCatalog` and
retrieve its `LOCATION` property.
2. If it does contain Filesets, retrieve all the Fileset instances and
add their respective Fileset paths.
### Why are the changes needed?
Fix: #6133
### Does this PR introduce _any_ user-facing change?
No
### How was this patch tested?
local test.
---------
Co-authored-by: Rory <[email protected]>
---
.../test/TestChainedAuthorizationIT.java | 6 +-
.../common/PathBasedMetadataObject.java | 7 ++
.../common/TestPathBasedMetadataObject.java | 45 ++------
.../ranger/RangerAuthorizationHDFSPlugin.java | 117 +++++++++++----------
.../test/RangerAuthorizationHDFSPluginIT.java | 21 ++--
.../authorization/AuthorizationUtils.java | 92 ++++++++--------
6 files changed, 138 insertions(+), 150 deletions(-)
diff --git
a/authorizations/authorization-chain/src/test/java/org/apache/gravitino/authorization/chain/integration/test/TestChainedAuthorizationIT.java
b/authorizations/authorization-chain/src/test/java/org/apache/gravitino/authorization/chain/integration/test/TestChainedAuthorizationIT.java
index a7e1dc465f..3301e28e03 100644
---
a/authorizations/authorization-chain/src/test/java/org/apache/gravitino/authorization/chain/integration/test/TestChainedAuthorizationIT.java
+++
b/authorizations/authorization-chain/src/test/java/org/apache/gravitino/authorization/chain/integration/test/TestChainedAuthorizationIT.java
@@ -170,10 +170,8 @@ public class TestChainedAuthorizationIT extends
RangerBaseE2EIT {
RangerITEnv.rangerClient.getPoliciesInService(RangerITEnv.RANGER_HDFS_REPO_NAME);
rangerHivePolicies.stream().forEach(policy -> LOG.info("Ranger Hive
policy: {}", policy));
rangerHdfsPolicies.stream().forEach(policy -> LOG.info("Ranger HDFS
policy: {}", policy));
- Preconditions.condition(
- rangerHivePolicies.size() == 0, "Ranger Hive policies should be
empty");
- Preconditions.condition(
- rangerHdfsPolicies.size() == 0, "Ranger HDFS policies should be
empty");
+ Preconditions.condition(rangerHivePolicies.isEmpty(), "Ranger Hive
policies should be empty");
+ Preconditions.condition(rangerHdfsPolicies.isEmpty(), "Ranger HDFS
policies should be empty");
} catch (RangerServiceException e) {
throw new RuntimeException(e);
}
diff --git
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedMetadataObject.java
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedMetadataObject.java
index 05b77755dc..7b65fbd56f 100644
---
a/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedMetadataObject.java
+++
b/authorizations/authorization-common/src/main/java/org/apache/gravitino/authorization/common/PathBasedMetadataObject.java
@@ -27,6 +27,13 @@ import org.apache.gravitino.MetadataObject;
import org.apache.gravitino.authorization.AuthorizationMetadataObject;
public class PathBasedMetadataObject implements AuthorizationMetadataObject {
+
+ public static final PathType METALAKE_PATH = new
PathType(MetadataObject.Type.METALAKE);
+ public static final PathType CATALOG_PATH = new
PathType(MetadataObject.Type.CATALOG);
+ public static final PathType SCHEMA_PATH = new
PathType(MetadataObject.Type.SCHEMA);
+ public static final PathType TABLE_PATH = new
PathType(MetadataObject.Type.TABLE);
+ public static final PathType FILESET_PATH = new
PathType(MetadataObject.Type.FILESET);
+
/**
* The type of metadata object in the underlying system. Every type will map
one kind of the
* entity of the Gravitino type system. When we store a Hive table, first,
we will store the
diff --git
a/authorizations/authorization-common/src/test/java/org/apache/gravitino/authorization/common/TestPathBasedMetadataObject.java
b/authorizations/authorization-common/src/test/java/org/apache/gravitino/authorization/common/TestPathBasedMetadataObject.java
index 7656dabdfa..0fd40a541e 100644
---
a/authorizations/authorization-common/src/test/java/org/apache/gravitino/authorization/common/TestPathBasedMetadataObject.java
+++
b/authorizations/authorization-common/src/test/java/org/apache/gravitino/authorization/common/TestPathBasedMetadataObject.java
@@ -18,7 +18,6 @@
*/
package org.apache.gravitino.authorization.common;
-import org.apache.gravitino.MetadataObject;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -26,19 +25,11 @@ public class TestPathBasedMetadataObject {
@Test
public void PathBasedMetadataObjectEquals() {
PathBasedMetadataObject pathBasedMetadataObject1 =
- new PathBasedMetadataObject(
- "parent",
- "name",
- "path",
- PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET));
+ new PathBasedMetadataObject("parent", "name", "path",
PathBasedMetadataObject.FILESET_PATH);
pathBasedMetadataObject1.validateAuthorizationMetadataObject();
PathBasedMetadataObject pathBasedMetadataObject2 =
- new PathBasedMetadataObject(
- "parent",
- "name",
- "path",
- PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET));
+ new PathBasedMetadataObject("parent", "name", "path",
PathBasedMetadataObject.FILESET_PATH);
pathBasedMetadataObject2.validateAuthorizationMetadataObject();
Assertions.assertEquals(pathBasedMetadataObject1,
pathBasedMetadataObject2);
@@ -47,19 +38,12 @@ public class TestPathBasedMetadataObject {
@Test
public void PathBasedMetadataObjectNotEquals() {
PathBasedMetadataObject pathBasedMetadataObject1 =
- new PathBasedMetadataObject(
- "parent",
- "name",
- "path",
- PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET));
+ new PathBasedMetadataObject("parent", "name", "path",
PathBasedMetadataObject.FILESET_PATH);
pathBasedMetadataObject1.validateAuthorizationMetadataObject();
PathBasedMetadataObject pathBasedMetadataObject2 =
new PathBasedMetadataObject(
- "parent",
- "name",
- "path1",
- PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET));
+ "parent", "name", "path1", PathBasedMetadataObject.FILESET_PATH);
pathBasedMetadataObject2.validateAuthorizationMetadataObject();
Assertions.assertNotEquals(pathBasedMetadataObject1,
pathBasedMetadataObject2);
@@ -68,38 +52,25 @@ public class TestPathBasedMetadataObject {
@Test
void testToString() {
PathBasedMetadataObject pathBasedMetadataObject1 =
- new PathBasedMetadataObject(
- "parent",
- "name",
- "path",
- PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET));
+ new PathBasedMetadataObject("parent", "name", "path",
PathBasedMetadataObject.FILESET_PATH);
Assertions.assertEquals(
"MetadataObject: [fullName=parent.name], [path=path], [type=PATH]",
pathBasedMetadataObject1.toString());
PathBasedMetadataObject pathBasedMetadataObject2 =
- new PathBasedMetadataObject(
- "parent",
- "name",
- null,
- PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET));
+ new PathBasedMetadataObject("parent", "name", null,
PathBasedMetadataObject.FILESET_PATH);
Assertions.assertEquals(
"MetadataObject: [fullName=parent.name], [path=null], [type=PATH]",
pathBasedMetadataObject2.toString());
PathBasedMetadataObject pathBasedMetadataObject3 =
- new PathBasedMetadataObject(
- null, "name", null,
PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET));
+ new PathBasedMetadataObject(null, "name", null,
PathBasedMetadataObject.FILESET_PATH);
Assertions.assertEquals(
"MetadataObject: [fullName=name], [path=null], [type=PATH]",
pathBasedMetadataObject3.toString());
PathBasedMetadataObject pathBasedMetadataObject4 =
- new PathBasedMetadataObject(
- null,
- "name",
- "path",
- PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET));
+ new PathBasedMetadataObject(null, "name", "path",
PathBasedMetadataObject.FILESET_PATH);
Assertions.assertEquals(
"MetadataObject: [fullName=name], [path=path], [type=PATH]",
pathBasedMetadataObject4.toString());
diff --git
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHDFSPlugin.java
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHDFSPlugin.java
index 6359344582..2406fe5581 100644
---
a/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHDFSPlugin.java
+++
b/authorizations/authorization-ranger/src/main/java/org/apache/gravitino/authorization/ranger/RangerAuthorizationHDFSPlugin.java
@@ -251,17 +251,11 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
*/
@Override
protected void removeMetadataObject(AuthorizationMetadataObject
authzMetadataObject) {
- if (authzMetadataObject
- .type()
-
.equals(PathBasedMetadataObject.PathType.get(MetadataObject.Type.SCHEMA))) {
+ if
(authzMetadataObject.type().equals(PathBasedMetadataObject.SCHEMA_PATH)) {
removeSchemaMetadataObject(authzMetadataObject);
- } else if (authzMetadataObject
- .type()
-
.equals(PathBasedMetadataObject.PathType.get(MetadataObject.Type.TABLE))) {
+ } else if
(authzMetadataObject.type().equals(PathBasedMetadataObject.TABLE_PATH)) {
removeTableMetadataObject(authzMetadataObject);
- } else if (authzMetadataObject
- .type()
-
.equals(PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET))) {
+ } else if
(authzMetadataObject.type().equals(PathBasedMetadataObject.FILESET_PATH)) {
removePolicyByMetadataObject(authzMetadataObject);
} else {
throw new IllegalArgumentException(
@@ -278,8 +272,7 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
authzMetadataObject instanceof PathBasedMetadataObject,
"The metadata object must be a PathBasedMetadataObject");
Preconditions.checkArgument(
- authzMetadataObject.type()
- ==
PathBasedMetadataObject.PathType.get(MetadataObject.Type.SCHEMA),
+ authzMetadataObject.type().equals(PathBasedMetadataObject.SCHEMA_PATH),
"The metadata object type must be a schema");
Preconditions.checkArgument(
authzMetadataObject.names().size() == 1, "The metadata object's size
must be 1.");
@@ -305,7 +298,7 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
AuthorizationMetadataObject.getParentFullName(names),
AuthorizationMetadataObject.getLastName(names),
locationPath,
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.SCHEMA));
+ PathBasedMetadataObject.SCHEMA_PATH);
removeSchemaMetadataObject(schemaMetadataObject);
});
});
@@ -330,7 +323,7 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
authzMetadataObject.name(),
table.name(),
locationPath,
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.TABLE));
+ PathBasedMetadataObject.TABLE_PATH);
removeTableMetadataObject(tableMetadataObject);
});
});
@@ -349,7 +342,7 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
authzMetadataObject.name(),
schema.name(),
locationPath,
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.SCHEMA));
+ PathBasedMetadataObject.SCHEMA_PATH);
removePolicyByMetadataObject(schemaMetadataObject);
});
}
@@ -366,9 +359,7 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
Preconditions.checkArgument(
authzMetadataObject.names().size() == 3, "The metadata object's name
size must be 3");
Preconditions.checkArgument(
- authzMetadataObject
- .type()
-
.equals(PathBasedMetadataObject.PathType.get(MetadataObject.Type.SCHEMA)),
+ authzMetadataObject.type().equals(PathBasedMetadataObject.TABLE_PATH),
"The metadata object type must be a path");
removePolicyByMetadataObject(authzMetadataObject);
}
@@ -466,27 +457,20 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
case USE_SCHEMA:
switch (securableObject.type()) {
case METALAKE:
+ extractMetalakeLocations(
+ securableObject, identifier, rangerSecurableObjects,
rangerPrivileges);
+ break;
case CATALOG:
case SCHEMA:
AuthorizationUtils.getMetadataObjectLocation(
identifier,
MetadataObjectUtil.toEntityType(securableObject))
.forEach(
locationPath -> {
- PathBasedMetadataObject pathBaseMetadataObject
=
- new PathBasedMetadataObject(
- securableObject.parent(),
- securableObject.name(),
- locationPath,
- PathBasedMetadataObject.PathType.get(
- securableObject.type()));
-
pathBaseMetadataObject.validateAuthorizationMetadataObject();
- rangerSecurableObjects.add(
- generateAuthorizationSecurableObject(
- pathBaseMetadataObject.names(),
- locationPath,
- PathBasedMetadataObject.PathType.get(
- securableObject.type()),
- rangerPrivileges));
+ createPathBasedMetadataObject(
+ securableObject,
+ locationPath,
+ rangerSecurableObjects,
+ rangerPrivileges);
});
break;
default:
@@ -499,27 +483,19 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
case CREATE_SCHEMA:
switch (securableObject.type()) {
case METALAKE:
+ extractMetalakeLocations(
+ securableObject, identifier, rangerSecurableObjects,
rangerPrivileges);
+ break;
case CATALOG:
AuthorizationUtils.getMetadataObjectLocation(
identifier,
MetadataObjectUtil.toEntityType(securableObject))
.forEach(
- locationPath -> {
- PathBasedMetadataObject pathBaseMetadataObject
=
- new PathBasedMetadataObject(
- securableObject.parent(),
- securableObject.name(),
- locationPath,
- PathBasedMetadataObject.PathType.get(
- securableObject.type()));
-
pathBaseMetadataObject.validateAuthorizationMetadataObject();
- rangerSecurableObjects.add(
- generateAuthorizationSecurableObject(
- pathBaseMetadataObject.names(),
- locationPath,
- PathBasedMetadataObject.PathType.get(
- securableObject.type()),
- rangerPrivileges));
- });
+ locationPath ->
+ createPathBasedMetadataObject(
+ securableObject,
+ locationPath,
+ rangerSecurableObjects,
+ rangerPrivileges));
break;
default:
throw new AuthorizationPluginException(
@@ -556,8 +532,7 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
generateAuthorizationSecurableObject(
pathBasedMetadataObject.names(),
getAuthorizationPath(pathBasedMetadataObject),
- PathBasedMetadataObject.PathType.get(
- MetadataObject.Type.FILESET),
+ PathBasedMetadataObject.FILESET_PATH,
rangerPrivileges));
});
break;
@@ -579,6 +554,42 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
return rangerSecurableObjects;
}
+ private void extractMetalakeLocations(
+ SecurableObject securableObject,
+ NameIdentifier identifier,
+ List<AuthorizationSecurableObject> rangerSecurableObjects,
+ Set<AuthorizationPrivilege> rangerPrivileges) {
+ NameIdentifier[] catalogs =
+ GravitinoEnv.getInstance()
+ .catalogDispatcher()
+ .listCatalogs(Namespace.of(identifier.name()));
+ for (NameIdentifier catalog : catalogs) {
+ AuthorizationUtils.getMetadataObjectLocation(catalog,
Entity.EntityType.CATALOG)
+ .forEach(
+ locationPath ->
+ createPathBasedMetadataObject(
+ securableObject, locationPath, rangerSecurableObjects,
rangerPrivileges));
+ }
+ }
+
+ private void createPathBasedMetadataObject(
+ SecurableObject securableObject,
+ String locationPath,
+ List<AuthorizationSecurableObject> rangerSecurableObjects,
+ Set<AuthorizationPrivilege> rangerPrivileges) {
+ PathBasedMetadataObject pathBaseMetadataObject =
+ new PathBasedMetadataObject(
+ securableObject.parent(),
+ securableObject.name(),
+ locationPath,
+ PathBasedMetadataObject.PathType.get(securableObject.type()));
+ pathBaseMetadataObject.validateAuthorizationMetadataObject();
+ rangerSecurableObjects.add(
+ generateAuthorizationSecurableObject(
+ pathBaseMetadataObject.names(), locationPath,
+ PathBasedMetadataObject.PathType.get(securableObject.type()),
rangerPrivileges));
+ }
+
@Override
public List<AuthorizationSecurableObject> translateOwner(MetadataObject
gravitinoMetadataObject) {
List<AuthorizationSecurableObject> rangerSecurableObjects = new
ArrayList<>();
@@ -600,7 +611,7 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
generateAuthorizationSecurableObject(
pathBasedMetadataObject.names(),
getAuthorizationPath(pathBasedMetadataObject),
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET),
+ PathBasedMetadataObject.FILESET_PATH,
ownerMappingRule()));
});
break;
@@ -686,7 +697,7 @@ public class RangerAuthorizationHDFSPlugin extends
RangerAuthorizationPlugin {
changeMetadataObject.metadataObject().parent(),
changeMetadataObject.metadataObject().name(),
locationPath,
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET));
+ PathBasedMetadataObject.FILESET_PATH);
pathBaseMetadataObject.validateAuthorizationMetadataObject();
authzMetadataObjects.add(pathBaseMetadataObject);
});
diff --git
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationHDFSPluginIT.java
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationHDFSPluginIT.java
index b643948490..9b399eeabb 100644
---
a/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationHDFSPluginIT.java
+++
b/authorizations/authorization-ranger/src/test/java/org/apache/gravitino/authorization/ranger/integration/test/RangerAuthorizationHDFSPluginIT.java
@@ -85,8 +85,7 @@ public class RangerAuthorizationHDFSPluginIT {
Assertions.assertEquals(
metalake.fullName(),
pathBasedMetadataObject.fullName());
Assertions.assertEquals(
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.METALAKE),
- pathBasedMetadataObject.type());
+ PathBasedMetadataObject.METALAKE_PATH,
pathBasedMetadataObject.type());
Assertions.assertEquals("/test",
pathBasedMetadataObject.path());
});
@@ -100,8 +99,7 @@ public class RangerAuthorizationHDFSPluginIT {
(PathBasedMetadataObject) securableObject;
Assertions.assertEquals(catalog.fullName(),
pathBasedMetadataObject.fullName());
Assertions.assertEquals(
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.CATALOG),
- pathBasedMetadataObject.type());
+ PathBasedMetadataObject.CATALOG_PATH,
pathBasedMetadataObject.type());
Assertions.assertEquals("/test",
pathBasedMetadataObject.path());
});
@@ -115,8 +113,7 @@ public class RangerAuthorizationHDFSPluginIT {
(PathBasedMetadataObject) securableObject;
Assertions.assertEquals(schema.fullName(),
pathBasedMetadataObject.fullName());
Assertions.assertEquals(
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.SCHEMA),
- pathBasedMetadataObject.type());
+ PathBasedMetadataObject.SCHEMA_PATH,
pathBasedMetadataObject.type());
Assertions.assertEquals("/test",
pathBasedMetadataObject.path());
});
@@ -131,8 +128,7 @@ public class RangerAuthorizationHDFSPluginIT {
(PathBasedMetadataObject) securableObject;
Assertions.assertEquals(table.fullName(),
pathBasedMetadataObject.fullName());
Assertions.assertEquals(
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.TABLE),
- securableObject.type());
+ PathBasedMetadataObject.TABLE_PATH,
securableObject.type());
Assertions.assertEquals("/test",
pathBasedMetadataObject.path());
});
@@ -147,8 +143,7 @@ public class RangerAuthorizationHDFSPluginIT {
(PathBasedMetadataObject) securableObject;
Assertions.assertEquals(fileset.fullName(),
pathBasedMetadataObject.fullName());
Assertions.assertEquals(
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET),
- securableObject.type());
+ PathBasedMetadataObject.FILESET_PATH,
securableObject.type());
Assertions.assertEquals("/test",
pathBasedMetadataObject.path());
});
});
@@ -211,8 +206,7 @@ public class RangerAuthorizationHDFSPluginIT {
PathBasedSecurableObject pathBasedSecurableObject =
(PathBasedSecurableObject) securableObject;
Assertions.assertEquals(
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET),
- pathBasedSecurableObject.type());
+ PathBasedMetadataObject.FILESET_PATH,
pathBasedSecurableObject.type());
Assertions.assertEquals("/test",
pathBasedSecurableObject.path());
Assertions.assertEquals(2,
pathBasedSecurableObject.privileges().size());
});
@@ -252,8 +246,7 @@ public class RangerAuthorizationHDFSPluginIT {
Assertions.assertEquals(1, filesetOwner.size());
Assertions.assertEquals("/test",
pathBasedSecurableObject.path());
Assertions.assertEquals(
-
PathBasedMetadataObject.PathType.get(MetadataObject.Type.FILESET),
- pathBasedSecurableObject.type());
+ PathBasedMetadataObject.FILESET_PATH,
pathBasedSecurableObject.type());
Assertions.assertEquals(3,
pathBasedSecurableObject.privileges().size());
});
});
diff --git
a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
index cbae0a5c91..4df0270c6c 100644
---
a/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
+++
b/core/src/main/java/org/apache/gravitino/authorization/AuthorizationUtils.java
@@ -22,13 +22,11 @@ import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
-import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.gravitino.Catalog;
import org.apache.gravitino.Entity;
@@ -62,6 +60,9 @@ import org.slf4j.LoggerFactory;
/* The utilization class of authorization module*/
public class AuthorizationUtils {
private static final Logger LOG =
LoggerFactory.getLogger(AuthorizationUtils.class);
+ private static final String FILESET_CATALOG_LOCATION = "location";
+ private static final String FILESET_SCHEMA_LOCATION = "location";
+ private static final String HIVE_LOCATION = "location";
static final String USER_DOES_NOT_EXIST_MSG = "User %s does not exist in the
metalake %s";
static final String GROUP_DOES_NOT_EXIST_MSG = "Group %s does not exist in
the metalake %s";
static final String ROLE_DOES_NOT_EXIST_MSG = "Role %s does not exist in the
metalake %s";
@@ -427,30 +428,15 @@ public class AuthorizationUtils {
public static List<String> getMetadataObjectLocation(
NameIdentifier ident, Entity.EntityType type) {
List<String> locations = new ArrayList<>();
+
+ // If we don't enable authorization, the location should return empty
collection.
+ if (GravitinoEnv.getInstance().accessControlDispatcher() == null) {
+ return locations;
+ }
+
try {
switch (type) {
case METALAKE:
- {
- NameIdentifier[] identifiers =
- GravitinoEnv.getInstance()
- .catalogDispatcher()
- .listCatalogs(Namespace.of(ident.name()));
- Arrays.stream(identifiers)
- .collect(Collectors.toList())
- .forEach(
- identifier -> {
- Catalog catalogObj =
-
GravitinoEnv.getInstance().catalogDispatcher().loadCatalog(identifier);
- if (catalogObj.provider().equals("hive")) {
- // The Hive default schema location is Hive warehouse
directory
- String defaultSchemaLocation =
- getHiveDefaultLocation(ident.name(),
catalogObj.name());
- if (defaultSchemaLocation != null &&
!defaultSchemaLocation.isEmpty()) {
- locations.add(defaultSchemaLocation);
- }
- }
- });
- }
break;
case CATALOG:
{
@@ -466,30 +452,54 @@ public class AuthorizationUtils {
}
break;
case SCHEMA:
- {
- Catalog catalogObj =
- GravitinoEnv.getInstance()
- .catalogDispatcher()
- .loadCatalog(
- NameIdentifier.of(ident.namespace().level(0),
ident.namespace().level(1)));
- LOG.info("Catalog provider is %s", catalogObj.provider());
- if (catalogObj.provider().equals("hive")) {
- Schema schema =
GravitinoEnv.getInstance().schemaDispatcher().loadSchema(ident);
- if (schema.properties().containsKey(HiveConstants.LOCATION)) {
- String schemaLocation =
schema.properties().get(HiveConstants.LOCATION);
+ Catalog catalogObj =
+ GravitinoEnv.getInstance()
+ .catalogDispatcher()
+ .loadCatalog(
+ NameIdentifier.of(ident.namespace().level(0),
ident.namespace().level(1)));
+ Schema schema =
GravitinoEnv.getInstance().schemaDispatcher().loadSchema(ident);
+
+ switch (catalogObj.type()) {
+ case RELATIONAL:
+ if ("hive".equals(catalogObj.provider())
+ && schema.properties().containsKey(HIVE_LOCATION)) {
+ String schemaLocation = schema.properties().get(HIVE_LOCATION);
if (StringUtils.isNotBlank(schemaLocation)) {
locations.add(schemaLocation);
} else {
LOG.warn("Schema {} location is not found", ident);
}
}
- }
- // TODO: [#6133] Supports get Fileset schema location in the
AuthorizationUtils
+ break;
+
+ case FILESET:
+ if ("hadoop".equals(catalogObj.provider())) {
+ if (schema.properties().containsKey(FILESET_SCHEMA_LOCATION)) {
+ String schemaLocation =
schema.properties().get(FILESET_SCHEMA_LOCATION);
+ if (StringUtils.isNotBlank(schemaLocation)) {
+ locations.add(schemaLocation);
+ } else if
(catalogObj.properties().containsKey(FILESET_CATALOG_LOCATION)) {
+ String catalogLocation =
schema.properties().get(FILESET_CATALOG_LOCATION);
+ if (StringUtils.isNotBlank(catalogLocation)) {
+ schemaLocation = catalogLocation + "/" + schema.name();
+ locations.add(schemaLocation);
+ }
+ } else {
+ LOG.warn("Schema {} location is not found", ident);
+ }
+ }
+ }
+ break;
+
+ default:
+ LOG.warn("Unsupported catalog type {}", catalogObj.type());
+ break;
}
break;
+
case TABLE:
{
- Catalog catalogObj =
+ catalogObj =
GravitinoEnv.getInstance()
.catalogDispatcher()
.loadCatalog(
@@ -517,6 +527,9 @@ public class AuthorizationUtils {
filesetLocation != null, String.format("Fileset %s location is
not found", ident));
locations.add(filesetLocation);
break;
+ case TOPIC:
+ // Topic doesn't have locations now.
+ break;
default:
throw new AuthorizationPluginException(
"Failed to get location paths for metadata object %s type %s",
ident, type);
@@ -527,9 +540,4 @@ public class AuthorizationUtils {
return locations;
}
-
- private static NameIdentifier getObjectNameIdentifier(
- String metalake, MetadataObject metadataObject) {
- return NameIdentifier.parse(String.format("%s.%s", metalake,
metadataObject.fullName()));
- }
}