From: Ondrej Lichtner olichtne@redhat.com
Creating a new network namespace does not change the contents of the sysfs filesystem which makes it unusable for network configuration purposes. This patch fixes that by creating a new mount namespace and remounting the sysfs filesystem.
This also means that we don't need to use iproute2 to create Bonding interfaces anymore.
Signed-off-by: Ondrej Lichtner olichtne@redhat.com --- lnst/Slave/NetConfigDevice.py | 28 +++++----------------------- lnst/Slave/NetTestSlave.py | 14 +++++++++++++- 2 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py index 338df67..86744db 100644 --- a/lnst/Slave/NetConfigDevice.py +++ b/lnst/Slave/NetConfigDevice.py @@ -14,8 +14,6 @@ jpirko@redhat.com (Jiri Pirko) import logging import re import sys -from platform import release -from distutils.version import LooseVersion from lnst.Common.ExecCmd import exec_cmd from lnst.Slave.NetConfigCommon import get_slaves, get_option, get_slave_option from lnst.Common.Utils import kmod_in_use, bool_it @@ -88,16 +86,9 @@ class NetConfigDeviceBond(NetConfigDeviceGeneric): _moduleparams = "max_bonds=0"
def _add_rm_bond(self, mark): - #3.10 works on rhel7, I didn't test which oldest version works... - if LooseVersion(release()) > LooseVersion('3.10'): - if mark == "+": - exec_cmd('ip link add %s type bond' % self._dev_config["name"]) - elif mark == "-": - exec_cmd('ip link del %s' % self._dev_config["name"]) - else: - bond_masters = "/sys/class/net/bonding_masters" - exec_cmd('echo "%s%s" > %s' % (mark, self._dev_config["name"], - bond_masters)) + bond_masters = "/sys/class/net/bonding_masters" + exec_cmd('echo "%s%s" > %s' % (mark, self._dev_config["name"], + bond_masters))
def _get_bond_dir(self): return "/sys/class/net/%s/bonding" % self._dev_config["name"] @@ -123,20 +114,11 @@ class NetConfigDeviceBond(NetConfigDeviceGeneric): slave_dev = self._if_manager.get_mapped_device(slave_id) slave_conf = slave_dev.get_conf_dict() slave_name = slave_dev.get_name() - bond_name = self._dev_config["name"] if mark == "+": slave_dev.down()
- #3.10 works on rhel7, I didn't test which oldest version works... - if LooseVersion(release()) > LooseVersion('3.10'): - if mark == "+": - exec_cmd('ip link set %s master %s' % (slave_name, - bond_name)) - elif mark == "-": - exec_cmd('ip link set %s nomaster' % (slave_name)) - else: - exec_cmd('echo "%s%s" > %s/slaves' % (mark, slave_name, - self._get_bond_dir())) + exec_cmd('echo "%s%s" > %s/slaves' % (mark, slave_name, + self._get_bond_dir()))
def configure(self): self._add_rm_bond("+") diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py index 780cd9a..8db7b8f 100644 --- a/lnst/Slave/NetTestSlave.py +++ b/lnst/Slave/NetTestSlave.py @@ -402,9 +402,21 @@ class SlaveMethods: elif pid == 0: #create new network namespace libc_name = ctypes.util.find_library("c") - CLONE_NEWNET = 0x40000000 #from sched.h + #from sched.h + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x00020000 + #based on ipnetns.c from the iproute2 project + MNT_DETACH = 0x00000002 + MS_SLAVE = 1<<19 + MS_REC = 16384 + libc = ctypes.CDLL(libc_name) libc.unshare(CLONE_NEWNET) + #based on ipnetns.c from the iproute2 project + libc.unshare(CLONE_NEWNS) + libc.mount("", "/", "none", MS_SLAVE | MS_REC, 0) + libc.umount2("/sys", MNT_DETACH) + libc.mount(netns, "/sys", "sysfs", 0, 0)
#set ctl socket to pipe to main netns self._server_handler.close_s_sock()