You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by am...@apache.org on 2018/10/08 21:16:46 UTC

atlas git commit: ATLAS-2797: Atlas Cluster.

Repository: atlas
Updated Branches:
  refs/heads/master 6d0c5c8c7 -> 871f02bb3


ATLAS-2797: Atlas Cluster.


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

Branch: refs/heads/master
Commit: 871f02bb3f1d5e74788066fc0bb6644eff2ef0c2
Parents: 6d0c5c8
Author: Ashutosh Mestry <am...@hortonworks.com>
Authored: Wed Aug 1 22:02:48 2018 -0700
Committer: Ashutosh Mestry <am...@hortonworks.com>
Committed: Mon Oct 8 14:16:23 2018 -0700

----------------------------------------------------------------------
 addons/models/0000-Area0/0010-base_model.json   |  40 +++++++
 .../atlas/model/clusterinfo/AtlasCluster.java   | 115 ++++++++++++++++++
 .../repository/clusterinfo/ClusterService.java  |  54 +++++++++
 .../ogm/AbstractDataTransferObject.java         |  11 +-
 .../atlas/repository/ogm/AtlasClusterDTO.java   |  81 +++++++++++++
 .../test/java/org/apache/atlas/TestModules.java |   2 +
 .../clusterinfo/ClusterServiceTest.java         | 117 +++++++++++++++++++
 .../impexp/ZipFileResourceTestUtils.java        |  87 +++++++++++++-
 8 files changed, 500 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/871f02bb/addons/models/0000-Area0/0010-base_model.json
----------------------------------------------------------------------
diff --git a/addons/models/0000-Area0/0010-base_model.json b/addons/models/0000-Area0/0010-base_model.json
index fe1eb65..88ef0b2 100644
--- a/addons/models/0000-Area0/0010-base_model.json
+++ b/addons/models/0000-Area0/0010-base_model.json
@@ -100,6 +100,46 @@
             ]
         },
         {
+          "name": "AtlasCluster",
+          "typeVersion": "1.0",
+          "superTypes": [
+          ],
+          "attributeDefs": [
+            {
+              "name": "displayName",
+              "typeName": "string",
+              "cardinality": "SINGLE",
+              "isIndexable": true,
+              "isOptional": false,
+              "isUnique": false
+            },
+            {
+              "name": "qualifiedName",
+              "typeName": "string",
+              "cardinality": "SINGLE",
+              "isIndexable": true,
+              "isOptional": false,
+              "isUnique": true
+            },
+            {
+              "name": "urls",
+              "typeName": "array<string>",
+              "cardinality": "SINGLE",
+              "isIndexable": false,
+              "isOptional": true,
+              "isUnique": false
+            },
+            {
+              "name": "additionalInfo",
+              "typeName": "map<string,string>",
+              "cardinality": "SINGLE",
+              "isIndexable": false,
+              "isOptional": true,
+              "isUnique": false
+            }
+          ]
+        },
+        {
             "name": "__AtlasUserProfile",
             "superTypes": [
                 "__internal"

http://git-wip-us.apache.org/repos/asf/atlas/blob/871f02bb/intg/src/main/java/org/apache/atlas/model/clusterinfo/AtlasCluster.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/model/clusterinfo/AtlasCluster.java b/intg/src/main/java/org/apache/atlas/model/clusterinfo/AtlasCluster.java
new file mode 100644
index 0000000..efea55a
--- /dev/null
+++ b/intg/src/main/java/org/apache/atlas/model/clusterinfo/AtlasCluster.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.model.clusterinfo;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import org.apache.atlas.model.AtlasBaseModelObject;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ONLY;
+
+@JsonAutoDetect(getterVisibility = PUBLIC_ONLY, setterVisibility = PUBLIC_ONLY, fieldVisibility = NONE)
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AtlasCluster extends AtlasBaseModelObject implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    public static final String SYNC_INFO_KEY            = "syncInfo";
+    public static final String OPERATION                = "operation";
+    public static final String NEXT_MODIFIED_TIMESTAMP  = "nextModifiedTimestamp";
+
+    private String name;
+    private String qualifiedName;
+    private Map<String, String> additionalInfo;
+    private List<String> urls;
+
+    public AtlasCluster() {
+        urls = new ArrayList<>();
+    }
+
+    public AtlasCluster(String name, String qualifiedName) {
+        this.name = name;
+        this.qualifiedName = qualifiedName;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public void setAdditionalInfo(Map<String, String> additionalInfo) {
+        if(this.additionalInfo == null) {
+            this.additionalInfo = new HashMap<>();
+        }
+
+        this.additionalInfo = additionalInfo;
+    }
+
+    public void setAdditionalInfo(String key, String value) {
+        if(this.additionalInfo == null) {
+            this.additionalInfo = new HashMap<>();
+        }
+
+        additionalInfo.put(key, value);
+    }
+
+    public Map<String, String> getAdditionalInfo() {
+        return this.additionalInfo;
+    }
+
+    public String getAdditionalInfo(String key) {
+        return additionalInfo.get(key);
+    }
+
+    public String getQualifiedName() {
+        return qualifiedName;
+    }
+
+    public void setQualifiedName(String qualifiedName) {
+        this.qualifiedName = qualifiedName;
+    }
+
+    public void setUrls(List<String> urls) {
+        this.urls = urls;
+    }
+
+    public List<String> getUrls() {
+        return this.urls;
+    }
+
+    @Override
+    public StringBuilder toString(StringBuilder sb) {
+        sb.append(", name=").append(name);
+        sb.append(", qualifiedName=").append(getQualifiedName());
+        sb.append(", urls=").append(urls);
+        sb.append(", additionalInfo=").append(additionalInfo);
+        sb.append("}");
+        return sb;
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/871f02bb/repository/src/main/java/org/apache/atlas/repository/clusterinfo/ClusterService.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/clusterinfo/ClusterService.java b/repository/src/main/java/org/apache/atlas/repository/clusterinfo/ClusterService.java
new file mode 100644
index 0000000..0e23374
--- /dev/null
+++ b/repository/src/main/java/org/apache/atlas/repository/clusterinfo/ClusterService.java
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.atlas.repository.clusterinfo;
+
+import org.apache.atlas.annotation.AtlasService;
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.clusterinfo.AtlasCluster;
+import org.apache.atlas.repository.ogm.DataAccess;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.inject.Inject;
+
+@AtlasService
+public class ClusterService {
+    private static final Logger LOG = LoggerFactory.getLogger(ClusterService.class);
+
+    private final DataAccess dataAccess;
+
+    @Inject
+    public ClusterService(DataAccess dataAccess) {
+        this.dataAccess = dataAccess;
+    }
+
+    public AtlasCluster get(AtlasCluster cluster) {
+        try {
+            return dataAccess.load(cluster);
+        } catch (AtlasBaseException e) {
+            LOG.error("dataAccess", e);
+        }
+
+        return null;
+    }
+
+    public AtlasCluster save(AtlasCluster clusterInfo) throws AtlasBaseException {
+        return dataAccess.save(clusterInfo);
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/871f02bb/repository/src/main/java/org/apache/atlas/repository/ogm/AbstractDataTransferObject.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/ogm/AbstractDataTransferObject.java b/repository/src/main/java/org/apache/atlas/repository/ogm/AbstractDataTransferObject.java
index d4f7867..1a0c0f7 100644
--- a/repository/src/main/java/org/apache/atlas/repository/ogm/AbstractDataTransferObject.java
+++ b/repository/src/main/java/org/apache/atlas/repository/ogm/AbstractDataTransferObject.java
@@ -17,7 +17,6 @@
  */
 package org.apache.atlas.repository.ogm;
 
-import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.AtlasBaseModelObject;
 import org.apache.atlas.model.instance.AtlasEntity;
 import org.apache.atlas.repository.Constants;
@@ -31,16 +30,16 @@ public abstract class AbstractDataTransferObject<T extends AtlasBaseModelObject>
     private final Class<T>          objectType;
     private final String            entityTypeName;
 
-    protected AbstractDataTransferObject(AtlasTypeRegistry typeRegistry, Class<T> tClass) {
-        this(typeRegistry, tClass, tClass.getSimpleName());
-    }
-
     protected AbstractDataTransferObject(AtlasTypeRegistry typeRegistry, Class<T> tClass, String entityTypeName) {
         this.typeRegistry   = typeRegistry;
         this.objectType     = tClass;
         this.entityTypeName = entityTypeName;
     }
 
+    protected AbstractDataTransferObject(AtlasTypeRegistry typeRegistry, Class<T> tClass) {
+        this(typeRegistry, tClass, Constants.INTERNAL_PROPERTY_KEY_PREFIX + tClass.getSimpleName());
+    }
+
     @Override
     public Class getObjectType() {
         return objectType;
@@ -54,7 +53,7 @@ public abstract class AbstractDataTransferObject<T extends AtlasBaseModelObject>
     }
 
 
-    protected AtlasEntity getDefaultAtlasEntity(T obj) throws AtlasBaseException {
+    protected AtlasEntity getDefaultAtlasEntity(T obj) {
         AtlasEntity ret = getEntityType().createDefaultValue();
 
         if (obj != null) {

http://git-wip-us.apache.org/repos/asf/atlas/blob/871f02bb/repository/src/main/java/org/apache/atlas/repository/ogm/AtlasClusterDTO.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/ogm/AtlasClusterDTO.java b/repository/src/main/java/org/apache/atlas/repository/ogm/AtlasClusterDTO.java
new file mode 100644
index 0000000..8a89884
--- /dev/null
+++ b/repository/src/main/java/org/apache/atlas/repository/ogm/AtlasClusterDTO.java
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.atlas.repository.ogm;
+
+import org.apache.atlas.model.clusterinfo.AtlasCluster;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.type.AtlasTypeRegistry;
+import org.springframework.stereotype.Component;
+
+import javax.inject.Inject;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class AtlasClusterDTO extends AbstractDataTransferObject<AtlasCluster> {
+    private final String PROPERTY_CLUSTER_NAME = "displayName";
+    private final String PROPERTY_QUALIFIED_NAME = "qualifiedName";
+    private final String PROPERTY_ADDITIONAL_INFO = "additionalInfo";
+    private final String PROPERTY_URLS = "urls";
+
+    @Inject
+    public AtlasClusterDTO(AtlasTypeRegistry typeRegistry) {
+        super(typeRegistry, AtlasCluster.class, AtlasCluster.class.getSimpleName());
+    }
+
+    public AtlasCluster from(AtlasEntity entity) {
+        AtlasCluster cluster = new AtlasCluster();
+
+        setGuid(cluster, entity);
+        cluster.setName((String) entity.getAttribute(PROPERTY_CLUSTER_NAME));
+        cluster.setQualifiedName((String) entity.getAttribute(PROPERTY_QUALIFIED_NAME));
+        cluster.setAdditionalInfo((Map<String,String>) entity.getAttribute(PROPERTY_ADDITIONAL_INFO));
+        cluster.setUrls((List<String>) entity.getAttribute(PROPERTY_URLS));
+
+        return cluster;
+    }
+
+    public AtlasCluster from(AtlasEntity.AtlasEntityWithExtInfo entityWithExtInfo) {
+        return from(entityWithExtInfo.getEntity());
+    }
+
+    @Override
+    public AtlasEntity toEntity(AtlasCluster obj) {
+        AtlasEntity entity = getDefaultAtlasEntity(obj);
+
+        entity.setAttribute(PROPERTY_CLUSTER_NAME, obj.getName());
+        entity.setAttribute(PROPERTY_QUALIFIED_NAME, obj.getQualifiedName());
+        entity.setAttribute(PROPERTY_ADDITIONAL_INFO, obj.getAdditionalInfo());
+
+        return entity;
+    }
+
+    @Override
+    public AtlasEntity.AtlasEntityWithExtInfo toEntityWithExtInfo(AtlasCluster obj) {
+        return new AtlasEntity.AtlasEntityWithExtInfo(toEntity(obj));
+    }
+
+    @Override
+    public Map<String, Object> getUniqueAttributes(final AtlasCluster obj) {
+        return new HashMap<String, Object>() {{
+            put(PROPERTY_QUALIFIED_NAME, obj.getQualifiedName());
+        }};
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/871f02bb/repository/src/test/java/org/apache/atlas/TestModules.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/TestModules.java b/repository/src/test/java/org/apache/atlas/TestModules.java
index 6d4679d..b5e0871 100644
--- a/repository/src/test/java/org/apache/atlas/TestModules.java
+++ b/repository/src/test/java/org/apache/atlas/TestModules.java
@@ -41,6 +41,7 @@ import org.apache.atlas.repository.graphdb.AtlasGraph;
 import org.apache.atlas.repository.graphdb.GraphDBMigrator;
 import org.apache.atlas.repository.graphdb.janus.migration.GraphDBGraphSONMigrator;
 import org.apache.atlas.repository.impexp.ExportService;
+import org.apache.atlas.repository.ogm.AtlasClusterDTO;
 import org.apache.atlas.repository.ogm.profiles.AtlasSavedSearchDTO;
 import org.apache.atlas.repository.ogm.profiles.AtlasUserProfileDTO;
 import org.apache.atlas.repository.ogm.DTORegistry;
@@ -170,6 +171,7 @@ public class TestModules {
             availableDTOs.addBinding().to(AtlasGlossaryDTO.class);
             availableDTOs.addBinding().to(AtlasGlossaryTermDTO.class);
             availableDTOs.addBinding().to(AtlasGlossaryCategoryDTO.class);
+            availableDTOs.addBinding().to(AtlasClusterDTO.class);
 
             bind(DTORegistry.class).asEagerSingleton();
             bind(DataAccess.class).asEagerSingleton();

http://git-wip-us.apache.org/repos/asf/atlas/blob/871f02bb/repository/src/test/java/org/apache/atlas/repository/clusterinfo/ClusterServiceTest.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/repository/clusterinfo/ClusterServiceTest.java b/repository/src/test/java/org/apache/atlas/repository/clusterinfo/ClusterServiceTest.java
new file mode 100644
index 0000000..f577a32
--- /dev/null
+++ b/repository/src/test/java/org/apache/atlas/repository/clusterinfo/ClusterServiceTest.java
@@ -0,0 +1,117 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.atlas.repository.clusterinfo;
+
+import org.apache.atlas.TestModules;
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.clusterinfo.AtlasCluster;
+import org.apache.atlas.repository.store.graph.AtlasEntityStore;
+import org.apache.atlas.store.AtlasTypeDefStore;
+import org.apache.atlas.type.AtlasType;
+import org.apache.atlas.type.AtlasTypeRegistry;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.atlas.repository.impexp.ZipFileResourceTestUtils.loadBaseModel;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+@Guice(modules = TestModules.TestOnlyModule.class)
+public class ClusterServiceTest {
+    private final String TOP_LEVEL_ENTITY_NAME = "db1@cl1";
+    private final String CLUSTER_NAME          = "testCl1";
+    private final String TARGET_CLUSTER_NAME   = "testCl2";
+
+    @Inject
+    private AtlasTypeDefStore typeDefStore;
+
+    @Inject
+    private AtlasTypeRegistry typeRegistry;
+
+    @Inject
+    private ClusterService clusterService;
+
+    @BeforeClass
+    public void setup() throws IOException, AtlasBaseException {
+        loadBaseModel(typeDefStore, typeRegistry);
+    }
+
+    @Test
+    public void saveAndRetrieveClusterInfo() throws AtlasBaseException {
+        AtlasCluster expected = getCluster(CLUSTER_NAME, TOP_LEVEL_ENTITY_NAME, "EXPORT", 0l, TARGET_CLUSTER_NAME);
+        AtlasCluster expected2 = getCluster(TARGET_CLUSTER_NAME, TOP_LEVEL_ENTITY_NAME, "IMPORT", 0L, TARGET_CLUSTER_NAME);
+        AtlasCluster expected3 = getCluster(TARGET_CLUSTER_NAME + "_3", TOP_LEVEL_ENTITY_NAME, "IMPORT", 0, TARGET_CLUSTER_NAME);
+
+        AtlasCluster actual = clusterService.save(expected);
+        AtlasCluster actual2 = clusterService.save(expected2);
+        AtlasCluster actual3 = clusterService.save(expected3);
+        AtlasCluster actual2x = clusterService.get(expected2);
+
+        assertNotNull(actual.getGuid());
+        assertNotNull(actual2.getGuid());
+        assertNotEquals(actual.getGuid(), actual2.getGuid());
+        assertNotEquals(actual2.getGuid(), actual3.getGuid());
+
+        assertEquals(actual2.getGuid(), actual2x.getGuid());
+
+
+        assertEquals(actual.getName(), expected.getName());
+        assertEquals(actual.getQualifiedName(), expected.getQualifiedName());
+        assertEquals(getAdditionalInfo(actual, TOP_LEVEL_ENTITY_NAME).get(AtlasCluster.OPERATION),
+                    getAdditionalInfo(expected, TOP_LEVEL_ENTITY_NAME).get(AtlasCluster.OPERATION));
+
+        assertEquals(getAdditionalInfo(actual, TOP_LEVEL_ENTITY_NAME).get(AtlasCluster.NEXT_MODIFIED_TIMESTAMP),
+                    getAdditionalInfo(expected, TOP_LEVEL_ENTITY_NAME).get(AtlasCluster.NEXT_MODIFIED_TIMESTAMP));
+    }
+
+    private AtlasCluster getCluster(String name, String topLevelEntity, String operation, long nextModifiedTimestamp, String targetClusterName) {
+        AtlasCluster cluster = new AtlasCluster(name, name);
+
+        Map<String, Object> syncMap = new HashMap<>();
+        syncMap.put("operation", operation);
+        syncMap.put("nextModifiedTimestamp", nextModifiedTimestamp);
+        syncMap.put("targetCluster", targetClusterName);
+
+        String syncMapJson = AtlasType.toJson(syncMap);
+        String topLevelEntitySpecificKey = getTopLevelEntitySpecificKey(topLevelEntity);
+        cluster.setAdditionalInfo(topLevelEntitySpecificKey, syncMapJson);
+        return cluster;
+    }
+
+    private Map<String, Object> getAdditionalInfo(AtlasCluster cluster, String topLevelEntityName) {
+        String topLevelEntitySpecificKey = getTopLevelEntitySpecificKey(topLevelEntityName);
+        assertTrue(cluster.getAdditionalInfo().containsKey(topLevelEntitySpecificKey));
+
+        String json = cluster.getAdditionalInfo(topLevelEntitySpecificKey);
+        return AtlasType.fromJson(json, Map.class);
+    }
+
+    private String getTopLevelEntitySpecificKey(String topLevelEntity) {
+        return String.format("%s:%s", AtlasCluster.SYNC_INFO_KEY, topLevelEntity);
+    }
+}

http://git-wip-us.apache.org/repos/asf/atlas/blob/871f02bb/repository/src/test/java/org/apache/atlas/repository/impexp/ZipFileResourceTestUtils.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ZipFileResourceTestUtils.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ZipFileResourceTestUtils.java
index 7aa3868..268adc5 100644
--- a/repository/src/test/java/org/apache/atlas/repository/impexp/ZipFileResourceTestUtils.java
+++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ZipFileResourceTestUtils.java
@@ -21,11 +21,16 @@ import com.google.common.collect.Sets;
 import org.apache.atlas.RequestContext;
 import org.apache.atlas.TestUtilsV2;
 import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.impexp.AtlasExportRequest;
 import org.apache.atlas.model.impexp.AtlasExportResult;
 import org.apache.atlas.model.impexp.AtlasImportRequest;
 import org.apache.atlas.model.impexp.AtlasImportResult;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.EntityMutationResponse;
 import org.apache.atlas.model.typedef.AtlasTypesDef;
 import org.apache.atlas.repository.store.bootstrap.AtlasTypeDefStoreInitializer;
+import org.apache.atlas.repository.store.graph.v2.AtlasEntityStoreV2;
+import org.apache.atlas.repository.store.graph.v2.AtlasEntityStreamForImport;
 import org.apache.atlas.store.AtlasTypeDefStore;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
@@ -35,7 +40,10 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testng.SkipException;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -141,11 +149,20 @@ public class ZipFileResourceTestUtils {
     }
 
     public static Object[][] getZipSource(String fileName) throws IOException {
+        return new Object[][]{{getZipSourceFrom(fileName)}};
+    }
+
+    public static ZipSource getZipSourceFrom(String fileName) throws IOException {
         FileInputStream fs = ZipFileResourceTestUtils.getFileInputStream(fileName);
 
-        return new Object[][]{{new ZipSource(fs)}};
+        return new ZipSource(fs);
     }
 
+    private static ZipSource getZipSourceFrom(ByteArrayOutputStream baos) throws IOException {
+        ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray());
+        ZipSource zipSource = new ZipSource(bis);
+        return zipSource;
+    }
 
     public static void verifyImportedEntities(List<String> creationOrder, List<String> processedEntities) {
         Set<String> lhs = com.google.common.collect.Sets.newHashSet(creationOrder);
@@ -169,6 +186,62 @@ public class ZipFileResourceTestUtils {
         }
     }
 
+    public static AtlasTypesDef loadTypes(String entitiesSubDir, String fileName) {
+        try {
+            return TestResourceFileUtils.readObjectFromJson(entitiesSubDir, fileName, AtlasTypesDef.class);
+        } catch (IOException e) {
+            throw new SkipException(String.format("createTypes: '%s' could not be laoded.", fileName));
+        }
+    }
+
+
+    public static AtlasEntity.AtlasEntityWithExtInfo loadEntity(String entitiesSubDir, String fileName) {
+        try {
+            return TestResourceFileUtils.readObjectFromJson(entitiesSubDir, fileName, AtlasEntity.AtlasEntityWithExtInfo.class);
+        } catch (IOException e) {
+            throw new SkipException(String.format("createTypes: '%s' could not be laoded.", fileName));
+        }
+    }
+
+    public static void createTypes(AtlasTypeDefStore typeDefStore, String entitiesSubDir, String typesDef) {
+        try {
+            typeDefStore.createTypesDef(loadTypes(entitiesSubDir, typesDef));
+        } catch (AtlasBaseException e) {
+            throw new SkipException("setup: could not load typesDef.");
+        }
+    }
+
+    public static void createAtlasEntity(AtlasEntityStoreV2 entityStoreV1, AtlasEntity.AtlasEntityWithExtInfo atlasEntity) {
+        try {
+            EntityMutationResponse response = entityStoreV1.createOrUpdateForImport(new AtlasEntityStreamForImport(atlasEntity, null));
+            assertNotNull(response);
+            assertTrue((response.getCreatedEntities() != null && response.getCreatedEntities().size() > 0) ||
+                    (response.getMutatedEntities() != null && response.getMutatedEntities().size() > 0));
+        } catch (AtlasBaseException e) {
+            throw new SkipException(String.format("createAtlasEntity: could not load '%s'.", atlasEntity.getEntity().getTypeName()));
+        }
+    }
+
+    public static ZipSource runExportWithParameters(ExportService exportService, AtlasExportRequest request) {
+        final String requestingIP = "1.0.0.0";
+        final String hostName = "localhost";
+        final String userName = "admin";
+
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            ZipSink zipSink = new ZipSink(baos);
+
+            AtlasExportResult result = exportService.run(zipSink, request, userName, hostName, requestingIP);
+            assertEquals(result.getOperationStatus(), AtlasExportResult.OperationStatus.SUCCESS);
+
+            zipSink.close();
+            return getZipSourceFrom(baos);
+        }
+        catch(Exception ex) {
+            throw new SkipException(String.format("runExportWithParameters: %s: failed!", request.toString()));
+        }
+    }
+
     private static Map<String,Integer> getImportMetricsForCompare(AtlasImportResult result) {
         Map<String, Integer> r = new HashMap<>();
         for (Map.Entry<String, Integer> entry : result.getMetrics().entrySet()) {
@@ -257,4 +330,16 @@ public class ZipFileResourceTestUtils {
         verifyImportedMetrics(exportResult, result);
         verifyImportedEntities(creationOrder, result.getProcessedEntities());
     }
+
+    public static void loadBaseModel(AtlasTypeDefStore typeDefStore, AtlasTypeRegistry typeRegistry) throws IOException, AtlasBaseException {
+        loadModelFromJson("0000-Area0/0010-base_model.json", typeDefStore, typeRegistry);
+    }
+
+    public static void loadFsModel(AtlasTypeDefStore typeDefStore, AtlasTypeRegistry typeRegistry) throws IOException, AtlasBaseException {
+        loadModelFromJson("1000-Hadoop/0020-fs_model.json", typeDefStore, typeRegistry);
+    }
+
+    public static void loadHiveModel(AtlasTypeDefStore typeDefStore, AtlasTypeRegistry typeRegistry) throws IOException, AtlasBaseException {
+        loadModelFromJson("1000-Hadoop/0030-hive_model.json", typeDefStore, typeRegistry);
+    }
 }