From b5318e2c348e52c82026ec4b2a1d35609fd8a944 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Fri, 15 Dec 2017 17:54:52 +0530 Subject: [PATCH] VMware: Add NIC configuration option (#33851) This fix adds following configurable parameters to virtual network card of virtual machine. * WakeOnLanEnabled * StartConnected * AllowGuestControl Signed-off-by: Abhijeet Kasurde --- .../modules/cloud/vmware/vmware_guest.py | 22 +++++- .../vmware_guest/tasks/create_d1_c1_f0.yml | 2 +- .../vmware_guest/tasks/create_nw_d1_c1_f0.yml | 67 +++++++++++++++++++ .../targets/vmware_guest/tasks/main.yml | 1 + 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 test/integration/targets/vmware_guest/tasks/create_nw_d1_c1_f0.yml diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest.py b/lib/ansible/modules/cloud/vmware/vmware_guest.py index 673e70d084c..56f4fdabc2b 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_guest.py +++ b/lib/ansible/modules/cloud/vmware/vmware_guest.py @@ -180,6 +180,9 @@ options: - ' - C(gateway) (string): Static gateway.' - ' - C(dns_servers) (string): DNS servers for this network interface (Windows).' - ' - C(domain) (string): Domain name for this network interface (Windows).' + - ' - C(wake_on_lan) (bool): Indicates if wake-on-LAN is enabled on this virtual network adapter. version_added: 2.5' + - ' - C(start_connected) (bool): Indicates that virtual network adapter starts with associated virtual machine powers on. version_added: 2.5' + - ' - C(allow_guest_control) (bool): Enables guest control over whether the connectable device is connected. version_added: 2.5' version_added: '2.3' customization: description: @@ -474,13 +477,13 @@ class PyVmomiDeviceHelper(object): else: self.module.fail_json(msg='Invalid device_type "%s" for network "%s"' % (device_type, device_infos['name'])) - nic.device.wakeOnLanEnabled = True + nic.device.wakeOnLanEnabled = bool(device_infos.get('wake_on_lan', True)) nic.device.deviceInfo = vim.Description() nic.device.deviceInfo.label = device_label nic.device.deviceInfo.summary = device_infos['name'] nic.device.connectable = vim.vm.device.VirtualDevice.ConnectInfo() - nic.device.connectable.startConnected = True - nic.device.connectable.allowGuestControl = True + nic.device.connectable.startConnected = bool(device_infos.get('start_connected', True)) + nic.device.connectable.allowGuestControl = bool(device_infos.get('allow_guest_control', True)) nic.device.connectable.connected = True if 'mac' in device_infos and self.is_valid_mac_addr(device_infos['mac']): nic.device.addressType = 'manual' @@ -844,6 +847,19 @@ class PyVmomiHelper(PyVmomi): "The failing new MAC address is %s" % nic.device.macAddress) nic.device = current_net_devices[key] + if ('wake_on_lan' in network_devices[key] and + nic.device.wakeOnLanEnabled != network_devices[key].get('wake_on_lan')): + nic.device.wakeOnLanEnabled = network_devices[key].get('wake_on_lan') + nic_change_detected = True + if ('start_connected' in network_devices[key] and + nic.device.connectable.startConnected != network_devices[key].get('start_connected')): + nic.device.connectable.startConnected = network_devices[key].get('start_connected') + nic_change_detected = True + if ('allow_guest_control' in network_devices[key] and + nic.device.connectable.allowGuestControl != network_devices[key].get('allow_guest_control')): + nic.device.connectable.allowGuestControl = network_devices[key].get('allow_guest_control') + nic_change_detected = True + nic.device.deviceInfo = vim.Description() else: nic.operation = vim.vm.device.VirtualDeviceSpec.Operation.add diff --git a/test/integration/targets/vmware_guest/tasks/create_d1_c1_f0.yml b/test/integration/targets/vmware_guest/tasks/create_d1_c1_f0.yml index 3eb51adf3b4..25a008ddf8f 100644 --- a/test/integration/targets/vmware_guest/tasks/create_d1_c1_f0.yml +++ b/test/integration/targets/vmware_guest/tasks/create_d1_c1_f0.yml @@ -22,7 +22,7 @@ port: 443 state: started -- name: get a list of VMS from vcsim +- name: get a list of VMS from vcsim uri: url: http://{{ vcsim }}:5000/govc_find?filter=VM register: vmlist diff --git a/test/integration/targets/vmware_guest/tasks/create_nw_d1_c1_f0.yml b/test/integration/targets/vmware_guest/tasks/create_nw_d1_c1_f0.yml new file mode 100644 index 00000000000..1adc731521b --- /dev/null +++ b/test/integration/targets/vmware_guest/tasks/create_nw_d1_c1_f0.yml @@ -0,0 +1,67 @@ +# Test code for the vmware_guest module. +# Copyright: (c) 2017, 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: create new VMs + vmware_guest: + validate_certs: False + hostname: "{{ vcsim }}" + username: "{{ vcsim_instance['json']['username'] }}" + password: "{{ vcsim_instance['json']['password'] }}" + name: "{{ 'newvmnw_' + item|basename }}" + guest_id: centos64Guest + datacenter: "{{ (item|basename).split('_')[0] }}" + hardware: + num_cpus: 4 + memory_mb: 512 + disk: + - size: 0gb + type: thin + autoselect_datastore: True + networks: + - name: 'VM Network' + device_type: vmxnet3 + ip: 192.168.10.1 + netmask: 255.255.255.0 + wake_on_lan: True + start_connected: True + allow_guest_control: True + state: poweredoff + folder: "{{ item|dirname }}" + with_items: "{{ vmlist['json'] }}" + register: clone_d1_c1_f0 + +- debug: var=clone_d1_c1_f0 + +- name: assert that changes were made + assert: + that: + - "clone_d1_c1_f0.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 1d561bd0974..798649cb60e 100644 --- a/test/integration/targets/vmware_guest/tasks/main.yml +++ b/test/integration/targets/vmware_guest/tasks/main.yml @@ -22,4 +22,5 @@ - include: create_guest_invalid_d1_c1_f0.yml - include: mac_address_d1_c1_f0.yml - include: disk_type_d1_c1_f0.yml +- include: create_nw_d1_c1_f0.yml #- include: template_d1_c1_f0.yml