]>
git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/ospf_gr_helper/test_ospf_gr_helper2.py
2 # SPDX-License-Identifier: ISC
5 # Copyright (c) 2021 by VMware, Inc. ("VMware")
6 # Used Copyright (c) 2018 by Network Device Education Foundation, Inc.
7 # ("NetDEF") in this file.
11 """OSPF Basic Functionality Automation."""
17 # Save the Current Working Directory to find configuration files.
18 CWD
= os
.path
.dirname(os
.path
.realpath(__file__
))
19 sys
.path
.append(os
.path
.join(CWD
, "../"))
21 # pylint: disable=C0413
22 # Import topogen and topotest helpers
23 from lib
.topogen
import Topogen
, get_topogen
25 # Import topoJson from lib, to create topology and initial configuration
26 from lib
.common_config
import (
30 reset_config_on_routers
,
32 create_interfaces_cfg
,
33 scapy_send_raw_packet
,
36 from lib
.topolog
import logger
37 from lib
.topojson
import build_config_from_json
39 from lib
.ospf
import (
42 verify_ospf_gr_helper
,
46 pytestmark
= [pytest
.mark
.ospfd
]
59 Please view in a fixed-width font such as Courier.
60 Topo : Broadcast Networks
62 +---+ +---+ +---+ +---+
63 |R0 + +R1 + +R2 + +R3 |
64 +-+-+ +-+-+ +-+-+ +-+-+
67 --+-----------+--------------+---------------+-----
72 TC1. Verify by default helper support is disabled for FRR ospf
73 TC2. OSPF GR on Broadcast : Verify DUT enters Helper mode when neighbor
74 sends grace lsa, helps RR to restart gracefully (RR = DR)
75 TC3. OSPF GR on Broadcast : Verify DUT enters Helper mode when neighbor
76 sends grace lsa, helps RR to restart gracefully (RR = BDR)
77 TC4. OSPF GR on Broadcast : Verify DUT enters Helper mode when neighbor
78 sends grace lsa, helps RR to restart gracefully (RR = DRother)
79 TC5. OSPF GR on P2P : Verify DUT enters Helper mode when neighbor sends
80 grace lsa, helps RR to restart gracefully.
81 TC6. Verify all the show commands newly introducted as part of ospf
82 helper support - Json Key verification wrt to show commands.
83 TC7. Verify helper when grace lsa is received with different configured
84 value in process level (higher, lower, grace lsa timer above 1800)
85 TC8. Verify helper functionality when dut is helping RR and new grace lsa
90 def setup_module(mod
):
92 Sets up the pytest environment
96 global topo
, intf
, intf1
, sw_name
, pkt
97 testsuite_run_time
= time
.asctime(time
.localtime(time
.time()))
98 logger
.info("Testsuite start time: {}".format(testsuite_run_time
))
101 logger
.info("Running setup_module to create topology")
103 # This function initiates the topology build with Topogen...
104 json_file
= "{}/ospf_gr_helper.json".format(CWD
)
105 tgen
= Topogen(json_file
, mod
.__name
__)
107 topo
= tgen
.json_topo
108 # ... and here it calls Mininet initialization functions.
110 # Starting topology, create tmp files which are loaded to routers
111 # to start daemons and then start routers
114 # Creating configuration from JSON
115 build_config_from_json(tgen
, topo
)
117 # Don't run this test if we have any failure.
118 if tgen
.routers_have_failure():
119 pytest
.skip(tgen
.errors
)
121 ospf_covergence
= verify_ospf_neighbor(tgen
, topo
, lan
=True)
122 assert ospf_covergence
is True, "setup_module :Failed \n Error:" " {}".format(
127 intf
= topo
["routers"]["r0"]["links"][sw_name
]["interface"]
128 intf1
= topo
["routers"]["r1"]["links"][sw_name
]["interface"]
129 pkt
= topo
["routers"]["r1"]["opq_lsa_hex"]
131 logger
.info("Running setup_module() done")
134 def teardown_module():
135 """Teardown the pytest environment"""
137 logger
.info("Running teardown_module to delete topology")
142 # Stop toplogy and Remove tmp files
146 # OSError exception is raised when mininet tries to stop switch
147 # though switch is stopped once but mininet tries to stop same
148 # switch again, where it ended up with exception
153 """delete ospf process after each test"""
155 step("Delete ospf process")
156 for rtr
in topo
["routers"]:
157 ospf_del
= {rtr
: {"ospf": {"delete": True}}}
158 result
= create_router_ospf(tgen
, topo
, ospf_del
)
159 assert result
is True, "Testcase: Failed \n Error: {}".format(result
)
162 # ##################################
163 # Test cases start here.
164 # ##################################
167 def test_ospf_gr_helper_tc3_p1(request
):
169 OSPF GR on Broadcast : Verify DUT enters Helper mode when neighbor
170 sends grace lsa, helps RR to restart gracefully (RR = BDR)
172 tc_name
= request
.node
.name
173 write_test_header(tc_name
)
176 # Don't run this test if we have any failure.
177 if tgen
.routers_have_failure():
178 pytest
.skip(tgen
.errors
)
180 global topo
, intf
, intf1
, pkt
182 step("Bring up the base config as per the topology")
184 "Configure DR priority as 99 in RR , DUT dr priority = 98 "
185 "& reset ospf process in all the routers"
187 reset_config_on_routers(tgen
)
188 ospf_covergence
= verify_ospf_neighbor(tgen
, topo
, lan
=True)
190 ospf_covergence
is True
191 ), "OSPF is not after reset config \n Error:" " {}".format(ospf_covergence
)
193 "Configure DR pririty 100 on R0 and clear ospf neighbors " "on all the routers."
200 "interface": topo
["routers"]["r0"]["links"][sw_name
]["interface"],
201 "ospf": {"priority": 100},
207 result
= create_interfaces_cfg(tgen
, input_dict
)
208 assert result
is True, "Testcase {} :Failed \n Error: {}".format(tc_name
, result
)
210 step("Clear ospf neighbours in all routers")
211 for rtr
in topo
["routers"]:
212 clear_ospf(tgen
, rtr
)
214 step("Verify that DR election is triggered and R0 is elected as DR")
219 "r1": {"state": "Full", "role": "Backup"},
220 "r2": {"state": "Full", "role": "DROther"},
221 "r3": {"state": "Full", "role": "DROther"},
227 result
= verify_ospf_neighbor(tgen
, topo
, dut
, input_dict
, lan
=True)
228 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
231 "r0": {"ospf": {"graceful-restart": {"helper enable": [], "opaque": True}}}
233 result
= create_router_ospf(tgen
, topo
, ospf_gr_r0
)
234 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
237 "r1": {"ospf": {"graceful-restart": {"helper enable": [], "opaque": True}}}
239 result
= create_router_ospf(tgen
, topo
, ospf_gr_r1
)
240 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
242 step("Verify that DUT enters into helper mode.")
244 input_dict
= {"activeRestarterCnt": 1}
245 gracelsa_sent
= False
248 while not gracelsa_sent
and repeat
< Iters
:
249 gracelsa_sent
= scapy_send_raw_packet(tgen
, topo
, "r1", intf1
, pkt
)
250 result
= verify_ospf_gr_helper(tgen
, topo
, dut
, input_dict
)
251 if isinstance(result
, str):
253 gracelsa_sent
= False
255 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
258 write_test_footer(tc_name
)
261 def test_ospf_gr_helper_tc4_p1(request
):
263 OSPF GR on Broadcast : Verify DUT enters Helper mode when neighbor
264 sends grace lsa, helps RR to restart gracefully (RR = DRother)
266 tc_name
= request
.node
.name
267 write_test_header(tc_name
)
270 # Don't run this test if we have any failure.
271 if tgen
.routers_have_failure():
272 pytest
.skip(tgen
.errors
)
274 global topo
, intf
, intf1
, pkt
276 step("Bring up the base config as per the topology")
278 "Configure DR priority as 99 in RR , DUT dr priority = 98 "
279 "& reset ospf process in all the routers"
281 reset_config_on_routers(tgen
)
282 ospf_covergence
= verify_ospf_neighbor(tgen
, topo
, lan
=True)
284 ospf_covergence
is True
285 ), "OSPF is not after reset config \n Error:" " {}".format(ospf_covergence
)
287 "Configure DR pririty 100 on R0 and clear ospf neighbors " "on all the routers."
294 "interface": topo
["routers"]["r0"]["links"][sw_name
]["interface"],
295 "ospf": {"priority": 0},
301 result
= create_interfaces_cfg(tgen
, input_dict
)
302 assert result
is True, "Testcase {} :Failed \n Error: {}".format(tc_name
, result
)
304 step("Clear ospf neighbours in all routers")
305 for rtr
in topo
["routers"]:
306 clear_ospf(tgen
, rtr
)
308 step("Verify that DR election is triggered and R0 is elected as 2-Way")
313 "r1": {"state": "Full", "role": "DR"},
314 "r2": {"state": "2-Way", "role": "DROther"},
315 "r3": {"state": "2-Way", "role": "DROther"},
321 result
= verify_ospf_neighbor(tgen
, topo
, dut
, input_dict
, lan
=True)
322 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
325 "r0": {"ospf": {"graceful-restart": {"helper enable": [], "opaque": True}}}
327 result
= create_router_ospf(tgen
, topo
, ospf_gr_r0
)
328 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
331 "r1": {"ospf": {"graceful-restart": {"helper enable": [], "opaque": True}}}
333 result
= create_router_ospf(tgen
, topo
, ospf_gr_r1
)
334 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
336 step("Verify that DUT enters into helper mode.")
338 input_dict
= {"activeRestarterCnt": 1}
339 gracelsa_sent
= False
342 while not gracelsa_sent
and repeat
< Iters
:
343 gracelsa_sent
= scapy_send_raw_packet(tgen
, topo
, "r1", intf1
, pkt
)
344 result
= verify_ospf_gr_helper(tgen
, topo
, dut
, input_dict
)
345 if isinstance(result
, str):
347 gracelsa_sent
= False
349 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
353 write_test_footer(tc_name
)
356 if __name__
== "__main__":
357 args
= ["-s"] + sys
.argv
[1:]
358 sys
.exit(pytest
.main(args
))