def update_data(self): """ Update redis (caches config) Pulls the table references for each interface. """ self.route_dest_map = {} self.route_dest_list = [] ## The nexthop for loopbacks should be all zero for loip in self.loips: sub_id = ip2byte_tuple(loip) + (255, 255, 255, 255) + (self.tos, ) + (0, 0, 0, 0) self.route_dest_list.append(sub_id) self.route_dest_map[sub_id] = self.loips[loip].packed # Get list of front end asic namespaces for multi-asic platform. # This list will be empty for single asic platform. front_ns = multi_asic.get_all_namespaces()['front_ns'] ipnstr = "0.0.0.0/0" ipn = ipaddress.ip_network(ipnstr) route_str = "ROUTE_TABLE:0.0.0.0/0" for db_conn in Namespace.get_non_host_dbs(self.db_conn): # For multi-asic platform, proceed to get routes only for # front end namespaces. # For single-asic platform, front_ns will be empty list. if front_ns and db_conn.namespace not in front_ns: continue port_table = multi_asic.get_port_table_for_asic(db_conn.namespace) ent = db_conn.get_all(mibs.APPL_DB, route_str, blocking=False) if ent is None: continue nexthops = ent["nexthop"] ifnames = ent["ifname"] for nh, ifn in zip(nexthops.split(','), ifnames.split(',')): ## Ignore non front panel interfaces ## TODO: non front panel interfaces should not be in APPL_DB at very beginning ## This is to workaround the bug in current sonic-swss implementation if ifn == "eth0" or ifn == "lo" or ifn == "docker0": continue # Ignore internal asic routes if multi_asic.is_port_channel_internal(ifn, db_conn.namespace): continue if (ifn in port_table and multi_asic.PORT_ROLE in port_table[ifn] and port_table[ifn][multi_asic.PORT_ROLE] == multi_asic.INTERNAL_PORT): continue sub_id = ip2byte_tuple(ipn.network_address) + ip2byte_tuple( ipn.netmask) + (self.tos, ) + ip2byte_tuple(nh) self.route_dest_list.append(sub_id) self.route_dest_map[sub_id] = ipn.network_address.packed self.route_dest_list.sort()
def reinit_data(self): """ Subclass update interface information """ self.if_name_map, \ self.if_alias_map, \ self.if_id_map, \ self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn) for sai_id_key in self.if_id_map: namespace, sai_id = mibs.split_sai_id_key(sai_id_key) if_idx = mibs.get_index_from_str(self.if_id_map[sai_id_key]) self.port_index_namespace[if_idx] = namespace self.port_queues_map, self.queue_stat_map, self.port_queue_list_map = \ Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_queue_tables, self.db_conn) for db_conn in Namespace.get_non_host_dbs(self.db_conn): self.queue_type_map[db_conn.namespace] = db_conn.get_all(mibs.COUNTERS_DB, "COUNTERS_QUEUE_TYPE_MAP", blocking=False)