summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2016-09-19 07:05:35 +0000
committerGerrit Code Review <review@openstack.org>2016-09-19 07:05:35 +0000
commitcaded180489ff8143109b6981117e56e5f198791 (patch)
treee9c41d1fb1d6c1b0a2dba799c025d7539566f690
parent8e60f21f803f97df7bf84803d7798cc067c84a3f (diff)
parentac04b087d84496e8f7d164883bb0c9ecb7296fc4 (diff)
downloadnova-caded180489ff8143109b6981117e56e5f198791.tar.gz
Merge "VMware: Use Port Group and Key in binding details" into stable/mitaka
-rw-r--r--nova/tests/unit/virt/vmwareapi/test_vif.py20
-rw-r--r--nova/tests/unit/virt/vmwareapi/test_vm_util.py45
-rw-r--r--nova/virt/vmwareapi/vif.py10
-rw-r--r--nova/virt/vmwareapi/vm_util.py2
4 files changed, 65 insertions, 12 deletions
diff --git a/nova/tests/unit/virt/vmwareapi/test_vif.py b/nova/tests/unit/virt/vmwareapi/test_vif.py
index 515f298e2f..0b0c77058a 100644
--- a/nova/tests/unit/virt/vmwareapi/test_vif.py
+++ b/nova/tests/unit/virt/vmwareapi/test_vif.py
@@ -269,6 +269,26 @@ class VMwareVifTestCase(test.NoDBTestCase):
'fake-cluster')
self.assertEqual(fake_network_obj, network_ref)
+ @mock.patch.object(network_util, 'get_network_with_the_name')
+ def test_get_neutron_network_dvs_vif_details(self, mock_network_name):
+ fake_network_obj = {'type': 'DistributedVirtualPortgroup',
+ 'dvpg': 'pg1',
+ 'dvsw': 'fake-props'}
+ mock_network_name.return_value = fake_network_obj
+ vif_info = network_model.NetworkInfo([
+ network_model.VIF(type=network_model.VIF_TYPE_DVS,
+ details={'dvs_port_key': 'key1',
+ 'dvs_port_group_name': 'pg1'},
+ address='DE:AD:BE:EF:00:00',
+ network=self._network)])[0]
+ network_ref = vif._get_neutron_network('fake-session',
+ 'fake-cluster',
+ vif_info)
+ mock_network_name.assert_called_once_with('fake-session',
+ 'pg1',
+ 'fake-cluster')
+ self.assertEqual(fake_network_obj, network_ref)
+
@mock.patch.object(network_util, 'get_network_with_the_name',
return_value=None)
def test_get_neutron_network_dvs_no_match(self, mock_network_name):
diff --git a/nova/tests/unit/virt/vmwareapi/test_vm_util.py b/nova/tests/unit/virt/vmwareapi/test_vm_util.py
index 2005ed6b09..de80c115c3 100644
--- a/nova/tests/unit/virt/vmwareapi/test_vm_util.py
+++ b/nova/tests/unit/virt/vmwareapi/test_vm_util.py
@@ -1188,22 +1188,15 @@ class VMwareVMUtilTestCase(test.NoDBTestCase):
expected.deviceChange.append(device_change)
self.assertEqual(expected, result)
- def test_get_create_vif_spec(self):
- vif_info = {'network_name': 'br100',
- 'mac_address': '00:00:00:ca:fe:01',
- 'network_ref': {'type': 'DistributedVirtualPortgroup',
- 'dvsw': 'fake-network-id',
- 'dvpg': 'fake-group'},
- 'iface_id': 7,
- 'vif_model': 'VirtualE1000'}
- fake_factory = fake.FakeFactory()
+ def _get_create_vif_spec(self, fake_factory, vif_info):
limits = vm_util.Limits()
limits.limit = 10
limits.reservation = 20
limits.shares_level = 'custom'
limits.shares_share = 40
- result = vm_util._create_vif_spec(
- fake_factory, vif_info, limits)
+ return vm_util._create_vif_spec(fake_factory, vif_info, limits)
+
+ def _construct_vif_spec(self, fake_factory, vif_info):
port = 'ns0:DistributedVirtualSwitchPortConnection'
backing = 'ns0:VirtualEthernetCardDistributedVirtualPortBackingInfo'
@@ -1220,6 +1213,9 @@ class VMwareVMUtilTestCase(test.NoDBTestCase):
device.backing.port = fake_factory.create(port)
device.backing.port.portgroupKey = vif_info['network_ref']['dvpg']
device.backing.port.switchUuid = vif_info['network_ref']['dvsw']
+ if vif_info['network_ref'].get('dvs_port_key'):
+ device.backing.port.portKey = (
+ vif_info['network_ref']['dvs_port_key'])
device.resourceAllocation = fake_factory.create(
'ns0:VirtualEthernetCardResourceAllocation')
@@ -1236,6 +1232,33 @@ class VMwareVMUtilTestCase(test.NoDBTestCase):
connectable.startConnected = True
device.connectable = connectable
device_change.device = device
+ return device_change
+
+ def test_get_create_vif_spec(self):
+ vif_info = {'network_name': 'br100',
+ 'mac_address': '00:00:00:ca:fe:01',
+ 'network_ref': {'type': 'DistributedVirtualPortgroup',
+ 'dvsw': 'fake-network-id',
+ 'dvpg': 'fake-group'},
+ 'iface_id': 7,
+ 'vif_model': 'VirtualE1000'}
+ fake_factory = fake.FakeFactory()
+ result = self._get_create_vif_spec(fake_factory, vif_info)
+ device_change = self._construct_vif_spec(fake_factory, vif_info)
+ self.assertEqual(device_change, result)
+
+ def test_get_create_vif_spec_dvs_port_key(self):
+ vif_info = {'network_name': 'br100',
+ 'mac_address': '00:00:00:ca:fe:01',
+ 'network_ref': {'type': 'DistributedVirtualPortgroup',
+ 'dvsw': 'fake-network-id',
+ 'dvpg': 'fake-group',
+ 'dvs_port_key': 'fake-key'},
+ 'iface_id': 7,
+ 'vif_model': 'VirtualE1000'}
+ fake_factory = fake.FakeFactory()
+ result = self._get_create_vif_spec(fake_factory, vif_info)
+ device_change = self._construct_vif_spec(fake_factory, vif_info)
self.assertEqual(device_change, result)
def test_get_network_detach_config_spec(self):
diff --git a/nova/virt/vmwareapi/vif.py b/nova/virt/vmwareapi/vif.py
index eb8882c111..d5d9ab6daa 100644
--- a/nova/virt/vmwareapi/vif.py
+++ b/nova/virt/vmwareapi/vif.py
@@ -132,11 +132,19 @@ def _get_neutron_network(session, cluster, vif):
'network-type': network_type,
'use-external-id': use_external_id}
elif vif['type'] == model.VIF_TYPE_DVS:
- network_id = vif['network']['bridge']
+ # Port binding for DVS VIF types may pass the name
+ # of the port group, so use it if present
+ network_id = vif.get('details', {}).get('dvs_port_group_name')
+ if network_id is None:
+ # Make use of the original one, in the event that the
+ # port binding does not provide this key in VIF details
+ network_id = vif['network']['bridge']
network_ref = network_util.get_network_with_the_name(
session, network_id, cluster)
if not network_ref:
raise exception.NetworkNotFoundForBridge(bridge=network_id)
+ if vif.get('details') and vif['details'].get('dvs_port_key'):
+ network_ref['dvs_port_key'] = vif['details']['dvs_port_key']
else:
reason = _('vif type %s not supported') % vif['type']
raise exception.InvalidInput(reason=reason)
diff --git a/nova/virt/vmwareapi/vm_util.py b/nova/virt/vmwareapi/vm_util.py
index 05bd74c418..4ef5aceb90 100644
--- a/nova/virt/vmwareapi/vm_util.py
+++ b/nova/virt/vmwareapi/vm_util.py
@@ -453,6 +453,8 @@ def _create_vif_spec(client_factory, vif_info, vif_limits=None):
'ns0:DistributedVirtualSwitchPortConnection')
portgroup.switchUuid = network_ref['dvsw']
portgroup.portgroupKey = network_ref['dvpg']
+ if 'dvs_port_key' in network_ref:
+ portgroup.portKey = network_ref['dvs_port_key']
backing.port = portgroup
else:
backing = client_factory.create(