From afb71c14bd28471d8e6dd37fb85a5a98d40cdb39 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Wed, 15 Jan 2020 21:56:19 +0530 Subject: [PATCH] VMware: Use existing DVPG network in vmware_guest_network (#65994) * Handle all cases of networks Fixes: #65968 Signed-off-by: Abhijeet Kasurde --- .../fragments/65968-vmware_guest_network.yml | 2 + .../cloud/vmware/vmware_guest_network.py | 52 +++++++- .../vmware_guest_network/tasks/main.yml | 113 ++++++++++++++++++ 3 files changed, 161 insertions(+), 6 deletions(-) create mode 100644 changelogs/fragments/65968-vmware_guest_network.yml diff --git a/changelogs/fragments/65968-vmware_guest_network.yml b/changelogs/fragments/65968-vmware_guest_network.yml new file mode 100644 index 00000000000..b261f704553 --- /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 d8bd5715a77..cd1cc0e1405 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_guest_network.py +++ b/lib/ansible/modules/cloud/vmware/vmware_guest_network.py @@ -306,9 +306,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 @@ -461,9 +479,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 f2f3b20c5c9..3a9eada26e3 100644 --- a/test/integration/targets/vmware_guest_network/tasks/main.yml +++ b/test/integration/targets/vmware_guest_network/tasks/main.yml @@ -235,3 +235,116 @@ that: - not (no_nw_details is 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