]> git.proxmox.com Git - mirror_frr.git/blame - tests/topotests/ldp_oc_topo1/test_ldp_oc_topo1.py
*: auto-convert to SPDX License IDs
[mirror_frr.git] / tests / topotests / ldp_oc_topo1 / test_ldp_oc_topo1.py
CommitLineData
418b2885 1#!/usr/bin/env python
acddc0ed 2# SPDX-License-Identifier: ISC
418b2885
KS
3
4#
5# test_ldp_oc_topo1.py
6# Part of NetDEF Topology Tests
7#
8# Copyright (c) 2020 by by Volta Networks
9#
418b2885 10
21b5cd1d 11r"""
622c4996 12test_ldp_oc_topo1.py: Simple FRR LDP Test
418b2885
KS
13
14 +---------+
15 | r1 |
16 | 1.1.1.1 |
17 +----+----+
18 | .1 r1-eth0
19 |
20 ~~~~~~~~~~~~~
21 ~~ sw0 ~~
22 ~~ 10.0.1.0/24 ~~
23 ~~~~~~~~~~~~~
24 |10.0.1.0/24
25 |
26 | .2 r2-eth0
27 +----+----+
28 | r2 |
29 | 2.2.2.2 |
30 +--+---+--+
31 r2-eth2 .2 | | .2 r2-eth1
32 ______/ \______
33 / \
34 ~~~~~~~~~~~~~ ~~~~~~~~~~~~~
35~~ sw2 ~~ ~~ sw1 ~~
36~~ 10.0.3.0/24 ~~ ~~ 10.0.2.0/24 ~~
37 ~~~~~~~~~~~~~ ~~~~~~~~~~~~~
38 | / |
39 \ _________/ |
40 \ / \
41r3-eth1 .3 | | .3 r3-eth0 | .4 r4-eth0
42 +----+--+---+ +----+----+
43 | r3 | | r4 |
44 | 3.3.3.3 | | 4.4.4.4 |
45 +-----------+ +---------+
46"""
47
48import os
49import sys
50import pytest
51import json
418b2885
KS
52from functools import partial
53
54# Save the Current Working Directory to find configuration files.
55CWD = os.path.dirname(os.path.realpath(__file__))
787e7624 56sys.path.append(os.path.join(CWD, "../"))
418b2885
KS
57
58# pylint: disable=C0413
59# Import topogen and topotest helpers
60from lib import topotest
61from lib.topogen import Topogen, TopoRouter, get_topogen
62from lib.topolog import logger
63
64# Required to instantiate the topology builder class.
418b2885 65
3dedee4f 66pytestmark = [pytest.mark.ldpd, pytest.mark.ospfd]
787e7624 67
5980ad0a 68
e82b531d
CH
69def build_topo(tgen):
70 "Build function"
787e7624 71
e82b531d
CH
72 #
73 # Define FRR Routers
74 #
75 for router in ["r1", "r2", "r3", "r4"]:
76 tgen.add_router(router)
418b2885 77
e82b531d
CH
78 #
79 # Define connections
80 #
81 switch = tgen.add_switch("s0")
82 switch.add_link(tgen.gears["r1"])
83 switch.add_link(tgen.gears["r2"])
418b2885 84
e82b531d
CH
85 switch = tgen.add_switch("s1")
86 switch.add_link(tgen.gears["r2"])
87 switch.add_link(tgen.gears["r3"])
88 switch.add_link(tgen.gears["r4"])
418b2885 89
e82b531d
CH
90 switch = tgen.add_switch("s2")
91 switch.add_link(tgen.gears["r2"])
92 switch.add_link(tgen.gears["r3"])
418b2885 93
418b2885
KS
94
95def setup_module(mod):
96 "Sets up the pytest environment"
e82b531d 97 tgen = Topogen(build_topo, mod.__name__)
418b2885
KS
98 tgen.start_topology()
99
100 router_list = tgen.routers()
101
102 # For all registered routers, load the zebra configuration file
e5f0ed14 103 for rname, router in router_list.items():
418b2885 104 router.load_config(
787e7624 105 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
418b2885
KS
106 )
107 # Don't start ospfd and ldpd in the CE nodes
787e7624 108 if router.name[0] == "r":
418b2885 109 router.load_config(
787e7624 110 TopoRouter.RD_OSPF, os.path.join(CWD, "{}/ospfd.conf".format(rname))
418b2885
KS
111 )
112 router.load_config(
787e7624 113 TopoRouter.RD_LDP, os.path.join(CWD, "{}/ldpd.conf".format(rname))
418b2885
KS
114 )
115
116 tgen.start_router()
117
787e7624 118
418b2885
KS
119def teardown_module(mod):
120 "Teardown the pytest environment"
121 tgen = get_topogen()
122
123 # This function tears down the whole topology.
124 tgen.stop_topology()
125
126
127def router_compare_json_output(rname, command, reference):
128 "Compare router JSON output"
129
130 logger.info('Comparing router "%s" "%s" output', rname, command)
131
132 tgen = get_topogen()
787e7624 133 filename = "{}/{}/{}".format(CWD, rname, reference)
418b2885
KS
134 expected = json.loads(open(filename).read())
135
136 # Run test function until we get an result. Wait at most 80 seconds.
787e7624 137 test_func = partial(topotest.router_json_cmp, tgen.gears[rname], command, expected)
418b2885
KS
138 _, diff = topotest.run_and_expect(test_func, None, count=160, wait=0.5)
139
140 assertmsg = '"{}" JSON output mismatches the expected result'.format(rname)
141 assert diff is None, assertmsg
142
787e7624 143
418b2885
KS
144def test_ospf_convergence():
145 logger.info("Test: check OSPF adjacencies")
146
147 tgen = get_topogen()
148
149 # Skip if previous fatal error condition is raised
150 if tgen.routers_have_failure():
151 pytest.skip(tgen.errors)
152
787e7624 153 for rname in ["r1", "r2", "r3", "r4"]:
154 router_compare_json_output(
155 rname, "show ip ospf neighbor json", "show_ip_ospf_neighbor.json"
156 )
157
418b2885
KS
158
159def test_rib():
160 logger.info("Test: verify RIB")
161 tgen = get_topogen()
162
163 # Skip if previous fatal error condition is raised
164 if tgen.routers_have_failure():
165 pytest.skip(tgen.errors)
166
787e7624 167 for rname in ["r1", "r2", "r3", "r4"]:
418b2885
KS
168 router_compare_json_output(rname, "show ip route json", "show_ip_route.ref")
169
787e7624 170
418b2885
KS
171def test_ldp_adjacencies():
172 logger.info("Test: verify LDP adjacencies")
173 tgen = get_topogen()
174
175 # Skip if previous fatal error condition is raised
176 if tgen.routers_have_failure():
177 pytest.skip(tgen.errors)
178
787e7624 179 for rname in ["r1", "r2", "r3", "r4"]:
180 router_compare_json_output(
181 rname, "show mpls ldp discovery json", "show_ldp_discovery.ref"
182 )
183
418b2885
KS
184
185def test_ldp_neighbors():
186 logger.info("Test: verify LDP neighbors")
187 tgen = get_topogen()
188
189 # Skip if previous fatal error condition is raised
190 if tgen.routers_have_failure():
191 pytest.skip(tgen.errors)
192
787e7624 193 for rname in ["r1", "r2", "r3", "r4"]:
194 router_compare_json_output(
195 rname, "show mpls ldp neighbor json", "show_ldp_neighbor.ref"
196 )
197
418b2885
KS
198
199def test_ldp_bindings():
200 logger.info("Test: verify LDP bindings")
201 tgen = get_topogen()
202
203 # Skip if previous fatal error condition is raised
204 if tgen.routers_have_failure():
205 pytest.skip(tgen.errors)
206
787e7624 207 for rname in ["r1", "r2", "r3", "r4"]:
208 router_compare_json_output(
209 rname, "show mpls ldp binding json", "show_ldp_binding.ref"
210 )
211
418b2885
KS
212
213# Memory leak test template
214def test_memory_leak():
215 "Run the memory leak test and report results."
216 tgen = get_topogen()
217 if not tgen.is_memleak_enabled():
787e7624 218 pytest.skip("Memory leak test/report is disabled")
418b2885
KS
219
220 tgen.report_memory_leaks()
221
787e7624 222
223if __name__ == "__main__":
418b2885
KS
224 args = ["-s"] + sys.argv[1:]
225 sys.exit(pytest.main(args))