diff options
author | yingjisun <yingjisun@vmware.com> | 2020-02-26 21:31:41 +0800 |
---|---|---|
committer | Yingji Sun <yingjisun@vmware.com> | 2020-09-22 00:57:14 +0000 |
commit | 75c0327a67bf12f4b18d6bb1561fc34bb7081264 (patch) | |
tree | c2c16536a2c96a9b88ba24eaec6d9843e767ac0d | |
parent | 4cf72ea6bfc58d33da894f248184c08c36055884 (diff) | |
download | nova-75c0327a67bf12f4b18d6bb1561fc34bb7081264.tar.gz |
Set different VirtualDevice.key
In vSphere 7.0, the VirtualDevice.key cannot be the same any more.
So set different values to VirtualDevice.key
Change-Id: I574ed88729d2f0760ea4065cc0e542eea8d20cc2
Closes-Bug: #1892961
(cherry picked from commit a5d153a4c64f6947531823c0df91be5cbc491977)
(cherry picked from commit 0ea5bcca9d7bebf835b173c5e75dc89e666bcb99)
-rw-r--r-- | nova/tests/unit/virt/vmwareapi/test_vm_util.py | 90 | ||||
-rw-r--r-- | nova/virt/vmwareapi/vm_util.py | 8 |
2 files changed, 94 insertions, 4 deletions
diff --git a/nova/tests/unit/virt/vmwareapi/test_vm_util.py b/nova/tests/unit/virt/vmwareapi/test_vm_util.py index ef19152d00..aa26346b38 100644 --- a/nova/tests/unit/virt/vmwareapi/test_vm_util.py +++ b/nova/tests/unit/virt/vmwareapi/test_vm_util.py @@ -1569,6 +1569,96 @@ class VMwareVMUtilTestCase(test.NoDBTestCase): profile_spec='fake_profile_spec') self.assertEqual(['fake_profile_spec'], create_spec.vmProfile) + def test_vm_create_spec_with_multi_vifs(self): + datastore = ds_obj.Datastore('fake-ds-ref', 'fake-ds-name') + extra_specs = vm_util.ExtraSpecs() + vif_info = {'network_name': 'br100', + 'mac_address': '00:00:00:ca:fe:01', + 'network_ref': {'type': 'DistributedVirtualPortgroup', + 'dvsw': 'fake-network-id1', + 'dvpg': 'fake-group'}, + 'iface_id': 7, + 'vif_model': 'VirtualE1000'} + vif_info2 = {'network_name': 'br101', + 'mac_address': '00:00:00:ca:fe:02', + 'network_ref': {'type': 'DistributedVirtualPortgroup', + 'dvsw': 'fake-network-id2', + 'dvpg': 'fake-group'}, + 'iface_id': 7, + 'vif_model': 'VirtualE1000'} + create_spec = vm_util.get_vm_create_spec(fake.FakeFactory(), + self._instance, + datastore.name, + [vif_info, vif_info2], + extra_specs) + + port = 'ns0:DistributedVirtualSwitchPortConnection' + backing = 'ns0:VirtualEthernetCardDistributedVirtualPortBackingInfo' + + device_changes = [] + fake_factory = fake.FakeFactory() + device_change = fake_factory.create('ns0:VirtualDeviceConfigSpec') + device_change.operation = 'add' + + device = fake_factory.create('ns0:VirtualE1000') + device.key = -47 + device.macAddress = '00:00:00:ca:fe:01' + device.addressType = 'manual' + device.wakeOnLanEnabled = True + + device.backing = fake_factory.create(backing) + device.backing.port = fake_factory.create(port) + device.backing.port.portgroupKey = 'fake-group' + device.backing.port.switchUuid = 'fake-network-id1' + + device.resourceAllocation = fake_factory.create( + 'ns0:VirtualEthernetCardResourceAllocation') + device.resourceAllocation.share = fake_factory.create( + 'ns0:SharesInfo') + device.resourceAllocation.share.level = None + device.resourceAllocation.share.shares = None + + connectable = fake_factory.create('ns0:VirtualDeviceConnectInfo') + connectable.allowGuestControl = True + connectable.connected = True + connectable.startConnected = True + device.connectable = connectable + device_change.device = device + + device_changes.append(device_change) + + device_change = fake_factory.create('ns0:VirtualDeviceConfigSpec') + device_change.operation = 'add' + + device = fake_factory.create('ns0:VirtualE1000') + device.key = -48 + device.macAddress = '00:00:00:ca:fe:02' + device.addressType = 'manual' + device.wakeOnLanEnabled = True + + device.backing = fake_factory.create(backing) + device.backing.port = fake_factory.create(port) + device.backing.port.portgroupKey = 'fake-group' + device.backing.port.switchUuid = 'fake-network-id2' + + device.resourceAllocation = fake_factory.create( + 'ns0:VirtualEthernetCardResourceAllocation') + device.resourceAllocation.share = fake_factory.create( + 'ns0:SharesInfo') + device.resourceAllocation.share.level = None + device.resourceAllocation.share.shares = None + + connectable = fake_factory.create('ns0:VirtualDeviceConnectInfo') + connectable.allowGuestControl = True + connectable.connected = True + connectable.startConnected = True + device.connectable = connectable + device_change.device = device + + device_changes.append(device_change) + + self.assertEqual(device_changes, create_spec.deviceChange) + @mock.patch.object(pbm, 'get_profile_id_by_name') def test_get_storage_profile_spec(self, mock_retrieve_profile_id): fake_profile_id = fake.DataObject() diff --git a/nova/virt/vmwareapi/vm_util.py b/nova/virt/vmwareapi/vm_util.py index 22820d5d84..ac3c1b9762 100644 --- a/nova/virt/vmwareapi/vm_util.py +++ b/nova/virt/vmwareapi/vm_util.py @@ -242,9 +242,9 @@ def get_vm_create_spec(client_factory, instance, data_store_name, config_spec.firmware = extra_specs.firmware devices = [] - for vif_info in vif_infos: + for i, vif_info in enumerate(vif_infos): vif_spec = _create_vif_spec(client_factory, vif_info, - extra_specs.vif_limits) + extra_specs.vif_limits, i) devices.append(vif_spec) serial_port_spec = create_serial_port_spec(client_factory) @@ -416,7 +416,7 @@ def convert_vif_model(name): return name -def _create_vif_spec(client_factory, vif_info, vif_limits=None): +def _create_vif_spec(client_factory, vif_info, vif_limits=None, offset=0): """Builds a config spec for the addition of a new network adapter to the VM. """ @@ -478,7 +478,7 @@ def _create_vif_spec(client_factory, vif_info, vif_limits=None): # The Server assigns a Key to the device. Here we pass a -ve temporary key. # -ve because actual keys are +ve numbers and we don't # want a clash with the key that server might associate with the device - net_device.key = -47 + net_device.key = -47 - offset net_device.addressType = "manual" net_device.macAddress = mac_address net_device.wakeOnLanEnabled = True |