65 lines
2.1 KiB
Python
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)
|