/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.model.mock;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.util.Collections;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.text.StrSubstitutor;
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;
public class LocalCassandraService {
public static final String DEFAULT_CLUSTER_NAME = "StorageOS";
public static final String DEFAULT_KEYSPACE_NAME = "StorageOS";
private String configResource = "db-mock.yaml";
private File rootDir;
private DbServiceImpl dbService;
private CoordinatorClient coordinator = new StubCoordinatorClientImpl(URI.create("thrift://localhost:9160"));
private boolean clean;
public String getConfigResource() {
return configResource;
}
public void setConfigResource(String configResource) {
this.configResource = configResource;
}
public File getRootDir() {
return rootDir;
}
public void setRootDir(File rootDir) {
this.rootDir = rootDir;
}
public DbServiceImpl getDbService() {
return dbService;
}
public void setDbService(DbServiceImpl dbService) {
this.dbService = dbService;
}
public CoordinatorClient getCoordinator() {
return coordinator;
}
public void setCoordinator(CoordinatorClient coordinator) {
this.coordinator = coordinator;
}
public boolean isClean() {
return clean;
}
public void setClean(boolean clean) {
this.clean = clean;
}
/**
* Generates a configuration for running a local cassandra instance.
*
* @param configResource
* the configuration resource name.
* @param rootDir
* the root directory for the cassandra instance.
* @return the configuration location.
*
* @throws IOException
* if an I/O error occurs.
*/
private static String createConfig(String configResource, String rootDir) throws IOException {
URL configURL = LocalCassandraService.class.getResource(configResource);
if (configURL == null) {
throw new IllegalStateException("Could not find " + configResource);
}
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("config", ".yaml");
configFile.deleteOnExit();
FileUtils.writeStringToFile(configFile, contents, "UTF-8");
return "file:" + configFile.getAbsolutePath();
}
/**
* Deletes given directory
*
* @param dir
*/
protected static void cleanDirectory(File dir) {
for (File file : dir.listFiles()) {
if (file.isDirectory()) {
cleanDirectory(file);
}
else {
file.delete();
}
}
dir.delete();
}
@PostConstruct
public void init() throws IOException {
if (clean && rootDir.isDirectory()) {
cleanDirectory(rootDir);
}
startDb();
}
@PreDestroy
public void stop() {
if (dbService != null) {
dbService.stop();
}
if (clean) {
cleanDirectory(rootDir);
}
}
private void startDb() throws IOException {
ServiceImpl service = new ServiceImpl();
service.setName("dbsvc");
service.setEndpoint(URI.create("thrift://localhost:9160"));
service.setId("foobar");
DataObjectScanner scanner = new DataObjectScanner();
scanner.setPackages("com.emc.sa.model");
scanner.init();
SchemaUtil util = new SchemaUtil();
util.setKeyspaceName(DEFAULT_KEYSPACE_NAME);
util.setClusterName(DEFAULT_CLUSTER_NAME);
util.setDataObjectScanner(scanner);
util.setService(service);
dbService = new DbServiceImpl();
dbService.setConfig(createConfig(configResource, rootDir.getAbsolutePath()));
dbService.setSchemaUtil(util);
dbService.setCoordinator(coordinator);
dbService.setService(service);
dbService.start();
}
}