Merge pull request #18695 from askorichenko/test-show-advertised-routes-vty

bgpd: fix vty's version of show advertised-routes
This commit is contained in:
Russ White 2025-04-22 11:09:17 -04:00 committed by GitHub
commit deb473ff1d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 136 additions and 12 deletions

View file

@ -668,8 +668,8 @@ static void show_esi_routes(struct bgp *bgp,
if (json)
json_path = json_object_new_array();
route_vty_out(vty, p, pi, 0, SAFI_EVPN, json_path,
false);
route_vty_out(vty, p, pi, 0, NULL, SAFI_EVPN,
json_path, false);
if (json)
json_object_array_add(json_paths, json_path);
@ -768,7 +768,7 @@ static void bgp_evpn_show_routes_mac_ip_es(struct vty *vty, esi_t *esi,
AFI_L2VPN, SAFI_EVPN, RPKI_NOT_BEING_USED,
json_path, NULL, 0);
else
route_vty_out(vty, &bd->rn->p, pi, 0, SAFI_EVPN,
route_vty_out(vty, &bd->rn->p, pi, 0, NULL, SAFI_EVPN,
json_path, false);
if (json)
@ -896,7 +896,7 @@ static void show_vni_routes(struct bgp *bgp, struct bgpevpn *vpn,
NULL, 0);
else
route_vty_out(vty, &tmp_p, pi, 0, SAFI_EVPN,
route_vty_out(vty, &tmp_p, pi, 0, NULL, SAFI_EVPN,
json_path, false);
if (json)
@ -1453,8 +1453,9 @@ static int bgp_show_ethernet_vpn(struct vty *vty, struct prefix_rd *prd,
else
route_vty_out(vty,
bgp_dest_get_prefix(rm),
pi, no_display, SAFI_EVPN,
json_array, false);
pi, no_display, NULL,
SAFI_EVPN, json_array,
false);
no_display = 1;
}
@ -3230,7 +3231,7 @@ static void evpn_show_all_routes(struct vty *vty, struct bgp *bgp, int type,
RPKI_NOT_BEING_USED, json_path, NULL,
0);
} else
route_vty_out(vty, p, pi, 0, SAFI_EVPN,
route_vty_out(vty, p, pi, 0, NULL, SAFI_EVPN,
json_path, false);
if (json)

View file

@ -10138,11 +10138,12 @@ static char *bgp_nexthop_hostname(struct peer *peer,
/* called from terminal list command */
void route_vty_out(struct vty *vty, const struct prefix *p,
struct bgp_path_info *path, int display, safi_t safi,
struct bgp_path_info *path, int display,
struct attr *pattr, safi_t safi,
json_object *json_paths, bool wide)
{
int len;
struct attr *attr = path->attr;
struct attr *attr = pattr ? pattr : path->attr;
json_object *json_path = NULL;
json_object *json_nexthops = NULL;
json_object *json_nexthop_global = NULL;
@ -12706,7 +12707,7 @@ static int bgp_show_table(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t sa
rpki_curr_state, json_paths, NULL,
show_flags);
} else {
route_vty_out(vty, dest_p, pi, display,
route_vty_out(vty, dest_p, pi, display, NULL,
safi, json_paths, wide);
}
}
@ -15553,7 +15554,8 @@ show_adj_route(struct vty *vty, struct peer *peer, struct bgp_table *table,
for (bpi = bgp_dest_get_bgp_path_info(dest);
bpi; bpi = bpi->next)
route_vty_out(vty, rn_p, bpi, 0,
safi, NULL, wide);
adj->attr, safi, NULL,
wide);
}
}
(*output_count)++;

View file

@ -909,7 +909,8 @@ extern struct bgp_path_info *info_make(int type, int sub_type,
struct bgp_dest *dest);
extern void route_vty_out(struct vty *vty, const struct prefix *p,
struct bgp_path_info *path, int display, safi_t safi,
struct bgp_path_info *path, int display,
struct attr *attr, safi_t safi,
json_object *json_paths, bool wide);
extern void route_vty_out_tag(struct vty *vty, const struct prefix *p,
struct bgp_path_info *path, int display,

View file

@ -0,0 +1,18 @@
!
int r1-eth0
ip address 192.168.1.1/24
!
router bgp 65001
no bgp ebgp-requires-policy
no bgp network import-check
neighbor 192.168.1.2 remote-as auto
neighbor 192.168.1.2 timers 1 3
neighbor 192.168.1.2 timers connect 1
network 10.10.10.1/32
address-family ipv4 unicast
neighbor 192.168.1.2 route-map r2 out
exit-address-family
!
route-map r2 permit 10
!

View file

@ -0,0 +1,11 @@
!
int r2-eth0
ip address 192.168.1.2/24
!
router bgp 65002
no bgp ebgp-requires-policy
neighbor 192.168.1.1 remote-as auto
neighbor 192.168.1.1 timers 1 3
neighbor 192.168.1.1 timers connect 1
!

View file

@ -0,0 +1,91 @@
#!/usr/bin/env python
# SPDX-License-Identifier: ISC
import os
import sys
import json
import pytest
import functools
pytestmark = [pytest.mark.bgpd]
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, "../"))
# pylint: disable=C0413
from lib import topotest
from lib.topogen import Topogen, get_topogen
def setup_module(mod):
topodef = {"s1": ("r1", "r2")}
tgen = Topogen(topodef, mod.__name__)
tgen.start_topology()
router_list = tgen.routers()
for _, (rname, router) in enumerate(router_list.items(), 1):
router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))
tgen.start_router()
def teardown_module(mod):
tgen = get_topogen()
tgen.stop_topology()
def test_bgp_show_advertised_routes_detail():
tgen = get_topogen()
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
r1 = tgen.gears["r1"]
def _bgp_check_metric():
output = r1.vtysh_cmd(
"show bgp ipv4 unicast neighbor 192.168.1.2 advertised-routes"
)
return [output.find("Total number of prefixes 1") == -1, output.find("777") == -1]
test_func = functools.partial(
_bgp_check_metric,
)
# Check no special metric is set for the routes
_, result = topotest.run_and_expect(test_func, [False, True], count=30, wait=1)
assert result[0] == False, "No routes"
assert result[1] == True, "Wrong metric"
# Apply metric with the route-map
r1.vtysh_cmd(
"""
configure terminal
route-map r2 permit 10
set metric 777
"""
)
# Check metric '777' is present on the route
_, result = topotest.run_and_expect(test_func, [False, False], count=30, wait=1)
assert result[0] == False, "No routes"
assert result[1] == False, "Wrong metric"
# Stop applying metric with the route-map
r1.vtysh_cmd(
"""
configure terminal
route-map r2 permit 10
no set metric 777
"""
)
# Check metric '777' is removed from the route
_, result = topotest.run_and_expect(test_func, [False, True], count=30, wait=1)
assert result[0] == False, "No routes"
assert result[1] == True, "Wrong metric"
if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))