From 79c7d462c19fd54e67f887e9eceda3904b3046ee Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Mon, 14 May 2018 16:12:31 +0530 Subject: [PATCH] VMware: Check device type explicitly (#38729) Check datatype of device instead of comparing them directly in vmware_guest. Also, added testcases to check this behavior. DPVG is not supported in current version vcsim Signed-off-by: Abhijeet Kasurde --- .../modules/cloud/vmware/vmware_guest.py | 3 +- .../targets/vmware_guest/tasks/main.yml | 1 + .../tasks/network_with_device.yml | 97 +++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 test/integration/targets/vmware_guest/tasks/network_with_device.yml diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest.py b/lib/ansible/modules/cloud/vmware/vmware_guest.py index ab2d5f61a38..24f09ad1107 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_guest.py +++ b/lib/ansible/modules/cloud/vmware/vmware_guest.py @@ -1100,7 +1100,8 @@ class PyVmomiHelper(PyVmomi): nic_change_detected = True if 'device_type' in network_devices[key]: device = self.device_helper.get_device(network_devices[key]['device_type'], network_name) - if nic.device != device: + device_class = type(device) + if not isinstance(nic.device, device_class): self.module.fail_json(msg="Changing the device type is not possible when interface is already present. " "The failing device type is %s" % network_devices[key]['device_type']) # Changing mac address has no effect when editing interface diff --git a/test/integration/targets/vmware_guest/tasks/main.yml b/test/integration/targets/vmware_guest/tasks/main.yml index cea85769074..f76248c3ec8 100644 --- a/test/integration/targets/vmware_guest/tasks/main.yml +++ b/test/integration/targets/vmware_guest/tasks/main.yml @@ -28,3 +28,4 @@ #- include: template_d1_c1_f0.yml - include: vapp_d1_c1_f0.yml - include: disk_size_d1_c1_f0.yml +- include: network_with_device.yml \ No newline at end of file diff --git a/test/integration/targets/vmware_guest/tasks/network_with_device.yml b/test/integration/targets/vmware_guest/tasks/network_with_device.yml new file mode 100644 index 00000000000..fed58156832 --- /dev/null +++ b/test/integration/targets/vmware_guest/tasks/network_with_device.yml @@ -0,0 +1,97 @@ +# 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) + +# Testcase to check #38605 +- 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 + +- set_fact: + vm1: "{{ vmlist['json'][0] }}" + +- debug: var=vm1 + +- set_fact: + vm_name: "VM_{{ 10000 | random }}" + +- name: Deploy VM {{ vm1 | basename }} + vmware_guest: + hostname: "{{ vcsim }}" + username: "{{ vcsim_instance['json']['username'] }}" + password: "{{ vcsim_instance['json']['password'] }}" + validate_certs: False + datacenter: "{{ (vm1|basename).split('_')[0] }}" + state: poweredon + folder: "{{ vm1 | dirname }}" + name: "{{ vm_name }}" + disk: + - size: 10mb + autoselect_datastore: yes + guest_id: rhel7_64guest + hardware: + memory_mb: 512 + num_cpus: 1 + networks: + - name: 'VM Network' + device_type: "vmxnet3" + register: vm_result + +- debug: var=vm_result + +- assert: + that: + - "vm_result.changed" + +- name: Deploy VM {{ vm1 | basename }} again + vmware_guest: + hostname: "{{ vcsim }}" + username: "{{ vcsim_instance['json']['username'] }}" + password: "{{ vcsim_instance['json']['password'] }}" + validate_certs: False + datacenter: "{{ (vm1|basename).split('_')[0] }}" + state: poweredon + folder: "{{ vm1 | dirname }}" + name: "{{ vm_name }}" + disk: + - size: 10mb + autoselect_datastore: yes + guest_id: rhel7_64guest + hardware: + memory_mb: 512 + num_cpus: 1 + networks: + - name: 'VM Network' + device_type: "vmxnet3" + register: vm_result_again + +- debug: var=vm_result_again + +- assert: + that: + - "not vm_result_again.changed"