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
66 pytestmark
= [pytest
.mark
.ospfd
, pytest
.mark
.staticd
]
71 # Reading the data from JSON File for topology creation
72 jsonFile
= "{}/ospf_nssa.json".format(CWD
)
74 with
open(jsonFile
, "r") as topoJson
:
75 topo
= json
.load(topoJson
)
77 assert False, "Could not read file {}".format(jsonFile
)
89 Please view in a fixed-width font such as Courier.
91 +R1 +------------+R2 |
100 +R0 +-------------+R3 |
106 1. OSPF Learning - Verify OSPF can learn different types of LSA and
107 processes them.[Edge learning different types of LSAs]
108 2. Verify that ospf non back bone area can be configured as NSSA area
109 3. Verify that ospf NSSA area DUT is capable receiving & processing
114 class CreateTopo(Topo
):
116 Test topology builder.
118 * `Topo`: Topology object
121 def build(self
, *_args
, **_opts
):
122 """Build function."""
123 tgen
= get_topogen(self
)
125 # Building topology from json file
126 build_topo_from_json(tgen
, topo
)
129 def setup_module(mod
):
131 Sets up the pytest environment
136 testsuite_run_time
= time
.asctime(time
.localtime(time
.time()))
137 logger
.info("Testsuite start time: {}".format(testsuite_run_time
))
138 logger
.info("=" * 40)
140 logger
.info("Running setup_module to create topology")
142 # This function initiates the topology build with Topogen...
143 tgen
= Topogen(CreateTopo
, mod
.__name
__)
144 # ... and here it calls Mininet initialization functions.
146 # get list of daemons needs to be started for this suite.
147 daemons
= topo_daemons(tgen
, topo
)
149 # Starting topology, create tmp files which are loaded to routers
150 # to start deamons and then start routers
151 start_topology(tgen
, daemons
)
153 # Creating configuration from JSON
154 build_config_from_json(tgen
, topo
)
156 # Don't run this test if we have any failure.
157 if tgen
.routers_have_failure():
158 pytest
.skip(tgen
.errors
)
159 # Api call verify whether OSPF is converged
160 ospf_covergence
= verify_ospf_neighbor(tgen
, topo
)
161 assert ospf_covergence
is True, "setup_module :Failed \n Error:" " {}".format(
165 logger
.info("Running setup_module() done")
168 def teardown_module(mod
):
170 Teardown the pytest environment.
175 logger
.info("Running teardown_module to delete topology")
179 # Stop toplogy and Remove tmp files
183 "Testsuite end time: {}".format(time
.asctime(time
.localtime(time
.time())))
185 logger
.info("=" * 40)
188 # ##################################
189 # Test cases start here.
190 # ##################################
193 def test_ospf_learning_tc15_p0(request
):
194 """Verify OSPF can learn different types of LSA and processes them.
196 OSPF Learning : Edge learning different types of LSAs.
198 tc_name
= request
.node
.name
199 write_test_header(tc_name
)
202 # Don't run this test if we have any failure.
203 if tgen
.routers_have_failure():
204 pytest
.skip(tgen
.errors
)
207 step("Bring up the base config as per the topology")
208 step("Configure area 1 as NSSA Area")
210 reset_config_on_routers(tgen
)
212 step("Verify that Type 3 summary LSA is originated for the same Area 0")
213 ip
= topo
["routers"]["r1"]["links"]["r3-link0"]["ipv4"]
214 ip_net
= str(ipaddress
.ip_interface(u
"{}".format(ip
)).network
)
219 "static_routes": [{"network": ip_net
, "no_of_ip": 1, "routeType": "N IA"}]
224 result
= verify_ospf_rib(tgen
, dut
, input_dict
)
225 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
228 result
= verify_rib(tgen
, "ipv4", dut
, input_dict
, protocol
=protocol
)
229 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
234 {"network": NETWORK
["ipv4"][0], "no_of_ip": 5, "next_hop": "Null0"}
238 result
= create_static_routes(tgen
, input_dict
)
239 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
241 step("Redistribute static route in R2 ospf.")
243 redistribute_ospf(tgen
, topo
, dut
, "static")
245 step("Verify that Type 5 LSA is originated by R2.")
248 result
= verify_rib(tgen
, "ipv4", dut
, input_dict
, protocol
=protocol
)
249 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
251 step("Verify that R0 receives Type 4 summary LSA.")
256 {"network": NETWORK
["ipv4"][0], "no_of_ip": 1, "routeType": "N E2"}
262 result
= verify_ospf_rib(tgen
, dut
, input_dict
)
263 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
265 result
= verify_rib(tgen
, "ipv4", dut
, input_dict
, protocol
=protocol
)
266 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
268 ospf_covergence
= verify_ospf_neighbor(tgen
, topo
)
269 assert ospf_covergence
is True, "setup_module :Failed \n Error:" " {}".format(
273 step("Change area 1 as non nssa area (on the fly changing area" " type on DUT).")
275 for rtr
in ["r1", "r2", "r3"]:
277 rtr
: {"ospf": {"area": [{"id": "0.0.0.2", "type": "nssa", "delete": True}]}}
279 result
= create_router_ospf(tgen
, topo
, input_dict
)
280 assert result
is True, "Testcase {} : Failed \n Error: {}".format(
284 step("Verify that OSPF neighbours are reset after changing area type.")
285 step("Verify that ABR R2 originates type 5 LSA in area 1.")
286 step("Verify that route is calculated and installed in R1.")
291 {"network": NETWORK
["ipv4"][0], "no_of_ip": 1, "routeType": "N E2"}
297 result
= verify_ospf_rib(tgen
, dut
, input_dict
)
298 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
300 result
= verify_rib(tgen
, "ipv4", dut
, input_dict
, protocol
=protocol
)
301 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
303 write_test_footer(tc_name
)
306 if __name__
== "__main__":
307 args
= ["-s"] + sys
.argv
[1:]
308 sys
.exit(pytest
.main(args
))