]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/isis_te_topo1/test_isis_te_topo1.py
Merge pull request #12851 from sri-mohan1/sri-mohan-ldp
[mirror_frr.git] / tests / topotests / isis_te_topo1 / test_isis_te_topo1.py
1 #!/usr/bin/env python
2 # SPDX-License-Identifier: ISC
3
4 #
5 # test_isis_te_topo1.py
6 # Part of NetDEF Topology Tests
7 #
8 # Copyright (c) 2021 by Orange
9 # Author: Olivier Dugeon <olivier.dugeon@orange.com>
10 #
11
12 """
13 test_isis_te_topo1.py: Test the FRR IS-IS with Traffic Engineering.
14
15 +------------+
16 | |
17 | R1 |
18 | 10.0.225.1 |
19 | |
20 +------------+
21 r1-eth0| |r1-eth1
22 | |
23 10.0.0.0/24| |10.0.1.0/24
24 | |2001:db8:1:/64
25 | |
26 r2-eth0| |r2-eth1
27 +------------+ +------------+
28 | | | |
29 | R2 |r2-eth2 r3-eth0| R3 |
30 | 10.0.255.2 +------------------+ 10.0.255.3 |
31 | | 10.0.3.0/24 | |
32 +------------+ 2001:db8:3:/64 +------+-----+
33 r2-eth3| r3-eth1|
34 | |
35 10.0.4.0/24| |
36 | |
37 | |
38 r4-eth0| 2001:db8:5:/64|
39 +------------+ |
40 | | |
41 | R4 |r4-eth1 |
42 | 10.0.255.4 +-------------------------+
43 | |
44 +------------+
45
46 """
47
48 import os
49 import sys
50 import json
51 from functools import partial
52
53 # Save the Current Working Directory to find configuration files.
54 CWD = os.path.dirname(os.path.realpath(__file__))
55 sys.path.append(os.path.join(CWD, "../"))
56
57 # pylint: disable=C0413
58
59 # Import topogen and topotest helpers
60 from lib import topotest
61 from lib.topogen import Topogen, TopoRouter, get_topogen
62 from lib.topolog import logger
63
64 # and Finally pytest
65 import pytest
66
67 pytestmark = [pytest.mark.isisd]
68
69
70 def build_topo(tgen):
71 "Build function"
72
73 # Create 4 routers
74 for routern in range(1, 5):
75 tgen.add_router("r{}".format(routern))
76
77 # Interconect router 1 and 2 with 2 links
78 switch = tgen.add_switch("s1")
79 switch.add_link(tgen.gears["r1"])
80 switch.add_link(tgen.gears["r2"])
81 switch = tgen.add_switch("s2")
82 switch.add_link(tgen.gears["r1"])
83 switch.add_link(tgen.gears["r2"])
84
85 # Interconect router 3 and 2
86 switch = tgen.add_switch("s3")
87 switch.add_link(tgen.gears["r3"])
88 switch.add_link(tgen.gears["r2"])
89
90 # Interconect router 4 and 2
91 switch = tgen.add_switch("s4")
92 switch.add_link(tgen.gears["r4"])
93 switch.add_link(tgen.gears["r2"])
94
95 # Interconnect router 3 and 4
96 switch = tgen.add_switch("s5")
97 switch.add_link(tgen.gears["r3"])
98 switch.add_link(tgen.gears["r4"])
99
100
101 def setup_module(mod):
102 "Sets up the pytest environment"
103
104 logger.info("\n\n---- Starting IS-IS TE tests ----\n")
105
106 tgen = Topogen(build_topo, mod.__name__)
107 tgen.start_topology()
108
109 router_list = tgen.routers()
110
111 for rname, router in router_list.items():
112 router.load_config(
113 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
114 )
115 router.load_config(
116 TopoRouter.RD_ISIS, os.path.join(CWD, "{}/isisd.conf".format(rname))
117 )
118
119 # Initialize all routers.
120 tgen.start_router()
121
122
123 def teardown_module():
124 "Teardown the pytest environment"
125
126 tgen = get_topogen()
127 tgen.stop_topology()
128
129 logger.info("\n\n---- IS-IS TE tests End ----\n")
130
131
132 def compare_ted_json_output(tgen, rname, fileref):
133 "Compare TED JSON output"
134
135 logger.info('Comparing router "%s" TED output', rname)
136
137 filename = "{}/reference/{}".format(CWD, fileref)
138 expected = json.loads(open(filename).read())
139 command = "show isis mpls-te database json"
140
141 # Run test function until we get an result. Wait at most 60 seconds.
142 test_func = partial(topotest.router_json_cmp, tgen.gears[rname], command, expected)
143 _, diff = topotest.run_and_expect(test_func, None, count=60, wait=2)
144 assertmsg = '"{}" TED JSON output mismatches the expected result'.format(rname)
145 assert diff is None, assertmsg
146
147
148 def setup_testcase(msg):
149 "Setup test case"
150
151 logger.info(msg)
152 tgen = get_topogen()
153
154 # Skip if previous fatal error condition is raised
155 if tgen.routers_have_failure():
156 pytest.skip(tgen.errors)
157
158 return tgen
159
160
161 # Note that all routers must discover the same Network Topology, so the same TED.
162
163
164 def test_step1():
165 "Step1: Check initial topology"
166
167 tgen = setup_testcase("Step1: test initial IS-IS TE Data Base")
168
169 for rname in ["r1", "r2", "r3", "r4"]:
170 compare_ted_json_output(tgen, rname, "ted_step1.json")
171
172
173 def test_step2():
174 "Step2: Shutdown interface between r1 and r2 and verify that \
175 corresponding Edges are removed from the TED on all routers "
176
177 tgen = setup_testcase("Step2: Shutdown interface between r1 & r2")
178
179 tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth1" -c "shutdown"')
180 tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth1" -c "shutdown"')
181
182 for rname in ["r1", "r2", "r3", "r4"]:
183 compare_ted_json_output(tgen, rname, "ted_step2.json")
184
185
186 def test_step3():
187 "Step3: Enable IPv6 address between r1 and r2 and verify that \
188 corresponding Edges are added in the TED on all routers"
189
190 tgen = setup_testcase("Step3: Add IPv6 on r1 and r2 interfaces")
191
192 tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth0" -c "ipv6 address 2001:db8:0::1/64"')
193 tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth0" -c "ipv6 router isis TE"')
194 tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth0" -c "ipv6 address 2001:db8:0::2/64"')
195 tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth0" -c "ipv6 router isis TE"')
196 for rname in ["r1", "r2", "r3", "r4"]:
197 compare_ted_json_output(tgen, rname, "ted_step3.json")
198
199
200 def test_step4():
201 "Step4: Modify Segment Routing Prefix SID advertisement on Router r4"
202
203 tgen = setup_testcase("Step4: Modify Prefix SID on router r4")
204
205 tgen.net["r4"].cmd('vtysh -c "conf t" -c "router isis TE" -c "segment-routing prefix 10.0.255.4/32 index 40"')
206 tgen.net["r4"].cmd('vtysh -c "conf t" -c "router isis TE" -c "segment-routing prefix 2001:db8:ffff::4/128 index 1040"')
207
208 for rname in ["r1", "r2", "r3", "r4"]:
209 compare_ted_json_output(tgen, rname, "ted_step4.json")
210
211
212 def test_step5():
213 "Step5: Re-enable interface between r1 & r2 and verify that corresponding \
214 Edges are added in the TED on all routers"
215
216 tgen = setup_testcase("Step5: Re-enable interface between r1 & r2")
217
218 tgen.net["r1"].cmd('vtysh -c "conf t" -c "interface r1-eth1" -c "no shutdown"')
219 tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth1" -c "no shutdown"')
220
221 for rname in ["r1", "r2", "r3", "r4"]:
222 compare_ted_json_output(tgen, rname, "ted_step5.json")
223
224
225 def test_step6():
226 "Step6: Set delay and jitter for interface r4-eth0 on r4, remove use-bw \
227 for interface r2-eth3 on r2 and verify that corresponding Edges are \
228 updated in the TED on all routers"
229
230 tgen = setup_testcase("Step6: Modify link parameters on r2 & r4")
231
232 tgen.net["r2"].cmd('vtysh -c "conf t" -c "interface r2-eth3" -c "link-params" -c "no use-bw"')
233 tgen.net["r4"].cmd('vtysh -c "conf t" -c "interface r4-eth0" -c "link-params" -c "delay 20000"')
234 tgen.net["r4"].cmd('vtysh -c "conf t" -c "interface r4-eth0" -c "link-params" -c "delay-variation 10000"')
235
236 for rname in ["r1", "r2", "r3", "r4"]:
237 compare_ted_json_output(tgen, rname, "ted_step6.json")
238
239
240 def test_step7():
241 "Step7: Set extended admin-group on r1-eth0"
242
243 tgen = setup_testcase("Step7: Modify link parameters on r1")
244
245 tgen.net["r1"].cmd('vtysh -c "conf t" -c "affinity-map WHITE bit-position 0"')
246 tgen.net["r1"].cmd('vtysh -c "conf t" -c "affinity-map RED bit-position 31"')
247 tgen.net["r1"].cmd('vtysh -c "conf t" -c "affinity-map GREEN bit-position 32"')
248 tgen.net["r1"].cmd('vtysh -c "conf t" -c "affinity-map BLACK bit-position 128"')
249
250 tgen.net["r1"].cmd(
251 'vtysh -c "conf t" -c "interface r1-eth0" -c "link-params" -c "affinity RED WHITE BLACK GREEN"'
252 )
253
254 for rname in ["r1", "r2", "r3", "r4"]:
255 compare_ted_json_output(tgen, rname, "ted_step7.json")
256
257
258 def test_step8():
259 "Step8: Change value of affinity-map GREEN"
260
261 tgen = setup_testcase("Step8: Change value of affinity-map GREEN")
262
263 tgen.net["r1"].cmd('vtysh -c "conf t" -c "affinity-map GREEN bit-position 33"')
264
265 for rname in ["r1", "r2", "r3", "r4"]:
266 compare_ted_json_output(tgen, rname, "ted_step8.json")
267
268
269 def test_step9():
270 "Step9: Trying to remove affinity-map GREEN. \
271 Must not succeed because in use"
272
273 tgen = setup_testcase("Step9: Trying to remove affinity-map GREEN")
274
275 tgen.net["r1"].cmd('vtysh -c "conf t" -c "no affinity-map GREEN"')
276
277 for rname in ["r1", "r2", "r3", "r4"]:
278 compare_ted_json_output(tgen, rname, "ted_step9.json")
279
280
281 def test_step10():
282 "Step10: Removing r1-eth0 affinity GREEN"
283
284 tgen = setup_testcase("Step10: Removing r1-eth0 affinity GREEN")
285
286 tgen.net["r1"].cmd(
287 'vtysh -c "conf t" -c "interface r1-eth0" -c "link-params" -c "no affinity GREEN"'
288 )
289
290 for rname in ["r1", "r2", "r3", "r4"]:
291 compare_ted_json_output(tgen, rname, "ted_step10.json")
292
293
294 def test_memory_leak():
295 "Run the memory leak test and report results."
296
297 tgen = get_topogen()
298 if not tgen.is_memleak_enabled():
299 pytest.skip("Memory leak test/report is disabled")
300
301 tgen.report_memory_leaks()
302
303
304 if __name__ == "__main__":
305 args = ["-s"] + sys.argv[1:]
306 sys.exit(pytest.main(args))