Skip to content

Commit 166c221

Browse files
[Namespace]: Fix interface counters in RFC 1213 (sonic-net#145)
* [Namespace]: Fix interface counters in RFC 1213 for multi-asic platforms. In multi-asic platform, SAI OID is not unique for the whole device. Fix implementation to make sure that interfaces counters is keyed based on interface index. Signed-off-by: SuvarnaMeenakshi <[email protected]>
1 parent c702a57 commit 166c221

File tree

5 files changed

+24
-19
lines changed

5 files changed

+24
-19
lines changed

src/sonic_ax_impl/mibs/__init__.py

+14-8
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ def get_sai_id_key(namespace, sai_id):
148148
Return value: namespace:sai id or sai id
149149
"""
150150
if namespace != '':
151-
return namespace.encode() + b':' + sai_id
151+
return namespace.encode() + b':' + sai_id
152152
else:
153153
return sai_id
154154

@@ -213,20 +213,26 @@ def init_sync_d_interface_tables(db_conn):
213213
Initializes interface maps for SyncD-connected MIB(s).
214214
:return: tuple(if_name_map, if_id_map, oid_map, if_alias_map)
215215
"""
216+
if_id_map = {}
217+
if_name_map = {}
216218

217219
# { if_name (SONiC) -> sai_id }
218220
# ex: { "Ethernet76" : "1000000000023" }
219-
if_name_map, if_id_map = port_util.get_interface_oid_map(db_conn)
220-
if_name_map = {if_name: sai_id for if_name, sai_id in if_name_map.items() if \
221-
(re.match(port_util.SONIC_ETHERNET_RE_PATTERN, if_name.decode()) or \
222-
re.match(port_util.SONIC_ETHERNET_BP_RE_PATTERN, if_name.decode()))}
221+
if_name_map_util, if_id_map_util = port_util.get_interface_oid_map(db_conn)
222+
for if_name, sai_id in if_name_map_util.items():
223+
if_name_str = if_name.decode()
224+
if (re.match(port_util.SONIC_ETHERNET_RE_PATTERN, if_name_str) or \
225+
re.match(port_util.SONIC_ETHERNET_BP_RE_PATTERN, if_name_str)):
226+
if_name_map[if_name] = sai_id
223227
# As sai_id is not unique in multi-asic platform, concatenate it with
224228
# namespace to get a unique key. Assuming that ':' is not present in namespace
225229
# string or in sai id.
226230
# sai_id_key = namespace : sai_id
227-
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 \
228-
(re.match(port_util.SONIC_ETHERNET_RE_PATTERN, if_name.decode()) or \
229-
re.match(port_util.SONIC_ETHERNET_BP_RE_PATTERN, if_name.decode()))}
231+
for sai_id, if_name in if_id_map_util.items():
232+
if_name = if_name.decode()
233+
if (re.match(port_util.SONIC_ETHERNET_RE_PATTERN, if_name) or \
234+
re.match(port_util.SONIC_ETHERNET_BP_RE_PATTERN, if_name)):
235+
if_id_map[get_sai_id_key(db_conn.namespace, sai_id)] = if_name
230236
logger.debug("Port name map:\n" + pprint.pformat(if_name_map, indent=2))
231237
logger.debug("Interface name map:\n" + pprint.pformat(if_id_map, indent=2))
232238

src/sonic_ax_impl/mibs/ietf/rfc1213.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ class InterfacesUpdater(MIBUpdater):
152152

153153
def __init__(self):
154154
super().__init__()
155-
self.db_conn = Namespace.init_namespace_dbs()
155+
self.db_conn = Namespace.init_namespace_dbs()
156156

157157
self.lag_name_if_name_map = {}
158158
self.if_name_lag_name_map = {}
@@ -168,6 +168,7 @@ def __init__(self):
168168
self.if_id_map = {}
169169
self.oid_sai_map = {}
170170
self.oid_name_map = {}
171+
self.namespace_db_map = Namespace.get_namespace_db_map(self.db_conn)
171172

172173
def reinit_data(self):
173174
"""
@@ -191,9 +192,11 @@ def update_data(self):
191192
Update redis (caches config)
192193
Pulls the table references for each interface.
193194
"""
194-
self.if_counters = \
195-
{sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True)
196-
for sai_id in self.if_id_map}
195+
for sai_id_key in self.if_id_map:
196+
namespace, sai_id = mibs.split_sai_id_key(sai_id_key)
197+
if_idx = mibs.get_index_from_str(self.if_id_map[sai_id_key])
198+
self.if_counters[if_idx] = self.namespace_db_map[namespace].get_all(mibs.COUNTERS_DB, \
199+
mibs.counter_table(sai_id), blocking=True)
197200

198201
self.lag_name_if_name_map, \
199202
self.if_name_lag_name_map, \
@@ -254,12 +257,11 @@ def _get_counter(self, oid, table_name):
254257
:param table_name: the redis table (either IntEnum or string literal) to query.
255258
:return: the counter for the respective sub_id/table.
256259
"""
257-
sai_id = self.oid_sai_map[oid]
258260
# Enum.name or table_name = 'name_of_the_table'
259261
_table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8')
260262

261263
try:
262-
counter_value = self.if_counters[sai_id][_table_name]
264+
counter_value = self.if_counters[oid][_table_name]
263265
# truncate to 32-bit counter (database implements 64-bit counters)
264266
counter_value = int(counter_value) & 0x00000000ffffffff
265267
# done!

src/sonic_ax_impl/mibs/ietf/rfc2863.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from sonic_ax_impl import mibs
55
from ax_interface.mib import MIBMeta, MIBUpdater, ValueType, SubtreeMIBEntry, OverlayAdpaterMIBEntry, OidMIBEntry
66
from sonic_ax_impl.mibs import Namespace
7-
from swsssdk.port_util import get_index_from_str
87

98
@unique
109
class DbTables32(int, Enum):
@@ -103,7 +102,7 @@ def update_data(self):
103102
"""
104103
for sai_id_key in self.if_id_map:
105104
namespace, sai_id = mibs.split_sai_id_key(sai_id_key)
106-
if_idx = get_index_from_str(self.if_id_map[sai_id_key].decode())
105+
if_idx = mibs.get_index_from_str(self.if_id_map[sai_id_key])
107106
self.if_counters[if_idx] = self.namespace_db_map[namespace].get_all(mibs.COUNTERS_DB, \
108107
mibs.counter_table(sai_id), blocking=True)
109108

src/sonic_ax_impl/mibs/ietf/rfc4363.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def update_data(self):
7474
port_id = self.if_bpid_map[bridge_port_id]
7575

7676
vlanmac = self.fdb_vlanmac(fdb)
77-
self.vlanmac_ifindex_map[vlanmac] = mibs.get_index(self.if_id_map[port_id])
77+
self.vlanmac_ifindex_map[vlanmac] = mibs.get_index_from_str(self.if_id_map[port_id])
7878
self.vlanmac_ifindex_list.append(vlanmac)
7979
self.vlanmac_ifindex_list.sort()
8080

tests/namespace/test_interfaces.py

-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
class TestGetNextPDU(TestCase):
2323
@classmethod
2424
def setUpClass(cls):
25-
cls.skipTest(cls, "TODO: Need to update corresponding MIB implementation \
26-
in the Snmp Agent for multiple namespaces/multi-asic")
2725
tests.mock_tables.dbconnector.load_namespace_config()
2826
importlib.reload(rfc1213)
2927
cls.lut = MIBTable(rfc1213.InterfacesMIB)

0 commit comments

Comments
 (0)