Skip to content

Commit eba1408

Browse files
Fix undefined variable and warning message (sonic-net#134)
* Fix errors introduced. Add namespace test case for fdb related MIB. * Make sure that db connections are done in MIB class init functions. Multiple connect is causing an increase in run time causing agentx connection to close. * Minor fix * Add mock asic_db. * Remove trailing whitespace. * Revert "Make sure that db connections are done in MIB class init" * Fix to make sure pubsub channel in LLDPRemManAddrUpdater is not created everytime in update_data but is created only if the channel was not created previously. * Fix as per review comments.
1 parent 89b7b2c commit eba1408

File tree

9 files changed

+226
-35
lines changed

9 files changed

+226
-35
lines changed

src/sonic_ax_impl/mibs/__init__.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def init_db():
150150
"""
151151
# SyncD database connector. THIS MUST BE INITIALIZED ON A PER-THREAD BASIS.
152152
# Redis PubSub objects (such as those within swsssdk) are NOT thread-safe.
153-
db_conn = SonicV2Connector(**redis_kwargs)
153+
db_conn = SonicV2Connector(**redis_kwargs)
154154

155155
return db_conn
156156

@@ -389,6 +389,13 @@ def get_transceiver_sensor_sub_id(ifindex, sensor):
389389
transceiver_oid, = get_transceiver_sub_id(ifindex)
390390
return (transceiver_oid + SENSOR_PART_ID_MAP[sensor], )
391391

392+
def get_redis_pubsub(db_conn, db_name, pattern):
393+
redis_client = db_conn.get_redis_client(db_name)
394+
db = db_conn.get_dbid(db_name)
395+
pubsub = redis_client.pubsub()
396+
pubsub.psubscribe("__keyspace@{}__:{}".format(db, pattern))
397+
return pubsub
398+
392399
class RedisOidTreeUpdater(MIBUpdater):
393400
def __init__(self, prefix_str):
394401
super().__init__()
@@ -419,7 +426,7 @@ def update_data(self):
419426
self.oid_list = []
420427
self.oid_map = {}
421428

422-
keys = Namespace.dbs_keys(self.db_conn, SNMP_OVERLAY_DB, self.prefix_str + '*')
429+
keys = Namespace.dbs_keys(self.db_conn, SNMP_OVERLAY_DB, self.prefix_str + '*')
423430
# TODO: fix db_conn.keys to return empty list instead of None if there is no match
424431
if keys is None:
425432
keys = []
@@ -428,7 +435,7 @@ def update_data(self):
428435
key = key.decode()
429436
oid = oid2tuple(key, dot_prefix=False)
430437
self.oid_list.append(oid)
431-
value = Namespace.dbs_get_all(self.db_conn, SNMP_OVERLAY_DB, key)
438+
value = Namespace.dbs_get_all(self.db_conn, SNMP_OVERLAY_DB, key)
432439
if value[b'type'] in [b'COUNTER_32', b'COUNTER_64']:
433440
self.oid_map[oid] = int(value[b'data'])
434441
else:
@@ -587,6 +594,6 @@ def dbs_get_bridge_port_map(dbs, db_name):
587594
def dbs_get_vlan_id_from_bvid(dbs, bvid):
588595
for db_conn in Namespace.get_non_host_dbs(dbs):
589596
db_conn.connect('ASIC_DB')
590-
vlan_obj = db.keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:" + bvid)
597+
vlan_obj = db_conn.keys('ASIC_DB', "ASIC_STATE:SAI_OBJECT_TYPE_VLAN:" + bvid)
591598
if vlan_obj is not None:
592599
return port_util.get_vlan_id_from_bvid(db_conn, bvid)

src/sonic_ax_impl/mibs/ieee802_1ab.py

+13-20
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ class ManAddrConst:
7171
"""
7272
man_addr_oid = (1, 3, 6, 1, 2, 1, 2, 2, 1, 1)
7373

74-
7574
def poll_lldp_entry_updates(pubsub):
7675
ret = None, None, None
7776
msg = pubsub.get_message()
@@ -157,7 +156,7 @@ def __init__(self):
157156
# cache of port data
158157
# { if_name -> { 'key': 'value' } }
159158
self.loc_port_data = {}
160-
self.pubsub = [None] * len(self.db_conn)
159+
self.pubsub = [None] * len(self.db_conn)
161160

162161
def reinit_data(self):
163162
"""
@@ -222,16 +221,10 @@ def get_next(self, sub_id):
222221
return None
223222
return self.if_range[right]
224223

225-
def _update_per_namespace_data(self, db_conn, pubsub):
224+
def _update_per_namespace_data(self, pubsub):
226225
"""
227226
Listen to updates in APP DB, update local cache
228227
"""
229-
if not pubsub:
230-
redis_client = db_conn.get_redis_client(db_conn.APPL_DB)
231-
db = db_conn.get_dbid(db_conn.APPL_DB)
232-
pubsub = redis_client.pubsub()
233-
pubsub.psubscribe("__keyspace@{}__:{}".format(db, mibs.lldp_entry_table(b'*')))
234-
235228
while True:
236229
data, interface, if_id = poll_lldp_entry_updates(pubsub)
237230

@@ -243,7 +236,10 @@ def _update_per_namespace_data(self, db_conn, pubsub):
243236

244237
def update_data(self):
245238
for i in range(len(self.db_conn)):
246-
self._update_per_namespace_data(self.db_conn[i], self.pubsub[i])
239+
if not self.pubsub[i]:
240+
pattern = mibs.lldp_entry_table(b'*')
241+
self.pubsub[i] = mibs.get_redis_pubsub(self.db_conn[i], self.db_conn[i].APPL_DB, pattern)
242+
self._update_per_namespace_data(self.pubsub[i])
247243

248244
def local_port_num(self, sub_id):
249245
if len(sub_id) == 0:
@@ -307,7 +303,7 @@ def reinit_data(self):
307303
self.mgmt_ip_str = None
308304

309305
# establish connection to application database.
310-
self.db_conn.connect(mibs.APPL_DB)
306+
self.db_conn.connect(mibs.APPL_DB)
311307
mgmt_ip_bytes = self.db_conn.get(mibs.APPL_DB, mibs.LOC_CHASSIS_TABLE, b'lldp_loc_man_addr')
312308

313309
if not mgmt_ip_bytes:
@@ -488,7 +484,7 @@ class LLDPRemManAddrUpdater(MIBUpdater):
488484
def __init__(self):
489485
super().__init__()
490486

491-
self.db_conn = Namespace.init_namespace_dbs()
487+
self.db_conn = Namespace.init_namespace_dbs()
492488
# establish connection to application database.
493489
Namespace.connect_all_dbs(self.db_conn, mibs.APPL_DB)
494490
self.if_range = []
@@ -536,16 +532,10 @@ def update_rem_if_mgmt(self, if_oid, if_name):
536532
return
537533
self.if_range.sort()
538534

539-
def _update_per_namespace_data(self, db_conn, pubsub):
535+
def _update_per_namespace_data(self, pubsub):
540536
"""
541537
Listen to updates in APP DB, update local cache
542538
"""
543-
if not pubsub:
544-
redis_client = db_conn.get_redis_client(db_conn.APPL_DB)
545-
db = db_conn.get_dbid(db_conn.APPL_DB)
546-
pubsub = redis_client.pubsub()
547-
pubsub.psubscribe("__keyspace@{}__:{}".format(db, mibs.lldp_entry_table(b'*')))
548-
549539
while True:
550540
data, interface, if_index = poll_lldp_entry_updates(pubsub)
551541

@@ -561,7 +551,10 @@ def _update_per_namespace_data(self, db_conn, pubsub):
561551

562552
def update_data(self):
563553
for i in range(len(self.db_conn)):
564-
self._update_per_namespace_data(self.db_conn[i], self.pubsub[i])
554+
if not self.pubsub[i]:
555+
pattern = mibs.lldp_entry_table(b'*')
556+
self.pubsub[i] = mibs.get_redis_pubsub(self.db_conn[i], self.db_conn[i].APPL_DB, pattern)
557+
self._update_per_namespace_data(self.pubsub[i])
565558

566559

567560
def reinit_data(self):

src/sonic_ax_impl/mibs/ietf/rfc2737.py

+7-8
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ def reinit_data(self):
181181
interface = transceiver_entry.split(mibs.TABLE_NAME_SEPARATOR_VBAR)[-1]
182182
self._update_transceiver_cache(interface)
183183

184-
def _update_per_namespace_data(self, statedb, pubsub):
184+
def _update_per_namespace_data(self, pubsub):
185185
"""
186186
Update cache.
187187
Here we listen to changes in STATE_DB TRANSCEIVER_INFO table
@@ -190,12 +190,6 @@ def _update_per_namespace_data(self, statedb, pubsub):
190190

191191
# This code is not executed in unit test, since mockredis
192192
# does not support pubsub
193-
if not pubsub:
194-
redis_client = statedb.get_redis_client(statedb.STATE_DB)
195-
db = statedb.get_dbid(statedb.STATE_DB)
196-
pubsub = redis_client.pubsub()
197-
pubsub.psubscribe("__keyspace@{}__:{}".format(db, self.TRANSCEIVER_KEY_PATTERN))
198-
199193
while True:
200194
msg = pubsub.get_message()
201195

@@ -233,8 +227,13 @@ def _update_per_namespace_data(self, statedb, pubsub):
233227
self.physical_entities.remove(sub_id)
234228

235229
def update_data(self):
230+
# This code is not executed in unit test, since mockredis
231+
# does not support pubsub
236232
for i in range(len(self.statedb)):
237-
self._update_per_namespace_data(self.statedb[i], self.pubsub[i])
233+
if not self.pubsub[i]:
234+
pattern = self.TRANSCEIVER_KEY_PATTERN
235+
self.pubsub[i] = mibs.get_redis_pubsub(self.statedb[i], self.statedb[i].STATE_DB, pattern)
236+
self._update_per_namespace_data(self.pubsub[i])
238237

239238
def _update_transceiver_cache(self, interface):
240239
"""

src/sonic_ax_impl/mibs/ietf/rfc3433.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ def __init__(self):
250250

251251
super().__init__()
252252

253-
self.statedb = Namespace.init_namespace_dbs()
253+
self.statedb = Namespace.init_namespace_dbs()
254254
Namespace.connect_all_dbs(self.statedb, mibs.STATE_DB)
255255

256256
# list of available sub OIDs
@@ -378,7 +378,7 @@ def get_ent_physical_sensor_precision(self, sub_id):
378378
"""
379379
Get sensor precision value based on sub OID
380380
:param sub_id: sub ID of the sensor
381-
:return: sensor precision in range (-8, 9)
381+
:return: sensor precision in range (-8, 9)
382382
or None if sub_id not in the cache.
383383
"""
384384

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def requests_per_priority(self, sub_id):
191191
"""
192192
:param sub_id: The 0-based sub-identifier query.
193193
:return: the counter for the respective sub_id/table.
194-
"""
194+
"""
195195
port_oid = ''
196196
queue_index = ''
197197
try:

tests/mock_tables/asic0/asic_db.json

+25
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,27 @@
11
{
2+
"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:04\",\"switch_id\":\"oid:0x21000000000000\",\"vlan\":\"1000\"}": {
3+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a000000000608",
4+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC"
5+
},
6+
"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:06\",\"switch_id\":\"oid:0x21000000000000\",\"vlan\":\"1000\"}": {
7+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a000000000616",
8+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC"
9+
},
10+
"ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY:{\"bvid\":\"oid:0x26000000000016\",\"mac\":\"7C:FE:90:80:9F:08\",\"switch_id\":\"oid:0x21000000000000\"}": {
11+
"SAI_FDB_ENTRY_ATTR_BRIDGE_PORT_ID": "oid:0x3a000000000620",
12+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC"
13+
},
14+
"ASIC_STATE:SAI_OBJECT_TYPE_VLAN:oid:0x26000000000016": {
15+
"SAI_VLAN_ATTR_VLAN_ID": "1000"
16+
},
17+
"ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000608": {
18+
"SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT",
19+
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000003",
20+
"SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true"
21+
},
22+
"ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000616": {
23+
"SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT",
24+
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000005",
25+
"SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true"
26+
}
227
}

tests/mock_tables/asic1/asic_db.json

+9
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
11
{
2+
"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",
4+
"SAI_FDB_ENTRY_ATTR_TYPE": "SAI_FDB_ENTRY_TYPE_DYNAMIC"
5+
},
6+
"ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT:oid:0x3a000000000620": {
7+
"SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT",
8+
"SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000010",
9+
"SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true"
10+
}
211
}
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{
2+
}

0 commit comments

Comments
 (0)