]>
git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/isis_tilfa_topo1/test_isis_tilfa_topo1.py
4 # test_isis_tilfa_topo1.py
5 # Part of NetDEF Topology Tests
7 # Copyright (c) 2020 by
8 # Network Device Education Foundation, Inc. ("NetDEF")
10 # Permission to use, copy, modify, and/or distribute this software
11 # for any purpose with or without fee is hereby granted, provided
12 # that the above copyright notice and this permission notice appear
15 # THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
16 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
18 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
19 # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
21 # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
26 test_isis_tilfa_topo1.py:
38 +---------+ | +---------+
40 | RT2 |eth-sw1 | eth-sw1| RT3 |
41 | 2.2.2.2 +----------+----------+ 3.3.3.3 |
43 +---------+ +---------+
44 eth-rt4-1| |eth-rt4-2 eth-rt5-1| |eth-rt5-2
46 10.0.2.0/24| |10.0.3.0/24 10.0.4.0/24| |10.0.5.0/24
48 eth-rt2-1| |eth-rt2-2 eth-rt3-1| |eth-rt3-2
49 +---------+ +---------+
51 | RT4 | 10.0.6.0/24 | RT5 |
52 | 4.4.4.4 +---------------------+ 5.5.5.5 |
54 +---------+ +---------+
57 10.0.7.0/24| |10.0.8.0/24
61 +----------+ 6.6.6.6 +-----------+
71 from functools
import partial
73 # Save the Current Working Directory to find configuration files.
74 CWD
= os
.path
.dirname(os
.path
.realpath(__file__
))
75 sys
.path
.append(os
.path
.join(CWD
, "../"))
77 # pylint: disable=C0413
78 # Import topogen and topotest helpers
79 from lib
import topotest
80 from lib
.topogen
import Topogen
, TopoRouter
, get_topogen
81 from lib
.topolog
import logger
83 # Required to instantiate the topology builder class.
85 pytestmark
= [pytest
.mark
.isisd
]
87 # Global multi-dimensional dictionary containing all expected outputs
97 for router
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
98 tgen
.add_router(router
)
103 switch
= tgen
.add_switch("s1")
104 switch
.add_link(tgen
.gears
["rt1"], nodeif
="eth-sw1")
105 switch
.add_link(tgen
.gears
["rt2"], nodeif
="eth-sw1")
106 switch
.add_link(tgen
.gears
["rt3"], nodeif
="eth-sw1")
108 switch
= tgen
.add_switch("s2")
109 switch
.add_link(tgen
.gears
["rt2"], nodeif
="eth-rt4-1")
110 switch
.add_link(tgen
.gears
["rt4"], nodeif
="eth-rt2-1")
112 switch
= tgen
.add_switch("s3")
113 switch
.add_link(tgen
.gears
["rt2"], nodeif
="eth-rt4-2")
114 switch
.add_link(tgen
.gears
["rt4"], nodeif
="eth-rt2-2")
116 switch
= tgen
.add_switch("s4")
117 switch
.add_link(tgen
.gears
["rt3"], nodeif
="eth-rt5-1")
118 switch
.add_link(tgen
.gears
["rt5"], nodeif
="eth-rt3-1")
120 switch
= tgen
.add_switch("s5")
121 switch
.add_link(tgen
.gears
["rt3"], nodeif
="eth-rt5-2")
122 switch
.add_link(tgen
.gears
["rt5"], nodeif
="eth-rt3-2")
124 switch
= tgen
.add_switch("s6")
125 switch
.add_link(tgen
.gears
["rt4"], nodeif
="eth-rt5")
126 switch
.add_link(tgen
.gears
["rt5"], nodeif
="eth-rt4")
128 switch
= tgen
.add_switch("s7")
129 switch
.add_link(tgen
.gears
["rt4"], nodeif
="eth-rt6")
130 switch
.add_link(tgen
.gears
["rt6"], nodeif
="eth-rt4")
132 switch
= tgen
.add_switch("s8")
133 switch
.add_link(tgen
.gears
["rt5"], nodeif
="eth-rt6")
134 switch
.add_link(tgen
.gears
["rt6"], nodeif
="eth-rt5")
137 # Populate multi-dimensional dictionary containing all expected outputs
141 "show_ipv6_route.ref",
142 "show_mpls_table.ref",
143 "show_yang_interface_isis_adjacencies.ref",
145 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
147 for step
in range(1, 12 + 1):
148 outputs
[rname
][step
] = {}
151 # Get snapshots relative to the expected initial network convergence
152 filename
= "{}/{}/step{}/{}".format(CWD
, rname
, step
, file)
153 outputs
[rname
][step
][file] = open(filename
).read()
155 if file == "show_yang_interface_isis_adjacencies.ref":
158 # Get diff relative to the previous step
159 filename
= "{}/{}/step{}/{}.diff".format(CWD
, rname
, step
, file)
161 # Create temporary files in order to apply the diff
162 f_in
= tempfile
.NamedTemporaryFile(mode
="w")
163 f_in
.write(outputs
[rname
][step
- 1][file])
165 f_out
= tempfile
.NamedTemporaryFile(mode
="r")
167 "patch -s -o %s %s %s" % (f_out
.name
, f_in
.name
, filename
)
170 # Store the updated snapshot and remove the temporary files
171 outputs
[rname
][step
][file] = open(f_out
.name
).read()
176 def setup_module(mod
):
177 "Sets up the pytest environment"
178 tgen
= Topogen(build_topo
, mod
.__name
__)
179 tgen
.start_topology()
181 router_list
= tgen
.routers()
183 # For all registered routers, load the zebra configuration file
184 for rname
, router
in router_list
.items():
186 TopoRouter
.RD_ZEBRA
, os
.path
.join(CWD
, "{}/zebra.conf".format(rname
))
189 TopoRouter
.RD_ISIS
, os
.path
.join(CWD
, "{}/isisd.conf".format(rname
))
192 TopoRouter
.RD_BFD
, os
.path
.join(CWD
, "/dev/null".format(rname
))
198 def teardown_module(mod
):
199 "Teardown the pytest environment"
202 # This function tears down the whole topology.
206 def router_compare_json_output(rname
, command
, reference
, count
=120, wait
=0.5):
207 "Compare router JSON output"
209 logger
.info('Comparing router "%s" "%s" output', rname
, command
)
212 expected
= json
.loads(reference
)
214 # Run test function until we get an result. Wait at most 60 seconds.
215 test_func
= partial(topotest
.router_json_cmp
, tgen
.gears
[rname
], command
, expected
)
216 _
, diff
= topotest
.run_and_expect(test_func
, None, count
=count
, wait
=wait
)
217 assertmsg
= '"{}" JSON output mismatches the expected result'.format(rname
)
218 assert diff
is None, assertmsg
224 # Test initial network convergence
226 def test_isis_adjacencies_step1():
227 logger
.info("Test (step 1): check IS-IS adjacencies")
230 # Skip if previous fatal error condition is raised
231 if tgen
.routers_have_failure():
232 pytest
.skip(tgen
.errors
)
234 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
235 router_compare_json_output(
237 "show yang operational-data /frr-interface:lib isisd",
238 outputs
[rname
][1]["show_yang_interface_isis_adjacencies.ref"],
242 def test_rib_ipv4_step1():
243 logger
.info("Test (step 1): verify IPv4 RIB")
246 # Skip if previous fatal error condition is raised
247 if tgen
.routers_have_failure():
248 pytest
.skip(tgen
.errors
)
250 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
251 router_compare_json_output(
252 rname
, "show ip route isis json", outputs
[rname
][1]["show_ip_route.ref"]
256 def test_rib_ipv6_step1():
257 logger
.info("Test (step 1): verify IPv6 RIB")
260 # Skip if previous fatal error condition is raised
261 if tgen
.routers_have_failure():
262 pytest
.skip(tgen
.errors
)
264 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
265 router_compare_json_output(
266 rname
, "show ipv6 route isis json", outputs
[rname
][1]["show_ipv6_route.ref"]
270 def test_mpls_lib_step1():
271 logger
.info("Test (step 1): verify MPLS LIB")
274 # Skip if previous fatal error condition is raised
275 if tgen
.routers_have_failure():
276 pytest
.skip(tgen
.errors
)
278 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
279 router_compare_json_output(
280 rname
, "show mpls table json", outputs
[rname
][1]["show_mpls_table.ref"]
288 # -Disable TI-LFA link protection on rt2's eth-sw1 interface
291 # -rt2 should uninstall the backup nexthops from destinations reachable over eth-sw1.
293 def test_rib_ipv4_step2():
294 logger
.info("Test (step 2): verify IPv4 RIB")
297 # Skip if previous fatal error condition is raised
298 if tgen
.routers_have_failure():
299 pytest
.skip(tgen
.errors
)
301 logger
.info("Disabling TI-LFA link protection on rt2's eth-sw1 interface")
303 'vtysh -c "conf t" -c "interface eth-sw1" -c "no isis fast-reroute ti-lfa"'
306 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
307 router_compare_json_output(
308 rname
, "show ip route isis json", outputs
[rname
][2]["show_ip_route.ref"]
312 def test_rib_ipv6_step2():
313 logger
.info("Test (step 2): verify IPv6 RIB")
316 # Skip if previous fatal error condition is raised
317 if tgen
.routers_have_failure():
318 pytest
.skip(tgen
.errors
)
320 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
321 router_compare_json_output(
322 rname
, "show ipv6 route isis json", outputs
[rname
][2]["show_ipv6_route.ref"]
326 def test_mpls_lib_step2():
327 logger
.info("Test (step 2): verify MPLS LIB")
330 # Skip if previous fatal error condition is raised
331 if tgen
.routers_have_failure():
332 pytest
.skip(tgen
.errors
)
334 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
335 router_compare_json_output(
336 rname
, "show mpls table json", outputs
[rname
][2]["show_mpls_table.ref"]
344 # -Enable TI-LFA link protection on rt2's eth-sw1 interface
347 # -rt2 should install backup nexthops for destinations reachable over eth-sw1.
349 def test_rib_ipv4_step3():
350 logger
.info("Test (step 3): verify IPv4 RIB")
353 # Skip if previous fatal error condition is raised
354 if tgen
.routers_have_failure():
355 pytest
.skip(tgen
.errors
)
357 logger
.info("Enabling TI-LFA link protection on rt2's eth-sw1 interface")
359 'vtysh -c "conf t" -c "interface eth-sw1" -c "isis fast-reroute ti-lfa"'
362 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
363 router_compare_json_output(
364 rname
, "show ip route isis json", outputs
[rname
][3]["show_ip_route.ref"]
368 def test_rib_ipv6_step3():
369 logger
.info("Test (step 3): verify IPv6 RIB")
372 # Skip if previous fatal error condition is raised
373 if tgen
.routers_have_failure():
374 pytest
.skip(tgen
.errors
)
376 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
377 router_compare_json_output(
378 rname
, "show ipv6 route isis json", outputs
[rname
][3]["show_ipv6_route.ref"]
382 def test_mpls_lib_step3():
383 logger
.info("Test (step 3): verify MPLS LIB")
386 # Skip if previous fatal error condition is raised
387 if tgen
.routers_have_failure():
388 pytest
.skip(tgen
.errors
)
390 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
391 router_compare_json_output(
392 rname
, "show mpls table json", outputs
[rname
][3]["show_mpls_table.ref"]
403 # -rt4 should uninstall all Prefix-SIDs from the network
404 # -rt4 should uninstall all TI-LFA backup nexthops
405 # -All routers should uninstall rt4's Prefix-SIDs
406 # -All routers should uninstall all SR labels for destinations whose nexthop is rt4
407 # -All routers should uninstall all TI-LFA backup nexthops that point to rt4
408 # -All routers should uninstall all TI-LFA backup nexthops that use rt4's Prefix-SIDs
410 def test_rib_ipv4_step4():
411 logger
.info("Test (step 4): verify IPv4 RIB")
414 # Skip if previous fatal error condition is raised
415 if tgen
.routers_have_failure():
416 pytest
.skip(tgen
.errors
)
418 logger
.info("Disabling SR on rt4")
420 'vtysh -c "conf t" -c "router isis 1" -c "no segment-routing on"'
423 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
424 router_compare_json_output(
425 rname
, "show ip route isis json", outputs
[rname
][4]["show_ip_route.ref"]
429 def test_rib_ipv6_step4():
430 logger
.info("Test (step 4): verify IPv6 RIB")
433 # Skip if previous fatal error condition is raised
434 if tgen
.routers_have_failure():
435 pytest
.skip(tgen
.errors
)
437 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
438 router_compare_json_output(
439 rname
, "show ipv6 route isis json", outputs
[rname
][4]["show_ipv6_route.ref"]
443 def test_mpls_lib_step4():
444 logger
.info("Test (step 4): verify MPLS LIB")
447 # Skip if previous fatal error condition is raised
448 if tgen
.routers_have_failure():
449 pytest
.skip(tgen
.errors
)
451 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
452 router_compare_json_output(
453 rname
, "show mpls table json", outputs
[rname
][4]["show_mpls_table.ref"]
464 # -Reverse all changes done on the previous step
466 def test_rib_ipv4_step5():
467 logger
.info("Test (step 5): verify IPv4 RIB")
470 # Skip if previous fatal error condition is raised
471 if tgen
.routers_have_failure():
472 pytest
.skip(tgen
.errors
)
474 logger
.info("Enabling SR on rt4")
475 tgen
.net
["rt4"].cmd('vtysh -c "conf t" -c "router isis 1" -c "segment-routing on"')
477 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
478 router_compare_json_output(
479 rname
, "show ip route isis json", outputs
[rname
][5]["show_ip_route.ref"]
483 def test_rib_ipv6_step5():
484 logger
.info("Test (step 5): verify IPv6 RIB")
487 # Skip if previous fatal error condition is raised
488 if tgen
.routers_have_failure():
489 pytest
.skip(tgen
.errors
)
491 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
492 router_compare_json_output(
493 rname
, "show ipv6 route isis json", outputs
[rname
][5]["show_ipv6_route.ref"]
497 def test_mpls_lib_step5():
498 logger
.info("Test (step 5): verify MPLS LIB")
501 # Skip if previous fatal error condition is raised
502 if tgen
.routers_have_failure():
503 pytest
.skip(tgen
.errors
)
505 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
506 router_compare_json_output(
507 rname
, "show mpls table json", outputs
[rname
][5]["show_mpls_table.ref"]
518 # -All routers should update all SR labels for destinations whose primary or backup nexthop is rt5
520 def test_rib_ipv4_step6():
521 logger
.info("Test (step 6): verify IPv4 RIB")
524 # Skip if previous fatal error condition is raised
525 if tgen
.routers_have_failure():
526 pytest
.skip(tgen
.errors
)
528 logger
.info("Changing rt5's SRGB")
530 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing global-block 30000 37999"'
533 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
534 router_compare_json_output(
535 rname
, "show ip route isis json", outputs
[rname
][6]["show_ip_route.ref"]
539 def test_rib_ipv6_step6():
540 logger
.info("Test (step 6): verify IPv6 RIB")
543 # Skip if previous fatal error condition is raised
544 if tgen
.routers_have_failure():
545 pytest
.skip(tgen
.errors
)
547 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
548 router_compare_json_output(
549 rname
, "show ipv6 route isis json", outputs
[rname
][6]["show_ipv6_route.ref"]
553 def test_mpls_lib_step6():
554 logger
.info("Test (step 6): verify MPLS LIB")
557 # Skip if previous fatal error condition is raised
558 if tgen
.routers_have_failure():
559 pytest
.skip(tgen
.errors
)
561 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
562 router_compare_json_output(
563 rname
, "show mpls table json", outputs
[rname
][6]["show_mpls_table.ref"]
571 # -Delete rt5's Prefix-SIDs
574 # -All routers should uninstall rt5's Prefix-SIDs
575 # -All routers should uninstall all TI-LFA backup nexthops that use rt5's Prefix-SIDs
577 def test_rib_ipv4_step7():
578 logger
.info("Test (step 7): verify IPv4 RIB")
581 # Skip if previous fatal error condition is raised
582 if tgen
.routers_have_failure():
583 pytest
.skip(tgen
.errors
)
585 logger
.info("Deleting rt5's Prefix-SIDs")
587 'vtysh -c "conf t" -c "router isis 1" -c "no segment-routing prefix 5.5.5.5/32 index 50"'
590 'vtysh -c "conf t" -c "router isis 1" -c "no segment-routing prefix 2001:db8:1000::5/128 index 51"'
593 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
594 router_compare_json_output(
595 rname
, "show ip route isis json", outputs
[rname
][7]["show_ip_route.ref"]
599 def test_rib_ipv6_step7():
600 logger
.info("Test (step 7): verify IPv6 RIB")
603 # Skip if previous fatal error condition is raised
604 if tgen
.routers_have_failure():
605 pytest
.skip(tgen
.errors
)
607 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
608 router_compare_json_output(
609 rname
, "show ipv6 route isis json", outputs
[rname
][7]["show_ipv6_route.ref"]
613 def test_mpls_lib_step7():
614 logger
.info("Test (step 7): verify MPLS LIB")
617 # Skip if previous fatal error condition is raised
618 if tgen
.routers_have_failure():
619 pytest
.skip(tgen
.errors
)
621 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
622 router_compare_json_output(
623 rname
, "show mpls table json", outputs
[rname
][7]["show_mpls_table.ref"]
631 # -Re-add rt5's Prefix-SIDs
634 # -Reverse all changes done on the previous step
636 def test_rib_ipv4_step8():
637 logger
.info("Test (step 8): verify IPv4 RIB")
640 # Skip if previous fatal error condition is raised
641 if tgen
.routers_have_failure():
642 pytest
.skip(tgen
.errors
)
644 logger
.info("Re-adding rt5's Prefix-SIDs")
646 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 5.5.5.5/32 index 50"'
649 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 2001:db8:1000::5/128 index 51"'
652 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
653 router_compare_json_output(
654 rname
, "show ip route isis json", outputs
[rname
][8]["show_ip_route.ref"]
658 def test_rib_ipv6_step8():
659 logger
.info("Test (step 8): verify IPv6 RIB")
662 # Skip if previous fatal error condition is raised
663 if tgen
.routers_have_failure():
664 pytest
.skip(tgen
.errors
)
666 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
667 router_compare_json_output(
668 rname
, "show ipv6 route isis json", outputs
[rname
][8]["show_ipv6_route.ref"]
672 def test_mpls_lib_step8():
673 logger
.info("Test (step 8): verify MPLS LIB")
676 # Skip if previous fatal error condition is raised
677 if tgen
.routers_have_failure():
678 pytest
.skip(tgen
.errors
)
680 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
681 router_compare_json_output(
682 rname
, "show mpls table json", outputs
[rname
][8]["show_mpls_table.ref"]
690 # -Change rt5's Prefix-SIDs
693 # -All routers should update rt5's Prefix-SIDs
694 # -All routers should update all TI-LFA backup nexthops that use rt5's Prefix-SIDs
696 def test_rib_ipv4_step9():
697 logger
.info("Test (step 9): verify IPv4 RIB")
700 # Skip if previous fatal error condition is raised
701 if tgen
.routers_have_failure():
702 pytest
.skip(tgen
.errors
)
704 logger
.info("Re-adding rt5's Prefix-SIDs")
706 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 5.5.5.5/32 index 500"'
709 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 2001:db8:1000::5/128 index 501"'
712 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
713 router_compare_json_output(
714 rname
, "show ip route isis json", outputs
[rname
][9]["show_ip_route.ref"]
718 def test_rib_ipv6_step9():
719 logger
.info("Test (step 9): verify IPv6 RIB")
722 # Skip if previous fatal error condition is raised
723 if tgen
.routers_have_failure():
724 pytest
.skip(tgen
.errors
)
726 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
727 router_compare_json_output(
728 rname
, "show ipv6 route isis json", outputs
[rname
][9]["show_ipv6_route.ref"]
732 def test_mpls_lib_step9():
733 logger
.info("Test (step 9): verify MPLS LIB")
736 # Skip if previous fatal error condition is raised
737 if tgen
.routers_have_failure():
738 pytest
.skip(tgen
.errors
)
740 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
741 router_compare_json_output(
742 rname
, "show mpls table json", outputs
[rname
][9]["show_mpls_table.ref"]
750 # - Setting spf-delay-ietf init-delay of 15s
753 # - No routing table change
754 # - At the end of test, SPF reacts to a failure in 15s
756 def test_rib_ipv4_step10():
757 logger
.info("Test (step 10): verify IPv4 RIB")
760 # Skip if previous fatal error condition is raised
761 if tgen
.routers_have_failure():
762 pytest
.skip(tgen
.errors
)
764 logger
.info("Setting spf-delay-ietf init-delay of 15s")
766 '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"'
769 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
770 router_compare_json_output(
771 rname
, "show ip route isis json", outputs
[rname
][10]["show_ip_route.ref"]
775 def test_rib_ipv6_step10():
776 logger
.info("Test (step 10): verify IPv6 RIB")
779 # Skip if previous fatal error condition is raised
780 if tgen
.routers_have_failure():
781 pytest
.skip(tgen
.errors
)
783 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
784 router_compare_json_output(
786 "show ipv6 route isis json",
787 outputs
[rname
][10]["show_ipv6_route.ref"],
791 def test_mpls_lib_step10():
792 logger
.info("Test (step 10): verify MPLS LIB")
795 # Skip if previous fatal error condition is raised
796 if tgen
.routers_have_failure():
797 pytest
.skip(tgen
.errors
)
799 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
800 router_compare_json_output(
801 rname
, "show mpls table json", outputs
[rname
][10]["show_mpls_table.ref"]
809 # - shut the eth-rt5 interface on rt6
812 # - Route switchover of routes via eth-rt5
814 def test_rt6_step11():
816 "Test (step 11): Check IPv4/6 RIB and MPLS table after a LFA switchover"
820 # Skip if previous fatal error condition is raised
821 if tgen
.routers_have_failure():
822 pytest
.skip(tgen
.errors
)
825 "Shut a rt6 interface to rt5 from the switch side and check fast-reroute"
827 tgen
.net
.cmd_raises("ip link set %s down" % tgen
.net
["s8"].intfs
[1])
830 router_compare_json_output(
832 "show ip route isis json",
833 outputs
[rname
][11]["show_ip_route.ref"],
836 router_compare_json_output(
838 "show ipv6 route isis json",
839 outputs
[rname
][11]["show_ipv6_route.ref"],
842 router_compare_json_output(
844 "show mpls table json",
845 outputs
[rname
][11]["show_mpls_table.ref"],
853 # Action(s): wait for the convergence and SPF computation on rt6
856 # - convergence of IPv4/6 RIB and MPLS table
858 def test_rib_ipv4_step12():
859 logger
.info("Test (step 12): verify IPv4 RIB")
862 # Skip if previous fatal error condition is raised
863 if tgen
.routers_have_failure():
864 pytest
.skip(tgen
.errors
)
866 logger
.info("Check SPF convergence")
867 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
868 router_compare_json_output(
870 "show ip route isis json",
871 outputs
[rname
][12]["show_ip_route.ref"],
875 def test_rib_ipv6_step12():
876 logger
.info("Test (step 12): verify IPv6 RIB")
879 # Skip if previous fatal error condition is raised
880 if tgen
.routers_have_failure():
881 pytest
.skip(tgen
.errors
)
883 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
884 router_compare_json_output(
886 "show ipv6 route isis json",
887 outputs
[rname
][12]["show_ipv6_route.ref"],
891 def test_mpls_lib_step12():
892 logger
.info("Test (step 12): verify MPLS LIB")
895 # Skip if previous fatal error condition is raised
896 if tgen
.routers_have_failure():
897 pytest
.skip(tgen
.errors
)
899 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
900 router_compare_json_output(
902 "show mpls table json",
903 outputs
[rname
][12]["show_mpls_table.ref"],
911 # - unshut the rt6 to rt5 interface
915 # - All route tables go back to previous state situation
916 # - At the end of test, next SPF is scheduled in approximatively 15s
918 def test_rib_ipv4_step13():
919 logger
.info("Test (step 13): verify IPv4 RIB")
922 # Skip if previous fatal error condition is raised
923 if tgen
.routers_have_failure():
924 pytest
.skip(tgen
.errors
)
926 logger
.info("Unsetting spf-delay-ietf init-delay of 15s")
927 tgen
.net
["rt6"].cmd('vtysh -c "conf t" -c "router isis 1" -c "no spf-delay-ietf"')
930 "Unshut the rt6 interface to rt5 from the switch side and check fast-reroute"
932 tgen
.net
.cmd_raises("ip link set %s up" % tgen
.net
["s8"].intfs
[1])
934 logger
.info("Setup BFD on rt5 and rt6")
935 for rname
in ["rt5", "rt6"]:
936 conf_file
= os
.path
.join(CWD
, "{}/bfdd.conf".format(rname
))
937 tgen
.net
[rname
].cmd("vtysh -f {}".format(conf_file
))
940 '[{"multihop":false,"peer":"10.0.8.5","interface":"eth-rt5","status":"up"}]'
942 router_compare_json_output("rt6", "show bfd peers json", expect
)
944 # Unset link detection. We want zebra to consider linkdow as operationaly up
945 # in order that BFD triggers LFA instead of the interface down
948 logger
.info("Set spf-interval to 15s")
950 '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"'
953 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
954 router_compare_json_output(
955 rname
, "show ip route isis json", outputs
[rname
][10]["show_ip_route.ref"]
958 logger
.info("Set ISIS BFD")
959 tgen
.net
["rt5"].cmd('vtysh -c "conf t" -c "int eth-rt6" -c "isis bfd"')
960 tgen
.net
["rt6"].cmd('vtysh -c "conf t" -c "int eth-rt5" -c "isis bfd"')
963 def test_rib_ipv6_step13():
964 logger
.info("Test (step 13): verify IPv6 RIB")
967 # Skip if previous fatal error condition is raised
968 if tgen
.routers_have_failure():
969 pytest
.skip(tgen
.errors
)
971 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
972 router_compare_json_output(
974 "show ipv6 route isis json",
975 outputs
[rname
][10]["show_ipv6_route.ref"],
979 def test_mpls_lib_step13():
980 logger
.info("Test (step 13): verify MPLS LIB")
983 # Skip if previous fatal error condition is raised
984 if tgen
.routers_have_failure():
985 pytest
.skip(tgen
.errors
)
987 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
988 router_compare_json_output(
989 rname
, "show mpls table json", outputs
[rname
][10]["show_mpls_table.ref"]
997 # - drop traffic between rt5 and rt6 by shutting down the bridge between
998 # the routers. Interfaces on rt5 and rt6 stay up.
1001 # - Route switchover of routes via eth-rt5
1003 def test_rt6_step14():
1004 logger
.info("Test (step 14): verify IPv4/6 RIB and MPLS table")
1005 tgen
= get_topogen()
1007 # Skip if previous fatal error condition is raised
1008 if tgen
.routers_have_failure():
1009 pytest
.skip(tgen
.errors
)
1011 logger
.info("Drop traffic between rt5 and rt6")
1012 tgen
.net
.cmd_raises("ip link set s8 down")
1017 '[{"multihop":false,"peer":"10.0.8.5","interface":"eth-rt5","status":"down"}]'
1019 router_compare_json_output(
1021 "show bfd peers json",
1027 router_compare_json_output(
1029 "show ip route isis json",
1030 outputs
[rname
][11]["show_ip_route.ref"],
1033 router_compare_json_output(
1035 "show ipv6 route isis json",
1036 outputs
[rname
][11]["show_ipv6_route.ref"],
1039 router_compare_json_output(
1041 "show mpls table json",
1042 outputs
[rname
][11]["show_mpls_table.ref"],
1050 # Action(s): wait for the convergence and SPF computation on rt6
1053 # - convergence of IPv4/6 RIB and MPLS table
1055 def test_rib_ipv4_step15():
1056 logger
.info("Test (step 15): verify IPv4 RIB")
1057 tgen
= get_topogen()
1059 # Skip if previous fatal error condition is raised
1060 if tgen
.routers_have_failure():
1061 pytest
.skip(tgen
.errors
)
1063 logger
.info("Check SPF convergence")
1064 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1065 router_compare_json_output(
1067 "show ip route isis json",
1068 outputs
[rname
][12]["show_ip_route.ref"],
1072 def test_rib_ipv6_step15():
1073 logger
.info("Test (step 15): verify IPv6 RIB")
1074 tgen
= get_topogen()
1076 # Skip if previous fatal error condition is raised
1077 if tgen
.routers_have_failure():
1078 pytest
.skip(tgen
.errors
)
1080 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1081 router_compare_json_output(
1083 "show ipv6 route isis json",
1084 outputs
[rname
][12]["show_ipv6_route.ref"],
1088 def test_mpls_lib_step15():
1089 logger
.info("Test (step 15): verify MPLS LIB")
1090 tgen
= get_topogen()
1092 # Skip if previous fatal error condition is raised
1093 if tgen
.routers_have_failure():
1094 pytest
.skip(tgen
.errors
)
1096 for rname
in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1097 router_compare_json_output(
1099 "show mpls table json",
1100 outputs
[rname
][12]["show_mpls_table.ref"],
1104 # Memory leak test template
1105 def test_memory_leak():
1106 "Run the memory leak test and report results."
1107 tgen
= get_topogen()
1108 if not tgen
.is_memleak_enabled():
1109 pytest
.skip("Memory leak test/report is disabled")
1111 tgen
.report_memory_leaks()
1114 if __name__
== "__main__":
1115 args
= ["-s"] + sys
.argv
[1:]
1116 sys
.exit(pytest
.main(args
))