From b52e2e6f16015a63e710d00d9743d07cab18cb3e Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Mon, 6 Jul 2020 18:00:03 +0000 Subject: [PATCH] Migrate "ethtool" to oslo.privsep Story: #2007686 Task: #40290 Change-Id: I78cc06c635e806b50ca2cc631732d55e430dd2f1 --- etc/neutron/rootwrap.d/dhcp.filters | 1 - etc/neutron/rootwrap.d/l3.filters | 1 - neutron/agent/linux/interface.py | 6 ++-- .../{ => privileged}/agent/linux/ethtool.py | 33 +++++++++---------- .../tests/unit/agent/linux/test_interface.py | 11 +++---- 5 files changed, 23 insertions(+), 29 deletions(-) rename neutron/{ => privileged}/agent/linux/ethtool.py (51%) diff --git a/etc/neutron/rootwrap.d/dhcp.filters b/etc/neutron/rootwrap.d/dhcp.filters index 8d9393d6a6c..dfc8018761c 100644 --- a/etc/neutron/rootwrap.d/dhcp.filters +++ b/etc/neutron/rootwrap.d/dhcp.filters @@ -10,7 +10,6 @@ # dhcp-agent dnsmasq: CommandFilter, dnsmasq, root -ethtool: CommandFilter, ethtool, root # dhcp-agent uses kill as well, that's handled by the generic KillFilter # it looks like these are the only signals needed, per # neutron/agent/linux/dhcp.py diff --git a/etc/neutron/rootwrap.d/l3.filters b/etc/neutron/rootwrap.d/l3.filters index ed304ccc74e..6b311e43811 100644 --- a/etc/neutron/rootwrap.d/l3.filters +++ b/etc/neutron/rootwrap.d/l3.filters @@ -12,7 +12,6 @@ arping: CommandFilter, arping, root # l3_agent -ethtool: CommandFilter, ethtool, root sysctl: CommandFilter, sysctl, root route: CommandFilter, route, root radvd: CommandFilter, radvd, root diff --git a/neutron/agent/linux/interface.py b/neutron/agent/linux/interface.py index 9f00e6f97f1..022488c4f56 100644 --- a/neutron/agent/linux/interface.py +++ b/neutron/agent/linux/interface.py @@ -24,12 +24,12 @@ from oslo_utils import excutils from pyroute2.netlink import exceptions as pyroute2_exc from neutron.agent.common import ovs_lib -from neutron.agent.linux import ethtool from neutron.agent.linux import ip_lib from neutron.common import utils from neutron.conf.plugins.ml2.drivers import ovs_conf from neutron.plugins.ml2.drivers.openvswitch.agent.common \ import constants as ovs_const +from neutron.privileged.agent.linux import ethtool LOG = logging.getLogger(__name__) @@ -439,8 +439,8 @@ class OVSInterfaceDriver(LinuxInterfaceDriver): # ovs-dpdk does not do checksum calculations for veth interface # (bug 1832021) if self.conf.OVS.datapath_type == ovs_const.OVS_DATAPATH_NETDEV: - ethtool.Ethtool.offload(ns_dev.name, rx=False, tx=False, - namespace=namespace) + ethtool.offload(ns_dev.name, rx=False, tx=False, + namespace=namespace) root_dev.link.set_up() def unplug(self, device_name, bridge=None, namespace=None, prefix=None): diff --git a/neutron/agent/linux/ethtool.py b/neutron/privileged/agent/linux/ethtool.py similarity index 51% rename from neutron/agent/linux/ethtool.py rename to neutron/privileged/agent/linux/ethtool.py index b28c41a8c25..3774148c37c 100644 --- a/neutron/agent/linux/ethtool.py +++ b/neutron/privileged/agent/linux/ethtool.py @@ -1,4 +1,4 @@ -# Copyright 2020 OpenStack Foundation +# Copyright 2020 Red Hat, Inc. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -13,22 +13,19 @@ # License for the specific language governing permissions and limitations # under the License. -from neutron.agent.linux import ip_lib +from oslo_concurrency import processutils + +from neutron import privileged + +COMMAND = 'ethtool' -class Ethtool(object): - - COMMAND = 'ethtool' - - @staticmethod - def _cmd(cmd, namespace, **kwargs): - ip_wrapper = ip_lib.IPWrapper(namespace) - return ip_wrapper.netns.execute(cmd, run_as_root=True, **kwargs) - - @classmethod - def offload(cls, device, rx, tx, namespace=None): - rx = 'on' if rx else 'off' - tx = 'on' if tx else 'off' - cmd = ['--offload', device, 'rx', rx, 'tx', tx] - cmd = [cls.COMMAND] + cmd - cls._cmd(cmd, namespace) +@privileged.default.entrypoint +def offload(device, rx, tx, namespace=None): + cmd = [] + if namespace: + cmd += ['ip', 'netns', 'exec', namespace] + rx = 'on' if rx else 'off' + tx = 'on' if tx else 'off' + cmd += [COMMAND, '--offload', device, 'rx', rx, 'tx', tx] + return processutils.execute(*cmd) diff --git a/neutron/tests/unit/agent/linux/test_interface.py b/neutron/tests/unit/agent/linux/test_interface.py index 4394c8316d6..ed8f3597e64 100644 --- a/neutron/tests/unit/agent/linux/test_interface.py +++ b/neutron/tests/unit/agent/linux/test_interface.py @@ -20,7 +20,6 @@ from oslo_utils import excutils from pyroute2.netlink import exceptions as pyroute2_exc from neutron.agent.common import ovs_lib -from neutron.agent.linux import ethtool from neutron.agent.linux import interface from neutron.agent.linux import ip_lib from neutron.common import utils @@ -28,6 +27,7 @@ from neutron.conf.agent import common as config from neutron.conf.plugins.ml2.drivers import ovs_conf from neutron.plugins.ml2.drivers.openvswitch.agent.common \ import constants as ovs_const +from neutron.privileged.agent.linux import ethtool from neutron.tests import base @@ -78,8 +78,8 @@ class TestBase(base.BaseTestCase): self.conf = config.setup_conf() ovs_conf.register_ovs_opts(self.conf) config.register_interface_opts(self.conf) - self.eth_tool_p = mock.patch.object(ethtool, 'Ethtool') - self.eth_tool = self.eth_tool_p.start() + self.eth_offload_p = mock.patch.object(ethtool, 'offload') + self.eth_offload = self.eth_offload_p.start() self.ip_dev_p = mock.patch.object(ip_lib, 'IPDevice') self.ip_dev = self.ip_dev_p.start() self.ip_p = mock.patch.object(ip_lib, 'IPWrapper') @@ -591,9 +591,8 @@ class TestOVSInterfaceDriverWithVeth(TestOVSInterfaceDriver): self.ip.assert_has_calls(expected) root_dev.assert_has_calls([mock.call.link.set_up()]) ns_dev.assert_has_calls([mock.call.link.set_up()]) - self.eth_tool.assert_has_calls([mock.call.offload( - devname, rx=False, - tx=False, namespace=namespace)]) + self.eth_offload.assert_has_calls( + [mock.call(devname, rx=False, tx=False, namespace=namespace)]) def test_plug_new(self): # The purpose of test_plug_new in parent class(TestOVSInterfaceDriver)