diff --git a/nailgun/nailgun/consts.py b/nailgun/nailgun/consts.py index ccbe86038b..a3f3870207 100644 --- a/nailgun/nailgun/consts.py +++ b/nailgun/nailgun/consts.py @@ -529,3 +529,5 @@ HYPERVISORS = Enum( "kvm", "qemu" ) + +DPDK_DRIVER_IN_SRIOV_CASE = 'vfio-pci' diff --git a/nailgun/nailgun/extensions/network_manager/objects/interface.py b/nailgun/nailgun/extensions/network_manager/objects/interface.py index e3c0eb5c3d..1f2a8e4ae3 100644 --- a/nailgun/nailgun/extensions/network_manager/objects/interface.py +++ b/nailgun/nailgun/extensions/network_manager/objects/interface.py @@ -17,6 +17,7 @@ import six from sqlalchemy.sql import not_ +from nailgun import consts from nailgun.db import db from nailgun.db.sqlalchemy import models from nailgun.objects import Cluster @@ -70,9 +71,13 @@ class NIC(DPDKMixin, NailgunObject): @classmethod def get_dpdk_driver(cls, instance, dpdk_drivers): + from nailgun.objects import Node pci_id = instance.interface_properties.get('pci_id', '').lower() + sriov_enabled = Node.sriov_enabled(instance.node) for driver, device_ids in six.iteritems(dpdk_drivers): if pci_id in device_ids: + if sriov_enabled: + return consts.DPDK_DRIVER_IN_SRIOV_CASE return driver return None diff --git a/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py b/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py index af9df10ada..8969ecba25 100644 --- a/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py +++ b/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py @@ -123,7 +123,8 @@ class TestDeploymentAttributesSerialization90( return consts.DEFAULT_BRIDGES_NAMES.br_mesh @mock.patch('nailgun.objects.Release.get_supported_dpdk_drivers') - def _check_dpdk_serializing(self, drivers_mock, has_vlan_tag=False): + def _check_dpdk_serializing(self, drivers_mock, has_vlan_tag=False, + sriov=False): drivers_mock.return_value = { 'driver_1': ['test_id:1', 'test_id:2'] } @@ -131,6 +132,9 @@ class TestDeploymentAttributesSerialization90( 1, 3, cluster_id=self.cluster_db.id, roles=['compute'])[0] + + node.interfaces[0].interface_properties['sriov']['enabled'] = sriov + if has_vlan_tag: objects.NetworkGroup.get_node_network_by_name( node, 'private').vlan_start = '103' @@ -178,11 +182,17 @@ class TestDeploymentAttributesSerialization90( interfaces = serialised_node['network_scheme']['interfaces'] dpdk_interface = interfaces[dpdk_interface_name] vendor_specific = dpdk_interface.get('vendor_specific', {}) - self.assertEqual(vendor_specific.get('dpdk_driver'), 'driver_1') + if sriov: + self.assertEqual(vendor_specific.get('dpdk_driver'), 'vfio-pci') + else: + self.assertEqual(vendor_specific.get('dpdk_driver'), 'driver_1') def test_serialization_with_dpdk(self): self._check_dpdk_serializing() + def test_serialization_with_dpdk_sriov(self): + self._check_dpdk_serializing(sriov=True) + def test_serialization_with_dpdk_vxlan(self): self._create_cluster_with_vxlan() self._check_dpdk_serializing()