summaryrefslogtreecommitdiff
path: root/smoketest
diff options
context:
space:
mode:
Diffstat (limited to 'smoketest')
-rw-r--r--smoketest/scripts/cli/base_interfaces_test.py185
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_bonding.py12
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_bridge.py8
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_dummy.py1
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_ethernet.py8
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_geneve.py2
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_input.py1
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_l2tpv3.py2
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_loopback.py5
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_macsec.py3
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_netns.py4
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_pppoe.py1
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_pseudo_ethernet.py8
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_tunnel.py3
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_virtual_ethernet.py31
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_vti.py5
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_vxlan.py5
-rwxr-xr-xsmoketest/scripts/cli/test_interfaces_wireless.py7
-rwxr-xr-xsmoketest/scripts/cli/test_service_dns_dynamic.py222
-rwxr-xr-xsmoketest/scripts/cli/test_service_mdns-repeater.py35
-rwxr-xr-xsmoketest/scripts/cli/test_vpn_ipsec.py2
21 files changed, 316 insertions, 234 deletions
diff --git a/smoketest/scripts/cli/base_interfaces_test.py b/smoketest/scripts/cli/base_interfaces_test.py
index 2f730abfb..348741715 100644
--- a/smoketest/scripts/cli/base_interfaces_test.py
+++ b/smoketest/scripts/cli/base_interfaces_test.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2019-2022 VyOS maintainers and contributors
+# Copyright (C) 2019-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -35,6 +35,7 @@ from vyos.util import process_named_running
from vyos.util import get_interface_config
from vyos.validate import is_intf_addr_assigned
from vyos.validate import is_ipv6_link_local
+from vyos.xml_ref import cli_defined
def is_mirrored_to(interface, mirror_if, qdisc):
"""
@@ -82,6 +83,17 @@ class BasicInterfaceTest:
def setUpClass(cls):
super(BasicInterfaceTest.TestCase, cls).setUpClass()
+ # XXX the case of test_vif_8021q_mtu_limits, below, shows that
+ # we should extend cli_defined to support more complex queries
+ cls._test_vlan = cli_defined(cls._base_path, 'vif')
+ cls._test_qinq = cli_defined(cls._base_path, 'vif-s')
+ cls._test_dhcp = cli_defined(cls._base_path, 'dhcp-options')
+ cls._test_ip = cli_defined(cls._base_path, 'ip')
+ cls._test_ipv6 = cli_defined(cls._base_path, 'ipv6')
+ cls._test_ipv6_dhcpc6 = cli_defined(cls._base_path, 'dhcpv6-options')
+ cls._test_ipv6_pd = cli_defined(cls._base_path + ['dhcpv6-options'], 'pd')
+ cls._test_mtu = cli_defined(cls._base_path, 'mtu')
+
# Setup mirror interfaces for SPAN (Switch Port Analyzer)
for span in cls._mirror_interfaces:
section = Section.section(span)
@@ -104,9 +116,15 @@ class BasicInterfaceTest:
for intf in self._interfaces:
self.assertNotIn(intf, interfaces())
- # No daemon that was started during a test should remain running
+ # No daemon started during tests should remain running
for daemon in ['dhcp6c', 'dhclient']:
- self.assertFalse(process_named_running(daemon))
+ # if _interface list is populated do a more fine grained search
+ # by also checking the cmd arguments passed to the daemon
+ if self._interfaces:
+ for tmp in self._interfaces:
+ self.assertFalse(process_named_running(daemon, tmp))
+ else:
+ self.assertFalse(process_named_running(daemon))
def test_dhcp_disable_interface(self):
if not self._test_dhcp:
@@ -360,7 +378,7 @@ class BasicInterfaceTest:
# is the Wireless test will first load the wifi kernel hwsim module
# which creates a wlan0 and wlan1 interface which will fail the
# tearDown() test in the end that no interface is allowed to survive!
- if not self._test_vlan:
+ if not self._test_vlan or not self._test_mtu:
self.skipTest('not supported')
mtu_1500 = '1500'
@@ -634,58 +652,90 @@ class BasicInterfaceTest:
self.cli_set(path + option.split())
# Options
- self.cli_set(path + ['ip', 'adjust-mss', mss])
- self.cli_set(path + ['ip', 'arp-cache-timeout', arp_tmo])
- self.cli_set(path + ['ip', 'disable-arp-filter'])
- self.cli_set(path + ['ip', 'disable-forwarding'])
- self.cli_set(path + ['ip', 'enable-directed-broadcast'])
- self.cli_set(path + ['ip', 'enable-arp-accept'])
- self.cli_set(path + ['ip', 'enable-arp-announce'])
- self.cli_set(path + ['ip', 'enable-arp-ignore'])
- self.cli_set(path + ['ip', 'enable-proxy-arp'])
- self.cli_set(path + ['ip', 'proxy-arp-pvlan'])
- self.cli_set(path + ['ip', 'source-validation', 'loose'])
+ if cli_defined(self._base_path + ['ip'], 'adjust-mss'):
+ self.cli_set(path + ['ip', 'adjust-mss', mss])
+
+ if cli_defined(self._base_path + ['ip'], 'arp-cache-timeout'):
+ self.cli_set(path + ['ip', 'arp-cache-timeout', arp_tmo])
+
+ if cli_defined(self._base_path + ['ip'], 'disable-arp-filter'):
+ self.cli_set(path + ['ip', 'disable-arp-filter'])
+
+ if cli_defined(self._base_path + ['ip'], 'disable-forwarding'):
+ self.cli_set(path + ['ip', 'disable-forwarding'])
+
+ if cli_defined(self._base_path + ['ip'], 'enable-directed-broadcast'):
+ self.cli_set(path + ['ip', 'enable-directed-broadcast'])
+
+ if cli_defined(self._base_path + ['ip'], 'enable-arp-accept'):
+ self.cli_set(path + ['ip', 'enable-arp-accept'])
+
+ if cli_defined(self._base_path + ['ip'], 'enable-arp-announce'):
+ self.cli_set(path + ['ip', 'enable-arp-announce'])
+
+ if cli_defined(self._base_path + ['ip'], 'enable-arp-ignore'):
+ self.cli_set(path + ['ip', 'enable-arp-ignore'])
+
+ if cli_defined(self._base_path + ['ip'], 'enable-proxy-arp'):
+ self.cli_set(path + ['ip', 'enable-proxy-arp'])
+
+ if cli_defined(self._base_path + ['ip'], 'proxy-arp-pvlan'):
+ self.cli_set(path + ['ip', 'proxy-arp-pvlan'])
+
+ if cli_defined(self._base_path + ['ip'], 'source-validation'):
+ self.cli_set(path + ['ip', 'source-validation', 'loose'])
self.cli_commit()
for interface in self._interfaces:
- base_options = f'oifname "{interface}"'
- out = cmd('sudo nft list chain raw VYOS_TCP_MSS')
- for line in out.splitlines():
- if line.startswith(base_options):
- self.assertIn(f'tcp option maxseg size set {mss}', line)
+ if cli_defined(self._base_path + ['ip'], 'adjust-mss'):
+ base_options = f'oifname "{interface}"'
+ out = cmd('sudo nft list chain raw VYOS_TCP_MSS')
+ for line in out.splitlines():
+ if line.startswith(base_options):
+ self.assertIn(f'tcp option maxseg size set {mss}', line)
- tmp = read_file(f'/proc/sys/net/ipv4/neigh/{interface}/base_reachable_time_ms')
- self.assertEqual(tmp, str((int(arp_tmo) * 1000))) # tmo value is in milli seconds
+ if cli_defined(self._base_path + ['ip'], 'arp-cache-timeout'):
+ tmp = read_file(f'/proc/sys/net/ipv4/neigh/{interface}/base_reachable_time_ms')
+ self.assertEqual(tmp, str((int(arp_tmo) * 1000))) # tmo value is in milli seconds
proc_base = f'/proc/sys/net/ipv4/conf/{interface}'
- tmp = read_file(f'{proc_base}/arp_filter')
- self.assertEqual('0', tmp)
+ if cli_defined(self._base_path + ['ip'], 'disable-arp-filter'):
+ tmp = read_file(f'{proc_base}/arp_filter')
+ self.assertEqual('0', tmp)
- tmp = read_file(f'{proc_base}/arp_accept')
- self.assertEqual('1', tmp)
+ if cli_defined(self._base_path + ['ip'], 'enable-arp-accept'):
+ tmp = read_file(f'{proc_base}/arp_accept')
+ self.assertEqual('1', tmp)
- tmp = read_file(f'{proc_base}/arp_announce')
- self.assertEqual('1', tmp)
+ if cli_defined(self._base_path + ['ip'], 'enable-arp-announce'):
+ tmp = read_file(f'{proc_base}/arp_announce')
+ self.assertEqual('1', tmp)
- tmp = read_file(f'{proc_base}/arp_ignore')
- self.assertEqual('1', tmp)
+ if cli_defined(self._base_path + ['ip'], 'enable-arp-ignore'):
+ tmp = read_file(f'{proc_base}/arp_ignore')
+ self.assertEqual('1', tmp)
- tmp = read_file(f'{proc_base}/forwarding')
- self.assertEqual('0', tmp)
+ if cli_defined(self._base_path + ['ip'], 'disable-forwarding'):
+ tmp = read_file(f'{proc_base}/forwarding')
+ self.assertEqual('0', tmp)
- tmp = read_file(f'{proc_base}/bc_forwarding')
- self.assertEqual('1', tmp)
+ if cli_defined(self._base_path + ['ip'], 'enable-directed-broadcast'):
+ tmp = read_file(f'{proc_base}/bc_forwarding')
+ self.assertEqual('1', tmp)
- tmp = read_file(f'{proc_base}/proxy_arp')
- self.assertEqual('1', tmp)
+ if cli_defined(self._base_path + ['ip'], 'enable-proxy-arp'):
+ tmp = read_file(f'{proc_base}/proxy_arp')
+ self.assertEqual('1', tmp)
- tmp = read_file(f'{proc_base}/proxy_arp_pvlan')
- self.assertEqual('1', tmp)
+ if cli_defined(self._base_path + ['ip'], 'proxy-arp-pvlan'):
+ tmp = read_file(f'{proc_base}/proxy_arp_pvlan')
+ self.assertEqual('1', tmp)
- tmp = read_file(f'{proc_base}/rp_filter')
- self.assertEqual('2', tmp)
+ if cli_defined(self._base_path + ['ip'], 'source-validation'):
+ tmp = read_file(f'{proc_base}/rp_filter')
+ self.assertEqual('2', tmp)
def test_interface_ipv6_options(self):
if not self._test_ipv6:
@@ -700,26 +750,33 @@ class BasicInterfaceTest:
self.cli_set(path + option.split())
# Options
- self.cli_set(path + ['ipv6', 'adjust-mss', mss])
- self.cli_set(path + ['ipv6', 'disable-forwarding'])
- self.cli_set(path + ['ipv6', 'dup-addr-detect-transmits', dad_transmits])
+ if cli_defined(self._base_path + ['ipv6'], 'adjust-mss'):
+ self.cli_set(path + ['ipv6', 'adjust-mss', mss])
+
+ if cli_defined(self._base_path + ['ipv6'], 'dup-addr-detect-transmits'):
+ self.cli_set(path + ['ipv6', 'dup-addr-detect-transmits', dad_transmits])
+
+ if cli_defined(self._base_path + ['ipv6'], 'disable-forwarding'):
+ self.cli_set(path + ['ipv6', 'disable-forwarding'])
self.cli_commit()
for interface in self._interfaces:
- base_options = f'oifname "{interface}"'
- out = cmd('sudo nft list chain ip6 raw VYOS_TCP_MSS')
- for line in out.splitlines():
- if line.startswith(base_options):
- self.assertIn(f'tcp option maxseg size set {mss}', line)
-
proc_base = f'/proc/sys/net/ipv6/conf/{interface}'
+ if cli_defined(self._base_path + ['ipv6'], 'adjust-mss'):
+ base_options = f'oifname "{interface}"'
+ out = cmd('sudo nft list chain ip6 raw VYOS_TCP_MSS')
+ for line in out.splitlines():
+ if line.startswith(base_options):
+ self.assertIn(f'tcp option maxseg size set {mss}', line)
- tmp = read_file(f'{proc_base}/forwarding')
- self.assertEqual('0', tmp)
+ if cli_defined(self._base_path + ['ipv6'], 'dup-addr-detect-transmits'):
+ tmp = read_file(f'{proc_base}/dad_transmits')
+ self.assertEqual(dad_transmits, tmp)
- tmp = read_file(f'{proc_base}/dad_transmits')
- self.assertEqual(dad_transmits, tmp)
+ if cli_defined(self._base_path + ['ipv6'], 'disable-forwarding'):
+ tmp = read_file(f'{proc_base}/forwarding')
+ self.assertEqual('0', tmp)
def test_dhcpv6_client_options(self):
if not self._test_ipv6_dhcpc6:
@@ -765,7 +822,14 @@ class BasicInterfaceTest:
prefix_len = '56'
sla_len = str(64 - int(prefix_len))
+ # Create delegatee interfaces first to avoid any confusion by dhcpc6
+ # this is mainly an "issue" with virtual-ethernet interfaces
delegatees = ['dum2340', 'dum2341', 'dum2342', 'dum2343', 'dum2344']
+ for delegatee in delegatees:
+ section = Section.section(delegatee)
+ self.cli_set(['interfaces', section, delegatee])
+
+ self.cli_commit()
for interface in self._interfaces:
path = self._base_path + [interface]
@@ -778,8 +842,6 @@ class BasicInterfaceTest:
self.cli_set(pd_base + ['length', prefix_len])
for delegatee in delegatees:
- section = Section.section(delegatee)
- self.cli_set(['interfaces', section, delegatee])
self.cli_set(pd_base + ['interface', delegatee, 'address', address])
# increment interface address
address = str(int(address) + 1)
@@ -821,7 +883,14 @@ class BasicInterfaceTest:
prefix_len = '56'
sla_len = str(64 - int(prefix_len))
+ # Create delegatee interfaces first to avoid any confusion by dhcpc6
+ # this is mainly an "issue" with virtual-ethernet interfaces
delegatees = ['dum3340', 'dum3341', 'dum3342', 'dum3343', 'dum3344']
+ for delegatee in delegatees:
+ section = Section.section(delegatee)
+ self.cli_set(['interfaces', section, delegatee])
+
+ self.cli_commit()
for interface in self._interfaces:
path = self._base_path + [interface]
@@ -835,8 +904,6 @@ class BasicInterfaceTest:
self.cli_set(pd_base + ['length', prefix_len])
for delegatee in delegatees:
- section = Section.section(delegatee)
- self.cli_set(['interfaces', section, delegatee])
self.cli_set(pd_base + ['interface', delegatee, 'address', address])
self.cli_set(pd_base + ['interface', delegatee, 'sla-id', sla_id])
@@ -866,8 +933,8 @@ class BasicInterfaceTest:
# increment interface address
address = str(int(address) + 1)
- # Check for running process
- self.assertTrue(process_named_running('dhcp6c'))
+ # Check for running process
+ self.assertTrue(process_named_running('dhcp6c', interface))
for delegatee in delegatees:
# we can already cleanup the test delegatee interface here
diff --git a/smoketest/scripts/cli/test_interfaces_bonding.py b/smoketest/scripts/cli/test_interfaces_bonding.py
index cd3995ed9..2e09173a7 100755
--- a/smoketest/scripts/cli/test_interfaces_bonding.py
+++ b/smoketest/scripts/cli/test_interfaces_bonding.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# Copyright (C) 2020-2022 VyOS maintainers and contributors
+# Copyright (C) 2020-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -28,14 +28,6 @@ from vyos.util import read_file
class BondingInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_dhcp = True
- cls._test_ip = True
- cls._test_ipv6 = True
- cls._test_ipv6_pd = True
- cls._test_ipv6_dhcpc6 = True
- cls._test_mtu = True
- cls._test_vlan = True
- cls._test_qinq = True
cls._base_path = ['interfaces', 'bonding']
cls._mirror_interfaces = ['dum21354']
cls._members = []
@@ -251,4 +243,4 @@ class BondingInterfaceTest(BasicInterfaceTest.TestCase):
self.assertIn(member, slaves)
if __name__ == '__main__':
- unittest.main(verbosity=2)
+ unittest.main(verbosity=2, failfast=True)
diff --git a/smoketest/scripts/cli/test_interfaces_bridge.py b/smoketest/scripts/cli/test_interfaces_bridge.py
index 6d7af78eb..85b45c8fa 100755
--- a/smoketest/scripts/cli/test_interfaces_bridge.py
+++ b/smoketest/scripts/cli/test_interfaces_bridge.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# Copyright (C) 2020-2022 VyOS maintainers and contributors
+# Copyright (C) 2020-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -32,12 +32,6 @@ from vyos.validate import is_intf_addr_assigned
class BridgeInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_dhcp = True
- cls._test_ip = True
- cls._test_ipv6 = True
- cls._test_ipv6_pd = True
- cls._test_ipv6_dhcpc6 = True
- cls._test_vlan = True
cls._base_path = ['interfaces', 'bridge']
cls._mirror_interfaces = ['dum21354']
cls._members = []
diff --git a/smoketest/scripts/cli/test_interfaces_dummy.py b/smoketest/scripts/cli/test_interfaces_dummy.py
index a79e4cb1b..d96ec2c5d 100755
--- a/smoketest/scripts/cli/test_interfaces_dummy.py
+++ b/smoketest/scripts/cli/test_interfaces_dummy.py
@@ -21,7 +21,6 @@ from base_interfaces_test import BasicInterfaceTest
class DummyInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_mtu = True
cls._base_path = ['interfaces', 'dummy']
cls._interfaces = ['dum435', 'dum8677', 'dum0931', 'dum089']
# call base-classes classmethod
diff --git a/smoketest/scripts/cli/test_interfaces_ethernet.py b/smoketest/scripts/cli/test_interfaces_ethernet.py
index e53413f0d..a1bc8481d 100755
--- a/smoketest/scripts/cli/test_interfaces_ethernet.py
+++ b/smoketest/scripts/cli/test_interfaces_ethernet.py
@@ -109,14 +109,6 @@ def get_certificate_count(interface, cert_type):
class EthernetInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_dhcp = True
- cls._test_ip = True
- cls._test_ipv6 = True
- cls._test_ipv6_pd = True
- cls._test_ipv6_dhcpc6 = True
- cls._test_mtu = True
- cls._test_vlan = True
- cls._test_qinq = True
cls._base_path = ['interfaces', 'ethernet']
cls._mirror_interfaces = ['dum21354']
diff --git a/smoketest/scripts/cli/test_interfaces_geneve.py b/smoketest/scripts/cli/test_interfaces_geneve.py
index 0e5098aa7..24d350aeb 100755
--- a/smoketest/scripts/cli/test_interfaces_geneve.py
+++ b/smoketest/scripts/cli/test_interfaces_geneve.py
@@ -24,8 +24,6 @@ from base_interfaces_test import BasicInterfaceTest
class GeneveInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_ip = True
- cls._test_ipv6 = True
cls._base_path = ['interfaces', 'geneve']
cls._options = {
'gnv0': ['vni 10', 'remote 127.0.1.1'],
diff --git a/smoketest/scripts/cli/test_interfaces_input.py b/smoketest/scripts/cli/test_interfaces_input.py
index c6d7febec..b4cae4695 100755
--- a/smoketest/scripts/cli/test_interfaces_input.py
+++ b/smoketest/scripts/cli/test_interfaces_input.py
@@ -27,7 +27,6 @@ class InputInterfaceTest(VyOSUnitTestSHIM.TestCase):
@classmethod
def setUpClass(cls):
super(InputInterfaceTest, cls).setUpClass()
-
cls._interfaces = ['ifb10', 'ifb20', 'ifb30']
def tearDown(self):
diff --git a/smoketest/scripts/cli/test_interfaces_l2tpv3.py b/smoketest/scripts/cli/test_interfaces_l2tpv3.py
index aed8e6f15..b1d5b7c19 100755
--- a/smoketest/scripts/cli/test_interfaces_l2tpv3.py
+++ b/smoketest/scripts/cli/test_interfaces_l2tpv3.py
@@ -24,8 +24,6 @@ from vyos.util import cmd
class L2TPv3InterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_ip = True
- cls._test_ipv6 = True
cls._base_path = ['interfaces', 'l2tpv3']
cls._options = {
'l2tpeth10': ['source-address 127.0.0.1', 'remote 127.10.10.10',
diff --git a/smoketest/scripts/cli/test_interfaces_loopback.py b/smoketest/scripts/cli/test_interfaces_loopback.py
index 5ff9c250e..cde90189b 100755
--- a/smoketest/scripts/cli/test_interfaces_loopback.py
+++ b/smoketest/scripts/cli/test_interfaces_loopback.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# Copyright (C) 2020-2021 VyOS maintainers and contributors
+# Copyright (C) 2020-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -31,6 +31,9 @@ class LoopbackInterfaceTest(BasicInterfaceTest.TestCase):
# call base-classes classmethod
super(LoopbackInterfaceTest, cls).setUpClass()
+ # we need to override tearDown() as loopback interfaces are ephemeral and
+ # will always be present on the system - the base class check will fail as
+ # the loopback interface will still exist.
def tearDown(self):
self.cli_delete(self._base_path)
self.cli_commit()
diff --git a/smoketest/scripts/cli/test_interfaces_macsec.py b/smoketest/scripts/cli/test_interfaces_macsec.py
index f141cc6d3..433336f07 100755
--- a/smoketest/scripts/cli/test_interfaces_macsec.py
+++ b/smoketest/scripts/cli/test_interfaces_macsec.py
@@ -42,9 +42,6 @@ def get_cipher(interface):
class MACsecInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_dhcp = True
- cls._test_ip = True
- cls._test_ipv6 = True
cls._base_path = ['interfaces', 'macsec']
cls._options = { 'macsec0': ['source-interface eth0', 'security cipher gcm-aes-128'] }
diff --git a/smoketest/scripts/cli/test_interfaces_netns.py b/smoketest/scripts/cli/test_interfaces_netns.py
index 9975a6b09..dffa7e0ac 100755
--- a/smoketest/scripts/cli/test_interfaces_netns.py
+++ b/smoketest/scripts/cli/test_interfaces_netns.py
@@ -14,9 +14,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import re
-import os
-import json
import unittest
from netifaces import interfaces
@@ -32,7 +29,6 @@ base_path = ['netns']
namespaces = ['mgmt', 'front', 'back', 'ams-ix']
class NETNSTest(VyOSUnitTestSHIM.TestCase):
-
def setUp(self):
self._interfaces = ['dum10', 'dum12', 'dum50']
diff --git a/smoketest/scripts/cli/test_interfaces_pppoe.py b/smoketest/scripts/cli/test_interfaces_pppoe.py
index f4efed641..0ce5e2fe0 100755
--- a/smoketest/scripts/cli/test_interfaces_pppoe.py
+++ b/smoketest/scripts/cli/test_interfaces_pppoe.py
@@ -14,7 +14,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import re
import unittest
from psutil import process_iter
diff --git a/smoketest/scripts/cli/test_interfaces_pseudo_ethernet.py b/smoketest/scripts/cli/test_interfaces_pseudo_ethernet.py
index a51b8d52c..0d6f5bc1f 100755
--- a/smoketest/scripts/cli/test_interfaces_pseudo_ethernet.py
+++ b/smoketest/scripts/cli/test_interfaces_pseudo_ethernet.py
@@ -23,14 +23,6 @@ from base_interfaces_test import BasicInterfaceTest
class PEthInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_dhcp = True
- cls._test_ip = True
- cls._test_ipv6 = True
- cls._test_ipv6_pd = True
- cls._test_ipv6_dhcpc6 = True
- cls._test_mtu = True
- cls._test_vlan = True
- cls._test_qinq = True
cls._base_path = ['interfaces', 'pseudo-ethernet']
cls._options = {}
diff --git a/smoketest/scripts/cli/test_interfaces_tunnel.py b/smoketest/scripts/cli/test_interfaces_tunnel.py
index 44bfbb5f0..9dce2b52c 100755
--- a/smoketest/scripts/cli/test_interfaces_tunnel.py
+++ b/smoketest/scripts/cli/test_interfaces_tunnel.py
@@ -30,9 +30,6 @@ mtu = 1476
class TunnelInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_ip = True
- cls._test_ipv6 = True
- cls._test_mtu = True
cls._base_path = ['interfaces', 'tunnel']
cls.local_v4 = '192.0.2.1'
cls.local_v6 = '2001:db8::1'
diff --git a/smoketest/scripts/cli/test_interfaces_virtual_ethernet.py b/smoketest/scripts/cli/test_interfaces_virtual_ethernet.py
index 4732342fc..4710930a0 100755
--- a/smoketest/scripts/cli/test_interfaces_virtual_ethernet.py
+++ b/smoketest/scripts/cli/test_interfaces_virtual_ethernet.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# Copyright (C) 2022 VyOS maintainers and contributors
+# Copyright (C) 2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -14,18 +14,18 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import os
import unittest
+from netifaces import interfaces
+
from vyos.ifconfig import Section
+from vyos.util import process_named_running
from base_interfaces_test import BasicInterfaceTest
class VEthInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_dhcp = True
cls._base_path = ['interfaces', 'virtual-ethernet']
-
cls._options = {
'veth0': ['peer-name veth1'],
'veth1': ['peer-name veth0'],
@@ -35,5 +35,28 @@ class VEthInterfaceTest(BasicInterfaceTest.TestCase):
# call base-classes classmethod
super(VEthInterfaceTest, cls).setUpClass()
+ def test_vif_8021q_mtu_limits(self):
+ self.skipTest('not supported')
+
+ # As we always need a pair of veth interfaces, we can not rely on the base
+ # class check to determine if there is a dhcp6c or dhclient instance running.
+ # This test will always fail as there is an instance running on the peer
+ # interface.
+ def tearDown(self):
+ self.cli_delete(self._base_path)
+ self.cli_commit()
+
+ # Verify that no previously interface remained on the system
+ for intf in self._interfaces:
+ self.assertNotIn(intf, interfaces())
+
+ @classmethod
+ def tearDownClass(cls):
+ # No daemon started during tests should remain running
+ for daemon in ['dhcp6c', 'dhclient']:
+ cls.assertFalse(cls, process_named_running(daemon))
+
+ super(VEthInterfaceTest, cls).tearDownClass()
+
if __name__ == '__main__':
unittest.main(verbosity=2)
diff --git a/smoketest/scripts/cli/test_interfaces_vti.py b/smoketest/scripts/cli/test_interfaces_vti.py
index 9cbf104f0..7f13575a3 100755
--- a/smoketest/scripts/cli/test_interfaces_vti.py
+++ b/smoketest/scripts/cli/test_interfaces_vti.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# Copyright (C) 2022 VyOS maintainers and contributors
+# Copyright (C) 2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -21,9 +21,6 @@ from base_interfaces_test import BasicInterfaceTest
class VTIInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_ip = True
- cls._test_ipv6 = True
- cls._test_mtu = True
cls._base_path = ['interfaces', 'vti']
cls._interfaces = ['vti10', 'vti20', 'vti30']
diff --git a/smoketest/scripts/cli/test_interfaces_vxlan.py b/smoketest/scripts/cli/test_interfaces_vxlan.py
index 058f13721..60a9d1966 100755
--- a/smoketest/scripts/cli/test_interfaces_vxlan.py
+++ b/smoketest/scripts/cli/test_interfaces_vxlan.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# Copyright (C) 2020-2022 VyOS maintainers and contributors
+# Copyright (C) 2020-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -26,9 +26,6 @@ from base_interfaces_test import BasicInterfaceTest
class VXLANInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_ip = True
- cls._test_ipv6 = True
- cls._test_mtu = True
cls._base_path = ['interfaces', 'vxlan']
cls._options = {
'vxlan10': ['vni 10', 'remote 127.0.0.2'],
diff --git a/smoketest/scripts/cli/test_interfaces_wireless.py b/smoketest/scripts/cli/test_interfaces_wireless.py
index a24f37d8d..85432cf04 100755
--- a/smoketest/scripts/cli/test_interfaces_wireless.py
+++ b/smoketest/scripts/cli/test_interfaces_wireless.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# Copyright (C) 2020-2021 VyOS maintainers and contributors
+# Copyright (C) 2020-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -34,7 +34,6 @@ def get_config_value(interface, key):
class WirelessInterfaceTest(BasicInterfaceTest.TestCase):
@classmethod
def setUpClass(cls):
- cls._test_ip = True
cls._base_path = ['interfaces', 'wireless']
cls._options = {
'wlan0': ['physical-device phy0', 'ssid VyOS-WIFI-0',
@@ -50,6 +49,10 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):
# call base-classes classmethod
super(WirelessInterfaceTest, cls).setUpClass()
+ # T5245 - currently testcases are disabled
+ cls._test_ipv6 = False
+ cls._test_vlan = False
+
def test_wireless_add_single_ip_address(self):
# derived method to check if member interfaces are enslaved properly
super().test_add_single_ip_address()
diff --git a/smoketest/scripts/cli/test_service_dns_dynamic.py b/smoketest/scripts/cli/test_service_dns_dynamic.py
index a3aa41f94..11d411cb4 100755
--- a/smoketest/scripts/cli/test_service_dns_dynamic.py
+++ b/smoketest/scripts/cli/test_service_dns_dynamic.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# Copyright (C) 2019-2020 VyOS maintainers and contributors
+# Copyright (C) 2019-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -17,155 +17,167 @@
import re
import os
import unittest
+import tempfile
from base_vyostest_shim import VyOSUnitTestSHIM
from vyos.configsession import ConfigSessionError
from vyos.util import cmd
-from vyos.util import process_named_running
-from vyos.util import read_file
+from vyos.util import process_running
-PROCESS_NAME = 'ddclient'
DDCLIENT_CONF = '/run/ddclient/ddclient.conf'
+DDCLIENT_PID = '/run/ddclient/ddclient.pid'
base_path = ['service', 'dns', 'dynamic']
hostname = 'test.ddns.vyos.io'
+zone = 'vyos.io'
+password = 'paSS_@4ord'
interface = 'eth0'
+
def get_config_value(key):
tmp = cmd(f'sudo cat {DDCLIENT_CONF}')
- tmp = re.findall(r'\n?{}=+(.*)'.format(key), tmp)
- tmp = tmp[0].rstrip(',')
- return tmp
+ vals = re.findall(r'\n?{}=([.-@_A-Za-z0-9]+),? \\'.format(key), tmp)
+ return vals[0] if vals else ''
+
class TestServiceDDNS(VyOSUnitTestSHIM.TestCase):
def tearDown(self):
+ # Check for running process
+ self.assertTrue(process_running(DDCLIENT_PID))
+
# Delete DDNS configuration
self.cli_delete(base_path)
self.cli_commit()
- def test_dyndns_service(self):
- from itertools import product
- ddns = ['interface', interface, 'service']
- users = [None, 'vyos_user']
- services = ['cloudflare', 'afraid', 'dyndns', 'zoneedit']
+ # PID file must no londer exist after process exited
+ self.assertFalse(os.path.exists(DDCLIENT_PID))
+
+ # IPv4 standard DDNS service configuration
+ def test_dyndns_service_standard(self):
+ ddns = ['address', interface, 'service']
+ services = {'cloudflare': {'protocol': 'cloudflare'},
+ 'freedns': {'protocol': 'freedns', 'username': 'vyos_user'},
+ 'zoneedit': {'protocol': 'zoneedit1', 'username': 'vyos_user'}}
- for user, service in product(users, services):
- password = 'vyos_pass'
- zone = 'vyos.io'
+ for svc, details in services.items():
self.cli_delete(base_path)
- self.cli_set(base_path + ddns + [service, 'host-name', hostname])
- if user is not None:
- self.cli_set(base_path + ddns + [service, 'login', user])
- self.cli_set(base_path + ddns + [service, 'password', password])
- self.cli_set(base_path + ddns + [service, 'zone', zone])
+ self.cli_set(base_path + ddns + [svc, 'host-name', hostname])
+ for opt, value in details.items():
+ self.cli_set(base_path + ddns + [svc, opt, value])
+ self.cli_set(base_path + ddns + [svc, 'password', password])
+ self.cli_set(base_path + ddns + [svc, 'zone', zone])
# commit changes
- if service == 'cloudflare':
+ if details['protocol'] == 'cloudflare':
self.cli_commit()
- elif user is None:
- # not set user is only allowed for cloudflare
- with self.assertRaises(ConfigSessionError):
- # remove zone to test not set user
- self.cli_delete(base_path + ddns + [service, 'zone', 'vyos.io'])
- self.cli_commit()
- # this case is fininshed, user not set is not allowed when service isn't cloudflare
- continue
else:
- # zone option only works on cloudflare, an exception is raised
- # for all others
+ # zone option does not work on all protocols, an exception is
+ # raised for all others
with self.assertRaises(ConfigSessionError):
self.cli_commit()
- self.cli_delete(base_path + ddns + [service, 'zone', 'vyos.io'])
+ self.cli_delete(base_path + ddns + [svc, 'zone', zone])
# commit changes again - now it should work
self.cli_commit()
- # we can only read the configuration file when we operate as 'root'
- protocol = get_config_value('protocol')
- login = None if user is None else get_config_value('login')
- pwd = get_config_value('password')
-
- # some services need special treatment
- protoname = service
- if service == 'cloudflare':
- tmp = get_config_value('zone')
- self.assertTrue(tmp == zone)
- elif service == 'afraid':
- protoname = 'freedns'
- elif service == 'dyndns':
- protoname = 'dyndns2'
- elif service == 'zoneedit':
- protoname = 'zoneedit1'
-
- self.assertTrue(protocol == protoname)
- self.assertTrue(login == user)
- self.assertTrue(pwd == "'" + password + "'")
-
- # Check for running process
- self.assertTrue(process_named_running(PROCESS_NAME))
-
- def test_dyndns_rfc2136(self):
- # Check if DDNS service can be configured and runs
- ddns = ['interface', interface, 'rfc2136', 'vyos']
- ddns_key_file = '/config/auth/my.key'
-
- self.cli_set(base_path + ddns + ['key', ddns_key_file])
- self.cli_set(base_path + ddns + ['record', 'test.ddns.vyos.io'])
- self.cli_set(base_path + ddns + ['server', 'ns1.vyos.io'])
- self.cli_set(base_path + ddns + ['ttl', '300'])
- self.cli_set(base_path + ddns + ['zone', 'vyos.io'])
+ # Check the generating config parameters
+ self.assertEqual(get_config_value('use'), 'if')
+ self.assertEqual(get_config_value('if'), interface)
+ self.assertEqual(get_config_value('password'), password)
- # ensure an exception will be raised as no key is present
- if os.path.exists(ddns_key_file):
- os.unlink(ddns_key_file)
+ for opt in details.keys():
+ if opt == 'username':
+ self.assertEqual(get_config_value('login'), details[opt])
+ else:
+ self.assertEqual(get_config_value(opt), details[opt])
- # check validate() - the key file does not exist yet
- with self.assertRaises(ConfigSessionError):
- self.cli_commit()
-
- with open(ddns_key_file, 'w') as f:
- f.write('S3cretKey')
-
- # commit changes
- self.cli_commit()
-
- # TODO: inspect generated configuration file
-
- # Check for running process
- self.assertTrue(process_named_running(PROCESS_NAME))
-
- def test_dyndns_ipv6(self):
- ddns = ['interface', interface, 'service', 'dynv6']
+ # IPv6 only DDNS service configuration
+ def test_dyndns_service_ipv6(self):
+ ddns = ['address', interface, 'service', 'dynv6']
proto = 'dyndns2'
user = 'none'
password = 'paSS_4ord'
srv = 'ddns.vyos.io'
+ ip_version = 'ipv6'
- self.cli_set(base_path + ['interface', interface, 'ipv6-enable'])
- self.cli_set(base_path + ddns + ['host-name', hostname])
- self.cli_set(base_path + ddns + ['login', user])
- self.cli_set(base_path + ddns + ['password', password])
+ self.cli_set(base_path + ddns + ['ip-version', ip_version])
self.cli_set(base_path + ddns + ['protocol', proto])
self.cli_set(base_path + ddns + ['server', srv])
+ self.cli_set(base_path + ddns + ['username', user])
+ self.cli_set(base_path + ddns + ['password', password])
+ self.cli_set(base_path + ddns + ['host-name', hostname])
# commit changes
self.cli_commit()
- # Check for running process
- self.assertTrue(process_named_running(PROCESS_NAME))
-
- protocol = get_config_value('protocol')
- login = get_config_value('login')
- pwd = get_config_value('password')
- server = get_config_value('server')
- usev6 = get_config_value('usev6')
-
- # Check some generating config parameters
- self.assertEqual(protocol, proto)
- self.assertEqual(login, user)
- self.assertEqual(pwd, f"'{password}'")
- self.assertEqual(server, srv)
- self.assertEqual(usev6, f"ifv6, if={interface}")
+ # Check the generating config parameters
+ self.assertEqual(get_config_value('usev6'), 'ifv6')
+ self.assertEqual(get_config_value('ifv6'), interface)
+ self.assertEqual(get_config_value('protocol'), proto)
+ self.assertEqual(get_config_value('server'), srv)
+ self.assertEqual(get_config_value('login'), user)
+ self.assertEqual(get_config_value('password'), password)
+
+ # IPv4+IPv6 dual DDNS service configuration
+ def test_dyndns_service_dual_stack(self):
+ ddns = ['address', interface, 'service']
+ services = {'cloudflare': {'protocol': 'cloudflare', 'zone': 'vyos.io'},
+ 'freedns': {'protocol': 'freedns', 'username': 'vyos_user'}}
+ password = 'vyos_pass'
+ ip_version = 'both'
+
+ for svc, details in services.items():
+ self.cli_delete(base_path)
+ self.cli_set(base_path + ddns + [svc, 'host-name', hostname])
+ for opt, value in details.items():
+ self.cli_set(base_path + ddns + [svc, opt, value])
+ self.cli_set(base_path + ddns + [svc, 'password', password])
+ self.cli_set(base_path + ddns + [svc, 'ip-version', ip_version])
+
+ # commit changes
+ self.cli_commit()
+
+ # Check the generating config parameters
+ self.assertEqual(get_config_value('usev4'), 'ifv4')
+ self.assertEqual(get_config_value('usev6'), 'ifv6')
+ self.assertEqual(get_config_value('ifv4'), interface)
+ self.assertEqual(get_config_value('ifv6'), interface)
+ self.assertEqual(get_config_value('password'), password)
+
+ for opt in details.keys():
+ if opt == 'username':
+ self.assertEqual(get_config_value('login'), details[opt])
+ else:
+ self.assertEqual(get_config_value(opt), details[opt])
+
+ def test_dyndns_rfc2136(self):
+ # Check if DDNS service can be configured and runs
+ ddns = ['address', interface, 'rfc2136', 'vyos']
+ srv = 'ns1.vyos.io'
+ zone = 'vyos.io'
+ ttl = '300'
+
+ with tempfile.NamedTemporaryFile(prefix='/config/auth/') as key_file:
+ key_file.write(b'S3cretKey')
+
+ self.cli_set(base_path + ddns + ['server', srv])
+ self.cli_set(base_path + ddns + ['zone', zone])
+ self.cli_set(base_path + ddns + ['key', key_file.name])
+ self.cli_set(base_path + ddns + ['ttl', ttl])
+ self.cli_set(base_path + ddns + ['host-name', hostname])
+
+ # commit changes
+ self.cli_commit()
+
+ # Check some generating config parameters
+ self.assertEqual(get_config_value('use'), 'if')
+ self.assertEqual(get_config_value('if'), interface)
+ self.assertEqual(get_config_value('protocol'), 'nsupdate')
+ self.assertEqual(get_config_value('server'), srv)
+ self.assertEqual(get_config_value('zone'), zone)
+ self.assertEqual(get_config_value('password'), key_file.name)
+ self.assertEqual(get_config_value('ttl'), ttl)
+
if __name__ == '__main__':
unittest.main(verbosity=2)
diff --git a/smoketest/scripts/cli/test_service_mdns-repeater.py b/smoketest/scripts/cli/test_service_mdns-repeater.py
index f99a98da1..880c13043 100755
--- a/smoketest/scripts/cli/test_service_mdns-repeater.py
+++ b/smoketest/scripts/cli/test_service_mdns-repeater.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
#
-# Copyright (C) 2020 VyOS maintainers and contributors
+# Copyright (C) 2020-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
@@ -18,30 +18,57 @@ import unittest
from base_vyostest_shim import VyOSUnitTestSHIM
+from configparser import ConfigParser
from vyos.util import process_named_running
base_path = ['service', 'mdns', 'repeater']
intf_base = ['interfaces', 'dummy']
+config_file = '/run/avahi-daemon/avahi-daemon.conf'
+
class TestServiceMDNSrepeater(VyOSUnitTestSHIM.TestCase):
def tearDown(self):
+ # Check for running process
+ self.assertTrue(process_named_running('avahi-daemon'))
+
self.cli_delete(base_path)
self.cli_delete(intf_base + ['dum10'])
self.cli_delete(intf_base + ['dum20'])
self.cli_commit()
+ # Check that there is no longer a running process
+ self.assertFalse(process_named_running('avahi-daemon'))
+
def test_service(self):
- # Service required a configured IP address on the interface
+ # mDNS browsing domains in addition to the default one (local)
+ domains = ['dom1.home.arpa', 'dom2.home.arpa']
+
+ # mDNS services to be repeated
+ services = ['_ipp._tcp', '_smb._tcp', '_ssh._tcp']
+ # Service required a configured IP address on the interface
self.cli_set(intf_base + ['dum10', 'address', '192.0.2.1/30'])
self.cli_set(intf_base + ['dum20', 'address', '192.0.2.5/30'])
self.cli_set(base_path + ['interface', 'dum10'])
self.cli_set(base_path + ['interface', 'dum20'])
+
+ for domain in domains:
+ self.cli_set(base_path + ['browse-domain', domain])
+
+ for service in services:
+ self.cli_set(base_path + ['allow-service', service])
+
self.cli_commit()
- # Check for running process
- self.assertTrue(process_named_running('avahi-daemon'))
+ # Validate configuration values
+ conf = ConfigParser(delimiters='=')
+ conf.read(config_file)
+
+ self.assertEqual(conf['server']['allow-interfaces'], 'dum10, dum20')
+ self.assertEqual(conf['server']['browse-domains'], ', '.join(domains))
+ self.assertEqual(conf['reflector']['enable-reflector'], 'yes')
+ self.assertEqual(conf['reflector']['reflect-filters'], ', '.join(services))
if __name__ == '__main__':
unittest.main(verbosity=2)
diff --git a/smoketest/scripts/cli/test_vpn_ipsec.py b/smoketest/scripts/cli/test_vpn_ipsec.py
index b677f0e45..acb41e410 100755
--- a/smoketest/scripts/cli/test_vpn_ipsec.py
+++ b/smoketest/scripts/cli/test_vpn_ipsec.py
@@ -41,7 +41,7 @@ vif = '100'
esp_group = 'MyESPGroup'
ike_group = 'MyIKEGroup'
secret = 'MYSECRETKEY'
-PROCESS_NAME = 'charon'
+PROCESS_NAME = 'charon-systemd'
regex_uuid4 = '[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}'
ca_pem = """