From 897cc4bdba3d9d8d79a877c0389ff7a41746b8b0 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 2 Oct 2020 04:46:57 -0300 Subject: [PATCH] Fix nested virt marvin test --- .../vmware/resource/VmwareResource.java | 46 +++++----- .../smoke/test_nested_virtualization.py | 86 +++++++++++-------- .../vmware/mo/VirtualMachineMO.java | 8 +- 3 files changed, 74 insertions(+), 66 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 a3990bb4f90..4a851a49f47 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 @@ -1942,30 +1942,28 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VmwareHelper.setBasicVmConfig(vmConfigSpec, vmSpec.getCpus(), vmSpec.getMaxSpeed(), getReservedCpuMHZ(vmSpec), (int) (vmSpec.getMaxRam() / (1024 * 1024)), getReservedMemoryMb(vmSpec), guestOsId, vmSpec.getLimitCpuUse(), deployAsIs); - if (!deployAsIs) { - // Check for multi-cores per socket settings - int numCoresPerSocket = 1; - String coresPerSocket = vmSpec.getDetails().get(VmDetailConstants.CPU_CORE_PER_SOCKET); - if (coresPerSocket != null) { - String apiVersion = HypervisorHostHelper.getVcenterApiVersion(vmMo.getContext()); - // Property 'numCoresPerSocket' is supported since vSphere API 5.0 - if (apiVersion.compareTo("5.0") >= 0) { - numCoresPerSocket = NumbersUtil.parseInt(coresPerSocket, 1); - vmConfigSpec.setNumCoresPerSocket(numCoresPerSocket); - } + // Check for multi-cores per socket settings + int numCoresPerSocket = 1; + String coresPerSocket = vmSpec.getDetails().get(VmDetailConstants.CPU_CORE_PER_SOCKET); + if (coresPerSocket != null) { + String apiVersion = HypervisorHostHelper.getVcenterApiVersion(vmMo.getContext()); + // Property 'numCoresPerSocket' is supported since vSphere API 5.0 + if (apiVersion.compareTo("5.0") >= 0) { + numCoresPerSocket = NumbersUtil.parseInt(coresPerSocket, 1); + vmConfigSpec.setNumCoresPerSocket(numCoresPerSocket); } + } - // Check for hotadd settings - vmConfigSpec.setMemoryHotAddEnabled(vmMo.isMemoryHotAddSupported(guestOsId)); + // Check for hotadd settings + vmConfigSpec.setMemoryHotAddEnabled(vmMo.isMemoryHotAddSupported(guestOsId)); - String hostApiVersion = ((HostMO) hyperHost).getHostAboutInfo().getApiVersion(); - if (numCoresPerSocket > 1 && hostApiVersion.compareTo("5.0") < 0) { - s_logger.warn("Dynamic scaling of CPU is not supported for Virtual Machines with multi-core vCPUs in case of ESXi hosts 4.1 and prior. Hence CpuHotAdd will not be" - + " enabled for Virtual Machine: " + vmInternalCSName); - vmConfigSpec.setCpuHotAddEnabled(false); - } else { - vmConfigSpec.setCpuHotAddEnabled(vmMo.isCpuHotAddSupported(guestOsId)); - } + String hostApiVersion = ((HostMO) hyperHost).getHostAboutInfo().getApiVersion(); + if (numCoresPerSocket > 1 && hostApiVersion.compareTo("5.0") < 0) { + s_logger.warn("Dynamic scaling of CPU is not supported for Virtual Machines with multi-core vCPUs in case of ESXi hosts 4.1 and prior. Hence CpuHotAdd will not be" + + " enabled for Virtual Machine: " + vmInternalCSName); + vmConfigSpec.setCpuHotAddEnabled(false); + } else { + vmConfigSpec.setCpuHotAddEnabled(vmMo.isCpuHotAddSupported(guestOsId)); } configNestedHVSupport(vmMo, vmSpec, vmConfigSpec); @@ -2479,11 +2477,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } private String getGuestOsIdFromVmSpec(VirtualMachineTO vmSpec, boolean deployAsIs) { - String guestOsId = null; - if (!deployAsIs) { - guestOsId = translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs(), vmSpec.getPlatformEmulator()).value(); - } - return guestOsId; + return translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs(), vmSpec.getPlatformEmulator()).value(); } private Pair getControllerInfoFromVmSpec(VirtualMachineTO vmSpec) throws CloudRuntimeException { diff --git a/test/integration/smoke/test_nested_virtualization.py b/test/integration/smoke/test_nested_virtualization.py index c10dd2f98a4..43313244f41 100644 --- a/test/integration/smoke/test_nested_virtualization.py +++ b/test/integration/smoke/test_nested_virtualization.py @@ -97,51 +97,61 @@ class TestNestedVirtualization(cloudstackTestCase): config_update = Configurations.update(self.apiclient, "vmware.nested.virtualization.perVM", "true") self.logger.debug("Updated global setting vmware.nested.virtualization.perVM to true") rollback_nv_per_vm = True - - # 2) Deploy a vm - virtual_machine = VirtualMachine.create( - self.apiclient, - self.services["small"], - accountid=self.account.name, - domainid=self.account.domainid, - serviceofferingid=self.service_offering.id, - mode=self.services['mode'] - ) - self.assert_(virtual_machine is not None, "VM failed to deploy") - self.assert_(virtual_machine.state == 'Running', "VM is not running") - self.logger.debug("Deployed vm: %s" % virtual_machine.id) - - isolated_network = Network.create( - self.apiclient, - self.services["isolated_network"], - self.account.name, - self.account.domainid, - networkofferingid=self.isolated_network_offering.id) - virtual_machine.add_nic(self.apiclient, isolated_network.id) - - # 3) SSH into vm - ssh_client = virtual_machine.get_ssh_client() + try: + # 2) Deploy a vm + virtual_machine = VirtualMachine.create( + self.apiclient, + self.services["small"], + accountid=self.account.name, + domainid=self.account.domainid, + serviceofferingid=self.service_offering.id, + mode=self.services['mode'] + ) + self.assert_(virtual_machine is not None, "VM failed to deploy") + self.assert_(virtual_machine.state == 'Running', "VM is not running") + self.logger.debug("Deployed vm: %s" % virtual_machine.id) - if ssh_client: - # run ping test - result = ssh_client.execute("cat /proc/cpuinfo | grep flags") - self.logger.debug(result) - else: - self.fail("Failed to setup ssh connection to %s" % virtual_machine.public_ip) - - # 4) Revert configurations, if needed + isolated_network = Network.create( + self.apiclient, + self.services["isolated_network"], + self.account.name, + self.account.domainid, + networkofferingid=self.isolated_network_offering.id) + + virtual_machine.stop(self.apiclient) + virtual_machine.add_nic(self.apiclient, isolated_network.id) + virtual_machine.start(self.apiclient) + + # 3) SSH into vm + ssh_client = virtual_machine.get_ssh_client() + + if ssh_client: + # run ping test + result = ssh_client.execute("cat /proc/cpuinfo | grep flags") + self.logger.debug(result) + else: + self.fail("Failed to setup ssh connection to %s" % virtual_machine.public_ip) + + # 4) Revert configurations, if needed + self.rollback_nested_configurations(rollback_nv, rollback_nv_per_vm) + + #5) Check for CPU flags: vmx for Intel and svm for AMD indicates nested virtualization is enabled + self.assert_(result is not None, "Empty result for CPU flags") + res = str(result) + self.assertTrue('vmx' in res or 'svm' in res or 'lm' in res) + except Exception as e: + self.debug('Error=%s' % e) + self.rollback_nested_configurations(rollback_nv, rollback_nv_per_vm) + raise e + + def rollback_nested_configurations(self, rollback_nv, rollback_nv_per_vm): if rollback_nv: config_update = Configurations.update(self.apiclient, "vmware.nested.virtualization", "false") self.logger.debug("Reverted global setting vmware.nested.virtualization back to false") if rollback_nv_per_vm: - config_update = Configurations.update(self.apiclient, "vmware.nested.virtualization", "false") + config_update = Configurations.update(self.apiclient, "vmware.nested.virtualization.perVM", "false") self.logger.debug("Reverted global setting vmware.nested.virtualization.perVM back to false") - - #5) Check for CPU flags: vmx for Intel and svm for AMD indicates nested virtualization is enabled - self.assert_(result is not None, "Empty result for CPU flags") - res = str(result) - self.assertTrue('vmx' in res or 'svm' in res) @classmethod def tearDownClass(cls): diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index 44eb47b93d1..2135e2b1816 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -227,11 +227,15 @@ public class VirtualMachineMO extends BaseMO { s_logger.info("msg id: " + msg.getId()); s_logger.info("msg text: " + msg.getText()); } + String logMsg = "Found that VM has a pending question that we need to answer programmatically, question id: " + msg.getId(); if ("msg.uuid.altered".equalsIgnoreCase(msg.getId())) { - s_logger.info("Found that VM has a pending question that we need to answer programmatically, question id: " + msg.getId() - + ", we will automatically answer as 'moved it' to address out of band HA for the VM"); + s_logger.info(logMsg + ", we will automatically answer as 'moved it' to address out of band HA for the VM"); vmMo.answerVM(question.getId(), "1"); break; + } else if (msg.getId().equalsIgnoreCase("msg.cpuid.noVHVQuestion")) { + s_logger.info(logMsg + ", automatically answering 'yes'"); + vmMo.answerVM(question.getId(), "0"); + break; } } }