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 })
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()
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)
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 })
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)
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 })
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 })
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 })
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 })
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 })
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 })