From dc60ac29606c33acbd22d2fd6f37cc5fbfed7953 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 3 Jan 2024 04:41:01 +0900 Subject: [PATCH 1/3] test-network: show monotonic timestamp and drop hopstname from logs --- test/test-network/systemd-networkd-tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index eefd7192a7..24757d68fa 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -707,6 +707,8 @@ def read_networkd_log(invocation_id=None, since=None): invocation_id = networkd_invocation_id() command = [ 'journalctl', + '--no-hostname', + '--output=short-monotonic', f'_SYSTEMD_INVOCATION_ID={invocation_id}', ] if since: From 9362f7d5b56e5d27d42e5367bc10426319a3447c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 3 Jan 2024 04:40:54 +0900 Subject: [PATCH 2/3] test-network: merge three tests for neighbor To speed up tests. --- ...ummy.network => 25-neighbor-dummy.network} | 0 .../10-step1.conf} | 6 -- .../10-step2.conf} | 1 - .../25-neighbor-dummy.network.d/10-step3.conf | 4 + .../conf/25-neighbor-next.network | 10 --- test/test-network/systemd-networkd-tests.py | 82 +++++++++---------- 6 files changed, 42 insertions(+), 61 deletions(-) rename test/test-network/conf/{25-neighbor-ip-dummy.network => 25-neighbor-dummy.network} (100%) rename test/test-network/conf/{25-neighbor-section.network => 25-neighbor-dummy.network.d/10-step1.conf} (90%) rename test/test-network/conf/{25-neighbor-section.network.d/override.conf => 25-neighbor-dummy.network.d/10-step2.conf} (99%) create mode 100644 test/test-network/conf/25-neighbor-dummy.network.d/10-step3.conf delete mode 100644 test/test-network/conf/25-neighbor-next.network diff --git a/test/test-network/conf/25-neighbor-ip-dummy.network b/test/test-network/conf/25-neighbor-dummy.network similarity index 100% rename from test/test-network/conf/25-neighbor-ip-dummy.network rename to test/test-network/conf/25-neighbor-dummy.network diff --git a/test/test-network/conf/25-neighbor-section.network b/test/test-network/conf/25-neighbor-dummy.network.d/10-step1.conf similarity index 90% rename from test/test-network/conf/25-neighbor-section.network rename to test/test-network/conf/25-neighbor-dummy.network.d/10-step1.conf index 59e21ebf1b..727089e824 100644 --- a/test/test-network/conf/25-neighbor-section.network +++ b/test/test-network/conf/25-neighbor-dummy.network.d/10-step1.conf @@ -1,10 +1,4 @@ # SPDX-License-Identifier: LGPL-2.1-or-later -[Match] -Name=dummy98 - -[Network] -IPv6AcceptRA=no - [Neighbor] Address=192.168.10.1 LinkLayerAddress=00:00:5e:00:02:65 diff --git a/test/test-network/conf/25-neighbor-section.network.d/override.conf b/test/test-network/conf/25-neighbor-dummy.network.d/10-step2.conf similarity index 99% rename from test/test-network/conf/25-neighbor-section.network.d/override.conf rename to test/test-network/conf/25-neighbor-dummy.network.d/10-step2.conf index 01027e35c3..e28e3fcc53 100644 --- a/test/test-network/conf/25-neighbor-section.network.d/override.conf +++ b/test/test-network/conf/25-neighbor-dummy.network.d/10-step2.conf @@ -1,5 +1,4 @@ # SPDX-License-Identifier: LGPL-2.1-or-later - [Neighbor] Address=192.168.10.1 LinkLayerAddress=00:00:5e:00:03:65 diff --git a/test/test-network/conf/25-neighbor-dummy.network.d/10-step3.conf b/test/test-network/conf/25-neighbor-dummy.network.d/10-step3.conf new file mode 100644 index 0000000000..9262b74d81 --- /dev/null +++ b/test/test-network/conf/25-neighbor-dummy.network.d/10-step3.conf @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[Neighbor] +Address=192.168.10.1 +LinkLayerAddress=00:00:5e:00:03:66 diff --git a/test/test-network/conf/25-neighbor-next.network b/test/test-network/conf/25-neighbor-next.network deleted file mode 100644 index 6911f4810d..0000000000 --- a/test/test-network/conf/25-neighbor-next.network +++ /dev/null @@ -1,10 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later -[Match] -Name=dummy98 - -[Network] -IPv6AcceptRA=no - -[Neighbor] -Address=192.168.10.1 -LinkLayerAddress=00:00:5e:00:02:66 diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 24757d68fa..a0ec8f1fbc 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -3450,10 +3450,25 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): for i in range(1, 5): self.assertRegex(output, f'2607:5300:203:5215:{i}::1 *proxy') - def test_neighbor_section(self): - copy_network_unit('25-neighbor-section.network', '12-dummy.netdev', copy_dropins=False) + def test_neighbor(self): + copy_network_unit('12-dummy.netdev', '25-neighbor-dummy.network', '25-neighbor-dummy.network.d/10-step1.conf', + '25-gre-tunnel-remote-any.netdev', '25-neighbor-ip.network', + '25-ip6gre-tunnel-remote-any.netdev', '25-neighbor-ipv6.network', + copy_dropins=False) start_networkd() - self.wait_online(['dummy98:degraded']) + self.wait_online(['dummy98:degraded', 'gretun97:routable', 'ip6gretun97:routable']) + + print('### ip neigh list dev gretun97') + output = check_output('ip neigh list dev gretun97') + print(output) + self.assertIn('10.0.0.22 lladdr 10.65.223.239 PERMANENT', output) + self.assertNotIn('10.0.0.23', output) + + print('### ip neigh list dev ip6gretun97') + output = check_output('ip neigh list dev ip6gretun97') + print(output) + self.assertRegex(output, '2001:db8:0:f102::17 lladdr 2a:?00:ff:?de:45:?67:ed:?de:[0:]*:49:?88 PERMANENT') + self.assertNotIn('2001:db8:0:f102::18', output) print('### ip neigh list dev dummy98') output = check_output('ip neigh list dev dummy98') @@ -3467,60 +3482,39 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): output = check_output(*networkctl_cmd, '--json=short', 'status', env=env) check_json(output) - copy_network_unit('25-neighbor-section.network.d/override.conf') + # Here, 10-step1.conf is intendedly kept, to verify that 10-step2.conf overrides + # the valid configurations in 10-step1.conf. + copy_network_unit('25-neighbor-dummy.network.d/10-step2.conf') networkctl_reload() self.wait_online(['dummy98:degraded']) - print('### ip neigh list dev dummy98 (after reloading)') + print('### ip neigh list dev dummy98') output = check_output('ip neigh list dev dummy98') print(output) self.assertIn('192.168.10.1 lladdr 00:00:5e:00:03:65 PERMANENT', output) self.assertIn('2004:da8:1::1 lladdr 00:00:5e:00:03:66 PERMANENT', output) self.assertNotIn('2004:da8:1:0::2', output) self.assertNotIn('192.168.10.2', output) - self.assertNotIn('00:00:5e:00:02', output) - - def test_neighbor_reconfigure(self): - copy_network_unit('25-neighbor-section.network', '12-dummy.netdev', copy_dropins=False) - start_networkd() - self.wait_online(['dummy98:degraded']) - - print('### ip neigh list dev dummy98') - output = check_output('ip neigh list dev dummy98') - print(output) - self.assertIn('192.168.10.1 lladdr 00:00:5e:00:02:65 PERMANENT', output) - self.assertIn('2004:da8:1::1 lladdr 00:00:5e:00:02:66 PERMANENT', output) - - remove_network_unit('25-neighbor-section.network') - copy_network_unit('25-neighbor-next.network') - networkctl_reload() - self.wait_online(['dummy98:degraded']) - print('### ip neigh list dev dummy98') - output = check_output('ip neigh list dev dummy98') - print(output) - self.assertNotIn('00:00:5e:00:02:65', output) - self.assertIn('192.168.10.1 lladdr 00:00:5e:00:02:66 PERMANENT', output) - self.assertNotIn('2004:da8:1::1', output) - - def test_neighbor_gre(self): - copy_network_unit('25-neighbor-ip.network', '25-neighbor-ipv6.network', '25-neighbor-ip-dummy.network', - '12-dummy.netdev', '25-gre-tunnel-remote-any.netdev', '25-ip6gre-tunnel-remote-any.netdev') - start_networkd() - self.wait_online(['dummy98:degraded', 'gretun97:routable', 'ip6gretun97:routable'], timeout='40s') - - output = check_output('ip neigh list dev gretun97') - print(output) - self.assertIn('10.0.0.22 lladdr 10.65.223.239 PERMANENT', output) - self.assertNotIn('10.0.0.23', output) - - output = check_output('ip neigh list dev ip6gretun97') - print(output) - self.assertRegex(output, '2001:db8:0:f102::17 lladdr 2a:?00:ff:?de:45:?67:ed:?de:[0:]*:49:?88 PERMANENT') - self.assertNotIn('2001:db8:0:f102::18', output) + self.assertNotIn('00:00:5e:00:02:67', output) output = check_output(*networkctl_cmd, '--json=short', 'status', env=env) check_json(output) + remove_network_unit('25-neighbor-dummy.network.d/10-step1.conf', + '25-neighbor-dummy.network.d/10-step2.conf') + copy_network_unit('25-neighbor-dummy.network.d/10-step3.conf') + networkctl_reload() + self.wait_online(['dummy98:degraded']) + + print('### ip neigh list dev dummy98') + output = check_output('ip neigh list dev dummy98') + print(output) + self.assertIn('192.168.10.1 lladdr 00:00:5e:00:03:66 PERMANENT', output) + self.assertNotIn('00:00:5e:00:02:65', output) + self.assertNotIn('00:00:5e:00:02:66', output) + self.assertNotIn('00:00:5e:00:03:65', output) + self.assertNotIn('2004:da8:1::1', output) + def test_link_local_addressing(self): copy_network_unit('25-link-local-addressing-yes.network', '11-dummy.netdev', '25-link-local-addressing-no.network', '12-dummy.netdev') From 78265b5b4aa6c90aeb5f3582a8aa106403f7ed93 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 3 Jan 2024 04:40:48 +0900 Subject: [PATCH 3/3] test-network: add test case about replacing nexthop --- ...5-nexthop.network => 25-nexthop-1.network} | 1 - test/test-network/conf/25-nexthop-2.network | 98 +++++++++++++++++++ ...mmy.network => 25-nexthop-dummy-1.network} | 0 .../conf/25-nexthop-dummy-2.network | 20 ++++ test/test-network/systemd-networkd-tests.py | 98 ++++++++++++++----- 5 files changed, 190 insertions(+), 27 deletions(-) rename test/test-network/conf/{25-nexthop.network => 25-nexthop-1.network} (97%) create mode 100644 test/test-network/conf/25-nexthop-2.network rename test/test-network/conf/{25-nexthop-dummy.network => 25-nexthop-dummy-1.network} (100%) create mode 100644 test/test-network/conf/25-nexthop-dummy-2.network diff --git a/test/test-network/conf/25-nexthop.network b/test/test-network/conf/25-nexthop-1.network similarity index 97% rename from test/test-network/conf/25-nexthop.network rename to test/test-network/conf/25-nexthop-1.network index f53a58b059..a5a8d8180d 100644 --- a/test/test-network/conf/25-nexthop.network +++ b/test/test-network/conf/25-nexthop-1.network @@ -6,7 +6,6 @@ Name=veth99 IPv6AcceptRA=no Address=2001:1234:5:8f63::1/120 Address=192.168.5.10/24 -Gateway=192.168.5.1 [NextHop] Id=1 diff --git a/test/test-network/conf/25-nexthop-2.network b/test/test-network/conf/25-nexthop-2.network new file mode 100644 index 0000000000..63062f3d5c --- /dev/null +++ b/test/test-network/conf/25-nexthop-2.network @@ -0,0 +1,98 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[Match] +Name=veth99 + +[Network] +IPv6AcceptRA=no +Address=2001:1234:5:8f63::1/120 +Address=192.168.5.10/24 + +# Commented out lines are specified in 25-nexthop.network + +[NextHop] +#Id=1 +Id=6 +Gateway=192.168.5.1 + +[NextHop] +#Id=2 +Id=7 +Gateway=2001:1234:5:8f63::2 + +[NextHop] +#Id=3 +Id=4 +Family=ipv6 + +[NextHop] +#Id=4 +Id=3 +Family=ipv4 + +[NextHop] +Id=5 +#Gateway=192.168.10.1 +#OnLink=yes +Gateway=192.168.5.3 +OnLink=no + +[NextHop] +#Id=6 +Id=1 +Family=ipv4 +Blackhole=yes + +[NextHop] +#Id=7 +Id=2 +Family=ipv6 +Blackhole=yes + +[NextHop] +Id=8 +Gateway=fe80::222:4dff:ff:ff:ff:ff + +[NextHop] +Gateway=192.168.5.2 + +[NextHop] +Family=ipv4 +Blackhole=yes + +[NextHop] +Family=ipv6 +Blackhole=yes + +[Route] +#NextHop=1 +NextHop=6 +Destination=10.10.10.10 + +[Route] +#NextHop=2 +NextHop=7 +Destination=10.10.10.11 + +[Route] +#NextHop=2 +NextHop=7 +Destination=2001:1234:5:8f62::1 + +[Route] +NextHop=5 +Destination=10.10.10.12 + +[Route] +#NextHop=6 +NextHop=1 +Destination=10.10.10.13 + +[Route] +#NextHop=7 +NextHop=2 +Destination=2001:1234:5:8f62::2 + +[Route] +#NextHop=21 +NextHop=20 +Destination=10.10.10.14 diff --git a/test/test-network/conf/25-nexthop-dummy.network b/test/test-network/conf/25-nexthop-dummy-1.network similarity index 100% rename from test/test-network/conf/25-nexthop-dummy.network rename to test/test-network/conf/25-nexthop-dummy-1.network diff --git a/test/test-network/conf/25-nexthop-dummy-2.network b/test/test-network/conf/25-nexthop-dummy-2.network new file mode 100644 index 0000000000..2556b1f923 --- /dev/null +++ b/test/test-network/conf/25-nexthop-dummy-2.network @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +[Match] +Name=dummy98 + +[Network] +Address=192.168.20.20/24 +IPv6AcceptRA=no + +# Commented out lines are specified in 25-nexthop-dummy.network + +[NextHop] +#Id=20 +Id=21 +Gateway=192.168.20.1 + +[NextHop] +#Id=21 +#Group=1:3 20:1 +Id=20 +Group=5:3 21:1 diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index a0ec8f1fbc..0a87c5d239 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -3854,23 +3854,34 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): self.assertRegex(output, 'inet 10.1.2.3/16 scope global dummy98') self.assertNotRegex(output, 'inet 10.2.3.4/16 scope global dynamic dummy98') - def check_nexthop(self, manage_foreign_nexthops): + def check_nexthop(self, manage_foreign_nexthops, first): self.wait_online(['veth99:routable', 'veth-peer:routable', 'dummy98:routable']) output = check_output('ip nexthop list dev veth99') print(output) - self.assertIn('id 1 via 192.168.5.1 dev veth99', output) - self.assertIn('id 2 via 2001:1234:5:8f63::2 dev veth99', output) + if first: + self.assertIn('id 1 via 192.168.5.1 dev veth99', output) + self.assertIn('id 2 via 2001:1234:5:8f63::2 dev veth99', output) + else: + self.assertIn('id 6 via 192.168.5.1 dev veth99', output) + self.assertIn('id 7 via 2001:1234:5:8f63::2 dev veth99', output) self.assertIn('id 3 dev veth99', output) self.assertIn('id 4 dev veth99', output) - self.assertRegex(output, 'id 5 via 192.168.10.1 dev veth99 .*onlink') + if first: + self.assertRegex(output, 'id 5 via 192.168.10.1 dev veth99 .*onlink') + else: + self.assertIn('id 5 via 192.168.5.3 dev veth99', output) + self.assertNotRegex(output, 'id 5 via 192.168.5.3 dev veth99 .*onlink') self.assertIn('id 8 via fe80:0:222:4dff:ff:ff:ff:ff dev veth99', output) if manage_foreign_nexthops: self.assertRegex(output, r'id [0-9]* via 192.168.5.2 dev veth99') output = check_output('ip nexthop list dev dummy98') print(output) - self.assertIn('id 20 via 192.168.20.1 dev dummy98', output) + if first: + self.assertIn('id 20 via 192.168.20.1 dev dummy98', output) + else: + self.assertIn('id 21 via 192.168.20.1 dev dummy98', output) if manage_foreign_nexthops: self.assertNotIn('id 42 via 192.168.20.2 dev dummy98', output) else: @@ -3879,43 +3890,74 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): # kernel manages blackhole nexthops on lo output = check_output('ip nexthop list dev lo') print(output) - self.assertIn('id 6 blackhole', output) - self.assertIn('id 7 blackhole', output) + if first: + self.assertIn('id 6 blackhole', output) + self.assertIn('id 7 blackhole', output) + else: + self.assertIn('id 1 blackhole', output) + self.assertIn('id 2 blackhole', output) # group nexthops are shown with -0 option - output = check_output('ip -0 nexthop list id 21') - print(output) - self.assertRegex(output, r'id 21 group (1,3/20|20/1,3)') + if first: + output = check_output('ip -0 nexthop list id 21') + print(output) + self.assertRegex(output, r'id 21 group (1,3/20|20/1,3)') + else: + output = check_output('ip -0 nexthop list id 20') + print(output) + self.assertRegex(output, r'id 20 group (5,3/21|21/5,3)') output = check_output('ip route show dev veth99 10.10.10.10') print(output) - self.assertEqual('10.10.10.10 nhid 1 via 192.168.5.1 proto static', output) + if first: + self.assertEqual('10.10.10.10 nhid 1 via 192.168.5.1 proto static', output) + else: + self.assertEqual('10.10.10.10 nhid 6 via 192.168.5.1 proto static', output) output = check_output('ip route show dev veth99 10.10.10.11') print(output) - self.assertEqual('10.10.10.11 nhid 2 via inet6 2001:1234:5:8f63::2 proto static', output) + if first: + self.assertEqual('10.10.10.11 nhid 2 via inet6 2001:1234:5:8f63::2 proto static', output) + else: + self.assertEqual('10.10.10.11 nhid 7 via inet6 2001:1234:5:8f63::2 proto static', output) output = check_output('ip route show dev veth99 10.10.10.12') print(output) - self.assertEqual('10.10.10.12 nhid 5 via 192.168.10.1 proto static onlink', output) + if first: + self.assertEqual('10.10.10.12 nhid 5 via 192.168.10.1 proto static onlink', output) + else: + self.assertEqual('10.10.10.12 nhid 5 via 192.168.5.3 proto static', output) output = check_output('ip -6 route show dev veth99 2001:1234:5:8f62::1') print(output) - self.assertEqual('2001:1234:5:8f62::1 nhid 2 via 2001:1234:5:8f63::2 proto static metric 1024 pref medium', output) + if first: + self.assertEqual('2001:1234:5:8f62::1 nhid 2 via 2001:1234:5:8f63::2 proto static metric 1024 pref medium', output) + else: + self.assertEqual('2001:1234:5:8f62::1 nhid 7 via 2001:1234:5:8f63::2 proto static metric 1024 pref medium', output) output = check_output('ip route show 10.10.10.13') print(output) - self.assertEqual('blackhole 10.10.10.13 nhid 6 dev lo proto static', output) + if first: + self.assertEqual('blackhole 10.10.10.13 nhid 6 dev lo proto static', output) + else: + self.assertEqual('blackhole 10.10.10.13 nhid 1 dev lo proto static', output) output = check_output('ip -6 route show 2001:1234:5:8f62::2') print(output) - self.assertEqual('blackhole 2001:1234:5:8f62::2 nhid 7 dev lo proto static metric 1024 pref medium', output) + if first: + self.assertEqual('blackhole 2001:1234:5:8f62::2 nhid 7 dev lo proto static metric 1024 pref medium', output) + else: + self.assertEqual('blackhole 2001:1234:5:8f62::2 nhid 2 dev lo proto static metric 1024 pref medium', output) output = check_output('ip route show 10.10.10.14') print(output) - self.assertIn('10.10.10.14 nhid 21 proto static', output) + if first: + self.assertIn('10.10.10.14 nhid 21 proto static', output) + self.assertIn('nexthop via 192.168.5.1 dev veth99 weight 3', output) + else: + self.assertIn('10.10.10.14 nhid 20 proto static', output) + self.assertIn('nexthop via 192.168.5.3 dev veth99 weight 3', output) self.assertIn('nexthop via 192.168.20.1 dev dummy98 weight 1', output) - self.assertIn('nexthop via 192.168.5.1 dev veth99 weight 3', output) output = check_output(*networkctl_cmd, '--json=short', 'status', env=env) check_json(output) @@ -3929,13 +3971,18 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): check_output('ip address add 192.168.20.20/24 dev dummy98') check_output('ip nexthop add id 42 via 192.168.20.2 dev dummy98') - copy_network_unit('25-nexthop.network', '25-veth.netdev', '25-veth-peer.network', - '12-dummy.netdev', '25-nexthop-dummy.network') + copy_network_unit('25-nexthop-1.network', '25-veth.netdev', '25-veth-peer.network', + '12-dummy.netdev', '25-nexthop-dummy-1.network') start_networkd() - self.check_nexthop(manage_foreign_nexthops) + self.check_nexthop(manage_foreign_nexthops, first=True) - remove_network_unit('25-nexthop.network') + remove_network_unit('25-nexthop-1.network', '25-nexthop-dummy-1.network') + copy_network_unit('25-nexthop-2.network', '25-nexthop-dummy-2.network') + networkctl_reload() + self.check_nexthop(manage_foreign_nexthops, first=False) + + remove_network_unit('25-nexthop-2.network') copy_network_unit('25-nexthop-nothing.network') networkctl_reload() self.wait_online(['veth99:routable', 'veth-peer:routable']) @@ -3947,12 +3994,11 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): print(output) self.assertEqual(output, '') - remove_network_unit('25-nexthop-nothing.network') - copy_network_unit('25-nexthop.network') - networkctl_reconfigure('dummy98') + remove_network_unit('25-nexthop-nothing.network', '25-nexthop-dummy-2.network') + copy_network_unit('25-nexthop-1.network', '25-nexthop-dummy-1.network') networkctl_reload() - self.check_nexthop(manage_foreign_nexthops) + self.check_nexthop(manage_foreign_nexthops, first=True) remove_link('veth99') time.sleep(2)