/***************************************************************************
* 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 java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import com.vmware.vhadoop.api.vhm.ClusterMap;
import com.vmware.vhadoop.api.vhm.ClusterMapReader;
import com.vmware.vhadoop.api.vhm.VCActions.VMEventData;
import com.vmware.vhadoop.api.vhm.VCActions.MasterVmEventData;
import com.vmware.vhadoop.api.vhm.events.ClusterScaleEvent;
import com.vmware.vhadoop.api.vhm.strategy.ScaleStrategy;
import com.vmware.vhadoop.vhm.vc.VcVlsi;
public abstract class AbstractJUnitTest {
Set<String> _clusterNames = new HashSet<String>();
Set<String> _masterVmNames = new HashSet<String>();
Set<String> _vmNames = new HashSet<String>();
final String CLUSTER_NAME_PREFIX = "myTestCluster_";
final String VM_NAME_PREFIX = "myTestVm_";
final String DNS_PREFIX = "DNS_";
final String NIC_PREFIX = "NIC_";
final String IPADDR_PREFIX = "IPADDR_";
final String UUID_PREFIX = "UUID_";
final String MOREF_PREFIX = "MOREF_";
final String FOLDER_PREFIX = "FOLDER_";
final String HOST_PREFIX = "HOST_";
final String MASTER_VM_NAME_POSTFIX = VcVlsi.SERENGETI_MASTERVM_NAME_POSTFIX;
final String OTHER_SCALE_STRATEGY_KEY = "otherScaleStrategy";
final String DEFAULT_SCALE_STRATEGY_KEY = "defaultScaleStrategy";
final int DEFAULT_PORT = 1234;
final int DEFAULT_VCPUS = 2;
protected ClusterMap getTestClusterMap(boolean prepopulate) {
return new StandaloneSimpleClusterMap(prepopulate);
}
protected ClusterMapReader getTestClusterMapReader(ClusterMap clusterMap) {
MultipleReaderSingleWriterClusterMapAccess.destroy();
MultipleReaderSingleWriterClusterMapAccess cma =
MultipleReaderSingleWriterClusterMapAccess.getClusterMapAccess(clusterMap);
return new AbstractClusterMapReader(cma, null) {};
}
VMEventData createEventData(String clusterName, String vmName, boolean isMaster,
Boolean powerState, String hostName, String masterVmName,
boolean autoCluster, Integer minClusterInstances, Integer maxClusterInstances, boolean isNewVM) {
VMEventData result = new VMEventData();
if (isNewVM) {
result._myUUID = UUID_PREFIX+vmName;
}
result._dnsName = getDnsNameFromVmName(vmName);
result._hostMoRef = MOREF_PREFIX+hostName;
result._nicAndIpAddressMap = new HashMap<String, Set<String>>();
result._nicAndIpAddressMap.put(NIC_PREFIX+vmName,
new HashSet<String>(Arrays.asList(new String[]{IPADDR_PREFIX+vmName+"1", IPADDR_PREFIX+vmName+"2"})));
result._masterMoRef = MOREF_PREFIX+masterVmName;
result._masterUUID = UUID_PREFIX+vmName;
result._masterUUID = getClusterIdForMasterVmName(masterVmName);
result._myName = vmName;
result._serengetiFolder = getFolderNameForClusterName(clusterName);
result._vmMoRef = MOREF_PREFIX+vmName;
result._vCPUs = DEFAULT_VCPUS;
result._isElastic = !isMaster;
if (isMaster) {
result._masterVmData = new MasterVmEventData();
result._masterVmData._enableAutomation = autoCluster;
result._masterVmData._minInstances = minClusterInstances;
result._masterVmData._maxInstances = maxClusterInstances;
result._masterVmData._jobTrackerPort = DEFAULT_PORT;
result._masterVmData._clusterName = clusterName;
}
result._powerState = powerState;
result._isLeaving = false;
return result;
}
void populateClusterSameHost(String clusterName, String hostName, int numVms, boolean defaultPowerState,
boolean autoCluster, Integer minInstances, Set<ClusterScaleEvent> impliedScaleEvents) {
String masterVmName = null;
for (int i=0; i<numVms; i++) {
String vmName;
if (i==0) {
vmName = masterVmName = clusterName+MASTER_VM_NAME_POSTFIX+"_"+VM_NAME_PREFIX+i;
_masterVmNames.add(masterVmName);
} else {
vmName = clusterName+"_"+VM_NAME_PREFIX+i;
}
_vmNames.add(vmName);
VMEventData eventData = createEventData(clusterName, vmName, i==0, (i==0 || defaultPowerState), hostName, masterVmName, autoCluster, minInstances, -1, true);
processNewEventData(eventData, deriveClusterIdFromClusterName(clusterName), impliedScaleEvents);
}
registerScaleStrategy(new TrivialScaleStrategy(DEFAULT_SCALE_STRATEGY_KEY));
registerScaleStrategy(new TrivialScaleStrategy(OTHER_SCALE_STRATEGY_KEY));
}
/* Override */
void processNewEventData(VMEventData eventData, String expectedClusterId, Set<ClusterScaleEvent> impliedScaleEvents) {}
/* Override */
void registerScaleStrategy(ScaleStrategy scaleStrategy) {}
void populateSimpleClusterMap(int numClusters, int vmsPerCluster, boolean defaultPowerState, Set<ClusterScaleEvent> impliedScaleEvents) {
for (int i=0; i<numClusters; i++) {
String clusterName = CLUSTER_NAME_PREFIX+i;
_clusterNames.add(clusterName);
Integer minInstances = i;
/* Default automation value is true, so that if it's false, we can assert that VHM defaults to the real ManualScaleStrategy */
populateClusterSameHost(clusterName, "DEFAULT_HOST", vmsPerCluster, defaultPowerState, true, minInstances, impliedScaleEvents);
}
}
void populateSimpleClusterMap(int numClusters, int vmsPerCluster, boolean defaultPowerState) {
populateSimpleClusterMap(numClusters, vmsPerCluster, defaultPowerState, null);
}
void populateClusterPerHost(int numClusters, int vmsPerCluster, boolean defaultPowerState, Set<ClusterScaleEvent> impliedScaleEvents) {
for (int i=0; i<numClusters; i++) {
String clusterName = CLUSTER_NAME_PREFIX+i;
_clusterNames.add(clusterName);
Integer minInstances = i;
/* Default automation value is true, so that if it's false, we can assert that VHM defaults to the real ManualScaleStrategy */
populateClusterSameHost(clusterName, HOST_PREFIX+i, vmsPerCluster, defaultPowerState, true, minInstances, impliedScaleEvents);
}
}
void populateClusterPerHost(int numClusters, int vmsPerCluster, boolean defaultPowerState) {
populateClusterPerHost(numClusters, vmsPerCluster, defaultPowerState, null);
}
String getClusterIdForMasterVmName(String masterVmName) {
return UUID_PREFIX+masterVmName;
}
String getFolderNameForClusterName(String clusterName) {
return FOLDER_PREFIX+clusterName;
}
String getDnsNameFromVmName(String vmName) {
return DNS_PREFIX+vmName;
}
String getMasterVmIdForCluster(String clusterName) {
return getVmIdFromVmName(getMasterVmNameForCluster(clusterName));
}
String getMasterVmNameForCluster(String clusterName) {
return clusterName+MASTER_VM_NAME_POSTFIX+"_"+VM_NAME_PREFIX+0;
}
String deriveClusterIdFromClusterName(String clusterName) {
return getClusterIdForMasterVmName(getMasterVmNameForCluster(clusterName));
}
String deriveClusterIdForComputeVmName(String vmName) {
String clusterName = vmName.substring(0, vmName.indexOf('_', vmName.indexOf('_')+1));
return deriveClusterIdFromClusterName(clusterName);
}
Object deriveMasterDnsNameFromClusterId(String clusterId) {
String removedUUID = clusterId.substring(clusterId.indexOf('_')+1);
return DNS_PREFIX+removedUUID;
}
String getVmIdFromVmName(String vmName) {
return MOREF_PREFIX+vmName;
}
Set<String> getVmIdsFromVmNames(Set<String> vmNames) {
Set<String> result = new HashSet<String>();
for (String vmName : vmNames) {
result.add(getVmIdFromVmName(vmName));
}
return result;
}
String deriveClusterIdFromVmName(String vmName) {
String temp;
if (vmName.contains(MASTER_VM_NAME_POSTFIX)) {
temp = getClusterIdForMasterVmName(vmName);
} else {
temp = deriveClusterIdForComputeVmName(vmName);
}
String stripTrailingNumber = temp.substring(0, temp.lastIndexOf('_')+1);
return stripTrailingNumber+"0";
}
String deriveHostIdFromVmName(String vmName) {
int firstUnderscore = vmName.indexOf('_');
String clusterNumber;
if (vmName.contains(MASTER_VM_NAME_POSTFIX)) {
clusterNumber = vmName.substring(firstUnderscore+1, vmName.lastIndexOf(MASTER_VM_NAME_POSTFIX));
} else {
clusterNumber = vmName.substring(firstUnderscore+1, vmName.indexOf('_', firstUnderscore+1));
}
return MOREF_PREFIX+HOST_PREFIX+clusterNumber;
}
String deriveHostIdFromVmId(String vmId) {
return deriveHostIdFromVmName(vmId.substring(MOREF_PREFIX.length()));
}
Set<String> getBogusSet() {
Set<String> result = new HashSet<String>();
result.add("bogus");
return result;
}
Set<String> getEmptySet() {
return new HashSet<String>();
}
}