Commit b28ab21e by Shwetha GS

ATLAS-1010 Atlas allows recreation of tags with same name (shwethags)

parent 8f229628
...@@ -1426,7 +1426,7 @@ public class HiveHookIT { ...@@ -1426,7 +1426,7 @@ public class HiveHookIT {
assertColumnIsRegistered(HiveMetaStoreBridge.getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, tableName), NAME)); assertColumnIsRegistered(HiveMetaStoreBridge.getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, tableName), NAME));
final String query = String.format("drop table %s ", tableName); final String query = String.format("drop table %s ", tableName);
runCommand(query); runCommandWithDelay(query, 1000);
assertColumnIsNotRegistered(HiveMetaStoreBridge assertColumnIsNotRegistered(HiveMetaStoreBridge
.getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, tableName), .getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, tableName),
"id")); "id"));
...@@ -1537,7 +1537,7 @@ public class HiveHookIT { ...@@ -1537,7 +1537,7 @@ public class HiveHookIT {
query = String.format("drop view %s ", viewName); query = String.format("drop view %s ", viewName);
runCommand(query); runCommandWithDelay(query, 1000);
assertColumnIsNotRegistered(HiveMetaStoreBridge assertColumnIsNotRegistered(HiveMetaStoreBridge
.getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, viewName), .getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, viewName),
"id")); "id"));
......
...@@ -6,6 +6,7 @@ INCOMPATIBLE CHANGES: ...@@ -6,6 +6,7 @@ INCOMPATIBLE CHANGES:
ALL CHANGES: ALL CHANGES:
ATLAS-1010 Atlas allows recreation of tags with same name (shwethags)
ATLAS-990 Hive Import metadata script fails with auth exception (nixonrodrigues via shwethags) ATLAS-990 Hive Import metadata script fails with auth exception (nixonrodrigues via shwethags)
ATLAS-998 determine HA mode from property atlas.server.ids, instead of atlas.server.ha.enabled (madhan.neethiraj via shwethags) ATLAS-998 determine HA mode from property atlas.server.ids, instead of atlas.server.ha.enabled (madhan.neethiraj via shwethags)
ATLAS-986 Ability to differentiate business catalog terms from traits (sumasai,svimal2106 via shwethags) ATLAS-986 Ability to differentiate business catalog terms from traits (sumasai,svimal2106 via shwethags)
......
...@@ -17,11 +17,10 @@ ...@@ -17,11 +17,10 @@
*/ */
package org.apache.atlas.repository.typestore; package org.apache.atlas.repository.typestore;
import java.util.HashMap; import com.google.common.collect.ImmutableList;
import java.util.Map; import com.google.common.collect.ImmutableSet;
import com.thinkaurelius.titan.core.TitanGraph;
import javax.inject.Inject; import com.thinkaurelius.titan.core.util.TitanCleanup;
import org.apache.atlas.AtlasException; import org.apache.atlas.AtlasException;
import org.apache.atlas.RepositoryMetadataModule; import org.apache.atlas.RepositoryMetadataModule;
import org.apache.atlas.TestUtils; import org.apache.atlas.TestUtils;
...@@ -41,16 +40,16 @@ import org.testng.annotations.BeforeMethod; ...@@ -41,16 +40,16 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Guice; import org.testng.annotations.Guice;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList; import javax.inject.Inject;
import com.google.common.collect.ImmutableSet; import java.util.HashMap;
import com.thinkaurelius.titan.core.TitanGraph; import java.util.Map;
import com.thinkaurelius.titan.core.util.TitanCleanup;
/** /**
* Unit test for {@link StoreBackedTypeCache} * Unit test for {@link StoreBackedTypeCache}
*/ */
@Guice(modules = RepositoryMetadataModule.class) @Guice(modules = RepositoryMetadataModule.class)
@Test(enabled = false)
public class StoreBackedTypeCacheTest { public class StoreBackedTypeCacheTest {
@Inject @Inject
...@@ -70,6 +69,7 @@ public class StoreBackedTypeCacheTest { ...@@ -70,6 +69,7 @@ public class StoreBackedTypeCacheTest {
public void setUp() throws Exception { public void setUp() throws Exception {
ts = TypeSystem.getInstance(); ts = TypeSystem.getInstance();
ts.reset(); ts.reset();
ts.setTypeCache(typeCache);
// Populate the type store for testing. // Populate the type store for testing.
TestUtils.defineDeptEmployeeTypes(ts); TestUtils.defineDeptEmployeeTypes(ts);
...@@ -103,16 +103,15 @@ public class StoreBackedTypeCacheTest { ...@@ -103,16 +103,15 @@ public class StoreBackedTypeCacheTest {
@BeforeMethod @BeforeMethod
public void setupTestMethod() throws Exception { public void setupTestMethod() throws Exception {
typeCache.clear(); ts.reset();
} }
@Test
public void testGetClassType() throws Exception { public void testGetClassType() throws Exception {
for (Map.Entry<String, ClassType> typeEntry : classTypesToTest.entrySet()) { for (Map.Entry<String, ClassType> typeEntry : classTypesToTest.entrySet()) {
// Not cached yet // Not cached yet
Assert.assertFalse(typeCache.isCachedInMemory(typeEntry.getKey())); Assert.assertFalse(typeCache.isCachedInMemory(typeEntry.getKey()));
IDataType dataType = typeCache.get(typeEntry.getKey()); IDataType dataType = ts.getDataType(IDataType.class, typeEntry.getKey());
// Verify the type is now cached. // Verify the type is now cached.
Assert.assertTrue(typeCache.isCachedInMemory(typeEntry.getKey())); Assert.assertTrue(typeCache.isCachedInMemory(typeEntry.getKey()));
...@@ -123,7 +122,6 @@ public class StoreBackedTypeCacheTest { ...@@ -123,7 +122,6 @@ public class StoreBackedTypeCacheTest {
} }
} }
@Test
public void testHasClassType() throws Exception { public void testHasClassType() throws Exception {
for (Map.Entry<String, ClassType> typeEntry : classTypesToTest.entrySet()) { for (Map.Entry<String, ClassType> typeEntry : classTypesToTest.entrySet()) {
// Not cached yet // Not cached yet
...@@ -138,7 +136,6 @@ public class StoreBackedTypeCacheTest { ...@@ -138,7 +136,6 @@ public class StoreBackedTypeCacheTest {
} }
} }
@Test
public void testGetTraitType() throws Exception { public void testGetTraitType() throws Exception {
ImmutableList<String> traitNames = ts.getTypeNamesByCategory(TypeCategory.TRAIT); ImmutableList<String> traitNames = ts.getTypeNamesByCategory(TypeCategory.TRAIT);
for (String traitTypeName : traitNames) { for (String traitTypeName : traitNames) {
...@@ -156,7 +153,6 @@ public class StoreBackedTypeCacheTest { ...@@ -156,7 +153,6 @@ public class StoreBackedTypeCacheTest {
} }
} }
@Test
public void testHasTraitType() throws Exception { public void testHasTraitType() throws Exception {
ImmutableList<String> traitNames = ts.getTypeNamesByCategory(TypeCategory.TRAIT); ImmutableList<String> traitNames = ts.getTypeNamesByCategory(TypeCategory.TRAIT);
for (String traitTypeName : traitNames) { for (String traitTypeName : traitNames) {
......
...@@ -43,6 +43,7 @@ import com.thinkaurelius.titan.core.util.TitanCleanup; ...@@ -43,6 +43,7 @@ import com.thinkaurelius.titan.core.util.TitanCleanup;
* which has type cache implementation class set to {@link StoreBackedTypeCache}. * which has type cache implementation class set to {@link StoreBackedTypeCache}.
*/ */
@Guice(modules = StoreBackedTypeCacheTestModule.class) @Guice(modules = StoreBackedTypeCacheTestModule.class)
@Test(enabled = false)
public class StoreBackedTypeCacheMetadataServiceTest public class StoreBackedTypeCacheMetadataServiceTest
{ {
@Inject @Inject
...@@ -90,7 +91,6 @@ public class StoreBackedTypeCacheMetadataServiceTest ...@@ -90,7 +91,6 @@ public class StoreBackedTypeCacheMetadataServiceTest
} }
} }
@Test
public void testIt() throws Exception { public void testIt() throws Exception {
Assert.assertTrue(typeCache instanceof StoreBackedTypeCache); Assert.assertTrue(typeCache instanceof StoreBackedTypeCache);
StoreBackedTypeCache storeBackedCache = (StoreBackedTypeCache) typeCache; StoreBackedTypeCache storeBackedCache = (StoreBackedTypeCache) typeCache;
......
...@@ -342,7 +342,6 @@ public class TypeSystem { ...@@ -342,7 +342,6 @@ public class TypeSystem {
*/ */
public void commitTypes(Map<String, IDataType> typesAdded) throws AtlasException { public void commitTypes(Map<String, IDataType> typesAdded) throws AtlasException {
for (Map.Entry<String, IDataType> typeEntry : typesAdded.entrySet()) { for (Map.Entry<String, IDataType> typeEntry : typesAdded.entrySet()) {
String typeName = typeEntry.getKey();
IDataType type = typeEntry.getValue(); IDataType type = typeEntry.getValue();
//Add/replace the new type in the typesystem //Add/replace the new type in the typesystem
typeCache.put(type); typeCache.put(type);
...@@ -378,7 +377,6 @@ public class TypeSystem { ...@@ -378,7 +377,6 @@ public class TypeSystem {
} }
private IDataType dataType(String name) throws AtlasException { private IDataType dataType(String name) throws AtlasException {
if (transientTypes.containsKey(name)) { if (transientTypes.containsKey(name)) {
return transientTypes.get(name); return transientTypes.get(name);
} }
...@@ -394,7 +392,7 @@ public class TypeSystem { ...@@ -394,7 +392,7 @@ public class TypeSystem {
private void validateAndSetupShallowTypes(boolean update) throws AtlasException { private void validateAndSetupShallowTypes(boolean update) throws AtlasException {
for (EnumTypeDefinition eDef : enumDefs) { for (EnumTypeDefinition eDef : enumDefs) {
assert eDef.name != null; assert eDef.name != null;
if (!update && (transientTypes.containsKey(eDef.name) || isRegistered(eDef.name))) { if (!update && isRegistered(eDef.name)) {
throw new AtlasException(String.format("Redefinition of type %s not supported", eDef.name)); throw new AtlasException(String.format("Redefinition of type %s not supported", eDef.name));
} }
...@@ -404,7 +402,7 @@ public class TypeSystem { ...@@ -404,7 +402,7 @@ public class TypeSystem {
for (StructTypeDefinition sDef : structDefs) { for (StructTypeDefinition sDef : structDefs) {
assert sDef.typeName != null; assert sDef.typeName != null;
if (!update && (transientTypes.containsKey(sDef.typeName) || isRegistered(sDef.typeName))) { if (!update && isRegistered(sDef.typeName)) {
throw new TypeExistsException(String.format("Cannot redefine type %s", sDef.typeName)); throw new TypeExistsException(String.format("Cannot redefine type %s", sDef.typeName));
} }
StructType sT = new StructType(this, sDef.typeName, sDef.typeDescription, sDef.attributeDefinitions.length); StructType sT = new StructType(this, sDef.typeName, sDef.typeDescription, sDef.attributeDefinitions.length);
...@@ -414,8 +412,7 @@ public class TypeSystem { ...@@ -414,8 +412,7 @@ public class TypeSystem {
for (HierarchicalTypeDefinition<TraitType> traitDef : traitDefs) { for (HierarchicalTypeDefinition<TraitType> traitDef : traitDefs) {
assert traitDef.typeName != null; assert traitDef.typeName != null;
if (!update && if (!update && isRegistered(traitDef.typeName)) {
(transientTypes.containsKey(traitDef.typeName) || isRegistered(traitDef.typeName))) {
throw new TypeExistsException(String.format("Cannot redefine type %s", traitDef.typeName)); throw new TypeExistsException(String.format("Cannot redefine type %s", traitDef.typeName));
} }
TraitType tT = new TraitType(this, traitDef.typeName, traitDef.typeDescription, traitDef.superTypes, TraitType tT = new TraitType(this, traitDef.typeName, traitDef.typeDescription, traitDef.superTypes,
...@@ -426,8 +423,7 @@ public class TypeSystem { ...@@ -426,8 +423,7 @@ public class TypeSystem {
for (HierarchicalTypeDefinition<ClassType> classDef : classDefs) { for (HierarchicalTypeDefinition<ClassType> classDef : classDefs) {
assert classDef.typeName != null; assert classDef.typeName != null;
if (!update && if (!update && isRegistered(classDef.typeName)) {
(transientTypes.containsKey(classDef.typeName) || isRegistered(classDef.typeName))) {
throw new TypeExistsException(String.format("Cannot redefine type %s", classDef.typeName)); throw new TypeExistsException(String.format("Cannot redefine type %s", classDef.typeName));
} }
...@@ -438,6 +434,11 @@ public class TypeSystem { ...@@ -438,6 +434,11 @@ public class TypeSystem {
} }
} }
@Override
public boolean isRegistered(String typeName) throws AtlasException {
return transientTypes.containsKey(typeName) || TypeSystem.this.isRegistered(typeName);
}
private <U extends HierarchicalType> void validateSuperTypes(Class<U> cls, HierarchicalTypeDefinition<U> def) private <U extends HierarchicalType> void validateSuperTypes(Class<U> cls, HierarchicalTypeDefinition<U> def)
throws AtlasException { throws AtlasException {
for (String superTypeName : def.superTypes) { for (String superTypeName : def.superTypes) {
......
...@@ -169,7 +169,7 @@ public class EnumTest extends BaseTest { ...@@ -169,7 +169,7 @@ public class EnumTest extends BaseTest {
public void testStruct() throws AtlasException { public void testStruct() throws AtlasException {
TypeSystem ts = getTypeSystem(); TypeSystem ts = getTypeSystem();
defineEnums(ts); defineEnums(ts);
StructType structType = ts.defineStructType("t3", true, createRequiredAttrDef("a", DataTypes.INT_TYPE), StructType structType = ts.defineStructType("ts", true, createRequiredAttrDef("a", DataTypes.INT_TYPE),
createOptionalAttrDef("b", DataTypes.BOOLEAN_TYPE), createOptionalAttrDef("c", DataTypes.BYTE_TYPE), createOptionalAttrDef("b", DataTypes.BOOLEAN_TYPE), createOptionalAttrDef("c", DataTypes.BYTE_TYPE),
createOptionalAttrDef("d", DataTypes.SHORT_TYPE), createOptionalAttrDef("d", DataTypes.SHORT_TYPE),
createOptionalAttrDef("enum1", ts.getDataType(EnumType.class, "HiveObjectType")), createOptionalAttrDef("enum1", ts.getDataType(EnumType.class, "HiveObjectType")),
...@@ -186,7 +186,7 @@ public class EnumTest extends BaseTest { ...@@ -186,7 +186,7 @@ public class EnumTest extends BaseTest {
createOptionalAttrDef("o", ts.defineMapType(DataTypes.STRING_TYPE, DataTypes.DOUBLE_TYPE)), createOptionalAttrDef("o", ts.defineMapType(DataTypes.STRING_TYPE, DataTypes.DOUBLE_TYPE)),
createOptionalAttrDef("enum4", ts.getDataType(EnumType.class, "LockLevel"))); createOptionalAttrDef("enum4", ts.getDataType(EnumType.class, "LockLevel")));
Struct s = createStructWithEnum("t3"); Struct s = createStructWithEnum("ts");
ITypedStruct typedS = structType.convert(s, Multiplicity.REQUIRED); ITypedStruct typedS = structType.convert(s, Multiplicity.REQUIRED);
Assert.assertEquals(typedS.toString(), "{\n" + Assert.assertEquals(typedS.toString(), "{\n" +
"\ta : \t1\n" + "\ta : \t1\n" +
......
...@@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList; ...@@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import org.apache.atlas.AtlasException; import org.apache.atlas.AtlasException;
import org.apache.atlas.typesystem.exception.TypeExistsException;
import org.apache.atlas.typesystem.types.utils.TypesUtil; import org.apache.atlas.typesystem.types.utils.TypesUtil;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.testng.Assert; import org.testng.Assert;
...@@ -41,6 +42,7 @@ import static org.apache.atlas.typesystem.types.utils.TypesUtil.createRequiredAt ...@@ -41,6 +42,7 @@ import static org.apache.atlas.typesystem.types.utils.TypesUtil.createRequiredAt
import static org.apache.atlas.typesystem.types.utils.TypesUtil.createStructTypeDef; import static org.apache.atlas.typesystem.types.utils.TypesUtil.createStructTypeDef;
import static org.apache.atlas.typesystem.types.utils.TypesUtil.createTraitTypeDef; import static org.apache.atlas.typesystem.types.utils.TypesUtil.createTraitTypeDef;
import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
public class TypeSystemTest extends BaseTest { public class TypeSystemTest extends BaseTest {
...@@ -266,4 +268,20 @@ public class TypeSystemTest extends BaseTest { ...@@ -266,4 +268,20 @@ public class TypeSystemTest extends BaseTest {
ClassType dataType = getTypeSystem().getDataType(ClassType.class, "MyNewAnnotation"); ClassType dataType = getTypeSystem().getDataType(ClassType.class, "MyNewAnnotation");
Assert.assertTrue(dataType.fieldMapping.fields.containsKey("inheritedAttribute")); Assert.assertTrue(dataType.fieldMapping.fields.containsKey("inheritedAttribute"));
} }
@Test
public void testDuplicateTypenames() throws Exception {
TypeSystem typeSystem = getTypeSystem();
HierarchicalTypeDefinition<TraitType> trait = TypesUtil
.createTraitTypeDef(random(), "description", ImmutableSet.<String>of(),
TypesUtil.createRequiredAttrDef("type", DataTypes.STRING_TYPE));
typeSystem.defineTraitType(trait);
try {
typeSystem.defineTraitType(trait);
fail("Expected TypeExistsException");
} catch(TypeExistsException e) {
//expected
}
}
} }
...@@ -24,6 +24,7 @@ import com.sun.jersey.api.client.ClientResponse; ...@@ -24,6 +24,7 @@ import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.WebResource;
import org.apache.atlas.AtlasClient; import org.apache.atlas.AtlasClient;
import org.apache.atlas.AtlasServiceException;
import org.apache.atlas.typesystem.TypesDef; import org.apache.atlas.typesystem.TypesDef;
import org.apache.atlas.typesystem.json.TypesSerialization; import org.apache.atlas.typesystem.json.TypesSerialization;
import org.apache.atlas.typesystem.json.TypesSerialization$; import org.apache.atlas.typesystem.json.TypesSerialization$;
...@@ -51,6 +52,7 @@ import java.util.ArrayList; ...@@ -51,6 +52,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
/** /**
* Integration test for types jersey resource. * Integration test for types jersey resource.
...@@ -95,6 +97,23 @@ public class TypesJerseyResourceIT extends BaseResourceIT { ...@@ -95,6 +97,23 @@ public class TypesJerseyResourceIT extends BaseResourceIT {
} }
@Test @Test
public void testDuplicateSubmit() throws Exception {
HierarchicalTypeDefinition<ClassType> type = TypesUtil.createClassTypeDef(randomString(),
ImmutableSet.<String>of(), TypesUtil.createUniqueRequiredAttrDef("name", DataTypes.STRING_TYPE));
TypesDef typesDef =
TypesUtil.getTypesDef(ImmutableList.<EnumTypeDefinition>of(), ImmutableList.<StructTypeDefinition>of(),
ImmutableList.<HierarchicalTypeDefinition<TraitType>>of(), ImmutableList.of(type));
serviceClient.createType(typesDef);
try {
serviceClient.createType(typesDef);
fail("Expected 409");
} catch (AtlasServiceException e) {
assertEquals(e.getStatus().getStatusCode(), Response.Status.CONFLICT.getStatusCode());
}
}
@Test
public void testUpdate() throws Exception { public void testUpdate() throws Exception {
HierarchicalTypeDefinition<ClassType> typeDefinition = TypesUtil HierarchicalTypeDefinition<ClassType> typeDefinition = TypesUtil
.createClassTypeDef(randomString(), ImmutableSet.<String>of(), .createClassTypeDef(randomString(), ImmutableSet.<String>of(),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment