From ada41e2a524668d1ec1565f94b6a2e1e8f7a2faa Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Tue, 30 Jun 2020 13:28:06 -0700 Subject: [PATCH 01/12] Add dict in Namespace class to maintain a mapping of interface index and database instance to avoid checking if a key exists every time for get_all. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 57 ++++++++++++++---- src/sonic_ax_impl/mibs/ieee802_1ab.py | 58 ++++++++++++++----- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 31 +++++++--- src/sonic_ax_impl/mibs/ietf/rfc2737.py | 28 ++++----- src/sonic_ax_impl/mibs/ietf/rfc2863.py | 27 ++++++--- src/sonic_ax_impl/mibs/ietf/rfc3433.py | 8 +-- src/sonic_ax_impl/mibs/ietf/rfc4292.py | 6 +- src/sonic_ax_impl/mibs/ietf/rfc4363.py | 8 ++- .../mibs/vendor/cisco/ciscoPfcExtMIB.py | 13 +++-- .../mibs/vendor/cisco/ciscoSwitchQosMIB.py | 11 +++- tests/namespace/test_mibs.py | 3 +- 11 files changed, 181 insertions(+), 69 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index e9353861d..bccf659ea 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -426,16 +426,18 @@ def update_data(self): self.oid_list = [] self.oid_map = {} - keys = Namespace.dbs_keys(self.db_conn, SNMP_OVERLAY_DB, self.prefix_str + '*') + Namespace.connect_all_dbs(self.db_conn, SNMP_OVERLAY_DB) + keys = Namespace.dbs_keys_namespace(self.db_conn, SNMP_OVERLAY_DB, self.prefix_str + '*') # TODO: fix db_conn.keys to return empty list instead of None if there is no match if keys is None: - keys = [] + keys = {} for key in keys: + db_instance = keys[key] key = key.decode() oid = oid2tuple(key, dot_prefix=False) self.oid_list.append(oid) - value = Namespace.dbs_get_all(self.db_conn, SNMP_OVERLAY_DB, key) + value = self.db_conn[db_instance].get_all(SNMP_OVERLAY_DB, key) if value[b'type'] in [b'COUNTER_32', b'COUNTER_64']: self.oid_map[oid] = int(value[b'data']) else: @@ -477,6 +479,22 @@ def dbs_keys(dbs, db_name, pattern='*'): result_keys.extend(keys) return result_keys + @staticmethod + def dbs_keys_namespace(dbs, db_name, pattern='*'): + """ + dbs_keys_namespace function execute on global + and all namespace DBs. Provides a map of keys + and namespace(db instance). + """ + result_keys={} + #for db_conn in dbs: + for inst in range(len(dbs)): + keys = dbs[inst].keys(db_name, pattern) + if keys is not None: + keys_ns = dict.fromkeys(keys, inst) + result_keys.update(keys_ns) + return result_keys + @staticmethod def dbs_get_all(dbs, db_name, _hash, *args, **kwargs): """ @@ -504,7 +522,20 @@ def get_non_host_dbs(dbs): return dbs else: return dbs[1:] - + + @staticmethod + def get_start_idx_of_non_host(dbs): + """ + From the list of all dbs, return the list of dbs + which will have interface related tables. + For single namespace db, return the single db. + For multiple namespace dbs, return all dbs except the + host namespace db which is the first db in the list. + """ + if len(dbs) == 1: + return 0 + else: + return 1 @staticmethod def init_namespace_sync_d_interface_tables(dbs): @@ -513,6 +544,7 @@ def init_namespace_sync_d_interface_tables(dbs): if_id_map = {} oid_sai_map = {} oid_name_map = {} + if_oid_namespace = {} """ all_ns_db - will have db_conn to all namespace DBs and @@ -520,19 +552,21 @@ def init_namespace_sync_d_interface_tables(dbs): Ignore first global db to get interface tables if there are multiple namespaces. """ - for db_conn in Namespace.get_non_host_dbs(dbs): + for inst in range(Namespace.get_start_idx_of_non_host(dbs), len(dbs)): if_name_map_ns, \ if_alias_map_ns, \ if_id_map_ns, \ oid_sai_map_ns, \ - oid_name_map_ns = init_sync_d_interface_tables(db_conn) + oid_name_map_ns = init_sync_d_interface_tables(dbs[inst]) if_name_map.update(if_name_map_ns) if_alias_map.update(if_alias_map_ns) if_id_map.update(if_id_map_ns) oid_sai_map.update(oid_sai_map_ns) oid_name_map.update(oid_name_map_ns) + if_oid_namespace_ns = dict.fromkeys(oid_name_map_ns.keys(),inst) + if_oid_namespace.update(if_oid_namespace_ns) - return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map + return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map, if_oid_namespace @staticmethod def init_namespace_sync_d_lag_tables(dbs): @@ -540,6 +574,7 @@ def init_namespace_sync_d_lag_tables(dbs): lag_name_if_name_map = {} if_name_lag_name_map = {} oid_lag_name_map = {} + oid_lag_namespace = {} """ all_ns_db - will have db_conn to all namespace DBs and @@ -547,15 +582,17 @@ def init_namespace_sync_d_lag_tables(dbs): Ignore first global db to get lag tables if there are multiple namespaces. """ - for db_conn in Namespace.get_non_host_dbs(dbs): + for inst in range(Namespace.get_start_idx_of_non_host(dbs), len(dbs)): lag_name_if_name_map_ns, \ if_name_lag_name_map_ns, \ - oid_lag_name_map_ns = init_sync_d_lag_tables(db_conn) + oid_lag_name_map_ns = init_sync_d_lag_tables(dbs[inst]) lag_name_if_name_map.update(lag_name_if_name_map_ns) if_name_lag_name_map.update(if_name_lag_name_map_ns) oid_lag_name_map.update(oid_lag_name_map_ns) + oid_lag_namespace_ns = dict.fromkeys(oid_lag_name_map_ns.keys(),inst) + oid_lag_namespace.update(oid_lag_namespace_ns) - return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map + return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, oid_lag_namespace @staticmethod def init_namespace_sync_d_queue_tables(dbs): diff --git a/src/sonic_ax_impl/mibs/ieee802_1ab.py b/src/sonic_ax_impl/mibs/ieee802_1ab.py index 6b36ff866..a987e6d19 100644 --- a/src/sonic_ax_impl/mibs/ieee802_1ab.py +++ b/src/sonic_ax_impl/mibs/ieee802_1ab.py @@ -111,7 +111,10 @@ def reinit_data(self): """ # establish connection to application database. Namespace.connect_all_dbs(self.db_conn, mibs.APPL_DB) - self.loc_chassis_data = Namespace.dbs_get_all(self.db_conn, mibs.APPL_DB, mibs.LOC_CHASSIS_TABLE) + for db in self.db_conn: + loc_chassis_data_ns = db.get_all(mibs.APPL_DB, mibs.LOC_CHASSIS_TABLE) + if loc_chassis_data_ns is not None: + self.loc_chassis_data.update(loc_chassis_data_ns) self.loc_chassis_data[b'lldp_loc_sys_cap_supported'] = parse_sys_capability(self.loc_chassis_data[b'lldp_loc_sys_cap_supported']) self.loc_chassis_data[b'lldp_loc_sys_cap_enabled'] = parse_sys_capability(self.loc_chassis_data[b'lldp_loc_sys_cap_enabled']) def update_data(self): @@ -158,6 +161,9 @@ def __init__(self): self.loc_port_data = {} self.pubsub = [None] * len(self.db_conn) + # map of if_idx/oid and db instance + self.if_oid_namespace = {} + def reinit_data(self): """ Subclass update interface information @@ -166,7 +172,8 @@ def reinit_data(self): self.if_alias_map, \ self.if_id_map, \ self.oid_sai_map, \ - self.oid_name_map = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) + self.oid_name_map, \ + self.if_oid_namespace = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) self.mgmt_oid_name_map, \ self.mgmt_alias_map = mibs.init_mgmt_interface_tables(self.db_conn[0]) @@ -174,18 +181,22 @@ def reinit_data(self): # merge dataplane and mgmt ports self.oid_name_map.update(self.mgmt_oid_name_map) self.if_alias_map.update(self.mgmt_alias_map) + """ + mgmt interface idx will be mapped to host db or the first db instance. + """ + self.if_oid_namespace.update(dict.fromkeys(self.mgmt_oid_name_map.keys(), 0)) self.if_range = [] # get local port kvs from APP_BD's PORT_TABLE self.loc_port_data = {} for if_oid, if_name in self.oid_name_map.items(): - self.update_interface_data(if_name) + self.update_interface_data(if_name, self.if_oid_namespace[if_oid]) self.if_range.append((if_oid, )) self.if_range.sort() if not self.loc_port_data: logger.warning("0 - b'PORT_TABLE' is empty. No local port information could be retrieved.") - def _get_if_entry(self, if_name): + def _get_if_entry(self, if_name, db_inst): if_table = "" # Once PORT_TABLE will be moved to CONFIG DB @@ -195,18 +206,19 @@ def _get_if_entry(self, if_name): if_table = mibs.if_entry_table(if_name) elif if_name in self.mgmt_oid_name_map.values(): if_table = mibs.mgmt_if_entry_table(if_name) + db_inst = 0 db = mibs.CONFIG_DB else: return None - return Namespace.dbs_get_all(self.db_conn, db, if_table, blocking=True) + return self.db_conn[db_inst].get_all(db, if_table, blocking=True) - def update_interface_data(self, if_name): + def update_interface_data(self, if_name, db_inst): """ Update data from the DB for a single interface """ - loc_port_kvs = self._get_if_entry(if_name) + loc_port_kvs = self._get_if_entry(if_name, db_inst) if not loc_port_kvs: return self.loc_port_data.update({if_name: loc_port_kvs}) @@ -221,7 +233,7 @@ def get_next(self, sub_id): return None return self.if_range[right] - def _update_per_namespace_data(self, pubsub): + def _update_per_namespace_data(self, pubsub, db_inst): """ Listen to updates in APP DB, update local cache """ @@ -232,14 +244,14 @@ def _update_per_namespace_data(self, pubsub): break if b"set" in data: - self.update_interface_data(interface.encode()) + self.update_interface_data(interface.encode(), db_inst) def update_data(self): for i in range(len(self.db_conn)): if not self.pubsub[i]: pattern = mibs.lldp_entry_table(b'*') self.pubsub[i] = mibs.get_redis_pubsub(self.db_conn[i], self.db_conn[i].APPL_DB, pattern) - self._update_per_namespace_data(self.pubsub[i]) + self._update_per_namespace_data(self.pubsub[i], i) def local_port_num(self, sub_id): if len(sub_id) == 0: @@ -393,6 +405,9 @@ def __init__(self): # { sai_id -> { 'counter': 'value' } } self.lldp_counters = {} + # map of if_idx/oid and db instance + self.if_oid_namespace = {} + def reinit_data(self): """ Subclass update interface information @@ -401,9 +416,14 @@ def reinit_data(self): self.if_alias_map, \ self.if_id_map, \ self.oid_sai_map, \ - self.oid_name_map = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) + self.oid_name_map, \ + self.if_oid_namespace = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) self.mgmt_oid_name_map, _ = mibs.init_mgmt_interface_tables(self.db_conn[0]) + """ + mgmt interface idx will be mapped to host db or the first db instance. + """ + self.if_oid_namespace.update(dict.fromkeys(self.mgmt_oid_name_map.keys(), 0)) self.oid_name_map.update(self.mgmt_oid_name_map) @@ -422,11 +442,13 @@ def update_data(self): Subclass update data routine. Updates available LLDP counters. """ # establish connection to application database. + Namespace.connect_all_dbs(self.db_conn, mibs.APPL_DB) self.if_range = [] self.lldp_counters = {} for if_oid, if_name in self.oid_name_map.items(): - lldp_kvs = Namespace.dbs_get_all(self.db_conn, mibs.APPL_DB, mibs.lldp_entry_table(if_name)) + db_inst = self.if_oid_namespace[if_oid] + lldp_kvs = self.db_conn[db_inst].get_all(mibs.APPL_DB, mibs.lldp_entry_table(if_name)) if not lldp_kvs: continue try: @@ -494,8 +516,12 @@ def __init__(self): self.mgmt_ip_str = None self.pubsub = [None] * len(self.db_conn) + # map of if_idx/oid and db instance + self.if_oid_namespace = {} + def update_rem_if_mgmt(self, if_oid, if_name): - lldp_kvs = Namespace.dbs_get_all(self.db_conn, mibs.APPL_DB, mibs.lldp_entry_table(if_name)) + db_inst = self.if_oid_namespace[if_oid] + lldp_kvs = self.db_conn[db_inst].get_all(mibs.APPL_DB, mibs.lldp_entry_table(if_name)) if not lldp_kvs or b'lldp_rem_man_addr' not in lldp_kvs: # this interfaces doesn't have remote lldp data, or the peer doesn't advertise his mgmt address return @@ -561,11 +587,15 @@ def reinit_data(self): """ Subclass reinit data routine. """ - _, _, _, _, self.oid_name_map = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) + _, _, _, _, self.oid_name_map, self.if_oid_namespace = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) self.mgmt_oid_name_map, _ = mibs.init_mgmt_interface_tables(self.db_conn[0]) self.oid_name_map.update(self.mgmt_oid_name_map) + """ + mgmt interface idx will be mapped to host db or the first db instance. + """ + self.if_oid_namespace.update(dict.fromkeys(self.mgmt_oid_name_map.keys(), 0)) # establish connection to application database. Namespace.connect_all_dbs(self.db_conn, mibs.APPL_DB) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index c7dc2848f..c3b421015 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -106,7 +106,8 @@ def update_data(self): self.nexthop_map = {} self.route_list = [] - route_entries = Namespace.dbs_keys(self.db_conn, mibs.APPL_DB, "ROUTE_TABLE:*") + Namespace.connect_all_dbs(self.db_conn, mibs.APPL_DB) + route_entries = Namespace.dbs_keys_namespace(self.db_conn, mibs.APPL_DB, "ROUTE_TABLE:*") if not route_entries: return @@ -115,7 +116,8 @@ def update_data(self): ipnstr = routestr[len("ROUTE_TABLE:"):] if ipnstr == "0.0.0.0/0": ipn = ipaddress.ip_network(ipnstr) - ent = Namespace.dbs_get_all(self.db_conn, mibs.APPL_DB, routestr, blocking=True) + db_inst = route_entries[route_entry] + ent = self.db_conn[db_inst].get_all(mibs.APPL_DB, routestr, blocking=True) nexthops = ent[b"nexthop"].decode() for nh in nexthops.split(','): # TODO: if ipn contains IP range, create more sub_id here @@ -169,6 +171,10 @@ def __init__(self): self.oid_sai_map = {} self.oid_name_map = {} + # map of if_idx/oid and db instance + self.if_oid_namespace = {} + self.oid_lag_namespace = {} + def reinit_data(self): """ Subclass update interface information @@ -177,7 +183,8 @@ def reinit_data(self): self.if_alias_map, \ self.if_id_map, \ self.oid_sai_map, \ - self.oid_name_map = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) + self.oid_name_map, \ + self.if_oid_namespace = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) """ db_conn - will have db_conn to all namespace DBs and global db. First db in the list is global db. @@ -185,6 +192,10 @@ def reinit_data(self): """ self.mgmt_oid_name_map, \ self.mgmt_alias_map = mibs.init_mgmt_interface_tables(self.db_conn[0]) + """ + mgmt interface idx will be mapped to host db or the first db instance. + """ + self.if_oid_namespace.update(dict.fromkeys(self.mgmt_oid_name_map.keys(), 0)) def update_data(self): """ @@ -192,12 +203,13 @@ def update_data(self): Pulls the table references for each interface. """ self.if_counters = \ - {sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) - for sai_id in self.if_id_map} + {self.oid_sai_map[if_idx]: self.db_conn[self.if_oid_namespace[if_idx]].get_all(mibs.COUNTERS_DB, mibs.counter_table(self.oid_sai_map[if_idx]), blocking=True) + for if_idx in self.oid_sai_map} self.lag_name_if_name_map, \ self.if_name_lag_name_map, \ - self.oid_lag_name_map = Namespace.init_namespace_sync_d_lag_tables(self.db_conn) + self.oid_lag_name_map, \ + self.oid_lag_namespace = Namespace.init_namespace_sync_d_lag_tables(self.db_conn) self.if_range = sorted(list(self.oid_sai_map.keys()) + list(self.oid_lag_name_map.keys()) + @@ -314,15 +326,18 @@ def _get_if_entry(self, sub_id): db = mibs.APPL_DB if oid in self.oid_lag_name_map: if_table = mibs.lag_entry_table(self.oid_lag_name_map[oid]) + db_inst = self.oid_lag_namespace[oid] elif oid in self.mgmt_oid_name_map: if_table = mibs.mgmt_if_entry_table(self.mgmt_oid_name_map[oid]) + db_inst = 0 db = mibs.CONFIG_DB elif oid in self.oid_name_map: if_table = mibs.if_entry_table(self.oid_name_map[oid]) + db_inst = self.if_oid_namespace[oid] else: return None - return Namespace.dbs_get_all(self.db_conn, db, if_table, blocking=True) + return self.db_conn[db_inst].get_all(db, if_table, blocking=True) def _get_if_entry_state_db(self, sub_id): """ @@ -341,7 +356,7 @@ def _get_if_entry_state_db(self, sub_id): else: return None - return Namespace.dbs_get_all(self.db_conn, db, if_table, blocking=False) + return self.db_conn[0].get_all(db, if_table, blocking=False) def _get_status(self, sub_id, key): """ diff --git a/src/sonic_ax_impl/mibs/ietf/rfc2737.py b/src/sonic_ax_impl/mibs/ietf/rfc2737.py index b503967d1..87ee5cee1 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc2737.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc2737.py @@ -152,7 +152,7 @@ def reinit_data(self): self.physical_model_name_map = {} # update interface maps - _, self.if_alias_map, _, _, _ = \ + _, self.if_alias_map, _, _, _, _ = \ Namespace.init_namespace_sync_d_interface_tables(Namespace.init_namespace_dbs()) device_metadata = mibs.get_device_metadata(self.statedb[0]) @@ -168,20 +168,20 @@ def reinit_data(self): self.physical_serial_number_map[chassis_sub_id] = chassis_serial_number # retrieve the initial list of transceivers that are present in the system - transceiver_info = Namespace.dbs_keys(self.statedb, mibs.STATE_DB, self.TRANSCEIVER_KEY_PATTERN) + transceiver_info = Namespace.dbs_keys_namespace(self.statedb, mibs.STATE_DB, self.TRANSCEIVER_KEY_PATTERN) if transceiver_info: - self.transceiver_entries = [entry.decode() \ + self.transceiver_entries = [(entry.decode(), transceiver_info[entry]) \ for entry in transceiver_info] else: - self.transceiver_entries = [] + self.transceiver_entries = {} # update cache with initial data - for transceiver_entry in self.transceiver_entries: + for transceiver_entry,namespace in self.transceiver_entries: # extract interface name interface = transceiver_entry.split(mibs.TABLE_NAME_SEPARATOR_VBAR)[-1] - self._update_transceiver_cache(interface) + self._update_transceiver_cache(interface, namespace) - def _update_per_namespace_data(self, pubsub): + def _update_per_namespace_data(self, pubsub, db_instance): """ Update cache. Here we listen to changes in STATE_DB TRANSCEIVER_INFO table @@ -213,7 +213,7 @@ def _update_per_namespace_data(self, pubsub): continue if b"set" in data: - self._update_transceiver_cache(interface) + self._update_transceiver_cache(interface, db_instance) elif b"del" in data: # remove deleted transceiver remove_sub_ids = [mibs.get_transceiver_sub_id(ifindex)] @@ -233,9 +233,9 @@ def update_data(self): if not self.pubsub[i]: pattern = self.TRANSCEIVER_KEY_PATTERN self.pubsub[i] = mibs.get_redis_pubsub(self.statedb[i], self.statedb[i].STATE_DB, pattern) - self._update_per_namespace_data(self.pubsub[i]) + self._update_per_namespace_data(self.pubsub[i], i) - def _update_transceiver_cache(self, interface): + def _update_transceiver_cache(self, interface, db_instance): """ Update data for single transceiver :param: interface: Interface name associated with transceiver @@ -252,7 +252,7 @@ def _update_transceiver_cache(self, interface): insort_right(self.physical_entities, sub_id) # get transceiver information from transceiver info entry in STATE DB - transceiver_info = Namespace.dbs_get_all(self.statedb, mibs.STATE_DB, + transceiver_info = self.statedb[db_instance].get_all(mibs.STATE_DB, mibs.transceiver_info_table(interface)) if not transceiver_info: @@ -274,9 +274,9 @@ def _update_transceiver_cache(self, interface): self.physical_description_map[sub_id] = get_transceiver_description(sfp_type, ifalias) # update transceiver sensor cache - self._update_transceiver_sensor_cache(interface) + self._update_transceiver_sensor_cache(interface, db_instance) - def _update_transceiver_sensor_cache(self, interface): + def _update_transceiver_sensor_cache(self, interface, db_instance): """ Update sensor data for single transceiver :param: interface: Interface name associated with transceiver @@ -286,7 +286,7 @@ def _update_transceiver_sensor_cache(self, interface): ifindex = port_util.get_index_from_str(interface) # get transceiver sensors from transceiver dom entry in STATE DB - transceiver_dom_entry = Namespace.dbs_get_all(self.statedb, mibs.STATE_DB, + transceiver_dom_entry = self.statedb[db_instance].get_all(mibs.STATE_DB, mibs.transceiver_dom_table(interface)) if not transceiver_dom_entry: diff --git a/src/sonic_ax_impl/mibs/ietf/rfc2863.py b/src/sonic_ax_impl/mibs/ietf/rfc2863.py index ec575e7d0..078719b14 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc2863.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc2863.py @@ -67,6 +67,10 @@ def __init__(self): self.if_name_lag_name_map = {} self.oid_lag_name_map = {} + # map of if_idx/oid and db instance + self.if_oid_namespace = {} + self.oid_lag_namespace = {} + def reinit_data(self): """ Subclass update interface information @@ -75,11 +79,13 @@ def reinit_data(self): self.if_alias_map, \ self.if_id_map, \ self.oid_sai_map, \ - self.oid_name_map = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) + self.oid_name_map, \ + self.if_oid_namespace = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) self.lag_name_if_name_map, \ self.if_name_lag_name_map, \ - self.oid_lag_name_map = Namespace.init_namespace_sync_d_lag_tables(self.db_conn) + self.oid_lag_name_map, \ + self.oid_lag_namespace = Namespace.init_namespace_sync_d_lag_tables(self.db_conn) """ db_conn - will have db_conn to all namespace DBs and global db. First db in the list is global db. @@ -87,6 +93,11 @@ def reinit_data(self): """ self.mgmt_oid_name_map, \ self.mgmt_alias_map = mibs.init_mgmt_interface_tables(self.db_conn[0]) + """ + mgmt interface idx will be mapped to host db or the first db instance. + """ + self.if_oid_namespace.update(dict.fromkeys(self.mgmt_oid_name_map.keys(), 0)) + self.if_range = sorted(list(self.oid_sai_map.keys()) + list(self.oid_lag_name_map.keys()) + @@ -98,10 +109,9 @@ def update_data(self): Update redis (caches config) Pulls the table references for each interface. """ - self.if_counters = { - sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) - for sai_id in self.if_id_map} - + self.if_counters = \ + {self.oid_sai_map[if_idx]: self.db_conn[self.if_oid_namespace[if_idx]].get_all(mibs.COUNTERS_DB, mibs.counter_table(self.oid_sai_map[if_idx]), blocking=True) + for if_idx in self.oid_sai_map} def get_next(self, sub_id): """ @@ -214,15 +224,18 @@ def _get_if_entry(self, sub_id): db = mibs.APPL_DB if oid in self.oid_lag_name_map: if_table = mibs.lag_entry_table(self.oid_lag_name_map[oid]) + db_inst = self.oid_lag_namespace[oid] elif oid in self.mgmt_oid_name_map: if_table = mibs.mgmt_if_entry_table(self.mgmt_oid_name_map[oid]) + db_inst = 0 db = mibs.CONFIG_DB elif oid in self.oid_name_map: if_table = mibs.if_entry_table(self.oid_name_map[oid]) + db_inst = self.if_oid_namespace[oid] else: return None - return Namespace.dbs_get_all(self.db_conn, db, if_table, blocking=True) + return self.db_conn[db_inst].get_all(db, if_table, blocking=True) def get_high_speed(self, sub_id): """ diff --git a/src/sonic_ax_impl/mibs/ietf/rfc3433.py b/src/sonic_ax_impl/mibs/ietf/rfc3433.py index 4e97b2bab..9f2822abf 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc3433.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc3433.py @@ -277,10 +277,10 @@ def reinit_data(self): self.ent_phy_sensor_value_map = {} self.ent_phy_sensor_oper_state_map = {} - transceiver_dom_encoded = Namespace.dbs_keys(self.statedb, mibs.STATE_DB, + transceiver_dom_encoded = Namespace.dbs_keys_namespace(self.statedb, mibs.STATE_DB, self.TRANSCEIVER_DOM_KEY_PATTERN) if transceiver_dom_encoded: - self.transceiver_dom = [entry.decode() for entry in transceiver_dom_encoded] + self.transceiver_dom = [(entry.decode(), transceiver_dom_encoded[entry]) for entry in transceiver_dom_encoded] def update_data(self): """ @@ -293,7 +293,7 @@ def update_data(self): return # update transceiver sensors cache - for transceiver_dom_entry in self.transceiver_dom: + for transceiver_dom_entry, db_inst in self.transceiver_dom: # extract interface name interface = transceiver_dom_entry.split(mibs.TABLE_NAME_SEPARATOR_VBAR)[-1] ifindex = port_util.get_index_from_str(interface) @@ -305,7 +305,7 @@ def update_data(self): continue # get transceiver sensors from transceiver dom entry in STATE DB - transceiver_dom_entry_data = Namespace.dbs_get_all(self.statedb, mibs.STATE_DB, + transceiver_dom_entry_data = self.statedb[db_inst].get_all(mibs.STATE_DB, transceiver_dom_entry) if not transceiver_dom_entry_data: diff --git a/src/sonic_ax_impl/mibs/ietf/rfc4292.py b/src/sonic_ax_impl/mibs/ietf/rfc4292.py index c004338bb..ba8b6b66c 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc4292.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc4292.py @@ -49,7 +49,8 @@ def update_data(self): self.route_dest_list.append(sub_id) self.route_dest_map[sub_id] = self.loips[loip].packed - route_entries = Namespace.dbs_keys(self.db_conn, mibs.APPL_DB, "ROUTE_TABLE:*") + Namespace.connect_all_dbs(self.db_conn, mibs.APPL_DB) + route_entries = Namespace.dbs_keys_namespace(self.db_conn, mibs.APPL_DB, "ROUTE_TABLE:*") if not route_entries: return @@ -58,7 +59,8 @@ def update_data(self): ipnstr = routestr[len("ROUTE_TABLE:"):] if ipnstr == "0.0.0.0/0": ipn = ipaddress.ip_network(ipnstr) - ent = Namespace.dbs_get_all(self.db_conn, mibs.APPL_DB, routestr, blocking=True) + namespace = route_entries[route_entry] + ent = self.db_conn[namespace].get_all(mibs.APPL_DB, routestr, blocking=True) nexthops = ent[b"nexthop"].decode() ifnames = ent[b"ifname"].decode() for nh, ifn in zip(nexthops.split(','), ifnames.split(',')): diff --git a/src/sonic_ax_impl/mibs/ietf/rfc4363.py b/src/sonic_ax_impl/mibs/ietf/rfc4363.py index e9aa46af6..eb371aadc 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc4363.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc4363.py @@ -41,7 +41,7 @@ def reinit_data(self): self.if_alias_map, \ self.if_id_map, \ self.oid_sai_map, \ - self.oid_name_map = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) + self.oid_name_map, _ = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) self.if_bpid_map = Namespace.dbs_get_bridge_port_map(self.db_conn, mibs.ASIC_DB) self.bvid_vlan_map.clear() @@ -54,7 +54,8 @@ def update_data(self): self.vlanmac_ifindex_map = {} self.vlanmac_ifindex_list = [] - fdb_strings = Namespace.dbs_keys(self.db_conn, mibs.ASIC_DB, "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:*") + Namespace.connect_all_dbs(self.db_conn, mibs.ASIC_DB) + fdb_strings = Namespace.dbs_keys_namespace(self.db_conn, mibs.ASIC_DB, "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:*") if not fdb_strings: return @@ -66,7 +67,8 @@ def update_data(self): mibs.logger.error("SyncD 'ASIC_DB' includes invalid FDB_ENTRY '{}': {}.".format(fdb_str, e)) break - ent = Namespace.dbs_get_all(self.db_conn, mibs.ASIC_DB, s, blocking=True) + db_inst = fdb_strings[s] + ent = self.db_conn[db_inst].get_all(mibs.ASIC_DB, s, blocking=True) # Example output: oid:0x3a000000000608 bridge_port_id = ent[b"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID"][6:] if bridge_port_id not in self.if_bpid_map: diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py index 77ee7f88e..75e5f0a2a 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py @@ -28,6 +28,9 @@ def __init__(self): self.if_counters = {} self.if_range = [] + self.if_oid_namespace = {} + self.oid_lag_namespace = {} + def reinit_data(self): """ Subclass update interface information @@ -36,7 +39,8 @@ def reinit_data(self): self.if_alias_map, \ self.if_id_map, \ self.oid_sai_map, \ - self.oid_name_map = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) + self.oid_name_map, \ + self.if_oid_namespace = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) self.update_data() @@ -46,12 +50,13 @@ def update_data(self): Pulls the table references for each interface. """ self.if_counters = \ - {sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) - for sai_id in self.if_id_map} + {self.oid_sai_map[if_idx]: self.db_conn[self.if_oid_namespace[if_idx]].get_all(mibs.COUNTERS_DB, mibs.counter_table(self.oid_sai_map[if_idx]), blocking=True) + for if_idx in self.oid_sai_map} self.lag_name_if_name_map, \ self.if_name_lag_name_map, \ - self.oid_lag_name_map = Namespace.init_namespace_sync_d_lag_tables(self.db_conn) + self.oid_lag_name_map, \ + self.oid_lag_namespace = Namespace.init_namespace_sync_d_lag_tables(self.db_conn) self.if_range = sorted(list(self.oid_sai_map.keys()) + list(self.oid_lag_name_map.keys())) self.if_range = [(i,) for i in self.if_range] diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py index 274b71695..056486627 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py @@ -66,6 +66,9 @@ def __init__(self): self.queue_type_map = {} + self.queue_type_map = {} + self.if_oid_namespace = {} + def reinit_data(self): """ Subclass update interface information @@ -74,7 +77,9 @@ def reinit_data(self): self.if_alias_map, \ self.if_id_map, \ self.oid_sai_map, \ - self.oid_name_map = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) + self.oid_name_map, \ + self.if_oid_namespace = Namespace.init_namespace_sync_d_interface_tables(self.db_conn) + self.port_queues_map, self.queue_stat_map, self.port_queue_list_map = \ Namespace.init_namespace_sync_d_queue_tables(self.db_conn) @@ -90,7 +95,9 @@ def update_data(self): """ for queue_key, sai_id in self.port_queues_map.items(): queue_stat_name = mibs.queue_table(sai_id) - queue_stat = Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, queue_stat_name, blocking=False) + if_idx = int(queue_key.split(':')[0]) + namespace = self.if_oid_namespace[if_idx] + queue_stat = self.db_conn[namespace].get_all(mibs.COUNTERS_DB, queue_stat_name, blocking=False) if queue_stat is not None: self.queue_stat_map[queue_stat_name] = queue_stat diff --git a/tests/namespace/test_mibs.py b/tests/namespace/test_mibs.py index b461d09ed..fd3e10d94 100644 --- a/tests/namespace/test_mibs.py +++ b/tests/namespace/test_mibs.py @@ -20,7 +20,8 @@ def test_init_namespace_sync_d_lag_tables(self): lag_name_if_name_map, \ if_name_lag_name_map, \ - oid_lag_name_map = Namespace.init_namespace_sync_d_lag_tables(dbs) + self.oid_lag_name_map, \ + self.oid_lag_namespace = Namespace.init_namespace_sync_d_lag_tables(dbs) #PortChannel in asic0 Namespace self.assertTrue(b"PortChannel01" in lag_name_if_name_map) self.assertTrue(b"Ethernet-BP0" in lag_name_if_name_map[b"PortChannel01"]) From 6e1c4a74dbdd38c26e30d24bcb8a3f9e212a3db1 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Tue, 30 Jun 2020 13:32:59 -0700 Subject: [PATCH 02/12] Remove trailing whitespace. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 10 +++++----- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index bccf659ea..6ec1c8a6c 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -400,7 +400,7 @@ class RedisOidTreeUpdater(MIBUpdater): def __init__(self, prefix_str): super().__init__() - self.db_conn = Namespace.init_namespace_dbs() + self.db_conn = Namespace.init_namespace_dbs() if prefix_str.startswith('.'): prefix_str = prefix_str[1:] self.prefix_str = prefix_str @@ -427,7 +427,7 @@ def update_data(self): self.oid_map = {} Namespace.connect_all_dbs(self.db_conn, SNMP_OVERLAY_DB) - keys = Namespace.dbs_keys_namespace(self.db_conn, SNMP_OVERLAY_DB, self.prefix_str + '*') + keys = Namespace.dbs_keys_namespace(self.db_conn, SNMP_OVERLAY_DB, self.prefix_str + '*') # TODO: fix db_conn.keys to return empty list instead of None if there is no match if keys is None: keys = {} @@ -437,7 +437,7 @@ def update_data(self): key = key.decode() oid = oid2tuple(key, dot_prefix=False) self.oid_list.append(oid) - value = self.db_conn[db_instance].get_all(SNMP_OVERLAY_DB, key) + value = self.db_conn[db_instance].get_all(SNMP_OVERLAY_DB, key) if value[b'type'] in [b'COUNTER_32', b'COUNTER_64']: self.oid_map[oid] = int(value[b'data']) else: @@ -482,7 +482,7 @@ def dbs_keys(dbs, db_name, pattern='*'): @staticmethod def dbs_keys_namespace(dbs, db_name, pattern='*'): """ - dbs_keys_namespace function execute on global + dbs_keys_namespace function execute on global and all namespace DBs. Provides a map of keys and namespace(db instance). """ @@ -535,7 +535,7 @@ def get_start_idx_of_non_host(dbs): if len(dbs) == 1: return 0 else: - return 1 + return 1 @staticmethod def init_namespace_sync_d_interface_tables(dbs): diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index c3b421015..e7c8fdf14 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -154,7 +154,7 @@ class InterfacesUpdater(MIBUpdater): def __init__(self): super().__init__() - self.db_conn = Namespace.init_namespace_dbs() + self.db_conn = Namespace.init_namespace_dbs() self.lag_name_if_name_map = {} self.if_name_lag_name_map = {} From 9f23f0b9276d8a27538ba45c57f64bd7eebc9e2b Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Tue, 30 Jun 2020 14:19:29 -0700 Subject: [PATCH 03/12] Remove dbs_get_all function. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 14 -------------- .../mibs/vendor/cisco/ciscoSwitchQosMIB.py | 5 ++++- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 6ec1c8a6c..1ec5debcf 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -495,20 +495,6 @@ def dbs_keys_namespace(dbs, db_name, pattern='*'): result_keys.update(keys_ns) return result_keys - @staticmethod - def dbs_get_all(dbs, db_name, _hash, *args, **kwargs): - """ - db get_all function executed on global and all namespace DBs. - """ - result = {} - for db_conn in dbs: - db_conn.connect(db_name) - if(db_conn.exists(db_name, _hash)): - ns_result = db_conn.get_all(db_name, _hash, *args, **kwargs) - if ns_result is not None: - result.update(ns_result) - return result - @staticmethod def get_non_host_dbs(dbs): """ diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py index 056486627..37d8037d9 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py @@ -84,7 +84,10 @@ def reinit_data(self): self.port_queues_map, self.queue_stat_map, self.port_queue_list_map = \ Namespace.init_namespace_sync_d_queue_tables(self.db_conn) - self.queue_type_map = Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, "COUNTERS_QUEUE_TYPE_MAP", blocking=False) + for db_inst in range(Namespace.get_start_idx_of_non_host(dbs), len(dbs)): + queue_type_map_ns = self.db_conn[db_inst].get_all(mibs.COUNTERS_DB, "COUNTERS_QUEUE_TYPE_MAP", blocking=False) + if queue_type_map_ns is not None: + self.queue_type_map.update(queue_type_map_ns) self.update_data() From 220323a46769775c7fb765e65e27187217bb94c0 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Tue, 30 Jun 2020 14:51:19 -0700 Subject: [PATCH 04/12] Add function to get interface index from queue key. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 3 +++ src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 1ec5debcf..5c032f186 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -81,6 +81,9 @@ def queue_table(sai_id): def queue_key(port_index, queue_index): return str(port_index) + ':' + str(queue_index) +def get_port_index_from_queue_key(queue_key): + return int(queue_key.split(':')[0]) + def transceiver_info_table(port_name): """ :param: port_name: port name diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py index 37d8037d9..2a76827c2 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py @@ -98,9 +98,9 @@ def update_data(self): """ for queue_key, sai_id in self.port_queues_map.items(): queue_stat_name = mibs.queue_table(sai_id) - if_idx = int(queue_key.split(':')[0]) - namespace = self.if_oid_namespace[if_idx] - queue_stat = self.db_conn[namespace].get_all(mibs.COUNTERS_DB, queue_stat_name, blocking=False) + if_idx = mibs.get_port_index_from_queue_key(queue_key) + db_inst = self.if_oid_namespace[if_idx] + queue_stat = self.db_conn[db_inst].get_all(mibs.COUNTERS_DB, queue_stat_name, blocking=False) if queue_stat is not None: self.queue_stat_map[queue_stat_name] = queue_stat From 473fd98c5d2769e10128a7f3a72b7e934e514b3d Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Wed, 1 Jul 2020 11:16:12 -0700 Subject: [PATCH 05/12] Fix whitespace. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 11 +++++------ src/sonic_ax_impl/mibs/ietf/rfc2737.py | 2 +- src/sonic_ax_impl/mibs/ietf/rfc4363.py | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 5c032f186..7369ca075 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -456,7 +456,7 @@ def get_oidvalue(self, oid): class Namespace: @staticmethod def init_namespace_dbs(): - db_conn= [] + db_conn = [] SonicDBConfig.load_sonic_global_db_config() for namespace in SonicDBConfig.get_ns_list(): db = SonicV2Connector(use_unix_socket_path=True, namespace=namespace) @@ -474,7 +474,7 @@ def dbs_keys(dbs, db_name, pattern='*'): """ db keys function execute on global and all namespace DBs. """ - result_keys=[] + result_keys = [] for db_conn in dbs: db_conn.connect(db_name) keys = db_conn.keys(db_name, pattern) @@ -489,8 +489,7 @@ def dbs_keys_namespace(dbs, db_name, pattern='*'): and all namespace DBs. Provides a map of keys and namespace(db instance). """ - result_keys={} - #for db_conn in dbs: + result_keys = {} for inst in range(len(dbs)): keys = dbs[inst].keys(db_name, pattern) if keys is not None: @@ -552,7 +551,7 @@ def init_namespace_sync_d_interface_tables(dbs): if_id_map.update(if_id_map_ns) oid_sai_map.update(oid_sai_map_ns) oid_name_map.update(oid_name_map_ns) - if_oid_namespace_ns = dict.fromkeys(oid_name_map_ns.keys(),inst) + if_oid_namespace_ns = dict.fromkeys(oid_name_map_ns.keys(), inst) if_oid_namespace.update(if_oid_namespace_ns) return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map, if_oid_namespace @@ -578,7 +577,7 @@ def init_namespace_sync_d_lag_tables(dbs): lag_name_if_name_map.update(lag_name_if_name_map_ns) if_name_lag_name_map.update(if_name_lag_name_map_ns) oid_lag_name_map.update(oid_lag_name_map_ns) - oid_lag_namespace_ns = dict.fromkeys(oid_lag_name_map_ns.keys(),inst) + oid_lag_namespace_ns = dict.fromkeys(oid_lag_name_map_ns.keys(), inst) oid_lag_namespace.update(oid_lag_namespace_ns) return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, oid_lag_namespace diff --git a/src/sonic_ax_impl/mibs/ietf/rfc2737.py b/src/sonic_ax_impl/mibs/ietf/rfc2737.py index 87ee5cee1..1da0eecbd 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc2737.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc2737.py @@ -176,7 +176,7 @@ def reinit_data(self): self.transceiver_entries = {} # update cache with initial data - for transceiver_entry,namespace in self.transceiver_entries: + for transceiver_entry, namespace in self.transceiver_entries: # extract interface name interface = transceiver_entry.split(mibs.TABLE_NAME_SEPARATOR_VBAR)[-1] self._update_transceiver_cache(interface, namespace) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc4363.py b/src/sonic_ax_impl/mibs/ietf/rfc4363.py index eb371aadc..f35ff3d50 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc4363.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc4363.py @@ -32,7 +32,7 @@ def fdb_vlanmac(self, fdb): vlan_id = Namespace.dbs_get_vlan_id_from_bvid(self.db_conn, fdb["bvid"]) self.bvid_vlan_map[fdb["bvid"]] = vlan_id return (int(vlan_id),) + mac_decimals(fdb["mac"]) - + def reinit_data(self): """ Subclass update interface information From 4d529ad049a5a620cfa6e8c388c544eae849bfdd Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Sat, 4 Jul 2020 15:52:29 -0700 Subject: [PATCH 06/12] Update as per review comments. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 66 ++++++++----------- src/sonic_ax_impl/mibs/ieee802_1ab.py | 34 +++++----- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 12 ++-- src/sonic_ax_impl/mibs/ietf/rfc2863.py | 8 +-- src/sonic_ax_impl/mibs/ietf/rfc3433.py | 4 +- src/sonic_ax_impl/mibs/ietf/rfc4363.py | 4 +- .../mibs/vendor/cisco/ciscoSwitchQosMIB.py | 8 +-- 7 files changed, 62 insertions(+), 74 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 7369ca075..4a97d2032 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -436,11 +436,11 @@ def update_data(self): keys = {} for key in keys: - db_instance = keys[key] + db_index = keys[key] key = key.decode() oid = oid2tuple(key, dot_prefix=False) self.oid_list.append(oid) - value = self.db_conn[db_instance].get_all(SNMP_OVERLAY_DB, key) + value = self.db_conn[db_index].get_all(SNMP_OVERLAY_DB, key) if value[b'type'] in [b'COUNTER_32', b'COUNTER_64']: self.oid_map[oid] = int(value[b'data']) else: @@ -487,43 +487,31 @@ def dbs_keys_namespace(dbs, db_name, pattern='*'): """ dbs_keys_namespace function execute on global and all namespace DBs. Provides a map of keys - and namespace(db instance). + and namespace(db index). """ result_keys = {} - for inst in range(len(dbs)): - keys = dbs[inst].keys(db_name, pattern) + for db_index in range(len(dbs)): + keys = dbs[db_index].keys(db_name, pattern) if keys is not None: - keys_ns = dict.fromkeys(keys, inst) + keys_ns = dict.fromkeys(keys, db_index) result_keys.update(keys_ns) return result_keys @staticmethod - def get_non_host_dbs(dbs): + def get_non_host_db_indexes(dbs): """ From the list of all dbs, return the list of dbs which will have interface related tables. For single namespace db, return the single db. - For multiple namespace dbs, return all dbs except the - host namespace db which is the first db in the list. + For multiple namespace dbs, return db index ofall dbs + except the host namespace db which is the first db + in the list. """ if len(dbs) == 1: - return dbs + start_index = 0 else: - return dbs[1:] - - @staticmethod - def get_start_idx_of_non_host(dbs): - """ - From the list of all dbs, return the list of dbs - which will have interface related tables. - For single namespace db, return the single db. - For multiple namespace dbs, return all dbs except the - host namespace db which is the first db in the list. - """ - if len(dbs) == 1: - return 0 - else: - return 1 + start_index = 1 + return (start_index, len(dbs)) @staticmethod def init_namespace_sync_d_interface_tables(dbs): @@ -540,18 +528,18 @@ def init_namespace_sync_d_interface_tables(dbs): Ignore first global db to get interface tables if there are multiple namespaces. """ - for inst in range(Namespace.get_start_idx_of_non_host(dbs), len(dbs)): + for db_index in self.get_non_host_db_indexes(dbs): if_name_map_ns, \ if_alias_map_ns, \ if_id_map_ns, \ oid_sai_map_ns, \ - oid_name_map_ns = init_sync_d_interface_tables(dbs[inst]) + oid_name_map_ns = init_sync_d_interface_tables(dbs[db_index]) if_name_map.update(if_name_map_ns) if_alias_map.update(if_alias_map_ns) if_id_map.update(if_id_map_ns) oid_sai_map.update(oid_sai_map_ns) oid_name_map.update(oid_name_map_ns) - if_oid_namespace_ns = dict.fromkeys(oid_name_map_ns.keys(), inst) + if_oid_namespace_ns = dict.fromkeys(oid_name_map_ns.keys(), db_index) if_oid_namespace.update(if_oid_namespace_ns) return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map, if_oid_namespace @@ -570,14 +558,14 @@ def init_namespace_sync_d_lag_tables(dbs): Ignore first global db to get lag tables if there are multiple namespaces. """ - for inst in range(Namespace.get_start_idx_of_non_host(dbs), len(dbs)): + for db_index in self.get_non_host_db_indexes(dbs): lag_name_if_name_map_ns, \ if_name_lag_name_map_ns, \ - oid_lag_name_map_ns = init_sync_d_lag_tables(dbs[inst]) + oid_lag_name_map_ns = init_sync_d_lag_tables(dbs[db_index]) lag_name_if_name_map.update(lag_name_if_name_map_ns) if_name_lag_name_map.update(if_name_lag_name_map_ns) oid_lag_name_map.update(oid_lag_name_map_ns) - oid_lag_namespace_ns = dict.fromkeys(oid_lag_name_map_ns.keys(), inst) + oid_lag_namespace_ns = dict.fromkeys(oid_lag_name_map_ns.keys(), db_index) oid_lag_namespace.update(oid_lag_namespace_ns) return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, oid_lag_namespace @@ -594,10 +582,10 @@ def init_namespace_sync_d_queue_tables(dbs): Ignore first global db to get queue tables if there are multiple namespaces. """ - for db_conn in Namespace.get_non_host_dbs(dbs): + for db_index in self.get_non_host_db_indexes(dbs): port_queues_map_ns, \ queue_stat_map_ns, \ - port_queue_list_map_ns = init_sync_d_queue_tables(db_conn) + port_queue_list_map_ns = init_sync_d_queue_tables(dbs[db_index]) port_queues_map.update(port_queues_map_ns) queue_stat_map.update(queue_stat_map_ns) port_queue_list_map.update(port_queue_list_map_ns) @@ -610,15 +598,15 @@ def dbs_get_bridge_port_map(dbs, db_name): get_bridge_port_map from all namespace DBs """ if_br_oid_map = {} - for db_conn in Namespace.get_non_host_dbs(dbs): - if_br_oid_map_ns = port_util.get_bridge_port_map(db_conn) + for db_index in self.get_non_host_db_indexes(dbs): + if_br_oid_map_ns = port_util.get_bridge_port_map(dbs[db_index]) if_br_oid_map.update(if_br_oid_map_ns) return if_br_oid_map @staticmethod def dbs_get_vlan_id_from_bvid(dbs, bvid): - for db_conn in Namespace.get_non_host_dbs(dbs): - db_conn.connect('ASIC_DB') - vlan_obj = db_conn.keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:" + bvid) + for db_index in self.get_non_host_db_indexes(dbs): + dbs[db_index].connect('ASIC_DB') + vlan_obj = dbs[db_index].keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:" + bvid) if vlan_obj is not None: - return port_util.get_vlan_id_from_bvid(db_conn, bvid) + return port_util.get_vlan_id_from_bvid(dbs[db_index], bvid) diff --git a/src/sonic_ax_impl/mibs/ieee802_1ab.py b/src/sonic_ax_impl/mibs/ieee802_1ab.py index a987e6d19..e08dfdb8d 100644 --- a/src/sonic_ax_impl/mibs/ieee802_1ab.py +++ b/src/sonic_ax_impl/mibs/ieee802_1ab.py @@ -161,7 +161,7 @@ def __init__(self): self.loc_port_data = {} self.pubsub = [None] * len(self.db_conn) - # map of if_idx/oid and db instance + # map of if_idx/oid and db index self.if_oid_namespace = {} def reinit_data(self): @@ -182,7 +182,7 @@ def reinit_data(self): self.oid_name_map.update(self.mgmt_oid_name_map) self.if_alias_map.update(self.mgmt_alias_map) """ - mgmt interface idx will be mapped to host db or the first db instance. + mgmt interface idx will be mapped to host db or the first db index. """ self.if_oid_namespace.update(dict.fromkeys(self.mgmt_oid_name_map.keys(), 0)) @@ -196,7 +196,7 @@ def reinit_data(self): if not self.loc_port_data: logger.warning("0 - b'PORT_TABLE' is empty. No local port information could be retrieved.") - def _get_if_entry(self, if_name, db_inst): + def _get_if_entry(self, if_name, db_index): if_table = "" # Once PORT_TABLE will be moved to CONFIG DB @@ -206,19 +206,19 @@ def _get_if_entry(self, if_name, db_inst): if_table = mibs.if_entry_table(if_name) elif if_name in self.mgmt_oid_name_map.values(): if_table = mibs.mgmt_if_entry_table(if_name) - db_inst = 0 + db_index = 0 db = mibs.CONFIG_DB else: return None - return self.db_conn[db_inst].get_all(db, if_table, blocking=True) + return self.db_conn[db_index].get_all(db, if_table, blocking=True) - def update_interface_data(self, if_name, db_inst): + def update_interface_data(self, if_name, db_index): """ Update data from the DB for a single interface """ - loc_port_kvs = self._get_if_entry(if_name, db_inst) + loc_port_kvs = self._get_if_entry(if_name, db_index) if not loc_port_kvs: return self.loc_port_data.update({if_name: loc_port_kvs}) @@ -233,7 +233,7 @@ def get_next(self, sub_id): return None return self.if_range[right] - def _update_per_namespace_data(self, pubsub, db_inst): + def _update_per_namespace_data(self, pubsub, db_index): """ Listen to updates in APP DB, update local cache """ @@ -244,7 +244,7 @@ def _update_per_namespace_data(self, pubsub, db_inst): break if b"set" in data: - self.update_interface_data(interface.encode(), db_inst) + self.update_interface_data(interface.encode(), db_index) def update_data(self): for i in range(len(self.db_conn)): @@ -405,7 +405,7 @@ def __init__(self): # { sai_id -> { 'counter': 'value' } } self.lldp_counters = {} - # map of if_idx/oid and db instance + # map of if_idx/oid and db index self.if_oid_namespace = {} def reinit_data(self): @@ -421,7 +421,7 @@ def reinit_data(self): self.mgmt_oid_name_map, _ = mibs.init_mgmt_interface_tables(self.db_conn[0]) """ - mgmt interface idx will be mapped to host db or the first db instance. + mgmt interface idx will be mapped to host db or the first db index. """ self.if_oid_namespace.update(dict.fromkeys(self.mgmt_oid_name_map.keys(), 0)) @@ -447,8 +447,8 @@ def update_data(self): self.if_range = [] self.lldp_counters = {} for if_oid, if_name in self.oid_name_map.items(): - db_inst = self.if_oid_namespace[if_oid] - lldp_kvs = self.db_conn[db_inst].get_all(mibs.APPL_DB, mibs.lldp_entry_table(if_name)) + db_index = self.if_oid_namespace[if_oid] + lldp_kvs = self.db_conn[db_index].get_all(mibs.APPL_DB, mibs.lldp_entry_table(if_name)) if not lldp_kvs: continue try: @@ -516,12 +516,12 @@ def __init__(self): self.mgmt_ip_str = None self.pubsub = [None] * len(self.db_conn) - # map of if_idx/oid and db instance + # map of if_idx/oid and db index self.if_oid_namespace = {} def update_rem_if_mgmt(self, if_oid, if_name): - db_inst = self.if_oid_namespace[if_oid] - lldp_kvs = self.db_conn[db_inst].get_all(mibs.APPL_DB, mibs.lldp_entry_table(if_name)) + db_index = self.if_oid_namespace[if_oid] + lldp_kvs = self.db_conn[db_index].get_all(mibs.APPL_DB, mibs.lldp_entry_table(if_name)) if not lldp_kvs or b'lldp_rem_man_addr' not in lldp_kvs: # this interfaces doesn't have remote lldp data, or the peer doesn't advertise his mgmt address return @@ -593,7 +593,7 @@ def reinit_data(self): self.oid_name_map.update(self.mgmt_oid_name_map) """ - mgmt interface idx will be mapped to host db or the first db instance. + mgmt interface idx will be mapped to host db or the first db index. """ self.if_oid_namespace.update(dict.fromkeys(self.mgmt_oid_name_map.keys(), 0)) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index e7c8fdf14..9b9b54d26 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -116,8 +116,8 @@ def update_data(self): ipnstr = routestr[len("ROUTE_TABLE:"):] if ipnstr == "0.0.0.0/0": ipn = ipaddress.ip_network(ipnstr) - db_inst = route_entries[route_entry] - ent = self.db_conn[db_inst].get_all(mibs.APPL_DB, routestr, blocking=True) + db_index = route_entries[route_entry] + ent = self.db_conn[db_index].get_all(mibs.APPL_DB, routestr, blocking=True) nexthops = ent[b"nexthop"].decode() for nh in nexthops.split(','): # TODO: if ipn contains IP range, create more sub_id here @@ -326,18 +326,18 @@ def _get_if_entry(self, sub_id): db = mibs.APPL_DB if oid in self.oid_lag_name_map: if_table = mibs.lag_entry_table(self.oid_lag_name_map[oid]) - db_inst = self.oid_lag_namespace[oid] + db_index = self.oid_lag_namespace[oid] elif oid in self.mgmt_oid_name_map: if_table = mibs.mgmt_if_entry_table(self.mgmt_oid_name_map[oid]) - db_inst = 0 + db_index = 0 db = mibs.CONFIG_DB elif oid in self.oid_name_map: if_table = mibs.if_entry_table(self.oid_name_map[oid]) - db_inst = self.if_oid_namespace[oid] + db_index = self.if_oid_namespace[oid] else: return None - return self.db_conn[db_inst].get_all(db, if_table, blocking=True) + return self.db_conn[db_index].get_all(db, if_table, blocking=True) def _get_if_entry_state_db(self, sub_id): """ diff --git a/src/sonic_ax_impl/mibs/ietf/rfc2863.py b/src/sonic_ax_impl/mibs/ietf/rfc2863.py index 078719b14..ff3752a74 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc2863.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc2863.py @@ -224,18 +224,18 @@ def _get_if_entry(self, sub_id): db = mibs.APPL_DB if oid in self.oid_lag_name_map: if_table = mibs.lag_entry_table(self.oid_lag_name_map[oid]) - db_inst = self.oid_lag_namespace[oid] + db_index = self.oid_lag_namespace[oid] elif oid in self.mgmt_oid_name_map: if_table = mibs.mgmt_if_entry_table(self.mgmt_oid_name_map[oid]) - db_inst = 0 + db_index = 0 db = mibs.CONFIG_DB elif oid in self.oid_name_map: if_table = mibs.if_entry_table(self.oid_name_map[oid]) - db_inst = self.if_oid_namespace[oid] + db_index = self.if_oid_namespace[oid] else: return None - return self.db_conn[db_inst].get_all(db, if_table, blocking=True) + return self.db_conn[db_index].get_all(db, if_table, blocking=True) def get_high_speed(self, sub_id): """ diff --git a/src/sonic_ax_impl/mibs/ietf/rfc3433.py b/src/sonic_ax_impl/mibs/ietf/rfc3433.py index 9f2822abf..4576d36ae 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc3433.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc3433.py @@ -293,7 +293,7 @@ def update_data(self): return # update transceiver sensors cache - for transceiver_dom_entry, db_inst in self.transceiver_dom: + for transceiver_dom_entry, db_index in self.transceiver_dom: # extract interface name interface = transceiver_dom_entry.split(mibs.TABLE_NAME_SEPARATOR_VBAR)[-1] ifindex = port_util.get_index_from_str(interface) @@ -305,7 +305,7 @@ def update_data(self): continue # get transceiver sensors from transceiver dom entry in STATE DB - transceiver_dom_entry_data = self.statedb[db_inst].get_all(mibs.STATE_DB, + transceiver_dom_entry_data = self.statedb[db_index].get_all(mibs.STATE_DB, transceiver_dom_entry) if not transceiver_dom_entry_data: diff --git a/src/sonic_ax_impl/mibs/ietf/rfc4363.py b/src/sonic_ax_impl/mibs/ietf/rfc4363.py index f35ff3d50..f831feecf 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc4363.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc4363.py @@ -67,8 +67,8 @@ def update_data(self): mibs.logger.error("SyncD 'ASIC_DB' includes invalid FDB_ENTRY '{}': {}.".format(fdb_str, e)) break - db_inst = fdb_strings[s] - ent = self.db_conn[db_inst].get_all(mibs.ASIC_DB, s, blocking=True) + db_index = fdb_strings[s] + ent = self.db_conn[db_index].get_all(mibs.ASIC_DB, s, blocking=True) # Example output: oid:0x3a000000000608 bridge_port_id = ent[b"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID"][6:] if bridge_port_id not in self.if_bpid_map: diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py index 2a76827c2..370ea96f2 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py @@ -84,8 +84,8 @@ def reinit_data(self): self.port_queues_map, self.queue_stat_map, self.port_queue_list_map = \ Namespace.init_namespace_sync_d_queue_tables(self.db_conn) - for db_inst in range(Namespace.get_start_idx_of_non_host(dbs), len(dbs)): - queue_type_map_ns = self.db_conn[db_inst].get_all(mibs.COUNTERS_DB, "COUNTERS_QUEUE_TYPE_MAP", blocking=False) + for db_index in Namespace.get_non_host_db_indexes(self.db_conn): + queue_type_map_ns = self.db_conn[db_index].get_all(mibs.COUNTERS_DB, "COUNTERS_QUEUE_TYPE_MAP", blocking=False) if queue_type_map_ns is not None: self.queue_type_map.update(queue_type_map_ns) @@ -99,8 +99,8 @@ def update_data(self): for queue_key, sai_id in self.port_queues_map.items(): queue_stat_name = mibs.queue_table(sai_id) if_idx = mibs.get_port_index_from_queue_key(queue_key) - db_inst = self.if_oid_namespace[if_idx] - queue_stat = self.db_conn[db_inst].get_all(mibs.COUNTERS_DB, queue_stat_name, blocking=False) + db_index = self.if_oid_namespace[if_idx] + queue_stat = self.db_conn[db_index].get_all(mibs.COUNTERS_DB, queue_stat_name, blocking=False) if queue_stat is not None: self.queue_stat_map[queue_stat_name] = queue_stat From 7c1888710cf6ed8fe8783f089e77f49d5e86c46b Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Sat, 4 Jul 2020 15:55:30 -0700 Subject: [PATCH 07/12] Minor correction. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 12 ++++++------ src/sonic_ax_impl/mibs/ieee802_1ab.py | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 4a97d2032..9304d7972 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -504,7 +504,7 @@ def get_non_host_db_indexes(dbs): which will have interface related tables. For single namespace db, return the single db. For multiple namespace dbs, return db index ofall dbs - except the host namespace db which is the first db + except the host namespace db which is the first db in the list. """ if len(dbs) == 1: @@ -528,7 +528,7 @@ def init_namespace_sync_d_interface_tables(dbs): Ignore first global db to get interface tables if there are multiple namespaces. """ - for db_index in self.get_non_host_db_indexes(dbs): + for db_index in Namespace.get_non_host_db_indexes(dbs): if_name_map_ns, \ if_alias_map_ns, \ if_id_map_ns, \ @@ -558,7 +558,7 @@ def init_namespace_sync_d_lag_tables(dbs): Ignore first global db to get lag tables if there are multiple namespaces. """ - for db_index in self.get_non_host_db_indexes(dbs): + for db_index in Namespace.get_non_host_db_indexes(dbs): lag_name_if_name_map_ns, \ if_name_lag_name_map_ns, \ oid_lag_name_map_ns = init_sync_d_lag_tables(dbs[db_index]) @@ -582,7 +582,7 @@ def init_namespace_sync_d_queue_tables(dbs): Ignore first global db to get queue tables if there are multiple namespaces. """ - for db_index in self.get_non_host_db_indexes(dbs): + for db_index in Namespace.get_non_host_db_indexes(dbs): port_queues_map_ns, \ queue_stat_map_ns, \ port_queue_list_map_ns = init_sync_d_queue_tables(dbs[db_index]) @@ -598,14 +598,14 @@ def dbs_get_bridge_port_map(dbs, db_name): get_bridge_port_map from all namespace DBs """ if_br_oid_map = {} - for db_index in self.get_non_host_db_indexes(dbs): + for db_index in Namespace.get_non_host_db_indexes(dbs): if_br_oid_map_ns = port_util.get_bridge_port_map(dbs[db_index]) if_br_oid_map.update(if_br_oid_map_ns) return if_br_oid_map @staticmethod def dbs_get_vlan_id_from_bvid(dbs, bvid): - for db_index in self.get_non_host_db_indexes(dbs): + for db_index in Namespace.get_non_host_db_indexes(dbs): dbs[db_index].connect('ASIC_DB') vlan_obj = dbs[db_index].keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:" + bvid) if vlan_obj is not None: diff --git a/src/sonic_ax_impl/mibs/ieee802_1ab.py b/src/sonic_ax_impl/mibs/ieee802_1ab.py index e08dfdb8d..942043f36 100644 --- a/src/sonic_ax_impl/mibs/ieee802_1ab.py +++ b/src/sonic_ax_impl/mibs/ieee802_1ab.py @@ -516,7 +516,7 @@ def __init__(self): self.mgmt_ip_str = None self.pubsub = [None] * len(self.db_conn) - # map of if_idx/oid and db index + # map of if_idx/oid and db index self.if_oid_namespace = {} def update_rem_if_mgmt(self, if_oid, if_name): From 4267524e622202afed9c7ee0d193ee85ccf1d7e9 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Sat, 4 Jul 2020 16:11:16 -0700 Subject: [PATCH 08/12] Minor fix, unit-test failure. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 9304d7972..c7639b2c2 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -511,7 +511,7 @@ def get_non_host_db_indexes(dbs): start_index = 0 else: start_index = 1 - return (start_index, len(dbs)) + return range(start_index, len(dbs)) @staticmethod def init_namespace_sync_d_interface_tables(dbs): From 60da0360b3bfb6935f32e67553956fb37f0cc1a0 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Tue, 7 Jul 2020 14:51:02 -0700 Subject: [PATCH 09/12] Fix lgtm error. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 57a080f33..5bfc8a45d 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -631,7 +631,7 @@ def init_namespace_sync_d_lag_tables(dbs): for db_index in Namespace.get_non_host_db_indexes(dbs): lag_name_if_name_map_ns, \ if_name_lag_name_map_ns, \ - oid_lag_name_map_ns, \ + oid_lag_name_map_ns, \ lag_sai_map_ns = init_sync_d_lag_tables(dbs[db_index]) lag_name_if_name_map.update(lag_name_if_name_map_ns) if_name_lag_name_map.update(if_name_lag_name_map_ns) From 90c804f0800c68e74c226d54e05b49887cec4e8c Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Tue, 7 Jul 2020 20:59:20 -0700 Subject: [PATCH 10/12] Minor update as per review comment. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/ietf/rfc2737.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc2737.py b/src/sonic_ax_impl/mibs/ietf/rfc2737.py index 1da0eecbd..1cc2466f6 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc2737.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc2737.py @@ -181,7 +181,7 @@ def reinit_data(self): interface = transceiver_entry.split(mibs.TABLE_NAME_SEPARATOR_VBAR)[-1] self._update_transceiver_cache(interface, namespace) - def _update_per_namespace_data(self, pubsub, db_instance): + def _update_per_namespace_data(self, pubsub, db_index): """ Update cache. Here we listen to changes in STATE_DB TRANSCEIVER_INFO table @@ -213,7 +213,7 @@ def _update_per_namespace_data(self, pubsub, db_instance): continue if b"set" in data: - self._update_transceiver_cache(interface, db_instance) + self._update_transceiver_cache(interface, db_index) elif b"del" in data: # remove deleted transceiver remove_sub_ids = [mibs.get_transceiver_sub_id(ifindex)] @@ -235,7 +235,7 @@ def update_data(self): self.pubsub[i] = mibs.get_redis_pubsub(self.statedb[i], self.statedb[i].STATE_DB, pattern) self._update_per_namespace_data(self.pubsub[i], i) - def _update_transceiver_cache(self, interface, db_instance): + def _update_transceiver_cache(self, interface, db_index): """ Update data for single transceiver :param: interface: Interface name associated with transceiver @@ -252,7 +252,7 @@ def _update_transceiver_cache(self, interface, db_instance): insort_right(self.physical_entities, sub_id) # get transceiver information from transceiver info entry in STATE DB - transceiver_info = self.statedb[db_instance].get_all(mibs.STATE_DB, + transceiver_info = self.statedb[db_index].get_all(mibs.STATE_DB, mibs.transceiver_info_table(interface)) if not transceiver_info: @@ -274,9 +274,9 @@ def _update_transceiver_cache(self, interface, db_instance): self.physical_description_map[sub_id] = get_transceiver_description(sfp_type, ifalias) # update transceiver sensor cache - self._update_transceiver_sensor_cache(interface, db_instance) + self._update_transceiver_sensor_cache(interface, db_index) - def _update_transceiver_sensor_cache(self, interface, db_instance): + def _update_transceiver_sensor_cache(self, interface, db_index): """ Update sensor data for single transceiver :param: interface: Interface name associated with transceiver @@ -286,7 +286,7 @@ def _update_transceiver_sensor_cache(self, interface, db_instance): ifindex = port_util.get_index_from_str(interface) # get transceiver sensors from transceiver dom entry in STATE DB - transceiver_dom_entry = self.statedb[db_instance].get_all(mibs.STATE_DB, + transceiver_dom_entry = self.statedb[db_index].get_all(mibs.STATE_DB, mibs.transceiver_dom_table(interface)) if not transceiver_dom_entry: From 61c0d9136c61ec26167c58a397ea9d9d060a2870 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Tue, 7 Jul 2020 21:02:38 -0700 Subject: [PATCH 11/12] Remove usage of dbs_get_all. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/__init__.py | 18 ++++++++++++------ src/sonic_ax_impl/mibs/ietf/rfc1213.py | 21 +++++++++++++++------ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 5bfc8a45d..582bd6041 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -646,30 +646,36 @@ def init_namespace_sync_d_lag_tables(dbs): def init_namespace_sync_d_rif_tables(dbs): rif_port_map = {} port_rif_map = {} + port_namespace = {} - for db_conn in Namespace.get_non_host_dbs(dbs): + for db_index in Namespace.get_non_host_db_indexes(dbs): rif_port_map_ns, \ - port_rif_map_ns = init_sync_d_rif_tables(db_conn) + port_rif_map_ns = init_sync_d_rif_tables(dbs[db_index]) rif_port_map.update(rif_port_map_ns) port_rif_map.update(port_rif_map_ns) + port_namespace_ns = dict.fromkeys(rif_port_map_ns.keys(), db_index) + port_namespace.update(port_namespace_ns) - return rif_port_map, port_rif_map + return rif_port_map, port_rif_map, port_namespace @staticmethod def init_namespace_sync_d_vlan_tables(dbs): vlan_name_map = {} oid_sai_map = {} oid_name_map = {} + vlan_oid_namespace = {} - for db_conn in Namespace.get_non_host_dbs(dbs): + for db_index in Namespace.get_non_host_db_indexes(dbs): vlan_name_map_ns, \ oid_sai_map_ns, \ - oid_name_map_ns = init_sync_d_vlan_tables(db_conn) + oid_name_map_ns = init_sync_d_vlan_tables(dbs[db_index]) vlan_name_map.update(vlan_name_map_ns) oid_sai_map.update(oid_sai_map_ns) oid_name_map.update(oid_name_map_ns) + vlan_oid_namespace_ns = dict.fromkeys(oid_name_map.keys(), db_index) + vlan_oid_namespace.update(vlan_oid_namespace_ns) - return vlan_name_map, oid_sai_map, oid_name_map + return vlan_name_map, oid_sai_map, oid_name_map, vlan_oid_namespace @staticmethod def init_namespace_sync_d_queue_tables(dbs): diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index 9efafcf17..13fa3cd9b 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -182,6 +182,8 @@ def __init__(self): # map of if_idx/oid and db instance self.if_oid_namespace = {} self.oid_lag_namespace = {} + self.vlan_oid_namespace = {} + self.port_namespace = {} def reinit_data(self): """ @@ -207,10 +209,12 @@ def reinit_data(self): self.vlan_name_map, \ self.vlan_oid_sai_map, \ - self.vlan_oid_name_map = Namespace.init_namespace_sync_d_vlan_tables(self.db_conn) + self.vlan_oid_name_map, \ + self.vlan_oid_namespace = Namespace.init_namespace_sync_d_vlan_tables(self.db_conn) self.rif_port_map, \ - self.port_rif_map = Namespace.init_namespace_sync_d_rif_tables(self.db_conn) + self.port_rif_map, \ + self.port_namespace = Namespace.init_namespace_sync_d_rif_tables(self.db_conn) def update_data(self): """ @@ -223,11 +227,16 @@ def update_data(self): rif_sai_ids = list(self.rif_port_map) + list(self.vlan_name_map) - self.rif_counters = \ - {sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) - for sai_id in rif_sai_ids} + for sai_id in self.rif_port_map: + db_index = self.port_namespace[sai_id] + self.rif_counters[sai_id] = self.db_conn[db_index].get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) - if self.rif_counters: + for vlan_oid in self.vlan_oid_namespace: + db_index = self.vlan_oid_namespace[vlan_oid] + sai_id = self.vlan_oid_sai_map[vlan_oid] + self.rif_counters[sai_id] = self.db_conn[db_index].get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) + + if self.rif_counters: self.aggregate_counters() self.lag_name_if_name_map, \ From 87c4b5bfd27f901b9e5e89e22eb05e9e62c33a76 Mon Sep 17 00:00:00 2001 From: SuvarnaMeenakshi Date: Tue, 7 Jul 2020 21:28:37 -0700 Subject: [PATCH 12/12] Fix lgtm un-used variable error. Signed-off-by: SuvarnaMeenakshi --- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index 13fa3cd9b..3e99a974a 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -225,8 +225,6 @@ def update_data(self): {self.oid_sai_map[if_idx]: self.db_conn[self.if_oid_namespace[if_idx]].get_all(mibs.COUNTERS_DB, mibs.counter_table(self.oid_sai_map[if_idx]), blocking=True) for if_idx in self.oid_sai_map} - rif_sai_ids = list(self.rif_port_map) + list(self.vlan_name_map) - for sai_id in self.rif_port_map: db_index = self.port_namespace[sai_id] self.rif_counters[sai_id] = self.db_conn[db_index].get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True)