]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/bgp_flowspec/test_bgp_flowspec_topo.py
tests: remove legacy Topo class (fixes many pylint errors)
[mirror_frr.git] / tests / topotests / bgp_flowspec / test_bgp_flowspec_topo.py
1 #!/usr/bin/env python
2
3 #
4 # test_bgp_flowspec_topo.py
5 # Part of NetDEF Topology Tests
6 #
7 # Copyright (c) 2019 by 6WIND
8 #
9 # Permission to use, copy, modify, and/or distribute this software
10 # for any purpose with or without fee is hereby granted, provided
11 # that the above copyright notice and this permission notice appear
12 # in all copies.
13 #
14 # THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
15 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
17 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
18 # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
19 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
20 # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
21 # OF THIS SOFTWARE.
22 #
23
24 """
25 test_bgp_flowspec_topo.py: Test BGP topology with Flowspec EBGP peering
26
27
28 +------+------+
29 | peer1 |
30 | BGP peer 1 |
31 |192.168.0.161|
32 | |
33 +------+------+
34 .2 | r1-eth0
35 |
36 ~~~~~~~~~
37 +---~~ s1 ~~------+
38 ~~ ~~
39 ~~~~~~~~~
40 | 10.0.1.1 r1-eth0
41 | 1001::1 r1-eth0
42 +--------+--------+
43 | r1 |
44 |BGP 192.168.0.162|
45 | |
46 | |
47 | |
48 +-----------------+
49
50 """
51
52 import json
53 import functools
54 import os
55 import sys
56 import pytest
57 import getopt
58
59 # Save the Current Working Directory to find configuration files.
60 CWD = os.path.dirname(os.path.realpath(__file__))
61 sys.path.append(os.path.join(CWD, "../"))
62
63 # pylint: disable=C0413
64 # Import topogen and topotest helpers
65 from lib import topotest
66 from lib.topogen import Topogen, TopoRouter, get_topogen
67 from lib.topolog import logger
68 from lib.lutil import lUtil
69 from lib.lutil import luCommand
70
71 # Required to instantiate the topology builder class.
72 from lib.micronet_compat import Topo
73
74
75 pytestmark = [pytest.mark.bgpd]
76
77
78 #####################################################
79 ##
80 ## Network Topology Definition
81 ##
82 #####################################################
83
84
85 def build_topo(tgen):
86 tgen.add_router("r1")
87
88 # Setup Control Path Switch 1. r1-eth0
89 switch = tgen.add_switch("s1")
90 switch.add_link(tgen.gears["r1"])
91
92 ## Add eBGP ExaBGP neighbors
93 peer_ip = "10.0.1.101" ## peer
94 peer_route = "via 10.0.1.1" ## router
95 peer = tgen.add_exabgp_peer("peer1", ip=peer_ip, defaultRoute=peer_route)
96 switch.add_link(peer)
97
98
99 #####################################################
100 ##
101 ## Tests starting
102 ##
103 #####################################################
104
105
106 def setup_module(module):
107 tgen = Topogen(build_topo, module.__name__)
108
109 tgen.start_topology()
110 # check for zebra capability
111 router = tgen.gears["r1"]
112
113 # Get r1 reference and run Daemons
114 logger.info("Launching BGP and ZEBRA on r1")
115 router = tgen.gears["r1"]
116 router.load_config(
117 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format("r1"))
118 )
119 router.load_config(
120 TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format("r1"))
121 )
122 router.start()
123
124 peer_list = tgen.exabgp_peers()
125 for pname, peer in peer_list.items():
126 peer_dir = os.path.join(CWD, pname)
127 env_file = os.path.join(CWD, "exabgp.env")
128 peer.start(peer_dir, env_file)
129 logger.info(pname)
130
131
132 def teardown_module(module):
133 tgen = get_topogen()
134 tgen.stop_topology()
135
136
137 def test_bgp_convergence():
138 "Test for BGP topology convergence"
139 tgen = get_topogen()
140
141 # Skip if previous fatal error condition is raised
142
143 if tgen.routers_have_failure():
144 pytest.skip(tgen.errors)
145
146 logger.info("waiting for bgp convergence")
147
148 # Expected result
149 router = tgen.gears["r1"]
150 reffile = os.path.join(CWD, "r1/summary.txt")
151
152 expected = json.loads(open(reffile).read())
153
154 test_func = functools.partial(
155 topotest.router_json_cmp, router, "show bgp summary json", expected
156 )
157 _, res = topotest.run_and_expect(test_func, None, count=90, wait=0.5)
158 assertmsg = "BGP router network did not converge"
159 assert res is None, assertmsg
160
161
162 def test_bgp_flowspec():
163 tgen = get_topogen()
164
165 # Skip if previous fatal error condition is raised
166 if tgen.routers_have_failure():
167 pytest.skip(tgen.errors)
168
169 router = tgen.gears["r1"]
170
171 logger.info("Check BGP FS entry for 3.3.3.3 with redirect IP")
172 output = router.vtysh_cmd(
173 "show bgp ipv4 flowspec 3.3.3.3", isjson=False, daemon="bgpd"
174 )
175 logger.info(output)
176 if (
177 "NH 50.0.0.2" not in output
178 or "FS:redirect IP" not in output
179 or "Packet Length < 200" not in output
180 ):
181 assertmsg = "traffic to 3.3.3.3 should have been detected as FS entry. NOK"
182 assert 0, assertmsg
183 else:
184 logger.info("Check BGP FS entry for 3.3.3.3 with redirect IP OK")
185
186 logger.info("Check BGP FS entry for 3::3 with redirect IP")
187 output = router.vtysh_cmd(
188 "show bgp ipv6 flowspec 3::3", isjson=False, daemon="bgpd"
189 )
190 logger.info(output)
191 if (
192 "NH 50::2" not in output
193 or "FS:redirect IP" not in output
194 or "Packet Length < 200" not in output
195 ):
196 assertmsg = "traffic to 3::3 should have been detected as FS entry. NOK"
197 assert 0, assertmsg
198 else:
199 logger.info("Check BGP FS entry for 3::3 with redirect IP OK")
200
201
202 if __name__ == "__main__":
203
204 args = ["-s"] + sys.argv[1:]
205 ret = pytest.main(args)
206
207 sys.exit(ret)