]>
Commit | Line | Data |
---|---|---|
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 | """ | |
13 | test_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 | ||
53 | import os | |
54 | import sys | |
55 | import pytest | |
56 | import json | |
57 | import re | |
591373bd RW |
58 | from functools import partial |
59 | ||
60 | # Save the Current Working Directory to find configuration files. | |
61 | CWD = os.path.dirname(os.path.realpath(__file__)) | |
701a0192 | 62 | sys.path.append(os.path.join(CWD, "../")) |
591373bd RW |
63 | |
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 | |
69 | ||
70 | # Required to instantiate the topology builder class. | |
591373bd | 71 | |
6907ac7e | 72 | pytestmark = [pytest.mark.isisd] |
701a0192 | 73 | |
5980ad0a | 74 | |
e82b531d CH |
75 | def 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 |
121 | def 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 |
140 | def 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 |
148 | def 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 | # | |
169 | def 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 | |
185 | def 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 | |
199 | def 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 | |
213 | def 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 | # | |
243 | def 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 | |
267 | def 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 | |
281 | def 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 | |
295 | def 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 | # | |
323 | def 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 | |
344 | def 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 | |
358 | def 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 | |
372 | def 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 | # | |
401 | def 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 | |
426 | def 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 | |
440 | def 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 | |
454 | def 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 | # | |
480 | def 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 | |
501 | def 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 | |
515 | def 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 | |
529 | def 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 | # | |
555 | def 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 | |
574 | def 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 | |
588 | def 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 | |
602 | def 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 | # | |
625 | def 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 | |
649 | def 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 | |
663 | def 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 | |
677 | def 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 | # | |
700 | def 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 | |
724 | def 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 | |
738 | def 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 | |
752 | def 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 | # | |
777 | def 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 | |
808 | def 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 | |
822 | def 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 | |
836 | def 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 | # | |
861 | def 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 | |
882 | def 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 | |
896 | def 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 | |
910 | def 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 | # | |
933 | def 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 | # | |
971 | def 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 | |
1019 | def 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 | |
1033 | def 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 | |
1047 | def 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 | |
1062 | def 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 | |
1071 | if __name__ == "__main__": | |
591373bd RW |
1072 | args = ["-s"] + sys.argv[1:] |
1073 | sys.exit(pytest.main(args)) |