/* * Copyright (c) 2008-2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.server.geo; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.Map; import org.apache.cassandra.thrift.Cassandra; import org.apache.cassandra.thrift.KsDef; import org.apache.cassandra.tools.NodeProbe; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.transport.TFastFramedTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.coordinator.client.model.Constants; import com.emc.storageos.coordinator.client.model.DbVersionInfo; import com.emc.storageos.coordinator.client.service.CoordinatorClient; import com.emc.storageos.coordinator.common.Configuration; import com.emc.storageos.coordinator.common.impl.ConfigurationImpl; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.constraint.ContainmentConstraint; import com.emc.storageos.db.client.constraint.URIQueryResultList; import com.emc.storageos.db.client.impl.DbClientContext; import com.emc.storageos.db.client.impl.DbClientImpl; import com.emc.storageos.db.client.impl.EncryptionProviderImpl; import com.emc.storageos.db.client.model.TenantOrg; import com.emc.storageos.db.common.DbConfigConstants; /** * Unit test for geodbsvc startup flow. */ public class GeoDbSvcStartupTest { private static String GEODBSVC_CONFIG = "geodbtestgeoalone-conf.xml"; private static final Logger log = LoggerFactory .getLogger(DbClientGeoTest.class); private static String HOST = "127.0.0.1"; // host name defined in // geodbtest-conf.yaml private static int JMX_PORT = 7299; // JMX port defined in geodb-jmx-var.xml private static int RPC_PORT = 9260; // Thrift rpc port defined in // geodbtest-conf.yaml static volatile DbSvcRunner runner; static volatile DbClientImpl dbClient; @BeforeClass public static void setup() throws Exception { runner = new DbSvcRunner(GEODBSVC_CONFIG, Constants.GEODBSVC_NAME); runner.startCoordinator(); // set current schema version for local db. dbclient is depending on it setLocalDbCurrentVersion(runner.getCoordinator()); runner.startInProcess(); if (!runner.waitUntilStarted(100)) { Assert.assertTrue("GeoDbsvc could not started", false); } } @Test public void checkDbConfig() throws Exception { CoordinatorClient coordinator = runner.getCoordinator(); // Check dbconfig String kind = coordinator.getDbConfigPath(Constants.GEODBSVC_NAME); Configuration config = coordinator.queryConfiguration(coordinator.getSiteId(), kind, DbSvcRunner.GEOSVC_ID); Assert.assertNotNull("No dbconfig found", config); String value = config.getConfig(DbConfigConstants.JOINED); Assert.assertTrue("dbconfig joined flag is false", "true".equalsIgnoreCase(value)); // Check dbconfig/global config = coordinator.queryConfiguration(coordinator.getSiteId(), kind, Constants.GLOBAL_ID); Assert.assertNotNull("No dbconfig/global found", config); value = config.getConfig(Constants.SCHEMA_VERSION); Assert.assertTrue("Unexpected dbconfig/global schemaversion", DbSvcRunner.SVC_VERSION.equalsIgnoreCase(value)); // Check versioned dbconfig kind = coordinator.getVersionedDbConfigPath(Constants.GEODBSVC_NAME, DbSvcRunner.SVC_VERSION); config = coordinator.queryConfiguration(coordinator.getSiteId(), kind, DbSvcRunner.GEOSVC_ID); Assert.assertNotNull("No versioned dbconfig found", config); value = config.getConfig(DbConfigConstants.INIT_DONE); Assert.assertTrue("Unexpected versioned dbconfig initdone", "true".equalsIgnoreCase(value)); log.info("Check db config OK"); } @Test public void checkSchema() throws Exception { // Check if snitch setup is OK NodeProbe cmd = new NodeProbe(HOST, JMX_PORT); String dc = cmd.getDataCenter(); Assert.assertTrue("Unexpected DC name " + dc, "vdc1".equalsIgnoreCase(dc)); // Check schema setup is OK TSocket socket = new TSocket(HOST, RPC_PORT); TTransport transport = new TFastFramedTransport(socket); transport.open(); try { Cassandra.Client client = new Cassandra.Client(new TBinaryProtocol( transport, true, true)); KsDef def = client.describe_keyspace(DbClientContext.GEO_KEYSPACE_NAME); String strategyClass = def.strategy_class; log.info("Current strategy class in geodb schema: " + strategyClass); Assert.assertTrue("Unexpected strategy class " + strategyClass, strategyClass.contains("NetworkTopologyStrategy")); Map<String, String> strategyOptions = def.getStrategy_options(); Assert.assertTrue(strategyOptions.size() > 0); } finally { transport.close(); } } @Test public void testRootTenantExists() throws Exception { URIQueryResultList tenants = new URIQueryResultList(); boolean isRootTenantExists = false; int retryCount = 0; do { getDbClient().queryByConstraint( ContainmentConstraint.Factory.getTenantOrgSubTenantConstraint(URI.create(TenantOrg.NO_PARENT)), tenants); isRootTenantExists = tenants.iterator().hasNext(); if (!isRootTenantExists) { try { Thread.sleep(2000); } catch (InterruptedException ex) { // Ignore this exception } } } while (!isRootTenantExists && retryCount < 30); Assert.assertTrue(isRootTenantExists); } protected static DbClient getDbClient() throws URISyntaxException, IOException { if (dbClient == null) { dbClient = new DbClientImpl(); CoordinatorClient coordinator = runner.getCoordinator(); dbClient.setCoordinatorClient(coordinator); DbVersionInfo dbVersionInfo = new DbVersionInfo(); dbVersionInfo.setSchemaVersion(DbSvcRunner.SVC_VERSION); dbClient.setDbVersionInfo(dbVersionInfo); dbClient.setBypassMigrationLock(true); EncryptionProviderImpl encryptionProvider = new EncryptionProviderImpl(); encryptionProvider.setCoordinator(coordinator); dbClient.setEncryptionProvider(encryptionProvider); EncryptionProviderImpl geoEncryptionProvider = new EncryptionProviderImpl(); geoEncryptionProvider.setCoordinator(coordinator); geoEncryptionProvider.setEncryptId("geoid"); dbClient.setGeoEncryptionProvider(geoEncryptionProvider); DbClientContext geoCtx = new DbClientContext(); geoCtx.setClusterName("GeoStorageOS"); geoCtx.setKeyspaceName("GeoStorageOS"); dbClient.setGeoContext(geoCtx); dbClient.start(); } return dbClient; } private static void setLocalDbCurrentVersion(CoordinatorClient coordinator) throws Exception { Configuration config = coordinator.queryConfiguration(coordinator.getSiteId(), Constants.DB_CONFIG, Constants.GLOBAL_ID); if (config == null) { ConfigurationImpl cfg = new ConfigurationImpl(); cfg.setId(Constants.GLOBAL_ID); cfg.setKind(Constants.DB_CONFIG); config = cfg; } config.setConfig(Constants.SCHEMA_VERSION, DbSvcRunner.SVC_VERSION); coordinator.persistServiceConfiguration(coordinator.getSiteId(), config); } @AfterClass public static void teardown() { dbClient.stop(); runner.stop(); } }