Commit c37656cc by Sarath Subramanian

ATLAS-3157: Add Integration tests for Hive metastore hook

parent e050bc06
...@@ -22,6 +22,7 @@ import com.google.common.annotations.VisibleForTesting; ...@@ -22,6 +22,7 @@ import com.google.common.annotations.VisibleForTesting;
import org.apache.atlas.ApplicationProperties; import org.apache.atlas.ApplicationProperties;
import org.apache.atlas.AtlasClient; import org.apache.atlas.AtlasClient;
import org.apache.atlas.AtlasClientV2; import org.apache.atlas.AtlasClientV2;
import org.apache.atlas.AtlasServiceException;
import org.apache.atlas.hive.bridge.ColumnLineageUtils; import org.apache.atlas.hive.bridge.ColumnLineageUtils;
import org.apache.atlas.hive.bridge.HiveMetaStoreBridge; import org.apache.atlas.hive.bridge.HiveMetaStoreBridge;
import org.apache.atlas.hive.hook.HiveHookIT; import org.apache.atlas.hive.hook.HiveHookIT;
...@@ -67,7 +68,10 @@ import java.util.Set; ...@@ -67,7 +68,10 @@ import java.util.Set;
import java.util.SortedMap; import java.util.SortedMap;
import java.util.SortedSet; import java.util.SortedSet;
import static com.sun.jersey.api.client.ClientResponse.Status.NOT_FOUND;
import static org.apache.atlas.hive.bridge.HiveMetaStoreBridge.HDFS_PATH; import static org.apache.atlas.hive.bridge.HiveMetaStoreBridge.HDFS_PATH;
import static org.apache.atlas.hive.hook.events.BaseHiveEvent.ATTRIBUTE_QUALIFIED_NAME;
import static org.apache.atlas.hive.model.HiveDataTypes.HIVE_DB;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertTrue;
...@@ -103,6 +107,11 @@ public class HiveITBase { ...@@ -103,6 +107,11 @@ public class HiveITBase {
//Set-up hive session //Set-up hive session
conf = new HiveConf(); conf = new HiveConf();
conf.setClassLoader(Thread.currentThread().getContextClassLoader()); conf.setClassLoader(Thread.currentThread().getContextClassLoader());
conf.set("hive.metastore.event.listeners", "");
// 'driver' using this configuration will be used for tests in HiveHookIT
// HiveHookIT will use this driver to test post-execution hooks in HiveServer2.
// initialize 'driver' with HMS hook disabled.
driver = new Driver(conf); driver = new Driver(conf);
ss = new SessionState(conf); ss = new SessionState(conf);
ss = SessionState.start(ss); ss = SessionState.start(ss);
...@@ -112,6 +121,7 @@ public class HiveITBase { ...@@ -112,6 +121,7 @@ public class HiveITBase {
Configuration configuration = ApplicationProperties.get(); Configuration configuration = ApplicationProperties.get();
String[] atlasEndPoint = configuration.getStringArray(HiveMetaStoreBridge.ATLAS_ENDPOINT); String[] atlasEndPoint = configuration.getStringArray(HiveMetaStoreBridge.ATLAS_ENDPOINT);
if (atlasEndPoint == null || atlasEndPoint.length == 0) { if (atlasEndPoint == null || atlasEndPoint.length == 0) {
atlasEndPoint = new String[] { DGI_URL }; atlasEndPoint = new String[] { DGI_URL };
} }
...@@ -122,16 +132,21 @@ public class HiveITBase { ...@@ -122,16 +132,21 @@ public class HiveITBase {
} else { } else {
atlasClientV2 = new AtlasClientV2(atlasEndPoint); atlasClientV2 = new AtlasClientV2(atlasEndPoint);
atlasClient = new AtlasClient(atlasEndPoint); atlasClient = new AtlasClient(atlasEndPoint);
} }
hiveMetaStoreBridge = new HiveMetaStoreBridge(configuration, conf, atlasClientV2); hiveMetaStoreBridge = new HiveMetaStoreBridge(configuration, conf, atlasClientV2);
HiveConf conf = new HiveConf(); HiveConf conf = new HiveConf();
conf.set("hive.exec.post.hooks", ""); conf.set("hive.exec.post.hooks", "");
SessionState ss = new SessionState(conf); SessionState ss = new SessionState(conf);
ss = SessionState.start(ss); ss = SessionState.start(ss);
SessionState.setCurrentSessionState(ss); SessionState.setCurrentSessionState(ss);
// 'driverWithoutContext' using this configuration will be used for tests in HiveMetastoreHookIT
// HiveMetastoreHookIT will use this driver to test event listeners in HiveMetastore.
// initialize 'driverWithoutContext' with HiveServer2 post execution hook disabled.
driverWithoutContext = new Driver(conf); driverWithoutContext = new Driver(conf);
} }
...@@ -149,8 +164,11 @@ public class HiveITBase { ...@@ -149,8 +164,11 @@ public class HiveITBase {
protected void runCommandWithDelay(Driver driver, String cmd, int sleepMs) throws Exception { protected void runCommandWithDelay(Driver driver, String cmd, int sleepMs) throws Exception {
LOG.debug("Running command '{}'", cmd); LOG.debug("Running command '{}'", cmd);
CommandProcessorResponse response = driver.run(cmd); CommandProcessorResponse response = driver.run(cmd);
assertEquals(response.getResponseCode(), 0); assertEquals(response.getResponseCode(), 0);
if (sleepMs != 0) { if (sleepMs != 0) {
Thread.sleep(sleepMs); Thread.sleep(sleepMs);
} }
...@@ -182,11 +200,15 @@ public class HiveITBase { ...@@ -182,11 +200,15 @@ public class HiveITBase {
} }
protected String random() { protected String random() {
return RandomStringUtils.randomAlphanumeric(10); return RandomStringUtils.randomAlphanumeric(10).toLowerCase();
} }
protected String tableName() { protected String tableName() {
return "table" + random(); return "table_" + random();
}
protected String dbName() {
return "db_" + random();
} }
protected String assertTableIsRegistered(String dbName, String tableName) throws Exception { protected String assertTableIsRegistered(String dbName, String tableName) throws Exception {
...@@ -336,12 +358,35 @@ public class HiveITBase { ...@@ -336,12 +358,35 @@ public class HiveITBase {
} }
protected String assertDatabaseIsRegistered(String dbName, AssertPredicate assertPredicate) throws Exception { protected String assertDatabaseIsRegistered(String dbName, AssertPredicate assertPredicate) throws Exception {
LOG.debug("Searching for database: {}", dbName);
String dbQualifiedName = HiveMetaStoreBridge.getDBQualifiedName(CLUSTER_NAME, dbName);
return assertEntityIsRegistered(HIVE_DB.getName(), REFERENCEABLE_ATTRIBUTE_NAME, dbQualifiedName, assertPredicate);
}
public void assertDatabaseIsNotRegistered(String dbName) throws Exception {
LOG.debug("Searching for database {}", dbName); LOG.debug("Searching for database {}", dbName);
String dbQualifiedName = HiveMetaStoreBridge.getDBQualifiedName(CLUSTER_NAME, dbName); String dbQualifiedName = HiveMetaStoreBridge.getDBQualifiedName(CLUSTER_NAME, dbName);
return assertEntityIsRegistered(HiveDataTypes.HIVE_DB.getName(), REFERENCEABLE_ATTRIBUTE_NAME, assertEntityIsNotRegistered(HIVE_DB.getName(), ATTRIBUTE_QUALIFIED_NAME, dbQualifiedName);
dbQualifiedName, assertPredicate);
} }
protected void assertEntityIsNotRegistered(final String typeName, final String property, final String value) throws Exception {
// wait for sufficient time before checking if entity is not available.
long waitTime = 2000;
LOG.debug("Waiting for {} msecs, before asserting entity is not registered.", waitTime);
Thread.sleep(waitTime);
try {
atlasClientV2.getEntityByAttribute(typeName, Collections.singletonMap(property, value));
fail(String.format("Entity was not supposed to exist for typeName = %s, attributeName = %s, attributeValue = %s", typeName, property, value));
} catch (AtlasServiceException e) {
if (e.getStatus() == NOT_FOUND) {
return;
}
}
}
protected AtlasEntity getAtlasEntityByType(String type, String id) throws Exception { protected AtlasEntity getAtlasEntityByType(String type, String id) throws Exception {
AtlasEntity atlasEntity = null; AtlasEntity atlasEntity = null;
......
...@@ -28,12 +28,8 @@ import org.apache.atlas.hive.HiveITBase; ...@@ -28,12 +28,8 @@ import org.apache.atlas.hive.HiveITBase;
import org.apache.atlas.hive.bridge.HiveMetaStoreBridge; import org.apache.atlas.hive.bridge.HiveMetaStoreBridge;
import org.apache.atlas.hive.hook.events.BaseHiveEvent; import org.apache.atlas.hive.hook.events.BaseHiveEvent;
import org.apache.atlas.hive.model.HiveDataTypes; import org.apache.atlas.hive.model.HiveDataTypes;
import org.apache.atlas.model.instance.AtlasClassification; import org.apache.atlas.model.instance.*;
import org.apache.atlas.model.instance.AtlasEntity;
import org.apache.atlas.model.instance.AtlasEntityHeader;
import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo; import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo;
import org.apache.atlas.model.instance.AtlasObjectId;
import org.apache.atlas.model.instance.AtlasStruct;
import org.apache.atlas.model.lineage.AtlasLineageInfo; import org.apache.atlas.model.lineage.AtlasLineageInfo;
import org.apache.atlas.model.typedef.AtlasClassificationDef; import org.apache.atlas.model.typedef.AtlasClassificationDef;
import org.apache.atlas.model.typedef.AtlasTypesDef; import org.apache.atlas.model.typedef.AtlasTypesDef;
...@@ -41,18 +37,22 @@ import org.apache.atlas.type.AtlasTypeUtil; ...@@ -41,18 +37,22 @@ import org.apache.atlas.type.AtlasTypeUtil;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.metastore.TableType; import org.apache.hadoop.hive.metastore.TableType;
import org.apache.hadoop.hive.metastore.api.hive_metastoreConstants; import org.apache.hadoop.hive.metastore.api.hive_metastoreConstants;
import org.apache.hadoop.hive.ql.Driver;
import org.apache.hadoop.hive.ql.hooks.Entity; import org.apache.hadoop.hive.ql.hooks.Entity;
import org.apache.hadoop.hive.ql.hooks.ReadEntity; import org.apache.hadoop.hive.ql.hooks.ReadEntity;
import org.apache.hadoop.hive.ql.hooks.WriteEntity; import org.apache.hadoop.hive.ql.hooks.WriteEntity;
import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.Table; import org.apache.hadoop.hive.ql.metadata.Table;
import org.apache.hadoop.hive.ql.plan.HiveOperation; import org.apache.hadoop.hive.ql.plan.HiveOperation;
import org.apache.hadoop.hive.ql.session.SessionState;
import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.UserGroupInformation;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.text.ParseException; import java.text.ParseException;
...@@ -60,17 +60,32 @@ import java.util.*; ...@@ -60,17 +60,32 @@ import java.util.*;
import static org.apache.atlas.AtlasClient.NAME; import static org.apache.atlas.AtlasClient.NAME;
import static org.apache.atlas.hive.hook.events.BaseHiveEvent.*; import static org.apache.atlas.hive.hook.events.BaseHiveEvent.*;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.*;
import static org.testng.Assert.assertNotEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
public class HiveHookIT extends HiveITBase { public class HiveHookIT extends HiveITBase {
private static final Logger LOG = LoggerFactory.getLogger(HiveHookIT.class); private static final Logger LOG = LoggerFactory.getLogger(HiveHookIT.class);
private static final String PART_FILE = "2015-01-01"; private static final String PART_FILE = "2015-01-01";
private Driver driverWithNoHook;
@BeforeClass
public void setUp() throws Exception {
// initialize 'driverWithNoHook' with HiveServer2 hook and HiveMetastore hook disabled
HiveConf conf = new HiveConf();
conf.set("hive.exec.post.hooks", "");
conf.set("hive.metastore.event.listeners", "");
SessionState ss = new SessionState(conf);
ss = SessionState.start(ss);
SessionState.setCurrentSessionState(ss);
// Initialize 'driverWithNoHook' with HS2 hook disabled and HMS hook disabled.
driverWithNoHook = new Driver(conf);
super.setUp();
}
@Test @Test
public void testCreateDatabase() throws Exception { public void testCreateDatabase() throws Exception {
String dbName = "db" + random(); String dbName = "db" + random();
...@@ -87,7 +102,7 @@ public class HiveHookIT extends HiveITBase { ...@@ -87,7 +102,7 @@ public class HiveHookIT extends HiveITBase {
//There should be just one entity per dbname //There should be just one entity per dbname
runCommand("drop database " + dbName); runCommand("drop database " + dbName);
assertDBIsNotRegistered(dbName); assertDatabaseIsNotRegistered(dbName);
runCommand("create database " + dbName); runCommand("create database " + dbName);
dbId = assertDatabaseIsRegistered(dbName); dbId = assertDatabaseIsRegistered(dbName);
...@@ -1557,7 +1572,7 @@ public class HiveHookIT extends HiveITBase { ...@@ -1557,7 +1572,7 @@ public class HiveHookIT extends HiveITBase {
String tableName = tableName(); String tableName = tableName();
String createCommand = "create table " + tableName + " (id int, name string)"; String createCommand = "create table " + tableName + " (id int, name string)";
driverWithoutContext.run(createCommand); driverWithNoHook.run(createCommand);
assertTableIsNotRegistered(DEFAULT_DB, tableName); assertTableIsNotRegistered(DEFAULT_DB, tableName);
...@@ -1802,7 +1817,7 @@ public class HiveHookIT extends HiveITBase { ...@@ -1802,7 +1817,7 @@ public class HiveHookIT extends HiveITBase {
assertTableIsNotRegistered(dbName, tableNames[i]); assertTableIsNotRegistered(dbName, tableNames[i]);
} }
assertDBIsNotRegistered(dbName); assertDatabaseIsNotRegistered(dbName);
} }
@Test @Test
...@@ -1849,14 +1864,14 @@ public class HiveHookIT extends HiveITBase { ...@@ -1849,14 +1864,14 @@ public class HiveHookIT extends HiveITBase {
//Test Deletion of a non existing DB //Test Deletion of a non existing DB
String dbName = "nonexistingdb"; String dbName = "nonexistingdb";
assertDBIsNotRegistered(dbName); assertDatabaseIsNotRegistered(dbName);
String query = String.format("drop database if exists %s cascade", dbName); String query = String.format("drop database if exists %s cascade", dbName);
runCommand(query); runCommand(query);
//Should have no effect //Should have no effect
assertDBIsNotRegistered(dbName); assertDatabaseIsNotRegistered(dbName);
} }
@Test @Test
...@@ -2209,33 +2224,10 @@ public class HiveHookIT extends HiveITBase { ...@@ -2209,33 +2224,10 @@ public class HiveHookIT extends HiveITBase {
assertEntityIsNotRegistered(HiveDataTypes.HIVE_TABLE.getName(), ATTRIBUTE_QUALIFIED_NAME, tableQualifiedName); assertEntityIsNotRegistered(HiveDataTypes.HIVE_TABLE.getName(), ATTRIBUTE_QUALIFIED_NAME, tableQualifiedName);
} }
private void assertDBIsNotRegistered(String dbName) throws Exception {
LOG.debug("Searching for database {}", dbName);
String dbQualifiedName = HiveMetaStoreBridge.getDBQualifiedName(CLUSTER_NAME, dbName);
assertEntityIsNotRegistered(HiveDataTypes.HIVE_DB.getName(), ATTRIBUTE_QUALIFIED_NAME, dbQualifiedName);
}
private String assertTableIsRegistered(String dbName, String tableName, AssertPredicate assertPredicate) throws Exception { private String assertTableIsRegistered(String dbName, String tableName, AssertPredicate assertPredicate) throws Exception {
return assertTableIsRegistered(dbName, tableName, assertPredicate, false); return assertTableIsRegistered(dbName, tableName, assertPredicate, false);
} }
private void assertEntityIsNotRegistered(final String typeName, final String property, final String value) throws Exception {
waitFor(80000, new Predicate() {
@Override
public void evaluate() throws Exception {
try {
atlasClientV2.getEntityByAttribute(typeName, Collections.singletonMap(property, value));
} catch (AtlasServiceException e) {
if (e.getStatus() == ClientResponse.Status.NOT_FOUND) {
return;
}
}
fail(String.format("Entity was not supposed to exist for typeName = %s, attributeName = %s, "
+ "attributeValue = %s", typeName, property, value));
}
});
}
@Test @Test
public void testLineage() throws Exception { public void testLineage() throws Exception {
String table1 = createTable(false); String table1 = createTable(false);
...@@ -2267,10 +2259,6 @@ public class HiveHookIT extends HiveITBase { ...@@ -2267,10 +2259,6 @@ public class HiveHookIT extends HiveITBase {
runCommand("show transactions"); runCommand("show transactions");
} }
private String dbName() {
return "db" + random();
}
private String createDatabase() throws Exception { private String createDatabase() throws Exception {
String dbName = dbName(); String dbName = dbName();
......
...@@ -37,6 +37,11 @@ ...@@ -37,6 +37,11 @@
</property> </property>
<property> <property>
<name>hive.metastore.event.listeners</name>
<value>org.apache.atlas.hive.hook.HiveMetastoreHookImpl</value>
</property>
<property>
<name>hive.support.concurrency</name> <name>hive.support.concurrency</name>
<value>false</value> <value>false</value>
</property> </property>
......
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