diff options
author | Jenkins <jenkins@review.openstack.org> | 2016-09-19 07:05:35 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2016-09-19 07:05:35 +0000 |
commit | caded180489ff8143109b6981117e56e5f198791 (patch) | |
tree | e9c41d1fb1d6c1b0a2dba799c025d7539566f690 | |
parent | 8e60f21f803f97df7bf84803d7798cc067c84a3f (diff) | |
parent | ac04b087d84496e8f7d164883bb0c9ecb7296fc4 (diff) | |
download | nova-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.py | 20 | ||||
-rw-r--r-- | nova/tests/unit/virt/vmwareapi/test_vm_util.py | 45 | ||||
-rw-r--r-- | nova/virt/vmwareapi/vif.py | 10 | ||||
-rw-r--r-- | nova/virt/vmwareapi/vm_util.py | 2 |
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( |