]> git.proxmox.com Git - mirror_frr.git/blame - tests/topotests/isis_sr_topo1/test_isis_sr_topo1.py
*: auto-convert to SPDX License IDs
[mirror_frr.git] / tests / topotests / isis_sr_topo1 / test_isis_sr_topo1.py
CommitLineData
591373bd 1#!/usr/bin/env python
acddc0ed 2# SPDX-License-Identifier: ISC
591373bd
RW
3
4#
5# test_isis_sr_topo1.py
6# Part of NetDEF Topology Tests
7#
8# Copyright (c) 2019 by
9# Network Device Education Foundation, Inc. ("NetDEF")
10#
591373bd
RW
11
12"""
13test_isis_sr_topo1.py:
14
15 +---------+
16 | |
17 | RT1 |
18 | 1.1.1.1 |
19 | |
20 +---------+
21 |eth-sw1
22 |
23 |
24 |
25 +---------+ | +---------+
26 | | | | |
27 | RT2 |eth-sw1 | eth-sw1| RT3 |
28 | 2.2.2.2 +----------+----------+ 3.3.3.3 |
29 | | 10.0.1.0/24 | |
30 +---------+ +---------+
31 eth-rt4-1| |eth-rt4-2 eth-rt5-1| |eth-rt5-2
32 | | | |
33 10.0.2.0/24| |10.0.3.0/24 10.0.4.0/24| |10.0.5.0/24
34 | | | |
35 eth-rt2-1| |eth-rt2-2 eth-rt3-1| |eth-rt3-2
36 +---------+ +---------+
37 | | | |
38 | RT4 | 10.0.6.0/24 | RT5 |
39 | 4.4.4.4 +---------------------+ 5.5.5.5 |
40 | |eth-rt5 eth-rt4| |
41 +---------+ +---------+
42 eth-rt6| |eth-rt6
43 | |
44 10.0.7.0/24| |10.0.8.0/24
45 | +---------+ |
46 | | | |
47 | | RT6 | |
48 +----------+ 6.6.6.6 +-----------+
49 eth-rt4| |eth-rt5
50 +---------+
51"""
52
53import os
54import sys
55import pytest
56import json
57import re
591373bd
RW
58from functools import partial
59
60# Save the Current Working Directory to find configuration files.
61CWD = os.path.dirname(os.path.realpath(__file__))
701a0192 62sys.path.append(os.path.join(CWD, "../"))
591373bd
RW
63
64# pylint: disable=C0413
65# Import topogen and topotest helpers
66from lib import topotest
67from lib.topogen import Topogen, TopoRouter, get_topogen
68from lib.topolog import logger
69
70# Required to instantiate the topology builder class.
591373bd 71
6907ac7e 72pytestmark = [pytest.mark.isisd]
701a0192 73
5980ad0a 74
e82b531d
CH
75def build_topo(tgen):
76 "Build function"
701a0192 77
e82b531d
CH
78 #
79 # Define FRR Routers
80 #
81 for router in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
82 tgen.add_router(router)
591373bd 83
e82b531d
CH
84 #
85 # Define connections
86 #
87 switch = tgen.add_switch("s1")
88 switch.add_link(tgen.gears["rt1"], nodeif="eth-sw1")
89 switch.add_link(tgen.gears["rt2"], nodeif="eth-sw1")
90 switch.add_link(tgen.gears["rt3"], nodeif="eth-sw1")
591373bd 91
e82b531d
CH
92 switch = tgen.add_switch("s2")
93 switch.add_link(tgen.gears["rt2"], nodeif="eth-rt4-1")
94 switch.add_link(tgen.gears["rt4"], nodeif="eth-rt2-1")
701a0192 95
e82b531d
CH
96 switch = tgen.add_switch("s3")
97 switch.add_link(tgen.gears["rt2"], nodeif="eth-rt4-2")
98 switch.add_link(tgen.gears["rt4"], nodeif="eth-rt2-2")
591373bd 99
e82b531d
CH
100 switch = tgen.add_switch("s4")
101 switch.add_link(tgen.gears["rt3"], nodeif="eth-rt5-1")
102 switch.add_link(tgen.gears["rt5"], nodeif="eth-rt3-1")
591373bd 103
e82b531d
CH
104 switch = tgen.add_switch("s5")
105 switch.add_link(tgen.gears["rt3"], nodeif="eth-rt5-2")
106 switch.add_link(tgen.gears["rt5"], nodeif="eth-rt3-2")
591373bd 107
e82b531d
CH
108 switch = tgen.add_switch("s6")
109 switch.add_link(tgen.gears["rt4"], nodeif="eth-rt5")
110 switch.add_link(tgen.gears["rt5"], nodeif="eth-rt4")
591373bd 111
e82b531d
CH
112 switch = tgen.add_switch("s7")
113 switch.add_link(tgen.gears["rt4"], nodeif="eth-rt6")
114 switch.add_link(tgen.gears["rt6"], nodeif="eth-rt4")
591373bd 115
e82b531d
CH
116 switch = tgen.add_switch("s8")
117 switch.add_link(tgen.gears["rt5"], nodeif="eth-rt6")
118 switch.add_link(tgen.gears["rt6"], nodeif="eth-rt5")
591373bd 119
6907ac7e 120
591373bd
RW
121def setup_module(mod):
122 "Sets up the pytest environment"
e82b531d 123 tgen = Topogen(build_topo, mod.__name__)
591373bd
RW
124 tgen.start_topology()
125
126 router_list = tgen.routers()
127
128 # For all registered routers, load the zebra configuration file
e5f0ed14 129 for rname, router in router_list.items():
591373bd 130 router.load_config(
701a0192 131 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
591373bd
RW
132 )
133 router.load_config(
701a0192 134 TopoRouter.RD_ISIS, os.path.join(CWD, "{}/isisd.conf".format(rname))
591373bd
RW
135 )
136
137 tgen.start_router()
138
701a0192 139
591373bd
RW
140def teardown_module(mod):
141 "Teardown the pytest environment"
142 tgen = get_topogen()
143
144 # This function tears down the whole topology.
145 tgen.stop_topology()
146
701a0192 147
591373bd
RW
148def router_compare_json_output(rname, command, reference):
149 "Compare router JSON output"
150
151 logger.info('Comparing router "%s" "%s" output', rname, command)
152
153 tgen = get_topogen()
701a0192 154 filename = "{}/{}/{}".format(CWD, rname, reference)
591373bd
RW
155 expected = json.loads(open(filename).read())
156
157 # Run test function until we get an result. Wait at most 60 seconds.
701a0192 158 test_func = partial(topotest.router_json_cmp, tgen.gears[rname], command, expected)
591373bd
RW
159 _, diff = topotest.run_and_expect(test_func, None, count=120, wait=0.5)
160 assertmsg = '"{}" JSON output mismatches the expected result'.format(rname)
161 assert diff is None, assertmsg
162
701a0192 163
591373bd
RW
164#
165# Step 1
166#
167# Test initial network convergence
168#
169def test_isis_adjacencies_step1():
170 logger.info("Test (step 1): check IS-IS adjacencies")
171 tgen = get_topogen()
172
173 # Skip if previous fatal error condition is raised
174 if tgen.routers_have_failure():
175 pytest.skip(tgen.errors)
176
701a0192 177 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
178 router_compare_json_output(
179 rname,
180 "show yang operational-data /frr-interface:lib isisd",
181 "step1/show_yang_interface_isis_adjacencies.ref",
182 )
183
591373bd
RW
184
185def test_rib_ipv4_step1():
186 logger.info("Test (step 1): verify IPv4 RIB")
187 tgen = get_topogen()
188
189 # Skip if previous fatal error condition is raised
190 if tgen.routers_have_failure():
191 pytest.skip(tgen.errors)
192
701a0192 193 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
194 router_compare_json_output(
195 rname, "show ip route isis json", "step1/show_ip_route.ref"
196 )
197
591373bd
RW
198
199def test_rib_ipv6_step1():
200 logger.info("Test (step 1): verify IPv6 RIB")
201 tgen = get_topogen()
202
203 # Skip if previous fatal error condition is raised
204 if tgen.routers_have_failure():
205 pytest.skip(tgen.errors)
206
701a0192 207 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
208 router_compare_json_output(
209 rname, "show ipv6 route isis json", "step1/show_ipv6_route.ref"
210 )
211
591373bd
RW
212
213def test_mpls_lib_step1():
214 logger.info("Test (step 1): verify MPLS LIB")
215 tgen = get_topogen()
216
217 # Skip if previous fatal error condition is raised
218 if tgen.routers_have_failure():
219 pytest.skip(tgen.errors)
220
701a0192 221 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
222 router_compare_json_output(
223 rname, "show mpls table json", "step1/show_mpls_table.ref"
224 )
225
591373bd
RW
226
227#
228# Step 2
229#
230# Action(s):
231# -Disable IS-IS on the eth-rt5 interface on rt4
232#
233# Expected changes:
234# -rt4 should uninstall the Adj-SIDs pointing to rt5
235# -rt5 should uninstall the Adj-SIDs pointing to rt4
236# -rt2 should reinstall rt5's Prefix-SIDs (2 nexthops deleted)
237# -rt3 should reinstall rt4's Prefix-SIDs (2 nexthops deleted)
238# -rt4 should reinstall rt3's Prefix-SIDs (1 nexthop deleted)
239# -rt4 should reinstall rt5's Prefix-SIDs (1 nexthop changed)
240# -rt5 should reinstall rt2's Prefix-SIDs (1 nexthop deleted)
241# -rt5 should reinstall rt4's Prefix-SIDs (1 nexthop changed)
242#
243def test_isis_adjacencies_step2():
244 logger.info("Test (step 2): check IS-IS adjacencies")
245 tgen = get_topogen()
246
247 # Skip if previous fatal error condition is raised
248 if tgen.routers_have_failure():
249 pytest.skip(tgen.errors)
250
701a0192 251 logger.info("Disabling IS-IS on the eth-rt5 interface on rt4")
252 tgen.net["rt4"].cmd(
253 'vtysh -c "conf t" -c "interface eth-rt5" -c "no ip router isis 1"'
254 )
255 tgen.net["rt4"].cmd(
256 'vtysh -c "conf t" -c "interface eth-rt5" -c "no ipv6 router isis 1"'
257 )
258
259 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
260 router_compare_json_output(
261 rname,
262 "show yang operational-data /frr-interface:lib isisd",
263 "step2/show_yang_interface_isis_adjacencies.ref",
264 )
591373bd 265
591373bd
RW
266
267def test_rib_ipv4_step2():
268 logger.info("Test (step 2): verify IPv4 RIB")
269 tgen = get_topogen()
270
271 # Skip if previous fatal error condition is raised
272 if tgen.routers_have_failure():
273 pytest.skip(tgen.errors)
274
701a0192 275 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
276 router_compare_json_output(
277 rname, "show ip route isis json", "step2/show_ip_route.ref"
278 )
279
591373bd
RW
280
281def test_rib_ipv6_step2():
282 logger.info("Test (step 2): verify IPv6 RIB")
283 tgen = get_topogen()
284
285 # Skip if previous fatal error condition is raised
286 if tgen.routers_have_failure():
287 pytest.skip(tgen.errors)
288
701a0192 289 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
290 router_compare_json_output(
291 rname, "show ipv6 route isis json", "step2/show_ipv6_route.ref"
292 )
293
591373bd
RW
294
295def test_mpls_lib_step2():
296 logger.info("Test (step 2): verify MPLS LIB")
297 tgen = get_topogen()
298
299 # Skip if previous fatal error condition is raised
300 if tgen.routers_have_failure():
301 pytest.skip(tgen.errors)
302
701a0192 303 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
304 router_compare_json_output(
305 rname, "show mpls table json", "step2/show_mpls_table.ref"
306 )
307
591373bd
RW
308
309#
310# Step 3
311#
312# Action(s):
313# -Shut down the eth-rt4 interface on rt6
314# -Shut down the eth-rt5 interface on rt6
315#
316# Expected changes:
317# -All routers should uninstall rt6's Prefix-SIDs
318# -rt4 and rt5 should uninstall the Adj-SIDs pointing to rt6
319# -rt4 should reconverge rt5's Prefix-SIDs through rt2 using ECMP
320# -rt5 should reconverge rt4's Prefix-SIDs through rt3 using ECMP
321# -rt6 should uninstall all its IS-IS routes, Prefix-SIDs and Adj-SIDs
322#
323def test_isis_adjacencies_step3():
324 logger.info("Test (step 3): check IS-IS adjacencies")
325 tgen = get_topogen()
326
327 # Skip if previous fatal error condition is raised
328 if tgen.routers_have_failure():
329 pytest.skip(tgen.errors)
330
701a0192 331 logger.info("Shutting down the eth-rt4 interface on rt6")
332 tgen.net["rt6"].cmd('vtysh -c "conf t" -c "interface eth-rt4" -c "shutdown"')
333 logger.info("Shutting down the eth-rt5 interface on rt6")
334 tgen.net["rt6"].cmd('vtysh -c "conf t" -c "interface eth-rt5" -c "shutdown"')
335
336 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
337 router_compare_json_output(
338 rname,
339 "show yang operational-data /frr-interface:lib isisd",
340 "step3/show_yang_interface_isis_adjacencies.ref",
341 )
591373bd 342
591373bd
RW
343
344def test_rib_ipv4_step3():
345 logger.info("Test (step 3): verify IPv4 RIB")
346 tgen = get_topogen()
347
348 # Skip if previous fatal error condition is raised
349 if tgen.routers_have_failure():
350 pytest.skip(tgen.errors)
351
701a0192 352 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
353 router_compare_json_output(
354 rname, "show ip route isis json", "step3/show_ip_route.ref"
355 )
356
591373bd
RW
357
358def test_rib_ipv6_step3():
359 logger.info("Test (step 3): verify IPv6 RIB")
360 tgen = get_topogen()
361
362 # Skip if previous fatal error condition is raised
363 if tgen.routers_have_failure():
364 pytest.skip(tgen.errors)
365
701a0192 366 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
367 router_compare_json_output(
368 rname, "show ipv6 route isis json", "step3/show_ipv6_route.ref"
369 )
370
591373bd
RW
371
372def test_mpls_lib_step3():
373 logger.info("Test (step 3): verify MPLS LIB")
374 tgen = get_topogen()
375
376 # Skip if previous fatal error condition is raised
377 if tgen.routers_have_failure():
378 pytest.skip(tgen.errors)
379
701a0192 380 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
381 router_compare_json_output(
382 rname, "show mpls table json", "step3/show_mpls_table.ref"
383 )
384
591373bd
RW
385
386#
387# Step 4
388#
389# Action(s):
390# -Bring up the eth-rt4 interface on rt6
391# -Bring up the eth-rt5 interface on rt6
392# -Change rt6's SRGB
393#
394# Expected changes:
395# -All routers should install rt6's Prefix-SIDs
396# -rt4 and rt5 should install Adj-SIDs for rt6
397# -rt4 should reconverge rt5's Prefix-SIDs through rt6 using the new SRGB
398# -rt5 should reconverge rt4's Prefix-SIDs through rt6 using the new SRGB
399# -rt6 should reinstall all IS-IS routes and Prefix-SIDs from the network, and Adj-SIDs for rt4 and rt5
400#
401def test_isis_adjacencies_step4():
402 logger.info("Test (step 4): check IS-IS adjacencies")
403 tgen = get_topogen()
404
405 # Skip if previous fatal error condition is raised
406 if tgen.routers_have_failure():
407 pytest.skip(tgen.errors)
408
701a0192 409 logger.info("Bringing up the eth-rt4 interface on rt6")
410 tgen.net["rt6"].cmd('vtysh -c "conf t" -c "interface eth-rt4" -c "no shutdown"')
411 logger.info("Bringing up the eth-rt5 interface on rt6")
412 tgen.net["rt6"].cmd('vtysh -c "conf t" -c "interface eth-rt5" -c "no shutdown"')
413 logger.info("Changing rt6's SRGB")
414 tgen.net["rt6"].cmd(
415 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing global-block 18000 25999"'
416 )
417
418 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
419 router_compare_json_output(
420 rname,
421 "show yang operational-data /frr-interface:lib isisd",
422 "step4/show_yang_interface_isis_adjacencies.ref",
423 )
591373bd 424
591373bd
RW
425
426def test_rib_ipv4_step4():
427 logger.info("Test (step 4): verify IPv4 RIB")
428 tgen = get_topogen()
429
430 # Skip if previous fatal error condition is raised
431 if tgen.routers_have_failure():
432 pytest.skip(tgen.errors)
433
701a0192 434 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
435 router_compare_json_output(
436 rname, "show ip route isis json", "step4/show_ip_route.ref"
437 )
438
591373bd
RW
439
440def test_rib_ipv6_step4():
441 logger.info("Test (step 4): verify IPv6 RIB")
442 tgen = get_topogen()
443
444 # Skip if previous fatal error condition is raised
445 if tgen.routers_have_failure():
446 pytest.skip(tgen.errors)
447
701a0192 448 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
449 router_compare_json_output(
450 rname, "show ipv6 route isis json", "step4/show_ipv6_route.ref"
451 )
452
591373bd
RW
453
454def test_mpls_lib_step4():
455 logger.info("Test (step 4): verify MPLS LIB")
456 tgen = get_topogen()
457
458 # Skip if previous fatal error condition is raised
459 if tgen.routers_have_failure():
460 pytest.skip(tgen.errors)
461
701a0192 462 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
463 router_compare_json_output(
464 rname, "show mpls table json", "step4/show_mpls_table.ref"
465 )
466
591373bd
RW
467
468#
469# Step 5
470#
471# Action(s):
472# -Disable SR on rt6
473#
474# Expected changes:
475# -All routers should uninstall rt6's Prefix-SIDs
476# -rt4 should uninstall rt5's Prefix-SIDs since the nexthop router hasn't SR enabled anymore
477# -rt5 should uninstall rt4's Prefix-SIDs since the nexthop router hasn't SR enabled anymore
478# -rt6 should uninstall all Prefix-SIDs from the network, and the Adj-SIDs for rt4 and rt5
479#
480def test_isis_adjacencies_step5():
481 logger.info("Test (step 5): check IS-IS adjacencies")
482 tgen = get_topogen()
483
484 # Skip if previous fatal error condition is raised
485 if tgen.routers_have_failure():
486 pytest.skip(tgen.errors)
487
701a0192 488 logger.info("Disabling SR on rt6")
489 tgen.net["rt6"].cmd(
490 'vtysh -c "conf t" -c "router isis 1" -c "no segment-routing on"'
491 )
492
493 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
494 router_compare_json_output(
495 rname,
496 "show yang operational-data /frr-interface:lib isisd",
497 "step5/show_yang_interface_isis_adjacencies.ref",
498 )
591373bd 499
591373bd
RW
500
501def test_rib_ipv4_step5():
502 logger.info("Test (step 5): verify IPv4 RIB")
503 tgen = get_topogen()
504
505 # Skip if previous fatal error condition is raised
506 if tgen.routers_have_failure():
507 pytest.skip(tgen.errors)
508
701a0192 509 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
510 router_compare_json_output(
511 rname, "show ip route isis json", "step5/show_ip_route.ref"
512 )
513
591373bd
RW
514
515def test_rib_ipv6_step5():
516 logger.info("Test (step 5): verify IPv6 RIB")
517 tgen = get_topogen()
518
519 # Skip if previous fatal error condition is raised
520 if tgen.routers_have_failure():
521 pytest.skip(tgen.errors)
522
701a0192 523 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
524 router_compare_json_output(
525 rname, "show ipv6 route isis json", "step5/show_ipv6_route.ref"
526 )
527
591373bd
RW
528
529def test_mpls_lib_step5():
530 logger.info("Test (step 5): verify MPLS LIB")
531 tgen = get_topogen()
532
533 # Skip if previous fatal error condition is raised
534 if tgen.routers_have_failure():
535 pytest.skip(tgen.errors)
536
701a0192 537 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
538 router_compare_json_output(
539 rname, "show mpls table json", "step5/show_mpls_table.ref"
540 )
541
591373bd
RW
542
543#
544# Step 6
545#
546# Action(s):
547# -Enable SR on rt6
548#
549# Expected changes:
550# -All routers should install rt6's Prefix-SIDs
551# -rt4 should install rt5's Prefix-SIDs through rt6
552# -rt5 should install rt4's Prefix-SIDs through rt6
553# -rt6 should install all Prefix-SIDs from the network, and Adj-SIDs for rt4 and rt5
554#
555def test_isis_adjacencies_step6():
556 logger.info("Test (step 6): check IS-IS adjacencies")
557 tgen = get_topogen()
558
559 # Skip if previous fatal error condition is raised
560 if tgen.routers_have_failure():
561 pytest.skip(tgen.errors)
562
701a0192 563 logger.info("Enabling SR on rt6")
564 tgen.net["rt6"].cmd('vtysh -c "conf t" -c "router isis 1" -c "segment-routing on"')
565
566 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
567 router_compare_json_output(
568 rname,
569 "show yang operational-data /frr-interface:lib isisd",
570 "step6/show_yang_interface_isis_adjacencies.ref",
571 )
591373bd 572
591373bd
RW
573
574def test_rib_ipv4_step6():
575 logger.info("Test (step 6): verify IPv4 RIB")
576 tgen = get_topogen()
577
578 # Skip if previous fatal error condition is raised
579 if tgen.routers_have_failure():
580 pytest.skip(tgen.errors)
581
701a0192 582 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
583 router_compare_json_output(
584 rname, "show ip route isis json", "step6/show_ip_route.ref"
585 )
586
591373bd
RW
587
588def test_rib_ipv6_step6():
589 logger.info("Test (step 6): verify IPv6 RIB")
590 tgen = get_topogen()
591
592 # Skip if previous fatal error condition is raised
593 if tgen.routers_have_failure():
594 pytest.skip(tgen.errors)
595
701a0192 596 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
597 router_compare_json_output(
598 rname, "show ipv6 route isis json", "step6/show_ipv6_route.ref"
599 )
600
591373bd
RW
601
602def test_mpls_lib_step6():
603 logger.info("Test (step 6): verify MPLS LIB")
604 tgen = get_topogen()
605
606 # Skip if previous fatal error condition is raised
607 if tgen.routers_have_failure():
608 pytest.skip(tgen.errors)
609
701a0192 610 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
611 router_compare_json_output(
612 rname, "show mpls table json", "step6/show_mpls_table.ref"
613 )
614
591373bd
RW
615
616#
617# Step 7
618#
619# Action(s):
620# -Delete rt1's Prefix-SIDs
621#
622# Expected changes:
623# -All routers should uninstall rt1's Prefix-SIDs
624#
625def test_isis_adjacencies_step7():
626 logger.info("Test (step 7): check IS-IS adjacencies")
627 tgen = get_topogen()
628
629 # Skip if previous fatal error condition is raised
630 if tgen.routers_have_failure():
631 pytest.skip(tgen.errors)
632
701a0192 633 logger.info("Deleting rt1's Prefix-SIDs")
634 tgen.net["rt1"].cmd(
635 'vtysh -c "conf t" -c "router isis 1" -c "no segment-routing prefix 1.1.1.1/32 index 10"'
636 )
637 tgen.net["rt1"].cmd(
638 'vtysh -c "conf t" -c "router isis 1" -c "no segment-routing prefix 2001:db8:1000::1/128 index 11"'
639 )
640
641 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
642 router_compare_json_output(
643 rname,
644 "show yang operational-data /frr-interface:lib isisd",
645 "step7/show_yang_interface_isis_adjacencies.ref",
646 )
591373bd 647
591373bd
RW
648
649def test_rib_ipv4_step7():
650 logger.info("Test (step 7): verify IPv4 RIB")
651 tgen = get_topogen()
652
653 # Skip if previous fatal error condition is raised
654 if tgen.routers_have_failure():
655 pytest.skip(tgen.errors)
656
701a0192 657 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
658 router_compare_json_output(
659 rname, "show ip route isis json", "step7/show_ip_route.ref"
660 )
661
591373bd
RW
662
663def test_rib_ipv6_step7():
664 logger.info("Test (step 7): verify IPv6 RIB")
665 tgen = get_topogen()
666
667 # Skip if previous fatal error condition is raised
668 if tgen.routers_have_failure():
669 pytest.skip(tgen.errors)
670
701a0192 671 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
672 router_compare_json_output(
673 rname, "show ipv6 route isis json", "step7/show_ipv6_route.ref"
674 )
675
591373bd
RW
676
677def test_mpls_lib_step7():
678 logger.info("Test (step 7): verify MPLS LIB")
679 tgen = get_topogen()
680
681 # Skip if previous fatal error condition is raised
682 if tgen.routers_have_failure():
683 pytest.skip(tgen.errors)
684
701a0192 685 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
686 router_compare_json_output(
687 rname, "show mpls table json", "step7/show_mpls_table.ref"
688 )
689
591373bd
RW
690
691#
692# Step 8
693#
694# Action(s):
695# -Re-add rt1's Prefix-SIDs
696#
697# Expected changes:
698# -All routers should install rt1's Prefix-SIDs
699#
700def test_isis_adjacencies_step8():
701 logger.info("Test (step 8): check IS-IS adjacencies")
702 tgen = get_topogen()
703
704 # Skip if previous fatal error condition is raised
705 if tgen.routers_have_failure():
706 pytest.skip(tgen.errors)
707
701a0192 708 logger.info("Re-adding rt1's Prefix-SIDs")
709 tgen.net["rt1"].cmd(
710 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 1.1.1.1/32 index 10"'
711 )
712 tgen.net["rt1"].cmd(
713 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 2001:db8:1000::1/128 index 11"'
714 )
715
716 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
717 router_compare_json_output(
718 rname,
719 "show yang operational-data /frr-interface:lib isisd",
720 "step8/show_yang_interface_isis_adjacencies.ref",
721 )
591373bd 722
591373bd
RW
723
724def test_rib_ipv4_step8():
725 logger.info("Test (step 8): verify IPv4 RIB")
726 tgen = get_topogen()
727
728 # Skip if previous fatal error condition is raised
729 if tgen.routers_have_failure():
730 pytest.skip(tgen.errors)
731
701a0192 732 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
733 router_compare_json_output(
734 rname, "show ip route isis json", "step8/show_ip_route.ref"
735 )
736
591373bd
RW
737
738def test_rib_ipv6_step8():
739 logger.info("Test (step 8): verify IPv6 RIB")
740 tgen = get_topogen()
741
742 # Skip if previous fatal error condition is raised
743 if tgen.routers_have_failure():
744 pytest.skip(tgen.errors)
745
701a0192 746 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
747 router_compare_json_output(
748 rname, "show ipv6 route isis json", "step8/show_ipv6_route.ref"
749 )
750
591373bd
RW
751
752def test_mpls_lib_step8():
753 logger.info("Test (step 8): verify MPLS LIB")
754 tgen = get_topogen()
755
756 # Skip if previous fatal error condition is raised
757 if tgen.routers_have_failure():
758 pytest.skip(tgen.errors)
759
701a0192 760 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
761 router_compare_json_output(
762 rname, "show mpls table json", "step8/show_mpls_table.ref"
763 )
764
591373bd
RW
765
766#
767# Step 9
768#
769# Action(s):
770# -Change rt1's Prefix-SIDs to use the no-php option
771# -Change rt6's Prefix-SIDs to stop using the explicit-null option
772#
773# Expected changes:
774# -rt2 and rt3 should reinstall rt1's Prefix-SIDs accordingly
775# -rt4 and rt5 should reinstall rt6's Prefix-SIDs accordingly
776#
777def test_isis_adjacencies_step9():
778 logger.info("Test (step 9): check IS-IS adjacencies")
779 tgen = get_topogen()
780
781 # Skip if previous fatal error condition is raised
782 if tgen.routers_have_failure():
783 pytest.skip(tgen.errors)
784
701a0192 785 logger.info("Changing rt1's Prefix-SIDs to use the no-php option")
786 tgen.net["rt1"].cmd(
787 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 1.1.1.1/32 index 10 no-php-flag"'
788 )
789 tgen.net["rt1"].cmd(
790 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 2001:db8:1000::1/128 index 11 no-php-flag"'
791 )
792 logger.info("Change rt6's Prefix-SIDs to stop using the explicit-null option")
793 tgen.net["rt6"].cmd(
794 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 6.6.6.6/32 index 60"'
795 )
796 tgen.net["rt6"].cmd(
797 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 2001:db8:1000::6/128 index 61"'
798 )
799
800 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
801 router_compare_json_output(
802 rname,
803 "show yang operational-data /frr-interface:lib isisd",
804 "step9/show_yang_interface_isis_adjacencies.ref",
805 )
591373bd 806
591373bd
RW
807
808def test_rib_ipv4_step9():
809 logger.info("Test (step 9): verify IPv4 RIB")
810 tgen = get_topogen()
811
812 # Skip if previous fatal error condition is raised
813 if tgen.routers_have_failure():
814 pytest.skip(tgen.errors)
815
701a0192 816 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
817 router_compare_json_output(
818 rname, "show ip route isis json", "step9/show_ip_route.ref"
819 )
820
591373bd
RW
821
822def test_rib_ipv6_step9():
823 logger.info("Test (step 9): verify IPv6 RIB")
824 tgen = get_topogen()
825
826 # Skip if previous fatal error condition is raised
827 if tgen.routers_have_failure():
828 pytest.skip(tgen.errors)
829
701a0192 830 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
831 router_compare_json_output(
832 rname, "show ipv6 route isis json", "step9/show_ipv6_route.ref"
833 )
834
591373bd
RW
835
836def test_mpls_lib_step9():
837 logger.info("Test (step 9): verify MPLS LIB")
838 tgen = get_topogen()
839
840 # Skip if previous fatal error condition is raised
841 if tgen.routers_have_failure():
842 pytest.skip(tgen.errors)
843
701a0192 844 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
845 router_compare_json_output(
846 rname, "show mpls table json", "step9/show_mpls_table.ref"
847 )
848
591373bd
RW
849
850#
851# Step 10
852#
853# Action(s):
854# -Remove the IPv4 address from rt4's eth-rt2-1 interface
855#
856# Expected changes:
857# -rt2 should uninstall the IPv4 Adj-SIDs attached to the eth-rt4-1 interface
858# -rt2 should reinstall all IPv4 Prefix-SIDs whose nexthop router is rt4 (ECMP shouldn't be used anymore)
859# -rt4 should reinstall all IPv4 Prefix-SIDs whose nexthop router is rt2 (ECMP shouldn't be used anymore)
860#
861def test_isis_adjacencies_step10():
862 logger.info("Test (step 10): check IS-IS adjacencies")
863 tgen = get_topogen()
864
865 # Skip if previous fatal error condition is raised
866 if tgen.routers_have_failure():
867 pytest.skip(tgen.errors)
868
701a0192 869 logger.info("Removing the IPv4 address from rt4's eth-rt2-1 interface")
870 tgen.net["rt4"].cmd(
871 'vtysh -c "conf t" -c "interface eth-rt2-1" -c "no ip address 10.0.2.4/24"'
872 )
873
874 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
875 router_compare_json_output(
876 rname,
877 "show yang operational-data /frr-interface:lib isisd",
878 "step10/show_yang_interface_isis_adjacencies.ref",
879 )
591373bd 880
591373bd
RW
881
882def test_rib_ipv4_step10():
883 logger.info("Test (step 10): verify IPv4 RIB")
884 tgen = get_topogen()
885
886 # Skip if previous fatal error condition is raised
887 if tgen.routers_have_failure():
888 pytest.skip(tgen.errors)
889
701a0192 890 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
891 router_compare_json_output(
892 rname, "show ip route isis json", "step10/show_ip_route.ref"
893 )
894
591373bd
RW
895
896def test_rib_ipv6_step10():
897 logger.info("Test (step 10): verify IPv6 RIB")
898 tgen = get_topogen()
899
900 # Skip if previous fatal error condition is raised
901 if tgen.routers_have_failure():
902 pytest.skip(tgen.errors)
903
701a0192 904 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
905 router_compare_json_output(
906 rname, "show ipv6 route isis json", "step10/show_ipv6_route.ref"
907 )
908
591373bd
RW
909
910def test_mpls_lib_step10():
911 logger.info("Test (step 10): verify MPLS LIB")
912 tgen = get_topogen()
913
914 # Skip if previous fatal error condition is raised
915 if tgen.routers_have_failure():
916 pytest.skip(tgen.errors)
917
701a0192 918 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
919 router_compare_json_output(
920 rname, "show mpls table json", "step10/show_mpls_table.ref"
921 )
922
591373bd
RW
923
924#
925# Step 11
926#
927# Action(s):
928# -Enter invalid SR configuration
929#
930# Expected changes:
931# -All commands should be rejected
932#
933def test_isis_invalid_config_step11():
934 logger.info("Test (step 11): check if invalid configuration is rejected")
935 tgen = get_topogen()
936
937 # Skip if previous fatal error condition is raised
938 if tgen.routers_have_failure():
939 pytest.skip(tgen.errors)
940
701a0192 941 logger.info("Entering invalid Segment Routing configuration...")
942 ret = tgen.net["rt1"].cmd(
943 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 1.1.1.1/32 index 10000"'
944 )
945 assert (
946 re.search("Configuration failed", ret) is not None
947 ), "Invalid SR configuration wasn't rejected"
948 ret = tgen.net["rt1"].cmd(
949 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing global-block 16000 14999"'
950 )
951 assert (
952 re.search("Configuration failed", ret) is not None
953 ), "Invalid SR configuration wasn't rejected"
954 ret = tgen.net["rt1"].cmd(
955 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing global-block 16000 16001"'
956 )
957 assert (
958 re.search("Configuration failed", ret) is not None
959 ), "Invalid SR configuration wasn't rejected"
960
591373bd
RW
961
962#
963# Step 12
964#
965# Action(s):
966# -Restore the original network setup
967#
968# Expected changes:
969# -All routes, Prefix-SIDs and Adj-SIDs should be the same as they were after the initial network convergence (step 1)
970#
971def test_isis_adjacencies_step12():
972 logger.info("Test (step 12): check IS-IS adjacencies")
973 tgen = get_topogen()
974
975 # Skip if previous fatal error condition is raised
976 if tgen.routers_have_failure():
977 pytest.skip(tgen.errors)
978
701a0192 979 logger.info("Restoring the original network setup")
980 tgen.net["rt4"].cmd(
981 'vtysh -c "conf t" -c "interface eth-rt5" -c "ip router isis 1"'
982 )
983 tgen.net["rt4"].cmd(
984 'vtysh -c "conf t" -c "interface eth-rt5" -c "ipv6 router isis 1"'
985 )
bcf22081
IR
986 tgen.net["rt4"].cmd(
987 'vtysh -c "conf t" -c "interface eth-rt5" -c "isis network point-to-point"'
988 )
989 tgen.net["rt4"].cmd(
990 'vtysh -c "conf t" -c "interface eth-rt5" -c "isis hello-multiplier 3"'
991 )
701a0192 992 tgen.net["rt6"].cmd(
993 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing global-block 16000 23999"'
994 )
995 tgen.net["rt1"].cmd(
996 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 1.1.1.1/32 index 10"'
997 )
998 tgen.net["rt1"].cmd(
999 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 2001:db8:1000::1/128 index 11"'
1000 )
1001 tgen.net["rt6"].cmd(
1002 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 6.6.6.6/32 index 60 explicit-null"'
1003 )
1004 tgen.net["rt6"].cmd(
1005 'vtysh -c "conf t" -c "router isis 1" -c "segment-routing prefix 2001:db8:1000::6/128 index 61 explicit-null"'
1006 )
1007 tgen.net["rt4"].cmd(
1008 'vtysh -c "conf t" -c "interface eth-rt2-1" -c "ip address 10.0.2.4/24"'
1009 )
1010
1011 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1012 router_compare_json_output(
1013 rname,
1014 "show yang operational-data /frr-interface:lib isisd",
1015 "step1/show_yang_interface_isis_adjacencies.ref",
1016 )
591373bd 1017
591373bd
RW
1018
1019def test_rib_ipv4_step12():
1020 logger.info("Test (step 12): verify IPv4 RIB")
1021 tgen = get_topogen()
1022
1023 # Skip if previous fatal error condition is raised
1024 if tgen.routers_have_failure():
1025 pytest.skip(tgen.errors)
1026
701a0192 1027 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1028 router_compare_json_output(
1029 rname, "show ip route isis json", "step1/show_ip_route.ref"
1030 )
1031
591373bd
RW
1032
1033def test_rib_ipv6_step12():
1034 logger.info("Test (step 12): verify IPv6 RIB")
1035 tgen = get_topogen()
1036
1037 # Skip if previous fatal error condition is raised
1038 if tgen.routers_have_failure():
1039 pytest.skip(tgen.errors)
1040
701a0192 1041 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1042 router_compare_json_output(
1043 rname, "show ipv6 route isis json", "step1/show_ipv6_route.ref"
1044 )
1045
591373bd
RW
1046
1047def test_mpls_lib_step12():
1048 logger.info("Test (step 12): verify MPLS LIB")
1049 tgen = get_topogen()
1050
1051 # Skip if previous fatal error condition is raised
1052 if tgen.routers_have_failure():
1053 pytest.skip(tgen.errors)
1054
701a0192 1055 for rname in ["rt1", "rt2", "rt3", "rt4", "rt5", "rt6"]:
1056 router_compare_json_output(
1057 rname, "show mpls table json", "step1/show_mpls_table.ref"
1058 )
1059
591373bd
RW
1060
1061# Memory leak test template
1062def test_memory_leak():
1063 "Run the memory leak test and report results."
1064 tgen = get_topogen()
1065 if not tgen.is_memleak_enabled():
701a0192 1066 pytest.skip("Memory leak test/report is disabled")
591373bd
RW
1067
1068 tgen.report_memory_leaks()
1069
701a0192 1070
1071if __name__ == "__main__":
591373bd
RW
1072 args = ["-s"] + sys.argv[1:]
1073 sys.exit(pytest.main(args))