From fc87f38d96a954bfc27bc01c0c6a2bf2a846d818 Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Fri, 10 Jun 2022 11:51:21 +0000 Subject: [PATCH 1/2] Update portstat to use CounterTable API --- scripts/portstat | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/portstat b/scripts/portstat index 24c085e9c1..5bf689b7b4 100755 --- a/scripts/portstat +++ b/scripts/portstat @@ -17,6 +17,7 @@ from collections import OrderedDict, namedtuple from natsort import natsorted from tabulate import tabulate from sonic_py_common import multi_asic +from swsscommon.swsscommon import CounterTable, PortCounter # mock the redis for unit test purposes # try: @@ -157,20 +158,20 @@ class Portstat(object): """ Get the counters info from database. """ - def get_counters(table_id): + def get_counters(port): """ Get the counters from specific table. """ fields = ["0"]*BUCKET_NUM + _, fvs = counter_table.get(PortCounter(), port) + fvs = dict(fvs) for pos, cntr_list in counter_bucket_dict.items(): for counter_name in cntr_list: - full_table_id = COUNTER_TABLE_PREFIX + table_id - counter_data = self.db.get(self.db.COUNTERS_DB, full_table_id, counter_name) - if counter_data is None: + if counter_name not in fvs: fields[pos] = STATUS_NA elif fields[pos] != STATUS_NA: - fields[pos] = str(int(fields[pos]) + int(counter_data)) + fields[pos] = str(int(fields[pos]) + int(fvs[counter_name])) cntr = NStats._make(fields) return cntr @@ -196,13 +197,14 @@ class Portstat(object): cnstat_dict = OrderedDict() cnstat_dict['time'] = datetime.datetime.now() ratestat_dict = OrderedDict() + counter_table = CounterTable(self.db.get_redis_client(self.db.COUNTERS_DB)) if counter_port_name_map is None: return cnstat_dict, ratestat_dict for port in natsorted(counter_port_name_map): port_name = port.split(":")[0] if self.multi_asic.skip_display(constants.PORT_OBJ, port_name): continue - cnstat_dict[port] = get_counters(counter_port_name_map[port]) + cnstat_dict[port] = get_counters(port) ratestat_dict[port] = get_rates(counter_port_name_map[port]) return cnstat_dict, ratestat_dict From 50d29524e621a24a54080cf02ceef3e328356a9b Mon Sep 17 00:00:00 2001 From: Junhua Zhai Date: Fri, 24 Jun 2022 10:22:32 +0000 Subject: [PATCH 2/2] Add unit test --- scripts/portstat | 2 +- tests/mock_tables/dbconnector.py | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/scripts/portstat b/scripts/portstat index 5bf689b7b4..abc1bc67aa 100755 --- a/scripts/portstat +++ b/scripts/portstat @@ -17,7 +17,6 @@ from collections import OrderedDict, namedtuple from natsort import natsorted from tabulate import tabulate from sonic_py_common import multi_asic -from swsscommon.swsscommon import CounterTable, PortCounter # mock the redis for unit test purposes # try: @@ -34,6 +33,7 @@ try: except KeyError: pass +from swsscommon.swsscommon import CounterTable, PortCounter from utilities_common import constants from utilities_common.intf_filter import parse_interface_in_filter import utilities_common.multi_asic as multi_asic_util diff --git a/tests/mock_tables/dbconnector.py b/tests/mock_tables/dbconnector.py index 80d74cafd7..f6db0d9794 100644 --- a/tests/mock_tables/dbconnector.py +++ b/tests/mock_tables/dbconnector.py @@ -182,6 +182,24 @@ def keys(self, pattern='*'): return [key for key in self.redis if regex.match(key)] +class PortCounter: + pass + + +class CounterTable: + def __init__(self, db): + self.db = db + + def get(self, counter, name): + if isinstance(counter, PortCounter): + name_map = "COUNTERS_PORT_NAME_MAP" + else: + return False, () + + key = self.db.hget(name_map, name) + return True, tuple(self.db.get("COUNTERS:" + key).items()) + + swsssdk.interface.DBInterface._subscribe_keyspace_notification = _subscribe_keyspace_notification mockredis.MockRedis.config_set = config_set redis.StrictRedis = SwssSyncClient @@ -189,3 +207,5 @@ def keys(self, pattern='*'): swsscommon.SonicV2Connector = SonicV2Connector swsscommon.ConfigDBConnector = ConfigDBConnector swsscommon.ConfigDBPipeConnector = ConfigDBPipeConnector +swsscommon.CounterTable = CounterTable +swsscommon.PortCounter = PortCounter