]>
git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/ldp_sync_ospf_topo1/test_ldp_sync_ospf_topo1.py
2 # SPDX-License-Identifier: ISC
5 # test_ldp_ospf_topo1.py
6 # Part of NetDEF Topology Tests
8 # Copyright (c) 2020 by Volta Networks
12 test_ldp_vpls_topo1.py:
14 +---------+ +---------+
18 +---------+ +---------+
19 ce1-eth0 (172.16.1.1/24)| |ce2-eth0 (172.16.1.2/24)
23 +---------+ 10.0.1.0/24 +---------+
25 | RT1 +----------------+ RT2 |
26 | 1.1.1.1 | rt2-eth1| 2.2.2.2 |
28 +---------+ +---------+
32 10.0.2.0/24| +---------+ |10.0.3.0/24
35 +--------+ 3.3.3.3 +-------+
41 ce3-eth0 (172.16.1.3/24)|
53 from functools
import partial
55 # Save the Current Working Directory to find configuration files.
56 CWD
= os
.path
.dirname(os
.path
.realpath(__file__
))
57 sys
.path
.append(os
.path
.join(CWD
, "../"))
59 # pylint: disable=C0413
60 # Import topogen and topotest helpers
61 from lib
import topotest
62 from lib
.topogen
import Topogen
, TopoRouter
, get_topogen
63 from lib
.topolog
import logger
65 # Required to instantiate the topology builder class.
67 pytestmark
= [pytest
.mark
.ldpd
, pytest
.mark
.ospfd
]
76 for router
in ["ce1", "ce2", "ce3", "r1", "r2", "r3"]:
77 tgen
.add_router(router
)
82 switch
= tgen
.add_switch("s1")
83 switch
.add_link(tgen
.gears
["ce1"])
84 switch
.add_link(tgen
.gears
["r1"])
86 switch
= tgen
.add_switch("s2")
87 switch
.add_link(tgen
.gears
["ce2"])
88 switch
.add_link(tgen
.gears
["r2"])
90 switch
= tgen
.add_switch("s3")
91 switch
.add_link(tgen
.gears
["ce3"])
92 switch
.add_link(tgen
.gears
["r3"])
94 switch
= tgen
.add_switch("s4")
95 switch
.add_link(tgen
.gears
["r1"])
96 switch
.add_link(tgen
.gears
["r2"])
98 switch
= tgen
.add_switch("s5")
99 switch
.add_link(tgen
.gears
["r1"])
100 switch
.add_link(tgen
.gears
["r3"])
102 switch
= tgen
.add_switch("s6")
103 switch
.add_link(tgen
.gears
["r2"])
104 switch
.add_link(tgen
.gears
["r3"])
107 def setup_module(mod
):
108 "Sets up the pytest environment"
109 tgen
= Topogen(build_topo
, mod
.__name
__)
110 tgen
.start_topology()
112 router_list
= tgen
.routers()
114 # For all registered routers, load the zebra configuration file
115 for rname
, router
in router_list
.items():
117 TopoRouter
.RD_ZEBRA
, os
.path
.join(CWD
, "{}/zebra.conf".format(rname
))
119 # Don't start ospfd and ldpd in the CE nodes
120 if router
.name
[0] == "r":
122 TopoRouter
.RD_OSPF
, os
.path
.join(CWD
, "{}/ospfd.conf".format(rname
))
125 TopoRouter
.RD_LDP
, os
.path
.join(CWD
, "{}/ldpd.conf".format(rname
))
131 def teardown_module(mod
):
132 "Teardown the pytest environment"
135 # This function tears down the whole topology.
139 def router_compare_json_output(rname
, command
, reference
):
140 "Compare router JSON output"
142 logger
.info('Comparing router "%s" "%s" output', rname
, command
)
145 filename
= "{}/{}/{}".format(CWD
, rname
, reference
)
146 expected
= json
.loads(open(filename
).read())
148 # Run test function until we get an result.
149 test_func
= partial(topotest
.router_json_cmp
, tgen
.gears
[rname
], command
, expected
)
150 _
, diff
= topotest
.run_and_expect(test_func
, None, count
=320, wait
=0.5)
151 assertmsg
= '"{}" JSON output mismatches the expected result'.format(rname
)
152 assert diff
is None, assertmsg
155 def test_ospf_convergence():
156 logger
.info("Test: check OSPF adjacencies")
159 # Skip if previous fatal error condition is raised
160 if tgen
.routers_have_failure():
161 pytest
.skip(tgen
.errors
)
163 for rname
in ["r1", "r2", "r3"]:
164 router_compare_json_output(
165 rname
, "show ip ospf neighbor json", "show_ip_ospf_neighbor.json"
170 logger
.info("Test: verify RIB")
173 # Skip if previous fatal error condition is raised
174 if tgen
.routers_have_failure():
175 pytest
.skip(tgen
.errors
)
177 for rname
in ["r1", "r2", "r3"]:
178 router_compare_json_output(rname
, "show ip route json", "show_ip_route.ref")
181 def test_ldp_adjacencies():
182 logger
.info("Test: verify LDP adjacencies")
185 # Skip if previous fatal error condition is raised
186 if tgen
.routers_have_failure():
187 pytest
.skip(tgen
.errors
)
189 for rname
in ["r1", "r2", "r3"]:
190 router_compare_json_output(
191 rname
, "show mpls ldp discovery json", "show_ldp_discovery.ref"
195 def test_ldp_neighbors():
196 logger
.info("Test: verify LDP neighbors")
199 # Skip if previous fatal error condition is raised
200 if tgen
.routers_have_failure():
201 pytest
.skip(tgen
.errors
)
203 for rname
in ["r1", "r2", "r3"]:
204 router_compare_json_output(
205 rname
, "show mpls ldp neighbor json", "show_ldp_neighbor.ref"
209 def test_ldp_bindings():
210 logger
.info("Test: verify LDP bindings")
213 # Skip if previous fatal error condition is raised
214 if tgen
.routers_have_failure():
215 pytest
.skip(tgen
.errors
)
217 for rname
in ["r1", "r2", "r3"]:
218 router_compare_json_output(
219 rname
, "show mpls ldp binding json", "show_ldp_binding.ref"
223 def test_ldp_pwid_bindings():
224 logger
.info("Test: verify LDP PW-ID bindings")
227 # Skip if previous fatal error condition is raised
228 if tgen
.routers_have_failure():
229 pytest
.skip(tgen
.errors
)
231 for rname
in ["r1", "r2", "r3"]:
232 router_compare_json_output(
233 rname
, "show l2vpn atom binding json", "show_l2vpn_binding.ref"
237 def test_ldp_pseudowires():
238 logger
.info("Test: verify LDP pseudowires")
241 # Skip if previous fatal error condition is raised
242 if tgen
.routers_have_failure():
243 pytest
.skip(tgen
.errors
)
245 for rname
in ["r1", "r2", "r3"]:
246 router_compare_json_output(
247 rname
, "show l2vpn atom vc json", "show_l2vpn_vc.ref"
251 def test_ldp_igp_sync():
252 logger
.info("Test: verify LDP igp-sync")
255 # Skip if previous fatal error condition is raised
256 if tgen
.routers_have_failure():
257 pytest
.skip(tgen
.errors
)
259 for rname
in ["r1", "r2", "r3"]:
260 router_compare_json_output(
261 rname
, "show mpls ldp igp-sync json", "show_ldp_igp_sync.ref"
265 def test_ospf_ldp_sync():
266 logger
.info("Test: verify OSPF igp-sync")
269 # Skip if previous fatal error condition is raised
270 if tgen
.routers_have_failure():
271 pytest
.skip(tgen
.errors
)
273 for rname
in ["r1", "r2", "r3"]:
274 router_compare_json_output(
275 rname
, "show ip ospf mpls ldp-sync json", "show_ospf_ldp_sync.ref"
278 for rname
in ["r1", "r2", "r3"]:
279 router_compare_json_output(
280 rname
, "show ip ospf interface json", "show_ip_ospf_interface.ref"
284 def test_r1_eth1_shutdown():
285 logger
.info("Test: verify behaviour after r1-eth1 is shutdown")
288 # Skip if previous fatal error condition is raised
289 if tgen
.routers_have_failure():
290 pytest
.skip(tgen
.errors
)
292 # Shut down r1-r2 link */
294 tgen
.gears
["r1"].peer_link_enable("r1-eth1", False)
295 topotest
.sleep(5, "Waiting for the network to reconverge")
297 # check if the pseudowire is still up (using an alternate path for nexthop resolution)
298 for rname
in ["r1", "r2", "r3"]:
299 router_compare_json_output(
300 rname
, "show l2vpn atom vc json", "show_l2vpn_vc.ref"
303 for rname
in ["r1", "r2", "r3"]:
304 router_compare_json_output(
306 "show mpls ldp igp-sync json",
307 "show_ldp_igp_sync_r1_eth1_shutdown.ref",
310 for rname
in ["r1", "r2", "r3"]:
311 router_compare_json_output(
313 "show ip ospf mpls ldp-sync json",
314 "show_ospf_ldp_sync_r1_eth1_shutdown.ref",
317 for rname
in ["r1", "r2", "r3"]:
318 router_compare_json_output(
320 "show ip ospf interface json",
321 "show_ip_ospf_interface_r1_eth1_shutdown.ref",
325 def test_r1_eth1_no_shutdown():
326 logger
.info("Test: verify behaviour after r1-eth1 is no shutdown")
329 # Skip if previous fatal error condition is raised
330 if tgen
.routers_have_failure():
331 pytest
.skip(tgen
.errors
)
333 # Run no shutdown on r1-eth1 interface */
335 tgen
.gears
["r1"].peer_link_enable("r1-eth1", True)
336 topotest
.sleep(5, "Waiting for the network to reconverge")
338 for rname
in ["r1", "r2", "r3"]:
339 router_compare_json_output(
340 rname
, "show mpls ldp igp-sync json", "show_ldp_igp_sync.ref"
343 for rname
in ["r1", "r2", "r3"]:
344 router_compare_json_output(
345 rname
, "show ip ospf mpls ldp-sync json", "show_ospf_ldp_sync.ref"
348 for rname
in ["r1", "r2", "r3"]:
349 router_compare_json_output(
350 rname
, "show ip ospf interface json", "show_ip_ospf_interface.ref"
354 def test_r2_eth1_shutdown():
355 logger
.info("Test: verify behaviour after r2-eth1 is shutdown")
358 # Skip if previous fatal error condition is raised
359 if tgen
.routers_have_failure():
360 pytest
.skip(tgen
.errors
)
362 # Shut down r1-r2 link */
364 tgen
.gears
["r2"].peer_link_enable("r2-eth1", False)
365 topotest
.sleep(5, "Waiting for the network to reconverge")
367 for rname
in ["r1", "r2", "r3"]:
368 router_compare_json_output(
370 "show mpls ldp igp-sync json",
371 "show_ldp_igp_sync_r1_eth1_shutdown.ref",
374 for rname
in ["r1", "r2", "r3"]:
375 router_compare_json_output(
377 "show ip ospf mpls ldp-sync json",
378 "show_ospf_ldp_sync_r2_eth1_shutdown.ref",
381 for rname
in ["r1", "r2", "r3"]:
382 router_compare_json_output(
384 "show ip ospf interface json",
385 "show_ip_ospf_interface_r2_eth1_shutdown.ref",
389 def test_r2_eth1_no_shutdown():
390 logger
.info("Test: verify behaviour after r2-eth1 is no shutdown")
393 # Skip if previous fatal error condition is raised
394 if tgen
.routers_have_failure():
395 pytest
.skip(tgen
.errors
)
397 # Run no shutdown on r2-eth1 interface */
399 tgen
.gears
["r2"].peer_link_enable("r2-eth1", True)
400 topotest
.sleep(5, "Waiting for the network to reconverge")
402 for rname
in ["r1", "r2", "r3"]:
403 router_compare_json_output(
404 rname
, "show mpls ldp igp-sync json", "show_ldp_igp_sync.ref"
407 for rname
in ["r1", "r2", "r3"]:
408 router_compare_json_output(
409 rname
, "show ip ospf mpls ldp-sync json", "show_ospf_ldp_sync.ref"
412 for rname
in ["r1", "r2", "r3"]:
413 router_compare_json_output(
414 rname
, "show ip ospf interface json", "show_ip_ospf_interface.ref"
418 # Memory leak test template
419 def test_memory_leak():
420 "Run the memory leak test and report results."
422 if not tgen
.is_memleak_enabled():
423 pytest
.skip("Memory leak test/report is disabled")
425 tgen
.report_memory_leaks()
428 if __name__
== "__main__":
429 args
= ["-s"] + sys
.argv
[1:]
430 sys
.exit(pytest
.main(args
))