]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/bgp_multiview_topo1/test_bgp_multiview_topo1.py
2f3421d184e0d7fd71248eff7998663763400035
[mirror_frr.git] / tests / topotests / bgp_multiview_topo1 / test_bgp_multiview_topo1.py
1 #!/usr/bin/env python
2 # SPDX-License-Identifier: ISC
3
4 #
5 # test_bgp_multiview_topo1.py
6 # Part of NetDEF Topology Tests
7 #
8 # Copyright (c) 2016 by
9 # Network Device Education Foundation, Inc. ("NetDEF")
10 #
11
12 r"""
13 test_bgp_multiview_topo1.py: Simple FRR Route-Server Test
14
15 +----------+ +----------+ +----------+ +----------+ +----------+
16 | peer1 | | peer2 | | peer3 | | peer4 | | peer5 |
17 | AS 65001 | | AS 65002 | | AS 65003 | | AS 65004 | | AS 65005 |
18 +-----+----+ +-----+----+ +-----+----+ +-----+----+ +-----+----+
19 | .1 | .2 | .3 | .4 | .5
20 | ______/ / / _________/
21 \ / ________________/ / /
22 | | / _________________________/ / +----------+
23 | | | / __________________________/ ___| peer6 |
24 | | | | / ____________________________/.6 | AS 65006 |
25 | | | | | / _________________________ +----------+
26 | | | | | | / __________________ \ +----------+
27 | | | | | | | / \ \___| peer7 |
28 | | | | | | | | \ .7 | AS 65007 |
29 ~~~~~~~~~~~~~~~~~~~~~ \ +----------+
30 ~~ SW1 ~~ \ +----------+
31 ~~ Switch ~~ \_____| peer8 |
32 ~~ 172.16.1.0/24 ~~ .8 | AS 65008 |
33 ~~~~~~~~~~~~~~~~~~~~~ +----------+
34 |
35 | .254
36 +---------+---------+
37 | FRR R1 |
38 | BGP Multi-View |
39 | Peer 1-3 > View 1 |
40 | Peer 4-5 > View 2 |
41 | Peer 6-8 > View 3 |
42 +---------+---------+
43 | .1
44 |
45 ~~~~~~~~~~~~~ Stub Network is redistributed
46 ~~ SW0 ~~ into each BGP view with different
47 ~~ 172.20.0.1/28 ~~ attributes (using route-map)
48 ~~ Stub Switch ~~
49 ~~~~~~~~~~~~~
50 """
51
52 import json
53 import os
54 import sys
55 import pytest
56 import json
57 from time import sleep
58
59 from functools import partial
60
61 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
62 from lib import topotest
63 from lib.topogen import get_topogen, Topogen
64 from lib.common_config import step
65
66
67 pytestmark = [pytest.mark.bgpd]
68
69
70 fatal_error = ""
71
72
73 #####################################################
74 ##
75 ## Network Topology Definition
76 ##
77 #####################################################
78
79
80 def build_topo(tgen):
81 # Setup Routers
82 router = tgen.add_router("r1")
83
84 # Setup Provider BGP peers
85 peer = {}
86 for i in range(1, 9):
87 peer[i] = tgen.add_exabgp_peer(
88 "peer%s" % i, ip="172.16.1.%s/24" % i, defaultRoute="via 172.16.1.254"
89 )
90
91 # First switch is for a dummy interface (for local network)
92 switch = tgen.add_switch("sw0")
93 switch.add_link(router, nodeif="r1-stub")
94
95 # Second switch is for connection to all peering routers
96 switch = tgen.add_switch("sw1")
97 switch.add_link(router, nodeif="r1-eth0")
98 for j in range(1, 9):
99 switch.add_link(peer[j], nodeif="peer%s-eth0" % j)
100
101
102 #####################################################
103 ##
104 ## Tests starting
105 ##
106 #####################################################
107
108
109 def setup_module(module):
110 thisDir = os.path.dirname(os.path.realpath(__file__))
111 tgen = Topogen(build_topo, module.__name__)
112 tgen.start_topology()
113
114 # Starting Routers
115 router = tgen.net["r1"]
116 router.loadConf("zebra", "%s/r1/zebra.conf" % thisDir)
117 router.loadConf("bgpd", "%s/r1/bgpd.conf" % thisDir)
118 tgen.gears["r1"].start()
119
120 # Starting PE Hosts and init ExaBGP on each of them
121 peer_list = tgen.exabgp_peers()
122 for pname, peer in peer_list.items():
123 peer_dir = os.path.join(thisDir, pname)
124 env_file = os.path.join(thisDir, "exabgp.env")
125 peer.start(peer_dir, env_file)
126
127
128 def teardown_module(module):
129 tgen = get_topogen()
130 tgen.stop_topology()
131
132
133 def test_router_running():
134 tgen = get_topogen()
135
136 if tgen.routers_have_failure():
137 pytest.skip(tgen.errors)
138
139
140 def test_bgp_converge():
141 "Check for BGP converged on all peers and BGP views"
142
143 tgen = get_topogen()
144
145 if tgen.routers_have_failure():
146 pytest.skip(tgen.errors)
147
148 # Wait for BGP to converge (All Neighbors in either Full or TwoWay State)
149 step("Verify for BGP to converge")
150
151 timeout = 125
152 while timeout > 0:
153 print("Timeout in %s: " % timeout),
154 sys.stdout.flush()
155 # Look for any node not yet converged
156 for i in range(1, 2):
157 for view in range(1, 4):
158 notConverged = tgen.net["r%s" % i].cmd(
159 r'vtysh -c "show ip bgp view %s summary" 2> /dev/null | grep ^[0-9] | grep -vP " 11\s+(\d+)"'
160 % view
161 )
162 if notConverged:
163 print("Waiting for r%s, view %s" % (i, view))
164 sys.stdout.flush()
165 break
166 if notConverged:
167 break
168 if notConverged:
169 sleep(5)
170 timeout -= 5
171 else:
172 print("Done")
173 break
174 else:
175 # Bail out with error if a router fails to converge
176 bgpStatus = tgen.net["r%s" % i].cmd(
177 'vtysh -c "show ip bgp view %s summary"' % view
178 )
179 assert False, "BGP did not converge:\n%s" % bgpStatus
180
181 tgen.routers_have_failure()
182
183
184 def test_bgp_routingTable():
185 tgen = get_topogen()
186
187 if tgen.routers_have_failure():
188 pytest.skip(tgen.errors)
189
190 thisDir = os.path.dirname(os.path.realpath(__file__))
191
192 step("Verifying BGP Routing Tables")
193
194 router = tgen.gears["r1"]
195 for view in range(1, 4):
196 json_file = "{}/{}/view_{}.json".format(thisDir, router.name, view)
197 expected = json.loads(open(json_file).read())
198 test_func = partial(
199 topotest.router_json_cmp,
200 router,
201 "show ip bgp view {} json".format(view),
202 expected,
203 )
204 _, result = topotest.run_and_expect(test_func, None, count=5, wait=1)
205 assertmsg = "Routing Table verification failed for router {}, view {}".format(
206 router.name, view
207 )
208 assert result is None, assertmsg
209
210 tgen.routers_have_failure()
211
212
213 def test_shutdown_check_memleak():
214 tgen = get_topogen()
215 if not tgen.is_memleak_enabled():
216 pytest.skip("Memory leak test/report is disabled")
217
218 tgen.report_memory_leaks()
219
220
221 if __name__ == "__main__":
222 # To suppress tracebacks, either use the following pytest call or add "--tb=no" to cli
223 # retval = pytest.main(["-s", "--tb=no"])
224 retval = pytest.main(["-s"])
225 sys.exit(retval)