]>
git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/msdp_mesh_topo1/test_msdp_mesh_topo1.py
2 # SPDX-License-Identifier: ISC
5 # test_msdp_mesh_topo1.py
6 # Part of NetDEF Topology Tests
8 # Copyright (C) 2021 by
9 # Network Device Education Foundation, Inc. ("NetDEF")
13 test_msdp_mesh_topo1.py: Test the FRR PIM MSDP mesh groups.
18 from functools
import partial
21 # Save the Current Working Directory to find configuration files.
22 CWD
= os
.path
.dirname(os
.path
.realpath(__file__
))
23 sys
.path
.append(os
.path
.join(CWD
, "../"))
25 # pylint: disable=C0413
26 # Import topogen and topotest helpers
27 from lib
import topotest
29 # Required to instantiate the topology builder class.
30 from lib
.topogen
import Topogen
, TopoRouter
, get_topogen
31 from lib
.topolog
import logger
33 from lib
.pim
import McastTesterHelper
35 pytestmark
= [pytest
.mark
.bgpd
, pytest
.mark
.ospfd
, pytest
.mark
.pimd
]
37 app_helper
= McastTesterHelper()
44 for routern
in range(1, 4):
45 tgen
.add_router("r{}".format(routern
))
47 switch
= tgen
.add_switch("s1")
48 switch
.add_link(tgen
.gears
["r1"])
49 switch
.add_link(tgen
.gears
["r2"])
51 switch
= tgen
.add_switch("s2")
52 switch
.add_link(tgen
.gears
["r2"])
53 switch
.add_link(tgen
.gears
["r3"])
55 # Create stub networks for multicast traffic.
56 tgen
.add_host("h1", "192.168.10.2/24", "via 192.168.10.1")
57 switch
= tgen
.add_switch("s3")
58 switch
.add_link(tgen
.gears
["r1"])
59 switch
.add_link(tgen
.gears
["h1"])
61 tgen
.add_host("h2", "192.168.30.2/24", "via 192.168.30.1")
62 switch
= tgen
.add_switch("s4")
63 switch
.add_link(tgen
.gears
["r3"])
64 switch
.add_link(tgen
.gears
["h2"])
67 def setup_module(mod
):
68 "Sets up the pytest environment"
69 tgen
= Topogen(build_topo
, mod
.__name
__)
72 router_list
= tgen
.routers()
73 for rname
, router
in router_list
.items():
74 daemon_file
= "{}/{}/zebra.conf".format(CWD
, rname
)
75 if os
.path
.isfile(daemon_file
):
76 router
.load_config(TopoRouter
.RD_ZEBRA
, daemon_file
)
78 daemon_file
= "{}/{}/bgpd.conf".format(CWD
, rname
)
79 if os
.path
.isfile(daemon_file
):
80 router
.load_config(TopoRouter
.RD_BGP
, daemon_file
)
82 daemon_file
= "{}/{}/ospfd.conf".format(CWD
, rname
)
83 if os
.path
.isfile(daemon_file
):
84 router
.load_config(TopoRouter
.RD_OSPF
, daemon_file
)
86 daemon_file
= "{}/{}/pimd.conf".format(CWD
, rname
)
87 if os
.path
.isfile(daemon_file
):
88 router
.load_config(TopoRouter
.RD_PIM
, daemon_file
)
90 # Initialize all routers.
96 def test_wait_ospf_convergence():
97 "Wait for OSPF to converge"
99 if tgen
.routers_have_failure():
100 pytest
.skip(tgen
.errors
)
102 logger
.info("waiting for protocols to converge")
104 def expect_loopback_route(router
, iptype
, route
, proto
):
105 "Wait until route is present on RIB for protocol."
106 logger
.info("waiting route {} in {}".format(route
, router
))
108 topotest
.router_json_cmp
,
110 "show {} route json".format(iptype
),
111 {route
: [{"protocol": proto
}]},
113 _
, result
= topotest
.run_and_expect(test_func
, None, count
=40, wait
=1)
114 assertmsg
= '"{}" OSPF convergence failure'.format(router
)
115 assert result
is None, assertmsg
117 # Wait for R1 <-> R2 convergence.
118 expect_loopback_route("r1", "ip", "10.254.254.2/32", "ospf")
119 # Wait for R1 <-> R3 convergence.
120 expect_loopback_route("r1", "ip", "10.254.254.3/32", "ospf")
122 # Wait for R2 <-> R1 convergence.
123 expect_loopback_route("r2", "ip", "10.254.254.1/32", "ospf")
124 # Wait for R2 <-> R3 convergence.
125 expect_loopback_route("r2", "ip", "10.254.254.3/32", "ospf")
127 # Wait for R3 <-> R1 convergence.
128 expect_loopback_route("r3", "ip", "10.254.254.1/32", "ospf")
129 # Wait for R3 <-> R2 convergence.
130 expect_loopback_route("r3", "ip", "10.254.254.2/32", "ospf")
133 def test_wait_msdp_convergence():
134 "Wait for MSDP to converge"
136 if tgen
.routers_have_failure():
137 pytest
.skip(tgen
.errors
)
139 logger
.info("test MSDP convergence")
141 def expect_msdp_peer(router
, peer
, sa_count
=0):
142 "Expect MSDP peer connection to be established with SA amount."
144 "waiting MSDP connection from peer {} on router {}".format(peer
, router
)
147 topotest
.router_json_cmp
,
149 "show ip msdp peer json",
150 {peer
: {"state": "established", "saCount": sa_count
}},
152 _
, result
= topotest
.run_and_expect(test_func
, None, count
=40, wait
=2)
153 assertmsg
= '"{}" MSDP connection failure'.format(router
)
154 assert result
is None, assertmsg
156 mcastaddr
= "229.0.1.10"
157 logger
.info("Starting helper1")
158 app_helper
.run("h1", ["--send=0.7", mcastaddr
, "h1-eth0"])
160 logger
.info("Starting helper2")
161 app_helper
.run("h2", [mcastaddr
, "h2-eth0"])
164 expect_msdp_peer("r1", "10.254.254.2")
165 expect_msdp_peer("r1", "10.254.254.3")
168 expect_msdp_peer("r2", "10.254.254.1", 1)
169 expect_msdp_peer("r2", "10.254.254.3")
172 expect_msdp_peer("r3", "10.254.254.1", 1)
173 expect_msdp_peer("r3", "10.254.254.2")
176 def test_msdp_sa_configuration():
177 "Expect the multicast traffic SA to be created"
179 if tgen
.routers_have_failure():
180 pytest
.skip(tgen
.errors
)
182 logger
.info("test MSDP SA")
184 def expect_msdp_sa(router
, source
, group
, local
, rp
, spt_setup
):
186 logger
.info("waiting MSDP SA on router {}".format(router
))
188 topotest
.router_json_cmp
,
190 "show ip msdp sa json",
191 {group
: {source
: {"local": local
, "rp": rp
, "sptSetup": spt_setup
}}},
193 _
, result
= topotest
.run_and_expect(test_func
, None, count
=30, wait
=1)
194 assertmsg
= '"{}" MSDP SA failure'.format(router
)
195 assert result
is None, assertmsg
197 source
= "192.168.10.2"
202 expect_msdp_sa("r1", source
, group
, "yes", "-", "-")
205 expect_msdp_sa("r2", source
, group
, "no", rp
, "no")
208 expect_msdp_sa("r3", source
, group
, "no", rp
, "yes")
211 def teardown_module(_mod
):
212 "Teardown the pytest environment"
218 def test_memory_leak():
219 "Run the memory leak test and report results."
221 if not tgen
.is_memleak_enabled():
222 pytest
.skip("Memory leak test/report is disabled")
224 tgen
.report_memory_leaks()
227 if __name__
== "__main__":
228 args
= ["-s"] + sys
.argv
[1:]
229 sys
.exit(pytest
.main(args
))