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;