You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2018/05/03 15:26:01 UTC
atlas git commit: ATLAS-2635: added REST APIs to add/update/remove
classifications for an entity given its type and unique attributes
Repository: atlas
Updated Branches:
refs/heads/master 1e60ca4d9 -> 3a002db4d
ATLAS-2635: added REST APIs to add/update/remove classifications for an entity given its type and unique attributes
Signed-off-by: Madhan Neethiraj <ma...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/3a002db4
Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/3a002db4
Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/3a002db4
Branch: refs/heads/master
Commit: 3a002db4df348393aacbf5d49077ede37a6b1095
Parents: 1e60ca4
Author: rdsolani <rd...@gmail.com>
Authored: Wed May 2 16:37:12 2018 +0530
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Thu May 3 08:22:05 2018 -0700
----------------------------------------------------------------------
.../store/graph/AtlasEntityStore.java | 9 ++
.../store/graph/v1/AtlasEntityStoreV1.java | 6 ++
.../org/apache/atlas/web/rest/EntityREST.java | 102 ++++++++++++++++++-
.../atlas/web/adapters/TestEntityREST.java | 83 +++++++++++++++
4 files changed, 199 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/atlas/blob/3a002db4/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
index eb825c4..ac3bd82 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
@@ -131,7 +131,16 @@ public interface AtlasEntityStore {
*/
EntityMutationResponse deleteByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes)
throws AtlasBaseException;
+ /**
+ *
+ * Get an entity guid by its unique attributes
+ * @param entityType type of the entity
+ * @param uniqAttributes Attributes that uniquely identify the entity
+ * @return String entity guid
+ * @throws AtlasBaseException
+ */
+ String getGuidByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes) throws AtlasBaseException;
/*
* Return list of deleted entity guids
*/
http://git-wip-us.apache.org/repos/asf/atlas/blob/3a002db4/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
index 316d78c..e0f97e8 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
@@ -377,6 +377,12 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore {
@Override
@GraphTransaction
+ public String getGuidByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes) throws AtlasBaseException{
+ return AtlasGraphUtilsV1.getGuidByUniqueAttributes(entityType, uniqAttributes);
+ }
+
+ @Override
+ @GraphTransaction
public void addClassifications(final String guid, final List<AtlasClassification> classifications) throws AtlasBaseException {
if (StringUtils.isEmpty(guid)) {
throw new AtlasBaseException(AtlasErrorCode.INVALID_PARAMETERS, "Guid(s) not specified");
http://git-wip-us.apache.org/repos/asf/atlas/blob/3a002db4/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java b/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java
index 17a6ece..ca4d26d 100644
--- a/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java
+++ b/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java
@@ -23,6 +23,7 @@ import org.apache.atlas.model.audit.EntityAuditEventV2;
import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.TypeCategory;
import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.instance.AtlasEntity;
import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo;
import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo;
import org.apache.atlas.model.instance.ClassificationAssociateRequest;
@@ -61,6 +62,7 @@ import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -358,7 +360,7 @@ public class EntityREST {
}
}
- /**
+ /**
* Gets the list of classifications for a given entity represented by a guid.
* @param guid globally unique identifier for the entity
* @return a list of classifications for the given entity guid
@@ -387,6 +389,38 @@ public class EntityREST {
}
/**
+ * Adds classification to the entity identified by its type and unique attributes.
+ * @param typeName
+ */
+ @POST
+ @Path("/uniqueAttribute/type/{typeName}/classifications")
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public void addClassificationsByUniqueAttribute(@PathParam("typeName") String typeName, @Context HttpServletRequest servletRequest, List<AtlasClassification> classifications) throws AtlasBaseException {
+ Servlets.validateQueryParamLength("typeName", typeName);
+
+ AtlasPerfTracer perf = null;
+
+ try {
+ if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+ perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.addClassificationsByUniqueAttribute(" + typeName + ")");
+ }
+
+ AtlasEntityType entityType = ensureEntityType(typeName);
+ Map<String, Object> attributes = getAttributes(servletRequest);
+ String guid = entitiesStore.getGuidByUniqueAttributes(entityType, attributes);
+
+ if (guid == null) {
+ throw new AtlasBaseException(AtlasErrorCode.INSTANCE_BY_UNIQUE_ATTRIBUTE_NOT_FOUND, typeName, attributes.toString());
+ }
+
+ entitiesStore.addClassifications(guid, classifications);
+ } finally {
+ AtlasPerfTracer.log(perf);
+ }
+ }
+
+ /**
* Adds classifications to an existing entity represented by a guid.
* @param guid globally unique identifier for the entity
*/
@@ -415,6 +449,38 @@ public class EntityREST {
}
/**
+ * Updates classification on an entity identified by its type and unique attributes.
+ * @param typeName
+ */
+ @PUT
+ @Path("/uniqueAttribute/type/{typeName}/classifications")
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public void updateClassificationsByUniqueAttribute(@PathParam("typeName") String typeName, @Context HttpServletRequest servletRequest, List<AtlasClassification> classifications) throws AtlasBaseException {
+ Servlets.validateQueryParamLength("typeName", typeName);
+
+ AtlasPerfTracer perf = null;
+
+ try {
+ if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+ perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.updateClassificationsByUniqueAttribute(" + typeName + ")");
+ }
+
+ AtlasEntityType entityType = ensureEntityType(typeName);
+ Map<String, Object> attributes = getAttributes(servletRequest);
+ String guid = entitiesStore.getGuidByUniqueAttributes(entityType, attributes);
+
+ if (guid == null) {
+ throw new AtlasBaseException(AtlasErrorCode.INSTANCE_BY_UNIQUE_ATTRIBUTE_NOT_FOUND, typeName, attributes.toString());
+ }
+
+ entitiesStore.updateClassifications(guid, classifications);
+ } finally {
+ AtlasPerfTracer.log(perf);
+ }
+ }
+
+ /**
* Updates classifications to an existing entity represented by a guid.
* @param guid globally unique identifier for the entity
* @return classification for the given entity guid
@@ -444,6 +510,40 @@ public class EntityREST {
}
/**
+ * Deletes a given classification from an entity identified by its type and unique attributes.
+ * @param typeName
+ * @param classificationName name of the classification
+ */
+ @DELETE
+ @Path("/uniqueAttribute/type/{typeName}/classification/{classificationName}")
+ @Consumes({Servlets.JSON_MEDIA_TYPE, MediaType.APPLICATION_JSON})
+ @Produces(Servlets.JSON_MEDIA_TYPE)
+ public void deleteClassificationByUniqueAttribute(@PathParam("typeName") String typeName, @Context HttpServletRequest servletRequest,@PathParam("classificationName") String classificationName) throws AtlasBaseException {
+ Servlets.validateQueryParamLength("typeName", typeName);
+ Servlets.validateQueryParamLength("classificationName", classificationName);
+
+ AtlasPerfTracer perf = null;
+
+ try {
+ if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+ perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.deleteClassificationByUniqueAttribute(" + typeName + ")");
+ }
+
+ AtlasEntityType entityType = ensureEntityType(typeName);
+ Map<String, Object> attributes = getAttributes(servletRequest);
+ String guid = entitiesStore.getGuidByUniqueAttributes(entityType, attributes);
+
+ if (guid == null) {
+ throw new AtlasBaseException(AtlasErrorCode.INSTANCE_BY_UNIQUE_ATTRIBUTE_NOT_FOUND, typeName, attributes.toString());
+ }
+
+ entitiesStore.deleteClassifications(guid, Collections.singletonList(classificationName));
+ } finally {
+ AtlasPerfTracer.log(perf);
+ }
+ }
+
+ /**
* Deletes a given classification from an existing entity represented by a guid.
* @param guid globally unique identifier for the entity
* @param classificationName name of the classifcation
http://git-wip-us.apache.org/repos/asf/atlas/blob/3a002db4/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
----------------------------------------------------------------------
diff --git a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
index f0bc962..5d048cd 100644
--- a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
+++ b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
@@ -44,6 +44,7 @@ import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -200,6 +201,88 @@ public class TestEntityREST {
}
@Test(dependsOnMethods = "testDeleteClassification")
+ public void testAddClassificationByUniqueAttribute() throws Exception {
+ testClassification = new AtlasClassification(TestUtilsV2.CLASSIFICATION, Collections.singletonMap("tag", "tagName"));
+
+ List<AtlasClassification> classifications = Collections.singletonList(testClassification);
+
+ entityREST.addClassificationsByUniqueAttribute(TestUtilsV2.DATABASE_TYPE, toHttpServletRequest(TestUtilsV2.NAME, (String) dbEntity.getAttribute(TestUtilsV2.NAME)), classifications);
+
+ final AtlasClassification.AtlasClassifications retrievedClassifications = entityREST.getClassifications(dbEntity.getGuid());
+
+ Assert.assertNotNull(retrievedClassifications);
+
+ final List<AtlasClassification> retrievedClassificationsList = retrievedClassifications.getList();
+
+ Assert.assertNotNull(retrievedClassificationsList);
+
+ Assert.assertEquals(classifications, retrievedClassificationsList);
+
+ final AtlasClassification retrievedClassification = entityREST.getClassification(dbEntity.getGuid(), TestUtilsV2.CLASSIFICATION);
+
+ Assert.assertNotNull(retrievedClassification);
+ Assert.assertEquals(retrievedClassification, testClassification);
+ }
+
+ @Test(dependsOnMethods = "testAddClassificationByUniqueAttribute" )
+ public void testUpdateClassificationByUniqueAttribute() throws Exception{
+ testClassification = new AtlasClassification(TestUtilsV2.CLASSIFICATION, Collections.singletonMap("tag", "tagName"));
+ phiClassification = new AtlasClassification(TestUtilsV2.PHI, new HashMap<String, Object>() {{
+ put("stringAttr", "sample_string");
+ put("booleanAttr", true);
+ put("integerAttr", 100);
+ }});
+
+ entityREST.addClassificationsByUniqueAttribute(TestUtilsV2.DATABASE_TYPE, toHttpServletRequest(TestUtilsV2.NAME, (String) dbEntity.getAttribute(TestUtilsV2.NAME)), Arrays.asList(testClassification, phiClassification));
+
+ final AtlasClassifications retrievedClassifications = entityREST.getClassifications(dbEntity.getGuid());
+
+ Assert.assertNotNull(retrievedClassifications);
+
+ final List<AtlasClassification> retrievedClassificationsList = retrievedClassifications.getList();
+
+ Assert.assertNotNull(retrievedClassificationsList);
+
+ final AtlasClassification retrievedClassification = entityREST.getClassification(dbEntity.getGuid(), TestUtilsV2.PHI);
+
+ Assert.assertNotNull(retrievedClassification);
+ Assert.assertEquals(retrievedClassification, phiClassification);
+
+ for (String attrName : retrievedClassification.getAttributes().keySet()) {
+ Assert.assertEquals(retrievedClassification.getAttribute(attrName), phiClassification.getAttribute(attrName));
+ }
+
+ // update multiple tags attributes
+ phiClassification = new AtlasClassification(TestUtilsV2.PHI, new HashMap<String, Object>() {{
+ put("stringAttr", "sample_string_v2");
+ put("integerAttr", 200);
+ }});
+
+ entityREST.updateClassificationsByUniqueAttribute(TestUtilsV2.DATABASE_TYPE, toHttpServletRequest(TestUtilsV2.NAME, (String) dbEntity.getAttribute(TestUtilsV2.NAME)), Collections.singletonList(phiClassification));
+
+ AtlasClassification updatedClassification = entityREST.getClassification(dbEntity.getGuid(), TestUtilsV2.PHI);
+ Assert.assertNotNull(updatedClassification);
+ Assert.assertEquals(updatedClassification.getAttribute("stringAttr"), "sample_string_v2");
+ Assert.assertEquals(updatedClassification.getAttribute("integerAttr"), 200);
+ Assert.assertEquals(updatedClassification.getAttribute("booleanAttr"), true);
+
+ updatedClassification = entityREST.getClassification(dbEntity.getGuid(), TestUtilsV2.CLASSIFICATION);
+ Assert.assertNotNull(updatedClassification);
+ Assert.assertEquals(updatedClassification.getAttribute("tag"), testClassification.getAttribute("tag"));
+ }
+
+ @Test(dependsOnMethods = "testUpdateClassificationByUniqueAttribute" )
+ public void testDeleteClassificationByUniqueAttribute() throws Exception {
+ entityREST.deleteClassificationByUniqueAttribute(TestUtilsV2.DATABASE_TYPE, toHttpServletRequest(TestUtilsV2.NAME, (String) dbEntity.getAttribute(TestUtilsV2.NAME)), TestUtilsV2.CLASSIFICATION);
+ entityREST.deleteClassificationByUniqueAttribute(TestUtilsV2.DATABASE_TYPE, toHttpServletRequest(TestUtilsV2.NAME, (String) dbEntity.getAttribute(TestUtilsV2.NAME)), TestUtilsV2.PHI);
+
+ final AtlasClassification.AtlasClassifications retrievedClassifications = entityREST.getClassifications(dbEntity.getGuid());
+
+ Assert.assertNotNull(retrievedClassifications);
+ Assert.assertEquals(retrievedClassifications.getList().size(), 0);
+ }
+
+ @Test(dependsOnMethods = "testDeleteClassificationByUniqueAttribute")
public void testDeleteEntityById() throws Exception {
EntityMutationResponse response = entityREST.deleteByGuid(dbEntity.getGuid());