summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryingjisun <yingjisun@vmware.com>2020-02-26 21:31:41 +0800
committerYingji Sun <yingjisun@vmware.com>2020-09-02 02:10:11 +0000
commit0ea5bcca9d7bebf835b173c5e75dc89e666bcb99 (patch)
tree225b50074f16c10247ccd0070447a59c22607320
parent1c28a88afdfd012fa8b962a25a4b75f0198ada1b (diff)
downloadnova-0ea5bcca9d7bebf835b173c5e75dc89e666bcb99.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)
-rw-r--r--nova/tests/unit/virt/vmwareapi/test_vm_util.py90
-rw-r--r--nova/virt/vmwareapi/vm_util.py8
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 29ef75be76..9b47e1746e 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 a87d47d9cd..3c0cfe8773 100644
--- a/nova/virt/vmwareapi/vm_util.py
+++ b/nova/virt/vmwareapi/vm_util.py
@@ -250,9 +250,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)
@@ -424,7 +424,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.
"""
@@ -486,7 +486,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