1 # Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
19 import mock # Python 2
21 from unittest import mock # Python 3
23 from nose.tools import raises
25 from ryu.services.protocols.bgp import bgpspeaker
26 from ryu.services.protocols.bgp.bgpspeaker import EVPN_MAX_ET
27 from ryu.services.protocols.bgp.bgpspeaker import ESI_TYPE_LACP
28 from ryu.services.protocols.bgp.api.prefix import ESI_TYPE_L2_BRIDGE
29 from ryu.services.protocols.bgp.bgpspeaker import ESI_TYPE_MAC_BASED
30 from ryu.services.protocols.bgp.api.prefix import REDUNDANCY_MODE_ALL_ACTIVE
31 from ryu.services.protocols.bgp.api.prefix import REDUNDANCY_MODE_SINGLE_ACTIVE
34 LOG = logging.getLogger(__name__)
37 class Test_BGPSpeaker(unittest.TestCase):
39 Test case for bgp.bgpspeaker.BGPSpeaker
42 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
43 mock.MagicMock(return_value=None))
44 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
45 def test_evpn_prefix_add_eth_auto_discovery(self, mock_call):
47 route_type = bgpspeaker.EVPN_ETH_AUTO_DISCOVERY
48 route_dist = '65000:100'
50 'type': ESI_TYPE_LACP,
51 'mac_addr': 'aa:bb:cc:dd:ee:ff',
54 ethernet_tag_id = EVPN_MAX_ET
55 redundancy_mode = REDUNDANCY_MODE_ALL_ACTIVE
58 'route_type': route_type,
59 'route_dist': route_dist,
61 'ethernet_tag_id': ethernet_tag_id,
62 'redundancy_mode': redundancy_mode,
67 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
68 speaker.evpn_prefix_add(
69 route_type=route_type,
70 route_dist=route_dist,
72 ethernet_tag_id=ethernet_tag_id,
73 redundancy_mode=redundancy_mode,
77 mock_call.assert_called_with(
78 'evpn_prefix.add_local', **expected_kwargs)
81 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
82 mock.MagicMock(return_value=None))
83 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
84 def test_evpn_prefix_add_eth_auto_discovery_vni(self, mock_call):
86 route_type = bgpspeaker.EVPN_ETH_AUTO_DISCOVERY
87 route_dist = '65000:100'
89 'type': ESI_TYPE_L2_BRIDGE,
90 'mac_addr': 'aa:bb:cc:dd:ee:ff',
93 ethernet_tag_id = EVPN_MAX_ET
94 redundancy_mode = REDUNDANCY_MODE_SINGLE_ACTIVE
98 'route_type': route_type,
99 'route_dist': route_dist,
101 'ethernet_tag_id': ethernet_tag_id,
102 'redundancy_mode': redundancy_mode,
104 'next_hop': next_hop,
108 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
109 speaker.evpn_prefix_add(
110 route_type=route_type,
111 route_dist=route_dist,
113 ethernet_tag_id=ethernet_tag_id,
114 redundancy_mode=redundancy_mode,
119 mock_call.assert_called_with(
120 'evpn_prefix.add_local', **expected_kwargs)
122 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
123 mock.MagicMock(return_value=None))
124 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
125 def test_evpn_prefix_add_mac_ip_adv(self, mock_call):
127 route_type = bgpspeaker.EVPN_MAC_IP_ADV_ROUTE
128 route_dist = '65000:100'
129 esi = 0 # denotes single-homed
130 ethernet_tag_id = 200
131 mac_addr = 'aa:bb:cc:dd:ee:ff'
132 ip_addr = '192.168.0.1'
133 next_hop = '10.0.0.1'
135 'route_type': route_type,
136 'route_dist': route_dist,
138 'ethernet_tag_id': ethernet_tag_id,
139 'mac_addr': mac_addr,
141 'next_hop': next_hop,
145 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
146 speaker.evpn_prefix_add(
147 route_type=route_type,
148 route_dist=route_dist,
150 ethernet_tag_id=ethernet_tag_id,
157 mock_call.assert_called_with(
158 'evpn_prefix.add_local', **expected_kwargs)
160 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
161 mock.MagicMock(return_value=None))
162 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
163 def test_evpn_prefix_add_mac_ip_adv_vni(self, mock_call):
165 route_type = bgpspeaker.EVPN_MAC_IP_ADV_ROUTE
166 route_dist = '65000:100'
167 esi = 0 # denotes single-homed
168 ethernet_tag_id = 200
169 mac_addr = 'aa:bb:cc:dd:ee:ff'
170 ip_addr = '192.168.0.1'
172 next_hop = '10.0.0.1'
173 tunnel_type = bgpspeaker.TUNNEL_TYPE_VXLAN
175 'route_type': route_type,
176 'route_dist': route_dist,
178 'ethernet_tag_id': ethernet_tag_id,
179 'mac_addr': mac_addr,
182 'next_hop': next_hop,
183 'tunnel_type': tunnel_type,
187 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
188 speaker.evpn_prefix_add(
189 route_type=route_type,
190 route_dist=route_dist,
192 ethernet_tag_id=ethernet_tag_id,
197 tunnel_type=tunnel_type,
201 mock_call.assert_called_with(
202 'evpn_prefix.add_local', **expected_kwargs)
204 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
205 mock.MagicMock(return_value=None))
206 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
207 def test_evpn_prefix_add_multicast_etag(self, mock_call):
209 route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
210 route_dist = '65000:100'
211 esi = 0 # denotes single-homed
212 ethernet_tag_id = 200
213 mac_addr = 'aa:bb:cc:dd:ee:ff'
214 ip_addr = '192.168.0.1'
215 next_hop = '10.0.0.1'
217 'route_type': route_type,
218 'route_dist': route_dist,
219 # 'esi': esi, # should be ignored
220 'ethernet_tag_id': ethernet_tag_id,
221 # 'mac_addr': mac_addr, # should be ignored
223 'next_hop': next_hop,
227 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
228 speaker.evpn_prefix_add(
229 route_type=route_type,
230 route_dist=route_dist,
232 ethernet_tag_id=ethernet_tag_id,
239 mock_call.assert_called_with(
240 'evpn_prefix.add_local', **expected_kwargs)
242 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
243 mock.MagicMock(return_value=None))
244 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
245 def test_evpn_prefix_add_multicast_etag_no_next_hop(self, mock_call):
247 route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
248 route_dist = '65000:100'
249 esi = 0 # denotes single-homed
250 ethernet_tag_id = 200
251 mac_addr = 'aa:bb:cc:dd:ee:ff'
252 ip_addr = '192.168.0.1'
253 next_hop = '0.0.0.0' # the default value
255 'route_type': route_type,
256 'route_dist': route_dist,
257 # 'esi': esi, # should be ignored
258 'ethernet_tag_id': ethernet_tag_id,
259 # 'mac_addr': mac_addr, # should be ignored
261 'next_hop': next_hop,
265 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
266 speaker.evpn_prefix_add(
267 route_type=route_type,
268 route_dist=route_dist,
270 ethernet_tag_id=ethernet_tag_id,
273 # next_hop=next_hop, # omitted
277 mock_call.assert_called_with(
278 'evpn_prefix.add_local', **expected_kwargs)
281 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
282 mock.MagicMock(return_value=None))
283 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
284 def test_evpn_prefix_add_eth_segment(self, mock_call):
286 route_type = bgpspeaker.EVPN_ETH_SEGMENT
287 route_dist = '65000:100'
289 'type': ESI_TYPE_MAC_BASED,
290 'mac_addr': 'aa:bb:cc:dd:ee:ff',
293 ip_addr = '192.168.0.1'
296 'route_type': route_type,
297 'route_dist': route_dist,
300 'next_hop': next_hop,
304 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
305 speaker.evpn_prefix_add(
306 route_type=route_type,
307 route_dist=route_dist,
313 mock_call.assert_called_with(
314 'evpn_prefix.add_local', **expected_kwargs)
317 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
318 mock.MagicMock(return_value=None))
319 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
320 def test_evpn_prefix_add_ip_prefix_route(self, mock_call):
322 route_type = bgpspeaker.EVPN_IP_PREFIX_ROUTE
323 route_dist = '65000:100'
324 esi = 0 # denotes single-homed
325 ethernet_tag_id = 200
326 ip_prefix = '192.168.0.0/24'
327 gw_ip_addr = '172.16.0.1'
330 'route_type': route_type,
331 'route_dist': route_dist,
333 'ethernet_tag_id': ethernet_tag_id,
334 'ip_prefix': ip_prefix,
335 'gw_ip_addr': gw_ip_addr,
336 'next_hop': next_hop,
340 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
341 speaker.evpn_prefix_add(
342 route_type=route_type,
343 route_dist=route_dist,
345 ethernet_tag_id=ethernet_tag_id,
347 gw_ip_addr=gw_ip_addr,
351 mock_call.assert_called_with(
352 'evpn_prefix.add_local', **expected_kwargs)
355 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
356 mock.MagicMock(return_value=None))
357 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
358 def test_evpn_prefix_add_ip_prefix_route_vni(self, mock_call):
360 route_type = bgpspeaker.EVPN_IP_PREFIX_ROUTE
361 route_dist = '65000:100'
362 esi = 0 # denotes single-homed
363 ethernet_tag_id = 200
364 ip_prefix = '192.168.0.0/24'
365 gw_ip_addr = '172.16.0.1'
367 tunnel_type = bgpspeaker.TUNNEL_TYPE_VXLAN
370 'route_type': route_type,
371 'route_dist': route_dist,
373 'ethernet_tag_id': ethernet_tag_id,
374 'ip_prefix': ip_prefix,
375 'gw_ip_addr': gw_ip_addr,
376 'tunnel_type': tunnel_type,
378 'next_hop': next_hop,
382 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
383 speaker.evpn_prefix_add(
384 route_type=route_type,
385 route_dist=route_dist,
387 ethernet_tag_id=ethernet_tag_id,
389 gw_ip_addr=gw_ip_addr,
390 tunnel_type=tunnel_type,
395 mock_call.assert_called_with(
396 'evpn_prefix.add_local', **expected_kwargs)
399 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
400 mock.MagicMock(return_value=None))
401 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
402 def test_evpn_prefix_add_invalid_route_type(self, mock_call):
404 route_type = 'foobar' # Invalid EVPN route type
405 route_dist = '65000:100'
406 esi = 0 # denotes single-homed
407 ethernet_tag_id = 200
408 mac_addr = 'aa:bb:cc:dd:ee:ff'
409 ip_addr = '192.168.0.1'
410 next_hop = '10.0.0.1'
413 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
414 speaker.evpn_prefix_add(
415 route_type=route_type,
416 route_dist=route_dist,
418 ethernet_tag_id=ethernet_tag_id,
425 mock_call.assert_called_with(
426 'evpn_prefix.add_local', 'Invalid arguments detected')
429 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
430 mock.MagicMock(return_value=None))
431 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
432 def test_evpn_prefix_del_auto_discovery(self, mock_call):
434 route_type = bgpspeaker.EVPN_ETH_AUTO_DISCOVERY
435 route_dist = '65000:100'
437 'type': ESI_TYPE_LACP,
438 'mac_addr': 'aa:bb:cc:dd:ee:ff',
441 ethernet_tag_id = EVPN_MAX_ET
443 'route_type': route_type,
444 'route_dist': route_dist,
446 'ethernet_tag_id': ethernet_tag_id,
450 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
451 speaker.evpn_prefix_del(
452 route_type=route_type,
453 route_dist=route_dist,
455 ethernet_tag_id=ethernet_tag_id,
459 mock_call.assert_called_with(
460 'evpn_prefix.delete_local', **expected_kwargs)
462 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
463 mock.MagicMock(return_value=None))
464 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
465 def test_evpn_prefix_del_mac_ip_adv(self, mock_call):
467 route_type = bgpspeaker.EVPN_MAC_IP_ADV_ROUTE
468 route_dist = '65000:100'
469 ethernet_tag_id = 200
470 mac_addr = 'aa:bb:cc:dd:ee:ff'
471 ip_addr = '192.168.0.1'
473 'route_type': route_type,
474 'route_dist': route_dist,
475 'ethernet_tag_id': ethernet_tag_id,
476 'mac_addr': mac_addr,
481 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
482 speaker.evpn_prefix_del(
483 route_type=route_type,
484 route_dist=route_dist,
485 ethernet_tag_id=ethernet_tag_id,
491 mock_call.assert_called_with(
492 'evpn_prefix.delete_local', **expected_kwargs)
494 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
495 mock.MagicMock(return_value=None))
496 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
497 def test_evpn_prefix_del_multicast_etag(self, mock_call):
499 route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
500 route_dist = '65000:100'
501 esi = 0 # denotes single-homed
502 ethernet_tag_id = 200
503 mac_addr = 'aa:bb:cc:dd:ee:ff'
504 ip_addr = '192.168.0.1'
506 'route_type': route_type,
507 'route_dist': route_dist,
508 # 'esi': esi, # should be ignored
509 'ethernet_tag_id': ethernet_tag_id,
510 # 'mac_addr': mac_addr, # should be ignored
515 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
516 speaker.evpn_prefix_del(
517 route_type=route_type,
518 route_dist=route_dist,
520 ethernet_tag_id=ethernet_tag_id,
526 mock_call.assert_called_with(
527 'evpn_prefix.delete_local', **expected_kwargs)
530 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
531 mock.MagicMock(return_value=None))
532 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
533 def test_evpn_prefix_del_invalid_route_type(self, mock_call):
535 route_type = 'foobar' # Invalid EVPN route type
536 route_dist = '65000:100'
537 esi = 0 # denotes single-homed
538 ethernet_tag_id = 200
539 mac_addr = 'aa:bb:cc:dd:ee:ff'
540 ip_addr = '192.168.0.1'
543 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
544 speaker.evpn_prefix_del(
545 route_type=route_type,
546 route_dist=route_dist,
548 ethernet_tag_id=ethernet_tag_id,
554 mock_call.assert_called_with(
555 'evpn_prefix.delete_local', 'Invalid arguments detected')
558 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
559 mock.MagicMock(return_value=None))
560 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
561 def test_evpn_prefix_del_eth_segment(self, mock_call):
563 route_type = bgpspeaker.EVPN_ETH_SEGMENT
564 route_dist = '65000:100'
566 'esi_type': ESI_TYPE_MAC_BASED,
567 'mac_addr': 'aa:bb:cc:dd:ee:ff',
570 ip_addr = '192.168.0.1'
572 'route_type': route_type,
573 'route_dist': route_dist,
579 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
580 speaker.evpn_prefix_del(
581 route_type=route_type,
582 route_dist=route_dist,
588 mock_call.assert_called_with(
589 'evpn_prefix.delete_local', **expected_kwargs)
592 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
593 mock.MagicMock(return_value=None))
594 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
595 def test_evpn_prefix_del_ip_prefix_route(self, mock_call):
597 route_type = bgpspeaker.EVPN_IP_PREFIX_ROUTE
598 route_dist = '65000:100'
599 ethernet_tag_id = 200
600 ip_prefix = '192.168.0.0/24'
602 'route_type': route_type,
603 'route_dist': route_dist,
604 'ethernet_tag_id': ethernet_tag_id,
605 'ip_prefix': ip_prefix,
609 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
610 speaker.evpn_prefix_del(
611 route_type=route_type,
612 route_dist=route_dist,
613 ethernet_tag_id=ethernet_tag_id,
618 mock_call.assert_called_with(
619 'evpn_prefix.delete_local', **expected_kwargs)
621 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
622 mock.MagicMock(return_value=None))
623 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
624 def test_evpn_prefix_add_pmsi_no_tunnel_info(self, mock_call):
626 route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
627 route_dist = '65000:100'
628 ethernet_tag_id = 200
630 ip_addr = '192.168.0.1'
631 pmsi_tunnel_type = bgpspeaker.PMSI_TYPE_NO_TUNNEL_INFO
633 'route_type': route_type,
634 'route_dist': route_dist,
635 'ethernet_tag_id': ethernet_tag_id,
636 'next_hop': next_hop,
638 'pmsi_tunnel_type': pmsi_tunnel_type,
642 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
643 speaker.evpn_prefix_add(
644 route_type=route_type,
645 route_dist=route_dist,
646 ethernet_tag_id=ethernet_tag_id,
648 pmsi_tunnel_type=pmsi_tunnel_type,
652 mock_call.assert_called_with(
653 'evpn_prefix.add_local', **expected_kwargs)
656 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
657 mock.MagicMock(return_value=None))
658 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
659 def test_evpn_prefix_add_pmsi_ingress_rep(self, mock_call):
661 route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
662 route_dist = '65000:100'
663 ethernet_tag_id = 200
665 ip_addr = '192.168.0.1'
666 pmsi_tunnel_type = bgpspeaker.PMSI_TYPE_INGRESS_REP
668 'route_type': route_type,
669 'route_dist': route_dist,
670 'ethernet_tag_id': ethernet_tag_id,
671 'next_hop': next_hop,
673 'pmsi_tunnel_type': pmsi_tunnel_type,
677 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
678 speaker.evpn_prefix_add(
679 route_type=route_type,
680 route_dist=route_dist,
681 ethernet_tag_id=ethernet_tag_id,
683 pmsi_tunnel_type=pmsi_tunnel_type,
687 mock_call.assert_called_with(
688 'evpn_prefix.add_local', **expected_kwargs)
692 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
693 mock.MagicMock(return_value=None))
694 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
695 def test_evpn_prefix_add_invalid_pmsi_tunnel_type(self, mock_call):
697 route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
698 route_dist = '65000:100'
699 ethernet_tag_id = 200
701 ip_addr = '192.168.0.1'
705 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
706 speaker.evpn_prefix_add(
707 route_type=route_type,
708 route_dist=route_dist,
709 ethernet_tag_id=ethernet_tag_id,
711 pmsi_tunnel_type=pmsi_tunnel_type,
715 mock_call.assert_called_with(
716 'evpn_prefix.add_local', 'Invalid arguments detected')
719 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
720 mock.MagicMock(return_value=None))
721 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
722 def test_flowspec_prefix_add_ipv4(self, mock_call):
724 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV4
726 'dst_prefix': '10.60.1.0/24',
736 'flowspec_family': flowspec_family,
742 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
743 speaker.flowspec_prefix_add(
744 flowspec_family=flowspec_family,
749 mock_call.assert_called_with(
750 'flowspec.add', **expected_kwargs)
753 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
754 mock.MagicMock(return_value=None))
755 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
756 def test_flowspec_prefix_add_ipv4_without_actions(self, mock_call):
758 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV4
760 'dst_prefix': '10.60.1.0/24',
764 'flowspec_family': flowspec_family,
770 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
771 speaker.flowspec_prefix_add(
772 flowspec_family=flowspec_family,
776 mock_call.assert_called_with(
777 'flowspec.add', **expected_kwargs)
780 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
781 mock.MagicMock(return_value=None))
782 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
783 def test_flowspec_prefix_del_ipv4(self, mock_call):
785 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV4
787 'dst_prefix': '10.60.1.0/24',
791 'flowspec_family': flowspec_family,
796 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
797 speaker.flowspec_prefix_del(
798 flowspec_family=flowspec_family,
802 mock_call.assert_called_with(
803 'flowspec.del', **expected_kwargs)
806 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
807 mock.MagicMock(return_value=None))
808 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
809 def test_flowspec_prefix_add_vpnv4(self, mock_call):
811 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_VPNV4
812 route_dist = '65001:100'
814 'dst_prefix': '10.70.1.0/24',
824 'flowspec_family': flowspec_family,
825 'route_dist': route_dist,
831 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
832 speaker.flowspec_prefix_add(
833 flowspec_family=flowspec_family,
834 route_dist=route_dist,
839 mock_call.assert_called_with(
840 'flowspec.add_local', **expected_kwargs)
843 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
844 mock.MagicMock(return_value=None))
845 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
846 def test_flowspec_prefix_del_vpnv4(self, mock_call):
848 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_VPNV4
849 route_dist = '65001:100'
851 'dst_prefix': '10.70.1.0/24',
855 'flowspec_family': flowspec_family,
856 'route_dist': route_dist,
861 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
862 speaker.flowspec_prefix_del(
863 flowspec_family=flowspec_family,
864 route_dist=route_dist,
868 mock_call.assert_called_with(
869 'flowspec.del_local', **expected_kwargs)
872 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
873 mock.MagicMock(return_value=None))
874 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
875 def test_flowspec_prefix_add_ipv6(self, mock_call):
877 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV6
879 'dst_prefix': '2001::3/128/32',
889 'flowspec_family': flowspec_family,
895 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
896 speaker.flowspec_prefix_add(
897 flowspec_family=flowspec_family,
902 mock_call.assert_called_with(
903 'flowspec.add', **expected_kwargs)
906 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
907 mock.MagicMock(return_value=None))
908 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
909 def test_flowspec_prefix_add_ipv6_without_actions(self, mock_call):
911 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV6
913 'dst_prefix': '2001::3/128/32',
917 'flowspec_family': flowspec_family,
923 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
924 speaker.flowspec_prefix_add(
925 flowspec_family=flowspec_family,
929 mock_call.assert_called_with(
930 'flowspec.add', **expected_kwargs)
933 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
934 mock.MagicMock(return_value=None))
935 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
936 def test_flowspec_prefix_del_ipv6(self, mock_call):
938 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV6
940 'dst_prefix': '2001::3/128/32',
944 'flowspec_family': flowspec_family,
949 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
950 speaker.flowspec_prefix_del(
951 flowspec_family=flowspec_family,
955 mock_call.assert_called_with(
956 'flowspec.del', **expected_kwargs)
959 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
960 mock.MagicMock(return_value=None))
961 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
962 def test_flowspec_prefix_add_vpnv6(self, mock_call):
964 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_VPNV6
965 route_dist = '65001:100'
967 'dst_prefix': '2001::3/128/32',
977 'flowspec_family': flowspec_family,
978 'route_dist': route_dist,
984 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
985 speaker.flowspec_prefix_add(
986 flowspec_family=flowspec_family,
987 route_dist=route_dist,
992 mock_call.assert_called_with(
993 'flowspec.add_local', **expected_kwargs)
996 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
997 mock.MagicMock(return_value=None))
998 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
999 def test_flowspec_prefix_del_vpnv6(self, mock_call):
1001 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_VPNV6
1002 route_dist = '65001:100'
1004 'dst_prefix': '2001::3/128/32',
1008 'flowspec_family': flowspec_family,
1009 'route_dist': route_dist,
1014 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
1015 speaker.flowspec_prefix_del(
1016 flowspec_family=flowspec_family,
1017 route_dist=route_dist,
1021 mock_call.assert_called_with(
1022 'flowspec.del_local', **expected_kwargs)
1025 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
1026 mock.MagicMock(return_value=None))
1027 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
1028 def test_flowspec_prefix_add_l2vpn(self, mock_call):
1030 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_L2VPN
1031 route_dist = '65001:100'
1033 'dst_mac': '12:34:56:78:9a:bc',
1037 'traffic_marking': {
1043 'flowspec_family': flowspec_family,
1044 'route_dist': route_dist,
1050 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
1051 speaker.flowspec_prefix_add(
1052 flowspec_family=flowspec_family,
1053 route_dist=route_dist,
1058 mock_call.assert_called_with(
1059 'flowspec.add_local', **expected_kwargs)
1062 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
1063 mock.MagicMock(return_value=None))
1064 @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
1065 def test_flowspec_prefix_del_l2vpn(self, mock_call):
1067 flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_L2VPN
1068 route_dist = '65001:100'
1070 'dst_mac': '12:34:56:78:9a:bc',
1074 'flowspec_family': flowspec_family,
1075 'route_dist': route_dist,
1080 speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
1081 speaker.flowspec_prefix_del(
1082 flowspec_family=flowspec_family,
1083 route_dist=route_dist,
1087 mock_call.assert_called_with(
1088 'flowspec.del_local', **expected_kwargs)