From df106ebc51ab9379e2a3143bbaa459bc63ed0556 Mon Sep 17 00:00:00 2001 From: Anastasiya Date: Mon, 9 Jan 2017 16:41:15 +0400 Subject: [PATCH] Fix get_dpdk_queues_count method It should return queues count limited by max supported queues value on DPDK NIC and number core for PMD. Change-Id: Ib28e2e699b62265ae9333912c1844ae3838b2de9 Closes-Bug: #1654950 --- .../network_manager/objects/interface.py | 9 ++-- .../network_manager/tests/test_objects.py | 46 +++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/nailgun/nailgun/extensions/network_manager/objects/interface.py b/nailgun/nailgun/extensions/network_manager/objects/interface.py index 88e14d1309..11ca9bf58f 100644 --- a/nailgun/nailgun/extensions/network_manager/objects/interface.py +++ b/nailgun/nailgun/extensions/network_manager/objects/interface.py @@ -91,11 +91,12 @@ class NIC(DPDKMixin, NailgunObject): @classmethod def get_dpdk_queues_count(cls, instance): - dpdk_cpu_pinning = utils.get_in(instance.node.attributes, - 'cpu_pinning', 'dpdk', 'value') or 0 + from nailgun.objects import NodeAttributes + cpu_pinning = NodeAttributes.distribute_node_cpus( + instance.node)['components'] + pmd_core_count = len(cpu_pinning.get('ovs_pmd_core_mask', [])) 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) + return min(max_queues, pmd_core_count) @classmethod def dpdk_available(cls, instance, dpdk_drivers): diff --git a/nailgun/nailgun/extensions/network_manager/tests/test_objects.py b/nailgun/nailgun/extensions/network_manager/tests/test_objects.py index bdbd43dd4d..00b02d90b8 100644 --- a/nailgun/nailgun/extensions/network_manager/tests/test_objects.py +++ b/nailgun/nailgun/extensions/network_manager/tests/test_objects.py @@ -245,6 +245,52 @@ class TestNICObject(BaseTestCase): self.env.clusters[0]) self.assertEqual(len(nic_interfaces), len(interfaces)) + def _prepare_dpdk_settings(self, dpdk_cpu_pinning, max_queues): + node = self.env.nodes[0] + dpdk_nic = node.nic_interfaces[0] + + numa_topology = {'numa_nodes': [ + {'id': 0, 'cpus': [1, 2, 3, 4]} + ]} + node.meta['numa_topology'] = numa_topology + node.attributes['cpu_pinning'] = { + 'dpdk': { + 'value': dpdk_cpu_pinning + } + } + objects.NIC.update(dpdk_nic, { + 'meta': { + 'dpdk': { + 'available': True + }, + 'max_queues': max_queues, + }, + 'attributes': { + 'dpdk': { + 'enabled': { + 'value': True + } + } + } + }) + return dpdk_nic + + def test_get_dpdk_queues_count_limited_pmd_core_count(self): + dpdk_cpu_pinning = 4 + max_queues = 10 + dpdk_queues_count = dpdk_cpu_pinning - 1 + dpdk_nic = self._prepare_dpdk_settings(dpdk_cpu_pinning, max_queues) + self.assertEqual(objects.NIC.get_dpdk_queues_count(dpdk_nic), + dpdk_queues_count) + + def test_get_dpdk_queues_count_limited_max_queues(self): + dpdk_cpu_pinning = 4 + max_queues = 2 + dpdk_queues_count = max_queues + dpdk_nic = self._prepare_dpdk_settings(dpdk_cpu_pinning, max_queues) + self.assertEqual(objects.NIC.get_dpdk_queues_count(dpdk_nic), + dpdk_queues_count) + class TestIPAddrObject(BaseTestCase):