/*************************************************************************** * Copyright (c) 2013 VMware, Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ***************************************************************************/ package com.vmware.vhadoop.vhm; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.junit.Before; import org.junit.Test; import com.vmware.vhadoop.api.vhm.ClusterMap.ExtraInfoToClusterMapper; import com.vmware.vhadoop.api.vhm.HadoopActions.HadoopClusterInfo; import com.vmware.vhadoop.api.vhm.VCActions.VMEventData; import com.vmware.vhadoop.api.vhm.events.ClusterScaleCompletionEvent; import com.vmware.vhadoop.api.vhm.events.ClusterScaleEvent; import com.vmware.vhadoop.api.vhm.events.ClusterStateChangeEvent.SerengetiClusterVariableData; import com.vmware.vhadoop.api.vhm.events.ClusterStateChangeEvent.VMVariableData; import com.vmware.vhadoop.api.vhm.strategy.ScaleStrategy; import com.vmware.vhadoop.vhm.events.AbstractClusterScaleEvent; import com.vmware.vhadoop.vhm.events.ClusterScaleDecision; import com.vmware.vhadoop.vhm.events.ClusterUpdateEvent; import com.vmware.vhadoop.vhm.events.VmRemovedFromClusterEvent; import com.vmware.vhadoop.vhm.events.VmUpdateEvent; public class ClusterMapTest extends AbstractJUnitTest { AbstractClusterMap _clusterMap; static final String EXTRA_INFO_KEY = "extraInfo1"; List<Boolean> _isNewClusterResult; List<Boolean> _isClusterViableResult; ClusterStateChangeListenerImpl cscl = new ClusterStateChangeListenerImpl(new StandaloneSimpleVCActions(), null); @Override void processNewEventData(VMEventData eventData, String expectedClusterId, Set<ClusterScaleEvent> impliedScaleEvents) { String clusterId = _clusterMap.handleClusterEvent(cscl.translateVMEventData(eventData), impliedScaleEvents); assertEquals(expectedClusterId, clusterId); } private void changeMasterVmPowerStateForClusterName(String clusterName, boolean powerState) { VMVariableData vmVariableData = new VMVariableData(); vmVariableData._powerState = powerState; _clusterMap.handleClusterEvent(new VmUpdateEvent(getMasterVmIdForCluster(clusterName), vmVariableData), null); } @Override void registerScaleStrategy(ScaleStrategy scaleStrategy) { _clusterMap.registerScaleStrategy(scaleStrategy); } class ImpliedScaleEvent extends AbstractClusterScaleEvent { Integer _data; ImpliedScaleEvent(String clusterId, Integer data) { super("implied scale event (test)"); setClusterId(clusterId); _data = data; } @Override public boolean isExclusive() { return false; } } @Before public void initialize() { _isNewClusterResult = new ArrayList<Boolean>(); _isClusterViableResult = new ArrayList<Boolean>(); _clusterMap = new ClusterMapImpl(new ExtraInfoToClusterMapper() { @Override public String getStrategyKey(SerengetiClusterVariableData scvd, String clusterId) { if ((scvd != null) && (scvd._enableAutomation)) { return OTHER_SCALE_STRATEGY_KEY; } return DEFAULT_SCALE_STRATEGY_KEY; } @Override public Map<String, String> parseExtraInfo(SerengetiClusterVariableData scvd, String clusterId) { Map<String, String> result = null; if (scvd != null) { Integer minInstances = scvd._minInstances; if (minInstances != null) { result = new HashMap<String, String>(); result.put(EXTRA_INFO_KEY, minInstances.toString()); } } return result; } @Override /* All new clusters will be non-viable, but not all non-viable clusters will be new */ public Set<ClusterScaleEvent> getImpliedScaleEventsForUpdate(SerengetiClusterVariableData scvd, String clusterId, boolean isNewCluster, boolean isClusterViable) { _isNewClusterResult.add(isNewCluster); _isClusterViableResult.add(isClusterViable); if (!isNewCluster && (scvd != null) && (scvd._minInstances != null)) { int minInstances = scvd._minInstances; if (minInstances >= 0) { Set<ClusterScaleEvent> newSet = new LinkedHashSet<ClusterScaleEvent>(); newSet.add(new ImpliedScaleEvent(clusterId, minInstances)); return newSet; } } return null; } }); } @Test public void getAllKnownClusterIds() { int numClusterIds = 3; populateSimpleClusterMap(numClusterIds, 4, false); Set<String> knownClusterIds = _clusterMap.getAllKnownClusterIds(); assertEquals(numClusterIds, knownClusterIds.size()); for (String masterVmName : _masterVmNames) { String clusterId = getClusterIdForMasterVmName(masterVmName); assertTrue(knownClusterIds.contains(clusterId)); String masterVmId = _clusterMap.getMasterVmIdForCluster(clusterId); assertEquals(getVmIdFromVmName(masterVmName), masterVmId); } assertNull(_clusterMap.getMasterVmIdForCluster("bogus")); assertNull(_clusterMap.getMasterVmIdForCluster(null)); } @Test public void getClusterIdForName() { int numClusterIds = 3; populateSimpleClusterMap(numClusterIds, 4, false); assertEquals(numClusterIds, _clusterNames.size()); for (String clusterName : _clusterNames) { String clusterId = _clusterMap.getClusterIdForName(clusterName); assertEquals(deriveClusterIdFromClusterName(clusterName), clusterId); } /* Negative tests */ assertNull(_clusterMap.getClusterIdForName("bogus")); assertNull(_clusterMap.getClusterIdForName(null)); } @Test public void getClusterIdForVm() { int numClusterIds = 3; int numVmsPerCluster = 4; populateSimpleClusterMap(numClusterIds, numVmsPerCluster, false); assertEquals(numClusterIds * numVmsPerCluster, _vmNames.size()); for (String vmName : _vmNames) { String vmId = getVmIdFromVmName(vmName); assertEquals(deriveClusterIdFromVmName(vmName), _clusterMap.getClusterIdForVm(vmId)); } /* Negative tests */ assertNull(_clusterMap.getClusterIdForVm("bogus")); assertNull(_clusterMap.getClusterIdForVm(null)); } @Test public void getDnsNamesForVMs() { int numClusterIds = 3; populateSimpleClusterMap(numClusterIds, 4, true); Set<String> vmIds = getVmIdsFromVmNames(_vmNames); Map<String, String> dnsNames = _clusterMap.getDnsNamesForVMs(vmIds); assertEquals(_vmNames.size(), dnsNames.size()); for (String vmName : _vmNames) { String vmId = getVmIdFromVmName(vmName); assertEquals(dnsNames.get(vmId), getDnsNameFromVmName(vmName)); } /* Negative tests */ assertNull(_clusterMap.getDnsNamesForVMs(getBogusSet())); assertNull(_clusterMap.getDnsNamesForVMs(getEmptySet())); assertNull(_clusterMap.getDnsNamesForVMs(null)); assertNull(_clusterMap.getDnsNameForVM("bogus")); assertNull(_clusterMap.getDnsNameForVM(null)); } @Test public void getVmIdsForDnsName() { int numClusterIds = 3; populateSimpleClusterMap(numClusterIds, 4, true); Set<String> vmIds = getVmIdsFromVmNames(_vmNames); Map<String, String> dnsNames = _clusterMap.getDnsNamesForVMs(vmIds); Map<String, String> vmIdMap = _clusterMap.getVmIdsForDnsNames(new HashSet<String>(dnsNames.values())); assertEquals(dnsNames.size(), vmIdMap.size()); for (String vmId : vmIdMap.values()) { assertTrue(vmIds.contains(vmId)); } /* Negative tests */ assertNull(_clusterMap.getVmIdsForDnsNames(getBogusSet())); assertNull(_clusterMap.getVmIdsForDnsNames(getEmptySet())); assertNull(_clusterMap.getVmIdsForDnsNames(null)); assertNull(_clusterMap.getVmIdForDnsName("bogus")); assertNull(_clusterMap.getVmIdForDnsName(null)); } @Test public void getHadoopInfoForCluster() { String clusterName0 = CLUSTER_NAME_PREFIX+0; String clusterName1 = CLUSTER_NAME_PREFIX+1; populateClusterSameHost(clusterName0, "DEFAULT_HOST", 4, true, false, 0, null); populateClusterSameHost(clusterName1, "DEFAULT_HOST", 4, false, false, 1, null); String clusterId = deriveClusterIdFromClusterName(clusterName0); HadoopClusterInfo hci = _clusterMap.getHadoopInfoForCluster(clusterId); assertNotNull(hci); assertEquals(deriveMasterDnsNameFromClusterId(clusterId), hci.getJobTrackerDnsName()); assertEquals((Integer)DEFAULT_PORT, hci.getJobTrackerPort()); String masterVmName = getMasterVmNameForCluster(clusterName0); String masterDnsName = getDnsNameFromVmName(masterVmName); assertEquals(masterDnsName, hci.getJobTrackerDnsName()); changeMasterVmPowerStateForClusterName(clusterName1, false); clusterId = deriveClusterIdFromClusterName(clusterName1); hci = _clusterMap.getHadoopInfoForCluster(clusterId); assertNull(hci); /* If the cluster is not powered on, we should get null */ /* Negative tests */ assertNull(_clusterMap.getHadoopInfoForCluster("bogus")); assertNull(_clusterMap.getHadoopInfoForCluster(null)); } @Test public void getHostIdForVM() { int numClusterIds = 3; populateClusterPerHost(numClusterIds, 4, false); for (String vmName : _vmNames) { String hostId = _clusterMap.getHostIdForVm(getVmIdFromVmName(vmName)); String expected = deriveHostIdFromVmName(vmName); assertEquals(expected, hostId); } /* Negative tests */ assertNull(_clusterMap.getHostIdForVm("bogus")); assertNull(_clusterMap.getHostIdForVm(null)); } @Test public void getHostIdsForVMs() { int numClusterIds = 3; populateClusterPerHost(numClusterIds, 4, false); Set<String> vmIds = getVmIdsFromVmNames(_vmNames); Map<String, String> hostIds = _clusterMap.getHostIdsForVMs(vmIds); assertEquals(vmIds.size(), hostIds.keySet().size()); for (String vmId : vmIds) { String hostId = hostIds.get(vmId); assertNotNull(hostId); assertEquals(deriveHostIdFromVmId(vmId), hostId); } /* Negative tests */ assertNull(_clusterMap.getHostIdsForVMs(getBogusSet())); assertNull(_clusterMap.getHostIdsForVMs(getEmptySet())); assertNull(_clusterMap.getHostIdsForVMs(null)); } @Test public void getLastClusterScaleCompletionEvent() { int numClusterIds = 3; populateSimpleClusterMap(numClusterIds, 4, false); for (String clusterName : _clusterNames) { String clusterId = deriveClusterIdFromClusterName(clusterName); assertNull(_clusterMap.getLastClusterScaleCompletionEvent(clusterId)); ClusterScaleCompletionEvent cse = new ClusterScaleDecision(clusterId); _clusterMap.handleCompletionEvent(cse); assertEquals(cse, _clusterMap.getLastClusterScaleCompletionEvent(clusterId)); /* Check that most recent event is returned */ ClusterScaleCompletionEvent cse2 = new ClusterScaleDecision(clusterId); _clusterMap.handleCompletionEvent(cse2); assertEquals(cse2, _clusterMap.getLastClusterScaleCompletionEvent(clusterId)); } /* Negative tests */ assertNull(_clusterMap.getLastClusterScaleCompletionEvent(null)); assertNull(_clusterMap.getLastClusterScaleCompletionEvent("bogus")); } @Test public void testScaleStrategies() { populateClusterSameHost(CLUSTER_NAME_PREFIX+0, "DEFAULT_HOST", 4, false, false, 0, null); populateClusterSameHost(CLUSTER_NAME_PREFIX+1, "DEFAULT_HOST", 4, false, false, 1, null); populateClusterSameHost(CLUSTER_NAME_PREFIX+2, "DEFAULT_HOST", 4, false, true, 2, null); String cid0 = deriveClusterIdFromClusterName(CLUSTER_NAME_PREFIX+0); ScaleStrategy ss0 = _clusterMap.getScaleStrategyForCluster(cid0); assertEquals(DEFAULT_SCALE_STRATEGY_KEY, ss0.getKey()); String cid1 = deriveClusterIdFromClusterName(CLUSTER_NAME_PREFIX+1); ScaleStrategy ss1 = _clusterMap.getScaleStrategyForCluster(cid1); assertEquals(DEFAULT_SCALE_STRATEGY_KEY, ss1.getKey()); String cid2 = deriveClusterIdFromClusterName(CLUSTER_NAME_PREFIX+2); ScaleStrategy ss2 = _clusterMap.getScaleStrategyForCluster(cid2); assertEquals(OTHER_SCALE_STRATEGY_KEY, ss2.getKey()); ScaleStrategy ssBogus = _clusterMap.getScaleStrategyForCluster("bogus"); assertNull(ssBogus); /* Change ss1 to use AUTO */ ClusterUpdateEvent scaleStrategyChange = createScaleStrategyChangeEvent(CLUSTER_NAME_PREFIX+1, true); _clusterMap.handleClusterEvent(scaleStrategyChange, null); ss1 = _clusterMap.getScaleStrategyForCluster(cid1); assertEquals(OTHER_SCALE_STRATEGY_KEY, ss1.getKey()); assertEquals(OTHER_SCALE_STRATEGY_KEY, _clusterMap.getScaleStrategyKey(cid1)); /* Negative tests */ assertNull(_clusterMap.getScaleStrategyForCluster(null)); assertNull(_clusterMap.getScaleStrategyForCluster("bogus")); assertNull(_clusterMap.getScaleStrategyKey(null)); assertNull(_clusterMap.getScaleStrategyKey("bogus")); } private ClusterUpdateEvent createScaleStrategyChangeEvent(String clusterName, boolean enableAuto) { String masterVmId = getMasterVmIdForCluster(clusterName); SerengetiClusterVariableData vData = new SerengetiClusterVariableData(); vData._enableAutomation = enableAuto; ClusterUpdateEvent cue = new ClusterUpdateEvent(masterVmId, vData); return cue; } @Test public void powerStateAndListTests() { /* Create 3 clusters, each with 3 compute VMs and a master. Two have vms powered one and one cluster is powered off */ populateClusterSameHost(CLUSTER_NAME_PREFIX+0, "DEFAULT_HOST1", 4, false, false, 0, null); populateClusterSameHost(CLUSTER_NAME_PREFIX+1, "DEFAULT_HOST1", 4, true, false, 1, null); populateClusterSameHost(CLUSTER_NAME_PREFIX+2, "DEFAULT_HOST2", 4, true, true, 2, null); /* Note expected result is 3, not 4, since 3 VMs are compute VMs and 1 is master */ Integer[][] expectedSizes1 = new Integer[][]{new Integer[]{3, null}, new Integer[]{null, 3}, new Integer[]{null, 3}}; boolean[] expectMatch1 = new boolean[]{true, true, false}; boolean[] expectMatch2 = new boolean[]{false, false, true}; /* For each cluster */ for (int i=0; i<3; i++) { String clusterName = CLUSTER_NAME_PREFIX+i; String clusterId = deriveClusterIdFromClusterName(clusterName); /* For each power state */ for (int j=0; j<2; j++) { boolean expectedPowerState = (j==1); Set<String> computeVMs = _clusterMap.listComputeVMsForClusterAndPowerState(clusterId, expectedPowerState); Integer result = (computeVMs == null) ? null : computeVMs.size(); assertEquals(expectedSizes1[i][j], result); if (computeVMs != null) { assertTrue(_clusterMap.checkPowerStateOfVms(computeVMs, expectedPowerState)); assertFalse(_clusterMap.checkPowerStateOfVms(computeVMs, !expectedPowerState)); if (expectedPowerState) { assertNotNull(_clusterMap.getPowerOnTimeForVm(computeVMs.iterator().next())); } assertEquals(clusterId, _clusterMap.getClusterIdFromVMs(new ArrayList<String>(computeVMs))); /* Check that the compute VM names returned contain the cluster name */ for (String computeVM : computeVMs) { assertTrue(computeVM.contains(clusterName)); } /* Add host restrictions and check results against original results */ Set<String> computeVMs2 = _clusterMap.listComputeVMsForClusterHostAndPowerState(clusterId, MOREF_PREFIX+"DEFAULT_HOST1", (j==1)); if (expectMatch1[i]) { assertEquals(computeVMs.size(), computeVMs2.size()); } else if (computeVMs2 != null) { assertTrue(computeVMs.size() != computeVMs2.size()); } computeVMs2 = _clusterMap.listComputeVMsForClusterHostAndPowerState(clusterId, MOREF_PREFIX+"DEFAULT_HOST2", (j==1)); if (expectMatch2[i]) { assertEquals(computeVMs.size(), computeVMs2.size()); } else if (computeVMs2 != null) { assertTrue(computeVMs.size() != computeVMs2.size()); } } } Set<String> hostIds = _clusterMap.listHostsWithComputeVMsForCluster(clusterId); assertEquals(1, hostIds.size()); String extraInfo = _clusterMap.getExtraInfo(clusterId, EXTRA_INFO_KEY); assertEquals(Integer.parseInt(extraInfo), i); } assertEquals(3, _clusterMap.listComputeVMsForPowerState(false).size()); assertEquals(6, _clusterMap.listComputeVMsForPowerState(true).size()); /* Negative tests */ assertNull(_clusterMap.listComputeVMsForClusterAndPowerState("bogus", false)); assertNull(_clusterMap.listComputeVMsForClusterAndPowerState(null, false)); assertNull(_clusterMap.listComputeVMsForClusterHostAndPowerState("bogus", "bogus", false)); assertNull(_clusterMap.listComputeVMsForClusterHostAndPowerState(null, null, false)); assertNull(_clusterMap.checkPowerStateOfVms(null, false)); assertNull(_clusterMap.checkPowerStateOfVms(getEmptySet(), false)); assertNull(_clusterMap.checkPowerStateOfVms(getBogusSet(), false)); assertNull(_clusterMap.checkPowerStateOfVm(null, false)); assertNull(_clusterMap.checkPowerStateOfVm("bogus", false)); assertNull(_clusterMap.listHostsWithComputeVMsForCluster("bogus")); assertNull(_clusterMap.listHostsWithComputeVMsForCluster(null)); assertNull(_clusterMap.getClusterIdFromVMs(null)); assertNull(_clusterMap.getClusterIdFromVMs(new ArrayList<String>(getEmptySet()))); assertNull(_clusterMap.getClusterIdFromVMs(new ArrayList<String>(getBogusSet()))); assertNull(_clusterMap.getPowerOnTimeForVm("bogus")); assertNull(_clusterMap.getPowerOnTimeForVm(null)); assertNull(_clusterMap.getExtraInfo("bogus", null)); assertNull(_clusterMap.getExtraInfo(null, null)); assertNull(_clusterMap.getExtraInfo(null, "bogus")); assertNull(_clusterMap.getExtraInfo("bogus", "bogus")); assertEquals(1, _clusterMap.getAllClusterIdsForScaleStrategyKey(OTHER_SCALE_STRATEGY_KEY).size()); assertEquals(2, _clusterMap.getAllClusterIdsForScaleStrategyKey(DEFAULT_SCALE_STRATEGY_KEY).size()); assertNull(_clusterMap.getAllClusterIdsForScaleStrategyKey(null)); assertNull(_clusterMap.getAllClusterIdsForScaleStrategyKey("bogus")); } @Test public void getVCPU() { populateClusterSameHost(CLUSTER_NAME_PREFIX+0, "DEFAULT_HOST1", 4, false, false, 0, null); for (String vmName : _vmNames) { String vmId = getVmIdFromVmName(vmName); assertEquals((Integer)DEFAULT_VCPUS, _clusterMap.getNumVCPUsForVm(vmId)); } /* Negative tests */ assertNull(_clusterMap.getNumVCPUsForVm("bogus")); assertNull(_clusterMap.getNumVCPUsForVm(null)); } @Test public void testRemoveVM() { String clusterName = CLUSTER_NAME_PREFIX+0; String clusterId = deriveClusterIdFromClusterName(clusterName); populateClusterSameHost(clusterName, "DEFAULT_HOST1", 4, false, false, 0, null); Set<String> vms = _clusterMap.listComputeVMsForClusterAndPowerState(clusterId, false); int runningTotal = 3; assertEquals(runningTotal, vms.size()); /* Remove the compute VMs */ for (String vmId : vms) { --runningTotal; _clusterMap.handleClusterEvent(new VmRemovedFromClusterEvent(vmId), null); Set<String> remaining = _clusterMap.listComputeVMsForClusterAndPowerState(clusterId, false); if (runningTotal > 0) { assertEquals(runningTotal, remaining.size()); assertFalse(remaining.contains(vmId)); } else { assertNull(remaining); } } /* Cluster should still be there */ String masterVmId = getMasterVmIdForCluster(clusterName); assertEquals(clusterId, _clusterMap.getClusterIdForVm(masterVmId)); /* Remove master VM and the cluster should be removed also */ _clusterMap.handleClusterEvent(new VmRemovedFromClusterEvent(masterVmId), null); assertNull(_clusterMap.getClusterIdForVm(getVmIdFromVmName(masterVmId))); assertNull(_clusterMap.getAllKnownClusterIds()); } private ClusterUpdateEvent createNewInstancesChangeUpdate(Integer newMinInstances, Integer newMaxInstances, String clusterName) { String masterVmName = getMasterVmNameForCluster(clusterName); SerengetiClusterVariableData cvd = new SerengetiClusterVariableData(); cvd._minInstances = newMinInstances; cvd._maxInstances = newMaxInstances; ClusterUpdateEvent cue = new ClusterUpdateEvent(getVmIdFromVmName(masterVmName), cvd); return cue; } @Test public void testImpliedScaleEvents() { String clusterName = CLUSTER_NAME_PREFIX+0; /* Create new non-viable cluster */ populateClusterSameHost("NonViableCluster", "DEFAULT_HOST1", 4, false, false, 0, null); assertEquals(1, _isNewClusterResult.size()); assertEquals(false, _isClusterViableResult.get(0)); assertEquals(true, _isNewClusterResult.get(0)); populateClusterSameHost(clusterName, "DEFAULT_HOST1", 4, true, false, 0, null); assertEquals(2, _isNewClusterResult.size()); assertEquals(false, _isClusterViableResult.get(1)); assertEquals(true, _isNewClusterResult.get(1)); Integer newInstances = 3; /* This set will contain any implied events created by the cluster state change */ Set<ClusterScaleEvent> impliedScaleEventsResultSet = new HashSet<ClusterScaleEvent>(); _clusterMap.handleClusterEvent(createNewInstancesChangeUpdate(newInstances, -1, clusterName), impliedScaleEventsResultSet); assertEquals(1, impliedScaleEventsResultSet.size()); /* We should have a new event */ assertEquals(3, _isNewClusterResult.size()); assertEquals(true, _isClusterViableResult.get(2)); assertEquals(false, _isNewClusterResult.get(2)); /* This is not a new cluster, rather an update to an existing cluster */ /* Validate the contents of the generated event */ ImpliedScaleEvent impliedScaleEvent = (ImpliedScaleEvent)impliedScaleEventsResultSet.iterator().next(); assertEquals(newInstances, impliedScaleEvent._data); impliedScaleEventsResultSet.clear(); /* Create a new cluster map update, but one which our ExtraInfoToClusterMapper has been coded to ignore */ _clusterMap.handleClusterEvent(createNewInstancesChangeUpdate(-1, -1, clusterName), impliedScaleEventsResultSet); assertEquals(0, impliedScaleEventsResultSet.size()); /* Verify that an event was not generated */ assertEquals(4, _isNewClusterResult.size()); /* Verify that getImpliedScaleEventsForUpdate was invoked */ assertEquals(true, _isClusterViableResult.get(3)); assertEquals(false, _isNewClusterResult.get(3)); } @Test public void validateClusterCompleteness() { String hostName = "DEFAULT_HOST1"; populateClusterSameHost(CLUSTER_NAME_PREFIX+0, hostName, 4, false, false, 0, null); /* Complete cluster, powered off */ populateClusterSameHost(CLUSTER_NAME_PREFIX+1, hostName, 4, true, false, 0, null); /* Complete cluster, powered on */ populateClusterSameHost(CLUSTER_NAME_PREFIX+2, hostName, 1, false, false, 0, null); /* Incomplete cluster - no compute VMs */ String clusterId0 = deriveClusterIdFromClusterName(CLUSTER_NAME_PREFIX+0); assertTrue(_clusterMap.validateClusterCompleteness(clusterId0, 0)); assertTrue(_clusterMap.validateClusterCompleteness(clusterId0, 500)); String clusterId1 = deriveClusterIdFromClusterName(CLUSTER_NAME_PREFIX+1); assertTrue(_clusterMap.validateClusterCompleteness(clusterId1, 0)); assertTrue(_clusterMap.validateClusterCompleteness(clusterId1, 500)); String clusterId2 = deriveClusterIdFromClusterName(CLUSTER_NAME_PREFIX+2); assertFalse(_clusterMap.validateClusterCompleteness(clusterId2, 0)); assertFalse(_clusterMap.validateClusterCompleteness(clusterId2, 500)); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } assertFalse(_clusterMap.validateClusterCompleteness(clusterId2, 0)); /* This should return null as the window has elapsed */ assertNull(_clusterMap.validateClusterCompleteness(clusterId2, 500)); /* Add a compute VM to cluster2 to make it complete */ String clusterName2 = CLUSTER_NAME_PREFIX+2; VMEventData eventData = createEventData(clusterName2, clusterName2+"_"+VM_NAME_PREFIX+1, false, true, hostName, getMasterVmNameForCluster(clusterName2), false, -1, -1, true); processNewEventData(eventData, clusterId2, null); /* Assert that it is now complete */ assertTrue(_clusterMap.validateClusterCompleteness(clusterId2, 0)); assertTrue(_clusterMap.validateClusterCompleteness(clusterId2, 500)); assertNull(_clusterMap.validateClusterCompleteness("bogus", 0)); assertNull(_clusterMap.validateClusterCompleteness("bogus", 1000)); } @Test public void invokeGettersOnEmptyClusterMap() { Set<String> emptySet = new HashSet<String>(); emptySet.add("foo"); assertNull(_clusterMap.getAllKnownClusterIds()); assertNull(_clusterMap.getClusterIdForName("foo")); assertNull(_clusterMap.getClusterIdForVm("foo")); assertNull(_clusterMap.getDnsNamesForVMs(emptySet)); assertNull(_clusterMap.getDnsNameForVM("foo")); assertNull(_clusterMap.getVmIdsForDnsNames(emptySet)); assertNull(_clusterMap.getVmIdForDnsName("foo")); assertNull(_clusterMap.getHadoopInfoForCluster("foo")); assertNull(_clusterMap.getHostIdForVm("foo")); assertNull(_clusterMap.getHostIdsForVMs(emptySet)); assertNull(_clusterMap.getLastClusterScaleCompletionEvent("foo")); assertNull(_clusterMap.getScaleStrategyForCluster("foo")); assertNull(_clusterMap.listComputeVMsForClusterAndPowerState("foo", false)); assertNull(_clusterMap.listComputeVMsForClusterHostAndPowerState("foo", "foo", false)); assertNull(_clusterMap.listComputeVMsForPowerState(false)); assertNull(_clusterMap.listHostsWithComputeVMsForCluster("foo")); assertNull(_clusterMap.checkPowerStateOfVms(emptySet, false)); assertNull(_clusterMap.checkPowerStateOfVm("foo", false)); assertNull(_clusterMap.getNumVCPUsForVm("foo")); assertNull(_clusterMap.getPowerOnTimeForVm("foo")); assertNull(_clusterMap.getExtraInfo("foo", "bar")); assertNull(_clusterMap.getAllClusterIdsForScaleStrategyKey("foo")); assertNull(_clusterMap.validateClusterCompleteness("foo", 0)); assertNull(_clusterMap.getMasterVmIdForCluster("foo")); } }