/*
* Copyright (c) 2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.management.backup;
import com.emc.storageos.coordinator.client.service.CoordinatorClient;
import com.emc.storageos.coordinator.client.service.impl.CoordinatorClientImpl;
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.ZkConnection;
import com.emc.storageos.coordinator.service.impl.SpringQuorumPeerConfig;
import org.apache.zookeeper.server.ServerConfig;
import org.apache.zookeeper.server.ZooKeeperServerMain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Properties;
/**
* Zookeeper simulator to start Zookeeper server on localhost with specified configurations.
*/
public class ZkSimulator {
private static final Logger log = LoggerFactory.getLogger(ZkSimulator.class);
private SpringQuorumPeerConfig config;
private CoordinatorClient coordinatorClient;
private final String ovfPropsLocation = "/etc/ovfenv.properties";
public ZkSimulator() {
}
/**
* Sets Zookeeper configuration file
*
* @param config The instance of SpringQuorumPeerConfig
*/
public void setConfig(SpringQuorumPeerConfig config) {
this.config = config;
}
/**
* Starts standalone Zookeeper service
*/
public void start() throws Exception {
final ServerConfig serverConfig = new ServerConfig();
serverConfig.readFrom(config);
final ZooKeeperServerMain server = new ZooKeeperServerMain();
Thread zkService = new Thread(new Runnable() {
@Override
public void run() {
try {
server.runFromConfig(serverConfig);
} catch (IOException e) {
log.error("coordinator start failure", e);
}
}
});
zkService.setDaemon(true);
zkService.start();
coordinatorClient = connectClient();
}
/**
* Gets coordinatorClient and connect client if client is not exist or connected.
*
* @return The instance of CoordinatorClient
* @throws IOException
*/
public CoordinatorClient getCoordinatorClient() throws IOException {
if (coordinatorClient == null || !coordinatorClient.isConnected()) {
coordinatorClient = connectClient();
}
return coordinatorClient;
}
/**
* Connects to Zookeeper server
*
* @return The instance of CoordinatorClient
* @throws IOException
*/
private CoordinatorClient connectClient() throws IOException {
CoordinatorClientImpl client = new CoordinatorClientImpl();
ZkConnection conn = new ZkConnection();
URI zkUri = URI.create(
String.format("coordinator://localhost:%s", config.getClientPortAddress().getPort()));
conn.setServer(Arrays.asList(zkUri));
conn.setTimeoutMs(10 * 1000);
conn.setSiteIdFile("build/data/zk/siteIdFile");
log.info("Connecting with coordinator service...");
conn.build();
log.info("Connecting with coordinator service.");
client.setZkConnection(conn);
CoordinatorClientInetAddressMap inetAddressMap = new CoordinatorClientInetAddressMap();
inetAddressMap.setNodeId("standalone");
inetAddressMap.setDualInetAddress(DualInetAddress.fromAddress("127.0.0.1"));
inetAddressMap.setCoordinatorClient(client);
inetAddressMap.setControllerNodeIPLookupMap(new HashMap<String, DualInetAddress>());
client.setInetAddessLookupMap(inetAddressMap);
client.setSysSvcName("syssvc");
client.setSysSvcVersion("1");
client.setVdcShortId("vdc1");
Properties properties = new Properties();
properties.setProperty(BackupConstants.BACKUP_MAX_MANUAL_COPIES, "5");
client.setDefaultProperties(properties);
FileInputStream is = new FileInputStream(ovfPropsLocation);
Properties ovfProps = new Properties();
ovfProps.load(is);
is.close();
client.setOvfProperties(ovfProps);
client.start();
return client;
}
}