diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/Entity.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/Entity.java
index 0f13fa2e3ee..28a29576f39 100644
--- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/Entity.java
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/Entity.java
@@ -51,6 +51,9 @@ public final class Entity {
// Canonical entity name to corresponding EntityRepository map
private static final Map> ENTITY_REPOSITORY_MAP = new HashMap<>();
+ // List of entities
+ private static final List ENTITY_LIST = new ArrayList<>();
+
// Common field names
public static final String FIELD_OWNER = "owner";
public static final String FIELD_NAME = "name";
@@ -138,6 +141,9 @@ public final class Entity {
DAO_MAP.put(entity, dao);
ENTITY_REPOSITORY_MAP.put(entity, entityRepository);
CANONICAL_ENTITY_NAME_MAP.put(entity.toLowerCase(Locale.ROOT), entity);
+ ENTITY_LIST.add(entity);
+ Collections.sort(ENTITY_LIST);
+
LOG.info(
"Registering entity {} {} {} {}",
clazz,
@@ -146,6 +152,10 @@ public final class Entity {
entityRepository.getClass().getSimpleName());
}
+ public static List listEntities() {
+ return Collections.unmodifiableList(ENTITY_LIST);
+ }
+
public static EntityReference getEntityReference(EntityReference ref) throws IOException {
return ref == null ? null : getEntityReferenceById(ref.getType(), ref.getId(), Include.NON_DELETED);
}
diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/PolicyRepository.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/PolicyRepository.java
index 09a26c0e066..c44c0c55730 100644
--- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/PolicyRepository.java
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/jdbi3/PolicyRepository.java
@@ -31,7 +31,6 @@ import org.openmetadata.catalog.entity.data.Location;
import org.openmetadata.catalog.entity.policies.Policy;
import org.openmetadata.catalog.entity.policies.accessControl.Rule;
import org.openmetadata.catalog.exception.CatalogExceptionMessage;
-import org.openmetadata.catalog.jdbi3.EntityRepository.EntityUpdater;
import org.openmetadata.catalog.resources.policies.PolicyResource;
import org.openmetadata.catalog.type.EntityReference;
import org.openmetadata.catalog.type.MetadataOperation;
@@ -142,10 +141,8 @@ public class PolicyRepository extends EntityRepository {
LOG.debug("Validating rules for {} policy: {}", PolicyType.AccessControl, policy.getName());
Set operations = new HashSet<>();
- for (Object ruleObject : policy.getRules()) {
- // Cast to access control policy Rule.
- Rule rule = JsonUtils.readValue(JsonUtils.getJsonStructure(ruleObject).toString(), Rule.class);
-
+ List rules = EntityUtil.resolveRules(policy.getRules());
+ for (Rule rule : rules) {
if (rule.getOperation() == null) {
throw new IllegalArgumentException(
CatalogExceptionMessage.invalidPolicyOperationNull(rule.getName(), policy.getName()));
@@ -192,7 +189,6 @@ public class PolicyRepository extends EntityRepository {
if (original.getPolicyType() != updated.getPolicyType()) {
throw new IllegalArgumentException(CatalogExceptionMessage.readOnlyAttribute(POLICY, "policyType"));
}
- recordChange("policyUrl", original.getPolicyUrl(), updated.getPolicyUrl());
recordChange(ENABLED, original.getEnabled(), updated.getEnabled());
recordChange("rules", original.getRules(), updated.getRules());
updateLocation(original, updated);
diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/lineage/LineageResource.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/lineage/LineageResource.java
index 9b4c9cd9eaf..47a18560714 100644
--- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/lineage/LineageResource.java
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/lineage/LineageResource.java
@@ -165,7 +165,7 @@ public class LineageResource {
public Response addLineage(
@Context UriInfo uriInfo, @Context SecurityContext securityContext, @Valid AddLineage addLineage)
throws IOException {
- SecurityUtil.checkAdminRoleOrPermissions(authorizer, securityContext, null, MetadataOperation.UpdateLineage);
+ SecurityUtil.checkAdminRoleOrPermissions(authorizer, securityContext, null, MetadataOperation.EDIT_LINEAGE);
dao.addLineage(addLineage);
return Response.status(Status.OK).build();
}
@@ -201,7 +201,7 @@ public class LineageResource {
@Parameter(description = "Entity id", required = true, schema = @Schema(type = "string")) @PathParam("toId")
String toId)
throws IOException {
- SecurityUtil.checkAdminRoleOrPermissions(authorizer, securityContext, null, MetadataOperation.UpdateLineage);
+ SecurityUtil.checkAdminRoleOrPermissions(authorizer, securityContext, null, MetadataOperation.EDIT_LINEAGE);
boolean deleted = dao.deleteLineage(fromEntity, fromId, toEntity, toId);
if (!deleted) {
diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/policies/PolicyResource.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/policies/PolicyResource.java
index 51062a9572d..0adc4641860 100644
--- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/policies/PolicyResource.java
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/policies/PolicyResource.java
@@ -27,6 +27,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import javax.json.JsonPatch;
import javax.validation.Valid;
@@ -48,6 +50,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.UriInfo;
+import lombok.extern.slf4j.Slf4j;
import org.openmetadata.catalog.CatalogApplicationConfig;
import org.openmetadata.catalog.Entity;
import org.openmetadata.catalog.api.policies.CreatePolicy;
@@ -62,8 +65,10 @@ import org.openmetadata.catalog.security.policyevaluator.PolicyEvaluator;
import org.openmetadata.catalog.type.EntityHistory;
import org.openmetadata.catalog.type.EntityReference;
import org.openmetadata.catalog.type.Include;
+import org.openmetadata.catalog.type.MetadataOperation;
import org.openmetadata.catalog.util.ResultList;
+@Slf4j
@Path("/v1/policies")
@Api(value = "Policies collection", tags = "Policies collection")
@Produces(MediaType.APPLICATION_JSON)
@@ -71,6 +76,7 @@ import org.openmetadata.catalog.util.ResultList;
@Collection(name = "policies")
public class PolicyResource extends EntityResource {
public static final String COLLECTION_PATH = "v1/policies/";
+ public static final List RESOURCES = new ArrayList<>();
@Override
public Policy addHref(UriInfo uriInfo, Policy policy) {
@@ -87,6 +93,7 @@ public class PolicyResource extends EntityResource {
// Set up the PolicyEvaluator, before loading seed data.
PolicyEvaluator policyEvaluator = PolicyEvaluator.getInstance();
policyEvaluator.setPolicyRepository(dao);
+
// Load any existing rules from database, before loading seed data.
policyEvaluator.load();
dao.initSeedDataFromResources();
@@ -103,6 +110,17 @@ public class PolicyResource extends EntityResource {
}
}
+ public static class OperationList extends ResultList {
+ @SuppressWarnings("unused")
+ OperationList() {
+ // Empty constructor needed for deserialization
+ }
+
+ public OperationList(List data, String beforeCursor, String afterCursor, int total) {
+ super(data, beforeCursor, afterCursor, total);
+ }
+ }
+
public static final String FIELDS = "owner,location";
@GET
@@ -268,6 +286,30 @@ public class PolicyResource extends EntityResource {
return dao.getVersion(id, version);
}
+ @GET
+ @Path("/resources")
+ @Operation(
+ operationId = "listPolicyResources",
+ summary = "Get list of policy resources used in authoring a policy.",
+ tags = "policies",
+ description = "Get all the resources used in policy authoring",
+ responses = {
+ @ApiResponse(responseCode = "200", description = "policy", content = @Content(mediaType = "application/json")),
+ @ApiResponse(
+ responseCode = "404",
+ description = "Policy for instance {id} and version {version} is" + " " + "not found")
+ })
+ public List listPolicyResources(@Context UriInfo uriInfo, @Context SecurityContext securityContext)
+ throws IOException {
+ if (RESOURCES.isEmpty()) {
+ // Load set of resource types
+ RESOURCES.addAll(Entity.listEntities());
+ RESOURCES.add("lineage");
+ Collections.sort(RESOURCES);
+ }
+ return RESOURCES;
+ }
+
@POST
@Operation(
operationId = "createPolicy",
@@ -367,7 +409,6 @@ public class PolicyResource extends EntityResource {
private Policy getPolicy(CreatePolicy create, String user) {
Policy policy =
copy(new Policy(), create, user)
- .withPolicyUrl(create.getPolicyUrl())
.withPolicyType(create.getPolicyType())
.withRules(create.getRules())
.withEnabled(create.getEnabled());
diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/RoleResource.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/RoleResource.java
index c27df6bad92..4f78dad7554 100644
--- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/RoleResource.java
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/resources/teams/RoleResource.java
@@ -75,7 +75,7 @@ import org.openmetadata.catalog.util.ResultList;
@Api(value = "Roles collection", tags = "Roles collection")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
-@Collection(name = "roles", order = 1) // Load after PolicyResource at Order 0
+@Collection(name = "roles", order = 2) // Load after PolicyResource at Order 0
// policies exist before
// loading roles
@Slf4j
diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/util/EntityUtil.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/util/EntityUtil.java
index f348202df36..d54f09167d9 100644
--- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/util/EntityUtil.java
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/util/EntityUtil.java
@@ -40,6 +40,7 @@ import org.openmetadata.catalog.Entity;
import org.openmetadata.catalog.api.data.TermReference;
import org.openmetadata.catalog.entity.data.GlossaryTerm;
import org.openmetadata.catalog.entity.data.Table;
+import org.openmetadata.catalog.entity.policies.accessControl.Rule;
import org.openmetadata.catalog.entity.type.CustomProperty;
import org.openmetadata.catalog.exception.CatalogExceptionMessage;
import org.openmetadata.catalog.exception.EntityNotFoundException;
@@ -352,4 +353,13 @@ public final class EntityUtil {
.withFullyQualifiedName(from.getFullyQualifiedName())
.withDeleted(from.getDeleted());
}
+
+ public static List resolveRules(List
}
isOwner={isOwner()}
- permission={Operation.UpdateOwner}
+ permission={Operation.EditOwner}
position="left">