diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 341e18cdc5d..4fc48c0a41c 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -316,8 +316,8 @@ import com.vmware.vim25.VirtualEthernetCardDistributedVirtualPortBackingInfo; import com.vmware.vim25.VirtualEthernetCardNetworkBackingInfo; import com.vmware.vim25.VirtualEthernetCardOpaqueNetworkBackingInfo; import com.vmware.vim25.VirtualIDEController; -import com.vmware.vim25.VirtualMachineConfigSpec; import com.vmware.vim25.VirtualMachineBootOptions; +import com.vmware.vim25.VirtualMachineConfigSpec; import com.vmware.vim25.VirtualMachineFileInfo; import com.vmware.vim25.VirtualMachineFileLayoutEx; import com.vmware.vim25.VirtualMachineFileLayoutExFileInfo; @@ -7069,7 +7069,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VmwareHypervisorHost hyperHost = getHyperHost(context); String vmName = cmd.getInstanceName(); - List vmMos = hyperHost.listVmsOnHyperHost(vmName); + List vmMos = hyperHost.listVmsOnHyperHostWithHypervisorName(vmName); for (VirtualMachineMO vmMo : vmMos) { if (vmMo == null) { diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/ClusterMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/ClusterMO.java index 4b378664622..000affe3619 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/ClusterMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/ClusterMO.java @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -217,13 +218,13 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost { } @Override - public synchronized List listVmsOnHyperHost(String vmName) throws Exception { + public synchronized List listVmsOnHyperHostWithHypervisorName(String vmName) throws Exception { List vms = new ArrayList<>(); List hosts = _context.getVimClient().getDynamicProperty(_mor, "host"); - if (hosts != null && hosts.size() > 0) { + if (CollectionUtils.isNotEmpty(hosts)) { for (ManagedObjectReference morHost : hosts) { HostMO hostMo = new HostMO(_context, morHost); - vms.addAll(hostMo.listVmsOnHyperHost(vmName)); + vms.addAll(hostMo.listVmsOnHyperHostWithHypervisorName(vmName)); } } return vms; diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java index 7877db980f4..c248f7a63f1 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java @@ -18,11 +18,14 @@ package com.cloud.hypervisor.vmware.mo; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.google.gson.Gson; @@ -497,10 +500,10 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { } @Override - public synchronized List listVmsOnHyperHost(String vmName) throws Exception { + public synchronized List listVmsOnHyperHostWithHypervisorName(String vmName) throws Exception { List vms = new ArrayList<>(); - if (vmName != null && !vmName.isEmpty()) { - vms.add(findVmOnHyperHost(vmName)); + if (StringUtils.isNotEmpty(vmName)) { + vms.add(findVmOnHyperHostWithHypervisorName(vmName)); } else { loadVmCache(); vms.addAll(_vmCache.values()); @@ -1209,4 +1212,36 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost { return false; } + private synchronized VirtualMachineMO findVmOnHyperHostWithHypervisorName(String vmName) throws Exception { + if (s_logger.isDebugEnabled()) + s_logger.debug("find VM hypervisor name: " + vmName + " on host"); + + VirtualMachineMO vmMo = getVmWithHypervisorName(_vmCache.values(), vmName); + if (vmMo != null) { + if (s_logger.isDebugEnabled()) + s_logger.debug("VM hypervisor name: " + vmName + " found in host cache"); + return vmMo; + } + + s_logger.info("VM hypervisor name: " + vmName + " not found in host cache"); + loadVmCache(); + + return getVmWithHypervisorName(_vmCache.values(), vmName); + } + + private VirtualMachineMO getVmWithHypervisorName(Collection vmList, String vmName) { + if (CollectionUtils.isNotEmpty(vmList)) { + for (VirtualMachineMO vm : vmList) { + try { + if (StringUtils.isNotEmpty(vm.getVmName()) && vm.getVmName().equals(vmName)) { + return vm; + } + } catch (Exception e) { + s_logger.debug("Failed to get VM name, ignoring exception", e); + } + } + } + return null; + } + } diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java index a9ceb5d806e..f99384a75e1 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java @@ -53,7 +53,7 @@ public interface VmwareHypervisorHost { String getHyperHostDefaultGateway() throws Exception; - List listVmsOnHyperHost(String name) throws Exception; + List listVmsOnHyperHostWithHypervisorName(String name) throws Exception; VirtualMachineMO findVmOnHyperHost(String name) throws Exception;