From e08a69d2c3c074ea0525efab69603a4a4e5688ee Mon Sep 17 00:00:00 2001 From: Anastasiya Date: Tue, 27 Dec 2016 13:07:12 +0400 Subject: [PATCH] Serialize max queues count for dpdk interfases We need to configure queues count on dpdk interfaces. The count should be limited by max supported queues value on DPDK NIC and number of CPUs for DPDK usage. Change-Id: I9b3160b7e0659d11445ca3927aa38e523a93b3a9 Partial-Bug: #1643920 Depends-On: Iffa1a6c872b46230de6e9ab3b8f34cb727661571 (cherry picked from commit d56ab1b07d5c9ce33e2ce42e87349b0d738e1d5a) --- .../network_manager/objects/interface.py | 11 ++++++++- .../serializers/neutron_serializers.py | 3 +++ .../tests/test_node_nic_handler.py | 5 +++- .../test_orchestrator_serializer_90.py | 24 ++++++++++++++++++- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/nailgun/nailgun/extensions/network_manager/objects/interface.py b/nailgun/nailgun/extensions/network_manager/objects/interface.py index 2c28b1ec45..88e14d1309 100644 --- a/nailgun/nailgun/extensions/network_manager/objects/interface.py +++ b/nailgun/nailgun/extensions/network_manager/objects/interface.py @@ -89,6 +89,14 @@ class NIC(DPDKMixin, NailgunObject): return driver return None + @classmethod + def get_dpdk_queues_count(cls, instance): + dpdk_cpu_pinning = utils.get_in(instance.node.attributes, + 'cpu_pinning', 'dpdk', 'value') or 0 + max_queues = utils.get_in(instance.meta, 'max_queues') or 0 + # dpdk for ovs_core_mask is dpdk_cpu_pinning - 1 + return min(max_queues, dpdk_cpu_pinning - 1) + @classmethod def dpdk_available(cls, instance, dpdk_drivers): """Checks availability of DPDK for given interface. @@ -340,7 +348,8 @@ class NIC(DPDKMixin, NailgunObject): 'dpdk', {}).get('available', False) }, 'pci_id': interface_properties.get('pci_id', ''), - 'numa_node': interface_properties.get('numa_node') + 'numa_node': interface_properties.get('numa_node'), + 'max_queues': interface_properties.get('max_queues') } diff --git a/nailgun/nailgun/extensions/network_manager/serializers/neutron_serializers.py b/nailgun/nailgun/extensions/network_manager/serializers/neutron_serializers.py index e23dde9bad..844bb81e89 100644 --- a/nailgun/nailgun/extensions/network_manager/serializers/neutron_serializers.py +++ b/nailgun/nailgun/extensions/network_manager/serializers/neutron_serializers.py @@ -1456,6 +1456,9 @@ class DPDKSerializerMixin90(object): vendor_specific = network_scheme['interfaces'][iface.name].get( 'vendor_specific', {}) vendor_specific.update({'dpdk_driver': driver}) + max_queues = objects.NIC.get_dpdk_queues_count(iface) + if max_queues > 1: + vendor_specific.update({'max_queues': max_queues}) network_scheme['interfaces'][iface.name][ 'vendor_specific'] = vendor_specific return network_scheme diff --git a/nailgun/nailgun/extensions/network_manager/tests/test_node_nic_handler.py b/nailgun/nailgun/extensions/network_manager/tests/test_node_nic_handler.py index a0bed7c8e8..76fba8c66d 100644 --- a/nailgun/nailgun/extensions/network_manager/tests/test_node_nic_handler.py +++ b/nailgun/nailgun/extensions/network_manager/tests/test_node_nic_handler.py @@ -264,7 +264,8 @@ class TestHandlers(BaseIntegrationTest): 'pci_id': '1234:5678' }, 'pci_id': '8765:4321', - 'numa_node': 1 + 'numa_node': 1, + 'max_queues': 2 }}] ) node_data = {'mac': node['mac'], 'meta': new_meta, 'is_agent': True} @@ -349,6 +350,8 @@ class TestHandlers(BaseIntegrationTest): }) self.assertEqual( resp_nic['meta']['dpdk'], {'available': False}) + self.assertEqual( + resp_nic['meta']['max_queues'], 2) def create_cluster_and_node_with_dpdk_support(self, segment_type, drivers_mock): diff --git a/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py b/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py index 3d8a6275b6..1ca14a7bae 100644 --- a/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py +++ b/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py @@ -129,7 +129,8 @@ class TestDeploymentAttributesSerialization90( @mock.patch('nailgun.objects.Release.get_supported_dpdk_drivers') def _check_dpdk_serializing(self, drivers_mock, has_vlan_tag=False, - sriov=False): + sriov=False, max_queues=0, + dpdk_cpu_pinning=0): drivers_mock.return_value = { 'driver_1': ['test_id:1', 'test_id:2'] } @@ -149,6 +150,9 @@ class TestDeploymentAttributesSerialization90( self._assign_dpdk_to_nic(node, dpdk_nic, other_nic) dpdk_interface_name = dpdk_nic.name + dpdk_nic.meta['max_queues'] = max_queues + if dpdk_cpu_pinning: + node.attributes['cpu_pinning']['dpdk']['value'] = dpdk_cpu_pinning objects.Cluster.prepare_for_deployment(self.cluster_db) @@ -192,6 +196,12 @@ class TestDeploymentAttributesSerialization90( else: self.assertEqual(vendor_specific.get('dpdk_driver'), 'driver_1') + if max_queues > 1 and dpdk_cpu_pinning > 2: + self.assertEqual(vendor_specific.get('max_queues'), + min(max_queues, dpdk_cpu_pinning - 1)) + else: + self.assertFalse('max_queues' in vendor_specific) + def test_serialization_with_dpdk(self): self._check_dpdk_serializing() @@ -206,6 +216,18 @@ class TestDeploymentAttributesSerialization90( self._create_cluster_with_vxlan() self._check_dpdk_serializing(has_vlan_tag=True) + def test_serialization_with_dpdk_queues_limited_max_queues(self): + max_queues = 2 + dpdk_cpu_pinning = 4 + self._check_dpdk_serializing(max_queues=max_queues, + dpdk_cpu_pinning=dpdk_cpu_pinning) + + def test_serialization_with_dpdk_queues_limited_dpdk_cpu_pinning(self): + max_queues = 4 + dpdk_cpu_pinning = 3 + self._check_dpdk_serializing(max_queues=max_queues, + dpdk_cpu_pinning=dpdk_cpu_pinning) + @mock.patch('nailgun.objects.Release.get_supported_dpdk_drivers') def _check_dpdk_bond_serializing(self, attributes, drivers_mock): drivers_mock.return_value = {