You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by kb...@apache.org on 2016/09/15 14:47:47 UTC

incubator-atlas git commit: ATLAS-712 Support getTrait() API (svimal2106 via kevalbhatt)

Repository: incubator-atlas
Updated Branches:
  refs/heads/master b856269e9 -> b6e0d60fd


ATLAS-712 Support getTrait() API (svimal2106 via kevalbhatt)


Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/b6e0d60f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/b6e0d60f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/b6e0d60f

Branch: refs/heads/master
Commit: b6e0d60fd5f18171397bc2a9c160614149515ae5
Parents: b856269
Author: kevalbhatt <kb...@apache.org>
Authored: Thu Sep 15 20:17:09 2016 +0530
Committer: kevalbhatt <kb...@apache.org>
Committed: Thu Sep 15 20:17:09 2016 +0530

----------------------------------------------------------------------
 .../main/java/org/apache/atlas/AtlasClient.java | 31 ++++++++
 release-log.txt                                 |  1 +
 .../atlas/web/resources/EntityResource.java     | 80 ++++++++++++++++++++
 .../web/resources/EntityJerseyResourceIT.java   | 28 +++++++
 4 files changed, 140 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/b6e0d60f/client/src/main/java/org/apache/atlas/AtlasClient.java
----------------------------------------------------------------------
diff --git a/client/src/main/java/org/apache/atlas/AtlasClient.java b/client/src/main/java/org/apache/atlas/AtlasClient.java
index 5ed79bc..49e2a31 100755
--- a/client/src/main/java/org/apache/atlas/AtlasClient.java
+++ b/client/src/main/java/org/apache/atlas/AtlasClient.java
@@ -100,6 +100,8 @@ public class AtlasClient {
     public static final String URI_NAME_LINEAGE = "lineage/hive/table";
     public static final String URI_LINEAGE = "lineage/";
     public static final String URI_TRAITS = "traits";
+    public static final String TRAIT_DEFINITIONS = "traitDefinitions";
+
 
     public static final String QUERY = "query";
     public static final String LIMIT = "limit";
@@ -492,6 +494,8 @@ public class AtlasClient {
         ADD_TRAITS(BASE_URI + URI_ENTITY, HttpMethod.POST, Response.Status.CREATED),
         DELETE_TRAITS(BASE_URI + URI_ENTITY, HttpMethod.DELETE, Response.Status.OK),
         LIST_TRAITS(BASE_URI + URI_ENTITY, HttpMethod.GET, Response.Status.OK),
+        GET_ALL_TRAIT_DEFINITIONS(BASE_URI + URI_ENTITY, HttpMethod.GET, Response.Status.OK),
+        GET_TRAIT_DEFINITION(BASE_URI + URI_ENTITY, HttpMethod.GET, Response.Status.OK),
 
         //Search operations
         SEARCH(BASE_URI + URI_SEARCH, HttpMethod.GET, Response.Status.OK),
@@ -987,6 +991,33 @@ public class AtlasClient {
         return extractResults(jsonResponse, AtlasClient.RESULTS, new ExtractOperation<String, String>());
     }
 
+    /**
+     * Get all trait definitions for an entity
+     * @param guid GUID of the entity
+     * @return List<String> trait definitions of the traits associated to the entity
+     * @throws AtlasServiceException
+     */
+    public List<String> listTraitDefinitions(final String guid) throws AtlasServiceException{
+        JSONObject jsonResponse = callAPI(API.GET_ALL_TRAIT_DEFINITIONS, null, guid, TRAIT_DEFINITIONS);
+        return extractResults(jsonResponse, AtlasClient.RESULTS, new ExtractOperation<String, String>());
+    }
+
+    /**
+     * Get trait definition for a given entity and traitname
+     * @param guid GUID of the entity
+     * @param traitname
+     * @return trait definition
+     * @throws AtlasServiceException
+     */
+    public String getTraitDefinition(final String guid, final String traitName) throws AtlasServiceException{
+        JSONObject jsonResponse = callAPI(API.GET_TRAIT_DEFINITION, null, guid, TRAIT_DEFINITIONS, traitName);
+        try {
+            return jsonResponse.getString(AtlasClient.RESULTS);
+        }catch (JSONException e){
+            throw new AtlasServiceException(API.GET_TRAIT_DEFINITION, e);
+        }
+    }
+
     protected class ExtractOperation<T, U> {
         T extractElement(U element) throws JSONException {
             return (T) element;

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/b6e0d60f/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index f043a33..ac9a904 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -9,6 +9,7 @@ ATLAS-1060 Add composite indexes for exact match performance improvements for al
 ATLAS-1127 Modify creation and modification timestamps to Date instead of Long(sumasai)
 
 ALL CHANGES:
+ATLAS-712 Support getTrait() API (svimal2106 via kevalbhatt)
 ATLAS-1173 Doc: Minor editorial bug in the example given for property atlas.server.ha.zookeeper.auth (yhemanth via shwethags)
 ATLAS-1133 Jetty Server start doesn't throw exception when user-credential.properties file is not found (nixonrodrigues,svimal2106 via kevalbhatt)
 ATLAS-1149 Changes to UI to sort the hive table schema based on "position" attribute of hive_column (Kalyanikashikar via kevalbhatt)

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/b6e0d60f/webapp/src/main/java/org/apache/atlas/web/resources/EntityResource.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/resources/EntityResource.java b/webapp/src/main/java/org/apache/atlas/web/resources/EntityResource.java
index 82016d0..493ed5c 100755
--- a/webapp/src/main/java/org/apache/atlas/web/resources/EntityResource.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/EntityResource.java
@@ -639,6 +639,86 @@ public class EntityResource {
     }
 
     /**
+     * Fetches the trait definitions of all the traits associated to the given entity
+     * @param guid globally unique identifier for the entity
+     */
+    @GET
+    @Path("{guid}/traitDefinitions")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public Response getTraitDefinitionsForEntity(@PathParam("guid") String guid){
+        AtlasPerfTracer perf = null;
+        try {
+            if(AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityResource.getTraitDefinitionsForEntity(" + guid + ")");
+            }
+            LOG.debug("Fetching all trait definitions for entity={}", guid);
+            final List<String> traitNames = metadataService.getTraitNames(guid);
+            ArrayList<String> traitDefinitions = new ArrayList<>();
+            for(String trait:traitNames){
+                String traitDefinition = metadataService.getTraitDefinition(guid, trait);
+                traitDefinitions.add(traitDefinition);
+            }
+
+            JSONObject response = new JSONObject();
+            response.put(AtlasClient.REQUEST_ID, Servlets.getRequestId());
+            response.put(AtlasClient.RESULTS, getJSONArray(traitDefinitions));
+            response.put(AtlasClient.COUNT, traitDefinitions.size());
+
+            return Response.ok(response).build();
+        } catch (EntityNotFoundException e){
+            LOG.error("An entity with GUID={} does not exist", guid, e);
+            throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.NOT_FOUND));
+        } catch (AtlasException | IllegalArgumentException e) {
+            LOG.error("Unable to get trait definitions for entity {}", guid, e);
+            throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.BAD_REQUEST));
+        } catch (Throwable e) {
+            LOG.error("Unable to get trait definitions for entity {}", guid, e);
+            throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
+        } finally {
+            AtlasPerfTracer.log(perf);
+        }
+
+    }
+
+    /**
+     * Fetches the trait definition for an entity given its guid and trait name
+     *
+     * @param guid globally unique identifier for the entity
+     * @param traitName name of the trait
+     */
+    @GET
+    @Path("{guid}/traitDefinitions/{traitName}")
+    @Produces(Servlets.JSON_MEDIA_TYPE)
+    public Response getTraitDefinitionForEntity(@PathParam("guid") String guid, @PathParam("traitName") String traitName){
+        AtlasPerfTracer perf = null;
+        try {
+            if(AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityResource.getTraitDefinitionForEntity(" + guid + ", " + traitName + ")");
+            }
+            LOG.debug("Fetching trait definition for entity {} and trait name {}", guid, traitName);
+            final String traitDefinition = metadataService.getTraitDefinition(guid, traitName);
+
+            JSONObject response = new JSONObject();
+            response.put(AtlasClient.REQUEST_ID, Servlets.getRequestId());
+            response.put(AtlasClient.RESULTS, new JSONObject(traitDefinition));
+
+            return Response.ok(response).build();
+
+        } catch (EntityNotFoundException e){
+            LOG.error("An entity with GUID={} does not exist", guid, e);
+            throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.NOT_FOUND));
+        } catch (AtlasException | IllegalArgumentException e) {
+            LOG.error("Unable to get trait definition for entity {} and trait {}", guid, traitName, e);
+            throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.BAD_REQUEST));
+        } catch (Throwable e) {
+            LOG.error("Unable to get trait definition for entity {} and trait {}", guid, traitName, e);
+            throw new WebApplicationException(Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR));
+        } finally {
+            AtlasPerfTracer.log(perf);
+        }
+    }
+
+    /**
      * Adds a new trait to an existing entity represented by a guid.
      *
      * @param guid globally unique identifier for the entity

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/b6e0d60f/webapp/src/test/java/org/apache/atlas/web/resources/EntityJerseyResourceIT.java
----------------------------------------------------------------------
diff --git a/webapp/src/test/java/org/apache/atlas/web/resources/EntityJerseyResourceIT.java b/webapp/src/test/java/org/apache/atlas/web/resources/EntityJerseyResourceIT.java
index a1988ef..6d90b9d 100755
--- a/webapp/src/test/java/org/apache/atlas/web/resources/EntityJerseyResourceIT.java
+++ b/webapp/src/test/java/org/apache/atlas/web/resources/EntityJerseyResourceIT.java
@@ -87,6 +87,7 @@ public class EntityJerseyResourceIT extends BaseResourceIT {
     private final String TABLE_NAME = "table" + randomString();
     private static final String ENTITIES = "api/atlas/entities";
     private static final String TRAITS = "traits";
+    private static final String TRAIT_DEFINITION = "traitDefinitions";
 
     private Referenceable tableInstance;
     private Id tableId;
@@ -526,6 +527,33 @@ public class EntityJerseyResourceIT extends BaseResourceIT {
         assertEntityAudit(guid, EntityAuditEvent.EntityAuditAction.TAG_ADD);
     }
 
+    @Test(dependsOnMethods = "testSubmitEntity")
+    public void testgetTraitDefinitionForEntity() throws Exception{
+        traitName = "PII_Trait" + randomString();
+        HierarchicalTypeDefinition<TraitType> piiTrait =
+                TypesUtil.createTraitTypeDef(traitName, ImmutableSet.<String>of());
+        String traitDefinitionAsJSON = TypesSerialization$.MODULE$.toJson(piiTrait, true);
+        LOG.debug("traitDefinitionAsJSON = " + traitDefinitionAsJSON);
+        createType(traitDefinitionAsJSON);
+
+        Struct traitInstance = new Struct(traitName);
+        String traitInstanceAsJSON = InstanceSerialization.toJson(traitInstance, true);
+        LOG.debug("traitInstanceAsJSON = " + traitInstanceAsJSON);
+
+        final String guid = tableId._getId();
+        ClientResponse clientResponse =
+                service.path(ENTITIES).path(guid).path(TRAITS).accept(Servlets.JSON_MEDIA_TYPE)
+                        .type(Servlets.JSON_MEDIA_TYPE)
+                        .method(HttpMethod.POST, ClientResponse.class, traitInstanceAsJSON);
+        Assert.assertEquals(clientResponse.getStatus(), Response.Status.CREATED.getStatusCode());
+        List<String> allTraitDefs = serviceClient.listTraitDefinitions(guid);
+        Assert.assertEquals(allTraitDefs.size(), 9);
+
+        String traitDef = serviceClient.getTraitDefinition(guid, traitName);
+        JSONObject responseAsJSON = new JSONObject(traitDef);
+        Assert.assertEquals(responseAsJSON.get("typeName"), traitName);
+    }
+
     @Test(dependsOnMethods = "testAddTrait")
     public void testAddExistingTrait() throws Exception {
         final String traitName = "PII_Trait" + randomString();