summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Breunig <christian@breunig.cc>2025-11-07 17:42:23 +0100
committerGitHub <noreply@github.com>2025-11-07 17:42:23 +0100
commit25224cff345210aaecaa4db95a67bd759af666fb (patch)
treecc6e98e48ee4adcad12e32b08ead5d1bb35327be
parent71591b72493da9fa55e41e1b7c175ec95d8addf9 (diff)
parentb50808ac8245aa75bdca5b1996847125d1969dc3 (diff)
downloadvyos-1x-25224cff345210aaecaa4db95a67bd759af666fb.tar.gz
vyos-1x-25224cff345210aaecaa4db95a67bd759af666fb.zip
Merge pull request #4836 from c-po/fix-vrf-smoketest
smoketest: T7996: fix hardcoded "vrf red" search path in FRR config
-rw-r--r--smoketest/scripts/cli/base_vyostest_shim.py25
-rwxr-xr-xsmoketest/scripts/cli/test_policy.py24
-rwxr-xr-xsmoketest/scripts/cli/test_protocols_static.py17
-rwxr-xr-xsmoketest/scripts/cli/test_system_ip.py6
-rwxr-xr-xsmoketest/scripts/cli/test_system_ipv6.py2
-rwxr-xr-xsmoketest/scripts/cli/test_vrf.py27
6 files changed, 48 insertions, 53 deletions
diff --git a/smoketest/scripts/cli/base_vyostest_shim.py b/smoketest/scripts/cli/base_vyostest_shim.py
index 1dcb18d4b..08639f31b 100644
--- a/smoketest/scripts/cli/base_vyostest_shim.py
+++ b/smoketest/scripts/cli/base_vyostest_shim.py
@@ -12,12 +12,10 @@
# 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 importlib.util
import os
import paramiko
import pprint
import re
-import sys
import unittest
from time import sleep
@@ -56,17 +54,6 @@ class VyOSUnitTestSHIM:
@classmethod
def setUpClass(cls):
- # Import frr-reload.py functionality
- file_path = '/usr/lib/frr/frr-reload.py'
- module_name = 'frr_reload'
-
- spec = importlib.util.spec_from_file_location(module_name, file_path)
- module = importlib.util.module_from_spec(spec)
- sys.modules[module_name] = module
- spec.loader.exec_module(module)
- Vtysh = getattr(module, 'Vtysh')
- cls._vtysh = Vtysh(bindir='/usr/bin', confdir='/etc/frr')
-
cls._session = ConfigSession(os.getpid())
cls._session.save_config(save_config)
cls.debug = cls.debug_on()
@@ -140,17 +127,23 @@ class VyOSUnitTestSHIM:
pprint.pprint(out)
return out
- def getFRRconfig(self, start_section:str=None, stop_section='^!',
+ def getFRRconfig(self, start_section:str=None, end_marker='$', stop_section='^!',
start_subsection:str=None, stop_subsection='^ exit') -> str:
"""
Retrieve current "running configuration" from FRR
start_section: search for a specific start string in the configuration
+ end_marker: override default "line end $" marker to match on an
+ "open end" string
stop_section: end of the configuration
start_subsection: search section under the result found by string
stop_subsection: end of the subsection (usually something with "exit")
"""
- frr_config = self._vtysh.mark_show_run()
+ from vyos.utils.process import rc_cmd
+
+ rc, frr_config = rc_cmd('vtysh -c "show running-config no-header"')
+ self.assertEqual(rc, 0)
+
if not start_section:
return frr_config
@@ -158,7 +151,7 @@ class VyOSUnitTestSHIM:
in_section = False
for line in frr_config.splitlines():
if not in_section:
- if re.match(start_section, line):
+ if re.match(f'^{start_section}{end_marker}', line):
in_section = True
extracted.append(line)
else:
diff --git a/smoketest/scripts/cli/test_policy.py b/smoketest/scripts/cli/test_policy.py
index 5a700ddc1..ad3cc325b 100755
--- a/smoketest/scripts/cli/test_policy.py
+++ b/smoketest/scripts/cli/test_policy.py
@@ -123,7 +123,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
- config = self.getFRRconfig('access-list')
+ config = self.getFRRconfig('access-list', end_marker='')
for acl, acl_config in acls.items():
for rule, rule_config in acl_config['rule'].items():
tmp = f'access-list {acl} seq {rule}'
@@ -214,7 +214,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
- config = self.getFRRconfig('ipv6 access-list')
+ config = self.getFRRconfig('ipv6 access-list', end_marker='')
for acl, acl_config in acls.items():
for rule, rule_config in acl_config['rule'].items():
tmp = f'ipv6 access-list {acl} seq {rule}'
@@ -312,7 +312,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
- config = self.getFRRconfig('bgp as-path access-list')
+ config = self.getFRRconfig('bgp as-path access-list', end_marker='')
for as_path, as_path_config in test_data.items():
if 'rule' not in as_path_config:
continue
@@ -370,7 +370,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
- config = self.getFRRconfig('bgp community-list')
+ config = self.getFRRconfig('bgp community-list', end_marker='')
for comm_list, comm_list_config in test_data.items():
if 'rule' not in comm_list_config:
continue
@@ -428,7 +428,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
- config = self.getFRRconfig('bgp extcommunity-list')
+ config = self.getFRRconfig('bgp extcommunity-list', end_marker='')
for comm_list, comm_list_config in test_data.items():
if 'rule' not in comm_list_config:
continue
@@ -493,7 +493,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
- config = self.getFRRconfig('bgp large-community-list')
+ config = self.getFRRconfig('bgp large-community-list', end_marker='')
for comm_list, comm_list_config in test_data.items():
if 'rule' not in comm_list_config:
continue
@@ -571,7 +571,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
- config = self.getFRRconfig('ip prefix-list')
+ config = self.getFRRconfig('ip prefix-list', end_marker='')
for prefix_list, prefix_list_config in test_data.items():
if 'rule' not in prefix_list_config:
continue
@@ -654,7 +654,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
- config = self.getFRRconfig('ipv6 prefix-list')
+ config = self.getFRRconfig('ipv6 prefix-list', end_marker='')
for prefix_list, prefix_list_config in test_data.items():
if 'rule' not in prefix_list_config:
continue
@@ -705,7 +705,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
- config = self.getFRRconfig('ip prefix-list')
+ config = self.getFRRconfig('ip prefix-list', end_marker='')
for rule in test_range:
tmp = f'ip prefix-list {prefix_list} seq {rule} permit {prefix} le {rule}'
self.assertIn(tmp, config)
@@ -842,7 +842,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
self.assertIn(name, config)
if 'set' in rule_config:
- #Check community
+ # Check community
if 'community' in rule_config['set']:
if 'none' in rule_config['set']['community']:
tmp = f'set community none'
@@ -855,7 +855,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
values = ' '.join(rule_config['set']['community']['add'])
tmp = f'set community {values} additive'
self.assertIn(tmp, config)
- #Check large-community
+ # Check large-community
if 'large-community' in rule_config['set']:
if 'none' in rule_config['set']['large-community']:
tmp = f'set large-community none'
@@ -868,7 +868,7 @@ class TestPolicy(VyOSUnitTestSHIM.TestCase):
values = ' '.join(rule_config['set']['large-community']['add'])
tmp = f'set large-community {values} additive'
self.assertIn(tmp, config)
- #Check extcommunity
+ # Check extcommunity
if 'extcommunity' in rule_config['set']:
if 'none' in rule_config['set']['extcommunity']:
tmp = 'set extcommunity none'
diff --git a/smoketest/scripts/cli/test_protocols_static.py b/smoketest/scripts/cli/test_protocols_static.py
index 77a45e333..017618cbb 100755
--- a/smoketest/scripts/cli/test_protocols_static.py
+++ b/smoketest/scripts/cli/test_protocols_static.py
@@ -254,7 +254,7 @@ class TestProtocolsStatic(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
# Verify FRR bgpd configuration
- frrconfig = self.getFRRconfig('ip route')
+ frrconfig = self.getFRRconfig('ip route', end_marker='')
# Verify routes
for route, route_config in routes.items():
@@ -368,7 +368,7 @@ class TestProtocolsStatic(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
# Verify FRR bgpd configuration
- frrconfig = self.getFRRconfig('ip route')
+ frrconfig = self.getFRRconfig('ip route', end_marker='')
for table in tables:
# Verify routes
@@ -558,7 +558,7 @@ class TestProtocolsStatic(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
# Verify FRR configuration
- frrconfig = self.getFRRconfig('ip mroute')
+ frrconfig = self.getFRRconfig('ip mroute', end_marker='')
for route, route_config in multicast_routes.items():
if 'next_hop' in route_config:
for next_hop, next_hop_config in route_config['next_hop'].items():
@@ -712,15 +712,12 @@ class TestProtocolsStatic(VyOSUnitTestSHIM.TestCase):
self.assertIsNotNone(router, 'DHCP router should be available')
# Verify FRR configuration contains the static routes with DHCP router
- frrconfig = self.getFRRconfig('ip route')
+ frrconfig = self.getFRRconfig('ip route', end_marker='')
for route in dhcp_routes.keys():
expected_route = f'ip route {route} {router} {dhcp_interface}'
- self.assertIn(
- expected_route,
- frrconfig,
- f'Static route {route} with dhcp-interface should be in FRR config',
- )
+ self.assertIn(expected_route, frrconfig, f'Static route {route} '\
+ 'with dhcp-interface should be in FRR config')
# Test table-based routes with dhcp-interface
table_id = '100'
@@ -730,7 +727,7 @@ class TestProtocolsStatic(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
# Verify table route in FRR config
- frrconfig = self.getFRRconfig('ip route')
+ frrconfig = self.getFRRconfig('ip route', end_marker='')
expected_table_route = (
f'ip route {table_route} {router} {dhcp_interface} table {table_id}'
)
diff --git a/smoketest/scripts/cli/test_system_ip.py b/smoketest/scripts/cli/test_system_ip.py
index fadbdec47..3784d4630 100755
--- a/smoketest/scripts/cli/test_system_ip.py
+++ b/smoketest/scripts/cli/test_system_ip.py
@@ -86,14 +86,16 @@ class TestSystemIP(VyOSUnitTestSHIM.TestCase):
protocols = ['any', 'babel', 'bgp', 'connected', 'eigrp', 'isis',
'kernel', 'ospf', 'rip', 'static', 'table']
+ rule_num = '10'
+
for protocol in protocols:
- self.cli_set(['policy', 'route-map', f'route-map-{protocol}', 'rule', '10', 'action', 'permit'])
+ self.cli_set(['policy', 'route-map', f'route-map-{protocol}', 'rule', rule_num, 'action', 'permit'])
self.cli_set(base_path + ['protocol', protocol, 'route-map', f'route-map-{protocol}'])
self.cli_commit()
# Verify route-map properly applied to FRR
- frrconfig = self.getFRRconfig('ip protocol', stop_section='^end')
+ frrconfig = self.getFRRconfig('ip protocol', end_marker='', stop_section='^end')
for protocol in protocols:
self.assertIn(f'ip protocol {protocol} route-map route-map-{protocol}', frrconfig)
diff --git a/smoketest/scripts/cli/test_system_ipv6.py b/smoketest/scripts/cli/test_system_ipv6.py
index edf479fa4..0f94765bd 100755
--- a/smoketest/scripts/cli/test_system_ipv6.py
+++ b/smoketest/scripts/cli/test_system_ipv6.py
@@ -109,7 +109,7 @@ class TestSystemIPv6(VyOSUnitTestSHIM.TestCase):
self.cli_commit()
# Verify route-map properly applied to FRR
- frrconfig = self.getFRRconfig('ipv6 protocol', stop_section='^end')
+ frrconfig = self.getFRRconfig('ipv6 protocol', end_marker='', stop_section='^end')
for protocol in protocols:
# VyOS and FRR use a different name for OSPFv3 (IPv6)
if protocol == 'ospfv3':
diff --git a/smoketest/scripts/cli/test_vrf.py b/smoketest/scripts/cli/test_vrf.py
index 456295b49..f941867e1 100755
--- a/smoketest/scripts/cli/test_vrf.py
+++ b/smoketest/scripts/cli/test_vrf.py
@@ -20,7 +20,6 @@ import unittest
from json import loads
from jmespath import search
-from time import sleep
from base_vyostest_shim import VyOSUnitTestSHIM
@@ -28,6 +27,7 @@ from vyos.configsession import ConfigSessionError
from vyos.ifconfig import Interface
from vyos.ifconfig import Section
from vyos.utils.file import read_file
+from vyos.utils.misc import wait_for
from vyos.utils.network import get_interface_config
from vyos.utils.network import get_vrf_tableid
from vyos.utils.network import is_intf_addr_assigned
@@ -783,8 +783,7 @@ class VRFTest(VyOSUnitTestSHIM.TestCase):
def test_dhcp_vrf_default_route(self):
# T7927 - when retrieving a default route via DHCP, check that additional
# calls into FRRender() keep the DHCP route in place
-
- vrf_name = 'red15'
+ vrf_name = 'red-16'
default_gateway = '192.0.2.1'
dhcp_if_server = 'veth0'
dhcp_if_client = 'veth1'
@@ -816,25 +815,29 @@ class VRFTest(VyOSUnitTestSHIM.TestCase):
self.cli_set(['interfaces', 'virtual-ethernet', dhcp_if_client, 'address', 'dhcp'])
self.cli_commit()
- # We need to wait until DHCP client has started and an IP address has been received
- sleep(8)
+ # define helper for the string we are looking for in FRR configuration
+ # the leading whitespace is required as this lives under a VRF context!
+ test_ok_string = f' ip route 0.0.0.0/0 {default_gateway} {dhcp_if_client}'\
+ f' tag 210 {default_distance}'
- frrconfig = self.getFRRconfig('^vrf red', stop_section='^exit-vrf')
- self.assertIn(f' ip route 0.0.0.0/0 {default_gateway} {dhcp_if_client} '\
- f'tag 210 {default_distance}', frrconfig)
+ def test_callback(self, vrf_name, string) -> bool:
+ tmp = self.getFRRconfig(f'^vrf {vrf_name}', stop_section='^exit-vrf')
+ return bool(string in tmp)
+
+ # We need to wait until DHCP client has started and an IP address has been received
+ tmp = wait_for(test_callback, self, vrf_name, test_ok_string, timeout=20.0)
+ self.assertTrue(tmp)
# Change anything in FRR to re-trigger config generation. DHCP route
# must still be present
self.cli_set(['protocols', 'static', 'route', '10.0.0.0/24', 'blackhole'])
self.cli_commit()
- frrconfig = self.getFRRconfig('^vrf red', stop_section='^exit-vrf')
- self.assertIn(f' ip route 0.0.0.0/0 {default_gateway} {dhcp_if_client} '\
- f'tag 210 {default_distance}', frrconfig)
+ frrconfig = self.getFRRconfig(f'^vrf {vrf_name}', stop_section='^exit-vrf')
+ self.assertIn(test_ok_string, frrconfig)
self.cli_delete(['interfaces', 'virtual-ethernet'])
self.cli_delete(['service', 'dhcp-server'])
- self.cli_delete(['vrf', 'name', vrf_name])
def test_dhcpv6_single_pool(self):
# Prepare the vrf and other options