From 96c05900fc6e4063c51e3f6256f8a8e765605be4 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Mon, 21 Mar 2022 14:54:45 +0800 Subject: [PATCH] [port_util] Fix issue: port_util.get_vlan_interface_oid_map should not raise exception when DB has not RIF data (#117) **Why I did this?** port_util.get_vlan_interface_oid_map would raise exception when there is no RIF configured, and it would causes snmpagent not work. This PR is to fix it. ``` #012Traceback (most recent call last): #012File "/usr/local/lib/python3.7/dist-packages/ax_interface/mib.py", line 37, in start #012 self.reinit_data()#012 File "/usr/local/lib/python3.7/dist-packages/sonic_ax_impl/mibs/ietf/rfc1213.py", line 233, in reinit_data #012 self.vlan_oid_name_map = Namespace.get_sync_d_from_all_namespace(mibs.init_sync_d_vlan_tables, self.db_conn) #012 File "/usr/local/lib/python3.7/dist-packages/sonic_ax_impl/mibs/__init__.py", line 651, in get_sync_d_from_all_namespace #012 ns_tuple = per_namespace_func(db_conn) #012 File "/usr/local/lib/python3.7/dist-packages/sonic_ax_impl/mibs/__init__.py", line 341, in init_sync_d_vlan_tables #012 vlan_name_map = port_util.get_vlan_interface_oid_map(db_conn) #012 File "/usr/local/lib/python3.7/dist-packages/swsssdk/port_util.py", line 167, in get_vlan_interface_oid_map #012 rif_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_RIF_NAME_MAP', blocking=True) #012 File "/usr/lib/python3/dist-packages/swsscommon/swsscommon.py", line 1751, in get_all #012 return dict(super(SonicV2Connector, self).get_all(db_name, _hash, blocking)) #012 File "/usr/lib/python3/dist-packages/swsscommon/swsscommon.py", line 1708, in get_all #012 return _swsscommon.SonicV2Connector_Native_get_all(self, db_name, _hash, blocking) #012RuntimeError: Key '{COUNTERS_RIF_NAME_MAP}' unavailable in database '{COUNTERS_DB}' ``` **How I did this:** check redis key exists first before calling get_all. --- src/swsssdk/port_util.py | 7 ++++--- test/test_port_util.py | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 test/test_port_util.py diff --git a/src/swsssdk/port_util.py b/src/swsssdk/port_util.py index a21f5288a..27de486c2 100644 --- a/src/swsssdk/port_util.py +++ b/src/swsssdk/port_util.py @@ -164,13 +164,14 @@ def get_rif_port_map(db): return rif_port_oid_map -def get_vlan_interface_oid_map(db): +def get_vlan_interface_oid_map(db, blocking=True): """ Get Vlan Interface names and sai oids """ db.connect('COUNTERS_DB') - rif_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_RIF_NAME_MAP', blocking=True) - rif_type_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_RIF_TYPE_MAP', blocking=True) + + rif_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_RIF_NAME_MAP', blocking=blocking) + rif_type_name_map = db.get_all('COUNTERS_DB', 'COUNTERS_RIF_TYPE_MAP', blocking=blocking) if not rif_name_map or not rif_type_name_map: return {} diff --git a/test/test_port_util.py b/test/test_port_util.py new file mode 100644 index 000000000..2281f43d9 --- /dev/null +++ b/test/test_port_util.py @@ -0,0 +1,19 @@ +import os +import sys + +if sys.version_info.major == 3: + from unittest import mock +else: + import mock + +modules_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(modules_path, 'src')) + +class TestPortUtil: + def test_get_vlan_interface_oid_map(self): + db = mock.MagicMock() + db.get_all = mock.MagicMock() + db.get_all.return_value = {} + + from swsssdk.port_util import get_vlan_interface_oid_map + assert not get_vlan_interface_oid_map(db, True)