]>
git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/isis_tilfa_topo1/test_isis_tilfa_topo1.py
2 # SPDX-License-Identifier: ISC
5 # test_isis_tilfa_topo1.py
6 # Part of NetDEF Topology Tests
8 # Copyright (c) 2020 by
9 # Network Device Education Foundation, Inc. ("NetDEF")
13 test_isis_tilfa_topo1.py:
25 +---------+ | +---------+
27 | RT2 |eth-sw1 | eth-sw1| RT3 |
28 | 2.2.2.2 +----------+----------+ 3.3.3.3 |
30 +---------+ +---------+
31 eth-rt4-1| |eth-rt4-2 eth-rt5-1| |eth-rt5-2
33 10.0.2.0/24| |10.0.3.0/24 10.0.4.0/24| |10.0.5.0/24
35 eth-rt2-1| |eth-rt2-2 eth-rt3-1| |eth-rt3-2
36 +---------+ +---------+
38 | RT4 | 10.0.6.0/24 | RT5 |
39 | 4.4.4.4 +---------------------+ 5.5.5.5 |
41 +---------+ +---------+
44 10.0.7.0/24| |10.0.8.0/24
48 +----------+ 6.6.6.6 +-----------+
58 from functools
import partial
60 # Save the Current Working Directory to find configuration files.
61 CWD
= os
.path
.dirname(os
.path
.realpath(__file__
))
62 sys
.path
.append(os
.path
.join(CWD
, "../"))
64 # pylint: disable=C0413
65 # Import topogen and topotest helpers
66 from lib
import topotest
67 from lib
.topogen
import Topogen
, TopoRouter
, get_topogen
68 from lib
.topolog
import logger
70 # Required to instantiate the topology builder class.
72 pytestmark
= [pytest
.mark
.isisd
]
74 # Global multi-dimensional dictionary containing all expected outputs
84 for router
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
85 tgen
.add_router(router
)
90 switch
= tgen
.add_switch("s1")
91 switch
.add_link(tgen
.gears
["rt1"], nodeif
="eth-sw1")
92 switch
.add_link(tgen
.gears
["rt2"], nodeif
="eth-sw1")
93 switch
.add_link(tgen
.gears
["rt3"], nodeif
="eth-sw1")
95 switch
= tgen
.add_switch("s2")
96 switch
.add_link(tgen
.gears
["rt2"], nodeif
="eth-rt4-1")
97 switch
.add_link(tgen
.gears
["rt4"], nodeif
="eth-rt2-1")
99 switch
= tgen
.add_switch("s3")
100 switch
.add_link(tgen
.gears
["rt2"], nodeif
="eth-rt4-2")
101 switch
.add_link(tgen
.gears
["rt4"], nodeif
="eth-rt2-2")
103 switch
= tgen
.add_switch("s4")
104 switch
.add_link(tgen
.gears
["rt3"], nodeif
="eth-rt5-1")
105 switch
.add_link(tgen
.gears
["rt5"], nodeif
="eth-rt3-1")
107 switch
= tgen
.add_switch("s5")
108 switch
.add_link(tgen
.gears
["rt3"], nodeif
="eth-rt5-2")
109 switch
.add_link(tgen
.gears
["rt5"], nodeif
="eth-rt3-2")
111 switch
= tgen
.add_switch("s6")
112 switch
.add_link(tgen
.gears
["rt4"], nodeif
="eth-rt5")
113 switch
.add_link(tgen
.gears
["rt5"], nodeif
="eth-rt4")
115 switch
= tgen
.add_switch("s7")
116 switch
.add_link(tgen
.gears
["rt4"], nodeif
="eth-rt6")
117 switch
.add_link(tgen
.gears
["rt6"], nodeif
="eth-rt4")
119 switch
= tgen
.add_switch("s8")
120 switch
.add_link(tgen
.gears
["rt5"], nodeif
="eth-rt6")
121 switch
.add_link(tgen
.gears
["rt6"], nodeif
="eth-rt5")
124 # Populate multi-dimensional dictionary containing all expected outputs
128 "show_ipv6_route.ref",
129 "show_mpls_table.ref",
130 "show_yang_interface_isis_adjacencies.ref",
132 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
134 for step
in range(1, 12 + 1):
135 outputs
[rname
][step
] = {}
138 # Get snapshots relative to the expected initial network convergence
139 filename
= "{}/{}/step{}/{}".format(CWD
, rname
, step
, file)
140 outputs
[rname
][step
][file] = open(filename
).read()
142 if file == "show_yang_interface_isis_adjacencies.ref":
145 # Get diff relative to the previous step
146 filename
= "{}/{}/step{}/{}.diff".format(CWD
, rname
, step
, file)
148 # Create temporary files in order to apply the diff
149 f_in
= tempfile
.NamedTemporaryFile(mode
="w")
150 f_in
.write(outputs
[rname
][step
- 1][file])
152 f_out
= tempfile
.NamedTemporaryFile(mode
="r")
154 "patch -s -o %s %s %s" % (f_out
.name
, f_in
.name
, filename
)
157 # Store the updated snapshot and remove the temporary files
158 outputs
[rname
][step
][file] = open(f_out
.name
).read()
163 def setup_module(mod
):
164 "Sets up the pytest environment"
165 tgen
= Topogen(build_topo
, mod
.__name
__)
166 tgen
.start_topology()
168 router_list
= tgen
.routers()
170 # For all registered routers, load the zebra configuration file
171 for rname
, router
in router_list
.items():
173 TopoRouter
.RD_ZEBRA
, os
.path
.join(CWD
, "{}/zebra.conf".format(rname
))
176 TopoRouter
.RD_ISIS
, os
.path
.join(CWD
, "{}/isisd.conf".format(rname
))
179 TopoRouter
.RD_BFD
, os
.path
.join(CWD
, "/dev/null".format(rname
))
185 def teardown_module(mod
):
186 "Teardown the pytest environment"
189 # This function tears down the whole topology.
193 def router_compare_json_output(rname
, command
, reference
, count
=120, wait
=0.5):
194 "Compare router JSON output"
196 logger
.info('Comparing router "%s" "%s" output', rname
, command
)
199 expected
= json
.loads(reference
)
201 # Run test function until we get an result. Wait at most 60 seconds.
202 test_func
= partial(topotest
.router_json_cmp
, tgen
.gears
[rname
], command
, expected
)
203 _
, diff
= topotest
.run_and_expect(test_func
, None, count
=count
, wait
=wait
)
204 assertmsg
= '"{}" JSON output mismatches the expected result'.format(rname
)
205 assert diff
is None, assertmsg
211 # Test initial network convergence
213 def test_isis_adjacencies_step1():
214 logger
.info("Test (step 1): check IS-IS adjacencies")
217 # Skip if previous fatal error condition is raised
218 if tgen
.routers_have_failure():
219 pytest
.skip(tgen
.errors
)
221 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
222 router_compare_json_output(
224 "show yang operational-data /frr-interface:lib isisd",
225 outputs
[rname
][1]["show_yang_interface_isis_adjacencies.ref"],
229 def test_rib_ipv4_step1():
230 logger
.info("Test (step 1): verify IPv4 RIB")
233 # Skip if previous fatal error condition is raised
234 if tgen
.routers_have_failure():
235 pytest
.skip(tgen
.errors
)
237 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
238 router_compare_json_output(
239 rname
, "show ip route isis json", outputs
[rname
][1]["show_ip_route.ref"]
243 def test_rib_ipv6_step1():
244 logger
.info("Test (step 1): verify IPv6 RIB")
247 # Skip if previous fatal error condition is raised
248 if tgen
.routers_have_failure():
249 pytest
.skip(tgen
.errors
)
251 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
252 router_compare_json_output(
253 rname
, "show ipv6 route isis json", outputs
[rname
][1]["show_ipv6_route.ref"]
257 def test_mpls_lib_step1():
258 logger
.info("Test (step 1): verify MPLS LIB")
261 # Skip if previous fatal error condition is raised
262 if tgen
.routers_have_failure():
263 pytest
.skip(tgen
.errors
)
265 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
266 router_compare_json_output(
267 rname
, "show mpls table json", outputs
[rname
][1]["show_mpls_table.ref"]
275 # -Disable TI-LFA link protection on rt2's eth-sw1 interface
278 # -rt2 should uninstall the backup nexthops from destinations reachable over eth-sw1.
280 def test_rib_ipv4_step2():
281 logger
.info("Test (step 2): verify IPv4 RIB")
284 # Skip if previous fatal error condition is raised
285 if tgen
.routers_have_failure():
286 pytest
.skip(tgen
.errors
)
288 logger
.info("Disabling TI-LFA link protection on rt2's eth-sw1 interface")
290 'vtysh -c "conf t" -c "interface eth-sw1" -c "no isis fast-reroute ti-lfa"'
293 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
294 router_compare_json_output(
295 rname
, "show ip route isis json", outputs
[rname
][2]["show_ip_route.ref"]
299 def test_rib_ipv6_step2():
300 logger
.info("Test (step 2): verify IPv6 RIB")
303 # Skip if previous fatal error condition is raised
304 if tgen
.routers_have_failure():
305 pytest
.skip(tgen
.errors
)
307 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
308 router_compare_json_output(
309 rname
, "show ipv6 route isis json", outputs
[rname
][2]["show_ipv6_route.ref"]
313 def test_mpls_lib_step2():
314 logger
.info("Test (step 2): verify MPLS LIB")
317 # Skip if previous fatal error condition is raised
318 if tgen
.routers_have_failure():
319 pytest
.skip(tgen
.errors
)
321 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
322 router_compare_json_output(
323 rname
, "show mpls table json", outputs
[rname
][2]["show_mpls_table.ref"]
331 # -Enable TI-LFA link protection on rt2's eth-sw1 interface
334 # -rt2 should install backup nexthops for destinations reachable over eth-sw1.
336 def test_rib_ipv4_step3():
337 logger
.info("Test (step 3): verify IPv4 RIB")
340 # Skip if previous fatal error condition is raised
341 if tgen
.routers_have_failure():
342 pytest
.skip(tgen
.errors
)
344 logger
.info("Enabling TI-LFA link protection on rt2's eth-sw1 interface")
346 'vtysh -c "conf t" -c "interface eth-sw1" -c "isis fast-reroute ti-lfa"'
349 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
350 router_compare_json_output(
351 rname
, "show ip route isis json", outputs
[rname
][3]["show_ip_route.ref"]
355 def test_rib_ipv6_step3():
356 logger
.info("Test (step 3): verify IPv6 RIB")
359 # Skip if previous fatal error condition is raised
360 if tgen
.routers_have_failure():
361 pytest
.skip(tgen
.errors
)
363 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
364 router_compare_json_output(
365 rname
, "show ipv6 route isis json", outputs
[rname
][3]["show_ipv6_route.ref"]
369 def test_mpls_lib_step3():
370 logger
.info("Test (step 3): verify MPLS LIB")
373 # Skip if previous fatal error condition is raised
374 if tgen
.routers_have_failure():
375 pytest
.skip(tgen
.errors
)
377 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
378 router_compare_json_output(
379 rname
, "show mpls table json", outputs
[rname
][3]["show_mpls_table.ref"]
390 # -rt4 should uninstall all Prefix-SIDs from the network
391 # -rt4 should uninstall all TI-LFA backup nexthops
392 # -All routers should uninstall rt4's Prefix-SIDs
393 # -All routers should uninstall all SR labels for destinations whose nexthop is rt4
394 # -All routers should uninstall all TI-LFA backup nexthops that point to rt4
395 # -All routers should uninstall all TI-LFA backup nexthops that use rt4's Prefix-SIDs
397 def test_rib_ipv4_step4():
398 logger
.info("Test (step 4): verify IPv4 RIB")
401 # Skip if previous fatal error condition is raised
402 if tgen
.routers_have_failure():
403 pytest
.skip(tgen
.errors
)
405 logger
.info("Disabling SR on rt4")
407 'vtysh -c "conf t" -c "router isis 1" -c "no segment-routing on"'
410 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
411 router_compare_json_output(
412 rname
, "show ip route isis json", outputs
[rname
][4]["show_ip_route.ref"]
416 def test_rib_ipv6_step4():
417 logger
.info("Test (step 4): verify IPv6 RIB")
420 # Skip if previous fatal error condition is raised
421 if tgen
.routers_have_failure():
422 pytest
.skip(tgen
.errors
)
424 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
425 router_compare_json_output(
426 rname
, "show ipv6 route isis json", outputs
[rname
][4]["show_ipv6_route.ref"]
430 def test_mpls_lib_step4():
431 logger
.info("Test (step 4): verify MPLS LIB")
434 # Skip if previous fatal error condition is raised
435 if tgen
.routers_have_failure():
436 pytest
.skip(tgen
.errors
)
438 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
439 router_compare_json_output(
440 rname
, "show mpls table json", outputs
[rname
][4]["show_mpls_table.ref"]
451 # -Reverse all changes done on the previous step
453 def test_rib_ipv4_step5():
454 logger
.info("Test (step 5): verify IPv4 RIB")
457 # Skip if previous fatal error condition is raised
458 if tgen
.routers_have_failure():
459 pytest
.skip(tgen
.errors
)
461 logger
.info("Enabling SR on rt4")
462 tgen
.net
["rt4"].cmd('vtysh -c "conf t" -c "router isis 1" -c "segment-routing on"')
464 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
465 router_compare_json_output(
466 rname
, "show ip route isis json", outputs
[rname
][5]["show_ip_route.ref"]
470 def test_rib_ipv6_step5():
471 logger
.info("Test (step 5): verify IPv6 RIB")
474 # Skip if previous fatal error condition is raised
475 if tgen
.routers_have_failure():
476 pytest
.skip(tgen
.errors
)
478 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
479 router_compare_json_output(
480 rname
, "show ipv6 route isis json", outputs
[rname
][5]["show_ipv6_route.ref"]
484 def test_mpls_lib_step5():
485 logger
.info("Test (step 5): verify MPLS LIB")
488 # Skip if previous fatal error condition is raised
489 if tgen
.routers_have_failure():
490 pytest
.skip(tgen
.errors
)
492 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
493 router_compare_json_output(
494 rname
, "show mpls table json", outputs
[rname
][5]["show_mpls_table.ref"]
505 # -All routers should update all SR labels for destinations whose primary or backup nexthop is rt5
507 def test_rib_ipv4_step6():
508 logger
.info("Test (step 6): verify IPv4 RIB")
511 # Skip if previous fatal error condition is raised
512 if tgen
.routers_have_failure():
513 pytest
.skip(tgen
.errors
)
515 logger
.info("Changing rt5's SRGB")
517 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing global-block 30000 37999"'
520 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
521 router_compare_json_output(
522 rname
, "show ip route isis json", outputs
[rname
][6]["show_ip_route.ref"]
526 def test_rib_ipv6_step6():
527 logger
.info("Test (step 6): verify IPv6 RIB")
530 # Skip if previous fatal error condition is raised
531 if tgen
.routers_have_failure():
532 pytest
.skip(tgen
.errors
)
534 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
535 router_compare_json_output(
536 rname
, "show ipv6 route isis json", outputs
[rname
][6]["show_ipv6_route.ref"]
540 def test_mpls_lib_step6():
541 logger
.info("Test (step 6): verify MPLS LIB")
544 # Skip if previous fatal error condition is raised
545 if tgen
.routers_have_failure():
546 pytest
.skip(tgen
.errors
)
548 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
549 router_compare_json_output(
550 rname
, "show mpls table json", outputs
[rname
][6]["show_mpls_table.ref"]
558 # -Delete rt5's Prefix-SIDs
561 # -All routers should uninstall rt5's Prefix-SIDs
562 # -All routers should uninstall all TI-LFA backup nexthops that use rt5's Prefix-SIDs
564 def test_rib_ipv4_step7():
565 logger
.info("Test (step 7): verify IPv4 RIB")
568 # Skip if previous fatal error condition is raised
569 if tgen
.routers_have_failure():
570 pytest
.skip(tgen
.errors
)
572 logger
.info("Deleting rt5's Prefix-SIDs")
574 'vtysh -c "conf t" -c "router isis 1" -c "no segment-routing prefix 5.5.5.5/32 index 50"'
577 'vtysh -c "conf t" -c "router isis 1" -c "no segment-routing prefix 2001:db8:1000::5/128 index 51"'
580 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
581 router_compare_json_output(
582 rname
, "show ip route isis json", outputs
[rname
][7]["show_ip_route.ref"]
586 def test_rib_ipv6_step7():
587 logger
.info("Test (step 7): verify IPv6 RIB")
590 # Skip if previous fatal error condition is raised
591 if tgen
.routers_have_failure():
592 pytest
.skip(tgen
.errors
)
594 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
595 router_compare_json_output(
596 rname
, "show ipv6 route isis json", outputs
[rname
][7]["show_ipv6_route.ref"]
600 def test_mpls_lib_step7():
601 logger
.info("Test (step 7): verify MPLS LIB")
604 # Skip if previous fatal error condition is raised
605 if tgen
.routers_have_failure():
606 pytest
.skip(tgen
.errors
)
608 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
609 router_compare_json_output(
610 rname
, "show mpls table json", outputs
[rname
][7]["show_mpls_table.ref"]
618 # -Re-add rt5's Prefix-SIDs
621 # -Reverse all changes done on the previous step
623 def test_rib_ipv4_step8():
624 logger
.info("Test (step 8): verify IPv4 RIB")
627 # Skip if previous fatal error condition is raised
628 if tgen
.routers_have_failure():
629 pytest
.skip(tgen
.errors
)
631 logger
.info("Re-adding rt5's Prefix-SIDs")
633 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 5.5.5.5/32 index 50"'
636 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 2001:db8:1000::5/128 index 51"'
639 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
640 router_compare_json_output(
641 rname
, "show ip route isis json", outputs
[rname
][8]["show_ip_route.ref"]
645 def test_rib_ipv6_step8():
646 logger
.info("Test (step 8): verify IPv6 RIB")
649 # Skip if previous fatal error condition is raised
650 if tgen
.routers_have_failure():
651 pytest
.skip(tgen
.errors
)
653 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
654 router_compare_json_output(
655 rname
, "show ipv6 route isis json", outputs
[rname
][8]["show_ipv6_route.ref"]
659 def test_mpls_lib_step8():
660 logger
.info("Test (step 8): verify MPLS LIB")
663 # Skip if previous fatal error condition is raised
664 if tgen
.routers_have_failure():
665 pytest
.skip(tgen
.errors
)
667 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
668 router_compare_json_output(
669 rname
, "show mpls table json", outputs
[rname
][8]["show_mpls_table.ref"]
677 # -Change rt5's Prefix-SIDs
680 # -All routers should update rt5's Prefix-SIDs
681 # -All routers should update all TI-LFA backup nexthops that use rt5's Prefix-SIDs
683 def test_rib_ipv4_step9():
684 logger
.info("Test (step 9): verify IPv4 RIB")
687 # Skip if previous fatal error condition is raised
688 if tgen
.routers_have_failure():
689 pytest
.skip(tgen
.errors
)
691 logger
.info("Re-adding rt5's Prefix-SIDs")
693 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 5.5.5.5/32 index 500"'
696 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 2001:db8:1000::5/128 index 501"'
699 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
700 router_compare_json_output(
701 rname
, "show ip route isis json", outputs
[rname
][9]["show_ip_route.ref"]
705 def test_rib_ipv6_step9():
706 logger
.info("Test (step 9): verify IPv6 RIB")
709 # Skip if previous fatal error condition is raised
710 if tgen
.routers_have_failure():
711 pytest
.skip(tgen
.errors
)
713 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
714 router_compare_json_output(
715 rname
, "show ipv6 route isis json", outputs
[rname
][9]["show_ipv6_route.ref"]
719 def test_mpls_lib_step9():
720 logger
.info("Test (step 9): verify MPLS LIB")
723 # Skip if previous fatal error condition is raised
724 if tgen
.routers_have_failure():
725 pytest
.skip(tgen
.errors
)
727 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
728 router_compare_json_output(
729 rname
, "show mpls table json", outputs
[rname
][9]["show_mpls_table.ref"]
737 # - Setting spf-delay-ietf init-delay of 15s
740 # - No routing table change
741 # - At the end of test, SPF reacts to a failure in 15s
743 def test_rib_ipv4_step10():
744 logger
.info("Test (step 10): verify IPv4 RIB")
747 # Skip if previous fatal error condition is raised
748 if tgen
.routers_have_failure():
749 pytest
.skip(tgen
.errors
)
751 logger
.info("Setting spf-delay-ietf init-delay of 15s")
753 'vtysh -c "conf t" -c "router isis 1" -c "spf-delay-ietf init-delay 15000 short-delay 0 long-delay 0 holddown 0 time-to-learn 0"'
756 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
757 router_compare_json_output(
758 rname
, "show ip route isis json", outputs
[rname
][10]["show_ip_route.ref"]
762 def test_rib_ipv6_step10():
763 logger
.info("Test (step 10): verify IPv6 RIB")
766 # Skip if previous fatal error condition is raised
767 if tgen
.routers_have_failure():
768 pytest
.skip(tgen
.errors
)
770 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
771 router_compare_json_output(
773 "show ipv6 route isis json",
774 outputs
[rname
][10]["show_ipv6_route.ref"],
778 def test_mpls_lib_step10():
779 logger
.info("Test (step 10): verify MPLS LIB")
782 # Skip if previous fatal error condition is raised
783 if tgen
.routers_have_failure():
784 pytest
.skip(tgen
.errors
)
786 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
787 router_compare_json_output(
788 rname
, "show mpls table json", outputs
[rname
][10]["show_mpls_table.ref"]
796 # - shut the eth-rt5 interface on rt6
799 # - Route switchover of routes via eth-rt5
801 def test_rt6_step11():
803 "Test (step 11): Check IPv4/6 RIB and MPLS table after a LFA switchover"
807 # Skip if previous fatal error condition is raised
808 if tgen
.routers_have_failure():
809 pytest
.skip(tgen
.errors
)
812 "Shut a rt6 interface to rt5 from the switch side and check fast-reroute"
814 tgen
.net
.cmd_raises("ip link set %s down" % tgen
.net
["s8"].intfs
[1])
817 router_compare_json_output(
819 "show ip route isis json",
820 outputs
[rname
][11]["show_ip_route.ref"],
823 router_compare_json_output(
825 "show ipv6 route isis json",
826 outputs
[rname
][11]["show_ipv6_route.ref"],
829 router_compare_json_output(
831 "show mpls table json",
832 outputs
[rname
][11]["show_mpls_table.ref"],
840 # Action(s): wait for the convergence and SPF computation on rt6
843 # - convergence of IPv4/6 RIB and MPLS table
845 def test_rib_ipv4_step12():
846 logger
.info("Test (step 12): verify IPv4 RIB")
849 # Skip if previous fatal error condition is raised
850 if tgen
.routers_have_failure():
851 pytest
.skip(tgen
.errors
)
853 logger
.info("Check SPF convergence")
854 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
855 router_compare_json_output(
857 "show ip route isis json",
858 outputs
[rname
][12]["show_ip_route.ref"],
862 def test_rib_ipv6_step12():
863 logger
.info("Test (step 12): verify IPv6 RIB")
866 # Skip if previous fatal error condition is raised
867 if tgen
.routers_have_failure():
868 pytest
.skip(tgen
.errors
)
870 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
871 router_compare_json_output(
873 "show ipv6 route isis json",
874 outputs
[rname
][12]["show_ipv6_route.ref"],
878 def test_mpls_lib_step12():
879 logger
.info("Test (step 12): verify MPLS LIB")
882 # Skip if previous fatal error condition is raised
883 if tgen
.routers_have_failure():
884 pytest
.skip(tgen
.errors
)
886 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
887 router_compare_json_output(
889 "show mpls table json",
890 outputs
[rname
][12]["show_mpls_table.ref"],
898 # - unshut the rt6 to rt5 interface
902 # - All route tables go back to previous state situation
903 # - At the end of test, next SPF is scheduled in approximatively 15s
905 def test_rib_ipv4_step13():
906 logger
.info("Test (step 13): verify IPv4 RIB")
909 # Skip if previous fatal error condition is raised
910 if tgen
.routers_have_failure():
911 pytest
.skip(tgen
.errors
)
913 logger
.info("Unsetting spf-delay-ietf init-delay of 15s")
914 tgen
.net
["rt6"].cmd('vtysh -c "conf t" -c "router isis 1" -c "no spf-delay-ietf"')
917 "Unshut the rt6 interface to rt5 from the switch side and check fast-reroute"
919 tgen
.net
.cmd_raises("ip link set %s up" % tgen
.net
["s8"].intfs
[1])
921 logger
.info("Setup BFD on rt5 and rt6")
922 for rname
in ["rt5", "rt6"]:
923 conf_file
= os
.path
.join(CWD
, "{}/bfdd.conf".format(rname
))
924 tgen
.net
[rname
].cmd("vtysh -f {}".format(conf_file
))
927 '[{"multihop":false,"peer":"10.0.8.5","interface":"eth-rt5","status":"up"}]'
929 router_compare_json_output("rt6", "show bfd peers json", expect
)
931 # Unset link detection. We want zebra to consider linkdow as operationaly up
932 # in order that BFD triggers LFA instead of the interface down
935 logger
.info("Set spf-interval to 15s")
937 'vtysh -c "conf t" -c "router isis 1" -c "spf-delay-ietf init-delay 15000 short-delay 0 long-delay 0 holddown 0 time-to-learn 0"'
940 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
941 router_compare_json_output(
942 rname
, "show ip route isis json", outputs
[rname
][10]["show_ip_route.ref"]
945 logger
.info("Set ISIS BFD")
946 tgen
.net
["rt5"].cmd('vtysh -c "conf t" -c "int eth-rt6" -c "isis bfd"')
947 tgen
.net
["rt6"].cmd('vtysh -c "conf t" -c "int eth-rt5" -c "isis bfd"')
950 def test_rib_ipv6_step13():
951 logger
.info("Test (step 13): verify IPv6 RIB")
954 # Skip if previous fatal error condition is raised
955 if tgen
.routers_have_failure():
956 pytest
.skip(tgen
.errors
)
958 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
959 router_compare_json_output(
961 "show ipv6 route isis json",
962 outputs
[rname
][10]["show_ipv6_route.ref"],
966 def test_mpls_lib_step13():
967 logger
.info("Test (step 13): verify MPLS LIB")
970 # Skip if previous fatal error condition is raised
971 if tgen
.routers_have_failure():
972 pytest
.skip(tgen
.errors
)
974 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
975 router_compare_json_output(
976 rname
, "show mpls table json", outputs
[rname
][10]["show_mpls_table.ref"]
984 # - drop traffic between rt5 and rt6 by shutting down the bridge between
985 # the routers. Interfaces on rt5 and rt6 stay up.
988 # - Route switchover of routes via eth-rt5
990 def test_rt6_step14():
991 logger
.info("Test (step 14): verify IPv4/6 RIB and MPLS table")
994 # Skip if previous fatal error condition is raised
995 if tgen
.routers_have_failure():
996 pytest
.skip(tgen
.errors
)
998 logger
.info("Drop traffic between rt5 and rt6")
999 tgen
.net
.cmd_raises("ip link set s8 down")
1004 '[{"multihop":false,"peer":"10.0.8.5","interface":"eth-rt5","status":"down"}]'
1006 router_compare_json_output(
1008 "show bfd peers json",
1014 router_compare_json_output(
1016 "show ip route isis json",
1017 outputs
[rname
][11]["show_ip_route.ref"],
1020 router_compare_json_output(
1022 "show ipv6 route isis json",
1023 outputs
[rname
][11]["show_ipv6_route.ref"],
1026 router_compare_json_output(
1028 "show mpls table json",
1029 outputs
[rname
][11]["show_mpls_table.ref"],
1037 # Action(s): wait for the convergence and SPF computation on rt6
1040 # - convergence of IPv4/6 RIB and MPLS table
1042 def test_rib_ipv4_step15():
1043 logger
.info("Test (step 15): verify IPv4 RIB")
1044 tgen
= get_topogen()
1046 # Skip if previous fatal error condition is raised
1047 if tgen
.routers_have_failure():
1048 pytest
.skip(tgen
.errors
)
1050 logger
.info("Check SPF convergence")
1051 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1052 router_compare_json_output(
1054 "show ip route isis json",
1055 outputs
[rname
][12]["show_ip_route.ref"],
1059 def test_rib_ipv6_step15():
1060 logger
.info("Test (step 15): verify IPv6 RIB")
1061 tgen
= get_topogen()
1063 # Skip if previous fatal error condition is raised
1064 if tgen
.routers_have_failure():
1065 pytest
.skip(tgen
.errors
)
1067 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1068 router_compare_json_output(
1070 "show ipv6 route isis json",
1071 outputs
[rname
][12]["show_ipv6_route.ref"],
1075 def test_mpls_lib_step15():
1076 logger
.info("Test (step 15): verify MPLS LIB")
1077 tgen
= get_topogen()
1079 # Skip if previous fatal error condition is raised
1080 if tgen
.routers_have_failure():
1081 pytest
.skip(tgen
.errors
)
1083 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1084 router_compare_json_output(
1086 "show mpls table json",
1087 outputs
[rname
][12]["show_mpls_table.ref"],
1091 # Memory leak test template
1092 def test_memory_leak():
1093 "Run the memory leak test and report results."
1094 tgen
= get_topogen()
1095 if not tgen
.is_memleak_enabled():
1096 pytest
.skip("Memory leak test/report is disabled")
1098 tgen
.report_memory_leaks()
1101 if __name__
== "__main__":
1102 args
= ["-s"] + sys
.argv
[1:]
1103 sys
.exit(pytest
.main(args
))