package org.apache.cassandra.hadoop.hive.metastore; import static org.junit.Assert.*; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.db.marshal.BytesType; import org.apache.cassandra.db.marshal.IntegerType; import org.apache.cassandra.db.marshal.LongType; import org.apache.cassandra.db.marshal.TimeUUIDType; import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.thrift.CfDef; import org.apache.cassandra.thrift.ColumnDef; import org.apache.cassandra.thrift.KsDef; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.metastore.api.StorageDescriptor; import org.apache.hadoop.hive.metastore.api.Table; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class SchemaManagerServiceTest extends MetaStoreTestBase { private CassandraClientHolder cassandraClientHolder; private Configuration configuration; private SchemaManagerService schemaManagerService; private CassandraHiveMetaStore cassandraHiveMetaStore; @Before public void setupLocal() throws Exception { configuration = buildConfiguration(); if ( cassandraClientHolder == null ) cassandraClientHolder = new CassandraClientHolder(configuration); if ( cassandraHiveMetaStore == null) { cassandraHiveMetaStore = new CassandraHiveMetaStore(); cassandraHiveMetaStore.setConf(configuration); } schemaManagerService = new SchemaManagerService(cassandraHiveMetaStore, configuration); } @Test public void testMetaStoreSchema() throws Exception { boolean created = schemaManagerService.createMetaStoreIfNeeded(); assertFalse(created); } @Test public void testDiscoverUnmappedKeyspaces() throws Exception { cassandraClientHolder.getClient().system_add_keyspace(setupOtherKeyspace(configuration,"OtherKeyspace", false)); // init the meta store for usage List<KsDef> keyspaces = schemaManagerService.findUnmappedKeyspaces(); boolean foundCreated = false; // don't impose a keyspace maintenance burden. Looking for specifics is good enough for (KsDef ksDef : keyspaces) { if ( StringUtils.equals(ksDef.name, "OtherKeyspace") ) { foundCreated = true; break; } } assertTrue(foundCreated); } @Test public void testCreateKeyspaceSchema() throws Exception { KsDef ksDef = setupOtherKeyspace(configuration,"CreatedKeyspace", false); cassandraClientHolder.getClient().system_add_keyspace(ksDef); schemaManagerService.createKeyspaceSchema(ksDef); List<KsDef> keyspaces = schemaManagerService.findUnmappedKeyspaces(); // don't impose a keyspace maintenance burden. Looking for specifics is good enough for (KsDef ks : keyspaces) { if ( StringUtils.equals(ks.name, "CreatedKeyspace") ) { fail("created was not synched"); } } } @Test public void testSkipCreateOnConfig() throws Exception { KsDef ksDef = setupOtherKeyspace(configuration,"SkipCreatedKeyspace", false); cassandraClientHolder.getClient().system_add_keyspace(ksDef); schemaManagerService.createKeyspaceSchemasIfNeeded(); List<KsDef> keyspaces = schemaManagerService.findUnmappedKeyspaces(); boolean skipped = false; for (KsDef ks : keyspaces) { if ( StringUtils.equals(ks.name, "SkipCreatedKeyspace") ) { skipped = true; } } assertTrue(skipped); } @Test public void testCreateOnConfig() throws Exception { KsDef ksDef = setupOtherKeyspace(configuration,"ConfigCreatedKeyspace", false); cassandraClientHolder.getClient().system_add_keyspace(ksDef); configuration.setBoolean("cassandra.autoCreateHiveSchema", true); schemaManagerService.createKeyspaceSchemasIfNeeded(); List<KsDef> keyspaces = schemaManagerService.findUnmappedKeyspaces(); for (KsDef ks : keyspaces) { if ( StringUtils.equals(ks.name, "ConfigCreatedKeyspace") ) { fail("keyspace not created by configuration"); } } } @Test public void testCreateOnConfigWithMetaData() throws Exception { KsDef ksDef = setupOtherKeyspace(configuration, "ConfigCreatedKeyspaceMetaData", true); cassandraClientHolder.getClient().system_add_keyspace(ksDef); configuration.setBoolean("cassandra.autoCreateHiveSchema", true); schemaManagerService.createKeyspaceSchemasIfNeeded(); List<KsDef> keyspaces = schemaManagerService.findUnmappedKeyspaces(); for (KsDef ks : keyspaces) { if ( StringUtils.equals(ks.name, "ConfigCreatedKeyspaceMetaData") ) { fail("keyspace not created by configuration"); } } Table table = cassandraHiveMetaStore.getTable("ConfigCreatedKeyspaceMetaData", "OtherCf1"); assertNotNull(table); StorageDescriptor sd = table.getSd(); assertEquals(5,sd.getColsSize()); for (Iterator<FieldSchema> iterator = sd.getColsIterator(); iterator.hasNext();) { FieldSchema fs = iterator.next(); if ( StringUtils.equals(fs.getName(), "col_name_utf8")) assertEquals("string", fs.getType()); if ( StringUtils.equals(fs.getName(), "col_name_bytes")) assertEquals("string", fs.getType()); if ( StringUtils.equals(fs.getName(), "col_name_timeuuid")) assertEquals("string", fs.getType()); if ( StringUtils.equals(fs.getName(), "col_name_long")) assertEquals("int", fs.getType()); if ( StringUtils.equals(fs.getName(), "col_name_int")) assertEquals("bigint", fs.getType()); } } }