From c65842b9d8912698c2ed7b109e546283f9e079c3 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Mon, 22 Jan 2018 21:16:19 +0530 Subject: [PATCH] Add check mode support in vmware_guest (#32858) This fix adds check mode support in vmware_guest Fixes: #32439 Signed-off-by: Abhijeet Kasurde --- .../modules/cloud/vmware/vmware_guest.py | 29 ++++++ .../targets/vmware_guest/tasks/check_mode.yml | 90 +++++++++++++++++++ .../targets/vmware_guest/tasks/main.yml | 1 + 3 files changed, 120 insertions(+) create mode 100644 test/integration/targets/vmware_guest/tasks/check_mode.yml diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest.py b/lib/ansible/modules/cloud/vmware/vmware_guest.py index 9ddacd14ae6..ce666fc7aa1 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_guest.py +++ b/lib/ansible/modules/cloud/vmware/vmware_guest.py @@ -1798,13 +1798,36 @@ def main(): if vm: if module.params['state'] == 'absent': # destroy it + if module.check_mode: + result.update( + vm_name=vm.name, + changed=True, + current_powerstate=vm.summary.runtime.powerState.lower(), + desired_operation='remove_vm', + ) + module.exit_json(**result) if module.params['force']: # has to be poweredoff first set_vm_power_state(pyv.content, vm, 'poweredoff', module.params['force']) result = pyv.remove_vm(vm) elif module.params['state'] == 'present': + if module.check_mode: + result.update( + vm_name=vm.name, + changed=True, + desired_operation='reconfigure_vm', + ) + module.exit_json(**result) result = pyv.reconfigure_vm() elif module.params['state'] in ['poweredon', 'poweredoff', 'restarted', 'suspended', 'shutdownguest', 'rebootguest']: + if module.check_mode: + result.update( + vm_name=vm.name, + changed=True, + current_powerstate=vm.summary.runtime.powerState.lower(), + desired_operation='set_vm_power_state', + ) + module.exit_json(**result) # set powerstate tmp_result = set_vm_power_state(pyv.content, vm, module.params['state'], module.params['force']) if tmp_result['changed']: @@ -1817,6 +1840,12 @@ def main(): # VM doesn't exist else: if module.params['state'] in ['poweredon', 'poweredoff', 'present', 'restarted', 'suspended']: + if module.check_mode: + result.update( + changed=True, + desired_operation='deploy_vm', + ) + module.exit_json(**result) result = pyv.deploy_vm() if result['failed']: module.fail_json(msg='Failed to create a virtual machine : %s' % result['msg']) diff --git a/test/integration/targets/vmware_guest/tasks/check_mode.yml b/test/integration/targets/vmware_guest/tasks/check_mode.yml new file mode 100644 index 00000000000..bcf75c7d6d8 --- /dev/null +++ b/test/integration/targets/vmware_guest/tasks/check_mode.yml @@ -0,0 +1,90 @@ +# Test code for the vmware_guest module. +# Copyright: (c) 2018, Abhijeet Kasurde +# 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: get a guest + set_fact: + guest1: "{{ vmlist.json[0] }}" + +- name: Perform all operation in check mode + vmware_guest: + validate_certs: False + hostname: "{{ vcsim }}" + username: "{{ vcsim_instance['json']['username'] }}" + password: "{{ vcsim_instance['json']['password'] }}" + name: "{{ guest1|basename }}" + datacenter: "{{ (guest1|basename).split('_')[0] }}" + state: "{{ item }}" + with_items: + - absent + - present + - poweredoff + - poweredon + - restarted + - suspended + - shutdownguest + - rebootguest + register: check_mode_state + check_mode: yes + +- debug: var=check_mode_state + +- name: assert that changes were made + assert: + that: + - "check_mode_state.results|map(attribute='changed')|unique|list == [true]" + - "check_mode_state.results|map(attribute='vm_name')|unique|list == [ guest1 | basename ]" + +- name: Perform all operation on non-existent VM in check mode + vmware_guest: + validate_certs: False + hostname: "{{ vcsim }}" + username: "{{ vcsim_instance['json']['username'] }}" + password: "{{ vcsim_instance['json']['password'] }}" + name: non_existent_vm + datacenter: "{{ (guest1|basename).split('_')[0] }}" + state: "{{ item }}" + with_items: + - present + - poweredoff + - poweredon + - restarted + - suspended + register: check_mode_state + check_mode: yes + +- debug: var=check_mode_state + +- name: assert that changes were made + assert: + that: + - "check_mode_state.results|map(attribute='changed')|unique|list == [true]" + - "check_mode_state.results|map(attribute='desired_operation')|unique|list == ['deploy_vm']" diff --git a/test/integration/targets/vmware_guest/tasks/main.yml b/test/integration/targets/vmware_guest/tasks/main.yml index 7c9c5aea65a..ae33f74866a 100644 --- a/test/integration/targets/vmware_guest/tasks/main.yml +++ b/test/integration/targets/vmware_guest/tasks/main.yml @@ -16,6 +16,7 @@ # Commenting following two is failing right now - 15 Dec 2017 #- include: poweroff_d1_c1_f0.yml #- include: poweroff_d1_c1_f1.yml +- include: check_mode.yml - include: clone_d1_c1_f0.yml - include: create_d1_c1_f0.yml - include: cdrom_d1_c1_f0.yml