]>
git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/isis_te_topo1/test_isis_te_topo1.py
2 # SPDX-License-Identifier: ISC
5 # test_isis_te_topo1.py
6 # Part of NetDEF Topology Tests
8 # Copyright (c) 2021 by Orange
9 # Author: Olivier Dugeon <olivier.dugeon@orange.com>
13 test_isis_te_topo1.py: Test the FRR IS-IS with Traffic Engineering.
23 10.0.0.0/24| |10.0.1.0/24
27 +------------+ +------------+
29 | R2 |r2-eth2 r3-eth0| R3 |
30 | 10.0.255.2 +------------------+ 10.0.255.3 |
32 +------------+ 2001:db8:3:/64 +------+-----+
38 r4-eth0| 2001:db8:5:/64|
42 | 10.0.255.4 +-------------------------+
51 from functools
import partial
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
, "../"))
57 # pylint: disable=C0413
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
67 pytestmark
= [pytest
.mark
.isisd
]
74 for routern
in range(1, 5):
75 tgen
.add_router("r{}".format(routern
))
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"])
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"])
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"])
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"])
101 def setup_module(mod
):
102 "Sets up the pytest environment"
104 logger
.info("\n\n---- Starting IS-IS TE tests ----\n")
106 tgen
= Topogen(build_topo
, mod
.__name
__)
107 tgen
.start_topology()
109 router_list
= tgen
.routers()
111 for rname
, router
in router_list
.items():
113 TopoRouter
.RD_ZEBRA
, os
.path
.join(CWD
, "{}/zebra.conf".format(rname
))
116 TopoRouter
.RD_ISIS
, os
.path
.join(CWD
, "{}/isisd.conf".format(rname
))
119 # Initialize all routers.
123 def teardown_module():
124 "Teardown the pytest environment"
129 logger
.info("\n\n---- IS-IS TE tests End ----\n")
132 def compare_ted_json_output(tgen
, rname
, fileref
):
133 "Compare TED JSON output"
135 logger
.info('Comparing router "%s" TED output', rname
)
137 filename
= "{}/reference/{}".format(CWD
, fileref
)
138 expected
= json
.loads(open(filename
).read())
139 command
= "show isis mpls-te database json"
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
148 def setup_testcase(msg
):
154 # Skip if previous fatal error condition is raised
155 if tgen
.routers_have_failure():
156 pytest
.skip(tgen
.errors
)
161 # Note that all routers must discover the same Network Topology, so the same TED.
165 "Step1: Check initial topology"
167 tgen
= setup_testcase("Step1: test initial IS-IS TE Data Base")
169 for rname
in ["r1", "r2", "r3", "r4"]:
170 compare_ted_json_output(tgen
, rname
, "ted_step1.json")
174 "Step2: Shutdown interface between r1 and r2 and verify that \
175 corresponding Edges are removed from the TED on all routers "
177 tgen
= setup_testcase("Step2: Shutdown interface between r1 & r2")
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"')
182 for rname
in ["r1", "r2", "r3", "r4"]:
183 compare_ted_json_output(tgen
, rname
, "ted_step2.json")
187 "Step3: Enable IPv6 address between r1 and r2 and verify that \
188 corresponding Edges are added in the TED on all routers"
190 tgen
= setup_testcase("Step3: Add IPv6 on r1 and r2 interfaces")
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")
201 "Step4: Modify Segment Routing Prefix SID advertisement on Router r4"
203 tgen
= setup_testcase("Step4: Modify Prefix SID on router r4")
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"')
208 for rname
in ["r1", "r2", "r3", "r4"]:
209 compare_ted_json_output(tgen
, rname
, "ted_step4.json")
213 "Step5: Re-enable interface between r1 & r2 and verify that corresponding \
214 Edges are added in the TED on all routers"
216 tgen
= setup_testcase("Step5: Re-enable interface between r1 & r2")
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"')
221 for rname
in ["r1", "r2", "r3", "r4"]:
222 compare_ted_json_output(tgen
, rname
, "ted_step5.json")
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"
230 tgen
= setup_testcase("Step6: Modify link parameters on r2 & r4")
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"')
236 for rname
in ["r1", "r2", "r3", "r4"]:
237 compare_ted_json_output(tgen
, rname
, "ted_step6.json")
241 "Step7: Set extended admin-group on r1-eth0"
243 tgen
= setup_testcase("Step7: Modify link parameters on r1")
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"')
251 'vtysh -c "conf t" -c "interface r1-eth0" -c "link-params" -c "affinity RED WHITE BLACK GREEN"'
254 for rname
in ["r1", "r2", "r3", "r4"]:
255 compare_ted_json_output(tgen
, rname
, "ted_step7.json")
259 "Step8: Change value of affinity-map GREEN"
261 tgen
= setup_testcase("Step8: Change value of affinity-map GREEN")
263 tgen
.net
["r1"].cmd('vtysh -c "conf t" -c "affinity-map GREEN bit-position 33"')
265 for rname
in ["r1", "r2", "r3", "r4"]:
266 compare_ted_json_output(tgen
, rname
, "ted_step8.json")
270 "Step9: Trying to remove affinity-map GREEN. \
271 Must not succeed because in use"
273 tgen
= setup_testcase("Step9: Trying to remove affinity-map GREEN")
275 tgen
.net
["r1"].cmd('vtysh -c "conf t" -c "no affinity-map GREEN"')
277 for rname
in ["r1", "r2", "r3", "r4"]:
278 compare_ted_json_output(tgen
, rname
, "ted_step9.json")
282 "Step10: Removing r1-eth0 affinity GREEN"
284 tgen
= setup_testcase("Step10: Removing r1-eth0 affinity GREEN")
287 'vtysh -c "conf t" -c "interface r1-eth0" -c "link-params" -c "no affinity GREEN"'
290 for rname
in ["r1", "r2", "r3", "r4"]:
291 compare_ted_json_output(tgen
, rname
, "ted_step10.json")
294 def test_memory_leak():
295 "Run the memory leak test and report results."
298 if not tgen
.is_memleak_enabled():
299 pytest
.skip("Memory leak test/report is disabled")
301 tgen
.report_memory_leaks()
304 if __name__
== "__main__":
305 args
= ["-s"] + sys
.argv
[1:]
306 sys
.exit(pytest
.main(args
))