frr/tests/topotests/lib/common_check.py
Daniel Baumann a2d156806a
Merging upstream version 10.2.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-02-05 10:17:20 +01:00

65 lines
2.1 KiB
Python

#!/usr/bin/env python
# SPDX-License-Identifier: ISC
#
# common_check.py
#
# Copyright 2024 6WIND S.A.
#
import json
from lib import topotest
def ip_check_path_selection(
router, ipaddr_str, expected, vrf_name=None, check_fib=False
):
if vrf_name:
cmdstr = f"show ip route vrf {vrf_name} {ipaddr_str} json"
else:
cmdstr = f"show ip route {ipaddr_str} json"
try:
output = json.loads(router.vtysh_cmd(cmdstr))
except:
output = {}
ret = topotest.json_cmp(output, expected)
if ret is None:
num_nh_expected = len(expected[ipaddr_str][0]["nexthops"])
num_nh_observed = len(output[ipaddr_str][0]["nexthops"])
if num_nh_expected == num_nh_observed:
if check_fib:
# special case: when fib flag is unset,
# an extra test should be done to check that the flag is really unset
for nh_output, nh_expected in zip(
output[ipaddr_str][0]["nexthops"],
expected[ipaddr_str][0]["nexthops"],
):
if (
"fib" in nh_output.keys()
and nh_output["fib"]
and ("fib" not in nh_expected.keys() or not nh_expected["fib"])
):
return "{}, prefix {} nexthop {} has the fib flag set, whereas it is not expected".format(
router.name, ipaddr_str, nh_output["ip"]
)
return ret
return "{}, prefix {} does not have the correct number of nexthops : observed {}, expected {}".format(
router.name, ipaddr_str, num_nh_observed, num_nh_expected
)
return ret
def iproute2_check_path_selection(router, ipaddr_str, expected, vrf_name=None):
if not topotest.iproute2_is_json_capable():
return None
if vrf_name:
cmdstr = f"ip -json route show vrf {vrf_name} {ipaddr_str}"
else:
cmdstr = f"ip -json route show {ipaddr_str}"
try:
output = json.loads(router.cmd(cmdstr))
except:
output = []
return topotest.json_cmp(output, expected)