From ad8f0bf637b9f47ff4521fe89ae4aaa47346c03b Mon Sep 17 00:00:00 2001 From: devendrasingh Date: Thu, 4 Mar 2021 18:00:41 +0100 Subject: [PATCH 1/3] add value check for the vapp.update_product_section. Signed-off-by: John Doe --- pyvcloud/vcd/vapp.py | 22 +++++++++++++++++----- tests/vcd_vapp_vm.py | 26 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/pyvcloud/vcd/vapp.py b/pyvcloud/vcd/vapp.py index f74489581..753b0fef1 100644 --- a/pyvcloud/vcd/vapp.py +++ b/pyvcloud/vcd/vapp.py @@ -2028,11 +2028,16 @@ def update_product_section(self, if class_name == class_val and instance_name == instance_val: properties = product_section.xpath( 'ovf:Property', namespaces=NSMAP) - for prop in properties: - id = prop.get('{' + NSMAP['ovf'] + '}key') - if key == id: - prop.getparent().remove(prop) - product_section.append(property) + prop = self.find_prop(properties, key) + if prop is not None: + if hasattr(prop, "Value"): + prop.Value.set("{" + NSMAP["ovf"] + "}value", str(value)) + else: + _value = E_OVF.Value() + _value.set("{" + NSMAP["ovf"] + "}value", str(value)) + prop.append(_value) + else: + product_section.append(property) is_updated = True break if not is_updated: @@ -2052,6 +2057,13 @@ def update_product_section(self, media_type=EntityType.PRODUCT_SECTIONS.value, contents=product_sections_res) + def find_prop(self, properties, key): + for prop in properties: + id = prop.get("{" + NSMAP["ovf"] + "}key") + if key == id: + return prop + return + def list_vm_interface(self, network_name): """List vm interfaces of network. diff --git a/tests/vcd_vapp_vm.py b/tests/vcd_vapp_vm.py index 391e69e37..020a5eecd 100644 --- a/tests/vcd_vapp_vm.py +++ b/tests/vcd_vapp_vm.py @@ -199,5 +199,31 @@ def test_1005_reboot_vapp(self): callback=None) assert task.get('status') == TaskStatus.SUCCESS.value + def test_001_update_product_section(self): + _org=self.client.get_org_by_name(org_name=self.config['vcd']['org_to_use']) + org = Org(self.client, resource=_org) + v = org.get_vdc(self.config['vcd']['vdc']) + vdc = VDC(self.client, href=v.get('href')) + assert self.config['vcd']['vdc'] == vdc.get_resource().get('name') + vapp_resource = vdc.get_vapp(self.config['vcd']['vapp']) + assert vapp_resource.get('name') == self.config['vcd']['vapp'] + vapp = VApp(self.client, resource=vapp_resource) + key_to_be_updated = "guestinfo.ignition.config.data.encoding" + value_to_be_updated_for_key = "base64" + result = vapp.update_product_section(key=key_to_be_updated, value=value_to_be_updated_for_key, instance_name=self.config['vcd']['vm']) + task = self.client.get_task_monitor().wait_for_status( + task=result, + timeout=60, + poll_frequency=2, + fail_on_statuses=None, + expected_target_statuses=[ + TaskStatus.SUCCESS, + TaskStatus.ABORTED, + TaskStatus.ERROR, + TaskStatus.CANCELED], + callback=None) + assert task.get('status') == TaskStatus.SUCCESS.value + + if __name__ == '__main__': unittest.main() From 6f0337864c242183ff2c7eb54f2299fed4ab844e Mon Sep 17 00:00:00 2001 From: devendrasingh Date: Fri, 5 Mar 2021 09:08:45 +0100 Subject: [PATCH 2/3] fix line length --- pyvcloud/vcd/vapp.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pyvcloud/vcd/vapp.py b/pyvcloud/vcd/vapp.py index 753b0fef1..39cb2f4e6 100644 --- a/pyvcloud/vcd/vapp.py +++ b/pyvcloud/vcd/vapp.py @@ -2030,12 +2030,12 @@ def update_product_section(self, 'ovf:Property', namespaces=NSMAP) prop = self.find_prop(properties, key) if prop is not None: - if hasattr(prop, "Value"): - prop.Value.set("{" + NSMAP["ovf"] + "}value", str(value)) - else: - _value = E_OVF.Value() - _value.set("{" + NSMAP["ovf"] + "}value", str(value)) - prop.append(_value) + if hasattr(prop, "Value"): + prop.Value.set("{" + NSMAP["ovf"] + "}value", str(value)) + else: + _value = E_OVF.Value() + _value.set("{" + NSMAP["ovf"] + "}value", str(value)) + prop.append(_value) else: product_section.append(property) is_updated = True From 02b09d443f119ac943c6a784aa92394528809bb5 Mon Sep 17 00:00:00 2001 From: devendrasingh Date: Fri, 5 Mar 2021 09:13:00 +0100 Subject: [PATCH 3/3] fix line length --- pyvcloud/vcd/vapp.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pyvcloud/vcd/vapp.py b/pyvcloud/vcd/vapp.py index 39cb2f4e6..898ebb469 100644 --- a/pyvcloud/vcd/vapp.py +++ b/pyvcloud/vcd/vapp.py @@ -2030,12 +2030,13 @@ def update_product_section(self, 'ovf:Property', namespaces=NSMAP) prop = self.find_prop(properties, key) if prop is not None: - if hasattr(prop, "Value"): - prop.Value.set("{" + NSMAP["ovf"] + "}value", str(value)) - else: - _value = E_OVF.Value() - _value.set("{" + NSMAP["ovf"] + "}value", str(value)) - prop.append(_value) + if hasattr(prop, "Value"): + _value = prop.Value + _value.set("{" + NSMAP["ovf"] + "}value", str(value)) + else: + _value = E_OVF.Value() + _value.set("{" + NSMAP["ovf"] + "}value", str(value)) + prop.append(_value) else: product_section.append(property) is_updated = True