return available_macs
-def get_pci_device_profile(pci_dev):
- dev_spec = pci_whitelist.get_pci_device_devspec(pci_dev)
- if dev_spec:
- return {'pci_vendor_info': "%s:%s" %
- (pci_dev.vendor_id, pci_dev.product_id),
- 'pci_slot': pci_dev.address,
- 'physical_network':
- dev_spec.get_tags().get('physical_network')}
- raise exception.PciDeviceNotFound(node_id=pci_dev.compute_node_id,
- address=pci_dev.address)
-
-
class API(base_api.NetworkAPI):
"""API for interacting with the neutron 2.x API."""
super(API, self).__init__()
self.last_neutron_extension_sync = None
self.extensions = {}
+ self.pci_whitelist = pci_whitelist.Whitelist(
+ CONF.pci.passthrough_whitelist)
def _update_port_with_migration_profile(
self, instance, port_id, port_profile, admin_client):
self._refresh_neutron_extensions_cache(context, neutron=neutron)
return constants.AUTO_ALLOCATE_TOPO_EXT in self.extensions
- @staticmethod
- def _populate_neutron_binding_profile(instance, pci_request_id,
+ def _get_pci_device_profile(self, pci_dev):
+ dev_spec = self.pci_whitelist.get_devspec(pci_dev)
+ if dev_spec:
+ return {'pci_vendor_info': "%s:%s" %
+ (pci_dev.vendor_id, pci_dev.product_id),
+ 'pci_slot': pci_dev.address,
+ 'physical_network':
+ dev_spec.get_tags().get('physical_network')}
+ raise exception.PciDeviceNotFound(node_id=pci_dev.compute_node_id,
+ address=pci_dev.address)
+
+ def _populate_neutron_binding_profile(self, instance, pci_request_id,
port_req_body):
"""Populate neutron binding:profile.
if pci_request_id:
pci_dev = pci_manager.get_instance_pci_devs(
instance, pci_request_id).pop()
- profile = get_pci_device_profile(pci_dev)
+ profile = self._get_pci_device_profile(pci_dev)
port_req_body['port']['binding:profile'] = profile
@staticmethod
pci_slot = binding_profile.get('pci_slot')
new_dev = pci_mapping.get(pci_slot)
if new_dev:
- binding_profile.update(get_pci_device_profile(new_dev))
+ binding_profile.update(
+ self._get_pci_device_profile(new_dev))
updates[BINDING_PROFILE] = binding_profile
else:
raise exception.PortUpdateFailed(port_id=p['id'],
update_port_mock.assert_called_once_with(
'fake-port-2', {'port': {'binding:host_id': instance.host}})
- @mock.patch.object(pci_whitelist, 'get_pci_device_devspec')
+ @mock.patch.object(pci_whitelist.Whitelist, 'get_devspec')
@mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock())
def test_update_port_bindings_for_instance_with_pci(self,
get_client_mock,
'physical_network': 'physnet1',
'pci_vendor_info': '1377:0047'}}})
- @mock.patch.object(pci_whitelist, 'get_pci_device_devspec')
+ @mock.patch.object(pci_whitelist.Whitelist, 'get_devspec')
@mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock())
def test_update_port_bindings_for_instance_with_pci_fail(self,
get_client_mock,
self.assertEqual(host_id, port_req_body['port']['binding:host_id'])
self.assertFalse(port_req_body['port'].get('binding:profile'))
- @mock.patch.object(pci_whitelist, 'get_pci_device_devspec')
+ @mock.patch.object(pci_whitelist.Whitelist, 'get_devspec')
@mock.patch.object(pci_manager, 'get_instance_pci_devs')
def test_populate_neutron_extension_values_binding_sriov(self,
mock_get_instance_pci_devs,
self.assertEqual(profile, port_req_body['port']['binding:profile'])
- @mock.patch.object(pci_whitelist, 'get_pci_device_devspec')
+ @mock.patch.object(pci_whitelist.Whitelist, 'get_devspec')
@mock.patch.object(pci_manager, 'get_instance_pci_devs')
def test_populate_neutron_extension_values_binding_sriov_fail(
self, mock_get_instance_pci_devs, mock_get_pci_device_devspec):
exception.PciDeviceNotFound, api._populate_neutron_binding_profile,
instance, pci_req_id, port_req_body)
+ @mock.patch.object(pci_manager, 'get_instance_pci_devs')
+ def test_pci_parse_whitelist_called_once(self,
+ mock_get_instance_pci_devs):
+ white_list = [
+ '{"address":"0000:0a:00.1","physical_network":"default"}']
+ cfg.CONF.set_override('passthrough_whitelist', white_list, 'pci')
+
+ api = neutronapi.API()
+ host_id = 'my_host_id'
+ instance = {'host': host_id}
+ pci_req_id = 'my_req_id'
+ port_req_body = {'port': {}}
+ pci_dev = {'vendor_id': '1377',
+ 'product_id': '0047',
+ 'address': '0000:0a:00.1',
+ }
+
+ whitelist = pci_whitelist.Whitelist(CONF.pci.passthrough_whitelist)
+ with mock.patch.object(pci_whitelist.Whitelist,
+ '_parse_white_list_from_config',
+ wraps=whitelist._parse_white_list_from_config
+ ) as mock_parse_whitelist:
+ for i in range(2):
+ mydev = objects.PciDevice.create(None, pci_dev)
+ mock_get_instance_pci_devs.return_value = [mydev]
+ api._populate_neutron_binding_profile(instance,
+ pci_req_id, port_req_body)
+ self.assertEqual(0, mock_parse_whitelist.call_count)
+
def _populate_pci_mac_address_fakes(self):
instance = fake_instance.fake_instance_obj(self.context)
pci_dev = {'vendor_id': '1377',