From 435649274bd82b28d66e9af62eeefe4cf8d30cf5 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Mon, 26 Feb 2018 13:21:43 +0530 Subject: [PATCH] VMware: Hardware version support (#36562) This fix adds support for specifying hardware version for virtual machine. Fixes: #35831 Signed-off-by: Abhijeet Kasurde --- lib/ansible/module_utils/vmware.py | 1 + .../modules/cloud/vmware/vmware_guest.py | 47 ++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/ansible/module_utils/vmware.py b/lib/ansible/module_utils/vmware.py index 00fd022c471..08837a577dd 100644 --- a/lib/ansible/module_utils/vmware.py +++ b/lib/ansible/module_utils/vmware.py @@ -290,6 +290,7 @@ def gather_vm_facts(content, vm): 'hw_guest_ha_state': None, 'hw_is_template': vm.config.template, 'hw_folder': None, + 'hw_version': vm.config.version, 'guest_tools_status': _get_vm_prop(vm, ('guest', 'toolsRunningStatus')), 'guest_tools_version': _get_vm_prop(vm, ('guest', 'toolsVersion')), 'guest_question': vm.summary.runtime.question, diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest.py b/lib/ansible/modules/cloud/vmware/vmware_guest.py index 17af3c586e2..d405faf85e3 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_guest.py +++ b/lib/ansible/modules/cloud/vmware/vmware_guest.py @@ -109,6 +109,10 @@ options: version_added: 2.5' - ' - 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). + Please check VMware documentation for correct virtual machine hardware version. + Incorrect hardware version may lead to failure in deployment. If hardware version is already to given version then no action is taken. + version_added: 2.6' guest_id: description: @@ -292,6 +296,7 @@ EXAMPLES = r''' hotadd_cpu: True hotremove_cpu: True hotadd_memory: False + version: 12 # Hardware version of VM cdrom: type: iso iso_path: "[datastore1] livecd.iso" @@ -880,9 +885,9 @@ class PyVmomiHelper(PyVmomi): Args: vm_obj: virtual machine object """ - # maxMksConnections == max_connections if 'hardware' in self.params: if 'max_connections' in self.params['hardware']: + # maxMksConnections == max_connections self.configspec.maxMksConnections = int(self.params['hardware']['max_connections']) if vm_obj is None or self.configspec.maxMksConnections != vm_obj.config.hardware.maxMksConnections: self.change_detected = True @@ -892,6 +897,46 @@ class PyVmomiHelper(PyVmomi): if vm_obj is None or self.configspec.nestedHVEnabled != bool(vm_obj.config.nestedHVEnabled): self.change_detected = True + 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 not in range(3, 15): + hw_version_check_failed = True + + 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" + " 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': + self.change_detected = True + except vim.fault.AlreadyUpgraded: + # Don't fail if VM is already upgraded. + pass + def get_vm_cdrom_device(self, vm=None): if vm is None: return None