]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/example_topojson_test/test_topo_json_single_link_loopback/test_example_topojson.py
doc: Add `show ipv6 rpf X:X::X:X` command to docs
[mirror_frr.git] / tests / topotests / example_topojson_test / test_topo_json_single_link_loopback / test_example_topojson.py
1 #!/usr/bin/env python
2
3 #
4 # Copyright (c) 2019 by VMware, Inc. ("VMware")
5 # Used Copyright (c) 2018 by Network Device Education Foundation, Inc.
6 # ("NetDEF") in this file.
7 #
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
11 # in all copies.
12 #
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
20 # OF THIS SOFTWARE.
21 #
22
23 """
24 <example>.py: Test <example tests>.
25 """
26
27 import os
28 import sys
29 import time
30 import json
31 import pytest
32
33 # Save the Current Working Directory to find configuration files.
34 CWD = os.path.dirname(os.path.realpath(__file__))
35 sys.path.append(os.path.join(CWD, "../"))
36 sys.path.append(os.path.join(CWD, "../../"))
37
38 # pylint: disable=C0413
39 # Import topogen and topotest helpers
40 from lib.topogen import Topogen, get_topogen
41
42 # Required to instantiate the topology builder class.
43
44 # Import topoJson from lib, to create topology and initial configuration
45 from lib.common_config import (
46 start_topology,
47 write_test_header,
48 write_test_footer,
49 verify_rib,
50 )
51 from lib.topolog import logger
52 from lib.bgp import verify_bgp_convergence
53 from lib.topojson import build_topo_from_json, build_config_from_json
54
55
56 # TODO: select markers based on daemons used during test
57 # pytest module level markers
58 """
59 pytestmark = pytest.mark.bfdd # single marker
60 pytestmark = [
61 pytest.mark.bgpd,
62 pytest.mark.ospfd,
63 pytest.mark.ospf6d
64 ] # multiple markers
65 """
66
67
68 # Reading the data from JSON File for topology and configuration creation
69 jsonFile = "{}/example_topojson.json".format(CWD)
70
71 try:
72 with open(jsonFile, "r") as topoJson:
73 topo = json.load(topoJson)
74 except IOError:
75 assert False, "Could not read file {}".format(jsonFile)
76
77 # Global variables
78 bgp_convergence = False
79 input_dict = {}
80
81
82 def build_topo(tgen):
83 "Build function"
84
85 # This function only purpose is to create topology
86 # as defined in input json file.
87 #
88 # Example
89 #
90 # Creating 2 routers having single links in between,
91 # which is used to establised BGP neighborship
92
93 # Building topology from json file
94 build_topo_from_json(tgen, topo)
95
96
97 def setup_module(mod):
98 """
99 Sets up the pytest environment
100
101 * `mod`: module name
102 """
103
104 testsuite_run_time = time.asctime(time.localtime(time.time()))
105 logger.info("Testsuite start time: {}".format(testsuite_run_time))
106 logger.info("=" * 40)
107
108 logger.info("Running setup_module to create topology")
109
110 # This function initiates the topology build with Topogen...
111 tgen = Topogen(build_topo, mod.__name__)
112 # ... and here it calls Mininet initialization functions.
113
114 # Starting topology, create tmp files which are loaded to routers
115 # to start daemons and then start routers
116 start_topology(tgen)
117
118 # This function only purpose is to create configuration
119 # as defined in input json file.
120 #
121 # Example
122 #
123 # Creating configuration defined in input JSON
124 # file, example, BGP config, interface config, static routes
125 # config, prefix list config
126
127 # Creating configuration from JSON
128 build_config_from_json(tgen, topo)
129
130 logger.info("Running setup_module() done")
131
132
133 def teardown_module(mod):
134 """
135 Teardown the pytest environment
136
137 * `mod`: module name
138 """
139
140 logger.info("Running teardown_module to delete topology")
141
142 tgen = get_topogen()
143
144 # Stop toplogy and Remove tmp files
145 tgen.stop_topology()
146
147
148 def test_bgp_convergence(request):
149 "Test BGP daemon convergence"
150
151 tgen = get_topogen()
152 global bgp_convergence
153 # test case name
154 tc_name = request.node.name
155 write_test_header(tc_name)
156
157 # Don't run this test if we have any failure.
158 if tgen.routers_have_failure():
159 pytest.skip(tgen.errors)
160
161 # Api call verify whether BGP is converged
162 bgp_convergence = verify_bgp_convergence(tgen, topo)
163 assert (
164 bgp_convergence is True
165 ), "test_bgp_convergence failed.. \n" " Error: {}".format(bgp_convergence)
166
167 logger.info("BGP is converged successfully \n")
168 write_test_footer(tc_name)
169
170
171 def test_static_routes(request):
172 "Test to create and verify static routes."
173
174 tgen = get_topogen()
175 if bgp_convergence is not True:
176 pytest.skip("skipped because of BGP Convergence failure")
177
178 # test case name
179 tc_name = request.node.name
180 write_test_header(tc_name)
181
182 # Static routes are created as part of initial configuration,
183 # verifying RIB
184 dut = "r3"
185 next_hop = ["10.0.0.1", "10.0.0.5"]
186 input_dict = {
187 "r1": {
188 "static_routes": [
189 {
190 "network": "100.0.20.1/32",
191 "no_of_ip": 9,
192 "admin_distance": 100,
193 "next_hop": "10.0.0.1",
194 }
195 ]
196 }
197 }
198 # Uncomment below to debug
199 # tgen.mininet_cli()
200 result = verify_rib(tgen, "ipv4", dut, input_dict, next_hop=next_hop)
201 assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
202
203 write_test_footer(tc_name)
204
205
206 if __name__ == "__main__":
207 args = ["-s"] + sys.argv[1:]
208 sys.exit(pytest.main(args))