This is an automated email from the ASF dual-hosted git repository.
rohit pushed a commit to branch 4.15
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.15 by this push:
new 9cf1e0e vmware: Fix VMware OVF properties copy from template (#4738)
9cf1e0e is described below
commit 9cf1e0e86977147e8680c745e760cceda4169c11
Author: Nicolas Vazquez <[email protected]>
AuthorDate: Mon Apr 12 09:34:58 2021 -0300
vmware: Fix VMware OVF properties copy from template (#4738)
* Fix VMware OVF properties copy from template
* Fix vapp marvin test
* Remove unused code
* Fix check for deploy as is details
* Access class fields
---
.../hypervisor/vmware/resource/VmwareResource.java | 35 +++++++++++--------
test/integration/smoke/test_vm_life_cycle.py | 40 +++-------------------
tools/marvin/marvin/lib/common.py | 8 ++---
3 files changed, 29 insertions(+), 54 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 6dfdeb5..9963b75 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
@@ -59,6 +59,7 @@ import org.apache.cloudstack.storage.to.VolumeObjectTO;
import org.apache.cloudstack.utils.volume.VirtualMachineDiskInfo;
import org.apache.cloudstack.vm.UnmanagedInstanceTO;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
@@ -2336,7 +2337,7 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
configBasicExtraOption(extraOptions, vmSpec);
if (deployAsIs) {
- setDeployAsIsProperties(vmMo, deployAsIsInfo, vmConfigSpec);
+ setDeployAsIsProperties(vmMo, deployAsIsInfo, vmConfigSpec,
hyperHost);
}
configNvpExtraOption(extraOptions, vmSpec, nicUuidToDvSwitchUuid);
@@ -2563,12 +2564,12 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
* Set OVF properties (if available)
*/
private void setDeployAsIsProperties(VirtualMachineMO vmMo,
DeployAsIsInfoTO deployAsIsInfo,
- VirtualMachineConfigSpec
vmConfigSpec) throws Exception {
- if (deployAsIsInfo != null) {
+ VirtualMachineConfigSpec
vmConfigSpec, VmwareHypervisorHost hyperHost) throws Exception {
+ if (deployAsIsInfo != null &&
MapUtils.isNotEmpty(deployAsIsInfo.getProperties())) {
Map<String, String> properties = deployAsIsInfo.getProperties();
VmConfigInfo vAppConfig = vmMo.getConfigInfo().getVAppConfig();
s_logger.info("Copying OVF properties to the values the user
provided");
- setVAppPropertiesToConfigSpec(vAppConfig, properties,
vmConfigSpec);
+ setVAppPropertiesToConfigSpec(vAppConfig, properties,
vmConfigSpec, hyperHost);
}
}
@@ -2660,13 +2661,13 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
/**
* Set the ovf section spec from existing vApp configuration
*/
- protected List<VAppOvfSectionSpec>
copyVAppConfigOvfSectionFromOVF(VmConfigInfo vAppConfig) {
+ protected List<VAppOvfSectionSpec>
copyVAppConfigOvfSectionFromOVF(VmConfigInfo vAppConfig, boolean useEdit) {
List<VAppOvfSectionInfo> ovfSection = vAppConfig.getOvfSection();
List<VAppOvfSectionSpec> specs = new ArrayList<>();
for (VAppOvfSectionInfo info : ovfSection) {
VAppOvfSectionSpec spec = new VAppOvfSectionSpec();
spec.setInfo(info);
- spec.setOperation(ArrayUpdateOperation.ADD);
+ spec.setOperation(useEdit ? ArrayUpdateOperation.EDIT :
ArrayUpdateOperation.ADD);
specs.add(spec);
}
return specs;
@@ -2694,7 +2695,8 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
/**
* Set the properties section from existing vApp configuration and values
set on ovfProperties
*/
- protected List<VAppPropertySpec>
copyVAppConfigPropertySectionFromOVF(VmConfigInfo vAppConfig, Map<String,
String> ovfProperties) {
+ protected List<VAppPropertySpec>
copyVAppConfigPropertySectionFromOVF(VmConfigInfo vAppConfig, Map<String,
String> ovfProperties,
+
boolean useEdit) {
List<VAppPropertyInfo> productFromOvf = vAppConfig.getProperty();
List<VAppPropertySpec> specs = new ArrayList<>();
for (VAppPropertyInfo info : productFromOvf) {
@@ -2702,9 +2704,10 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
if (ovfProperties.containsKey(info.getId())) {
String value = ovfProperties.get(info.getId());
info.setValue(value);
+ s_logger.info("Setting OVF property ID = " + info.getId() + "
VALUE = " + value);
}
spec.setInfo(info);
- spec.setOperation(ArrayUpdateOperation.ADD);
+ spec.setOperation(useEdit ? ArrayUpdateOperation.EDIT :
ArrayUpdateOperation.ADD);
specs.add(spec);
}
return specs;
@@ -2713,13 +2716,14 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
/**
* Set the product section spec from existing vApp configuration
*/
- protected List<VAppProductSpec>
copyVAppConfigProductSectionFromOVF(VmConfigInfo vAppConfig) {
+ protected List<VAppProductSpec>
copyVAppConfigProductSectionFromOVF(VmConfigInfo vAppConfig, boolean useEdit) {
List<VAppProductInfo> productFromOvf = vAppConfig.getProduct();
List<VAppProductSpec> specs = new ArrayList<>();
for (VAppProductInfo info : productFromOvf) {
VAppProductSpec spec = new VAppProductSpec();
spec.setInfo(info);
- spec.setOperation(ArrayUpdateOperation.ADD);
+ s_logger.info("Procuct info KEY " + info.getKey());
+ spec.setOperation(useEdit ? ArrayUpdateOperation.EDIT :
ArrayUpdateOperation.ADD);
specs.add(spec);
}
return specs;
@@ -2731,16 +2735,19 @@ public class VmwareResource implements
StoragePoolResource, ServerResource, Vmwa
*/
protected void setVAppPropertiesToConfigSpec(VmConfigInfo vAppConfig,
Map<String, String>
ovfProperties,
- VirtualMachineConfigSpec
vmConfig) throws Exception {
+ VirtualMachineConfigSpec
vmConfig, VmwareHypervisorHost hyperHost) throws Exception {
VmConfigSpec vmConfigSpec = new VmConfigSpec();
vmConfigSpec.getEula().addAll(vAppConfig.getEula());
vmConfigSpec.setInstallBootStopDelay(vAppConfig.getInstallBootStopDelay());
vmConfigSpec.setInstallBootRequired(vAppConfig.isInstallBootRequired());
vmConfigSpec.setIpAssignment(vAppConfig.getIpAssignment());
vmConfigSpec.getOvfEnvironmentTransport().addAll(vAppConfig.getOvfEnvironmentTransport());
-
vmConfigSpec.getProduct().addAll(copyVAppConfigProductSectionFromOVF(vAppConfig));
-
vmConfigSpec.getProperty().addAll(copyVAppConfigPropertySectionFromOVF(vAppConfig,
ovfProperties));
-
vmConfigSpec.getOvfSection().addAll(copyVAppConfigOvfSectionFromOVF(vAppConfig));
+
+ // For backward compatibility, prior to Vmware 6.5 use EDIT operation
instead of ADD
+ boolean useEditOperation =
hyperHost.getContext().getServiceContent().getAbout().getApiVersion().compareTo("6.5")
< 1;
+
vmConfigSpec.getProduct().addAll(copyVAppConfigProductSectionFromOVF(vAppConfig,
useEditOperation));
+
vmConfigSpec.getProperty().addAll(copyVAppConfigPropertySectionFromOVF(vAppConfig,
ovfProperties, useEditOperation));
+
vmConfigSpec.getOvfSection().addAll(copyVAppConfigOvfSectionFromOVF(vAppConfig,
useEditOperation));
vmConfig.setVAppConfig(vmConfigSpec);
}
diff --git a/test/integration/smoke/test_vm_life_cycle.py
b/test/integration/smoke/test_vm_life_cycle.py
index d1aa4cb..6cbbc91 100644
--- a/test/integration/smoke/test_vm_life_cycle.py
+++ b/test/integration/smoke/test_vm_life_cycle.py
@@ -61,7 +61,6 @@ from operator import itemgetter
_multiprocess_shared_ = True
-
class TestDeployVM(cloudstackTestCase):
@classmethod
@@ -1750,9 +1749,6 @@ class TestVAppsVM(cloudstackTestCase):
cls.l2_network_offering
]
- # Uncomment when tests are finished, to cleanup the test templates
- for template in cls.templates:
- cls._cleanup.append(template)
@classmethod
def tearDownClass(cls):
@@ -1774,21 +1770,21 @@ class TestVAppsVM(cloudstackTestCase):
def get_ova_parsed_information_from_template(self, template):
if not template:
return None
- details = template.details.__dict__
+ details = template.deployasisdetails.__dict__
configurations = []
disks = []
isos = []
networks = []
for propKey in details:
- if propKey.startswith('ACS-configuration'):
+ if propKey.startswith('configuration'):
configurations.append(json.loads(details[propKey]))
- elif propKey.startswith('ACS-disk'):
+ elif propKey.startswith('disk'):
detail = json.loads(details[propKey])
if detail['isIso'] == True:
isos.append(detail)
else:
disks.append(detail)
- elif propKey.startswith('ACS-network'):
+ elif propKey.startswith('network'):
networks.append(json.loads(details[propKey]))
return configurations, disks, isos, networks
@@ -1818,32 +1814,6 @@ class TestVAppsVM(cloudstackTestCase):
msg="VM NIC(InstanceID: {}) network mismatch, expected = {},
result = {}".format(nic_network["nic"], nic_network["network"], nic.networkid)
)
- def verify_disks(self, template_disks, vm_id):
- cmd = listVolumes.listVolumesCmd()
- cmd.virtualmachineid = vm_id
- cmd.listall = True
- vm_volumes = self.apiclient.listVolumes(cmd)
- self.assertEqual(
- isinstance(vm_volumes, list),
- True,
- "Check listVolumes response returns a valid list"
- )
- self.assertEqual(
- len(template_disks),
- len(vm_volumes),
- msg="VM volumes count is different, expected = {}, result =
{}".format(len(template_disks), len(vm_volumes))
- )
- template_disks.sort(key=itemgetter('diskNumber'))
- vm_volumes.sort(key=itemgetter('deviceid'))
- for j in range(len(vm_volumes)):
- volume = vm_volumes[j]
- disk = template_disks[j]
- self.assertEqual(
- volume.size,
- disk["virtualSize"],
- msg="VM Volume(diskNumber: {}) network mismatch, expected =
{}, result = {}".format(disk["diskNumber"], disk["virtualSize"], volume.size)
- )
-
@attr(tags=["advanced", "advancedns", "smoke", "sg", "dev"],
required_hardware="false")
@skipTestIf("hypervisorNotSupported")
def test_01_vapps_vm_cycle(self):
@@ -1944,8 +1914,6 @@ class TestVAppsVM(cloudstackTestCase):
# Verify nics
self.verify_nics(nicnetworklist, vm.id)
- # Verify disks
- self.verify_disks(disks, vm.id)
# Verify properties
original_properties = vm_service['properties']
vm_properties = get_vm_vapp_configs(self.apiclient, self.config,
self.zone, vm.instancename)
diff --git a/tools/marvin/marvin/lib/common.py
b/tools/marvin/marvin/lib/common.py
index fb69f80..18a8a0a 100644
--- a/tools/marvin/marvin/lib/common.py
+++ b/tools/marvin/marvin/lib/common.py
@@ -429,21 +429,21 @@ def get_test_ovf_templates(apiclient, zone_id=None,
test_ovf_templates=None, hyp
template = Template.register(apiclient, test_template,
zoneid=zone_id, hypervisor=hypervisor.lower(), randomize_name=False)
template.download(apiclient)
retries = 3
- while (template.details == None or len(template.details.__dict__)
== 0) and retries > 0:
+ while (not hasattr(template, 'deployasisdetails') or
len(template.deployasisdetails.__dict__) == 0) and retries > 0:
time.sleep(10)
template_list = Template.list(apiclient, id=template.id,
zoneid=zone_id, templatefilter='all')
if isinstance(template_list, list):
template = Template(template_list[0].__dict__)
retries = retries - 1
- if template.details == None or len(template.details.__dict__) == 0:
+ if not hasattr(template, 'deployasisdetails') or
len(template.deployasisdetails.__dict__) == 0:
template.delete(apiclient)
else:
result.append(template)
if templates:
for template in templates:
- if template.isready and template.ispublic and template.details
!= None and len(template.details.__dict__) > 0:
- result.append(template.__dict__)
+ if template.isready and template.ispublic and
template.deployasisdetails and len(template.deployasisdetails.__dict__) > 0:
+ result.append(template)
return result