def test_evpn_prefix_del_ip_prefix_route(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_IP_PREFIX_ROUTE
        route_dist = '65000:100'
        ethernet_tag_id = 200
        ip_prefix = '192.168.0.0/24'
        expected_kwargs = {
            'route_type': route_type,
            'route_dist': route_dist,
            'ethernet_tag_id': ethernet_tag_id,
            'ip_prefix': ip_prefix,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_del(
            route_type=route_type,
            route_dist=route_dist,
            ethernet_tag_id=ethernet_tag_id,
            ip_prefix=ip_prefix,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.delete_local',
                                     **expected_kwargs)
    def test_evpn_prefix_add_pmsi_ingress_rep(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
        route_dist = '65000:100'
        ethernet_tag_id = 200
        next_hop = '0.0.0.0'
        ip_addr = '192.168.0.1'
        pmsi_tunnel_type = bgpspeaker.PMSI_TYPE_INGRESS_REP
        expected_kwargs = {
            'route_type': route_type,
            'route_dist': route_dist,
            'ethernet_tag_id': ethernet_tag_id,
            'next_hop': next_hop,
            'ip_addr': ip_addr,
            'pmsi_tunnel_type': pmsi_tunnel_type,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_add(
            route_type=route_type,
            route_dist=route_dist,
            ethernet_tag_id=ethernet_tag_id,
            ip_addr=ip_addr,
            pmsi_tunnel_type=pmsi_tunnel_type,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.add_local',
                                     **expected_kwargs)
    def test_evpn_prefix_del_multicast_etag(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
        route_dist = '65000:100'
        esi = 0  # denotes single-homed
        ethernet_tag_id = 200
        mac_addr = 'aa:bb:cc:dd:ee:ff'
        ip_addr = '192.168.0.1'
        expected_kwargs = {
            'route_type': route_type,
            'route_dist': route_dist,
            # 'esi': esi,  # should be ignored
            'ethernet_tag_id': ethernet_tag_id,
            # 'mac_addr': mac_addr,  # should be ignored
            'ip_addr': ip_addr,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_del(
            route_type=route_type,
            route_dist=route_dist,
            esi=esi,
            ethernet_tag_id=ethernet_tag_id,
            mac_addr=mac_addr,
            ip_addr=ip_addr,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.delete_local',
                                     **expected_kwargs)
    def test_evpn_prefix_del_eth_segment(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_ETH_SEGMENT
        route_dist = '65000:100'
        esi = {
            'esi_type': ESI_TYPE_MAC_BASED,
            'mac_addr': 'aa:bb:cc:dd:ee:ff',
            'local_disc': 100,
        }
        ip_addr = '192.168.0.1'
        expected_kwargs = {
            'route_type': route_type,
            'route_dist': route_dist,
            'esi': esi,
            'ip_addr': ip_addr,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_del(
            route_type=route_type,
            route_dist=route_dist,
            esi=esi,
            ip_addr=ip_addr,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.delete_local',
                                     **expected_kwargs)
    def test_evpn_prefix_del_mac_ip_adv(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_MAC_IP_ADV_ROUTE
        route_dist = '65000:100'
        ethernet_tag_id = 200
        mac_addr = 'aa:bb:cc:dd:ee:ff'
        ip_addr = '192.168.0.1'
        expected_kwargs = {
            'route_type': route_type,
            'route_dist': route_dist,
            'ethernet_tag_id': ethernet_tag_id,
            'mac_addr': mac_addr,
            'ip_addr': ip_addr,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_del(
            route_type=route_type,
            route_dist=route_dist,
            ethernet_tag_id=ethernet_tag_id,
            mac_addr=mac_addr,
            ip_addr=ip_addr,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.delete_local',
                                     **expected_kwargs)
    def test_evpn_prefix_del_auto_discovery(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_ETH_AUTO_DISCOVERY
        route_dist = '65000:100'
        esi = {
            'type': ESI_TYPE_LACP,
            'mac_addr': 'aa:bb:cc:dd:ee:ff',
            'port_key': 100,
        }
        ethernet_tag_id = EVPN_MAX_ET
        expected_kwargs = {
            'route_type': route_type,
            'route_dist': route_dist,
            'esi': esi,
            'ethernet_tag_id': ethernet_tag_id,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_del(
            route_type=route_type,
            route_dist=route_dist,
            esi=esi,
            ethernet_tag_id=ethernet_tag_id,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.delete_local',
                                     **expected_kwargs)
    def test_evpn_prefix_add_invalid_route_type(self, mock_call):
        # Prepare test data
        route_type = 'foobar'  # Invalid EVPN route type
        route_dist = '65000:100'
        esi = 0  # denotes single-homed
        ethernet_tag_id = 200
        mac_addr = 'aa:bb:cc:dd:ee:ff'
        ip_addr = '192.168.0.1'
        next_hop = '10.0.0.1'

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_add(
            route_type=route_type,
            route_dist=route_dist,
            esi=esi,
            ethernet_tag_id=ethernet_tag_id,
            mac_addr=mac_addr,
            ip_addr=ip_addr,
            next_hop=next_hop,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.add_local',
                                     'Invalid arguments detected')
    def test_evpn_prefix_add_ip_prefix_route(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_IP_PREFIX_ROUTE
        route_dist = '65000:100'
        esi = 0  # denotes single-homed
        ethernet_tag_id = 200
        ip_prefix = '192.168.0.0/24'
        gw_ip_addr = '172.16.0.1'
        next_hop = '0.0.0.0'
        expected_kwargs = {
            'route_type': route_type,
            'route_dist': route_dist,
            'esi': esi,
            'ethernet_tag_id': ethernet_tag_id,
            'ip_prefix': ip_prefix,
            'gw_ip_addr': gw_ip_addr,
            'next_hop': next_hop,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_add(
            route_type=route_type,
            route_dist=route_dist,
            esi=esi,
            ethernet_tag_id=ethernet_tag_id,
            ip_prefix=ip_prefix,
            gw_ip_addr=gw_ip_addr,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.add_local',
                                     **expected_kwargs)
Beispiel #9
0
    def add_bgp_speaker(self, speaker_as):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if curr_speaker is not None:
            raise bgp_driver_exc.BgpSpeakerAlreadyScheduled(
                current_as=speaker_as, rtid=self.routerid)

        # Ryu can only support One speaker
        if self.cache.get_hosted_bgp_speakers_count() == 1:
            raise bgp_driver_exc.BgpSpeakerMaxScheduled(count=1)

        # Validate input parameters.
        # speaker_as must be an integer in the allowed range.
        utils.validate_as_num('local_as', speaker_as)

        # Notify Ryu about BGP Speaker addition.
        # Please note: Since, only the route-advertisement support is
        # implemented we are explicitly setting the bgp_server_port
        # attribute to 0 which disables listening on port 179.
        curr_speaker = bgpspeaker.BGPSpeaker(
            as_number=speaker_as,
            router_id=self.routerid,
            bgp_server_port=0,
            best_path_change_handler=best_path_change_cb,
            peer_down_handler=bgp_peer_down_cb,
            peer_up_handler=bgp_peer_up_cb)
        LOG.info(
            _LI('Added BGP Speaker for local_as=%(as)d with '
                'router_id= %(rtid)s.'), {
                    'as': speaker_as,
                    'rtid': self.routerid
                })

        self.cache.put_bgp_speaker(speaker_as, curr_speaker)
    def test_evpn_prefix_add_mac_ip_adv(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_MAC_IP_ADV_ROUTE
        route_dist = '65000:100'
        esi = 0  # denotes single-homed
        ethernet_tag_id = 200
        mac_addr = 'aa:bb:cc:dd:ee:ff'
        ip_addr = '192.168.0.1'
        next_hop = '10.0.0.1'
        expected_kwargs = {
            'route_type': route_type,
            'route_dist': route_dist,
            'esi': esi,
            'ethernet_tag_id': ethernet_tag_id,
            'mac_addr': mac_addr,
            'ip_addr': ip_addr,
            'next_hop': next_hop,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_add(
            route_type=route_type,
            route_dist=route_dist,
            esi=esi,
            ethernet_tag_id=ethernet_tag_id,
            mac_addr=mac_addr,
            ip_addr=ip_addr,
            next_hop=next_hop,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.add_local',
                                     **expected_kwargs)
    def test_flowspec_prefix_add_l2vpn(self, mock_call):
        # Prepare test data
        flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_L2VPN
        route_dist = '65001:100'
        rules = {
            'dst_mac': '12:34:56:78:9a:bc',
        }

        actions = {
            'traffic_marking': {
                'dscp': 24,
            }
        }

        expected_kwargs = {
            'flowspec_family': flowspec_family,
            'route_dist': route_dist,
            'rules': rules,
            'actions': actions,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.flowspec_prefix_add(flowspec_family=flowspec_family,
                                    route_dist=route_dist,
                                    rules=rules,
                                    actions=actions)

        # Check
        mock_call.assert_called_with('flowspec.add_local', **expected_kwargs)
Beispiel #12
0
    def add_bgp_speaker(self, speaker_as):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if curr_speaker is not None:
            raise bgp_driver_exc.BgpSpeakerAlreadyScheduled(
                current_as=speaker_as, rtid=self.routerid)

        # Ryu can only support One speaker
        if self.cache.get_hosted_bgp_speakers_count() == 1:
            raise bgp_driver_exc.BgpSpeakerMaxScheduled(count=1)

        # Validate input parameters.
        # speaker_as must be an integer in the allowed range.
        utils.validate_as_num('local_as', speaker_as)

        # Notify Ryu about BGP Speaker addition.
        curr_speaker = bgpspeaker.BGPSpeaker(
            as_number=speaker_as,
            router_id=self.routerid,
            bgp_server_port=179,
            best_path_change_handler=self.best_path_change_cb,
            peer_down_handler=self.bgp_peer_down_cb,
            peer_up_handler=self.bgp_peer_up_cb)
        LOG.info(
            _LI('Added BGP Speaker for local_as=%(as)d with '
                'router_id= %(rtid)s.'), {
                    'as': speaker_as,
                    'rtid': self.routerid
                })

        self.cache.put_bgp_speaker(speaker_as, curr_speaker)
    def test_flowspec_prefix_add_ipv6(self, mock_call):
        # Prepare test data
        flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV6
        rules = {
            'dst_prefix': '2001::3/128/32',
        }

        actions = {
            'traffic_marking': {
                'dscp': 24,
            }
        }

        expected_kwargs = {
            'flowspec_family': flowspec_family,
            'rules': rules,
            'actions': actions,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.flowspec_prefix_add(flowspec_family=flowspec_family,
                                    rules=rules,
                                    actions=actions)

        # Check
        mock_call.assert_called_with('flowspec.add', **expected_kwargs)
    def test_evpn_prefix_add_eth_auto_discovery_vni(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_ETH_AUTO_DISCOVERY
        route_dist = '65000:100'
        esi = {
            'type': ESI_TYPE_L2_BRIDGE,
            'mac_addr': 'aa:bb:cc:dd:ee:ff',
            'priority': 100,
        }
        ethernet_tag_id = EVPN_MAX_ET
        redundancy_mode = REDUNDANCY_MODE_SINGLE_ACTIVE
        vni = 500
        next_hop = '0.0.0.0'
        expected_kwargs = {
            'route_type': route_type,
            'route_dist': route_dist,
            'esi': esi,
            'ethernet_tag_id': ethernet_tag_id,
            'redundancy_mode': redundancy_mode,
            'vni': vni,
            'next_hop': next_hop,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_add(route_type=route_type,
                                route_dist=route_dist,
                                esi=esi,
                                ethernet_tag_id=ethernet_tag_id,
                                redundancy_mode=redundancy_mode,
                                vni=vni)

        # Check
        mock_call.assert_called_with('evpn_prefix.add_local',
                                     **expected_kwargs)
    def test_flowspec_prefix_del_ipv6(self, mock_call):
        # Prepare test data
        flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV6
        rules = {
            'dst_prefix': '2001::3/128/32',
        }

        expected_kwargs = {
            'flowspec_family': flowspec_family,
            'rules': rules,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.flowspec_prefix_del(flowspec_family=flowspec_family,
                                    rules=rules)

        # Check
        mock_call.assert_called_with('flowspec.del', **expected_kwargs)
    def test_flowspec_prefix_add_ipv4_without_actions(self, mock_call):
        # Prepare test data
        flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV4
        rules = {
            'dst_prefix': '10.60.1.0/24',
        }

        expected_kwargs = {
            'flowspec_family': flowspec_family,
            'rules': rules,
            'actions': {},
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.flowspec_prefix_add(flowspec_family=flowspec_family,
                                    rules=rules)

        # Check
        mock_call.assert_called_with('flowspec.add', **expected_kwargs)
    def test_evpn_prefix_add_invalid_pmsi_tunnel_type(self, mock_call):
        # Prepare test data
        route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
        route_dist = '65000:100'
        ethernet_tag_id = 200
        next_hop = '0.0.0.0'
        ip_addr = '192.168.0.1'
        pmsi_tunnel_type = 1

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.evpn_prefix_add(
            route_type=route_type,
            route_dist=route_dist,
            ethernet_tag_id=ethernet_tag_id,
            ip_addr=ip_addr,
            pmsi_tunnel_type=pmsi_tunnel_type,
        )

        # Check
        mock_call.assert_called_with('evpn_prefix.add_local',
                                     'Invalid arguments detected')
    def test_flowspec_prefix_del_vpnv4(self, mock_call):
        # Prepare test data
        flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_VPNV4
        route_dist = '65001:100'
        rules = {
            'dst_prefix': '10.70.1.0/24',
        }

        expected_kwargs = {
            'flowspec_family': flowspec_family,
            'route_dist': route_dist,
            'rules': rules,
        }

        # Test
        speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
        speaker.flowspec_prefix_del(flowspec_family=flowspec_family,
                                    route_dist=route_dist,
                                    rules=rules)

        # Check
        mock_call.assert_called_with('flowspec.del_local', **expected_kwargs)