def __init__()

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)