From 9c51c8e22ba7e69bfd84104d1c65a8a6df9acedc Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 16 Jan 2017 23:40:10 +0400 Subject: [PATCH] Serialize mtu for dpdk interface with 'i40e' driver On NIC: XL710 with driver 'i40e' MTU does not take into account 4 bytes VLAN tag, so we should increase it manually DocImpact Change-Id: I3d95db9ec6fae4d8cd397c429d785dbdf1502b21 Partial-Bug: #1587310 Co-Authored-By: Fedor Zhadaev --- nailgun/nailgun/consts.py | 4 ++++ .../network_manager/managers/neutron.py | 23 +++++++++++++++++++ nailgun/nailgun/objects/cluster.py | 4 +++- .../test_orchestrator_serializer_90.py | 13 ++++++++++- nailgun/nailgun/test/unit/test_objects.py | 1 + 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/nailgun/nailgun/consts.py b/nailgun/nailgun/consts.py index 5490d6c7e8..3d3b1ae18b 100644 --- a/nailgun/nailgun/consts.py +++ b/nailgun/nailgun/consts.py @@ -528,3 +528,7 @@ HYPERVISORS = Enum( ) DPDK_DRIVER_IN_SRIOV_CASE = 'vfio-pci' + +DEFAULT_MTU = 1500 + +SIZE_OF_VLAN_TAG = 4 diff --git a/nailgun/nailgun/extensions/network_manager/managers/neutron.py b/nailgun/nailgun/extensions/network_manager/managers/neutron.py index 5ae55755d5..3ff8742cc1 100644 --- a/nailgun/nailgun/extensions/network_manager/managers/neutron.py +++ b/nailgun/nailgun/extensions/network_manager/managers/neutron.py @@ -554,3 +554,26 @@ class NeutronManager70( class NeutronManager80(AllocateVIPs80Mixin, NeutronManager70): pass + + +class NeutronManager90(NeutronManager80): + @classmethod + def get_iface_properties(cls, iface): + result = super(NeutronManager80, cls).get_iface_properties(iface) + + if (iface.type == consts.NETWORK_INTERFACE_TYPES.ether and + iface.driver == 'i40e' and + objects.NIC.dpdk_enabled(iface)): + # On NIC with i40e driver MTU should be increased manually + # because driver automatically sets value 4 bytes less + # LP 1587310 + mtu = result.get('mtu') + if mtu: + result.update({ + 'mtu': mtu + consts.SIZE_OF_VLAN_TAG + }) + else: + result.update({ + 'mtu': consts.DEFAULT_MTU + consts.SIZE_OF_VLAN_TAG + }) + return result diff --git a/nailgun/nailgun/objects/cluster.py b/nailgun/nailgun/objects/cluster.py index 37dd80e941..669b963c61 100644 --- a/nailgun/nailgun/objects/cluster.py +++ b/nailgun/nailgun/objects/cluster.py @@ -517,8 +517,10 @@ class Cluster(NailgunObject): if StrictVersion(ver) == StrictVersion('7.0'): return neutron.NeutronManager70 - if StrictVersion(ver) >= StrictVersion('8.0'): + if StrictVersion(ver) == StrictVersion('8.0'): return neutron.NeutronManager80 + if StrictVersion(ver) >= StrictVersion('9.0'): + return neutron.NeutronManager90 return neutron.NeutronManager elif net_provider == consts.CLUSTER_NET_PROVIDERS.nova_network: diff --git a/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py b/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py index a7ba96ff51..173a72631d 100644 --- a/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py +++ b/nailgun/nailgun/test/integration/test_orchestrator_serializer_90.py @@ -131,7 +131,7 @@ class TestDeploymentAttributesSerialization90( @mock.patch('nailgun.objects.Release.get_supported_dpdk_drivers') def _check_dpdk_serializing(self, drivers_mock, has_vlan_tag=False, sriov=False, max_queues=0, - dpdk_cpu_pinning=0): + dpdk_cpu_pinning=0, nic_driver=None): drivers_mock.return_value = { 'driver_1': ['test_id:1', 'test_id:2'] } @@ -154,6 +154,8 @@ class TestDeploymentAttributesSerialization90( dpdk_nic.meta['max_queues'] = max_queues if dpdk_cpu_pinning: node.attributes['cpu_pinning']['dpdk']['value'] = dpdk_cpu_pinning + if nic_driver: + dpdk_nic.driver = nic_driver objects.Cluster.prepare_for_deployment(self.cluster_db) @@ -205,6 +207,9 @@ class TestDeploymentAttributesSerialization90( min(max_queues, dpdk_cpu_pinning - 1)) else: self.assertFalse('max_queues' in vendor_specific) + if nic_driver: + self.assertEqual(dpdk_interface['mtu'], + consts.DEFAULT_MTU + consts.SIZE_OF_VLAN_TAG) def test_serialization_with_dpdk(self): self._check_dpdk_serializing() @@ -220,6 +225,12 @@ class TestDeploymentAttributesSerialization90( self._create_cluster_with_vxlan() self._check_dpdk_serializing(has_vlan_tag=True) + def test_serialization_with_dpdk_with_i40e_driver(self): + driver = 'i40e' + dpdk_cpu_pinning = 4 + self._check_dpdk_serializing(nic_driver=driver, + dpdk_cpu_pinning=dpdk_cpu_pinning) + def test_serialization_with_dpdk_queues_limited_max_queues(self): max_queues = 2 dpdk_cpu_pinning = 4 diff --git a/nailgun/nailgun/test/unit/test_objects.py b/nailgun/nailgun/test/unit/test_objects.py index d3aad5d15e..3697cc97db 100644 --- a/nailgun/nailgun/test/unit/test_objects.py +++ b/nailgun/nailgun/test/unit/test_objects.py @@ -1858,6 +1858,7 @@ class TestClusterObjectGetNetworkManager(BaseTestCase): ('2014.2.2-6.1', neutron.NeutronManager61), ('2015.6.7-7.0', neutron.NeutronManager70), ('2016.1.1-8.0', neutron.NeutronManager80), + ('mitaka-9.0', neutron.NeutronManager90) ): self.check_neutron_network_manager( consts.CLUSTER_NET_PROVIDERS.neutron,