From 35fc5d66ab5e88d5f28d6b6c47b5c4440ca8d089 Mon Sep 17 00:00:00 2001 From: Keigo Noha Date: Thu, 18 Jul 2019 15:15:30 +0900 Subject: [PATCH] Add ETHTOOL_OPTS support for LinuxBond class LinuxBonding accepts ETHTOOL_OPTS. This commit adds ETHTOOL_OPTS support for LinuxBond class. Change-Id: I85fc4a617532bf8ebd19f54dc87f49b5a2e3810f --- os_net_config/objects.py | 6 ++- os_net_config/schema.yaml | 2 + os_net_config/tests/test_impl_ifcfg.py | 25 ++++++++++++ os_net_config/tests/test_objects.py | 54 +++++++++++++++++++++----- 4 files changed, 75 insertions(+), 12 deletions(-) diff --git a/os_net_config/objects.py b/os_net_config/objects.py index 45b649f5..538c3673 100644 --- a/os_net_config/objects.py +++ b/os_net_config/objects.py @@ -976,7 +976,7 @@ class LinuxBond(_BaseOpts): members=None, bonding_options=None, nic_mapping=None, persist_mapping=False, defroute=True, dhclient_args=None, dns_servers=None, nm_controlled=False, onboot=True, - domain=None): + domain=None, ethtool_opts=None): addresses = addresses or [] routes = routes or [] rules = rules or [] @@ -989,6 +989,7 @@ class LinuxBond(_BaseOpts): nm_controlled, onboot, domain) self.members = members self.bonding_options = bonding_options + self.ethtool_opts = ethtool_opts for member in self.members: if isinstance(member, SriovVF): LinuxBond.update_vf_config(member) @@ -1031,6 +1032,7 @@ class LinuxBond(_BaseOpts): onboot, domain) = _BaseOpts.base_opts_from_json( json, include_primary=False) bonding_options = json.get('bonding_options') + ethtool_opts = json.get('ethtool_opts', None) members = _update_members(json, nic_mapping, persist_mapping) @@ -1042,7 +1044,7 @@ class LinuxBond(_BaseOpts): persist_mapping=persist_mapping, defroute=defroute, dhclient_args=dhclient_args, dns_servers=dns_servers, nm_controlled=nm_controlled, onboot=onboot, - domain=domain) + domain=domain, ethtool_opts=ethtool_opts) class OvsBond(_BaseOpts): diff --git a/os_net_config/schema.yaml b/os_net_config/schema.yaml index f831f359..56439604 100644 --- a/os_net_config/schema.yaml +++ b/os_net_config/schema.yaml @@ -1165,6 +1165,8 @@ definitions: $ref: "#/definitions/bool_or_param" domain: $ref: "#/definitions/list_of_domain_name_string_or_domain_name_string" + ethtool_opts: + $ref: "#/definitions/string_or_param" required: - type - name diff --git a/os_net_config/tests/test_impl_ifcfg.py b/os_net_config/tests/test_impl_ifcfg.py index 697ea2f5..b553ea19 100644 --- a/os_net_config/tests/test_impl_ifcfg.py +++ b/os_net_config/tests/test_impl_ifcfg.py @@ -1234,6 +1234,31 @@ ETHTOOL_OPTS=\"speed 1000 duplex full\" "ETHTOOL_OPTS=\"speed 1000 duplex full\"\n")) self.assertEqual(ib_config, self.get_interface_config('ib0')) + def test_linux_bond_with_ethtool_opts(self): + interface1 = objects.Interface( + 'em1', + ethtool_opts='-K ${DEVICE} tx-gre-csum-segmentation off') + interface2 = objects.Interface( + 'em2', + ethtool_opts='-K ${DEVICE} tx-gre-csum-segmentation off') + bond = objects.LinuxBond( + 'bond0', use_dhcp=True, + members=[interface1, interface2], + ethtool_opts='-K ${DEVICE} tx-gre-csum-segmentation off') + self.provider.add_linux_bond(bond) + self.provider.add_interface(interface1) + self.provider.add_interface(interface2) + bond_config = "".join( + (_LINUX_BOND_DHCP, + "ETHTOOL_OPTS=\"-K ${DEVICE} tx-gre-csum-segmentation off\"\n")) + interface_config = "".join( + (_LINUX_BOND_INTERFACE, + "ETHTOOL_OPTS=\"-K ${DEVICE} tx-gre-csum-segmentation off\"\n")) + self.assertEqual(bond_config, + self.get_linux_bond_config('bond0')) + self.assertEqual(interface_config, + self.get_interface_config('em1')) + def test_interface_single_dns_server(self): interface1 = objects.Interface('em1', dns_servers=['1.2.3.4']) self.provider.add_interface(interface1) diff --git a/os_net_config/tests/test_objects.py b/os_net_config/tests/test_objects.py index 691d838b..0d427213 100644 --- a/os_net_config/tests/test_objects.py +++ b/os_net_config/tests/test_objects.py @@ -1179,12 +1179,13 @@ class TestLinuxBond(base.TestCase): ] } """ - bridge = objects.object_from_json(json.loads(data)) - self.assertEqual("bond1", bridge.name) - self.assertTrue(bridge.use_dhcp) - interface1 = bridge.members[0] + bond = objects.object_from_json(json.loads(data)) + self.assertEqual("bond1", bond.name) + self.assertTrue(bond.use_dhcp) + self.assertIsNone(bond.ethtool_opts) + interface1 = bond.members[0] self.assertEqual("em1", interface1.name) - interface2 = bridge.members[1] + interface2 = bond.members[1] self.assertEqual("em2", interface2.name) def test_from_json_dhcp_with_nic1_nic2(self): @@ -1209,12 +1210,12 @@ class TestLinuxBond(base.TestCase): ] } """ - bridge = objects.object_from_json(json.loads(data)) - self.assertEqual("bond1", bridge.name) - self.assertTrue(bridge.use_dhcp) - interface1 = bridge.members[0] + bond = objects.object_from_json(json.loads(data)) + self.assertEqual("bond1", bond.name) + self.assertTrue(bond.use_dhcp) + interface1 = bond.members[0] self.assertEqual("em1", interface1.name) - interface2 = bridge.members[1] + interface2 = bond.members[1] self.assertEqual("em2", interface2.name) def test_linux_bond_with_vf_default(self): @@ -1338,6 +1339,39 @@ class TestLinuxBond(base.TestCase): vf_map = yaml.safe_load(contents) if contents else [] self.assertListEqual(vf_final, vf_map) + def test_linux_bond_with_ethtool_opts(self): + data = """{ +"type": "linux_bond", +"name": "bond1", +"use_dhcp": true, +"ethtool_opts": "-K ${DEVICE} tx-gre-csum-segmentation off", +"members": [ + { + "type": "interface", + "name": "em1", + "ethtool_opts": "-K ${DEVICE} tx-gre-csum-segmentation off" + }, + { + "type": "interface", + "name": "em2", + "ethtool_opts": "-K ${DEVICE} tx-gre-csum-segmentation off" + } +] +} +""" + bond = objects.object_from_json(json.loads(data)) + self.assertEqual("bond1", bond.name) + self.assertEqual("-K ${DEVICE} tx-gre-csum-segmentation off", + bond.ethtool_opts) + interface1 = bond.members[0] + interface2 = bond.members[1] + self.assertEqual("em1", interface1.name) + self.assertEqual("em2", interface2.name) + self.assertEqual("-K ${DEVICE} tx-gre-csum-segmentation off", + interface1.ethtool_opts) + self.assertEqual("-K ${DEVICE} tx-gre-csum-segmentation off", + interface2.ethtool_opts) + class TestOvsTunnel(base.TestCase):