From: David Gibson <david@gibson.dropbear.id.au>
To: passt-dev@passt.top, Stefano Brivio <sbrivio@redhat.com>
Cc: jarichte@redhat.com, Cleber Rosa <crosa@redhat.com>,
David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH v2 14/21] avocado/tasst: Add helper to wait for IP address to appear
Date: Tue, 16 May 2023 12:01:28 +1000 [thread overview]
Message-ID: <20230516020135.1901256-15-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20230516020135.1901256-1-david@gibson.dropbear.id.au>
Add a helper to the Site() class to wait for an address with specified
characteristics to be ready on an interface. In particular this is useful
for waiting for IPv6 SLAAC & DAD (Duplicate Address Detection) to complete.
Because DAD is not going to be useful in many of our scenarios, also extend
Site.ifup() to allow DAD to be switched to optimistic mode or disabled.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
avocado/tasst/meta/static_ifup.py | 47 +++++++++++++++++++++++++++++++
avocado/tasst/meta/veth.py | 20 +++++++++++++
avocado/tasst/site.py | 22 ++++++++++++++-
3 files changed, 88 insertions(+), 1 deletion(-)
create mode 100644 avocado/tasst/meta/static_ifup.py
diff --git a/avocado/tasst/meta/static_ifup.py b/avocado/tasst/meta/static_ifup.py
new file mode 100644
index 0000000..02d9650
--- /dev/null
+++ b/avocado/tasst/meta/static_ifup.py
@@ -0,0 +1,47 @@
+#! /usr/bin/python3
+
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# tasst - Test A Simple Socket Transport
+# library of test helpers for passt & pasta
+#
+# tasst/metatest/static_ifup - Static address configuration
+#
+# These test code from tasst.site, but require additional support from
+# tasst.nstool.
+#
+# Copyright Red Hat
+# Author: David Gibson <david@gibson.dropbear.id.au>
+
+import ipaddress
+
+import avocado
+
+from tasst import Tasst
+from tasst.nstool import UnshareSite
+
+
+class StaticNetTasst(Tasst):
+ """
+ Test helpers for static network configuration
+
+ :avocado: tags=meta
+ """
+
+ IFNAME = 'testveth'
+ TEST_IPS = [ipaddress.ip_interface('192.0.2.1/24'),
+ ipaddress.ip_interface('2001:db8:9a55::1/112'),
+ ipaddress.ip_interface('10.1.2.3/8')]
+
+ def setUp(self):
+ super().setUp()
+ self.ns = UnshareSite(type(self).__name__, '-Un')
+ self.ns.veth(self.IFNAME, self.IFNAME + 'peer')
+ self.ns.ifup(self.IFNAME, *self.TEST_IPS, dad='disable')
+
+ def tearDown(self):
+ self.ns.close()
+ super().tearDown()
+
+ def test_addr(self):
+ self.assertCountEqual(self.ns.addrs(self.IFNAME, scope='global'), self.TEST_IPS)
diff --git a/avocado/tasst/meta/veth.py b/avocado/tasst/meta/veth.py
index afca192..362252b 100644
--- a/avocado/tasst/meta/veth.py
+++ b/avocado/tasst/meta/veth.py
@@ -13,6 +13,8 @@
# Copyright Red Hat
# Author: David Gibson <david@gibson.dropbear.id.au>
+import ipaddress
+
import avocado
from tasst import Tasst
@@ -45,3 +47,21 @@ class VethTasst(Tasst):
def test_mtu(self):
self.assertEquals(self.ns1.mtu('veth1'), 1500)
self.assertEquals(self.ns2.mtu('veth2'), 1500)
+
+ def test_slaac(self, dad=None):
+ TESTMAC = '02:aa:bb:cc:dd:ee'
+ TESTIP = ipaddress.ip_interface('fe80::aa:bbff:fecc:ddee/64')
+
+ self.ns1.fg('ip link set dev veth1 address {}'.format(TESTMAC), sudo=True)
+
+ self.ns1.ifup('veth1', dad=dad)
+ self.ns2.ifup('veth2')
+
+ addrs = self.ns1.addr_wait('veth1', family='inet6', scope='link')
+ self.assertEqual(addrs, [TESTIP])
+
+ def test_optimistic_dad(self):
+ self.test_slaac(dad='optimistic')
+
+ def test_no_dad(self):
+ self.test_slaac(dad='disable')
diff --git a/avocado/tasst/site.py b/avocado/tasst/site.py
index 00b86aa..3197839 100644
--- a/avocado/tasst/site.py
+++ b/avocado/tasst/site.py
@@ -60,8 +60,22 @@ class Site:
info = json.loads(self.output('ip -j link show'))
return [i['ifname'] for i in info]
- def ifup(self, ifname):
+ def ifup(self, ifname, *addrs, dad=None):
self.require_cmds('ip')
+
+ if dad == 'disable':
+ self.fg('sysctl net.ipv6.conf.{}.accept_dad=0'.format(ifname), sudo=True)
+ elif dad == 'optimistic':
+ self.fg('sysctl net.ipv6.conf.{}.optimistic_dad=1'.format(ifname), sudo=True)
+ elif dad is not None:
+ raise ValueError
+
+ for a in addrs:
+ if (not isinstance(a, ipaddress.IPv4Interface)
+ and not isinstance(a, ipaddress.IPv6Interface)):
+ raise TypeError
+ self.fg('ip addr add {} dev {}'.format(a.with_prefixlen, ifname), sudo=True)
+
self.fg('ip link set {} up'.format(ifname), sudo=True)
def mtu(self, ifname):
@@ -87,6 +101,12 @@ class Site:
for ai in self.addrinfos(ifname, **filter)
if not 'tentative' in ai]
+ def addr_wait(self, ifname, **filter):
+ while True:
+ addrs = self.addrs(ifname, **filter)
+ if addrs:
+ return addrs
+
class BaseSiteTasst(Tasst):
"""
--
@@ -60,8 +60,22 @@ class Site:
info = json.loads(self.output('ip -j link show'))
return [i['ifname'] for i in info]
- def ifup(self, ifname):
+ def ifup(self, ifname, *addrs, dad=None):
self.require_cmds('ip')
+
+ if dad == 'disable':
+ self.fg('sysctl net.ipv6.conf.{}.accept_dad=0'.format(ifname), sudo=True)
+ elif dad == 'optimistic':
+ self.fg('sysctl net.ipv6.conf.{}.optimistic_dad=1'.format(ifname), sudo=True)
+ elif dad is not None:
+ raise ValueError
+
+ for a in addrs:
+ if (not isinstance(a, ipaddress.IPv4Interface)
+ and not isinstance(a, ipaddress.IPv6Interface)):
+ raise TypeError
+ self.fg('ip addr add {} dev {}'.format(a.with_prefixlen, ifname), sudo=True)
+
self.fg('ip link set {} up'.format(ifname), sudo=True)
def mtu(self, ifname):
@@ -87,6 +101,12 @@ class Site:
for ai in self.addrinfos(ifname, **filter)
if not 'tentative' in ai]
+ def addr_wait(self, ifname, **filter):
+ while True:
+ addrs = self.addrs(ifname, **filter)
+ if addrs:
+ return addrs
+
class BaseSiteTasst(Tasst):
"""
--
2.40.1
next prev parent reply other threads:[~2023-05-16 2:01 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-16 2:01 [PATCH v2 00/21] RFCv2: Proof-of-concept conversion of some tests to Avocado framework David Gibson
2023-05-16 2:01 ` [PATCH v2 01/21] test/nstool: Provide useful error if given a path that's too long David Gibson
2023-05-16 2:01 ` [PATCH v2 02/21] test/nstool: Fix fd leak in accept() loop David Gibson
2023-05-16 2:01 ` [PATCH v2 03/21] avocado: Make a duplicate copy of testsuite for comparison purposes David Gibson
2023-05-16 2:01 ` [PATCH v2 04/21] avocado: Don't double download assets for test/ and oldtest/ David Gibson
2023-05-16 2:01 ` [PATCH v2 05/21] avocado: Move static checkers to avocado David Gibson
2023-05-16 2:01 ` [PATCH v2 06/21] avocado/tasst: Helper functions for executing commands in different places David Gibson
2023-05-16 2:01 ` [PATCH v2 07/21] avocado: Convert build tests to avocado David Gibson
2023-05-16 2:01 ` [PATCH v2 08/21] avocado/tasst: Add helpers for running background commands on sites David Gibson
2023-05-16 2:01 ` [PATCH v2 09/21] avocado/tasst: Add helper to get network interface names for a site David Gibson
2023-05-16 2:01 ` [PATCH v2 10/21] avocado/tasst: Add helpers to run commands with nstool David Gibson
2023-05-16 2:01 ` [PATCH v2 11/21] avocado/tasst: Add ifup and network address helpers to Site David Gibson
2023-05-16 2:01 ` [PATCH v2 12/21] avocado/tasst: Helper for creating veth devices between namespaces David Gibson
2023-05-16 2:01 ` [PATCH v2 13/21] avocado/tasst: Add helper for getting MTU of a network interface David Gibson
2023-05-16 2:01 ` David Gibson [this message]
2023-05-16 2:01 ` [PATCH v2 15/21] avocado/tasst: Add helpers for getting a site's routes David Gibson
2023-05-16 2:01 ` [PATCH v2 16/21] avocado/tasst: Helpers for test transferring data between sites David Gibson
2023-05-16 2:01 ` [PATCH v2 17/21] avocado/tasst: IP address allocation helpers David Gibson
2023-05-16 2:01 ` [PATCH v2 18/21] avocado/tasst: Helpers for testing NDP behaviour David Gibson
2023-05-16 2:01 ` [PATCH v2 19/21] avocado/tasst: Helpers for testing DHCP & DHCPv6 behaviour David Gibson
2023-05-16 2:01 ` [PATCH v2 20/21] avocado/tasst: Helpers to construct a simple network environment for tests David Gibson
2023-05-16 2:01 ` [PATCH v2 21/21] avocado: Convert basic pasta tests David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230516020135.1901256-15-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=crosa@redhat.com \
--cc=jarichte@redhat.com \
--cc=passt-dev@passt.top \
--cc=sbrivio@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).