]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - test/test-network/systemd-networkd-tests.py
test-network: stop systemd-networkd.socket during testing
[thirdparty/systemd.git] / test / test-network / systemd-networkd-tests.py
index e1ff2dad2375027cc5579187653c5bfb8327ab9f..806f4a496c4930e0499609583afed13d8dc4e9c6 100755 (executable)
@@ -14,14 +14,15 @@ import socket
 import threading
 from shutil import copytree
 
-network_unit_file_path='/var/run/systemd/network'
-networkd_ci_path='/var/run/networkd-ci'
+network_unit_file_path='/run/systemd/network'
+networkd_runtime_directory='/run/systemd/netif'
+networkd_ci_path='/run/networkd-ci'
 network_sysctl_ipv6_path='/proc/sys/net/ipv6/conf'
 network_sysctl_ipv4_path='/proc/sys/net/ipv4/conf'
 
-dnsmasq_config_file='/var/run/networkd-ci/test-dnsmasq.conf'
-dnsmasq_pid_file='/var/run/networkd-ci/test-test-dnsmasq.pid'
-dnsmasq_log_file='/var/run/networkd-ci/test-dnsmasq-log-file'
+dnsmasq_config_file='/run/networkd-ci/test-dnsmasq.conf'
+dnsmasq_pid_file='/run/networkd-ci/test-test-dnsmasq.pid'
+dnsmasq_log_file='/run/networkd-ci/test-dnsmasq-log-file'
 
 def is_module_available(module_name):
     lsmod_output = subprocess.check_output('lsmod', universal_newlines=True)
@@ -44,9 +45,15 @@ def setUpModule():
     shutil.rmtree(networkd_ci_path)
     copytree(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'conf'), networkd_ci_path)
 
+    subprocess.check_call('systemctl stop systemd-networkd.socket', shell=True)
+
 def tearDownModule():
     shutil.rmtree(networkd_ci_path)
 
+    subprocess.check_call('systemctl stop systemd-networkd.service', shell=True)
+    subprocess.check_call('systemctl start systemd-networkd.socket', shell=True)
+    subprocess.check_call('systemctl start systemd-networkd.service', shell=True)
+
 class Utilities():
     dhcp_server_data = []
 
@@ -74,11 +81,15 @@ class Utilities():
     def copy_unit_to_networkd_unit_path(self, *units):
         for unit in units:
             shutil.copy(os.path.join(networkd_ci_path, unit), network_unit_file_path)
+            if (os.path.exists(os.path.join(networkd_ci_path, unit + '.d'))):
+                copytree(os.path.join(networkd_ci_path, unit + '.d'), os.path.join(network_unit_file_path, unit + '.d'))
 
     def remove_unit_from_networkd_path(self, units):
         for unit in units:
             if (os.path.exists(os.path.join(network_unit_file_path, unit))):
                 os.remove(os.path.join(network_unit_file_path, unit))
+                if (os.path.exists(os.path.join(network_unit_file_path, unit + '.d'))):
+                    shutil.rmtree(os.path.join(network_unit_file_path, unit + '.d'))
 
     def start_dnsmasq(self):
         subprocess.check_call('dnsmasq -8 /var/run/networkd-ci/test-dnsmasq-log-file --log-queries=extra --log-dhcp --pid-file=/var/run/networkd-ci/test-test-dnsmasq.pid --conf-file=/dev/null --interface=veth-peer --enable-ra --dhcp-range=2600::10,2600::20 --dhcp-range=192.168.5.10,192.168.5.200 -R --dhcp-leasefile=/var/run/networkd-ci/lease --dhcp-option=26,1492 --dhcp-option=option:router,192.168.5.1 --dhcp-option=33,192.168.5.4,192.168.5.5', shell=True)
@@ -114,7 +125,12 @@ class Utilities():
             os.remove(dnsmasq_log_file)
 
     def start_networkd(self):
-        subprocess.check_call('systemctl restart systemd-networkd', shell=True)
+        if (os.path.exists(os.path.join(networkd_runtime_directory, 'state'))):
+            subprocess.check_call('systemctl stop systemd-networkd', shell=True)
+            os.remove(os.path.join(networkd_runtime_directory, 'state'))
+            subprocess.check_call('systemctl start systemd-networkd', shell=True)
+        else:
+            subprocess.check_call('systemctl restart systemd-networkd', shell=True)
         time.sleep(5)
 
 global ip
@@ -149,17 +165,18 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
     links =['bridge99', 'bond99', 'bond99', 'vlan99', 'test1', 'macvtap99',
             'macvlan99', 'ipvlan99', 'vxlan99', 'veth99', 'vrf99', 'tun99',
             'tap99', 'vcan99', 'geneve99', 'dummy98', 'ipiptun99', 'sittun99', '6rdtun99',
-            'gretap99', 'vtitun99', 'vti6tun99','ip6tnl99', 'gretun99', 'ip6gretap99', 'wg99']
+            'gretap99', 'vtitun99', 'vti6tun99','ip6tnl99', 'gretun99', 'ip6gretap99',
+            'wg99', 'dropin-test', 'erspan-test']
 
     units = ['25-bridge.netdev', '25-bond.netdev', '21-vlan.netdev', '11-dummy.netdev', '21-vlan.network',
              '21-macvtap.netdev', 'macvtap.network', '21-macvlan.netdev', 'macvlan.network', 'vxlan.network',
              '25-vxlan.netdev', '25-ipvlan.netdev', 'ipvlan.network', '25-veth.netdev', '25-vrf.netdev',
              '25-tun.netdev', '25-tun.netdev', '25-vcan.netdev', '25-geneve.netdev', '25-ipip-tunnel.netdev',
-             '25-ip6tnl-tunnel.netdev', '25-ip6gre-tunnel.netdev','25-sit-tunnel.netdev', '25-6rd-tunnel.netdev',
-             '25-gre-tunnel.netdev', '25-gretap-tunnel.netdev', '25-vti-tunnel.netdev', '25-vti6-tunnel.netdev',
-             '12-dummy.netdev', 'gre.network', 'ipip.network', 'ip6gretap.network', 'gretun.network',
-             'ip6tnl.network', '25-tap.netdev', 'vti6.network', 'vti.network', 'gretap.network', 'sit.network',
-             '25-ipip-tunnel-independent.netdev', '25-wireguard.netdev', '6rd.network']
+             '25-ip6tnl-tunnel.netdev', '25-ip6gre-tunnel.netdev', '25-sit-tunnel.netdev', '25-6rd-tunnel.netdev',
+             '25-erspan-tunnel.netdev', '25-gre-tunnel.netdev', '25-gretap-tunnel.netdev', '25-vti-tunnel.netdev',
+             '25-vti6-tunnel.netdev', '12-dummy.netdev', 'gre.network', 'ipip.network', 'ip6gretap.network',
+             'gretun.network', 'ip6tnl.network', '25-tap.netdev', 'vti6.network', 'vti.network', 'gretap.network',
+             'sit.network', '25-ipip-tunnel-independent.netdev', '25-wireguard.netdev', '6rd.network', '10-dropin-test.netdev']
 
     def setUp(self):
         self.link_remove(self.links)
@@ -168,6 +185,17 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
         self.link_remove(self.links)
         self.remove_unit_from_networkd_path(self.units)
 
+    def test_dropin(self):
+        self.copy_unit_to_networkd_unit_path('10-dropin-test.netdev')
+
+        self.start_networkd()
+
+        self.assertTrue(self.link_exits('dropin-test'))
+
+        output = subprocess.check_output(['ip', 'link', 'show', 'dropin-test']).rstrip().decode('utf-8')
+        print(output)
+        self.assertRegex(output, '00:50:56:c0:00:28')
+
     def test_bridge(self):
         self.copy_unit_to_networkd_unit_path('25-bridge.netdev')
         self.start_networkd()
@@ -368,6 +396,18 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities):
         self.assertTrue(self.link_exits('dummy98'))
         self.assertTrue(self.link_exits('sittun99'))
 
+    def test_erspan_tunnel(self):
+        self.copy_unit_to_networkd_unit_path('25-erspan-tunnel.netdev')
+        self.start_networkd()
+
+        self.assertTrue(self.link_exits('erspan-test'))
+
+        output = subprocess.check_output(['ip', '-d', 'link', 'show', 'erspan-test']).rstrip().decode('utf-8')
+        print(output)
+        self.assertTrue(output, '172.16.1.200')
+        self.assertTrue(output, '172.16.1.100')
+        self.assertTrue(output, '101')
+
     def test_tunnel_independent(self):
         self.copy_unit_to_networkd_unit_path('25-ipip-tunnel-independent.netdev')
 
@@ -399,10 +439,11 @@ class NetworkdNetWorkTests(unittest.TestCase, Utilities):
     units = ['12-dummy.netdev', 'test-static.network', 'configure-without-carrier.network', '11-dummy.netdev',
              '23-primary-slave.network', '23-test1-bond199.network', '11-dummy.netdev', '23-bond199.network',
              '25-bond-active-backup-slave.netdev', '12-dummy.netdev', '23-active-slave.network',
-             'routing-policy-rule.network', '25-address-section.network', '25-address-section-miscellaneous.network',
-             '25-route-section.network', '25-route-type.network', '25-route-tcp-window-settings.network',
+             'routing-policy-rule.network', '25-fibrule-port-range.network', '25-address-section.network',
+             '25-address-section-miscellaneous.network', '25-route-section.network', '25-route-type.network',
+             '25-route-tcp-window-settings.network', '25-route-gateway.network', '25-route-gateway-on-link.network',
              '25-address-link-section.network', '25-ipv6-address-label-section.network', '25-link-section-unmanaged.network',
-             '25-sysctl.network']
+             '25-sysctl.network', '25-route-reverse-order.network']
 
     def setUp(self):
         self.link_remove(self.links)
@@ -467,6 +508,20 @@ class NetworkdNetWorkTests(unittest.TestCase, Utilities):
         self.assertRegex(output, 'oif test1')
         self.assertRegex(output, 'lookup 7')
 
+    def test_routing_policy_rule_port_range(self):
+        self.copy_unit_to_networkd_unit_path('25-fibrule-port-range.network', '11-dummy.netdev')
+        self.start_networkd()
+
+        self.assertTrue(self.link_exits('test1'))
+        output = subprocess.check_output(['ip', 'rule']).rstrip().decode('utf-8')
+        print(output)
+        self.assertRegex(output, '111')
+        self.assertRegex(output, 'from 192.168.100.18')
+        self.assertRegex(output, '1123-1150')
+        self.assertRegex(output, '3224-3290')
+        self.assertRegex(output, 'tcp')
+        self.assertRegex(output, 'lookup 7')
+
     def test_address_preferred_lifetime_zero_ipv6(self):
         self.copy_unit_to_networkd_unit_path('25-address-section-miscellaneous.network', '12-dummy.netdev')
         self.start_networkd()
@@ -490,6 +545,17 @@ class NetworkdNetWorkTests(unittest.TestCase, Utilities):
         self.assertRegex(output, 'static')
         self.assertRegex(output, '192.168.0.0/24')
 
+    def test_ip_route_reverse(self):
+        self.copy_unit_to_networkd_unit_path('25-route-reverse-order.network', '12-dummy.netdev')
+        self.start_networkd()
+
+        self.assertTrue(self.link_exits('dummy98'))
+
+        output = subprocess.check_output(['ip', '-6', 'route', 'show', 'dev', 'dummy98']).rstrip().decode('utf-8')
+        print(output)
+        self.assertRegex(output, '2001:1234:5:8fff:ff:ff:ff:ff')
+        self.assertRegex(output, '2001:1234:5:8f63::1')
+
     def test_ip_route_blackhole_unreachable_prohibit(self):
         self.copy_unit_to_networkd_unit_path('25-route-type.network', '12-dummy.netdev')
         self.start_networkd()
@@ -517,6 +583,51 @@ class NetworkdNetWorkTests(unittest.TestCase, Utilities):
         self.assertRegex(output, 'initcwnd 20')
         self.assertRegex(output, 'initrwnd 30')
 
+    def test_ip_route_gateway(self):
+        self.copy_unit_to_networkd_unit_path('25-route-gateway.network', '12-dummy.netdev')
+        self.start_networkd()
+
+        self.assertTrue(self.link_exits('dummy98'))
+
+        output = subprocess.check_output(['ip', 'route', 'list', 'dev', 'dummy98', 'default']).rstrip().decode('utf-8')
+        print(output)
+        self.assertRegex(output, 'default')
+        self.assertRegex(output, 'via')
+        self.assertRegex(output, '149.10.124.64')
+        self.assertRegex(output, 'proto')
+        self.assertRegex(output, 'static')
+
+        output = subprocess.check_output(['ip', 'route', 'list', 'dev', 'dummy98', 'src', '149.10.124.58']).rstrip().decode('utf-8')
+        print(output)
+        self.assertRegex(output, '149.10.124.48/28')
+        self.assertRegex(output, 'proto')
+        self.assertRegex(output, 'kernel')
+        self.assertRegex(output, 'scope')
+        self.assertRegex(output, 'link')
+
+    def test_ip_route_gateway_on_link(self):
+        self.copy_unit_to_networkd_unit_path('25-route-gateway-on-link.network', '12-dummy.netdev')
+        self.start_networkd()
+
+        self.assertTrue(self.link_exits('dummy98'))
+
+        output = subprocess.check_output(['ip', 'route', 'list', 'dev', 'dummy98', 'default']).rstrip().decode('utf-8')
+        print(output)
+        self.assertRegex(output, 'default')
+        self.assertRegex(output, 'via')
+        self.assertRegex(output, '149.10.125.65')
+        self.assertRegex(output, 'proto')
+        self.assertRegex(output, 'static')
+        self.assertRegex(output, 'onlink')
+
+        output = subprocess.check_output(['ip', 'route', 'list', 'dev', 'dummy98', 'src', '149.10.124.58']).rstrip().decode('utf-8')
+        print(output)
+        self.assertRegex(output, '149.10.124.48/28')
+        self.assertRegex(output, 'proto')
+        self.assertRegex(output, 'kernel')
+        self.assertRegex(output, 'scope')
+        self.assertRegex(output, 'link')
+
     def test_ip_link_mac_address(self):
         self.copy_unit_to_networkd_unit_path('25-address-link-section.network', '12-dummy.netdev')
         self.start_networkd()