From 16a93df010fe8237d57503cf693c50366a703656 Mon Sep 17 00:00:00 2001 From: Aleksey Kasatkin Date: Thu, 7 Apr 2016 18:46:11 +0300 Subject: [PATCH] DPDK is available for VLAN segmentation only Neutron segmentation type of the environment is now taken into account when dpdk.available property is calculated. Change-Id: I5db8fcdbf04b368044f52cf02b7672c2748fc9b2 Partial-Bug: #1564866 Closes-Bug: #1562841 --- nailgun/nailgun/objects/interface.py | 18 ++++++++++++++++- .../test/integration/test_node_nic_handler.py | 20 +++++++++++++++---- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/nailgun/nailgun/objects/interface.py b/nailgun/nailgun/objects/interface.py index d6961cfb3a..0c94fdaadf 100644 --- a/nailgun/nailgun/objects/interface.py +++ b/nailgun/nailgun/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 NailgunCollection @@ -75,7 +76,22 @@ class NIC(DPDKMixin, NailgunObject): @classmethod def dpdk_available(cls, instance, dpdk_drivers): - return cls.get_dpdk_driver(instance, dpdk_drivers) is not None + """Checks availability of DPDK for given interface. + + DPDK availability of the interface depends on presence of DPDK drivers + and libraries for particular NIC. It may vary for different OpenStack + releases. So, dpdk_drivers vary for different releases and it can be + not empty only for node that is assigned to cluster currently. Also, + DPDK is only supported for Neutron with VLAN segmentation currently. + + :param instance: NodeNICInterface instance + :param dpdk_drivers: DPDK drivers to PCI_ID mapping for cluster node is + currently assigned to (dict) + :return: True if DPDK is available + """ + return (cls.get_dpdk_driver(instance, dpdk_drivers) is not None and + instance.node.cluster.network_config.segmentation_type == + consts.NEUTRON_SEGMENT_TYPES.vlan) @classmethod def is_sriov_enabled(cls, instance): diff --git a/nailgun/nailgun/test/integration/test_node_nic_handler.py b/nailgun/nailgun/test/integration/test_node_nic_handler.py index c0a9615df2..adfe10d3ba 100644 --- a/nailgun/nailgun/test/integration/test_node_nic_handler.py +++ b/nailgun/nailgun/test/integration/test_node_nic_handler.py @@ -300,12 +300,12 @@ class TestHandlers(BaseIntegrationTest): for conn in ('assigned_networks', ): self.assertEqual(resp_nic[conn], []) - @patch('nailgun.objects.Release.get_supported_dpdk_drivers') - def test_update_dpdk_availability(self, drivers_mock): + def check_update_dpdk_availability(self, segment_type, drivers_mock, + dpdk_available): drivers_mock.return_value = { 'driver_1': ['8765:4321'] } - cluster = self.env.create_cluster() + cluster = self.env.create_cluster(net_segment_type=segment_type) meta = self.env.default_metadata() self.env.set_interfaces_in_meta(meta, [ {'name': 'eth0', 'mac': '00:00:00:00:00:00', 'current_speed': 1, @@ -340,9 +340,21 @@ class TestHandlers(BaseIntegrationTest): resp_nic['interface_properties']['dpdk'], { 'enabled': False, - 'available': True + 'available': dpdk_available }) + @patch('nailgun.objects.Release.get_supported_dpdk_drivers') + def test_update_dpdk_unavailable_tun(self, drivers_mock): + self.check_update_dpdk_availability(consts.NEUTRON_SEGMENT_TYPES.tun, + drivers_mock, + False) + + @patch('nailgun.objects.Release.get_supported_dpdk_drivers') + def test_update_dpdk_available_vlan(self, drivers_mock): + self.check_update_dpdk_availability(consts.NEUTRON_SEGMENT_TYPES.vlan, + drivers_mock, + True) + def test_NIC_offloading_modes(self): meta = self.env.default_metadata() meta["interfaces"] = []