Skip to content

Commit 1a2b62a

Browse files
[Namespace]: Fix SAI_ID key used in cpfcIfTable and csqIfQosGroupStatsTable implementation (sonic-net#138)
In multi-asic platform, SAI OID is not unique for the whole device. It is unique for an asic and within a single namespace. This PR is to make sure that data structures that use SAI Object ID as a key to retrieve data from COUNTERS_DB updated so that a combination of SAI Object ID and port index is used as a key. Update data structure to use combination SAI Object ID and port index as a key to retrieve data from COUNTERS_DB. Update Unit-test mock DB in namespaces, to reflect the scenario where SAI Object is same across different namespaces. Updates done to MIB implementation for the below MIB tables to get data from the right database instances: cpfcIfTable csqIfQosGroupStatsTable * Remove usage of oid_sai_map data structure as it is not being used. The required data can be retrieved from oid_name_map data structure. Signed-off-by: SuvarnaMeenakshi <[email protected]>
1 parent d06f00c commit 1a2b62a

File tree

13 files changed

+506
-182
lines changed

13 files changed

+506
-182
lines changed

src/sonic_ax_impl/mibs/__init__.py

+11-16
Original file line numberDiff line numberDiff line change
@@ -245,12 +245,6 @@ def init_sync_d_interface_tables(db_conn):
245245
logger.debug("Port name map:\n" + pprint.pformat(if_name_map, indent=2))
246246
logger.debug("Interface name map:\n" + pprint.pformat(if_id_map, indent=2))
247247

248-
# { OID -> sai_id }
249-
oid_sai_map = {get_index(if_name): sai_id for if_name, sai_id in if_name_map.items()
250-
# only map the interface if it's a style understood to be a SONiC interface.
251-
if get_index(if_name) is not None}
252-
logger.debug("OID sai map:\n" + pprint.pformat(oid_sai_map, indent=2))
253-
254248
# { OID -> if_name (SONiC) }
255249
oid_name_map = {get_index(if_name): if_name for if_name in if_name_map
256250
# only map the interface if it's a style understood to be a SONiC interface.
@@ -259,14 +253,14 @@ def init_sync_d_interface_tables(db_conn):
259253
logger.debug("OID name map:\n" + pprint.pformat(oid_name_map, indent=2))
260254

261255
# SyncD consistency checks.
262-
if not oid_sai_map:
256+
if not oid_name_map:
263257
# In the event no interface exists that follows the SONiC pattern, no OIDs are able to be registered.
264258
# A RuntimeError here will prevent the 'main' module from loading. (This is desirable.)
265259
message = "No interfaces found matching pattern '{}'. SyncD database is incoherent." \
266260
.format(port_util.SONIC_ETHERNET_RE_PATTERN)
267261
logger.error(message)
268262
raise RuntimeError(message)
269-
elif len(if_id_map) < len(if_name_map) or len(oid_sai_map) < len(if_name_map):
263+
elif len(if_id_map) < len(if_name_map) or len(oid_name_map) < len(if_name_map):
270264
# a length mismatch indicates a bad interface name
271265
logger.warning("SyncD database contains incoherent interface names. Interfaces must match pattern '{}'"
272266
.format(port_util.SONIC_ETHERNET_RE_PATTERN))
@@ -281,7 +275,7 @@ def init_sync_d_interface_tables(db_conn):
281275

282276
logger.debug("Chassis name map:\n" + pprint.pformat(if_alias_map, indent=2))
283277

284-
return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map
278+
return if_name_map, if_alias_map, if_id_map, oid_name_map
285279

286280
def init_sync_d_lag_tables(db_conn):
287281
"""
@@ -333,15 +327,15 @@ def init_sync_d_queue_tables(db_conn):
333327
:return: tuple(port_queues_map, queue_stat_map)
334328
"""
335329

336-
# { Port index : Queue index (SONiC) -> sai_id }
337-
# ex: { "1:2" : "1000000000023" }
330+
# { Port name : Queue index (SONiC) -> sai_id }
331+
# ex: { "Ethernet0:2" : "1000000000023" }
338332
queue_name_map = db_conn.get_all(COUNTERS_DB, COUNTERS_QUEUE_NAME_MAP, blocking=True)
339333
logger.debug("Queue name map:\n" + pprint.pformat(queue_name_map, indent=2))
340334

341335
# Parse the queue_name_map and create the following maps:
342-
# port_queues_map -> {"if_index : queue_index" : sai_oid}
343-
# queue_stat_map -> {queue stat table name : {counter name : value}}
344-
# port_queue_list_map -> {if_index: [sorted queue list]}
336+
# port_queues_map -> {"port_index : queue_index" : sai_oid}
337+
# queue_stat_map -> {"port_index : queue stat table name" : {counter name : value}}
338+
# port_queue_list_map -> {port_index: [sorted queue list]}
345339
port_queues_map = {}
346340
queue_stat_map = {}
347341
port_queue_list_map = {}
@@ -356,7 +350,8 @@ def init_sync_d_queue_tables(db_conn):
356350
queue_stat_name = queue_table(sai_id)
357351
queue_stat = db_conn.get_all(COUNTERS_DB, queue_stat_name, blocking=False)
358352
if queue_stat is not None:
359-
queue_stat_map[queue_stat_name] = queue_stat
353+
queue_stat_key = queue_key(port_index, queue_stat_name)
354+
queue_stat_map[queue_stat_key] = queue_stat
360355

361356
if not port_queue_list_map.get(int(port_index)):
362357
port_queue_list_map[int(port_index)] = [int(queue_index)]
@@ -577,7 +572,7 @@ def get_non_host_dbs(dbs):
577572
return dbs
578573
else:
579574
return dbs[1:]
580-
575+
581576
@staticmethod
582577
def get_sync_d_from_all_namespace(per_namespace_func, dbs):
583578
# return merged tuple of dictionaries retrieved from per

src/sonic_ax_impl/mibs/ieee802_1ab.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,6 @@ def __init__(self):
145145
self.if_name_map = {}
146146
self.if_alias_map = {}
147147
self.if_id_map = {}
148-
self.oid_sai_map = {}
149148
self.oid_name_map = {}
150149

151150
self.mgmt_oid_name_map = {}
@@ -165,7 +164,6 @@ def reinit_data(self):
165164
self.if_name_map, \
166165
self.if_alias_map, \
167166
self.if_id_map, \
168-
self.oid_sai_map, \
169167
self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn)
170168

171169
self.mgmt_oid_name_map, \
@@ -382,7 +380,6 @@ def __init__(self):
382380
self.if_name_map = {}
383381
self.if_alias_map = {}
384382
self.if_id_map = {}
385-
self.oid_sai_map = {}
386383
self.oid_name_map = {}
387384

388385
self.mgmt_oid_name_map = {}
@@ -400,7 +397,6 @@ def reinit_data(self):
400397
self.if_name_map, \
401398
self.if_alias_map, \
402399
self.if_id_map, \
403-
self.oid_sai_map, \
404400
self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn)
405401

406402
self.mgmt_oid_name_map, _ = mibs.init_mgmt_interface_tables(self.db_conn[0])
@@ -566,7 +562,7 @@ def reinit_data(self):
566562
"""
567563
Subclass reinit data routine.
568564
"""
569-
_, _, _, _, self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn)
565+
_, _, _, self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn)
570566

571567
self.mgmt_oid_name_map, _ = mibs.init_mgmt_interface_tables(self.db_conn[0])
572568

src/sonic_ax_impl/mibs/ietf/rfc1213.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,6 @@ def __init__(self):
200200
self.if_name_map = {}
201201
self.if_alias_map = {}
202202
self.if_id_map = {}
203-
self.oid_sai_map = {}
204203
self.oid_name_map = {}
205204
self.namespace_db_map = Namespace.get_namespace_db_map(self.db_conn)
206205

@@ -211,7 +210,6 @@ def reinit_data(self):
211210
self.if_name_map, \
212211
self.if_alias_map, \
213212
self.if_id_map, \
214-
self.oid_sai_map, \
215213
self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn)
216214
"""
217215
db_conn - will have db_conn to all namespace DBs and
@@ -236,7 +234,7 @@ def update_data(self):
236234
self.if_name_lag_name_map, \
237235
self.oid_lag_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn)
238236

239-
self.if_range = sorted(list(self.oid_sai_map.keys()) +
237+
self.if_range = sorted(list(self.oid_name_map.keys()) +
240238
list(self.oid_lag_name_map.keys()) +
241239
list(self.mgmt_oid_name_map.keys()))
242240
self.if_range = [(i,) for i in self.if_range]

src/sonic_ax_impl/mibs/ietf/rfc2737.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def reinit_data(self):
152152
self.physical_model_name_map = {}
153153

154154
# update interface maps
155-
_, self.if_alias_map, _, _, _ = \
155+
_, self.if_alias_map, _, _ = \
156156
Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, Namespace.init_namespace_dbs())
157157

158158
device_metadata = mibs.get_device_metadata(self.statedb[0])

src/sonic_ax_impl/mibs/ietf/rfc2863.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ def __init__(self):
6161
self.if_name_map = {}
6262
self.if_alias_map = {}
6363
self.if_id_map = {}
64-
self.oid_sai_map = {}
6564
self.oid_name_map = {}
6665
self.lag_name_if_name_map = {}
6766
self.if_name_lag_name_map = {}
@@ -76,7 +75,6 @@ def reinit_data(self):
7675
self.if_name_map, \
7776
self.if_alias_map, \
7877
self.if_id_map, \
79-
self.oid_sai_map, \
8078
self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn)
8179

8280
self.lag_name_if_name_map, \
@@ -90,7 +88,7 @@ def reinit_data(self):
9088
self.mgmt_oid_name_map, \
9189
self.mgmt_alias_map = mibs.init_mgmt_interface_tables(self.db_conn[0])
9290

93-
self.if_range = sorted(list(self.oid_sai_map.keys()) +
91+
self.if_range = sorted(list(self.oid_name_map.keys()) +
9492
list(self.oid_lag_name_map.keys()) +
9593
list(self.mgmt_oid_name_map.keys()))
9694
self.if_range = [(i,) for i in self.if_range]

src/sonic_ax_impl/mibs/ietf/rfc4363.py

-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ def __init__(self):
1515
self.if_name_map = {}
1616
self.if_alias_map = {}
1717
self.if_id_map = {}
18-
self.oid_sai_map = {}
1918
self.oid_name_map = {}
2019
self.vlanmac_ifindex_map = {}
2120
self.vlanmac_ifindex_list = []
@@ -40,7 +39,6 @@ def reinit_data(self):
4039
self.if_name_map, \
4140
self.if_alias_map, \
4241
self.if_id_map, \
43-
self.oid_sai_map, \
4442
self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn)
4543

4644
self.if_bpid_map = Namespace.dbs_get_bridge_port_map(self.db_conn, mibs.ASIC_DB)

src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ def __init__(self):
1717
self.if_name_map = {}
1818
self.if_alias_map = {}
1919
self.if_id_map = {}
20-
self.oid_sai_map = {}
2120
self.oid_name_map = {}
2221

2322
self.lag_name_if_name_map = {}
@@ -27,6 +26,7 @@ def __init__(self):
2726
# cache of interface counters
2827
self.if_counters = {}
2928
self.if_range = []
29+
self.namespace_db_map = Namespace.get_namespace_db_map(self.db_conn)
3030

3131
def reinit_data(self):
3232
"""
@@ -35,7 +35,6 @@ def reinit_data(self):
3535
self.if_name_map, \
3636
self.if_alias_map, \
3737
self.if_id_map, \
38-
self.oid_sai_map, \
3938
self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn)
4039

4140
self.update_data()
@@ -45,15 +44,17 @@ def update_data(self):
4544
Update redis (caches config)
4645
Pulls the table references for each interface.
4746
"""
48-
self.if_counters = \
49-
{sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True)
50-
for sai_id in self.if_id_map}
47+
for sai_id_key in self.if_id_map:
48+
namespace, sai_id = mibs.split_sai_id_key(sai_id_key)
49+
if_idx = mibs.get_index_from_str(self.if_id_map[sai_id_key])
50+
self.if_counters[if_idx] = self.namespace_db_map[namespace].get_all(mibs.COUNTERS_DB, \
51+
mibs.counter_table(sai_id), blocking=True)
5152

5253
self.lag_name_if_name_map, \
5354
self.if_name_lag_name_map, \
5455
self.oid_lag_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_lag_tables, self.db_conn)
5556

56-
self.if_range = sorted(list(self.oid_sai_map.keys()) + list(self.oid_lag_name_map.keys()))
57+
self.if_range = sorted(list(self.oid_name_map.keys()) + list(self.oid_lag_name_map.keys()))
5758
self.if_range = [(i,) for i in self.if_range]
5859

5960
def get_next(self, sub_id):
@@ -88,13 +89,12 @@ def _get_counter(self, oid, counter_name):
8889
:param counter_name: the redis table (either IntEnum or string literal) to query.
8990
:return: the counter for the respective sub_id/table.
9091
"""
91-
sai_id = self.oid_sai_map[oid]
9292

9393
# Enum.name or counter_name = 'name_of_the_table'
9494
_counter_name = bytes(getattr(counter_name, 'name', counter_name), 'utf-8')
9595

9696
try:
97-
counter_value = self.if_counters[sai_id][_counter_name]
97+
counter_value = self.if_counters[oid][_counter_name]
9898
counter_value = int(counter_value) & 0xffffffffffffffff
9999
# done!
100100
return counter_value

src/sonic_ax_impl/mibs/vendor/cisco/ciscoSwitchQosMIB.py

+23-9
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ def __init__(self):
5454
self.if_name_map = {}
5555
self.if_alias_map = {}
5656
self.if_id_map = {}
57-
self.oid_sai_map = {}
5857
self.oid_name_map = {}
5958

6059
self.port_queues_map = {}
@@ -65,6 +64,8 @@ def __init__(self):
6564
self.mib_oid_list = []
6665

6766
self.queue_type_map = {}
67+
self.port_index_namespace = {}
68+
self.namespace_db_map = Namespace.get_namespace_db_map(self.db_conn)
6869

6970
def reinit_data(self):
7071
"""
@@ -73,14 +74,19 @@ def reinit_data(self):
7374
self.if_name_map, \
7475
self.if_alias_map, \
7576
self.if_id_map, \
76-
self.oid_sai_map, \
7777
self.oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_interface_tables, self.db_conn)
7878

79+
for sai_id_key in self.if_id_map:
80+
namespace, sai_id = mibs.split_sai_id_key(sai_id_key)
81+
if_idx = mibs.get_index_from_str(self.if_id_map[sai_id_key])
82+
self.port_index_namespace[if_idx] = namespace
83+
7984
self.port_queues_map, self.queue_stat_map, self.port_queue_list_map = \
8085
Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_queue_tables, self.db_conn)
8186

82-
self.queue_type_map = Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, "COUNTERS_QUEUE_TYPE_MAP", blocking=False)
83-
87+
for db_conn in Namespace.get_non_host_dbs(self.db_conn):
88+
self.queue_type_map[db_conn.namespace] = db_conn.get_all(mibs.COUNTERS_DB, "COUNTERS_QUEUE_TYPE_MAP", blocking=False)
89+
8490
self.update_data()
8591

8692
def update_data(self):
@@ -90,9 +96,15 @@ def update_data(self):
9096
"""
9197
for queue_key, sai_id in self.port_queues_map.items():
9298
queue_stat_name = mibs.queue_table(sai_id)
93-
queue_stat = Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, queue_stat_name, blocking=False)
99+
port_index, _ = queue_key.split(':')
100+
queue_stat_idx = mibs.queue_key(port_index, queue_stat_name)
101+
namespace = self.port_index_namespace[int(port_index)]
102+
queue_stat = self.namespace_db_map[namespace].get_all( \
103+
mibs.COUNTERS_DB, queue_stat_name, blocking=False)
94104
if queue_stat is not None:
95-
self.queue_stat_map[queue_stat_name] = queue_stat
105+
self.queue_stat_map[queue_stat_idx] = queue_stat
106+
else:
107+
del self.queue_stat_map[queue_stat_idx]
96108

97109
self.update_stats()
98110

@@ -109,13 +121,14 @@ def update_stats(self):
109121
self.mib_oid_list = []
110122

111123
# Sort the ports to keep the OID order in the MIB
112-
if_range = list(self.oid_sai_map.keys())
124+
if_range = list(self.oid_name_map.keys())
113125
# Update queue counters for port
114126
for if_index in if_range:
115127
if if_index not in self.port_queue_list_map:
116128
# Port does not has a queues, continue..
117129
continue
118130
if_queues = self.port_queue_list_map[if_index]
131+
namespace = self.port_index_namespace[if_index]
119132

120133
# The first half of queue id is for ucast, and second half is for mcast
121134
# To simulate vendor OID, we wrap queues by half distance
@@ -125,8 +138,9 @@ def update_stats(self):
125138
# Get queue type and statistics
126139
queue_sai_oid = self.port_queues_map[mibs.queue_key(if_index, queue)]
127140
queue_stat_table_name = mibs.queue_table(queue_sai_oid)
128-
queue_type = self.queue_type_map.get(queue_sai_oid)
129-
queue_stat = self.queue_stat_map.get(queue_stat_table_name, {})
141+
queue_stat_key = mibs.queue_key(if_index, queue_stat_table_name)
142+
queue_type = self.queue_type_map[namespace].get(queue_sai_oid)
143+
queue_stat = self.queue_stat_map.get(queue_stat_key, {})
130144

131145
# Add supported counters to MIBs list and store counters values
132146
for (counter, counter_type), counter_mib_id in CounterMap.items():

tests/mock_tables/asic1/asic_db.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bridge_id\":\"oid:0x0\",\"bridge_type\":\"SAI_FDB_ENTRY_BRIDGE_TYPE_1Q\",\"mac\":\"7C:FE:90:80:9F:10\",\"switch_id\":\"oid:0x21000000000000\",\"vlan\":\"1000\"}": {
3-
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a0000000006208",
3+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a000000000616",
44
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC"
55
},
6-
"ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000620": {
6+
"ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000616": {
77
"SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT",
8-
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000010",
8+
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000005",
99
"SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true"
1010
}
1111
}

0 commit comments

Comments
 (0)