]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-network: tun/tap fd may be owned by tentative worker processes
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 28 May 2024 09:15:02 +0000 (18:15 +0900)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 28 May 2024 14:39:51 +0000 (16:39 +0200)
PID1 may invoke a helper process, e.g. sd-close, during the test.
So, processes other than networkd and PID1 may be shown.
```
testtap99: tap pi multi_queue vnet_hdr persist filter
        Attached to processes:systemd-network(2852)(sd-close)(2863)systemd(1)
```

Closes #33055.

test/test-network/systemd-networkd-tests.py

index 8d9e0533b741ee6e8c72f0fd438a70dc9ba05305..cf33d2dbd222f0fd19dc1d7135a7634e29a69c85 100755 (executable)
@@ -1787,82 +1787,74 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
         self.assertRegex(output, 'link/ether 12:34:56:78:9a:bf')
         self.assertRegex(output, 'mtu 1800')
 
-    def test_tuntap(self):
-        copy_network_unit('25-tun.netdev', '25-tap.netdev', '26-netdev-link-local-addressing-yes.network')
-        start_networkd()
-
-        self.wait_online('testtun99:degraded', 'testtap99:degraded')
-
+    def check_tuntap(self, attached):
         pid = networkd_pid()
         name = psutil.Process(pid).name()[:15]
 
-        output = check_output('ip -d tuntap show')
+        output = check_output('ip -d -oneline tuntap show')
         print(output)
-        self.assertRegex(output, fr'(?m)testtap99: tap pi (multi_queue |)vnet_hdr persist filter *(0x100|)\n\tAttached to processes:{name}\({pid}\)systemd\(1\)$')
-        self.assertRegex(output, fr'(?m)testtun99: tun pi (multi_queue |)vnet_hdr persist filter *(0x100|)\n\tAttached to processes:{name}\({pid}\)systemd\(1\)$')
+        self.assertRegex(output, r'testtap99: tap pi (multi_queue |)vnet_hdr persist filter.*\tAttached to processes:')
+        self.assertRegex(output, r'testtun99: tun pi (multi_queue |)vnet_hdr persist filter.*\tAttached to processes:')
 
-        output = check_output('ip -d link show testtun99')
-        print(output)
-        # Old ip command does not support IFF_ flags
-        self.assertRegex(output, 'tun (type tun pi on vnet_hdr on multi_queue|addrgenmode) ')
-        self.assertIn('UP,LOWER_UP', output)
+        if attached:
+            self.assertRegex(output, fr'testtap99: .*{name}\({pid}\)')
+            self.assertRegex(output, fr'testtun99: .*{name}\({pid}\)')
+            self.assertRegex(output, r'testtap99: .*systemd\(1\)')
+            self.assertRegex(output, r'testtun99: .*systemd\(1\)')
 
-        output = check_output('ip -d link show testtap99')
-        print(output)
-        self.assertRegex(output, 'tun (type tap pi on vnet_hdr on multi_queue|addrgenmode) ')
-        self.assertIn('UP,LOWER_UP', output)
+            output = check_output('ip -d link show testtun99')
+            print(output)
+            # Old ip command does not support IFF_ flags
+            self.assertRegex(output, 'tun (type tun pi on vnet_hdr on multi_queue|addrgenmode) ')
+            self.assertIn('UP,LOWER_UP', output)
 
-        remove_network_unit('26-netdev-link-local-addressing-yes.network')
+            output = check_output('ip -d link show testtap99')
+            print(output)
+            self.assertRegex(output, 'tun (type tap pi on vnet_hdr on multi_queue|addrgenmode) ')
+            self.assertIn('UP,LOWER_UP', output)
 
-        restart_networkd()
-        self.wait_online('testtun99:degraded', 'testtap99:degraded', setup_state='unmanaged')
+        else:
+            self.assertNotIn(f'{name}({pid})', output)
+            self.assertNotIn('systemd(1)', output)
 
-        pid = networkd_pid()
-        name = psutil.Process(pid).name()[:15]
+            for _ in range(20):
+                output = check_output('ip -d link show testtun99')
+                print(output)
+                self.assertRegex(output, 'tun (type tun pi on vnet_hdr on multi_queue|addrgenmode) ')
+                if 'NO-CARRIER' in output:
+                    break
+                time.sleep(0.5)
+            else:
+                self.fail()
 
-        output = check_output('ip -d tuntap show')
-        print(output)
-        self.assertRegex(output, fr'(?m)testtap99: tap pi (multi_queue |)vnet_hdr persist filter *(0x100|)\n\tAttached to processes:{name}\({pid}\)systemd\(1\)$')
-        self.assertRegex(output, fr'(?m)testtun99: tun pi (multi_queue |)vnet_hdr persist filter *(0x100|)\n\tAttached to processes:{name}\({pid}\)systemd\(1\)$')
+            for _ in range(20):
+                output = check_output('ip -d link show testtap99')
+                print(output)
+                self.assertRegex(output, 'tun (type tap pi on vnet_hdr on multi_queue|addrgenmode) ')
+                if 'NO-CARRIER' in output:
+                    break
+                time.sleep(0.5)
+            else:
+                self.fail()
 
-        output = check_output('ip -d link show testtun99')
-        print(output)
-        self.assertRegex(output, 'tun (type tun pi on vnet_hdr on multi_queue|addrgenmode) ')
-        self.assertIn('UP,LOWER_UP', output)
+    def test_tuntap(self):
+        copy_network_unit('25-tun.netdev', '25-tap.netdev', '26-netdev-link-local-addressing-yes.network')
+        start_networkd()
+        self.wait_online('testtun99:degraded', 'testtap99:degraded')
 
-        output = check_output('ip -d link show testtap99')
-        print(output)
-        self.assertRegex(output, 'tun (type tap pi on vnet_hdr on multi_queue|addrgenmode) ')
-        self.assertIn('UP,LOWER_UP', output)
+        self.check_tuntap(True)
 
-        clear_network_units()
+        remove_network_unit('26-netdev-link-local-addressing-yes.network')
         restart_networkd()
-        self.wait_online('testtun99:off', 'testtap99:off', setup_state='unmanaged')
+        self.wait_online('testtun99:degraded', 'testtap99:degraded', setup_state='unmanaged')
 
-        output = check_output('ip -d tuntap show')
-        print(output)
-        self.assertRegex(output, r'(?m)testtap99: tap pi (multi_queue |)vnet_hdr persist filter *(0x100|)\n\tAttached to processes:$')
-        self.assertRegex(output, r'(?m)testtun99: tun pi (multi_queue |)vnet_hdr persist filter *(0x100|)\n\tAttached to processes:$')
+        self.check_tuntap(True)
 
-        for _ in range(20):
-            output = check_output('ip -d link show testtun99')
-            print(output)
-            self.assertRegex(output, 'tun (type tun pi on vnet_hdr on multi_queue|addrgenmode) ')
-            if 'NO-CARRIER' in output:
-                break
-            time.sleep(0.5)
-        else:
-            self.fail()
+        clear_network_units()
+        restart_networkd()
+        self.wait_online('testtun99:off', 'testtap99:off', setup_state='unmanaged')
 
-        for _ in range(20):
-            output = check_output('ip -d link show testtap99')
-            print(output)
-            self.assertRegex(output, 'tun (type tap pi on vnet_hdr on multi_queue|addrgenmode) ')
-            if 'NO-CARRIER' in output:
-                break
-            time.sleep(0.5)
-        else:
-            self.fail()
+        self.check_tuntap(False)
 
     @expectedFailureIfModuleIsNotAvailable('vrf')
     def test_vrf(self):