Skip to content

Commit 00fe1bc

Browse files
committed
tests: add test for multiple labels in BGP-LU
Announce three routes with label stacks 777/10006, 90, 11/22/33/44/55, check that `show bgp ipv6 PREFIX json` has proper labels in `remoteLabels`. Test for issue #19506 Signed-off-by: Kyrylo Yatsenko <hedrok@gmail.com>
1 parent 0e8cc82 commit 00fe1bc

File tree

5 files changed

+188
-0
lines changed

5 files changed

+188
-0
lines changed

tests/topotests/bgp_lu_multiple_labels/__init__.py

Whitespace-only changes.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
[exabgp.api]
2+
encoder = text
3+
highres = false
4+
respawn = false
5+
socket = ''
6+
7+
[exabgp.bgp]
8+
openwait = 60
9+
10+
[exabgp.cache]
11+
attributes = true
12+
nexthops = true
13+
14+
[exabgp.daemon]
15+
daemonize = true
16+
pid = '/var/run/exabgp/exabgp.pid'
17+
user = 'exabgp'
18+
##daemonize = false
19+
20+
[exabgp.log]
21+
all = false
22+
configuration = true
23+
daemon = true
24+
destination = '/var/log/exabgp.log'
25+
enable = true
26+
level = INFO
27+
message = false
28+
network = true
29+
packets = false
30+
parser = false
31+
processes = true
32+
reactor = true
33+
rib = false
34+
routes = false
35+
short = false
36+
timers = false
37+
38+
[exabgp.pdb]
39+
enable = false
40+
41+
[exabgp.profile]
42+
enable = false
43+
file = ''
44+
45+
[exabgp.reactor]
46+
speed = 1.0
47+
48+
[exabgp.tcp]
49+
acl = false
50+
bind = ''
51+
delay = 0
52+
once = false
53+
port = 179
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
neighbor fc00::1 {
2+
router-id 10.0.0.2;
3+
local-address fc00::2;
4+
local-as 65002;
5+
peer-as 65001;
6+
group-updates false;
7+
8+
family {
9+
ipv6 nlri-mpls;
10+
}
11+
12+
static {
13+
route 2001:db8:100::/64 next-hop fc00::2 label [777 10006];
14+
route 2001:db8:101::/64 next-hop fc00::2 label [90];
15+
route 2001:db8:102::/64 next-hop fc00::2 label [11 22 33 44 55];
16+
}
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
!
2+
interface r1-eth0
3+
ip address fc00::1/64
4+
!
5+
router bgp 65001
6+
bgp router-id 10.0.0.1
7+
no bgp default ipv4-unicast
8+
no bgp ebgp-requires-policy
9+
neighbor fc00::2 remote-as external
10+
neighbor fc00::2 timers 3 10
11+
neighbor fc00::2 timers connect 1
12+
address-family ipv6 unicast
13+
no neighbor fc00::2 activate
14+
exit-address-family
15+
address-family ipv6 labeled-unicast
16+
neighbor fc00::2 activate
17+
exit-address-family
18+
!
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#!/usr/bin/env python
2+
# SPDX-License-Identifier: ISC
3+
4+
#
5+
# Copyright (c) 2025 by
6+
# Kyrylo Yatsenko <hedrok@gmail.com>
7+
#
8+
9+
"""
10+
"""
11+
12+
import os
13+
import sys
14+
import json
15+
import pytest
16+
import functools
17+
18+
CWD = os.path.dirname(os.path.realpath(__file__))
19+
sys.path.append(os.path.join(CWD, "../"))
20+
21+
# pylint: disable=C0413
22+
from lib import topotest
23+
from lib.topogen import Topogen, get_topogen
24+
25+
pytestmark = [pytest.mark.bgpd]
26+
27+
28+
def build_topo(tgen):
29+
r1 = tgen.add_router("r1")
30+
peer1 = tgen.add_exabgp_peer("peer1", ip="fc00::2/64", defaultRoute="via fc00::1")
31+
32+
switch = tgen.add_switch("s1")
33+
switch.add_link(r1)
34+
switch.add_link(peer1)
35+
36+
37+
def setup_module(mod):
38+
tgen = Topogen(build_topo, mod.__name__)
39+
tgen.start_topology()
40+
41+
for _, (rname, router) in enumerate(tgen.routers().items(), 1):
42+
router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))
43+
44+
tgen.start_router()
45+
46+
peer = tgen.gears["peer1"]
47+
peer.start(os.path.join(CWD, "peer1"), os.path.join(CWD, "exabgp.env"))
48+
49+
50+
def teardown_module(mod):
51+
tgen = get_topogen()
52+
tgen.stop_topology()
53+
54+
55+
56+
def test_bgp_lu_multiple_labels():
57+
tgen = get_topogen()
58+
59+
if tgen.routers_have_failure():
60+
pytest.skip(tgen.errors)
61+
62+
r1 = tgen.gears["r1"]
63+
64+
def _bgp_converge(prefix, labels):
65+
output = json.loads(r1.vtysh_cmd(f"show bgp ipv6 {prefix} json"))
66+
expected = {
67+
"prefix": prefix,
68+
"paths": [
69+
{
70+
"valid": True,
71+
"nexthops": [{"ip": "fc00::2", "afi": "ipv6"}],
72+
"remoteLabels": labels,
73+
},
74+
],
75+
}
76+
return topotest.json_cmp(output, expected)
77+
78+
test_func = functools.partial(_bgp_converge, '2001:db8:100::/64', [777, 10006])
79+
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
80+
assert result is None, "2001:db8:100::/64 does not have expected labels"
81+
test_func = functools.partial(_bgp_converge, '2001:db8:101::/64', [90])
82+
_, result = topotest.run_and_expect(test_func, None, count=15, wait=1)
83+
assert result is None, "2001:db8:101::/64 does not have expected labels"
84+
test_func = functools.partial(_bgp_converge, '2001:db8:102::/64', [11, 22, 33, 44, 55])
85+
_, result = topotest.run_and_expect(test_func, None, count=15, wait=1)
86+
assert result is None, "2001:db8:102::/64 does not have expected labels"
87+
88+
89+
def test_memory_leak():
90+
"Run the memory leak test and report results."
91+
tgen = get_topogen()
92+
if not tgen.is_memleak_enabled():
93+
pytest.skip("Memory leak test/report is disabled")
94+
95+
tgen.report_memory_leaks()
96+
97+
98+
if __name__ == "__main__":
99+
args = ["-s"] + sys.argv[1:]
100+
sys.exit(pytest.main(args))

0 commit comments

Comments
 (0)