/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.util;
import com.emc.storageos.coordinator.client.service.CoordinatorClient;
import com.emc.storageos.coordinator.common.impl.ServiceImpl;
import com.emc.storageos.db.common.DataObjectScanner;
import com.emc.storageos.db.server.impl.DbServiceImpl;
import com.emc.storageos.db.server.impl.SchemaUtil;
import com.google.common.collect.Lists;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.text.StrSubstitutor;
import org.apache.log4j.Logger;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.util.Collections;
import java.util.List;
/**
* Starts up the ViPR DBSVC for testing
*
* @author dmaddison
*/
public class TestDbService {
private static Logger LOG = Logger.getLogger(TestDbService.class);
private CoordinatorClient coordinatorClient;
private List<String> modelPackages = Lists.newArrayList("com.emc.sa.model");
private DbServiceImpl dbsvc;
private static File dataDir = new File("dbtest");
public TestDbService(TestCoordinatorService coordinatorService) throws Exception {
this(coordinatorService.getCoordinatorClient());
}
public TestDbService(CoordinatorClient coordinatorClient) throws Exception {
this.coordinatorClient = coordinatorClient;
}
public void setDataDir(String dataDir) {
this.dataDir = new File(dataDir);
}
public void addModelPackage(String modelPackage) {
modelPackages.add(modelPackage);
}
/** Starts the Cassandra DB but deletes any existing data files first */
public void startClean() throws Exception {
FileUtils.deleteDirectory(dataDir);
start();
}
/** Starts the Cassandra DB, using any Persisted data files */
public void start() throws Exception {
if (dbsvc != null) {
return;
}
DataObjectScanner dataObjectScanner = new DataObjectScanner();
dataObjectScanner.setPackages(modelPackages.toArray(new String[0]));
dataObjectScanner.init();
ServiceImpl dummyDBService = new ServiceImpl();
dummyDBService.setName("dbsvc");
dummyDBService.setVersion("1");
dummyDBService.setEndpoint(URI.create("thrift://localhost:9170"));
dummyDBService.setId("foobar");
SchemaUtil schemaUtil = new SchemaUtil();
schemaUtil.setKeyspaceName("Testing");
schemaUtil.setService(dummyDBService);
schemaUtil.setCoordinator(coordinatorClient);
schemaUtil.setDataObjectScanner(dataObjectScanner);
String config = createConfig(dataDir.getAbsolutePath());
dbsvc = new DbServiceImpl();
dbsvc.setConfig(config);
dbsvc.setSchemaUtil(schemaUtil);
dbsvc.setCoordinator(coordinatorClient);
dbsvc.setService(dummyDBService);
dbsvc.start();
}
/** Stops the Database service, deleting all persistent data files */
public void destroy() throws Exception {
stop();
FileUtils.deleteDirectory(dataDir);
}
/** Stops the Cassandra DB, keeping all persistent data intact */
public void stop() throws Exception {
dbsvc.stop();
dbsvc = null;
}
private static String createConfig(String rootDir) throws IOException {
URL configURL = TestDbService.class.getResource("db-test.yaml");
if (configURL == null) {
throw new IllegalStateException("Could not find cassandra.yaml");
}
File path = FileUtils.toFile(configURL);
String data = FileUtils.readFileToString(path, "UTF-8");
StrSubstitutor substitutor = new StrSubstitutor(Collections.singletonMap("rootDir", rootDir));
String contents = substitutor.replace(data);
File configFile = File.createTempFile("db-test", ".yaml");
configFile.deleteOnExit();
FileUtils.writeStringToFile(configFile, contents, "UTF-8");
return "file:" + configFile.getAbsolutePath();
}
}