From 7c8b5a407d63e1292fda2377017f0459ab8e1ee9 Mon Sep 17 00:00:00 2001 From: chris93111 Date: Wed, 5 Dec 2018 11:20:23 +0100 Subject: [PATCH] VMware: Add option to modify disk type while cloning template (#47859) * Add parameters to module vmware_guest for conversion of disk to thin or thick when vm is cloned or deployed with template * unit test for convert clone vm Co-Authored-By: chris93111 --- ...59-vmware_guest-convert_vm_disk_clone.yaml | 2 + .../modules/cloud/vmware/vmware_guest.py | 22 +++++ .../vmware_guest/tasks/clone_d1_c1_f0.yml | 1 + .../vmware_guest/tasks/clone_with_convert.yml | 98 +++++++++++++++++++ .../targets/vmware_guest/tasks/main.yml | 1 + 5 files changed, 124 insertions(+) create mode 100644 changelogs/fragments/47859-vmware_guest-convert_vm_disk_clone.yaml create mode 100644 test/integration/targets/vmware_guest/tasks/clone_with_convert.yml diff --git a/changelogs/fragments/47859-vmware_guest-convert_vm_disk_clone.yaml b/changelogs/fragments/47859-vmware_guest-convert_vm_disk_clone.yaml new file mode 100644 index 00000000000..c16fff5ad9b --- /dev/null +++ b/changelogs/fragments/47859-vmware_guest-convert_vm_disk_clone.yaml @@ -0,0 +1,2 @@ +minor_changes: +- Add parameters to module vmware_guest for conversion of disk to thin or thick when vm is cloned or deployed with template or virtual machine. diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest.py b/lib/ansible/modules/cloud/vmware/vmware_guest.py index 6b156be8c2f..68f0fe4ab19 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_guest.py +++ b/lib/ansible/modules/cloud/vmware/vmware_guest.py @@ -336,6 +336,11 @@ options: - For example, when user has different datastore or datastore cluster for templates and virtual machines. - Please see example for more usage. version_added: '2.7' + convert: + description: + - Specify convert disk type while cloning template or virtual machine. + choices: [ thin, thick, eagerzeroedthick ] + version_added: '2.8' extends_documentation_fragment: vmware.documentation ''' @@ -2080,6 +2085,22 @@ class PyVmomiHelper(PyVmomi): relospec.host = self.select_host() relospec.datastore = datastore + # Convert disk present in template if is set + if self.params['convert']: + for device in vm_obj.config.hardware.device: + if hasattr(device.backing, 'fileName'): + disk_locator = vim.vm.RelocateSpec.DiskLocator() + disk_locator.diskBackingInfo = vim.vm.device.VirtualDisk.FlatVer2BackingInfo() + if self.params['convert'] in ['thin']: + disk_locator.diskBackingInfo.thinProvisioned = True + if self.params['convert'] in ['eagerzeroedthick']: + disk_locator.diskBackingInfo.eagerlyScrub = True + if self.params['convert'] in ['thick']: + disk_locator.diskBackingInfo.diskMode = "persistent" + disk_locator.diskId = device.key + disk_locator.datastore = datastore + relospec.disk.append(disk_locator) + # https://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.vm.RelocateSpec.html # > pool: For a clone operation from a template to a virtual machine, this argument is required. relospec.pool = resource_pool @@ -2352,6 +2373,7 @@ def main(): customization_spec=dict(type='str', default=None), vapp_properties=dict(type='list', default=[]), datastore=dict(type='str'), + convert=dict(type='str', choices=['thin', 'thick', 'eagerzeroedthick']), ) module = AnsibleModule(argument_spec=argument_spec, diff --git a/test/integration/targets/vmware_guest/tasks/clone_d1_c1_f0.yml b/test/integration/targets/vmware_guest/tasks/clone_d1_c1_f0.yml index 57640e3d213..4ee5aae3442 100644 --- a/test/integration/targets/vmware_guest/tasks/clone_d1_c1_f0.yml +++ b/test/integration/targets/vmware_guest/tasks/clone_d1_c1_f0.yml @@ -45,6 +45,7 @@ autoselect_datastore: True state: poweredoff folder: "{{ item|dirname }}" + convert: thin with_items: "{{ vmlist['json'] }}" register: clone_d1_c1_f0 diff --git a/test/integration/targets/vmware_guest/tasks/clone_with_convert.yml b/test/integration/targets/vmware_guest/tasks/clone_with_convert.yml new file mode 100644 index 00000000000..1e0dedeac1d --- /dev/null +++ b/test/integration/targets/vmware_guest/tasks/clone_with_convert.yml @@ -0,0 +1,98 @@ +# Test code for the vmware_guest module. +# Copyright: (c) 2018, Christophe FERREIRA +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +- name: Wait for Flask controller to come up online + wait_for: + host: "{{ vcsim }}" + port: 5000 + state: started + +- name: kill vcsim + uri: + url: http://{{ vcsim }}:5000/killall + +- name: start vcsim with no folders + uri: + url: http://{{ vcsim }}:5000/spawn?datacenter=1&cluster=1&folder=0 + register: vcsim_instance + +- name: Wait for Flask controller to come up online + wait_for: + host: "{{ vcsim }}" + port: 443 + state: started + +- name: get a list of VMS from vcsim + uri: + url: http://{{ vcsim }}:5000/govc_find?filter=VM + register: vmlist + +- debug: var=vcsim_instance +- debug: var=vmlist + +- name: clone vm from template and convert to thin + vmware_guest: + validate_certs: False + hostname: "{{ vcsim }}" + username: "{{ vcsim_instance['json']['username'] }}" + password: "{{ vcsim_instance['json']['password'] }}" + name: "{{ 'thin_' + item|basename }}" + template: "{{ item|basename }}" + datacenter: "{{ (item|basename).split('_')[0] }}" + state: poweredoff + folder: "{{ item|dirname }}" + convert: thin + with_items: "{{ vmlist['json'] }}" + register: clone_thin + +- debug: var=clone_thin + +- name: assert that changes were made + assert: + that: + - "clone_thin.results|map(attribute='changed')|unique|list == [true]" + +- name: clone vm from template and convert to thick + vmware_guest: + validate_certs: False + hostname: "{{ vcsim }}" + username: "{{ vcsim_instance['json']['username'] }}" + password: "{{ vcsim_instance['json']['password'] }}" + name: "{{ 'thick_' + item|basename }}" + template: "{{ item|basename }}" + datacenter: "{{ (item|basename).split('_')[0] }}" + state: poweredoff + folder: "{{ item|dirname }}" + convert: thick + with_items: "{{ vmlist['json'] }}" + register: clone_thick + +- debug: var=clone_thick + +- name: assert that changes were made + assert: + that: + - "clone_thick.results|map(attribute='changed')|unique|list == [true]" + +- name: clone vm from template and convert to eagerzeroedthick + vmware_guest: + validate_certs: False + hostname: "{{ vcsim }}" + username: "{{ vcsim_instance['json']['username'] }}" + password: "{{ vcsim_instance['json']['password'] }}" + name: "{{ 'eagerzeroedthick_' + item|basename }}" + template: "{{ item|basename }}" + datacenter: "{{ (item|basename).split('_')[0] }}" + state: poweredoff + folder: "{{ item|dirname }}" + convert: eagerzeroedthick + with_items: "{{ vmlist['json'] }}" + register: clone_eagerzeroedthick + +- debug: var=clone_eagerzeroedthick + +- name: assert that changes were made + assert: + that: + - "clone_eagerzeroedthick.results|map(attribute='changed')|unique|list == [true]" diff --git a/test/integration/targets/vmware_guest/tasks/main.yml b/test/integration/targets/vmware_guest/tasks/main.yml index ec24028faa4..41a86151916 100644 --- a/test/integration/targets/vmware_guest/tasks/main.yml +++ b/test/integration/targets/vmware_guest/tasks/main.yml @@ -32,3 +32,4 @@ - include: disk_mode_d1_c1_f0.yml - include: linked_clone_d1_c1_f0.yml - include: boot_firmware_d1_c1_f0.yml +- include: clone_with_convert.yml