]>
git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/ldp_vpls_topo1/test_ldp_vpls_topo1.py
2 # SPDX-License-Identifier: ISC
5 # test_ldp_vpls_topo1.py
6 # Part of NetDEF Topology Tests
8 # Copyright (c) 2017 by
9 # Network Device Education Foundation, Inc. ("NetDEF")
13 test_ldp_vpls_topo1.py:
15 +---------+ +---------+
19 +---------+ +---------+
20 ce1-eth0 (172.16.1.1/24)| |ce2-eth0 (172.16.1.2/24)
24 +---------+ 10.0.1.0/24 +---------+
26 | RT1 +----------------+ RT2 |
27 | 1.1.1.1 | rt2-eth1| 2.2.2.2 |
29 +---------+ +---------+
33 10.0.2.0/24| +---------+ |10.0.3.0/24
36 +--------+ 3.3.3.3 +-------+
42 ce3-eth0 (172.16.1.3/24)|
54 from functools
import partial
56 # Save the Current Working Directory to find configuration files.
57 CWD
= os
.path
.dirname(os
.path
.realpath(__file__
))
58 sys
.path
.append(os
.path
.join(CWD
, "../"))
60 # pylint: disable=C0413
61 # Import topogen and topotest helpers
62 from lib
import topotest
63 from lib
.topogen
import Topogen
, TopoRouter
, get_topogen
64 from lib
.topolog
import logger
66 # Required to instantiate the topology builder class.
68 pytestmark
= [pytest
.mark
.ldpd
, pytest
.mark
.ospfd
]
77 for router
in ["ce1", "ce2", "ce3", "r1", "r2", "r3"]:
78 tgen
.add_router(router
)
83 switch
= tgen
.add_switch("s1")
84 switch
.add_link(tgen
.gears
["ce1"])
85 switch
.add_link(tgen
.gears
["r1"])
87 switch
= tgen
.add_switch("s2")
88 switch
.add_link(tgen
.gears
["ce2"])
89 switch
.add_link(tgen
.gears
["r2"])
91 switch
= tgen
.add_switch("s3")
92 switch
.add_link(tgen
.gears
["ce3"])
93 switch
.add_link(tgen
.gears
["r3"])
95 switch
= tgen
.add_switch("s4")
96 switch
.add_link(tgen
.gears
["r1"])
97 switch
.add_link(tgen
.gears
["r2"])
99 switch
= tgen
.add_switch("s5")
100 switch
.add_link(tgen
.gears
["r1"])
101 switch
.add_link(tgen
.gears
["r3"])
103 switch
= tgen
.add_switch("s6")
104 switch
.add_link(tgen
.gears
["r2"])
105 switch
.add_link(tgen
.gears
["r3"])
108 def setup_module(mod
):
109 "Sets up the pytest environment"
110 tgen
= Topogen(build_topo
, mod
.__name
__)
111 tgen
.start_topology()
113 router_list
= tgen
.routers()
115 # For all registered routers, load the zebra configuration file
116 for rname
, router
in router_list
.items():
118 TopoRouter
.RD_ZEBRA
, os
.path
.join(CWD
, "{}/zebra.conf".format(rname
))
120 # Don't start ospfd and ldpd in the CE nodes
121 if router
.name
[0] == "r":
123 TopoRouter
.RD_OSPF
, os
.path
.join(CWD
, "{}/ospfd.conf".format(rname
))
126 TopoRouter
.RD_LDP
, os
.path
.join(CWD
, "{}/ldpd.conf".format(rname
))
132 def teardown_module(mod
):
133 "Teardown the pytest environment"
136 # This function tears down the whole topology.
140 def router_compare_json_output(rname
, command
, reference
, count
=80, wait
=1):
141 "Compare router JSON output"
143 logger
.info('Comparing router "%s" "%s" output', rname
, command
)
146 filename
= "{}/{}/{}".format(CWD
, rname
, reference
)
147 expected
= json
.loads(open(filename
).read())
149 # Run test function until we get an result.
150 test_func
= partial(topotest
.router_json_cmp
, tgen
.gears
[rname
], command
, expected
)
151 _
, diff
= topotest
.run_and_expect(test_func
, None, count
, wait
)
152 assertmsg
= '"{}" JSON output mismatches the expected result'.format(rname
)
153 assert diff
is None, assertmsg
156 def test_ospf_convergence():
157 logger
.info("Test: check OSPF adjacencies")
160 # Skip if previous fatal error condition is raised
161 if tgen
.routers_have_failure():
162 pytest
.skip(tgen
.errors
)
164 for rname
in ["r1", "r2", "r3"]:
165 router_compare_json_output(
166 rname
, "show ip ospf neighbor json", "show_ip_ospf_neighbor.json"
171 logger
.info("Test: verify RIB")
174 # Skip if previous fatal error condition is raised
175 if tgen
.routers_have_failure():
176 pytest
.skip(tgen
.errors
)
178 for rname
in ["r1", "r2", "r3"]:
179 router_compare_json_output(rname
, "show ip route json", "show_ip_route.ref")
182 def test_ldp_adjacencies():
183 logger
.info("Test: verify LDP adjacencies")
186 # Skip if previous fatal error condition is raised
187 if tgen
.routers_have_failure():
188 pytest
.skip(tgen
.errors
)
190 for rname
in ["r1", "r2", "r3"]:
191 router_compare_json_output(
192 rname
, "show mpls ldp discovery json", "show_ldp_discovery.ref"
196 def test_ldp_neighbors():
197 logger
.info("Test: verify LDP neighbors")
200 # Skip if previous fatal error condition is raised
201 if tgen
.routers_have_failure():
202 pytest
.skip(tgen
.errors
)
204 for rname
in ["r1", "r2", "r3"]:
205 router_compare_json_output(
206 rname
, "show mpls ldp neighbor json", "show_ldp_neighbor.ref"
210 def test_ldp_bindings():
211 logger
.info("Test: verify LDP bindings")
214 # Skip if previous fatal error condition is raised
215 if tgen
.routers_have_failure():
216 pytest
.skip(tgen
.errors
)
218 for rname
in ["r1", "r2", "r3"]:
219 router_compare_json_output(
220 rname
, "show mpls ldp binding json", "show_ldp_binding.ref"
224 def test_ldp_pwid_bindings():
225 logger
.info("Test: verify LDP PW-ID bindings")
228 # Skip if previous fatal error condition is raised
229 if tgen
.routers_have_failure():
230 pytest
.skip(tgen
.errors
)
232 for rname
in ["r1", "r2", "r3"]:
233 router_compare_json_output(
234 rname
, "show l2vpn atom binding json", "show_l2vpn_binding.ref"
238 def test_ldp_pseudowires():
239 logger
.info("Test: verify LDP pseudowires")
242 # Skip if previous fatal error condition is raised
243 if tgen
.routers_have_failure():
244 pytest
.skip(tgen
.errors
)
246 for rname
in ["r1", "r2", "r3"]:
247 router_compare_json_output(
248 rname
, "show l2vpn atom vc json", "show_l2vpn_vc.ref"
252 def test_ldp_pseudowires_after_link_down():
253 logger
.info("Test: verify LDP pseudowires after r1-r2 link goes down")
256 # Skip if previous fatal error condition is raised
257 if tgen
.routers_have_failure():
258 pytest
.skip(tgen
.errors
)
260 # Shut down r1-r2 link */
263 tgen
.gears
[rname
].peer_link_enable("r1-eth1", False)
264 router_compare_json_output(
266 "show ip route json",
267 "show_ip_route_after_link_down.ref",
271 # check if the pseudowire is still up (using an alternate path
272 # for nexthop resolution). Give some extra wait time.
273 for rname
in ["r1", "r2", "r3"]:
274 router_compare_json_output(
275 rname
, "show l2vpn atom vc json", "show_l2vpn_vc.ref", count
=160, wait
=1
279 # Memory leak test template
280 def test_memory_leak():
281 "Run the memory leak test and report results."
283 if not tgen
.is_memleak_enabled():
284 pytest
.skip("Memory leak test/report is disabled")
286 tgen
.report_memory_leaks()
289 if __name__
== "__main__":
290 args
= ["-s"] + sys
.argv
[1:]
291 sys
.exit(pytest
.main(args
))