/* * Copyright (c) 2008-2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.coordinator.client.service; import com.emc.storageos.coordinator.client.beacon.ServiceBeacon; import com.emc.storageos.coordinator.client.beacon.impl.ServiceBeaconImpl; import com.emc.storageos.coordinator.client.model.Constants; 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.ServiceImpl; import com.emc.storageos.coordinator.common.impl.ZkConnection; import com.emc.storageos.coordinator.service.impl.CoordinatorImpl; import com.emc.storageos.coordinator.service.impl.SpringQuorumPeerConfig; import org.junit.BeforeClass; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.UnknownHostException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; /** * Coordinator unit test base that contains basic startup / teardown utilities */ // Suppress Sonar violation of Lazy initialization of static fields should be synchronized // There's only one thread initializing and using _dataDir and _coordinator, so it's safe. @SuppressWarnings("squid:S2444") public class CoordinatorTestBase { private static final Logger _logger = LoggerFactory.getLogger(CoordinatorTestBase.class); protected static File _dataDir; protected static CoordinatorImpl _coordinator; /** * Deletes given directory * * @param dir */ protected static void cleanDirectory(File dir) { File[] files = dir.listFiles(); if (files == null) { return; } for (File file : files) { if (file.isDirectory()) { cleanDirectory(file); } else { file.delete(); } } dir.delete(); } /** * Connects to test coordinator * * @return connected client * @throws Exception */ protected static CoordinatorClient connectClient() throws Exception { CoordinatorClientImpl client = new CoordinatorClientImpl(); client.setZkConnection(createConnection(10 * 1000)); client.setInetAddessLookupMap(createLocalInetAddressLookupMap()); client.setVdcShortId("vdc1"); client.start(); return client; } protected static CoordinatorClient connectClient(List<URI> server) throws Exception { CoordinatorClientImpl client = new CoordinatorClientImpl(); ZkConnection conn = new ZkConnection(); conn.setServer(server); conn.setTimeoutMs(10 * 1000); System.out.println("Connecting with coordinator service..."); conn.build(); System.out.println("Connecting with coordinator service."); client.setZkConnection(conn); client.start(); return client; } protected static ZkConnection createConnection(int timeoutMs) throws IOException { ZkConnection conn = new ZkConnection(); conn.setServer(Arrays.asList(URI.create("coordinator://localhost:2181"))); conn.setTimeoutMs(timeoutMs); conn.setSiteId("fake-site-id"); conn.setSiteIdFile("fake-site-id-file"); conn.build(); return conn; } protected static ServiceBeacon createBeacon(ServiceImpl service, int timeoutMs) throws IOException { ServiceBeaconImpl beacon = new ServiceBeaconImpl(); beacon.setService(service); beacon.setZkConnection(createConnection(timeoutMs)); return beacon; } protected static CoordinatorClientInetAddressMap createLocalInetAddressLookupMap() throws UnknownHostException { CoordinatorClientInetAddressMap lookup = new CoordinatorClientInetAddressMap(); lookup.setNodeId("localhost"); lookup.setDualInetAddress(DualInetAddress.fromAddress("127.0.0.1")); Map<String, DualInetAddress> addressMap = new HashMap<>(); addressMap.put(lookup.getNodeId(), lookup.getDualInetAddress()); lookup.setControllerNodeIPLookupMap(addressMap); return lookup; } /** * Bootstraps test coordinator * * @throws Exception */ protected static void startCoordinator() throws Exception { SpringQuorumPeerConfig config = new SpringQuorumPeerConfig(); config.setMachineId(1); Properties zkprop = new Properties(); zkprop.setProperty("tickTime", "2000"); zkprop.setProperty("dataDir", _dataDir.getAbsolutePath()); zkprop.setProperty("clientPort", "2181"); zkprop.setProperty("initLimit", "5"); zkprop.setProperty("syncLimit", "2"); zkprop.setProperty("maxClientCnxns", "0"); zkprop.setProperty("autopurge.purgeInterval", "30"); zkprop.setProperty("autopurge.snapRetainCount", "16"); config.setProperties(zkprop); config.init(); _coordinator = new CoordinatorImpl(); _coordinator.setConfig(config); new Thread(new Runnable() { @Override public void run() { try { _coordinator.start(); } catch (IOException e) { _logger.error("coordinator start failure", e); } } }).start(); } @BeforeClass public static void setup() throws Exception { _dataDir = new File("./dqtest"); if (_dataDir.exists() && _dataDir.isDirectory()) { cleanDirectory(_dataDir); } startCoordinator(); } }