|
| 1 | +import os |
| 2 | +import re |
| 3 | +import time |
| 4 | +import json |
| 5 | +import pytest |
| 6 | +import redis |
| 7 | + |
| 8 | +from swsscommon import swsscommon |
| 9 | + |
| 10 | +pg_drop_attr = "SAI_INGRESS_PRIORITY_GROUP_STAT_DROPPED_PACKETS" |
| 11 | + |
| 12 | +class TestPGDropCounter(object): |
| 13 | + DEFAULT_POLL_INTERVAL = 10 |
| 14 | + pgs = {} |
| 15 | + |
| 16 | + def setup_dbs(self, dvs): |
| 17 | + self.asic_db = dvs.get_asic_db() |
| 18 | + self.counters_db = dvs.get_counters_db() |
| 19 | + self.config_db = dvs.get_config_db() |
| 20 | + self.flex_db = dvs.get_flex_db() |
| 21 | + |
| 22 | + def set_counter(self, dvs, obj_type, obj_id, attr, val): |
| 23 | + |
| 24 | + db = swsscommon.DBConnector(swsscommon.ASIC_DB, dvs.redis_sock, 0) |
| 25 | + ntf = swsscommon.NotificationProducer(db, "SAI_VS_UNITTEST_CHANNEL") |
| 26 | + |
| 27 | + r = redis.Redis(unix_socket_path=dvs.redis_sock, db=swsscommon.ASIC_DB, |
| 28 | + encoding="utf-8", decode_responses=True) |
| 29 | + rid = r.hget("VIDTORID", obj_id) |
| 30 | + |
| 31 | + assert rid is not None |
| 32 | + |
| 33 | + fvp = swsscommon.FieldValuePairs([(attr, val)]) |
| 34 | + key = rid |
| 35 | + |
| 36 | + # explicit convert unicode string to str for python2 |
| 37 | + ntf.send("set_stats", str(key), fvp) |
| 38 | + |
| 39 | + def populate_asic(self, dvs, val): |
| 40 | + for obj_id in self.pgs: |
| 41 | + self.set_counter(dvs, "SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP", obj_id, pg_drop_attr, val) |
| 42 | + |
| 43 | + def verify_value(self, dvs, obj_ids, entry_name, expected_value): |
| 44 | + counters_db = swsscommon.DBConnector(swsscommon.COUNTERS_DB, dvs.redis_sock, 0) |
| 45 | + table = swsscommon.Table(counters_db, "COUNTERS") |
| 46 | + |
| 47 | + for obj_id in obj_ids: |
| 48 | + ret = table.get(obj_id) |
| 49 | + |
| 50 | + status = ret[0] |
| 51 | + assert status |
| 52 | + keyvalues = ret[1] |
| 53 | + found = False |
| 54 | + for key, value in keyvalues: |
| 55 | + if key == entry_name: |
| 56 | + assert value == expected_value, "Saved value not the same as expected" |
| 57 | + found = True |
| 58 | + assert found, "entry name %s not found" % (entry_name) |
| 59 | + |
| 60 | + def set_up_flex_counter(self): |
| 61 | + pg_stats_entry = {"PG_COUNTER_ID_LIST": "{}".format(pg_drop_attr)} |
| 62 | + for pg in self.pgs: |
| 63 | + self.flex_db.create_entry("FLEX_COUNTER_TABLE", "PG_DROP_STAT_COUNTER:{}".format(pg), pg_stats_entry) |
| 64 | + |
| 65 | + fc_status_enable = {"FLEX_COUNTER_STATUS": "enable"} |
| 66 | + |
| 67 | + self.config_db.create_entry("FLEX_COUNTER_TABLE", "PG_DROP", fc_status_enable) |
| 68 | + |
| 69 | + def clear_flex_counter(self): |
| 70 | + for pg in self.pgs: |
| 71 | + self.flex_db.delete_entry("FLEX_COUNTER_TABLE", "PG_DROP_STAT_COUNTER:{}".format(pg)) |
| 72 | + |
| 73 | + self.config_db.delete_entry("FLEX_COUNTER_TABLE", "PG_DROP") |
| 74 | + |
| 75 | + |
| 76 | + def test_pg_drop_counters(self, dvs): |
| 77 | + self.setup_dbs(dvs) |
| 78 | + self.pgs = self.asic_db.get_keys("ASIC_STATE:SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP") |
| 79 | + try: |
| 80 | + self.set_up_flex_counter() |
| 81 | + |
| 82 | + self.populate_asic(dvs, "0") |
| 83 | + time.sleep(self.DEFAULT_POLL_INTERVAL) |
| 84 | + self.verify_value(dvs, self.pgs, pg_drop_attr, "0") |
| 85 | + |
| 86 | + self.populate_asic(dvs, "100") |
| 87 | + time.sleep(self.DEFAULT_POLL_INTERVAL) |
| 88 | + self.verify_value(dvs, self.pgs, pg_drop_attr, "100") |
| 89 | + |
| 90 | + self.populate_asic(dvs, "123") |
| 91 | + time.sleep(self.DEFAULT_POLL_INTERVAL) |
| 92 | + self.verify_value(dvs, self.pgs, pg_drop_attr, "123") |
| 93 | + finally: |
| 94 | + self.clear_flex_counter() |
0 commit comments