package com.vmware.vhadoop.vhm; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import com.vmware.vhadoop.api.vhm.HadoopActions.HadoopClusterInfo; import com.vmware.vhadoop.api.vhm.events.ClusterStateChangeEvent.VmType; import com.vmware.vhadoop.api.vhm.strategy.ScaleStrategy; /* BaseClusterMap has code for all of the methods exposed in ClusterMapImpl and CachingClusterMapImpl * * Each method corresponds to a public method in ClusterMap with "Base" added as a post-fix to facilitate lookup using reflection * * */ public abstract class BaseClusterMap extends AbstractClusterMap { static final String BASE_METHOD_POSTIFX = "Base"; BaseClusterMap(ExtraInfoToClusterMapper mapper) { super(mapper); } /* Return null if a cluster is not viable as there's no scaling we can do with it */ String getScaleStrategyKeyBase(String clusterId) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} ClusterInfo ci = getCluster(clusterId); if ((ci != null) && isClusterViable(clusterId)) { return ci.getScaleStrategyKey(); /* Immutable result */ } return null; } Set<String> listComputeVMsForClusterAndPowerStateBase(String clusterId, boolean powerState) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (clusterId != null) { return generateComputeVMList(clusterId, null, powerState); /* Returns immutable wrapper */ } return null; } Set<String> listComputeVMsForPowerStateBase(boolean powerState) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} return generateComputeVMList(null, null, powerState); /* Returns immutable wrapper */ } Set<String> listComputeVMsForClusterBase(String clusterId) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} return generateComputeVMList(clusterId, null, null); /* Returns immutable wrapper */ } Set<String> listHostsWithComputeVMsForClusterBase(String clusterId) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (vmInfoMapHasData()) { Set<String> result = new HashSet<String>(); for (VMInfo vminfo : getVMInfoMap().values()) { if ((vminfo.getVmType().equals(VmType.COMPUTE)) && vminfo.getClusterId().equals(clusterId)) { String hostMoRef = vminfo.getHostMoRef(); if (assertHasData(hostMoRef)) { result.add(hostMoRef); } } } return (result.size() == 0) ? null : Collections.unmodifiableSet(result); /* Immutable wrapper */ } return null; } Set<String> listComputeVMsForClusterHostAndPowerStateBase(String clusterId, String hostId, boolean powerState) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if ((clusterId != null) && (hostId != null)) { return generateComputeVMList(clusterId, hostId, powerState); /* Returns immutable wrapper */ } return null; } String getClusterIdForNameBase(String clusterName) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if ((clusterName != null) && clusterInfoMapHasData()) { for (ClusterInfo ci : getClusterInfoMap().values()) { String nameTest = ci.getClusterName(); if ((nameTest != null) && (nameTest.equals(clusterName))) { return ci.getClusterId(); /* Immutable result */ } } } return null; } Boolean checkPowerStateOfVmsBase(Set<String> vmIds, boolean expectedPowerState) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (assertHasData(vmIds)) { for (String vmId : vmIds) { Boolean result = checkPowerStateOfVmBase(vmId, expectedPowerState); if ((result == null) || (result == false)) { return result; /* Immutable result */ } } return true; } return null; } Boolean checkPowerStateOfVmBase(String vmId, boolean expectedPowerState) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (vmInfoMapHasData()) { VMInfo vm = getVMInfoMap().get(vmId); if (vm != null) { if (vm.getPowerState() == null) { return null; } return vm.getPowerState() == expectedPowerState; /* Immutable result */ } else { return null; } } return null; } Map<String, String> getHostIdsForVMsBase(Set<String> vmIds) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (assertHasData(vmIds) && vmInfoMapHasData()) { Map<String, VMInfo> vmInfoMap = getVMInfoMap(); Map<String, String> results = new HashMap<String, String>(); for (String vmId : vmIds) { VMInfo vminfo = vmInfoMap.get(vmId); if ((vminfo != null) && assertHasData(vminfo.getHostMoRef())) { results.put(vmId, vminfo.getHostMoRef()); } } if (results.size() > 0) { return Collections.unmodifiableMap(results); /* Immutable wrapper */ } } return null; } String getDnsNameForVMBase(String vmId) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (vmInfoMapHasData()) { VMInfo vminfo = getVMInfoMap().get(vmId); if (vminfo != null) { String dnsName = vminfo.getDnsName(); if (assertHasData(dnsName)) { return dnsName; /* Immutable result */ } } } return null; } /* HadoopClusterInfo returned may contain null values for any of its fields except for clusterId * This method will return null if a JobTracker representing the cluster is powered off */ HadoopClusterInfo getHadoopInfoForClusterBase(String clusterId) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} ClusterInfo ci = getCluster(clusterId); HadoopClusterInfo result = null; if (ci != null) { if (vmInfoMapHasData()) { VMInfo vi = getVMInfoMap().get(ci.getMasterMoRef()); Boolean powerState = checkPowerStateOfVm(vi.getMoRef(), true); if ((vi != null) && (powerState != null) && powerState) { /* Constant and Variable data references are guaranteed to be non-null. iPAddress or dnsName may be null */ result = new HadoopClusterInfo(ci.getClusterId(), vi.getDnsName(), ci.getJobTrackerPort()); /* Immutable object */ } } } return result; } /* Note that the method returns all valid input VM ids, even if they have null DNS names */ Map<String, String> getDnsNamesForVMsBase(Set<String> vmIds) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (assertHasData(vmIds) && vmInfoMapHasData()) { Map<String, VMInfo> vmInfoMap = getVMInfoMap(); Map<String, String> results = new HashMap<String, String>(); for (String vmId : vmIds) { if (vmInfoMap.get(vmId) != null) { results.put(vmId, getDnsNameForVMBase(vmId)); } } if (results.size() > 0) { return Collections.unmodifiableMap(results); /* Immutable wrapper */ } } return null; } Map<String, String> getVmIdsForDnsNamesBase(Set<String> dnsNames) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (assertHasData(dnsNames) && vmInfoMapHasData()) { Map<String, String> results = new HashMap<String, String>(); for (VMInfo vminfo : getVMInfoMap().values()) { String dnsNameToTest = vminfo.getDnsName(); if (assertHasData(dnsNameToTest) && dnsNames.contains(dnsNameToTest)) { results.put(dnsNameToTest, vminfo.getMoRef()); } } if (results.size() > 0) { return Collections.unmodifiableMap(results); /* Immutable wrapper */ } } return null; } String getVmIdForDnsNameBase(String dnsName) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (vmInfoMapHasData()) { for (VMInfo vminfo : getVMInfoMap().values()) { String dnsNameToTest = vminfo.getDnsName(); if (assertHasData(dnsNameToTest) && (dnsName != null) && dnsNameToTest.equals(dnsName)) { return vminfo.getMoRef(); /* Immutable result */ } } } return null; } Set<String> getAllClusterIdsForScaleStrategyKeyBase(String key) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if ((key != null) && clusterInfoMapHasData()) { Set<String> result = new HashSet<String>(); for (String clusterId : getClusterInfoMap().keySet()) { ScaleStrategy scaleStrategy = getScaleStrategyForCluster(clusterId); if ((scaleStrategy != null) && (scaleStrategy.getKey().equals(key))) { result.add(clusterId); } } if (result.size() > 0) { return Collections.unmodifiableSet(result); /* Immutable wrapper */ } } return null; } String getMasterVmIdForClusterBase(String clusterId) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} ClusterInfo ci = getCluster(clusterId); if (ci != null) { return ci.getMasterMoRef(); /* Immutable result */ } return null; } Map<String, Set<String>> getNicAndIpAddressesForVmBase(String vmId) { //if ((_random != null) && ((_random.nextInt() % FAILURE_FACTOR) == 0)) {return null;} if (vmInfoMapHasData()) { VMInfo vm = getVMInfoMap().get(vmId); if (vm != null) { Map<String, Set<String>> mutable = vm.getNicAndIpAddressMap(); if (mutable != null) { Map<String, Set<String>> immutable = new HashMap<String, Set<String>>(); for (Entry<String, Set<String>> entry : mutable.entrySet()) { immutable.put(entry.getKey(), Collections.unmodifiableSet(entry.getValue())); } return Collections.unmodifiableMap(immutable); /* Immutable wrapper */ } } } return null; } }