package me.prettyprint.cassandra.service; import me.prettyprint.cassandra.BaseEmbededServerSetupTest; import me.prettyprint.cassandra.model.BasicColumnDefinition; import me.prettyprint.cassandra.model.BasicColumnFamilyDefinition; import me.prettyprint.cassandra.model.BasicKeyspaceDefinition; import me.prettyprint.cassandra.serializers.StringSerializer; import me.prettyprint.hector.api.Keyspace; import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition; import me.prettyprint.hector.api.ddl.ColumnIndexType; import me.prettyprint.hector.api.ddl.ComparatorType; import me.prettyprint.hector.api.ddl.KeyspaceDefinition; import me.prettyprint.hector.api.factory.HFactory; import me.prettyprint.hector.api.mutation.Mutator; import me.prettyprint.hector.api.query.ColumnQuery; import org.apache.cassandra.thrift.NotFoundException; import org.apache.cassandra.thrift.TokenRange; import org.apache.thrift.TException; import org.apache.thrift.transport.TTransportException; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.junit.Assert.*; public class CassandraClusterTest extends BaseEmbededServerSetupTest { private ThriftCluster cassandraCluster; private CassandraHostConfigurator cassandraHostConfigurator; @Before public void setupCase() throws TTransportException, TException, IllegalArgumentException, NotFoundException, UnknownHostException, Exception { cassandraHostConfigurator = getCHCForTest(); cassandraCluster = new ThriftCluster(clusterName, cassandraHostConfigurator); } @Test public void testDescribeClusterName() throws Exception { assertEquals("Test Cluster",cassandraCluster.describeClusterName()); } /** * This will need to be updated as we update the Thrift API, but probably a good sanity check * */ @Test @Ignore public void testDescribeThriftVersion() throws Exception { assertEquals("19.35.0",cassandraCluster.describeThriftVersion()); } @Test public void testDescribeRing() throws Exception { List<TokenRange> ring = cassandraCluster.describeRing("Keyspace1"); assertEquals(1, ring.size()); } @Test public void testDescribePartitioner() throws Exception { String partitioner = cassandraCluster.describePartitioner(); assertEquals("org.apache.cassandra.dht.OrderPreservingPartitioner",partitioner); } @Test public void testAddDropColumnFamily() throws Exception { ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("Keyspace1", "DynCf"); cassandraCluster.addColumnFamily(cfDef); String cfid2 = cassandraCluster.dropColumnFamily("Keyspace1", "DynCf"); assertNotNull(cfid2); // Let's wait for agreement cassandraCluster.addColumnFamily(cfDef, true); cfid2 = cassandraCluster.dropColumnFamily("Keyspace1", "DynCf", true); assertNotNull(cfid2); } @Test public void testTruncateColumnFamily() throws Exception { ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("Keyspace1", "TruncateableCf"); cassandraCluster.addColumnFamily(cfDef); Keyspace workingKeyspace = HFactory.createKeyspace("Keyspace1", cassandraCluster); Mutator<String> mutator = HFactory.createMutator(workingKeyspace, StringSerializer.get()); mutator.insert("mykey", "TruncateableCf", HFactory.createStringColumn("mycolname", "myval")); ColumnQuery<String,String,String> q = HFactory.createColumnQuery(workingKeyspace, StringSerializer.get(), StringSerializer.get(), StringSerializer.get()); q.setKey("mykey").setName("mycolname").setColumnFamily("TruncateableCf"); assertEquals("myval",q.execute().get().getValue()); cassandraCluster.truncate("Keyspace1", "TruncateableCf"); assertNull(q.execute().get()); } @Test public void testAddDropKeyspace() throws Exception { ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("DynKeyspace", "DynCf"); cassandraCluster.addKeyspace( new ThriftKsDef("DynKeyspace", "org.apache.cassandra.locator.SimpleStrategy", 1, Arrays.asList(cfDef))); String ksid2 = cassandraCluster.dropKeyspace("DynKeyspace"); assertNotNull(ksid2); // Now let's wait for schema agreement. cassandraCluster.addKeyspace(new ThriftKsDef("DynKeyspace", "org.apache.cassandra.locator.SimpleStrategy", 1, Arrays.asList(cfDef)), true); ksid2 = cassandraCluster.dropKeyspace("DynKeyspace", true); assertNotNull(ksid2); } @Test public void testAddKeyspaceNTS() throws Exception { ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("DynKeyspaceNTS", "DynCf"); cassandraCluster.addKeyspace( new ThriftKsDef("DynKeyspaceNTS", "org.apache.cassandra.locator.NetworkTopologyStrategy", 1, Arrays.asList(cfDef))); } @Test public void testEditKeyspace() throws Exception { BasicColumnFamilyDefinition columnFamilyDefinition = new BasicColumnFamilyDefinition(); columnFamilyDefinition.setKeyspaceName("DynKeyspace2"); columnFamilyDefinition.setName("DynamicCF"); ColumnFamilyDefinition cfDef = new ThriftCfDef(columnFamilyDefinition); KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition("DynKeyspace2", "org.apache.cassandra.locator.SimpleStrategy", 1, Arrays.asList(cfDef)); cassandraCluster.addKeyspace(keyspaceDefinition); keyspaceDefinition = HFactory.createKeyspaceDefinition("DynKeyspace2", "org.apache.cassandra.locator.SimpleStrategy", 2, null); cassandraCluster.updateKeyspace(keyspaceDefinition); KeyspaceDefinition fromCluster = cassandraCluster.describeKeyspace("DynKeyspace2"); assertEquals(2,fromCluster.getReplicationFactor()); cassandraCluster.dropKeyspace("DynKeyspace2"); } @Test public void testAddColumnDefinitionWhenNoneOnConstructor() { ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition("blah-ks", "blah-cf", ComparatorType.BYTESTYPE); assertSame( Collections.emptyList(), cfDef.getColumnMetadata()); // // column defs are not required but are nice for validating data and displaying meaningful values in // cassandra-cli // BasicColumnDefinition cd = new BasicColumnDefinition(); cd.setName(ByteBuffer.wrap("colname".getBytes())); cd.setValidationClass("org.apache.cassandra.db.marshal.UTF8Type"); cfDef.addColumnDefinition(cd); assertEquals( 1, cfDef.getColumnMetadata().size()); assertEquals( cd, cfDef.getColumnMetadata().get(0)); } @Test public void testEditColumnFamily() throws Exception { BasicColumnFamilyDefinition columnFamilyDefinition = new BasicColumnFamilyDefinition(); columnFamilyDefinition.setKeyspaceName("DynKeyspace3"); columnFamilyDefinition.setName("DynamicCF"); ColumnFamilyDefinition cfDef = new ThriftCfDef(columnFamilyDefinition); KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition("DynKeyspace3", "org.apache.cassandra.locator.SimpleStrategy", 1, Arrays.asList(cfDef)); cassandraCluster.addKeyspace(keyspaceDefinition); KeyspaceDefinition fromCluster = cassandraCluster.describeKeyspace("DynKeyspace3"); cfDef = fromCluster.getCfDefs().get(0); columnFamilyDefinition = new BasicColumnFamilyDefinition(cfDef); BasicColumnDefinition columnDefinition = new BasicColumnDefinition(); columnDefinition.setName(StringSerializer.get().toByteBuffer("birthdate")); columnDefinition.setIndexName("birthdate_idx"); columnDefinition.setIndexType(ColumnIndexType.KEYS); columnDefinition.setValidationClass(ComparatorType.LONGTYPE.getClassName()); columnFamilyDefinition.addColumnDefinition(columnDefinition); columnDefinition = new BasicColumnDefinition(); columnDefinition.setName(StringSerializer.get().toByteBuffer("nonindexed_field")); columnDefinition.setValidationClass(ComparatorType.LONGTYPE.getClassName()); columnFamilyDefinition.addColumnDefinition(columnDefinition); cassandraCluster.updateColumnFamily(new ThriftCfDef(columnFamilyDefinition)); fromCluster = cassandraCluster.describeKeyspace("DynKeyspace3"); assertEquals("birthdate",StringSerializer.get().fromByteBuffer(fromCluster.getCfDefs().get(0).getColumnMetadata().get(0).getName())); assertEquals("birthdate_idx",fromCluster.getCfDefs().get(0).getColumnMetadata().get(0).getIndexName()); assertEquals("nonindexed_field",StringSerializer.get().fromByteBuffer(fromCluster.getCfDefs().get(0).getColumnMetadata().get(1).getName())); } @Test public void testAddEmptyKeyspace() throws Exception { cassandraCluster.addKeyspace(new ThriftKsDef("DynKeyspaceEmpty")); assertNotNull(cassandraCluster.describeKeyspace("DynKeyspaceEmpty")); String ksid2 = cassandraCluster.dropKeyspace("DynKeyspaceEmpty"); assertNotNull(ksid2); } @Test public void testAddEmptyBasicKeyspaceDefinition() throws Exception { BasicKeyspaceDefinition ksDef = new BasicKeyspaceDefinition(); ksDef.setName("DynKeyspaceEmpty"); ksDef.setReplicationFactor(1); ksDef.setStrategyClass("SimpleStrategy"); cassandraCluster.addKeyspace(ksDef); assertNotNull(cassandraCluster.describeKeyspace("DynKeyspaceEmpty")); String ksid2 = cassandraCluster.dropKeyspace("DynKeyspaceEmpty"); assertNotNull(ksid2); } @Test public void testEditBasicKeyspaceDefinition() throws Exception { BasicKeyspaceDefinition ksDef = new BasicKeyspaceDefinition(); ksDef.setName("DynKeyspace4"); ksDef.setReplicationFactor(1); ksDef.setStrategyClass("SimpleStrategy"); cassandraCluster.addKeyspace(ksDef); assertNotNull(cassandraCluster.describeKeyspace("DynKeyspace4")); ksDef.setReplicationFactor(2); cassandraCluster.updateKeyspace(ksDef); KeyspaceDefinition fromCluster = cassandraCluster.describeKeyspace("DynKeyspace4"); assertEquals(2, fromCluster.getReplicationFactor()); cassandraCluster.dropKeyspace("DynKeyspace4"); } @Test public void testAddDropBasicColumnFamilyDefinition() throws Exception { BasicColumnFamilyDefinition cfDef = new BasicColumnFamilyDefinition(); cfDef.setName("DynCf"); cfDef.setKeyspaceName("Keyspace1"); cassandraCluster.addColumnFamily(cfDef); String cfid2 = cassandraCluster.dropColumnFamily("Keyspace1", "DynCf"); assertNotNull(cfid2); } @Test public void testEditBasicColumnFamilyDefinition() throws Exception { BasicKeyspaceDefinition ksDef = new BasicKeyspaceDefinition(); ksDef.setName("Keyspace2"); ksDef.setReplicationFactor(1); ksDef.setStrategyClass("SimpleStrategy"); cassandraCluster.addKeyspace(ksDef); BasicColumnFamilyDefinition cfDef = new BasicColumnFamilyDefinition(); cfDef.setName("DynCf2"); cfDef.setKeyspaceName("Keyspace2"); cassandraCluster.addColumnFamily(cfDef); KeyspaceDefinition fromCluster = cassandraCluster.describeKeyspace("Keyspace2"); cfDef = new BasicColumnFamilyDefinition(fromCluster.getCfDefs().get(0)); cfDef.setDefaultValidationClass(ComparatorType.LONGTYPE.getClassName()); cassandraCluster.updateColumnFamily(cfDef); String cfid2 = cassandraCluster.dropColumnFamily("Keyspace2", "DynCf2"); assertNotNull(cfid2); } }