tests: Check if kernel routes work with changed vrf

Check `show ip route` for specific kernel routes after
the interface as their nexthop changes vrf.

After moving interface's vrf, there should be no kernel
route in old vrf.

Signed-off-by: anlan_cs <vic.lan@pica8.com>
(cherry picked from commit 019ac03e5b)
This commit is contained in:
anlan_cs 2023-06-26 18:20:58 +08:00 committed by Mergify
parent dd971cbf35
commit 1841a75273
2 changed files with 62 additions and 0 deletions

View File

@ -0,0 +1,27 @@
{
"3.5.1.0/24":[
{
"prefix":"3.5.1.0/24",
"prefixLen":24,
"protocol":"kernel",
"vrfId":0,
"vrfName":"default",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"table":254,
"nexthops":[
{
"flags":3,
"fib":true,
"ip":"192.168.210.1",
"afi":"ipv4",
"interfaceName":"r1-eth0",
"active":true
}
]
}
]
}

View File

@ -77,6 +77,41 @@ def teardown_module(mod):
tgen.stop_topology() tgen.stop_topology()
def test_zebra_kernel_route_vrf():
"Test kernel routes should be removed after interface changes vrf"
logger.info("Test kernel routes should be removed after interface changes vrf")
vrf = "RED"
tgen = get_topogen()
r1 = tgen.gears["r1"]
# Add kernel routes, the interface is initially in default vrf
r1.run("ip route add 3.5.1.0/24 via 192.168.210.1 dev r1-eth0")
json_file = "{}/r1/v4_route_1_vrf_before.json".format(CWD)
expected = json.loads(open(json_file).read())
test_func = partial(
topotest.router_json_cmp, r1, "show ip route 3.5.1.0/24 json", expected
)
_, result = topotest.run_and_expect(test_func, None, count=5, wait=1)
assert result is None, '"r1" JSON output mismatches'
# Change the interface's vrf
r1.run("ip link add {} type vrf table 1".format(vrf))
r1.run("ip link set {} up".format(vrf))
r1.run("ip link set dev r1-eth0 master {}".format(vrf))
expected = "{}"
test_func = partial(
topotest.router_output_cmp, r1, "show ip route 3.5.1.0/24 json", expected
)
result, diff = topotest.run_and_expect(test_func, "", count=5, wait=1)
assertmsg = "{} should not have the kernel route.\n{}".format('"r1"', diff)
assert result, assertmsg
# Clean up
r1.run("ip link set dev r1-eth0 nomaster")
r1.run("ip link del dev {}".format(vrf))
def test_zebra_kernel_admin_distance(): def test_zebra_kernel_admin_distance():
"Test some basic kernel routes added that should be accepted" "Test some basic kernel routes added that should be accepted"
logger.info("Test some basic kernel routes that should be accepted") logger.info("Test some basic kernel routes that should be accepted")