From 969a0c5a3037dd02a2d9682cd42ca400a97aefe3 Mon Sep 17 00:00:00 2001 From: Nikola Dipanov Date: Wed, 30 Dec 2015 10:26:23 +0000 Subject: [PATCH] neutron: pci_request logic considers 'direct-physical' vnic type Since the following change: If1ab969c2002c649a3d51635ca2765c262e2d37f Neutron supports this vnic type, which ties in with the work that enabled PF passthrough. This patch makes sure to properly translate the 'direct-physical' vnic-type port from Neutron to a request for a PF. Change-Id: I51af36fc2edca3404a8f9efb32462f3680944be1 Partially-Implements: sriov-pf-passthrough-neutron-port --- nova/network/model.py | 3 ++- nova/network/neutronv2/api.py | 6 +++++- nova/pci/request.py | 7 +++++++ nova/tests/unit/network/test_neutronv2.py | 12 ++++++++---- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/nova/network/model.py b/nova/network/model.py index 81cfb6f5072c..cfbcd12fbff5 100644 --- a/nova/network/model.py +++ b/nova/network/model.py @@ -96,7 +96,8 @@ VNIC_TYPE_MACVTAP = 'macvtap' VNIC_TYPE_DIRECT_PHYSICAL = 'direct-physical' VNIC_TYPE_BAREMETAL = 'baremetal' -VNIC_TYPES_SRIOV = (VNIC_TYPE_DIRECT, VNIC_TYPE_MACVTAP) +VNIC_TYPES_SRIOV = (VNIC_TYPE_DIRECT, VNIC_TYPE_MACVTAP, + VNIC_TYPE_DIRECT_PHYSICAL) # Constants for the 'vif_model' values VIF_MODEL_VIRTIO = 'virtio' diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py index 715d61e1db3f..8d01b71be7d4 100644 --- a/nova/network/neutronv2/api.py +++ b/nova/network/neutronv2/api.py @@ -1069,9 +1069,13 @@ class API(base_api.NetworkAPI): context, neutron, request_net.port_id) pci_request_id = None if vnic_type in network_model.VNIC_TYPES_SRIOV: + spec = {pci_request.PCI_NET_TAG: phynet_name} + dev_type = pci_request.DEVICE_TYPE_FOR_VNIC_TYPE.get(vnic_type) + if dev_type: + spec[pci_request.PCI_DEVICE_TYPE_TAG] = dev_type request = objects.InstancePCIRequest( count=1, - spec=[{pci_request.PCI_NET_TAG: phynet_name}], + spec=[spec], request_id=str(uuid.uuid4())) pci_requests.requests.append(request) pci_request_id = request.request_id diff --git a/nova/pci/request.py b/nova/pci/request.py index cfbc8b178fb8..3712f5877ec3 100644 --- a/nova/pci/request.py +++ b/nova/pci/request.py @@ -45,11 +45,18 @@ import six import nova.conf from nova import exception from nova.i18n import _ +from nova.network import model as network_model from nova import objects from nova.objects import fields as obj_fields from nova.pci import utils PCI_NET_TAG = 'physical_network' +PCI_DEVICE_TYPE_TAG = 'dev_type' + +DEVICE_TYPE_FOR_VNIC_TYPE = { + network_model.VNIC_TYPE_DIRECT_PHYSICAL: obj_fields.PciDeviceType.SRIOV_PF +} + CONF = nova.conf.CONF diff --git a/nova/tests/unit/network/test_neutronv2.py b/nova/tests/unit/network/test_neutronv2.py index 43b1aa996415..4699cb336397 100644 --- a/nova/tests/unit/network/test_neutronv2.py +++ b/nova/tests/unit/network/test_neutronv2.py @@ -2926,20 +2926,24 @@ class TestNeutronv2(TestNeutronv2Base): objects.NetworkRequest(network_id='net1'), objects.NetworkRequest(port_id='my_portid2'), objects.NetworkRequest(port_id='my_portid3'), - objects.NetworkRequest(port_id='my_portid4')]) + objects.NetworkRequest(port_id='my_portid4'), + objects.NetworkRequest(port_id='my_portid5')]) pci_requests = objects.InstancePCIRequests(requests=[]) mock_get_port_vnic_info.side_effect = [ (model.VNIC_TYPE_DIRECT, 'phynet1'), (model.VNIC_TYPE_NORMAL, ''), (model.VNIC_TYPE_MACVTAP, 'phynet1'), - (model.VNIC_TYPE_MACVTAP, 'phynet2') + (model.VNIC_TYPE_MACVTAP, 'phynet2'), + (model.VNIC_TYPE_DIRECT_PHYSICAL, 'phynet3') ] api.create_pci_requests_for_sriov_ports( None, pci_requests, requested_networks) - self.assertEqual(3, len(pci_requests.requests)) + self.assertEqual(4, len(pci_requests.requests)) has_pci_request_id = [net.pci_request_id is not None for net in requested_networks.objects] - expected_results = [True, False, False, True, True] + self.assertEqual(pci_requests.requests[3].spec[0]["dev_type"], + "type-PF") + expected_results = [True, False, False, True, True, True] self.assertEqual(expected_results, has_pci_request_id)