summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhijeet Kasurde <akasurde@redhat.com>2020-01-15 21:56:19 +0530
committerMatt Clay <matt@mystile.com>2020-04-14 18:13:19 -0700
commiteec5cc4f7338f35c37465fe4db203b347817617f (patch)
tree7e71939f72eed861cbbd39b97064649896753516
parent61c6a6b7b31cc0e8efd66edf71c4cb18759bc82c (diff)
downloadansible-eec5cc4f7338f35c37465fe4db203b347817617f.tar.gz
[2.9] VMware: Use existing DVPG network in vmware_guest_network
* Handle all cases of networks Fixes: #65968 Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com> (cherry picked from commit afb71c14bd28471d8e6dd37fb85a5a98d40cdb39)
-rw-r--r--changelogs/fragments/65968-vmware_guest_network.yml2
-rw-r--r--lib/ansible/modules/cloud/vmware/vmware_guest_network.py52
-rw-r--r--test/integration/targets/vmware_guest_network/tasks/main.yml113
3 files changed, 161 insertions, 6 deletions
diff --git a/changelogs/fragments/65968-vmware_guest_network.yml b/changelogs/fragments/65968-vmware_guest_network.yml
new file mode 100644
index 0000000000..b261f70455
--- /dev/null
+++ b/changelogs/fragments/65968-vmware_guest_network.yml
@@ -0,0 +1,2 @@
+bugfixes:
+- In vmware_guest_network module use appropriate network while creating or reconfiguring (https://github.com/ansible/ansible/issues/65968).
diff --git a/lib/ansible/modules/cloud/vmware/vmware_guest_network.py b/lib/ansible/modules/cloud/vmware/vmware_guest_network.py
index a67e4548d4..99892d8704 100644
--- a/lib/ansible/modules/cloud/vmware/vmware_guest_network.py
+++ b/lib/ansible/modules/cloud/vmware/vmware_guest_network.py
@@ -256,9 +256,27 @@ class PyVmomiHelper(PyVmomi):
nic = vim.vm.device.VirtualDeviceSpec()
nic.device = self.get_device_type(device_type=device_info.get('device_type', 'vmxnet3'))
nic.device.deviceInfo = vim.Description()
- nic.device.deviceInfo.summary = device_info['name']
- nic.device.backing = vim.vm.device.VirtualEthernetCard.NetworkBackingInfo()
- nic.device.backing.deviceName = device_info['name']
+ network_object = self.find_network_by_name(network_name=device_info['name'])[0]
+ if network_object:
+ if hasattr(network_object, 'portKeys'):
+ # DistributedVirtualPortGroup
+ nic.device.backing = vim.vm.device.VirtualEthernetCard.DistributedVirtualPortBackingInfo()
+ nic.device.backing.port = vim.dvs.PortConnection()
+ nic.device.backing.port.switchUuid = network_object.config.distributedVirtualSwitch.uuid
+ nic.device.backing.port.portgroupKey = network_object.key
+ elif isinstance(network_object, vim.OpaqueNetwork):
+ # NSX-T Logical Switch
+ nic.device.backing = vim.vm.device.VirtualEthernetCard.OpaqueNetworkBackingInfo()
+ network_id = network_object.summary.opaqueNetworkId
+ nic.device.backing.opaqueNetworkType = 'nsx.LogicalSwitch'
+ nic.device.backing.opaqueNetworkId = network_id
+ nic.device.deviceInfo.summary = 'nsx.LogicalSwitch: %s' % network_id
+ else:
+ # Standard vSwitch
+ nic.device.deviceInfo.summary = device_info['name']
+ nic.device.backing = vim.vm.device.VirtualEthernetCard.NetworkBackingInfo()
+ nic.device.backing.deviceName = device_info['name']
+ nic.device.backing.network = network_object
nic.device.connectable = vim.vm.device.VirtualDevice.ConnectInfo()
nic.device.connectable.startConnected = device_info.get('start_connected', True)
nic.device.connectable.allowGuestControl = True
@@ -402,9 +420,31 @@ class PyVmomiHelper(PyVmomi):
if 'connected' in network and nic_device.connectable.connected != network['connected']:
nic_device.connectable.connected = network['connected']
self.change_detected = True
- if 'name' in network and nic_device.deviceInfo.summary != network['name']:
- nic_device.deviceInfo.summary = network['name']
- self.change_detected = True
+ if 'name' in network:
+ network_object = self.find_network_by_name(network_name=network['name'])[0]
+ if network_object and hasattr(network_object, 'portKeys') and hasattr(nic_spec.device.backing, 'port'):
+ if network_object.config.distributedVirtualSwitch.uuid != nic_spec.device.backing.port.switchUuid:
+ # DistributedVirtualPortGroup
+ nic_spec.device.backing = vim.vm.device.VirtualEthernetCard.DistributedVirtualPortBackingInfo()
+ nic_spec.device.backing.port = vim.dvs.PortConnection()
+ nic_spec.device.backing.port.switchUuid = network_object.config.distributedVirtualSwitch.uuid
+ nic_spec.device.backing.port.portgroupKey = network_object.key
+ self.change_detected = True
+ elif network_object and isinstance(network_object, vim.OpaqueNetwork) and hasattr(nic_spec.device.backing, 'opaqueNetworkId'):
+ if nic_spec.device.backing.opaqueNetworkId != network_object.summary.opaqueNetworkId:
+ # NSX-T Logical Switch
+ nic_spec.device.backing = vim.vm.device.VirtualEthernetCard.OpaqueNetworkBackingInfo()
+ network_id = network_object.summary.opaqueNetworkId
+ nic_spec.device.backing.opaqueNetworkType = 'nsx.LogicalSwitch'
+ nic_spec.device.backing.opaqueNetworkId = network_id
+ nic_spec.device.deviceInfo.summary = 'nsx.LogicalSwitch: %s' % network_id
+ self.change_detected = True
+ elif nic_device.deviceInfo.summary != network['name']:
+ # Standard vSwitch
+ nic_spec.device.backing = vim.vm.device.VirtualEthernetCard.NetworkBackingInfo()
+ nic_spec.device.backing.deviceName = network['name']
+ nic_spec.device.backing.network = network_object
+ self.change_detected = True
if 'manual_mac' in network and nic_device.macAddress != network['manual_mac']:
if vm_obj.runtime.powerState != vim.VirtualMachinePowerState.poweredOff:
self.module.fail_json(msg='Expected power state is poweredOff to reconfigure MAC address')
diff --git a/test/integration/targets/vmware_guest_network/tasks/main.yml b/test/integration/targets/vmware_guest_network/tasks/main.yml
index bbf1bed0e1..76773b55a7 100644
--- a/test/integration/targets/vmware_guest_network/tasks/main.yml
+++ b/test/integration/targets/vmware_guest_network/tasks/main.yml
@@ -115,3 +115,116 @@
that:
- not no_nw_details.changed
- no_nw_details.failed
+
+ - name: Change portgroup to dvPortgroup
+ vmware_guest_network:
+ validate_certs: False
+ hostname: "{{ vcenter_hostname }}"
+ username: "{{ vcenter_username }}"
+ password: "{{ vcenter_password }}"
+ name: test_vm1
+ networks:
+ - name: "{{ dvpg1 }}"
+ label: "Network adapter 1"
+ connected: false
+ start_connected: true
+ state: present
+ register: change_netaddr_dvp
+
+ - debug: var=change_netaddr_dvp
+
+ - name: Check changed to dvPortgroup from PortGroup
+ assert:
+ that:
+ - change_netaddr_dvp.changed is sameas true
+
+ - name: Change portgroup to dvPortgroup
+ vmware_guest_network:
+ validate_certs: False
+ hostname: "{{ vcenter_hostname }}"
+ username: "{{ vcenter_username }}"
+ password: "{{ vcenter_password }}"
+ name: test_vm1
+ networks:
+ - name: "{{ dvpg1 }}"
+ label: "Network adapter 1"
+ connected: false
+ start_connected: true
+ state: present
+ register: change_netaddr_dvp
+
+ - debug: var=change_netaddr_dvp
+
+ - name: Check not changed of dvPortgroup
+ assert:
+ that:
+ - change_netaddr_dvp.changed is sameas false
+
+ - name: Change dvPortgroup to PortGroup
+ vmware_guest_network:
+ validate_certs: False
+ hostname: "{{ vcenter_hostname }}"
+ username: "{{ vcenter_username }}"
+ password: "{{ vcenter_password }}"
+ name: test_vm1
+ networks:
+ - name: "VM Network"
+ label: "Network adapter 1"
+ connected: false
+ start_connected: true
+ state: present
+ register: change_netaddr_pg
+
+ - debug: var=change_netaddr_pg
+
+ - name: Check changed to dvPortgroup from PortGroup
+ assert:
+ that:
+ - change_netaddr_pg.changed is sameas true
+ - change_netaddr_pg.network_data['0'].name == "VM Network"
+
+ - name: Change dvPortgroup to PortGroup
+ vmware_guest_network:
+ validate_certs: False
+ hostname: "{{ vcenter_hostname }}"
+ username: "{{ vcenter_username }}"
+ password: "{{ vcenter_password }}"
+ name: test_vm1
+ networks:
+ - name: "VM Network"
+ label: "Network adapter 1"
+ connected: false
+ start_connected: true
+ state: present
+ register: change_netaddr_pg
+
+ - debug: var=change_netaddr_pg
+
+ - name: Check not changed of PortGroup
+ assert:
+ that:
+ - change_netaddr_pg.changed is sameas false
+ - change_netaddr_pg.network_data['0'].name == "VM Network"
+
+ # https://github.com/ansible/ansible/issues/65968
+ - name: Create a network with dvPortgroup
+ vmware_guest_network:
+ validate_certs: False
+ hostname: "{{ vcenter_hostname }}"
+ username: "{{ vcenter_username }}"
+ password: "{{ vcenter_password }}"
+ name: test_vm1
+ networks:
+ - name: "{{ dvpg1 }}"
+ label: "Network adapter 2"
+ connected: true
+ start_connected: true
+ state: new
+ register: create_netaddr_pg
+
+ - debug: var=create_netaddr_pg
+
+ - name: Check if network is created with dvpg
+ assert:
+ that:
+ - create_netaddr_pg.changed is sameas true