summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRuss White <russ@riw.us>2025-01-28 12:23:06 -0500
committerGitHub <noreply@github.com>2025-01-28 12:23:06 -0500
commitbd82864d03b12723d96bd2e10a2ad9b0de82f6f9 (patch)
treeaa7d4969adacf6cb04283757a79908a465e3f416 /tests
parente82788de4665b5b6a9bc8a9e5af9224d90984a50 (diff)
parent91540d2e316ecd391622752096e5099b71d91497 (diff)
Merge pull request #17941 from opensourcerouting/fix-dst-src
static: fix botched staticd YANG conversion for dst-src
Diffstat (limited to 'tests')
-rw-r--r--tests/topotests/mgmt_tests/test_yang_mgmt.py20
-rw-r--r--tests/topotests/static_simple/test_static_simple.py72
2 files changed, 61 insertions, 31 deletions
diff --git a/tests/topotests/mgmt_tests/test_yang_mgmt.py b/tests/topotests/mgmt_tests/test_yang_mgmt.py
index 52f6ba4db7..7b74eab6b7 100644
--- a/tests/topotests/mgmt_tests/test_yang_mgmt.py
+++ b/tests/topotests/mgmt_tests/test_yang_mgmt.py
@@ -181,7 +181,7 @@ def test_mgmt_commit_check(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.2/32'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/bh-type unspec",
+ "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.2/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/bh-type unspec",
"mgmt commit check",
]
}
@@ -194,7 +194,7 @@ def test_mgmt_commit_check(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.2/32'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/bh-type unspec",
+ "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.2/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/bh-type unspec",
"mgmt commit check",
]
}
@@ -245,7 +245,7 @@ def test_mgmt_commit_apply(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.20/32'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/vrf default",
+ "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.20/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/vrf default",
"mgmt commit apply",
]
}
@@ -258,7 +258,7 @@ def test_mgmt_commit_apply(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.20/32'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/vrf default",
+ "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.20/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/vrf default",
"mgmt commit apply",
]
}
@@ -298,7 +298,7 @@ def test_mgmt_commit_abort(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.3/32'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/vrf default",
+ "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.1.3/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/vrf default",
"mgmt commit abort",
]
}
@@ -350,7 +350,7 @@ def test_mgmt_delete_config(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.168.1.3/32'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/vrf default",
+ "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.168.1.3/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/vrf default",
"mgmt commit apply",
]
}
@@ -381,7 +381,7 @@ def test_mgmt_delete_config(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt delete-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.168.1.3/32'][afi-safi='frr-routing:ipv4-unicast']",
+ "mgmt delete-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.168.1.3/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']",
"mgmt commit apply",
]
}
@@ -657,7 +657,7 @@ def test_mgmt_chaos_stop_start_frr(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.11.200/32'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/bh-type unspec",
+ "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.11.200/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/bh-type unspec",
"mgmt commit apply",
]
}
@@ -689,7 +689,7 @@ def test_mgmt_chaos_stop_start_frr(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt delete-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.11.200/32'][afi-safi='frr-routing:ipv4-unicast']",
+ "mgmt delete-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.11.200/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']",
"mgmt commit apply",
]
}
@@ -733,7 +733,7 @@ def test_mgmt_chaos_kill_daemon(request):
raw_config = {
"r1": {
"raw_config": [
- "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.11.200/32'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/bh-type unspec",
+ "mgmt set-config /frr-routing:routing/control-plane-protocols/control-plane-protocol[type='frr-staticd:staticd'][name='staticd'][vrf='default']/frr-staticd:staticd/route-list[prefix='192.1.11.200/32'][src-prefix='::/0'][afi-safi='frr-routing:ipv4-unicast']/path-list[table-id='0'][distance='1']/frr-nexthops/nexthop[nh-type='blackhole'][vrf='default'][gateway=''][interface='(null)']/bh-type unspec",
"mgmt commit apply",
]
}
diff --git a/tests/topotests/static_simple/test_static_simple.py b/tests/topotests/static_simple/test_static_simple.py
index bb3580a1d8..afde58fbf7 100644
--- a/tests/topotests/static_simple/test_static_simple.py
+++ b/tests/topotests/static_simple/test_static_simple.py
@@ -61,6 +61,15 @@ def get_ip_networks(super_prefix, count):
return tuple(network.subnets(count_log2))[0:count]
+def get_src_networks(src_prefix, count, default=""):
+ if src_prefix is not None:
+ for net in get_ip_networks(src_prefix, count):
+ yield " from {}".format(net)
+ else:
+ for i in range(0, count):
+ yield default
+
+
def enable_debug(router):
router.vtysh_cmd("debug northbound callbacks configuration")
@@ -70,7 +79,7 @@ def disable_debug(router):
@retry(retry_timeout=30, initial_wait=0.1)
-def check_kernel(r1, super_prefix, count, add, is_blackhole, vrf, matchvia):
+def check_kernel(r1, super_prefix, src_prefix, count, add, is_blackhole, vrf, matchvia):
network = ipaddress.ip_network(super_prefix)
vrfstr = f" vrf {vrf}" if vrf else ""
if network.version == 6:
@@ -79,26 +88,30 @@ def check_kernel(r1, super_prefix, count, add, is_blackhole, vrf, matchvia):
kernel = r1.run(f"ip -4 route show{vrfstr}")
logger.debug("checking kernel routing table%s:\n%s", vrfstr, kernel)
- for _, net in enumerate(get_ip_networks(super_prefix, count)):
+ for net, srcnet in zip(
+ get_ip_networks(super_prefix, count), get_src_networks(src_prefix, count)
+ ):
+ netfull = str(net) + srcnet
if not add:
- assert str(net) not in kernel
+ assert netfull + " nhid" not in kernel
+ assert netfull + " via" not in kernel
continue
if is_blackhole:
- route = f"blackhole {str(net)} proto (static|196) metric 20"
+ route = f"blackhole {netfull}(?: dev lo)? proto (static|196) metric 20"
else:
route = (
- f"{str(net)}(?: nhid [0-9]+)? {matchvia} "
- "proto (static|196) metric 20"
+ f"{netfull}(?: nhid [0-9]+)? {matchvia} proto (static|196) metric 20"
)
assert re.search(route, kernel), f"Failed to find \n'{route}'\n in \n'{kernel}'"
-def do_config(
+def do_config_inner(
r1,
count,
add=True,
do_ipv6=False,
+ do_sadr=False,
via=None,
vrf=None,
use_cli=False,
@@ -109,11 +122,18 @@ def do_config(
#
# Set the route details
#
-
- if vrf:
- super_prefix = "2002::/48" if do_ipv6 else "20.0.0.0/8"
+ src_prefs = [None, None]
+ if do_ipv6 and do_sadr:
+ # intentionally using overlapping prefix
+ super_prefs = ["2001::/48", "2002::/48"]
+ src_prefs = ["2001:db8:1111::/48", "2001:db8:2222::/48"]
+ elif do_ipv6:
+ super_prefs = ["2001::/48", "2002::/48"]
else:
- super_prefix = "2001::/48" if do_ipv6 else "10.0.0.0/8"
+ super_prefs = ["10.0.0.0/8", "20.0.0.0/8"]
+
+ super_prefix = super_prefs[1 if vrf else 0]
+ src_prefix = src_prefs[1 if vrf else 0]
matchvia = ""
if via == "blackhole":
@@ -144,11 +164,13 @@ def do_config(
if vrf:
f.write("vrf {}\n".format(vrf))
- for _, net in enumerate(get_ip_networks(super_prefix, count)):
+ for net, srcnet in zip(
+ get_ip_networks(super_prefix, count), get_src_networks(src_prefix, count)
+ ):
if add:
- f.write("ip route {} {}\n".format(net, via))
+ f.write("ip route {}{} {}\n".format(net, srcnet, via))
else:
- f.write("no ip route {} {}\n".format(net, via))
+ f.write("no ip route {}{} {}\n".format(net, srcnet, via))
#
# Load config file.
@@ -165,7 +187,9 @@ def do_config(
#
# Verify the results are in the kernel
#
- check_kernel(r1, super_prefix, count, add, via == "blackhole", vrf, matchvia)
+ check_kernel(
+ r1, super_prefix, src_prefix, count, add, via == "blackhole", vrf, matchvia
+ )
optyped = "added" if add else "removed"
logger.debug(
@@ -175,6 +199,12 @@ def do_config(
)
+def do_config(*args, **kwargs):
+ do_config_inner(*args, do_ipv6=False, do_sadr=False, **kwargs)
+ do_config_inner(*args, do_ipv6=True, do_sadr=False, **kwargs)
+ do_config_inner(*args, do_ipv6=True, do_sadr=True, **kwargs)
+
+
def guts(tgen, vrf, use_cli):
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
@@ -183,20 +213,20 @@ def guts(tgen, vrf, use_cli):
count = 10
step(f"add {count} via gateway", reset=True)
- do_config(r1, count, True, False, vrf=vrf, use_cli=use_cli)
+ do_config(r1, count, True, vrf=vrf, use_cli=use_cli)
step(f"remove {count} via gateway")
- do_config(r1, count, False, False, vrf=vrf, use_cli=use_cli)
+ do_config(r1, count, False, vrf=vrf, use_cli=use_cli)
via = f"lo-{vrf}" if vrf else "lo"
step("add via loopback")
- do_config(r1, 1, True, False, via=via, vrf=vrf, use_cli=use_cli)
+ do_config(r1, 1, True, via=via, vrf=vrf, use_cli=use_cli)
step("remove via loopback")
- do_config(r1, 1, False, False, via=via, vrf=vrf, use_cli=use_cli)
+ do_config(r1, 1, False, via=via, vrf=vrf, use_cli=use_cli)
step("add via blackhole")
- do_config(r1, 1, True, False, via="blackhole", vrf=vrf, use_cli=use_cli)
+ do_config(r1, 1, True, via="blackhole", vrf=vrf, use_cli=use_cli)
step("remove via blackhole")
- do_config(r1, 1, False, False, via="blackhole", vrf=vrf, use_cli=use_cli)
+ do_config(r1, 1, False, via="blackhole", vrf=vrf, use_cli=use_cli)
def test_static_cli(tgen):