You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ro...@apache.org on 2020/09/24 05:31:46 UTC

[cloudstack] branch 4.14 updated: vmware: search unmanaged instances using hypervisor name (#4328)

This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch 4.14
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.14 by this push:
     new ca1e02f  vmware: search unmanaged instances using hypervisor name (#4328)
ca1e02f is described below

commit ca1e02fab9b9d526a406870138926e3e5612526f
Author: Abhishek Kumar <ab...@gmail.com>
AuthorDate: Thu Sep 24 11:01:33 2020 +0530

    vmware: search unmanaged instances using hypervisor name (#4328)
    
    VMware code keeps a cache of existing VMs on a hypervisor host using cloud.vm.internal.name property of the VM. Searching for unmanaged instances/VMs on a host might not return an expected result when this property differs from the actual name of the VM.
    
    Signed-off-by: Abhishek Kumar <ab...@gmail.com>
---
 .../hypervisor/vmware/resource/VmwareResource.java |  4 +--
 .../com/cloud/hypervisor/vmware/mo/ClusterMO.java  |  7 ++--
 .../com/cloud/hypervisor/vmware/mo/HostMO.java     | 41 ++++++++++++++++++++--
 .../hypervisor/vmware/mo/VmwareHypervisorHost.java |  2 +-
 4 files changed, 45 insertions(+), 9 deletions(-)

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 341e18c..4fc48c0 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<VirtualMachineMO> vmMos = hyperHost.listVmsOnHyperHost(vmName);
+            List<VirtualMachineMO> 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 4b37866..000affe3 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<VirtualMachineMO> listVmsOnHyperHost(String vmName) throws Exception {
+    public synchronized List<VirtualMachineMO> listVmsOnHyperHostWithHypervisorName(String vmName) throws Exception {
         List<VirtualMachineMO> vms = new ArrayList<>();
         List<ManagedObjectReference> 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 7877db9..c248f7a 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<VirtualMachineMO> listVmsOnHyperHost(String vmName) throws Exception {
+    public synchronized List<VirtualMachineMO> listVmsOnHyperHostWithHypervisorName(String vmName) throws Exception {
         List<VirtualMachineMO> 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<VirtualMachineMO> 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 a9ceb5d..f99384a 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<VirtualMachineMO> listVmsOnHyperHost(String name) throws Exception;
+    List<VirtualMachineMO> listVmsOnHyperHostWithHypervisorName(String name) throws Exception;
 
     VirtualMachineMO findVmOnHyperHost(String name) throws Exception;