in src/sonic-frr-mgmt-framework/frrcfgd/frrcfgd.py [0:0]
def __init__(self):
self.config_db = ExtConfigDBConnector({'STATIC_ROUTE': {'nexthop', 'ifname', 'distance', 'nexthop-vrf', 'blackhole', 'track'}})
try:
self.config_db.connect()
except Exception as e:
syslog.syslog(syslog.LOG_ERR, '[bgp cfgd] Failed connecting to config DB with exception:' + str(e))
db_entry = self.config_db.get_entry('DEVICE_METADATA', 'localhost')
if 'bgp_asn' in db_entry:
self.metadata_asn = db_entry['bgp_asn']
else:
self.metadata_asn = None
if 'docker_routing_config_mode' in db_entry:
self.config_mode = db_entry['docker_routing_config_mode']
else:
self.config_mode = "separated"
# VRF ==> local_as
self.bgp_asn = {}
# VRF ==> confederation peer list
self.bgp_confed_peers = {}
glb_table = self.config_db.get_table('BGP_GLOBALS')
for vrf, entry in glb_table.items():
if 'local_asn' in entry:
self.bgp_asn[vrf] = entry['local_asn']
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: VRF %s Local_ASN %s' % (vrf, self.bgp_asn[vrf]))
if 'confed_peers' in entry:
self.bgp_confed_peers[vrf] = set(entry['confed_peers'])
# VRF ==> grp_name ==> peer_group
self.bgp_peer_group = {}
# VRF ==> set of interface neighbor
self.bgp_intf_nbr = {}
nbr_table = self.config_db.get_table('BGP_NEIGHBOR')
pg_table = self.config_db.get_table('BGP_PEER_GROUP')
for key, entry in pg_table.items():
vrf, pg = key
self.bgp_peer_group.setdefault(vrf, {})[pg] = BGPPeerGroup(vrf)
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: VRF %s Peer_Group %s' % (vrf, pg))
for key, entry in nbr_table.items():
if len(key) != 2:
continue
vrf, peer = key
if 'peer_group_name' in entry:
pg_name = entry['peer_group_name']
if vrf in self.bgp_peer_group and pg_name in self.bgp_peer_group[vrf]:
self.bgp_peer_group[vrf][pg_name].ref_nbrs.add(peer)
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: VRF %s Neighbor %s Peer_Group %s' %
(vrf, peer, pg_name))
if not self.__peer_is_ip(peer):
self.bgp_intf_nbr.setdefault(vrf, set()).add(peer)
# map_name ==> seq_no ==> operation
self.route_map = {}
rtmap_table = self.config_db.get_table('ROUTE_MAP')
for key, entry in rtmap_table.items():
rtmap_name, seq_no = key
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: Route_Map %s Seq_NO %s' % (rtmap_name, seq_no))
if 'route_operation' in entry:
self.route_map.setdefault(rtmap_name, {})[seq_no] = entry['route_operation']
self.comm_set_list = {}
comm_table = self.config_db.get_table('COMMUNITY_SET')
for key, entry in comm_table.items():
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: Community %s' % key)
self.comm_set_list[key] = CommunityList(key, False)
for k, v in entry.items():
self.comm_set_list[key].db_data_to_attr(k, v)
self.extcomm_set_list = {}
extcomm_table = self.config_db.get_table('EXTENDED_COMMUNITY_SET')
for key, entry in extcomm_table.items():
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: Extended_Community %s' % key)
self.extcomm_set_list[key] = CommunityList(key, True)
for k, v in entry.items():
self.extcomm_set_list[key].db_data_to_attr(k, v)
self.prefix_set_list = {}
pfx_set_table = self.config_db.get_table('PREFIX_SET')
for key, entry in pfx_set_table.items():
if 'mode' in entry:
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: Prefix_Set %s mode %s' % (key, entry['mode']))
self.prefix_set_list[key] = MatchPrefixList(entry['mode'].lower())
pfx_table = self.config_db.get_table('PREFIX')
for key, entry in pfx_table.items():
pfx_set_name, ip_pfx, len_range = key
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: Prefix %s range %s of set %s' % (ip_pfx, len_range, pfx_set_name))
if len_range == 'exact':
len_range = None
if pfx_set_name in self.prefix_set_list and 'action' in entry:
try:
self.prefix_set_list[pfx_set_name].add_prefix(ip_pfx, len_range, entry['action'])
except ValueError:
pass
self.as_path_set_list = {}
aspath_table = self.config_db.get_table('AS_PATH_SET')
for key, entry in aspath_table.items():
if 'as_path_set_member' in entry:
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: AS_Path_Set %s member %s' % (key, entry['as_path_set_member']))
self.as_path_set_list[key] = entry['as_path_set_member'][:]
self.tag_set_list = {}
self.af_aggr_list = {}
af_aggr_table = self.config_db.get_table('BGP_GLOBALS_AF_AGGREGATE_ADDR')
for key, entry in af_aggr_table.items():
vrf, af_type, ip_pfx = key
af, _ = af_type.lower().split('_')
norm_ip_pfx = MatchPrefix.normalize_ip_prefix((socket.AF_INET if af == 'ipv4' else socket.AF_INET6), ip_pfx)
if norm_ip_pfx is not None:
syslog.syslog(syslog.LOG_DEBUG, 'Init Config DB Data: AF Aggregate Prefix %s of vrf %s AF %s' % (norm_ip_pfx, vrf, af))
aggr_obj = AggregateAddr()
for k, v in entry.items():
if v == 'true':
setattr(aggr_obj, k, True)
self.af_aggr_list.setdefault(vrf, {})[norm_ip_pfx] = aggr_obj
self.vrf_vni_map = {}
vrf_table = self.config_db.get_table('VRF')
for key, entry in vrf_table.items():
if 'vni' in entry:
self.vrf_vni_map[key] = entry['vni']
# VRF ==> ip_prefix ==> nexthop list
self.static_route_list = {}
sroute_table = self.config_db.get_table('STATIC_ROUTE')
get_list = lambda v: v.split(',') if v is not None else None
for key, entry in sroute_table.items():
if type(key) is tuple and len(key) == 2:
vrf, ip_prefix = key
else:
vrf = self.DEFAULT_VRF
ip_prefix = key
af, ip_prefix = IpNextHopSet.get_af_norm_prefix(ip_prefix)
nh_attr = lambda k: get_list(entry.get(k, None))
self.static_route_list.setdefault(vrf, {})[ip_prefix] = IpNextHopSet(af,
nh_attr('blackhole'), nh_attr('nexthop'),nh_attr('track'),
nh_attr('ifname'), nh_attr('tag'), nh_attr('distance'),
nh_attr('nexthop-vrf'))
self.table_handler_list = [
('VRF', self.vrf_handler),
('DEVICE_METADATA', self.metadata_handler),
('BGP_GLOBALS', self.bgp_global_handler),
('BGP_GLOBALS_AF', self.bgp_af_handler),
('PREFIX_SET', self.bgp_table_handler_common),
('PREFIX', self.bgp_table_handler_common),
('COMMUNITY_SET', self.comm_set_handler),
('EXTENDED_COMMUNITY_SET', self.comm_set_handler),
('ROUTE_MAP', self.bgp_table_handler_common),
('BGP_PEER_GROUP', self.bgp_neighbor_handler),
('BGP_NEIGHBOR', self.bgp_neighbor_handler),
('BGP_PEER_GROUP_AF', self.bgp_table_handler_common),
('BGP_NEIGHBOR_AF', self.bgp_table_handler_common),
('BGP_GLOBALS_LISTEN_PREFIX', self.bgp_table_handler_common),
('BGP_GLOBALS_EVPN_VNI', self.bgp_table_handler_common),
('BGP_GLOBALS_EVPN_RT', self.bgp_table_handler_common),
('BGP_GLOBALS_EVPN_VNI_RT', self.bgp_table_handler_common),
('BFD_PEER', self.bfd_handler),
('NEIGHBOR_SET', self.bgp_table_handler_common),
('NEXTHOP_SET', self.bgp_table_handler_common),
('TAG_SET', self.bgp_table_handler_common),
('AS_PATH_SET', self.bgp_table_handler_common),
('ROUTE_REDISTRIBUTE', self.bgp_table_handler_common),
('BGP_GLOBALS_AF_AGGREGATE_ADDR', self.bgp_table_handler_common),
('BGP_GLOBALS_AF_NETWORK', self.bgp_table_handler_common),
('BFD_PEER_SINGLE_HOP', self.bgp_table_handler_common),
('BFD_PEER_MULTI_HOP', self.bgp_table_handler_common),
('IP_SLA', self.bgp_table_handler_common),
('OSPFV2_ROUTER', self.bgp_table_handler_common),
('OSPFV2_ROUTER_AREA', self.bgp_table_handler_common),
('OSPFV2_ROUTER_AREA_VIRTUAL_LINK', self.bgp_table_handler_common),
('OSPFV2_ROUTER_AREA_NETWORK', self.bgp_table_handler_common),
('OSPFV2_ROUTER_AREA_POLICY_ADDRESS_RANGE', self.bgp_table_handler_common),
('OSPFV2_ROUTER_DISTRIBUTE_ROUTE', self.bgp_table_handler_common),
('OSPFV2_INTERFACE', self.bgp_table_handler_common),
('OSPFV2_ROUTER_PASSIVE_INTERFACE', self.bgp_table_handler_common),
('STATIC_ROUTE', self.bgp_table_handler_common),
('PIM_GLOBALS', self.bgp_table_handler_common),
('PIM_INTERFACE', self.bgp_table_handler_common),
('IGMP_INTERFACE', self.bgp_table_handler_common),
('IGMP_INTERFACE_QUERY', self.bgp_table_handler_common)
]
self.bgp_message = queue.Queue(0)
self.table_data_cache = self.config_db.get_table_data([tbl for tbl, _ in self.table_handler_list])
syslog.syslog(syslog.LOG_DEBUG, 'Init Cached DB data')
for key, entry in self.table_data_cache.items():
syslog.syslog(syslog.LOG_DEBUG, ' %-20s : %s' % (key, entry))
if self.config_mode == "unified":
for table, _ in self.table_handler_list:
table_list = self.config_db.get_table(table)
for key, data in table_list.items():
syslog.syslog(syslog.LOG_DEBUG, 'config replay for table {} key {}'.format(table, key))
upd_data = {}
for upd_key, upd_val in data.items():
upd_data[upd_key] = CachedDataWithOp(upd_val, CachedDataWithOp.OP_ADD)
self.bgp_message.put((self.config_db.serialize_key(key), False, table, upd_data))
upd_data_list = []
self.__update_bgp(upd_data_list)
for table1, key1, data1 in upd_data_list:
table_key = ExtConfigDBConnector.get_table_key(table1, key1)
self.__update_cache_data(table_key, data1)