modem: Move modem iface to its netns before using it
We used to do that once after ofono startup for all iface (modem-netns-setup.py), but then if a modem crashes the interface is re-created on the default netns, and tests fail until manual re-run of modem-netns-setup.py. This way now we always make sure the iface is moved to the expected netns before it is used. Related: OS#3881 Change-Id: I506309c424aa46684c4516a1a0217343ecbf32c6
This commit is contained in:
parent
b27827b7bc
commit
4c8cd7b9a5
|
@ -677,6 +677,7 @@ class Modem(MS):
|
||||||
iface = ctx_settings.get('Interface', None)
|
iface = ctx_settings.get('Interface', None)
|
||||||
if not iface:
|
if not iface:
|
||||||
raise log.Error('%s Settings contains no iface! %r' % (ctx_id, repr(ctx_settings)))
|
raise log.Error('%s Settings contains no iface! %r' % (ctx_id, repr(ctx_settings)))
|
||||||
|
util.move_iface_to_netns(iface, self.netns(), self.run_dir.new_dir('move_netns'))
|
||||||
self.run_netns_wait('ifup', ('ip', 'link', 'set', 'dev', iface, 'up'))
|
self.run_netns_wait('ifup', ('ip', 'link', 'set', 'dev', iface, 'up'))
|
||||||
self.run_netns_wait('dhcp', ('udhcpc', '-q', '-i', iface))
|
self.run_netns_wait('dhcp', ('udhcpc', '-q', '-i', iface))
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,17 @@ def setcap_net_admin(binary, run_dir):
|
||||||
proc = Process(SETCAP_NET_ADMIN_BIN, run_dir, ['sudo', SETCAP_NET_ADMIN_BIN, binary])
|
proc = Process(SETCAP_NET_ADMIN_BIN, run_dir, ['sudo', SETCAP_NET_ADMIN_BIN, binary])
|
||||||
proc.launch_sync()
|
proc.launch_sync()
|
||||||
|
|
||||||
|
def move_iface_to_netns(ifname, netns, run_dir):
|
||||||
|
'''
|
||||||
|
Moves an iface to a netns. It creates the netns if it doesn't exist.
|
||||||
|
fail_iface_not_found=False is handy in order to assume the iface is already
|
||||||
|
in another netns and thus cannot be foud.
|
||||||
|
'''
|
||||||
|
from .process import Process
|
||||||
|
NETNS_SETUP_BIN = 'osmo-gsm-tester_netns_setup.sh'
|
||||||
|
proc = Process('move_netns', run_dir, ['sudo', NETNS_SETUP_BIN, ifname, netns])
|
||||||
|
proc.launch_sync()
|
||||||
|
|
||||||
def import_path_prepend(pathname):
|
def import_path_prepend(pathname):
|
||||||
dir = os.path.realpath(pathname)
|
dir = os.path.realpath(pathname)
|
||||||
if dir not in sys.path:
|
if dir not in sys.path:
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
ifname="$1"
|
||||||
|
netns="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if [ -f "/var/run/netns/${netns}" ]; then
|
||||||
|
echo "netns $netns already exists"
|
||||||
|
else
|
||||||
|
echo "Creating netns $netns"
|
||||||
|
ip netns add "$netns"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "/sys/class/net/${ifname}" ]; then
|
||||||
|
echo "Moving iface $ifname to netns $netns"
|
||||||
|
ip link set $ifname netns $netns
|
||||||
|
else
|
||||||
|
ip netns exec $netns ls "/sys/class/net/${ifname}" >/dev/null && echo "iface $ifname already in netns $netns"
|
||||||
|
fi
|
Loading…
Reference in New Issue