]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/bfd_topo1/test_bfd_topo1.py
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / tests / topotests / bfd_topo1 / test_bfd_topo1.py
1 #!/usr/bin/env python
2 # SPDX-License-Identifier: ISC
3
4 #
5 # test_bfd_topo1.py
6 # Part of NetDEF Topology Tests
7 #
8 # Copyright (c) 2018 by
9 # Network Device Education Foundation, Inc. ("NetDEF")
10 #
11
12 """
13 test_bfd_topo1.py: Test the FRR BFD daemon.
14 """
15
16 import os
17 import sys
18 import json
19 from functools import partial
20 import pytest
21
22 # Save the Current Working Directory to find configuration files.
23 CWD = os.path.dirname(os.path.realpath(__file__))
24 sys.path.append(os.path.join(CWD, "../"))
25
26 # pylint: disable=C0413
27 # Import topogen and topotest helpers
28 from lib import topotest
29 from lib.topogen import Topogen, TopoRouter, get_topogen
30 from lib.topolog import logger
31
32 pytestmark = [pytest.mark.bfdd, pytest.mark.bgpd]
33
34
35 def setup_module(mod):
36 "Sets up the pytest environment"
37 topodef = {
38 "s1": ("r1", "r2"),
39 "s2": ("r2", "r3"),
40 "s3": ("r2", "r4"),
41 }
42 tgen = Topogen(topodef, mod.__name__)
43 tgen.start_topology()
44
45 router_list = tgen.routers()
46 for rname, router in router_list.items():
47 router.load_config(
48 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
49 )
50 router.load_config(
51 TopoRouter.RD_BFD, os.path.join(CWD, "{}/bfdd.conf".format(rname))
52 )
53 router.load_config(
54 TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
55 )
56
57 # Initialize all routers.
58 tgen.start_router()
59
60 # Verify that we are using the proper version and that the BFD
61 # daemon exists.
62 for router in router_list.values():
63 # Check for Version
64 if router.has_version("<", "5.1"):
65 tgen.set_error("Unsupported FRR version")
66 break
67
68
69 def teardown_module(_mod):
70 "Teardown the pytest environment"
71 tgen = get_topogen()
72 tgen.stop_topology()
73
74
75 def test_bfd_connection():
76 "Assert that the BFD peers can find themselves."
77 tgen = get_topogen()
78 if tgen.routers_have_failure():
79 pytest.skip(tgen.errors)
80
81 logger.info("waiting for bfd peers to go up")
82
83 for router in tgen.routers().values():
84 json_file = "{}/{}/peers.json".format(CWD, router.name)
85 expected = json.loads(open(json_file).read())
86
87 test_func = partial(
88 topotest.router_json_cmp, router, "show bfd peers json", expected
89 )
90 _, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
91 assertmsg = '"{}" JSON output mismatches'.format(router.name)
92 assert result is None, assertmsg
93
94
95 def test_bgp_convergence():
96 "Assert that BGP is converging."
97 tgen = get_topogen()
98 if tgen.routers_have_failure():
99 pytest.skip(tgen.errors)
100
101 logger.info("waiting for bgp peers to go up")
102
103 for router in tgen.routers().values():
104 ref_file = "{}/{}/bgp_summary.json".format(CWD, router.name)
105 expected = json.loads(open(ref_file).read())
106 test_func = partial(
107 topotest.router_json_cmp, router, "show ip bgp summary json", expected
108 )
109 _, res = topotest.run_and_expect(test_func, None, count=125, wait=1.0)
110 assertmsg = "{}: bgp did not converge".format(router.name)
111 assert res is None, assertmsg
112
113
114 def test_bgp_fast_convergence():
115 "Assert that BGP is converging before setting a link down."
116 tgen = get_topogen()
117 if tgen.routers_have_failure():
118 pytest.skip(tgen.errors)
119
120 logger.info("waiting for bgp peers converge")
121
122 for router in tgen.routers().values():
123 ref_file = "{}/{}/bgp_prefixes.json".format(CWD, router.name)
124 expected = json.loads(open(ref_file).read())
125 test_func = partial(
126 topotest.router_json_cmp, router, "show ip bgp json", expected
127 )
128 _, res = topotest.run_and_expect(test_func, None, count=40, wait=0.5)
129 assertmsg = "{}: bgp did not converge".format(router.name)
130 assert res is None, assertmsg
131
132
133 def test_bfd_fast_convergence():
134 """
135 Assert that BFD notices the link down after simulating network
136 failure.
137 """
138 tgen = get_topogen()
139 if tgen.routers_have_failure():
140 pytest.skip(tgen.errors)
141
142 # Disable r1-eth0 link.
143 tgen.gears["r1"].link_enable("r1-eth0", enabled=False)
144
145 # Wait the minimum time we can before checking that BGP/BFD
146 # converged.
147 logger.info("waiting for BFD converge")
148
149 # Check that BGP converged quickly.
150 for router in tgen.routers().values():
151 json_file = "{}/{}/peers.json".format(CWD, router.name)
152 expected = json.loads(open(json_file).read())
153
154 # Load the same file as previous test, but expect R1 to be down.
155 if router.name == "r1":
156 for peer in expected:
157 if peer["peer"] == "192.168.0.2":
158 peer["status"] = "down"
159 else:
160 for peer in expected:
161 if peer["peer"] == "192.168.0.1":
162 peer["status"] = "down"
163
164 test_func = partial(
165 topotest.router_json_cmp, router, "show bfd peers json", expected
166 )
167 _, res = topotest.run_and_expect(test_func, None, count=20, wait=0.5)
168 assertmsg = '"{}" JSON output mismatches'.format(router.name)
169 assert res is None, assertmsg
170
171
172 def test_bgp_fast_reconvergence():
173 "Assert that BGP is converging after setting a link down."
174 tgen = get_topogen()
175 if tgen.routers_have_failure():
176 pytest.skip(tgen.errors)
177
178 logger.info("waiting for BGP re convergence")
179
180 # Check that BGP converged quickly.
181 for router in tgen.routers().values():
182 ref_file = "{}/{}/bgp_prefixes.json".format(CWD, router.name)
183 expected = json.loads(open(ref_file).read())
184
185 # Load the same file as previous test, but set networks to None
186 # to test absence.
187 if router.name == "r1":
188 expected["routes"]["10.254.254.2/32"] = None
189 expected["routes"]["10.254.254.3/32"] = None
190 expected["routes"]["10.254.254.4/32"] = None
191 else:
192 expected["routes"]["10.254.254.1/32"] = None
193
194 test_func = partial(
195 topotest.router_json_cmp, router, "show ip bgp json", expected
196 )
197 _, res = topotest.run_and_expect(test_func, None, count=5, wait=1)
198 assertmsg = "{}: bgp did not converge".format(router.name)
199 assert res is None, assertmsg
200
201
202 def test_memory_leak():
203 "Run the memory leak test and report results."
204 tgen = get_topogen()
205 if not tgen.is_memleak_enabled():
206 pytest.skip("Memory leak test/report is disabled")
207
208 tgen.report_memory_leaks()
209
210
211 if __name__ == "__main__":
212 args = ["-s"] + sys.argv[1:]
213 sys.exit(pytest.main(args))