]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/bgp_flowspec/test_bgp_flowspec_topo.py
Merge pull request #8304 from mjstapp/fix_zmq_xref
[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 mininet.topo import Topo
73
74
75 pytestmark = [pytest.mark.bgpd]
76
77
78 #####################################################
79 ##
80 ## Network Topology Definition
81 ##
82 #####################################################
83
84
85 class BGPFLOWSPECTopo1(Topo):
86 "BGP EBGP Flowspec Topology 1"
87
88 def build(self, **_opts):
89 tgen = get_topogen(self)
90
91 # Setup Routers
92 tgen.add_router("r1")
93
94 # Setup Control Path Switch 1. r1-eth0
95 switch = tgen.add_switch("s1")
96 switch.add_link(tgen.gears["r1"])
97
98 ## Add eBGP ExaBGP neighbors
99 peer_ip = "10.0.1.101" ## peer
100 peer_route = "via 10.0.1.1" ## router
101 peer = tgen.add_exabgp_peer("peer1", ip=peer_ip, defaultRoute=peer_route)
102 switch.add_link(peer)
103
104
105 #####################################################
106 ##
107 ## Tests starting
108 ##
109 #####################################################
110
111
112 def setup_module(module):
113 tgen = Topogen(BGPFLOWSPECTopo1, module.__name__)
114
115 tgen.start_topology()
116 # check for zebra capability
117 router = tgen.gears["r1"]
118
119 # Get r1 reference and run Daemons
120 logger.info("Launching BGP and ZEBRA on r1")
121 router = tgen.gears["r1"]
122 router.load_config(
123 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format("r1"))
124 )
125 router.load_config(
126 TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format("r1"))
127 )
128 router.start()
129
130 peer_list = tgen.exabgp_peers()
131 for pname, peer in peer_list.items():
132 peer_dir = os.path.join(CWD, pname)
133 env_file = os.path.join(CWD, "exabgp.env")
134 peer.start(peer_dir, env_file)
135 logger.info(pname)
136
137
138 def teardown_module(module):
139 tgen = get_topogen()
140 tgen.stop_topology()
141
142
143 def test_bgp_convergence():
144 "Test for BGP topology convergence"
145 tgen = get_topogen()
146
147 # Skip if previous fatal error condition is raised
148
149 if tgen.routers_have_failure():
150 pytest.skip(tgen.errors)
151
152 logger.info("waiting for bgp convergence")
153
154 # Expected result
155 router = tgen.gears["r1"]
156 reffile = os.path.join(CWD, "r1/summary.txt")
157
158 expected = json.loads(open(reffile).read())
159
160 test_func = functools.partial(
161 topotest.router_json_cmp, router, "show bgp summary json", expected
162 )
163 _, res = topotest.run_and_expect(test_func, None, count=90, wait=0.5)
164 assertmsg = "BGP router network did not converge"
165 assert res is None, assertmsg
166
167
168 def test_bgp_flowspec():
169 tgen = get_topogen()
170
171 # Skip if previous fatal error condition is raised
172 if tgen.routers_have_failure():
173 pytest.skip(tgen.errors)
174
175 router = tgen.gears["r1"]
176
177 logger.info("Check BGP FS entry for 3.3.3.3 with redirect IP")
178 output = router.vtysh_cmd(
179 "show bgp ipv4 flowspec 3.3.3.3", isjson=False, daemon="bgpd"
180 )
181 logger.info(output)
182 if (
183 "NH 50.0.0.2" not in output
184 or "FS:redirect IP" not in output
185 or "Packet Length < 200" not in output
186 ):
187 assertmsg = "traffic to 3.3.3.3 should have been detected as FS entry. NOK"
188 assert 0, assertmsg
189 else:
190 logger.info("Check BGP FS entry for 3.3.3.3 with redirect IP OK")
191
192 logger.info("Check BGP FS entry for 3::3 with redirect IP")
193 output = router.vtysh_cmd(
194 "show bgp ipv6 flowspec 3::3", isjson=False, daemon="bgpd"
195 )
196 logger.info(output)
197 if (
198 "NH 50::2" not in output
199 or "FS:redirect IP" not in output
200 or "Packet Length < 200" not in output
201 ):
202 assertmsg = "traffic to 3::3 should have been detected as FS entry. NOK"
203 assert 0, assertmsg
204 else:
205 logger.info("Check BGP FS entry for 3::3 with redirect IP OK")
206
207
208 if __name__ == "__main__":
209
210 args = ["-s"] + sys.argv[1:]
211 ret = pytest.main(args)
212
213 sys.exit(ret)