From 314f9fbd5caec7a98c6d6e74718989ed1ec6e061 Mon Sep 17 00:00:00 2001 From: Pavan Bidkar Date: Tue, 8 Oct 2019 02:11:57 +0530 Subject: [PATCH] Support latest version while upgrading VM hardware. (#62188) Support for the `latest` version during an VM hardware upgrade. --- ...st-version-while-upgrading-VM-hardware.yml | 2 + .../modules/cloud/vmware/vmware_guest.py | 73 +++++++++++-------- .../targets/vmware_guest/defaults/main.yml | 1 + .../tasks/reconfig_vm_to_latest_version.yml | 27 +++++++ 4 files changed, 74 insertions(+), 29 deletions(-) create mode 100644 changelogs/fragments/62188-VMware-Guest-Support-latest-version-while-upgrading-VM-hardware.yml create mode 100644 test/integration/targets/vmware_guest/tasks/reconfig_vm_to_latest_version.yml diff --git a/changelogs/fragments/62188-VMware-Guest-Support-latest-version-while-upgrading-VM-hardware.yml b/changelogs/fragments/62188-VMware-Guest-Support-latest-version-while-upgrading-VM-hardware.yml new file mode 100644 index 00000000000..7e7624dd6bf --- /dev/null +++ b/changelogs/fragments/62188-VMware-Guest-Support-latest-version-while-upgrading-VM-hardware.yml @@ -0,0 +1,2 @@ +bugfixes: +- vmware_guest - Add ability to upgrade the guest hardware version to latest fix issue #56273. \ No newline at end of file diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest.py b/lib/ansible/modules/cloud/vmware/vmware_guest.py index b00cab4cf7b..f89c4dfe5fc 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_guest.py +++ b/lib/ansible/modules/cloud/vmware/vmware_guest.py @@ -151,6 +151,8 @@ options: - ' - C(cpu_reservation) (integer): The amount of CPU resource that is guaranteed available to the virtual machine. Unit is MHz. version_added: 2.5' - ' - C(version) (integer): The Virtual machine hardware versions. Default is 10 (ESXi 5.5 and onwards). + If value specified as C(latest), version is set to the most current virtual hardware supported on the host. + C(latest) is added in version 2.10. Please check VMware documentation for correct virtual machine hardware version. Incorrect hardware version may lead to failure in deployment. If hardware version is already equal to the given version then no action is taken. version_added: 2.6' @@ -1246,42 +1248,55 @@ class PyVmomiHelper(PyVmomi): if 'version' in self.params['hardware']: hw_version_check_failed = False temp_version = self.params['hardware'].get('version', 10) - try: - temp_version = int(temp_version) - except ValueError: - hw_version_check_failed = True + if temp_version.lower() == 'latest': + # Check is to make sure vm_obj is not of type template + if vm_obj and not vm_obj.config.template: + try: + task = vm_obj.UpgradeVM_Task() + self.wait_for_task(task) + if task.info.state == 'error': + return {'changed': self.change_applied, 'failed': True, 'msg': task.info.error.msg, 'op': 'upgrade'} + except vim.fault.AlreadyUpgraded: + # Don't fail if VM is already upgraded. + pass + else: + try: + temp_version = int(temp_version) + except ValueError: + hw_version_check_failed = True - if temp_version not in range(3, 15): - hw_version_check_failed = True + if temp_version not in range(3, 16): + hw_version_check_failed = True - if hw_version_check_failed: - self.module.fail_json(msg="Failed to set hardware.version '%s' value as valid" + if hw_version_check_failed: + self.module.fail_json(msg="Failed to set hardware.version '%s' value as valid" " values range from 3 (ESX 2.x) to 14 (ESXi 6.5 and greater)." % temp_version) - # Hardware version is denoted as "vmx-10" - version = "vmx-%02d" % temp_version - self.configspec.version = version - if vm_obj is None or self.configspec.version != vm_obj.config.version: - self.change_detected = True - if vm_obj is not None: - # VM exists and we need to update the hardware version - current_version = vm_obj.config.version - # current_version = "vmx-10" - version_digit = int(current_version.split("-", 1)[-1]) - if temp_version < version_digit: - self.module.fail_json(msg="Current hardware version '%d' which is greater than the specified" + # Hardware version is denoted as "vmx-10" + version = "vmx-%02d" % temp_version + self.configspec.version = version + if vm_obj is None or self.configspec.version != vm_obj.config.version: + self.change_detected = True + # Check is to make sure vm_obj is not of type template + if vm_obj and not vm_obj.config.template: + # VM exists and we need to update the hardware version + current_version = vm_obj.config.version + # current_version = "vmx-10" + version_digit = int(current_version.split("-", 1)[-1]) + if temp_version < version_digit: + self.module.fail_json(msg="Current hardware version '%d' which is greater than the specified" " version '%d'. Downgrading hardware version is" " not supported. Please specify version greater" " than the current version." % (version_digit, temp_version)) - new_version = "vmx-%02d" % temp_version - try: - task = vm_obj.UpgradeVM_Task(new_version) - self.wait_for_task(task) - if task.info.state == 'error': - return {'changed': self.change_applied, 'failed': True, 'msg': task.info.error.msg, 'op': 'upgrade'} - except vim.fault.AlreadyUpgraded: - # Don't fail if VM is already upgraded. - pass + new_version = "vmx-%02d" % temp_version + try: + task = vm_obj.UpgradeVM_Task(new_version) + self.wait_for_task(task) + if task.info.state == 'error': + return {'changed': self.change_applied, 'failed': True, 'msg': task.info.error.msg, 'op': 'upgrade'} + except vim.fault.AlreadyUpgraded: + # Don't fail if VM is already upgraded. + pass if 'virt_based_security' in self.params['hardware']: host_version = self.select_host().summary.config.product.version diff --git a/test/integration/targets/vmware_guest/defaults/main.yml b/test/integration/targets/vmware_guest/defaults/main.yml index 4ca49641613..67367fe15e0 100644 --- a/test/integration/targets/vmware_guest/defaults/main.yml +++ b/test/integration/targets/vmware_guest/defaults/main.yml @@ -29,3 +29,4 @@ vmware_guest_test_playbooks: - poweroff_d1_c1_f1.yml # - template_d1_c1_f0.yml - vapp_d1_c1_f0.yml + - reconfig_vm_to_latest_version.yml diff --git a/test/integration/targets/vmware_guest/tasks/reconfig_vm_to_latest_version.yml b/test/integration/targets/vmware_guest/tasks/reconfig_vm_to_latest_version.yml new file mode 100644 index 00000000000..9b992133a91 --- /dev/null +++ b/test/integration/targets/vmware_guest/tasks/reconfig_vm_to_latest_version.yml @@ -0,0 +1,27 @@ +# Test code for the vmware_guest module. +# Copyright: (c) 2019, Pavan Bidkar +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +# Skipping out idepotency test untill issue fixed in reconfigure_vm() become_method + +- name: Upgrade VM to latest version + vmware_guest: + validate_certs: False + hostname: "{{ vcenter_hostname }}" + username: "{{ vcenter_username }}" + password: "{{ vcenter_password }}" + name: test_vm1 + guest_id: centos7_64Guest + datacenter: "{{ dc1 }}" + folder: "{{ f0 }}" + datastore: '{{ ds2 }}' + hardware: + num_cpus: 4 + memory_mb: 1028 + version: latest + state: present + register: upgrade_vm + +- name: assert that changes were made + assert: + that: + - upgrade_vm is changed