]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-network: add testcase for router preference 25166/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 28 Oct 2022 05:38:23 +0000 (14:38 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 28 Oct 2022 06:56:59 +0000 (15:56 +0900)
test/test-network/conf/25-veth-bridge.network [new file with mode: 0644]
test/test-network/conf/25-veth-client.netdev [new file with mode: 0644]
test/test-network/conf/25-veth-client.network [new file with mode: 0644]
test/test-network/conf/25-veth-router-high.netdev [new file with mode: 0644]
test/test-network/conf/25-veth-router-high.network [new file with mode: 0644]
test/test-network/conf/25-veth-router-low.netdev [new file with mode: 0644]
test/test-network/conf/25-veth-router-low.network [new file with mode: 0644]
test/test-network/systemd-networkd-tests.py

diff --git a/test/test-network/conf/25-veth-bridge.network b/test/test-network/conf/25-veth-bridge.network
new file mode 100644 (file)
index 0000000..b2f1634
--- /dev/null
@@ -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 (file)
index 0000000..511c1e5
--- /dev/null
@@ -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 (file)
index 0000000..152fb4d
--- /dev/null
@@ -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 (file)
index 0000000..845b4a9
--- /dev/null
@@ -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 (file)
index 0000000..c6c2df2
--- /dev/null
@@ -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 (file)
index 0000000..2842f4f
--- /dev/null
@@ -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 (file)
index 0000000..d2abc15
--- /dev/null
@@ -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
index 2f7614428cc67635559cf5015a0bc6428db4f71b..64924a35aa582633d6ad325f47d0080392952873 100755 (executable)
@@ -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):