You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by sa...@apache.org on 2017/08/23 06:07:00 UTC

[1/2] atlas git commit: ATLAS-2078: Type update using v1 API doesn't route to createUpdateTypesDef in v2 API

Repository: atlas
Updated Branches:
  refs/heads/master b54f4b876 -> 024fd2210


ATLAS-2078: Type update using v1 API doesn't route to createUpdateTypesDef in v2 API


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

Branch: refs/heads/master
Commit: 88eadb9bfa74b17dfff26dcbad0617d240d856e9
Parents: b54f4b8
Author: Sarath Subramanian <ss...@hortonworks.com>
Authored: Tue Aug 22 23:05:10 2017 -0700
Committer: Sarath Subramanian <ss...@hortonworks.com>
Committed: Tue Aug 22 23:05:10 2017 -0700

----------------------------------------------------------------------
 .../java/org/apache/atlas/store/AtlasTypeDefStore.java  |  2 ++
 .../repository/store/graph/AtlasTypeDefGraphStore.java  | 12 ++++++++++++
 .../org/apache/atlas/web/resources/TypesResource.java   |  9 ++++++---
 3 files changed, 20 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/88eadb9b/intg/src/main/java/org/apache/atlas/store/AtlasTypeDefStore.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/store/AtlasTypeDefStore.java b/intg/src/main/java/org/apache/atlas/store/AtlasTypeDefStore.java
index e1c5a7f..c63dc24 100644
--- a/intg/src/main/java/org/apache/atlas/store/AtlasTypeDefStore.java
+++ b/intg/src/main/java/org/apache/atlas/store/AtlasTypeDefStore.java
@@ -93,6 +93,8 @@ public interface AtlasTypeDefStore {
 
     AtlasTypesDef updateTypesDef(AtlasTypesDef atlasTypesDef) throws AtlasBaseException;
 
+    AtlasTypesDef createUpdateTypesDef(AtlasTypesDef typesToCreateUpdate) throws AtlasBaseException;
+
     AtlasTypesDef createUpdateTypesDef(AtlasTypesDef typesToCreate, AtlasTypesDef typesToUpdate) throws AtlasBaseException;
 
     void deleteTypesDef(AtlasTypesDef atlasTypesDef) throws AtlasBaseException;

http://git-wip-us.apache.org/repos/asf/atlas/blob/88eadb9b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStore.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStore.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStore.java
index 7a0bbca..22e1443 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStore.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasTypeDefGraphStore.java
@@ -45,6 +45,9 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import static org.apache.atlas.repository.store.bootstrap.AtlasTypeDefStoreInitializer.getTypesToCreate;
+import static org.apache.atlas.repository.store.bootstrap.AtlasTypeDefStoreInitializer.getTypesToUpdate;
+
 
 /**
  * Abstract class for graph persistence store for TypeDef
@@ -340,6 +343,15 @@ public abstract class AtlasTypeDefGraphStore implements AtlasTypeDefStore, Activ
 
     @Override
     @GraphTransaction
+    public AtlasTypesDef createUpdateTypesDef(AtlasTypesDef typesDef) throws AtlasBaseException {
+        AtlasTypesDef typesToCreate = getTypesToCreate(typesDef, typeRegistry);
+        AtlasTypesDef typesToUpdate = getTypesToUpdate(typesDef, typeRegistry);
+
+        return createUpdateTypesDef(typesToCreate, typesToUpdate);
+    }
+
+    @Override
+    @GraphTransaction
     public AtlasTypesDef createUpdateTypesDef(AtlasTypesDef typesToCreate, AtlasTypesDef typesToUpdate) throws AtlasBaseException {
         if (LOG.isDebugEnabled()) {
             LOG.debug("==> AtlasTypeDefGraphStore.createUpdateTypesDef({}, {})", typesToCreate, typesToUpdate);

http://git-wip-us.apache.org/repos/asf/atlas/blob/88eadb9b/webapp/src/main/java/org/apache/atlas/web/resources/TypesResource.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/resources/TypesResource.java b/webapp/src/main/java/org/apache/atlas/web/resources/TypesResource.java
index f70593a..a9c5509 100755
--- a/webapp/src/main/java/org/apache/atlas/web/resources/TypesResource.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/TypesResource.java
@@ -23,6 +23,7 @@ import com.sun.jersey.api.core.ResourceContext;
 import org.apache.atlas.AtlasClient;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.typedef.AtlasTypesDef;
+import org.apache.atlas.store.AtlasTypeDefStore;
 import org.apache.atlas.type.AtlasTypeRegistry;
 import org.apache.atlas.typesystem.TypesDef;
 import org.apache.atlas.typesystem.json.TypesSerialization;
@@ -71,11 +72,13 @@ public class TypesResource {
     private static final Logger PERF_LOG = AtlasPerfTracer.getPerfLogger("rest.TypesResource");
     private static AtlasTypeRegistry typeRegistry;
     private final TypesREST typesREST;
+    private final AtlasTypeDefStore typeDefStore;
 
     @Inject
-    public TypesResource(AtlasTypeRegistry typeRegistry, TypesREST typesREST) {
+    public TypesResource(AtlasTypeRegistry typeRegistry, TypesREST typesREST, AtlasTypeDefStore typeDefStore) {
         this.typeRegistry = typeRegistry;
-        this.typesREST = typesREST;
+        this.typesREST    = typesREST;
+        this.typeDefStore = typeDefStore;
     }
 
     @Context
@@ -176,7 +179,7 @@ public class TypesResource {
             }
 
             AtlasTypesDef updateTypesDef  = TypeConverterUtil.toAtlasTypesDef(typeDefinition, typeRegistry);
-            AtlasTypesDef updatedTypesDef = typesREST.updateAtlasTypeDefs(updateTypesDef);
+            AtlasTypesDef updatedTypesDef = typeDefStore.createUpdateTypesDef(updateTypesDef);
             List<String>  typeNames       = TypeConverterUtil.getTypeNames(updatedTypesDef);
 
             for (int i = 0; i < typeNames.size(); i++) {


[2/2] atlas git commit: ATLAS-2079: Fix coverity scan issue and IT failures introduced by ATLAS-2062

Posted by sa...@apache.org.
ATLAS-2079: Fix coverity scan issue and IT failures introduced by ATLAS-2062


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

Branch: refs/heads/master
Commit: 024fd221043ae745921d9bfa9e6e689507972f1a
Parents: 88eadb9
Author: Sarath Subramanian <ss...@hortonworks.com>
Authored: Tue Aug 22 23:06:31 2017 -0700
Committer: Sarath Subramanian <ss...@hortonworks.com>
Committed: Tue Aug 22 23:06:31 2017 -0700

----------------------------------------------------------------------
 .../model/instance/EntityMutationResponse.java  | 20 ++++++++-
 .../org/apache/atlas/type/AtlasEntityType.java  | 17 ++++---
 pom.xml                                         |  4 +-
 .../atlas/repository/graph/GraphHelper.java     |  4 +-
 .../test/resources/atlas-application.properties |  4 ++
 .../NotificationHookConsumerIT.java             | 29 ++++++------
 .../web/integration/EntityJerseyResourceIT.java | 47 +++++++++++++++++---
 7 files changed, 90 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/024fd221/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java b/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
index 7078436..751df27 100644
--- a/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
+++ b/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
@@ -33,6 +33,8 @@ import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
 import org.apache.atlas.model.instance.EntityMutations.EntityOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
 import org.codehaus.jackson.annotate.JsonAutoDetect;
 import org.codehaus.jackson.annotate.JsonIgnore;
 import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@@ -200,9 +202,25 @@ public class EntityMutationResponse {
             mutatedEntities.put(op, opEntities);
         }
 
-        opEntities.add(header);
+        if (!entityHeaderExists(opEntities, header)) {
+            opEntities.add(header);
+        }
     }
 
+    private boolean entityHeaderExists(List<AtlasEntityHeader> entityHeaders, AtlasEntityHeader newEntityHeader) {
+        boolean ret = false;
+
+        if (CollectionUtils.isNotEmpty(entityHeaders) && newEntityHeader != null) {
+            for (AtlasEntityHeader entityHeader : entityHeaders) {
+                if (StringUtils.equals(entityHeader.getGuid(), newEntityHeader.getGuid())) {
+                    ret = true;
+                    break;
+                }
+            }
+        }
+
+        return ret;
+    }
 
     public StringBuilder toString(StringBuilder sb) {
         if ( sb == null) {

http://git-wip-us.apache.org/repos/asf/atlas/blob/024fd221/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
index 2cb8e27..28215fd 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
@@ -621,12 +621,11 @@ public class AtlasEntityType extends AtlasStructType {
                 AtlasEntity entityObj = (AtlasEntity) obj;
 
                 for (AtlasAttribute attribute : relationshipAttributes.values()) {
-                    String attributeName = attribute.getName();
-
                     if (attribute != null) {
-                        AtlasType dataType  = attribute.getAttributeType();
-                        Object    value     = entityObj.getAttribute(attributeName);
-                        String    fieldName = objName + "." + attributeName;
+                        String    attributeName = attribute.getName();
+                        AtlasType dataType      = attribute.getAttributeType();
+                        Object    value         = entityObj.getAttribute(attributeName);
+                        String    fieldName     = objName + "." + attributeName;
 
                         if (isValidRelationshipType(dataType) && value != null) {
                             ret = dataType.validateValue(value, fieldName, messages) && ret;
@@ -638,12 +637,12 @@ public class AtlasEntityType extends AtlasStructType {
                 Map attributes = AtlasTypeUtil.toStructAttributes((Map)obj);
 
                 for (AtlasAttribute attribute : relationshipAttributes.values()) {
-                    String attributeName = attribute.getName();
 
                     if (attribute != null) {
-                        AtlasType dataType  = attribute.getAttributeType();
-                        Object    value     = attributes.get(attributeName);
-                        String    fieldName = objName + "." + attributeName;
+                        String    attributeName = attribute.getName();
+                        AtlasType dataType      = attribute.getAttributeType();
+                        Object    value         = attributes.get(attributeName);
+                        String    fieldName     = objName + "." + attributeName;
 
                         if (isValidRelationshipType(dataType) && value != null) {
                             ret = dataType.validateValue(value, fieldName, messages) && ret;

http://git-wip-us.apache.org/repos/asf/atlas/blob/024fd221/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index f127774..5adfc9c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1922,7 +1922,7 @@
                         <log4j.configuration>atlas-log4j.xml</log4j.configuration>
                     </systemProperties>
                     <skipTests>${skipTests}</skipTests>
-                    <forkCount>2C</forkCount>
+                    <forkCount>1C</forkCount>
                     <reuseForks>false</reuseForks>
                     <redirectTestOutputToFile>true</redirectTestOutputToFile>
                     <argLine>-Djava.awt.headless=true -Dproject.version=${project.version}
@@ -2087,7 +2087,7 @@
                         <goals>
                             <goal>check</goal>
                         </goals>
-                        <phase>verify</phase>
+                        <phase>validate</phase>
                     </execution>
                 </executions>
             </plugin>

http://git-wip-us.apache.org/repos/asf/atlas/blob/024fd221/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java b/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
index 1ec5a72..0177f7e 100755
--- a/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
+++ b/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
@@ -597,12 +597,12 @@ public final class GraphHelper {
     }
 
     public AtlasEdge getEdgeForGUID(String guid) throws AtlasBaseException {
-        AtlasEdge ret = null;
+        AtlasEdge ret;
 
         try {
             ret = findEdge(Constants.GUID_PROPERTY_KEY, guid);
         } catch (EntityNotFoundException e) {
-            new AtlasBaseException(AtlasErrorCode.RELATIONSHIP_GUID_NOT_FOUND, guid);
+            throw new AtlasBaseException(AtlasErrorCode.RELATIONSHIP_GUID_NOT_FOUND, guid);
         }
 
         return ret;

http://git-wip-us.apache.org/repos/asf/atlas/blob/024fd221/typesystem/src/test/resources/atlas-application.properties
----------------------------------------------------------------------
diff --git a/typesystem/src/test/resources/atlas-application.properties b/typesystem/src/test/resources/atlas-application.properties
index 7967b76..65dd9a3 100644
--- a/typesystem/src/test/resources/atlas-application.properties
+++ b/typesystem/src/test/resources/atlas-application.properties
@@ -139,3 +139,7 @@ atlas.authentication.method.file=true
 atlas.authentication.method.ldap.type=none
 # atlas.authentication.method.file.filename=users-credentials.properties
 atlas.authentication.method.kerberos=false
+
+#########  Gremlin Search Configuration  #########
+# Set to false to disable gremlin search.
+atlas.search.gremlin.enable=true
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/atlas/blob/024fd221/webapp/src/test/java/org/apache/atlas/notification/NotificationHookConsumerIT.java
----------------------------------------------------------------------
diff --git a/webapp/src/test/java/org/apache/atlas/notification/NotificationHookConsumerIT.java b/webapp/src/test/java/org/apache/atlas/notification/NotificationHookConsumerIT.java
index 9c5597e..d41db3e 100644
--- a/webapp/src/test/java/org/apache/atlas/notification/NotificationHookConsumerIT.java
+++ b/webapp/src/test/java/org/apache/atlas/notification/NotificationHookConsumerIT.java
@@ -21,6 +21,11 @@ package org.apache.atlas.notification;
 import org.apache.atlas.EntityAuditEvent;
 import org.apache.atlas.kafka.NotificationProvider;
 import org.apache.atlas.notification.hook.HookNotification;
+import org.apache.atlas.notification.hook.HookNotification.HookNotificationMessage;
+import org.apache.atlas.notification.hook.HookNotification.EntityDeleteRequest;
+import org.apache.atlas.notification.hook.HookNotification.EntityPartialUpdateRequest;
+import org.apache.atlas.notification.hook.HookNotification.EntityCreateRequest;
+import org.apache.atlas.notification.hook.HookNotification.EntityUpdateRequest;
 import org.apache.atlas.typesystem.Referenceable;
 import org.apache.atlas.typesystem.persistence.Id;
 import org.apache.atlas.web.integration.BaseResourceIT;
@@ -31,6 +36,7 @@ import org.testng.annotations.Test;
 
 import java.util.List;
 
+import static java.lang.Thread.sleep;
 import static org.testng.Assert.assertEquals;
 
 public class NotificationHookConsumerIT extends BaseResourceIT {
@@ -54,8 +60,9 @@ public class NotificationHookConsumerIT extends BaseResourceIT {
         notificationInterface.close();
     }
 
-    private void sendHookMessage(HookNotification.HookNotificationMessage message) throws NotificationException {
+    private void sendHookMessage(HookNotificationMessage message) throws NotificationException, InterruptedException {
         notificationInterface.send(NotificationInterface.NotificationType.HOOK, message);
+        sleep(1000);
     }
 
     @Test
@@ -71,8 +78,7 @@ public class NotificationHookConsumerIT extends BaseResourceIT {
         entity.set(DESCRIPTION, randomString());
         entity.set(QUALIFIED_NAME, dbName);
         entity.set(CLUSTER_NAME, randomString());
-        sendHookMessage(new HookNotification.EntityCreateRequest(TEST_USER, entity));
-
+        sendHookMessage(new EntityCreateRequest(TEST_USER, entity));
         waitFor(MAX_WAIT_TIME, new Predicate() {
             @Override
             public boolean evaluate() throws Exception {
@@ -91,8 +97,7 @@ public class NotificationHookConsumerIT extends BaseResourceIT {
         entity.set(QUALIFIED_NAME, dbName);
         entity.set(CLUSTER_NAME, randomString());
 
-        sendHookMessage(new HookNotification.EntityCreateRequest(TEST_USER, entity));
-
+        sendHookMessage(new EntityCreateRequest(TEST_USER, entity));
         waitFor(MAX_WAIT_TIME, new Predicate() {
             @Override
             public boolean evaluate() throws Exception {
@@ -103,8 +108,7 @@ public class NotificationHookConsumerIT extends BaseResourceIT {
 
         //Assert that user passed in hook message is used in audit
         Referenceable instance = atlasClientV1.getEntity(DATABASE_TYPE_BUILTIN, QUALIFIED_NAME, (String) entity.get(QUALIFIED_NAME));
-        List<EntityAuditEvent> events =
-                atlasClientV1.getEntityAuditEvents(instance.getId()._getId(), (short) 1);
+        List<EntityAuditEvent> events = atlasClientV1.getEntityAuditEvents(instance.getId()._getId(), (short) 1);
         assertEquals(events.size(), 1);
         assertEquals(events.get(0).getUser(), TEST_USER);
     }
@@ -122,8 +126,7 @@ public class NotificationHookConsumerIT extends BaseResourceIT {
 
         final Referenceable newEntity = new Referenceable(DATABASE_TYPE_BUILTIN);
         newEntity.set("owner", randomString());
-        sendHookMessage(
-                new HookNotification.EntityPartialUpdateRequest(TEST_USER, DATABASE_TYPE_BUILTIN, QUALIFIED_NAME, dbName, newEntity));
+        sendHookMessage(new EntityPartialUpdateRequest(TEST_USER, DATABASE_TYPE_BUILTIN, QUALIFIED_NAME, dbName, newEntity));
         waitFor(MAX_WAIT_TIME, new Predicate() {
             @Override
             public boolean evaluate() throws Exception {
@@ -152,8 +155,7 @@ public class NotificationHookConsumerIT extends BaseResourceIT {
         final String newName = "db" + randomString();
         newEntity.set(QUALIFIED_NAME, newName);
 
-        sendHookMessage(
-                new HookNotification.EntityPartialUpdateRequest(TEST_USER, DATABASE_TYPE_BUILTIN, QUALIFIED_NAME, dbName, newEntity));
+        sendHookMessage(new EntityPartialUpdateRequest(TEST_USER, DATABASE_TYPE_BUILTIN, QUALIFIED_NAME, dbName, newEntity));
         waitFor(MAX_WAIT_TIME, new Predicate() {
             @Override
             public boolean evaluate() throws Exception {
@@ -179,8 +181,7 @@ public class NotificationHookConsumerIT extends BaseResourceIT {
 
         final String dbId = atlasClientV1.createEntity(entity).get(0);
 
-        sendHookMessage(
-            new HookNotification.EntityDeleteRequest(TEST_USER, DATABASE_TYPE_BUILTIN, QUALIFIED_NAME, dbName));
+        sendHookMessage(new EntityDeleteRequest(TEST_USER, DATABASE_TYPE_BUILTIN, QUALIFIED_NAME, dbName));
         waitFor(MAX_WAIT_TIME, new Predicate() {
             @Override
             public boolean evaluate() throws Exception {
@@ -209,7 +210,7 @@ public class NotificationHookConsumerIT extends BaseResourceIT {
         newEntity.set(CLUSTER_NAME, randomString());
 
         //updating unique attribute
-        sendHookMessage(new HookNotification.EntityUpdateRequest(TEST_USER, newEntity));
+        sendHookMessage(new EntityUpdateRequest(TEST_USER, newEntity));
         waitFor(MAX_WAIT_TIME, new Predicate() {
             @Override
             public boolean evaluate() throws Exception {

http://git-wip-us.apache.org/repos/asf/atlas/blob/024fd221/webapp/src/test/java/org/apache/atlas/web/integration/EntityJerseyResourceIT.java
----------------------------------------------------------------------
diff --git a/webapp/src/test/java/org/apache/atlas/web/integration/EntityJerseyResourceIT.java b/webapp/src/test/java/org/apache/atlas/web/integration/EntityJerseyResourceIT.java
index 660f05e..ba5465d 100755
--- a/webapp/src/test/java/org/apache/atlas/web/integration/EntityJerseyResourceIT.java
+++ b/webapp/src/test/java/org/apache/atlas/web/integration/EntityJerseyResourceIT.java
@@ -842,7 +842,7 @@ public class EntityJerseyResourceIT extends BaseResourceIT {
 
 
     @Test
-    public void testPartialUpdate() throws Exception {
+    public void testPartialUpdateByGuid() throws Exception {
         String dbName = "db" + randomString();
         String tableName = "table" + randomString();
         Referenceable hiveDBInstance = createHiveDBInstanceBuiltIn(dbName);
@@ -878,30 +878,63 @@ public class EntityJerseyResourceIT extends BaseResourceIT {
 
         LOG.debug("Updating entity= {}", tableUpdated);
         EntityResult entityResult = atlasClientV1.updateEntity(guid, tableUpdated);
-        assertEquals(entityResult.getUpdateEntities().size(), 1);
-        assertEquals(entityResult.getUpdateEntities().get(0), guid);
+        assertEquals(entityResult.getUpdateEntities().size(), 2);
+        assertEquals(entityResult.getUpdateEntities().get(1), guid);
 
         Referenceable entity = atlasClientV1.getEntity(guid);
         List<Referenceable> refs = (List<Referenceable>) entity.get("columns");
 
         Assert.assertTrue(refs.get(0).equalsContents(columns.get(0)));
+    }
+
+    @Test
+    public void testPartialUpdateByUniqueAttributes() throws Exception {
+        String dbName = "db" + randomString();
+        String tableName = "table" + randomString();
+        Referenceable hiveDBInstance = createHiveDBInstanceBuiltIn(dbName);
+        Id dbId = createInstance(hiveDBInstance);
+        Referenceable hiveTableInstance = createHiveTableInstanceBuiltIn(dbName, tableName, dbId);
+        Id tableId = createInstance(hiveTableInstance);
+
+        final String guid = tableId._getId();
+        try {
+            Assert.assertNotNull(UUID.fromString(guid));
+        } catch (IllegalArgumentException e) {
+            Assert.fail("Response is not a guid, " + guid);
+        }
+
+        String colName = "col1"+randomString();
+        final List<Referenceable> columns = new ArrayList<>();
+        Map<String, Object> values = new HashMap<>();
+        values.put(NAME, colName);
+        values.put("comment", "col1 comment");
+        values.put(QUALIFIED_NAME, "default.table.col1@"+colName);
+        values.put("comment", "col1 comment");
+        values.put("type", "string");
+        values.put("owner", "user1");
+        values.put("position", 0);
+        values.put("description", "col1");
+        values.put("table", tableId); //table is a required reference, can't be null
+
+        Referenceable ref = new Referenceable(BaseResourceIT.COLUMN_TYPE_BUILTIN, values);
+        columns.add(ref);
 
         //Update by unique attribute
         values.put("type", "int");
         ref = new Referenceable(BaseResourceIT.COLUMN_TYPE_BUILTIN, values);
         columns.set(0, ref);
-        tableUpdated = new Referenceable(BaseResourceIT.HIVE_TABLE_TYPE_BUILTIN, new HashMap<String, Object>() {{
+        Referenceable tableUpdated = new Referenceable(BaseResourceIT.HIVE_TABLE_TYPE_BUILTIN, new HashMap<String, Object>() {{
             put("columns", columns);
         }});
 
         LOG.debug("Updating entity= {}", tableUpdated);
-        entityResult = atlasClientV1.updateEntity(BaseResourceIT.HIVE_TABLE_TYPE_BUILTIN, AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME,
+        EntityResult entityResult = atlasClientV1.updateEntity(BaseResourceIT.HIVE_TABLE_TYPE_BUILTIN, AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME,
                 (String) hiveTableInstance.get(QUALIFIED_NAME), tableUpdated);
         assertEquals(entityResult.getUpdateEntities().size(), 2);
         assertEquals(entityResult.getUpdateEntities().get(1), guid);
 
-        entity = atlasClientV1.getEntity(guid);
-        refs = (List<Referenceable>) entity.get("columns");
+        Referenceable entity = atlasClientV1.getEntity(guid);
+        List<Referenceable> refs = (List<Referenceable>) entity.get("columns");
 
         Assert.assertTrue(refs.get(0).getValuesMap().equals(values));
         Assert.assertEquals(refs.get(0).get("type"), "int");