/* * Copyright (c) 2008-2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.server; import com.emc.storageos.coordinator.client.model.DbVersionInfo; import com.emc.storageos.coordinator.client.service.CoordinatorClient; import com.emc.storageos.coordinator.client.service.impl.CoordinatorClientInetAddressMap; import com.emc.storageos.coordinator.client.service.impl.DualInetAddress; import com.emc.storageos.coordinator.common.impl.ServiceImpl; 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.impl.TypeMap; import com.emc.storageos.db.client.upgrade.InternalDbClient; import com.emc.storageos.db.common.DataObjectScanner; import com.emc.storageos.db.common.DbServiceStatusChecker; import com.emc.storageos.db.common.VdcUtil; import com.emc.storageos.db.server.impl.MigrationHandlerImpl; import com.emc.storageos.db.server.impl.SchemaUtil; import com.emc.storageos.db.server.upgrade.util.InternalDbService; import com.emc.storageos.db.server.util.StubBeaconImpl; import com.emc.storageos.db.server.util.StubCoordinatorClientImpl; import com.emc.storageos.security.password.PasswordUtils; import com.emc.storageos.services.util.JmxServerWrapper; import com.emc.storageos.services.util.LoggingUtils; import org.apache.cassandra.config.Schema; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.beans.Introspector; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * The base class of DB service test */ public abstract class DbServiceTestBase { static { LoggingUtils.configureIfNecessary("dbtest-log4j.properties"); } private static Logger log = LoggerFactory.getLogger(DbServiceTestBase.class); protected InternalDbService dbsvc; protected DbClientImpl dbClient; protected DbVersionInfo dbVersionInfo; private static File dataDir; protected CoordinatorClient coordinator = new StubCoordinatorClientImpl( URI.create("thrift://localhost:9160")); protected static void removeDb() throws Exception { // Suppress Sonar violation of Lazy initialization of static fields should be synchronized // Junit test will be called in single thread by default, it's safe to ignore this violation dataDir = new File("./dbtest"); // NOSONAR ("squid:S2444") if (dataDir.exists() && dataDir.isDirectory()) { cleanDirectory(dataDir); } } /** * Deletes given directory * * @param dir */ protected static void cleanDirectory(File dir) { if (dir == null || dir.listFiles() == null) { return; } File[] files = dir.listFiles(); for (File file : files) { if (file.isDirectory()) { cleanDirectory(file); } else { file.delete(); } } dir.delete(); } /** * Start embedded DB */ protected void startDb(String schemaVersion, String extraModelsPkg) throws Exception { List<String> packages = new ArrayList<String>(); packages.add("com.emc.storageos.db.client.model"); if (extraModelsPkg != null) { packages.add(extraModelsPkg); } String[] pkgsArray = packages.toArray(new String[packages.size()]); ServiceImpl service = new ServiceImpl(); service.setName("dbsvc"); service.setVersion(schemaVersion); service.setEndpoint(URI.create("thrift://localhost:9160")); service.setId("db-standalone"); DataObjectScanner scanner = new DataObjectScanner(); scanner.setPackages(pkgsArray); scanner.init(); dbVersionInfo = new DbVersionInfo(); dbVersionInfo.setSchemaVersion(schemaVersion); coordinator.setDbVersionInfo(dbVersionInfo); DbServiceStatusChecker statusChecker = new DbServiceStatusChecker(); statusChecker.setCoordinator(coordinator); statusChecker.setClusterNodeCount(1); statusChecker.setDbVersionInfo(dbVersionInfo); statusChecker.setServiceName(service.getName()); CoordinatorClientInetAddressMap coordinatorMap = new CoordinatorClientInetAddressMap(); coordinatorMap.setNodeId("localhost"); coordinatorMap.setDualInetAddress(DualInetAddress.fromAddress("127.0.0.1")); Map<String, DualInetAddress> addressLookupMap = new HashMap<String, DualInetAddress>(); addressLookupMap.put(coordinatorMap.getNodeId(), coordinatorMap.getDualInetAddress()); coordinatorMap.setControllerNodeIPLookupMap(addressLookupMap); coordinatorMap.setCoordinatorClient(coordinator); coordinator.setInetAddessLookupMap(coordinatorMap); SchemaUtil util = new SchemaUtil(); util.setKeyspaceName("Test"); util.setClusterName("Test"); util.setDataObjectScanner(scanner); util.setService(service); util.setStatusChecker(statusChecker); util.setCoordinator(coordinator); util.setVdcShortId("vdc1"); util.setClientContext(createLocalContext()); List<String> vdcHosts = new ArrayList(); vdcHosts.add("127.0.0.1"); util.setVdcNodeList(vdcHosts); util.setDbCommonInfo(new java.util.Properties()); dbsvc = new InternalDbService(); dbsvc.setConfig("db-test.yaml"); dbsvc.setSchemaUtil(util); dbsvc.setCoordinator(coordinator); dbsvc.setStatusChecker(statusChecker); dbsvc.setService(service); dbsvc.setDbDir("."); JmxServerWrapper jmx = new JmxServerWrapper(); jmx.setEnabled(false); dbsvc.setJmxServerWrapper(jmx); dbClient = getDbClientBase(); dbsvc.setDbClient(dbClient); PasswordUtils passwordUtils = new PasswordUtils(); passwordUtils.setCoordinator(coordinator); EncryptionProviderImpl provider = new EncryptionProviderImpl(); provider.setCoordinator(coordinator); provider.start(); passwordUtils.setEncryptionProvider(provider); passwordUtils.setDbClient(dbClient); util.setPasswordUtils(passwordUtils); StubBeaconImpl beacon = new StubBeaconImpl(service); dbsvc.setBeacon(beacon); MigrationHandlerImpl handler = new MigrationHandlerImpl(); handler.setPackages(pkgsArray); handler.setService(service); handler.setStatusChecker(statusChecker); handler.setCoordinator(coordinator); handler.setDbClient(dbClient); handler.setSchemaUtil(util); dbsvc.setMigrationHandler(handler); dbsvc.setDisableScheduledDbRepair(true); dbsvc.start(); } protected DbClientImpl getDbClientBase() { InternalDbClient dbClient = new InternalDbClient(); dbClient.setCoordinatorClient(coordinator); dbClient.setDbVersionInfo(dbVersionInfo); dbClient.setBypassMigrationLock(true); dbClient.setLocalContext(createLocalContext()); VdcUtil.setDbClient(dbClient); return dbClient; } protected DbClientContext createLocalContext() { DbClientContext context = new DbClientContext(); context.setClusterName("Test"); context.setKeyspaceName("Test"); return context; } protected void stopDb() { TypeMap.clear(); Introspector.flushCaches(); if (dbsvc != null) { dbsvc.stop(); Schema.instance.clear(); log.info("The dbsvc is stopped"); } } protected static boolean isPreMigration() { return Boolean.parseBoolean(System.getProperty("preMigration")); } }