4 # Copyright (c) 2020 by VMware, Inc. ("VMware")
5 # Used Copyright (c) 2018 by Network Device Education Foundation, Inc.
6 # ("NetDEF") in this file.
8 # Permission to use, copy, modify, and/or distribute this software
9 # for any purpose with or without fee is hereby granted, provided
10 # that the above copyright notice and this permission notice appear
13 # THE SOFTWARE IS PROVIDED "AS IS" AND VMWARE DISCLAIMS ALL WARRANTIES
14 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL VMWARE BE LIABLE FOR
16 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
17 # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
19 # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 """OSPF Basic Functionality Automation."""
26 from lib
.ospf
import (
28 config_ospf_interface
,
32 verify_ospf_interface
,
35 from lib
.topojson
import build_topo_from_json
, build_config_from_json
36 from lib
.topolog
import logger
37 from lib
.common_config
import (
41 reset_config_on_routers
,
46 shutdown_bringup_interface
,
47 create_interfaces_cfg
,
50 from ipaddress
import IPv4Address
51 from lib
.topogen
import Topogen
, get_topogen
52 from mininet
.topo
import Topo
59 # Save the Current Working Directory to find configuration files.
60 CWD
= os
.path
.dirname(os
.path
.realpath(__file__
))
61 sys
.path
.append(os
.path
.join(CWD
, "../"))
62 sys
.path
.append(os
.path
.join(CWD
, "../lib/"))
63 # pylint: disable=C0413
64 # Import topogen and topotest helpers
68 # Reading the data from JSON File for topology creation
69 jsonFile
= "{}/ospf_nssa.json".format(CWD
)
71 with
open(jsonFile
, "r") as topoJson
:
72 topo
= json
.load(topoJson
)
74 assert False, "Could not read file {}".format(jsonFile
)
86 Please view in a fixed-width font such as Courier.
88 +R1 +------------+R2 |
97 +R0 +-------------+R3 |
103 1. OSPF Learning - Verify OSPF can learn different types of LSA and
104 processes them.[Edge learning different types of LSAs]
105 2. Verify that ospf non back bone area can be configured as NSSA area
106 3. Verify that ospf NSSA area DUT is capable receiving & processing
111 class CreateTopo(Topo
):
113 Test topology builder.
115 * `Topo`: Topology object
118 def build(self
, *_args
, **_opts
):
119 """Build function."""
120 tgen
= get_topogen(self
)
122 # Building topology from json file
123 build_topo_from_json(tgen
, topo
)
126 def setup_module(mod
):
128 Sets up the pytest environment
133 testsuite_run_time
= time
.asctime(time
.localtime(time
.time()))
134 logger
.info("Testsuite start time: {}".format(testsuite_run_time
))
135 logger
.info("=" * 40)
137 logger
.info("Running setup_module to create topology")
139 # This function initiates the topology build with Topogen...
140 tgen
= Topogen(CreateTopo
, mod
.__name
__)
141 # ... and here it calls Mininet initialization functions.
143 # get list of daemons needs to be started for this suite.
144 daemons
= topo_daemons(tgen
, topo
)
146 # Starting topology, create tmp files which are loaded to routers
147 # to start deamons and then start routers
148 start_topology(tgen
, daemons
)
150 # Creating configuration from JSON
151 build_config_from_json(tgen
, topo
)
153 # Don't run this test if we have any failure.
154 if tgen
.routers_have_failure():
155 pytest
.skip(tgen
.errors
)
156 # Api call verify whether OSPF is converged
157 ospf_covergence
= verify_ospf_neighbor(tgen
, topo
)
158 assert ospf_covergence
is True, "setup_module :Failed \n Error:" " {}".format(
162 logger
.info("Running setup_module() done")
165 def teardown_module(mod
):
167 Teardown the pytest environment.
172 logger
.info("Running teardown_module to delete topology")
176 # Stop toplogy and Remove tmp files
180 "Testsuite end time: {}".format(time
.asctime(time
.localtime(time
.time())))
182 logger
.info("=" * 40)
185 # ##################################
186 # Test cases start here.
187 # ##################################
190 def test_ospf_learning_tc15_p0(request
):
191 """Verify OSPF can learn different types of LSA and processes them.
193 OSPF Learning : Edge learning different types of LSAs.
195 tc_name
= request
.node
.name
196 write_test_header(tc_name
)
199 # Don't run this test if we have any failure.
200 if tgen
.routers_have_failure():
201 pytest
.skip(tgen
.errors
)
204 step("Bring up the base config as per the topology")
205 step("Configure area 1 as NSSA Area")
207 reset_config_on_routers(tgen
)
209 step("Verify that Type 3 summary LSA is originated for the same Area 0")
210 ip
= topo
["routers"]["r1"]["links"]["r3-link0"]["ipv4"]
211 ip_net
= str(ipaddress
.ip_interface(u
"{}".format(ip
)).network
)
216 "static_routes": [{"network": ip_net
, "no_of_ip": 1, "routeType": "N IA"}]
221 result
= verify_ospf_rib(tgen
, dut
, input_dict
)
222 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
225 result
= verify_rib(tgen
, "ipv4", dut
, input_dict
, protocol
=protocol
)
226 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
231 {"network": NETWORK
["ipv4"][0], "no_of_ip": 5, "next_hop": "Null0"}
235 result
= create_static_routes(tgen
, input_dict
)
236 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
238 step("Redistribute static route in R2 ospf.")
240 redistribute_ospf(tgen
, topo
, dut
, "static")
242 step("Verify that Type 5 LSA is originated by R2.")
245 result
= verify_rib(tgen
, "ipv4", dut
, input_dict
, protocol
=protocol
)
246 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
248 step("Verify that R0 receives Type 4 summary LSA.")
253 {"network": NETWORK
["ipv4"][0], "no_of_ip": 1, "routeType": "N E2"}
259 result
= verify_ospf_rib(tgen
, dut
, input_dict
)
260 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
262 result
= verify_rib(tgen
, "ipv4", dut
, input_dict
, protocol
=protocol
)
263 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
265 ospf_covergence
= verify_ospf_neighbor(tgen
, topo
)
266 assert ospf_covergence
is True, "setup_module :Failed \n Error:" " {}".format(
270 step("Change area 1 as non nssa area (on the fly changing area" " type on DUT).")
272 for rtr
in ["r1", "r2", "r3"]:
274 rtr
: {"ospf": {"area": [{"id": "0.0.0.2", "type": "nssa", "delete": True}]}}
276 result
= create_router_ospf(tgen
, topo
, input_dict
)
277 assert result
is True, "Testcase {} : Failed \n Error: {}".format(
281 step("Verify that OSPF neighbours are reset after changing area type.")
282 step("Verify that ABR R2 originates type 5 LSA in area 1.")
283 step("Verify that route is calculated and installed in R1.")
288 {"network": NETWORK
["ipv4"][0], "no_of_ip": 1, "routeType": "N E2"}
294 result
= verify_ospf_rib(tgen
, dut
, input_dict
)
295 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
297 result
= verify_rib(tgen
, "ipv4", dut
, input_dict
, protocol
=protocol
)
298 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
300 write_test_footer(tc_name
)
303 if __name__
== "__main__":
304 args
= ["-s"] + sys
.argv
[1:]
305 sys
.exit(pytest
.main(args
))