예제 #1
0
    def add_bgp_peer(self,
                     speaker_as,
                     peer_ip,
                     peer_as,
                     auth_type='none',
                     password=None):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)

        # Validate peer_ip and peer_as.
        utils.validate_as_num('remote_as', peer_as)
        utils.validate_string(peer_ip)
        utils.validate_auth(auth_type, password)

        # Notify Ryu about BGP Peer addition
        curr_speaker.neighbor_add(address=peer_ip,
                                  remote_as=peer_as,
                                  password=password,
                                  connect_mode=CONNECT_MODE_ACTIVE)
        LOG.info(
            _LI('Added BGP Peer %(peer)s for remote_as=%(as)d to '
                'BGP Speaker running for local_as=%(local_as)d.'), {
                    'peer': peer_ip,
                    'as': peer_as,
                    'local_as': speaker_as
                })
예제 #2
0
    def get_bgp_speaker_statistics(self, speaker_as):
        LOG.info(_LI('Collecting BGP Speaker statistics for local_as=%d.'),
                 speaker_as)
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)

        # TODO(vikram): Filter and return the necessary information.
        # Will be done as part of new RFE requirement
        # https://bugs.launchpad.net/neutron/+bug/1527993
        return curr_speaker.neighbor_state_get()
예제 #3
0
 def delete_bgp_speaker(self, speaker_as):
     curr_speaker = self.cache.get_bgp_speaker(speaker_as)
     if not curr_speaker:
         raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                 rtid=self.routerid)
     # Notify Ryu about BGP Speaker deletion
     curr_speaker.shutdown()
     LOG.info(
         _LI('Removed BGP Speaker for local_as=%(as)d with '
             'router_id=%(rtid)s.'), {
                 'as': speaker_as,
                 'rtid': self.routerid
             })
     self.cache.remove_bgp_speaker(speaker_as)
예제 #4
0
    def advertise_evpn_route(self,
                             speaker_as,
                             route_type,
                             route_dist,
                             esi=0,
                             ethernet_tag_id=None,
                             mac_addr=None,
                             ip_addr=None,
                             ip_prefix=None,
                             gw_ip_addr=None,
                             vni=None,
                             next_hop=None,
                             tunnel_type=None):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)
        # Validate parameters that must be strings.
        utils.validate_string(route_dist)
        utils.validate_string(mac_addr)
        utils.validate_string(ip_addr)
        utils.validate_string(gw_ip_addr)
        utils.validate_string(next_hop)
        utils.validate_string(tunnel_type)

        kwargs = {
            'esi': esi,
            'ethernet_tag_id': ethernet_tag_id,
            'mac_addr': mac_addr,
            'ip_addr': ip_addr,
            'ip_prefix': ip_prefix,
            'gw_ip_addr': gw_ip_addr,
            'vni': vni,
            'next_hop': next_hop,
            'tunnel_type': tunnel_type
        }

        curr_speaker.evpn_prefix_add(
            self.convert_to_local_route_type(route_type), route_dist, **kwargs)

        LOG.info(
            _LI('EVPN route type %(route_type)s for RD %(rd)s is '
                'advertised for BGP Speaker running for '
                'local_as=%(local_as)d attributes: %(attributes)s.'), {
                    'rd': route_dist,
                    'route_type': route_type,
                    'local_as': speaker_as,
                    'attributes': kwargs
                })
예제 #5
0
    def get_bgp_peer_statistics(self, speaker_as, peer_ip):
        LOG.info(
            _LI('Collecting BGP Peer statistics for peer_ip=%(peer)s, '
                'running in speaker_as=%(speaker_as)d '), {
                    'peer': peer_ip,
                    'speaker_as': speaker_as
                })
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)

        # TODO(vikram): Filter and return the necessary information.
        # Will be done as part of new RFE requirement
        # https://bugs.launchpad.net/neutron/+bug/1527993
        return curr_speaker.neighbor_state_get(address=peer_ip)
예제 #6
0
    def withdraw_route(self, speaker_as, cidr, nexthop=None):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)
        # Validate cidr. It must be a string.
        utils.validate_string(cidr)

        # Notify Ryu about route withdrawal
        curr_speaker.prefix_del(prefix=cidr)
        LOG.info(
            _LI('Route cidr=%(prefix)s is withdrawn from BGP Speaker '
                'running for local_as=%(local_as)d.'), {
                    'prefix': cidr,
                    'local_as': speaker_as
                })
예제 #7
0
    def delete_bgp_peer(self, speaker_as, peer_ip):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)
        # Validate peer_ip. It must be a string.
        utils.validate_string(peer_ip)

        # Notify Ryu about BGP Peer removal
        curr_speaker.neighbor_del(address=peer_ip)
        LOG.info(
            _LI('Removed BGP Peer %(peer)s from BGP Speaker '
                'running for local_as=%(local_as)d.'), {
                    'peer': peer_ip,
                    'local_as': speaker_as
                })
예제 #8
0
    def delete_vrf(self, speaker_as, route_dist):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)
        # Validate route_dist. It must be a string.
        utils.validate_string(route_dist)

        # Notify Ryu about a deleted VRF
        curr_speaker.vrf_del(route_dist=route_dist)
        LOG.info(
            _LI('VRF for RD %(rd)s is no longer advertised for BGP '
                'Speaker running for local_as=%(local_as)d.'), {
                    'rd': route_dist,
                    'local_as': speaker_as
                })
예제 #9
0
    def add_bgp_peer(self,
                     speaker_as,
                     peer_ip,
                     peer_as,
                     auth_type='none',
                     password=None,
                     enable_evpn=None,
                     hold_time=None,
                     connect_mode=CONNECT_MODE_ACTIVE):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)

        # Validate peer_ip and peer_as.
        utils.validate_as_num('remote_as', peer_as)
        ip_version = utils.validate_ip_addr(peer_ip)
        utils.validate_auth(auth_type, password)
        if password is not None:
            password = encodeutils.to_utf8(password)

        kwargs = {}
        if enable_evpn is not None:
            kwargs['enable_evpn'] = enable_evpn
        if hold_time is not None:
            kwargs['hold_time'] = hold_time
        # Notify Ryu about BGP Peer addition
        if ip_version == lib_consts.IP_VERSION_4:
            enable_ipv4 = True
            enable_ipv6 = False
        else:
            enable_ipv4 = False
            enable_ipv6 = True
        curr_speaker.neighbor_add(address=peer_ip,
                                  remote_as=peer_as,
                                  enable_ipv4=enable_ipv4,
                                  enable_ipv6=enable_ipv6,
                                  password=password,
                                  connect_mode=connect_mode,
                                  **kwargs)
        LOG.info(
            _LI('Added BGP Peer %(peer)s for remote_as=%(as)d to '
                'BGP Speaker running for local_as=%(local_as)d.'), {
                    'peer': peer_ip,
                    'as': peer_as,
                    'local_as': speaker_as
                })
예제 #10
0
    def advertise_route(self, speaker_as, cidr, nexthop):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)

        # Validate cidr and nexthop. Both must be strings.
        utils.validate_string(cidr)
        utils.validate_string(nexthop)

        # Notify Ryu about route advertisement
        curr_speaker.prefix_add(prefix=cidr, next_hop=nexthop)
        LOG.info(
            _LI('Route cidr=%(prefix)s, nexthop=%(nexthop)s is '
                'advertised for BGP Speaker running for '
                'local_as=%(local_as)d.'), {
                    'prefix': cidr,
                    'nexthop': nexthop,
                    'local_as': speaker_as
                })
예제 #11
0
    def add_vrf(self, speaker_as, route_dist, import_rts, export_rts,
                vrf_type):
        curr_speaker = self.cache.get_bgp_speaker(speaker_as)
        if not curr_speaker:
            raise bgp_driver_exc.BgpSpeakerNotAdded(local_as=speaker_as,
                                                    rtid=self.routerid)
        # Validate route_dist. It must be a string.
        utils.validate_string(route_dist)

        # Notify Ryu about a new VRF
        curr_speaker.vrf_add(route_dist=route_dist,
                             import_rts=import_rts,
                             export_rts=export_rts,
                             route_family=self.get_vrf_type(vrf_type))
        LOG.info(
            _LI('VRF for RD %(rd)s is advertised for BGP Speaker '
                'running for local_as=%(local_as)d.'), {
                    'rd': route_dist,
                    'local_as': speaker_as
                })