Add a helper to bring network interfaces up on a site, and to retrieve
configured IP addresses.
Signed-off-by: David Gibson
---
test/tasst/exesite.py | 33 +++++++++++++++++++++++++++++++--
test/tasst/nstool.py | 11 +++++++++--
2 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/test/tasst/exesite.py b/test/tasst/exesite.py
index 2e15129f..246f9b3f 100644
--- a/test/tasst/exesite.py
+++ b/test/tasst/exesite.py
@@ -13,12 +13,13 @@ tasst/exesite.py - Manage simulated network sites for testing
import contextlib
+import ipaddress
import json
import avocado
from avocado.utils.process import CmdError
from avocado_classless.test import (
- assert_eq, assert_in, assert_raises, test_output
+ assert_eq, assert_eq_unordered, assert_in, assert_raises, test_output
)
from tasst.typecheck import typecheck
@@ -101,6 +102,28 @@ class Site(contextlib.AbstractContextManager):
info = json.loads(self.output('ip -j link show'))
return [i['ifname'] for i in info]
+ def ifup(self, ifname):
+ self.require_cmds('ip')
+ self.fg(f'ip link set {ifname} up', sudo=True)
+
+ def addrinfos(self, ifname, **criteria):
+ self.require_cmds('ip')
+ info = json.loads(self.output(f'ip -j addr show {ifname}'))
+ assert len(info) == 1 # We specified a specific interface
+
+ ais = list(ai for ai in info[0]['addr_info'])
+ for key, value in criteria.items():
+ ais = [ai for ai in ais if key in ai and ai[key] == value]
+
+ return ais
+
+ def addrs(self, ifname, **criteria):
+ self.require_cmds('ip')
+ # Return just the parsed, non-tentative addresses
+ return [ipaddress.ip_interface(f'{ai["local"]}/{ai["prefixlen"]}')
+ for ai in self.addrinfos(ifname, **criteria)
+ if 'tentative' not in ai]
+
def test_site(sitefn):
def test_true(s):
@@ -155,10 +178,16 @@ def test_site(sitefn):
with s as site:
assert_in('lo', site.ifs())
+ def test_lo_addrs(s):
+ expected = [ipaddress.ip_interface(a)
+ for a in ['127.0.0.1/8', '::1/128']]
+ with s as site:
+ assert_eq_unordered(site.addrs('lo'), expected)
+
return test_output(test_true, test_false, test_echo, test_timeout,
test_bg_true, test_bg_false, test_bg_echo,
test_bg_timeout, test_bg_context_timeout,
- test_has_lo)(sitefn)
+ test_has_lo, test_lo_addrs)(sitefn)
def test_isolated_site(sitefn):
diff --git a/test/tasst/nstool.py b/test/tasst/nstool.py
index f05c420d..7fa46893 100644
--- a/test/tasst/nstool.py
+++ b/test/tasst/nstool.py
@@ -128,8 +128,11 @@ def test_userns(nstool_site):
@test_output(test_userns, test_sockdir_cleanup)
@test_isolated_site
+@contextlib.contextmanager
def userns_site():
- return unshare_site('usernetns', '-Ucn')
+ with unshare_site('usernetns', '-Ucn') as ns:
+ ns.ifup('lo')
+ yield ns
@test_output(test_sockdir_cleanup)
@@ -138,6 +141,7 @@ def userns_site():
def nested_site():
with unshare_site('userns', '-Uc') as userns:
with unshare_site('netns', '-n', parent=userns, sudo=True) as netns:
+ netns.ifup('lo')
yield netns
@@ -149,8 +153,11 @@ def test_relative_pid(s):
@test_output(test_relative_pid, test_sockdir_cleanup)
@test_isolated_site
+@contextlib.contextmanager
def pidns_site():
- return unshare_site('pidns', '-Upfn')
+ with unshare_site('pidns', '-Upfn') as ns:
+ ns.ifup('lo')
+ yield ns
@test_site
--
2.41.0