commit 179dd0a46fd68b86bd5f7f21d761709802d70711
Author: Ondrej Lichtner <olichtne(a)redhat.com>
Date: Thu Aug 21 14:25:26 2014 +0200
NetTestSlave: remount sysfs in new net namespace
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(a)redhat.com>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
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(a)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()
Show replies by thread