Skip to content

Commit cacc6cf

Browse files
committed
topotests: add tests for MSDP eBGP integration
Add topology for testing MSDP eBGP integration. Signed-off-by: Rafael Zalamena <[email protected]>
1 parent d725ae5 commit cacc6cf

File tree

6 files changed

+347
-0
lines changed

6 files changed

+347
-0
lines changed

tests/topotests/msdp_topo4/__init__.py

Whitespace-only changes.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
ip forwarding
2+
!
3+
interface r1-eth0
4+
ip address 192.168.0.1/24
5+
ip pim
6+
!
7+
interface r1-eth1
8+
ip address 192.168.1.1/24
9+
ip pim
10+
!
11+
interface lo
12+
ip address 10.254.254.1/32
13+
ip pim
14+
ip pim use-source 10.254.254.1
15+
!
16+
router pim
17+
msdp timers 10 20 3
18+
msdp peer 10.254.254.2 source 10.254.254.1
19+
msdp peer 10.254.254.3 source 10.254.254.1
20+
rp 10.254.254.1
21+
join-prune-interval 5
22+
!
23+
router bgp 65001
24+
no bgp ebgp-requires-policy
25+
no bgp network import-check
26+
neighbor 192.168.0.2 remote-as 65002
27+
neighbor 192.168.1.2 remote-as 65003
28+
address-family ipv4 unicast
29+
redistribute connected
30+
exit-address-family
31+
!
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
ip forwarding
2+
!
3+
interface r2-eth0
4+
ip address 192.168.0.2/24
5+
ip pim
6+
!
7+
interface r2-eth1
8+
ip address 192.168.2.1/24
9+
ip pim
10+
!
11+
interface r2-eth2
12+
ip address 192.168.3.2/24
13+
ip pim
14+
!
15+
interface lo
16+
ip address 10.254.254.2/32
17+
ip pim
18+
ip pim use-source 10.254.254.2
19+
!
20+
router pim
21+
rp 10.254.254.2
22+
msdp peer 10.254.254.1 source 10.254.254.2
23+
msdp peer 10.254.254.3 source 10.254.254.2
24+
msdp peer 10.254.254.4 source 10.254.254.2
25+
join-prune-interval 5
26+
!
27+
router bgp 65002
28+
no bgp ebgp-requires-policy
29+
no bgp network import-check
30+
neighbor 192.168.0.1 remote-as 65001
31+
neighbor 192.168.2.2 remote-as 65003
32+
neighbor 192.168.3.1 remote-as 65004
33+
address-family ipv4 unicast
34+
redistribute connected
35+
exit-address-family
36+
!
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
ip forwarding
2+
!
3+
interface r3-eth0
4+
ip address 192.168.1.2/24
5+
ip pim
6+
!
7+
interface r3-eth1
8+
ip address 192.168.2.2/24
9+
ip pim
10+
!
11+
interface r3-eth2
12+
ip address 192.168.10.1/24
13+
ip pim
14+
ip igmp
15+
!
16+
interface lo
17+
ip address 10.254.254.3/32
18+
ip pim
19+
ip pim use-source 10.254.254.3
20+
!
21+
router pim
22+
msdp timers 10 20 3
23+
msdp peer 10.254.254.1 source 10.254.254.3
24+
msdp peer 10.254.254.2 source 10.254.254.3
25+
rp 10.254.254.3
26+
join-prune-interval 5
27+
!
28+
router bgp 65003
29+
no bgp ebgp-requires-policy
30+
no bgp network import-check
31+
neighbor 192.168.1.1 remote-as 65001
32+
neighbor 192.168.2.1 remote-as 65002
33+
address-family ipv4 unicast
34+
redistribute connected
35+
exit-address-family
36+
!
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
ip forwarding
2+
!
3+
debug pim zebra
4+
!
5+
bgp send-extra-data zebra
6+
!
7+
interface r4-eth0
8+
ip address 192.168.3.1/24
9+
ip pim
10+
!
11+
interface r4-eth1
12+
ip address 192.168.20.1/24
13+
ip pim
14+
!
15+
interface lo
16+
ip address 10.254.254.4/32
17+
ip pim
18+
ip pim use-source 10.254.254.4
19+
!
20+
router pim
21+
msdp log sa-events
22+
msdp timers 10 20 3
23+
msdp peer 10.254.254.2 source 10.254.254.4
24+
rp 10.254.254.4
25+
join-prune-interval 5
26+
!
27+
router bgp 65004
28+
no bgp ebgp-requires-policy
29+
no bgp network import-check
30+
neighbor 192.168.3.2 remote-as 65002
31+
address-family ipv4 unicast
32+
redistribute connected
33+
exit-address-family
34+
!
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
#!/usr/bin/env python
2+
# SPDX-License-Identifier: ISC
3+
4+
#
5+
# test_msdp_topo4.py
6+
# Part of NetDEF Topology Tests
7+
#
8+
# Copyright (c) 2024 by
9+
# Network Device Education Foundation, Inc. ("NetDEF")
10+
#
11+
12+
"""
13+
test_msdp_topo4.py: Test the FRR PIM MSDP peer.
14+
"""
15+
16+
import os
17+
import sys
18+
import json
19+
from functools import partial
20+
import re
21+
import pytest
22+
23+
# Save the Current Working Directory to find configuration files.
24+
CWD = os.path.dirname(os.path.realpath(__file__))
25+
sys.path.append(os.path.join(CWD, "../"))
26+
27+
# pylint: disable=C0413
28+
# Import topogen and topotest helpers
29+
from lib import topotest
30+
31+
# Required to instantiate the topology builder class.
32+
from lib.topogen import Topogen, TopoRouter, get_topogen
33+
from lib.topolog import logger
34+
35+
from lib.pim import McastTesterHelper
36+
37+
pytestmark = [pytest.mark.bgpd, pytest.mark.pimd]
38+
39+
app_helper = McastTesterHelper()
40+
41+
42+
def build_topo(tgen):
43+
"""
44+
r1----r2----r4
45+
| /
46+
| /
47+
| /
48+
h1----r3
49+
"""
50+
51+
# Create 4 routers
52+
for routern in range(1, 5):
53+
tgen.add_router(f"r{routern}")
54+
55+
switch = tgen.add_switch("s1")
56+
switch.add_link(tgen.gears["r1"])
57+
switch.add_link(tgen.gears["r2"])
58+
59+
switch = tgen.add_switch("s2")
60+
switch.add_link(tgen.gears["r1"])
61+
switch.add_link(tgen.gears["r3"])
62+
63+
switch = tgen.add_switch("s3")
64+
switch.add_link(tgen.gears["r2"])
65+
switch.add_link(tgen.gears["r3"])
66+
67+
switch = tgen.add_switch("s4")
68+
switch.add_link(tgen.gears["r2"])
69+
switch.add_link(tgen.gears["r4"])
70+
71+
switch = tgen.add_switch("s5")
72+
tgen.add_host("h1", "192.168.10.100/24", "via 192.168.10.1")
73+
switch.add_link(tgen.gears["r3"])
74+
switch.add_link(tgen.gears["h1"])
75+
76+
77+
def setup_module(mod):
78+
"Sets up the pytest environment"
79+
tgen = Topogen(build_topo, mod.__name__)
80+
tgen.start_topology()
81+
82+
router_list = tgen.routers()
83+
for _, router in router_list.items():
84+
file = f"{CWD}/{router.name}/frr.conf"
85+
router.load_frr_config(file)
86+
87+
# Initialize all routers.
88+
tgen.start_router()
89+
90+
app_helper.init(tgen)
91+
92+
93+
def teardown_module():
94+
"Teardown the pytest environment"
95+
tgen = get_topogen()
96+
app_helper.cleanup()
97+
tgen.stop_topology()
98+
99+
100+
def test_bgp_convergence():
101+
"Wait for BGP protocol convergence"
102+
tgen = get_topogen()
103+
if tgen.routers_have_failure():
104+
pytest.skip(tgen.errors)
105+
106+
logger.info("waiting for protocols to converge")
107+
108+
def expect_loopback_route(router, iptype, route, proto):
109+
"Wait until route is present on RIB for protocol."
110+
logger.info(f"waiting route {route} in {router}")
111+
test_func = partial(
112+
topotest.router_json_cmp,
113+
tgen.gears[router],
114+
f"show {iptype} route json",
115+
{route: [{"protocol": proto}]},
116+
)
117+
_, result = topotest.run_and_expect(test_func, None, count=130, wait=1)
118+
assertmsg = f'"{router}" convergence failure'
119+
assert result is None, assertmsg
120+
121+
# Wait for R1
122+
expect_loopback_route("r1", "ip", "10.254.254.2/32", "bgp")
123+
expect_loopback_route("r1", "ip", "10.254.254.3/32", "bgp")
124+
expect_loopback_route("r1", "ip", "10.254.254.4/32", "bgp")
125+
126+
# Wait for R2
127+
expect_loopback_route("r2", "ip", "10.254.254.1/32", "bgp")
128+
expect_loopback_route("r2", "ip", "10.254.254.3/32", "bgp")
129+
expect_loopback_route("r2", "ip", "10.254.254.4/32", "bgp")
130+
131+
# Wait for R3
132+
expect_loopback_route("r3", "ip", "10.254.254.1/32", "bgp")
133+
expect_loopback_route("r3", "ip", "10.254.254.2/32", "bgp")
134+
expect_loopback_route("r3", "ip", "10.254.254.4/32", "bgp")
135+
136+
# Wait for R4
137+
expect_loopback_route("r4", "ip", "10.254.254.1/32", "bgp")
138+
expect_loopback_route("r4", "ip", "10.254.254.2/32", "bgp")
139+
expect_loopback_route("r4", "ip", "10.254.254.3/32", "bgp")
140+
141+
142+
def test_msdp_sa_check():
143+
"""
144+
Wait for multicast route convergence.
145+
146+
First try should fail because we don't have eBGP integration enabled, so
147+
the AS65002 peer (or AS2) should fail the RPF check:
148+
149+
PIM: [MD048-BFX6W] pim_route_lookup: found nexthop 192.168.3.2 for address
150+
10.254.254.3: interface r4-eth0 ifindex=2 metric=0 pref=20
151+
PIM: [Y8C9Y-ZJ5F5] MSDP RP 10.254.254.3: nexthop changed to 192.168.3.2
152+
[AS65002] (was 0.0.0.0 [AS0])
153+
PIM: [QYDFS-NGEF9] MSDP peer 192.168.2.2 is not RPF for 10.254.254.3
154+
155+
Then we reconfigure the peer to use eBGP integration to detect shortest
156+
path to RP and it should succeed with:
157+
158+
"""
159+
160+
tgen = get_topogen()
161+
if tgen.routers_have_failure():
162+
pytest.skip(tgen.errors)
163+
164+
MCAST_ADDRESS = "229.1.2.3"
165+
app_helper.run("h1", ["--send=0.7", MCAST_ADDRESS, "h1-eth0"])
166+
167+
def test_r4_mroute_exists():
168+
r2_expect = {
169+
"229.1.2.3": {
170+
"192.168.10.100": {
171+
"rp": "10.254.254.3",
172+
"local": "no",
173+
}
174+
}
175+
}
176+
out = tgen.gears["r4"].vtysh_cmd("show ip msdp sa json", isjson=True)
177+
if out is None:
178+
return False
179+
180+
group = out.get(MCAST_ADDRESS)
181+
if group is None:
182+
return False
183+
184+
return not (group.get('192.168.10.100') is None)
185+
186+
logger.info("Waiting for R4 multicast routes")
187+
_, val = topotest.run_and_expect(test_r4_mroute_exists, True, count=40, wait=3)
188+
assert not val, "multicast route should not exist"
189+
190+
tgen.gears["r4"].vtysh_cmd("""
191+
configure terminal
192+
router pim
193+
msdp peer 10.254.254.2 source 10.254.254.4 as 65002
194+
""")
195+
_, val = topotest.run_and_expect(test_r4_mroute_exists, True, count=40, wait=3)
196+
assert val, "multicast route should exist"
197+
198+
199+
def test_memory_leak():
200+
"Run the memory leak test and report results."
201+
tgen = get_topogen()
202+
if not tgen.is_memleak_enabled():
203+
pytest.skip("Memory leak test/report is disabled")
204+
205+
tgen.report_memory_leaks()
206+
207+
208+
if __name__ == "__main__":
209+
args = ["-s"] + sys.argv[1:]
210+
sys.exit(pytest.main(args))

0 commit comments

Comments
 (0)