def init_sync_d_interface_tables(db_conn): """ Initializes interface maps for SyncD-connected MIB(s). :return: tuple(if_name_map, if_id_map, oid_map, if_alias_map) """ # Make sure we're connected to COUNTERS_DB db_conn.connect(COUNTERS_DB) # { if_name (SONiC) -> sai_id } # ex: { "Ethernet76" : "1000000000023" } if_name_map, if_id_map = port_util.get_interface_oid_map(db_conn) logger.debug("Port name map:\n" + pprint.pformat(if_name_map, indent=2)) logger.debug("Interface name map:\n" + pprint.pformat(if_id_map, indent=2)) # { OID -> sai_id } oid_sai_map = { get_index(if_name): sai_id for if_name, sai_id in if_name_map.items() # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None } logger.debug("OID sai map:\n" + pprint.pformat(oid_sai_map, indent=2)) # { OID -> if_name (SONiC) } oid_name_map = { get_index(if_name): if_name for if_name in if_name_map # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None } logger.debug("OID name map:\n" + pprint.pformat(oid_name_map, indent=2)) # SyncD consistency checks. if not oid_sai_map: # In the event no interface exists that follows the SONiC pattern, no OIDs are able to be registered. # A RuntimeError here will prevent the 'main' module from loading. (This is desirable.) message = "No interfaces found matching pattern '{}'. SyncD database is incoherent." \ .format(port_util.SONIC_ETHERNET_RE_PATTERN) logger.error(message) raise RuntimeError(message) elif len(if_id_map) < len(if_name_map) or len(oid_sai_map) < len( if_name_map): # a length mismatch indicates a bad interface name logger.warning( "SyncD database contains incoherent interface names. Interfaces must match pattern '{}'" .format(port_util.SONIC_ETHERNET_RE_PATTERN)) logger.warning("Port name map:\n" + pprint.pformat(if_name_map, indent=2)) # { SONiC name -> optional rename } if_alias_map = _if_alias_map logger.debug("Chassis name map:\n" + pprint.pformat(if_alias_map, indent=2)) if if_alias_map is None or len(if_alias_map) == 0: logger.warning("No alias map found--port names will use SONiC names.") if_alias_map = dict(zip(if_name_map.keys(), if_name_map.keys())) return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map
def init_sync_d_interface_tables(db_conn): """ Initializes interface maps for SyncD-connected MIB(s). :return: tuple(if_name_map, if_id_map, oid_map, if_alias_map) """ # { if_name (SONiC) -> sai_id } # ex: { "Ethernet76" : "1000000000023" } if_name_map, if_id_map = port_util.get_interface_oid_map(db_conn) if_name_map = {if_name: sai_id for if_name, sai_id in if_name_map.items() if \ (re.match(port_util.SONIC_ETHERNET_RE_PATTERN, if_name.decode()) or \ re.match(port_util.SONIC_ETHERNET_BP_RE_PATTERN, if_name.decode()))} # As sai_id is not unique in multi-asic platform, concatenate it with # namespace to get a unique key. Assuming that ':' is not present in namespace # string or in sai id. # sai_id_key = namespace : sai_id if_id_map = {get_sai_id_key(db_conn.namespace, sai_id): if_name for sai_id, if_name in if_id_map.items() if \ (re.match(port_util.SONIC_ETHERNET_RE_PATTERN, if_name.decode()) or \ re.match(port_util.SONIC_ETHERNET_BP_RE_PATTERN, if_name.decode()))} logger.debug("Port name map:\n" + pprint.pformat(if_name_map, indent=2)) logger.debug("Interface name map:\n" + pprint.pformat(if_id_map, indent=2)) # { OID -> sai_id } oid_sai_map = {get_index(if_name): sai_id for if_name, sai_id in if_name_map.items() # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None} logger.debug("OID sai map:\n" + pprint.pformat(oid_sai_map, indent=2)) # { OID -> if_name (SONiC) } oid_name_map = {get_index(if_name): if_name for if_name in if_name_map # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None} logger.debug("OID name map:\n" + pprint.pformat(oid_name_map, indent=2)) # SyncD consistency checks. if not oid_sai_map: # In the event no interface exists that follows the SONiC pattern, no OIDs are able to be registered. # A RuntimeError here will prevent the 'main' module from loading. (This is desirable.) message = "No interfaces found matching pattern '{}'. SyncD database is incoherent." \ .format(port_util.SONIC_ETHERNET_RE_PATTERN) logger.error(message) raise RuntimeError(message) elif len(if_id_map) < len(if_name_map) or len(oid_sai_map) < len(if_name_map): # a length mismatch indicates a bad interface name logger.warning("SyncD database contains incoherent interface names. Interfaces must match pattern '{}'" .format(port_util.SONIC_ETHERNET_RE_PATTERN)) logger.warning("Port name map:\n" + pprint.pformat(if_name_map, indent=2)) if_alias_map = dict() for if_name in if_name_map: if_entry = db_conn.get_all(APPL_DB, if_entry_table(if_name), blocking=True) if_alias_map[if_name] = if_entry.get(b'alias', if_name) logger.debug("Chassis name map:\n" + pprint.pformat(if_alias_map, indent=2)) return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map
def init_sync_d_interface_tables(db_conn): """ Initializes interface maps for SyncD-connected MIB(s). :return: tuple(if_name_map, if_id_map, oid_map, if_alias_map) """ # Make sure we're connected to COUNTERS_DB db_conn.connect(COUNTERS_DB) # { if_name (SONiC) -> sai_id } # ex: { "Ethernet76" : "1000000000023" } if_name_map, if_id_map = port_util.get_interface_oid_map(db_conn) logger.debug("Port name map:\n" + pprint.pformat(if_name_map, indent=2)) logger.debug("Interface name map:\n" + pprint.pformat(if_id_map, indent=2)) # { OID -> sai_id } oid_sai_map = {get_index(if_name): sai_id for if_name, sai_id in if_name_map.items() # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None} logger.debug("OID sai map:\n" + pprint.pformat(oid_sai_map, indent=2)) # { OID -> if_name (SONiC) } oid_name_map = {get_index(if_name): if_name for if_name in if_name_map # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None} logger.debug("OID name map:\n" + pprint.pformat(oid_name_map, indent=2)) # SyncD consistency checks. if not oid_sai_map: # In the event no interface exists that follows the SONiC pattern, no OIDs are able to be registered. # A RuntimeError here will prevent the 'main' module from loading. (This is desirable.) message = "No interfaces found matching pattern '{}'. SyncD database is incoherent." \ .format(port_util.SONIC_ETHERNET_RE_PATTERN) logger.error(message) raise RuntimeError(message) elif len(if_id_map) < len(if_name_map) or len(oid_sai_map) < len(if_name_map): # a length mismatch indicates a bad interface name logger.warning("SyncD database contains incoherent interface names. Interfaces must match pattern '{}'" .format(port_util.SONIC_ETHERNET_RE_PATTERN)) logger.warning("Port name map:\n" + pprint.pformat(if_name_map, indent=2)) db_conn.connect(APPL_DB) if_alias_map = dict() for if_name in if_name_map: if_entry = db_conn.get_all(APPL_DB, if_entry_table(if_name), blocking=True) if_alias_map[if_name] = if_entry.get(b'alias', if_name) logger.debug("Chassis name map:\n" + pprint.pformat(if_alias_map, indent=2)) return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map
def init_mgmt_interface_tables(db_conn): """ Initializes interface maps for mgmt ports :param db_conn: db connector :return: tuple of mgmt name to oid map and mgmt name to alias map """ db_conn.connect(CONFIG_DB) db_conn.connect(STATE_DB) mgmt_ports_keys = db_conn.keys(CONFIG_DB, mgmt_if_entry_table(b'*')) if not mgmt_ports_keys: logger.debug('No managment ports found in {}'.format(mgmt_if_entry_table(b''))) return {}, {} mgmt_ports = [key.split(mgmt_if_entry_table(b''))[-1] for key in mgmt_ports_keys] oid_name_map = {get_index(mgmt_name): mgmt_name for mgmt_name in mgmt_ports} logger.debug('Managment port map:\n' + pprint.pformat(oid_name_map, indent=2)) if_alias_map = dict() for if_name in oid_name_map.values(): if_entry = db_conn.get_all(CONFIG_DB, mgmt_if_entry_table(if_name), blocking=True) if_alias_map[if_name] = if_entry.get(b'alias', if_name) logger.debug("Management alias map:\n" + pprint.pformat(if_alias_map, indent=2)) return oid_name_map, if_alias_map
def init_mgmt_interface_tables(db_conn): """ Initializes interface maps for mgmt ports :param db_conn: db connector :return: tuple of mgmt name to oid map and mgmt name to alias map """ db_conn.connect(CONFIG_DB) db_conn.connect(STATE_DB) mgmt_ports_keys = db_conn.keys(CONFIG_DB, mgmt_if_entry_table(b'*')) if not mgmt_ports_keys: logger.warning('No managment ports found in {}'.format(mgmt_if_entry_table(b''))) return {}, {} mgmt_ports = [key.split(mgmt_if_entry_table(b''))[-1] for key in mgmt_ports_keys] oid_name_map = {get_index(mgmt_name): mgmt_name for mgmt_name in mgmt_ports} logger.debug('Managment port map:\n' + pprint.pformat(oid_name_map, indent=2)) if_alias_map = dict() for if_name in oid_name_map.values(): if_entry = db_conn.get_all(CONFIG_DB, mgmt_if_entry_table(if_name), blocking=True) if_alias_map[if_name] = if_entry.get(b'alias', if_name) logger.debug("Management alias map:\n" + pprint.pformat(if_alias_map, indent=2)) return oid_name_map, if_alias_map
def init_sync_d_vlan_tables(db_conn): """ Initializes vlan interface maps for SyncD-connected MIB(s). :return: tuple(vlan_name_map, oid_sai_map, oid_name_map) """ vlan_name_map = port_util.get_vlan_interface_oid_map(db_conn) logger.debug("Vlan oid map:\n" + pprint.pformat(vlan_name_map, indent=2)) # { OID -> sai_id } oid_sai_map = {get_index(if_name): sai_id for sai_id, if_name in vlan_name_map.items() # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None} logger.debug("OID sai map:\n" + pprint.pformat(oid_sai_map, indent=2)) # { OID -> if_name (SONiC) } oid_name_map = {get_index(if_name): if_name for sai_id, if_name in vlan_name_map.items() # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None} logger.debug("OID name map:\n" + pprint.pformat(oid_name_map, indent=2)) return vlan_name_map, oid_sai_map, oid_name_map
def init_sync_d_lag_tables(db_conn): """ Helper method. Connects to and initializes LAG interface maps for SyncD-connected MIB(s). :param db_conn: database connector :return: tuple(lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map) """ # { lag_name (SONiC) -> [ lag_members (if_name) ] } # ex: { "PortChannel0" : [ "Ethernet0", "Ethernet4" ] } lag_name_if_name_map = {} # { if_name (SONiC) -> lag_name } # ex: { "Ethernet0" : "PortChannel0" } if_name_lag_name_map = {} # { OID -> lag_name (SONiC) } oid_lag_name_map = {} # { lag_name (SONiC) -> lag_oid (SAI) } lag_sai_map = {} lag_entries = db_conn.keys(APPL_DB, b"LAG_TABLE:*") if not lag_entries: return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, lag_sai_map lag_sai_map = db_conn.get_all(COUNTERS_DB, b"COUNTERS_LAG_NAME_MAP") lag_sai_map = {name: sai_id.lstrip(b"oid:0x") for name, sai_id in lag_sai_map.items()} for lag_entry in lag_entries: lag_name = lag_entry[len(b"LAG_TABLE:"):] lag_members = db_conn.keys(APPL_DB, b"LAG_MEMBER_TABLE:%s:*" % lag_name) # TODO: db_conn.keys() should really return [] instead of None if lag_members is None: lag_members = [] def member_name_str(val, lag_name): return val[len(b"LAG_MEMBER_TABLE:%s:" % lag_name):] lag_member_names = [member_name_str(m, lag_name) for m in lag_members] lag_name_if_name_map[lag_name] = lag_member_names for lag_member_name in lag_member_names: if_name_lag_name_map[lag_member_name] = lag_name for if_name in lag_name_if_name_map.keys(): idx = get_index(if_name) if idx: oid_lag_name_map[idx] = if_name return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, lag_sai_map
def init_sync_d_lag_tables(db_conn): """ Helper method. Connects to and initializes LAG interface maps for SyncD-connected MIB(s). :param db_conn: database connector :return: tuple(lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map) """ # { lag_name (SONiC) -> [ lag_members (if_name) ] } # ex: { "PortChannel0" : [ "Ethernet0", "Ethernet4" ] } lag_name_if_name_map = {} # { if_name (SONiC) -> lag_name } # ex: { "Ethernet0" : "PortChannel0" } if_name_lag_name_map = {} # { OID -> lag_name (SONiC) } oid_lag_name_map = {} db_conn.connect(APPL_DB) lag_entries = db_conn.keys(APPL_DB, b"LAG_TABLE:*") if not lag_entries: return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map for lag_entry in lag_entries: lag_name = lag_entry[len(b"LAG_TABLE:"):] lag_members = db_conn.keys(APPL_DB, b"LAG_MEMBER_TABLE:%s:*" % lag_name) # TODO: db_conn.keys() should really return [] instead of None if lag_members is None: lag_members = [] def member_name_str(val, lag_name): return val[len(b"LAG_MEMBER_TABLE:%s:" % lag_name):] lag_member_names = [member_name_str(m, lag_name) for m in lag_members] lag_name_if_name_map[lag_name] = lag_member_names for lag_member_name in lag_member_names: if_name_lag_name_map[lag_member_name] = lag_name for if_name in lag_name_if_name_map.keys(): idx = get_index(if_name) if idx: oid_lag_name_map[idx] = if_name return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map