From: Yu Watanabe Date: Fri, 28 Oct 2022 05:38:23 +0000 (+0900) Subject: test-network: add testcase for router preference X-Git-Tag: v253-rc1~640^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bb80f633bfde9f7fed166c8d8d02a5b79fced9f5;p=thirdparty%2Fsystemd.git test-network: add testcase for router preference --- diff --git a/test/test-network/conf/25-veth-bridge.network b/test/test-network/conf/25-veth-bridge.network new file mode 100644 index 00000000000..b2f163412a9 --- /dev/null +++ b/test/test-network/conf/25-veth-bridge.network @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[Match] +Name=client-p +Name=router-high-p +Name=router-low-p + +[Network] +Bridge=bridge99 +IPv6AcceptRA=no +IPv6SendRA=yes diff --git a/test/test-network/conf/25-veth-client.netdev b/test/test-network/conf/25-veth-client.netdev new file mode 100644 index 00000000000..511c1e59ce8 --- /dev/null +++ b/test/test-network/conf/25-veth-client.netdev @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[NetDev] +Name=client +Kind=veth +MACAddress=12:34:56:78:9a:00 + +[Peer] +Name=client-p +MACAddress=12:34:56:78:9b:00 diff --git a/test/test-network/conf/25-veth-client.network b/test/test-network/conf/25-veth-client.network new file mode 100644 index 00000000000..152fb4d4c19 --- /dev/null +++ b/test/test-network/conf/25-veth-client.network @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[Match] +Name=client + +[Network] +IPv6AcceptRA=yes + +[IPv6AcceptRA] +UseDNS=no +UseDomains=no diff --git a/test/test-network/conf/25-veth-router-high.netdev b/test/test-network/conf/25-veth-router-high.netdev new file mode 100644 index 00000000000..845b4a9ce1d --- /dev/null +++ b/test/test-network/conf/25-veth-router-high.netdev @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[NetDev] +Name=router-high +Kind=veth +MACAddress=12:34:56:78:9a:99 + +[Peer] +Name=router-high-p +MACAddress=12:34:56:78:9b:99 diff --git a/test/test-network/conf/25-veth-router-high.network b/test/test-network/conf/25-veth-router-high.network new file mode 100644 index 00000000000..c6c2df231e6 --- /dev/null +++ b/test/test-network/conf/25-veth-router-high.network @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[Match] +Name=router-high + +[Network] +IPv6AcceptRA=no +IPv6SendRA=yes + +[IPv6SendRA] +RouterPreference=high +EmitDNS=no +EmitDomains=no + +[IPv6Prefix] +Prefix=2002:da8:1:99::/64 +PreferredLifetimeSec=1000s +ValidLifetimeSec=2100s diff --git a/test/test-network/conf/25-veth-router-low.netdev b/test/test-network/conf/25-veth-router-low.netdev new file mode 100644 index 00000000000..2842f4f98a8 --- /dev/null +++ b/test/test-network/conf/25-veth-router-low.netdev @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[NetDev] +Name=router-low +Kind=veth +MACAddress=12:34:56:78:9a:98 + +[Peer] +Name=router-low-p +MACAddress=12:34:56:78:9b:98 diff --git a/test/test-network/conf/25-veth-router-low.network b/test/test-network/conf/25-veth-router-low.network new file mode 100644 index 00000000000..d2abc1520eb --- /dev/null +++ b/test/test-network/conf/25-veth-router-low.network @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[Match] +Name=router-low + +[Network] +IPv6AcceptRA=no +IPv6SendRA=yes + +[IPv6SendRA] +RouterPreference=low +EmitDNS=no +EmitDomains=no + +[IPv6Prefix] +Prefix=2002:da8:1:98::/64 +PreferredLifetimeSec=1000s +ValidLifetimeSec=2100s diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 2f7614428cc..64924a35aa5 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -889,6 +889,16 @@ class Utilities(): self.assertNotRegex(output, address_regex) + def wait_route(self, link, route_regex, table='main', ipv='', timeout_sec=100): + for i in range(timeout_sec): + if i > 0: + time.sleep(1) + output = check_output(f'ip {ipv} route show dev {link} table {table}') + if re.search(route_regex, output): + break + + self.assertRegex(output, route_regex) + def check_netlabel(self, interface, address, label='system_u:object_r:root_t:s0'): if not shutil.which('selinuxenabled'): print(f'## Checking NetLabel skipped: selinuxenabled command not found.') @@ -4316,6 +4326,55 @@ class NetworkdRATests(unittest.TestCase, Utilities): self.assertIn('2002:da8:1:0:b47e:7975:fc7a:7d6e', output) self.assertIn('2002:da8:2:0:f689:561a:8eda:7443', output) + def test_router_preference(self): + copy_network_unit('25-veth-client.netdev', + '25-veth-router-high.netdev', + '25-veth-router-low.netdev', + '26-bridge.netdev', + '25-veth-bridge.network', + '25-veth-client.network', + '25-veth-router-high.network', + '25-veth-router-low.network', + '25-bridge99.network') + start_networkd() + self.wait_online(['client-p:enslaved', + 'router-high:degraded', 'router-high-p:enslaved', + 'router-low:degraded', 'router-low-p:enslaved', + 'bridge99:routable']) + + networkctl_reconfigure('client') + self.wait_online(['client:routable']) + + self.wait_address('client', '2002:da8:1:99:1034:56ff:fe78:9a00/64', ipv='-6', timeout_sec=10) + self.wait_address('client', '2002:da8:1:98:1034:56ff:fe78:9a00/64', ipv='-6', timeout_sec=10) + self.wait_route('client', 'default via fe80::1034:56ff:fe78:9a99 proto ra metric 512', ipv='-6', timeout_sec=10) + self.wait_route('client', 'default via fe80::1034:56ff:fe78:9a98 proto ra metric 2048', ipv='-6', timeout_sec=10) + + output = check_output('ip -6 route show dev client default via fe80::1034:56ff:fe78:9a99') + print(output) + self.assertIn('pref high', output) + output = check_output('ip -6 route show dev client default via fe80::1034:56ff:fe78:9a98') + print(output) + self.assertIn('pref low', output) + + with open(os.path.join(network_unit_dir, '25-veth-client.network'), mode='a', encoding='utf-8') as f: + f.write('\n[Link]\nMACAddress=12:34:56:78:9a:01\n[IPv6AcceptRA]\nRouteMetric=100:200:300\n') + + networkctl_reload() + self.wait_online(['client:routable']) + + self.wait_address('client', '2002:da8:1:99:1034:56ff:fe78:9a01/64', ipv='-6', timeout_sec=10) + self.wait_address('client', '2002:da8:1:98:1034:56ff:fe78:9a01/64', ipv='-6', timeout_sec=10) + self.wait_route('client', 'default via fe80::1034:56ff:fe78:9a99 proto ra metric 100', ipv='-6', timeout_sec=10) + self.wait_route('client', 'default via fe80::1034:56ff:fe78:9a98 proto ra metric 300', ipv='-6', timeout_sec=10) + + output = check_output('ip -6 route show dev client default via fe80::1034:56ff:fe78:9a99') + print(output) + self.assertIn('pref high', output) + output = check_output('ip -6 route show dev client default via fe80::1034:56ff:fe78:9a98') + print(output) + self.assertIn('pref low', output) + class NetworkdDHCPServerTests(unittest.TestCase, Utilities): def setUp(self):