Skip to content

Commit 496a077

Browse files
authored
Add asic id for linecards so "show fabric counters queue/port" can work for single chip systems (#2656)
Add asic id for linecards so "show fabric counters queue/port" can work for single chip systems. This is from #2499. 2499 cannot be cherry-picked to 202205 branch cleanly. This PR is for merging up to 202205 branch. It looks like repeated work already in the branch when I tested locally.
1 parent 2591e8b commit 496a077

File tree

4 files changed

+218
-6
lines changed

4 files changed

+218
-6
lines changed

scripts/fabricstat

+14-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import utilities_common.multi_asic as multi_asic_util
1414

1515
# mock the redis for unit test purposes #
1616
try:
17-
if os.environ["UTILITIES_UNIT_TESTING"] == "2":
17+
if os.environ["UTILITIES_UNIT_TESTING"] == "1" or os.environ["UTILITIES_UNIT_TESTING"] == "2":
1818
modules_path = os.path.join(os.path.dirname(__file__), "..")
1919
tests_path = os.path.join(modules_path, "tests")
2020
sys.path.insert(0, modules_path)
@@ -122,17 +122,21 @@ class FabricPortStat(FabricStat):
122122

123123
table = []
124124
header = None
125-
asic = multi_asic.get_asic_id_from_name(self.namespace)
125+
# Default ASIC name is 0 for single-ASIC systems. For multi-ASIC systems,
126+
# derive name from namespace.
127+
asic_name = '0'
128+
if self.namespace:
129+
asic_name = multi_asic.get_asic_id_from_name(self.namespace)
126130
for key, data in cnstat_dict.items():
127131
port_id = key[len(PORT_NAME_PREFIX):]
128132
if errors_only:
129133
header = portstat_header_errors_only
130-
table.append((asic, port_id, self.get_port_state(key),
134+
table.append((asic_name, port_id, self.get_port_state(key),
131135
data.crc, data.fec_correctable, data.fec_uncorrectable,
132136
data.symbol_err))
133137
else:
134138
header = portstat_header_all
135-
table.append((asic, port_id, self.get_port_state(key),
139+
table.append((asic_name, port_id, self.get_port_state(key),
136140
data.in_cell, data.in_octet, data.out_cell, data.out_octet,
137141
data.crc, data.fec_correctable, data.fec_uncorrectable,
138142
data.symbol_err))
@@ -168,11 +172,15 @@ class FabricQueueStat(FabricStat):
168172
return
169173

170174
table = []
171-
asic = multi_asic.get_asic_id_from_name(self.namespace)
175+
# Default ASIC name is 0 for single-ASIC systems. For multi-ASIC systems,
176+
# derive name from namespace.
177+
asic_name = '0'
178+
if self.namespace:
179+
asic_name = multi_asic.get_asic_id_from_name(self.namespace)
172180
for key, data in cnstat_dict.items():
173181
port_name, queue_id = key.split(':')
174182
port_id = port_name[len(PORT_NAME_PREFIX):]
175-
table.append((asic, port_id, self.get_port_state(port_name), queue_id,
183+
table.append((asic_name, port_id, self.get_port_state(port_name), queue_id,
176184
data.curbyte, data.curlevel, data.watermarklevel))
177185

178186
print(tabulate(table, queuestat_header, tablefmt='simple', stralign='right'))

tests/fabricstat_test.py

+30
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,36 @@
9090
9191
"""
9292

93+
class TestFabricStat(object):
94+
@classmethod
95+
def setup_class(cls):
96+
print("SETUP")
97+
os.environ["PATH"] += os.pathsep + scripts_path
98+
os.environ["UTILITIES_UNIT_TESTING"] = "1"
99+
100+
def test_single_show_fabric_counters(self):
101+
from .mock_tables import mock_single_asic
102+
import importlib
103+
importlib.reload(mock_single_asic)
104+
from .mock_tables import dbconnector
105+
dbconnector.load_database_config
106+
dbconnector.load_namespace_config()
107+
108+
return_code, result = get_result_and_return_code('fabricstat')
109+
print("return_code: {}".format(return_code))
110+
print("result = {}".format(result))
111+
assert return_code == 0
112+
assert result == multi_asic_fabric_counters_asic0
113+
114+
@classmethod
115+
def teardown_class(cls):
116+
print("TEARDOWN")
117+
os.environ["PATH"] = os.pathsep.join(
118+
os.environ["PATH"].split(os.pathsep)[:-1])
119+
os.environ["UTILITIES_UNIT_TESTING"] = "0"
120+
os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = ""
121+
122+
93123
class TestMultiAsicFabricStat(object):
94124
@classmethod
95125
def setup_class(cls):

tests/mock_tables/counters_db.json

+140
Original file line numberDiff line numberDiff line change
@@ -1617,6 +1617,146 @@
16171617
"oid:0x1500000000067d": "SAI_QUEUE_TYPE_UNICAST_VOQ",
16181618
"oid:0x1500000000067e": "SAI_QUEUE_TYPE_UNICAST_VOQ"
16191619
},
1620+
"COUNTERS_FABRIC_PORT_NAME_MAP" : {
1621+
"PORT0": "oid:0x1000000000143",
1622+
"PORT1": "oid:0x1000000000144",
1623+
"PORT2": "oid:0x1000000000145",
1624+
"PORT3": "oid:0x1000000000146",
1625+
"PORT4": "oid:0x1000000000147",
1626+
"PORT5": "oid:0x1000000000148",
1627+
"PORT6": "oid:0x1000000000149",
1628+
"PORT7": "oid:0x100000000014a"
1629+
},
1630+
"COUNTERS:oid:0x1000000000143": {
1631+
"SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS": "0",
1632+
"SAI_PORT_STAT_IF_OUT_OCTETS": "0",
1633+
"SAI_PORT_STAT_IF_IN_OCTETS": "1113",
1634+
"SAI_PORT_STAT_IF_IN_ERRORS": "0",
1635+
"SAI_PORT_STAT_IF_IN_FABRIC_DATA_UNITS": "6",
1636+
"SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "5",
1637+
"SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "1759692040",
1638+
"SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "5"
1639+
},
1640+
"COUNTERS:oid:0x1000000000144": {
1641+
"SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS": "0",
1642+
"SAI_PORT_STAT_IF_OUT_OCTETS": "0",
1643+
"SAI_PORT_STAT_IF_IN_OCTETS": "0",
1644+
"SAI_PORT_STAT_IF_IN_ERRORS": "0",
1645+
"SAI_PORT_STAT_IF_IN_FABRIC_DATA_UNITS": "0",
1646+
"SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "0",
1647+
"SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "58977677898",
1648+
"SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "0"
1649+
},
1650+
"COUNTERS:oid:0x1000000000145": {
1651+
"SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS": "0",
1652+
"SAI_PORT_STAT_IF_OUT_OCTETS": "0",
1653+
"SAI_PORT_STAT_IF_IN_OCTETS": "371",
1654+
"SAI_PORT_STAT_IF_IN_ERRORS": "0",
1655+
"SAI_PORT_STAT_IF_IN_FABRIC_DATA_UNITS": "2",
1656+
"SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "0",
1657+
"SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "1769448760",
1658+
"SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "0"
1659+
},
1660+
"COUNTERS:oid:0x1000000000146": {
1661+
"SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS": "0",
1662+
"SAI_PORT_STAT_IF_OUT_OCTETS": "0",
1663+
"SAI_PORT_STAT_IF_IN_OCTETS": "0",
1664+
"SAI_PORT_STAT_IF_IN_ERRORS": "0",
1665+
"SAI_PORT_STAT_IF_IN_FABRIC_DATA_UNITS": "0",
1666+
"SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "0",
1667+
"SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "58976477608",
1668+
"SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "0"
1669+
},
1670+
"COUNTERS:oid:0x1000000000147": {
1671+
"SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS": "0",
1672+
"SAI_PORT_STAT_IF_OUT_OCTETS": "0",
1673+
"SAI_PORT_STAT_IF_IN_OCTETS": "1855",
1674+
"SAI_PORT_STAT_IF_IN_ERRORS": "0",
1675+
"SAI_PORT_STAT_IF_IN_FABRIC_DATA_UNITS": "10",
1676+
"SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "73",
1677+
"SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "1763293100",
1678+
"SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "73"
1679+
},
1680+
"COUNTERS:oid:0x1000000000148": {
1681+
"SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS": "0",
1682+
"SAI_PORT_STAT_IF_OUT_OCTETS": "0",
1683+
"SAI_PORT_STAT_IF_IN_OCTETS": "0",
1684+
"SAI_PORT_STAT_IF_IN_ERRORS": "0",
1685+
"SAI_PORT_STAT_IF_IN_FABRIC_DATA_UNITS": "0",
1686+
"SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "44196",
1687+
"SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "58975150569",
1688+
"SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "0"
1689+
},
1690+
"COUNTERS:oid:0x1000000000149": {
1691+
"SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS": "0",
1692+
"SAI_PORT_STAT_IF_OUT_OCTETS": "0",
1693+
"SAI_PORT_STAT_IF_IN_OCTETS": "742",
1694+
"SAI_PORT_STAT_IF_IN_ERRORS": "0",
1695+
"SAI_PORT_STAT_IF_IN_FABRIC_DATA_UNITS": "4",
1696+
"SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "10",
1697+
"SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "1763174090",
1698+
"SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "0"
1699+
},
1700+
"COUNTERS:oid:0x100000000014a": {
1701+
"SAI_PORT_STAT_IF_OUT_FABRIC_DATA_UNITS": "0",
1702+
"SAI_PORT_STAT_IF_OUT_OCTETS": "0",
1703+
"SAI_PORT_STAT_IF_IN_OCTETS": "1855",
1704+
"SAI_PORT_STAT_IF_IN_ERRORS": "0",
1705+
"SAI_PORT_STAT_IF_IN_FABRIC_DATA_UNITS": "10",
1706+
"SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "187",
1707+
"SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "1768439529",
1708+
"SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "1331"
1709+
},
1710+
"COUNTERS_FABRIC_QUEUE_NAME_MAP" : {
1711+
"PORT0:0": "oid:0x15000000000186",
1712+
"PORT1:0": "oid:0x15000000000187",
1713+
"PORT2:0": "oid:0x15000000000188",
1714+
"PORT3:0": "oid:0x15000000000189",
1715+
"PORT4:0": "oid:0x1500000000018a",
1716+
"PORT5:0": "oid:0x1500000000018b",
1717+
"PORT6:0": "oid:0x1500000000018c",
1718+
"PORT7:0": "oid:0x1500000000018d"
1719+
},
1720+
"COUNTERS:oid:0x15000000000186": {
1721+
"SAI_QUEUE_STAT_WATERMARK_LEVEL": "20",
1722+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "763",
1723+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL": "12"
1724+
},
1725+
"COUNTERS:oid:0x15000000000187": {
1726+
"SAI_QUEUE_STAT_WATERMARK_LEVEL": "0",
1727+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "0",
1728+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL": "0"
1729+
},
1730+
"COUNTERS:oid:0x15000000000188": {
1731+
"SAI_QUEUE_STAT_WATERMARK_LEVEL": "8",
1732+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "104",
1733+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL": "8"
1734+
},
1735+
"COUNTERS:oid:0x15000000000189": {
1736+
"SAI_QUEUE_STAT_WATERMARK_LEVEL": "0",
1737+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "0",
1738+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL": "0"
1739+
},
1740+
"COUNTERS:oid:0x1500000000018a": {
1741+
"SAI_QUEUE_STAT_WATERMARK_LEVEL": "22",
1742+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "1147",
1743+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL": "14"
1744+
},
1745+
"COUNTERS:oid:0x1500000000018b": {
1746+
"SAI_QUEUE_STAT_WATERMARK_LEVEL": "0",
1747+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "0",
1748+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL": "0"
1749+
},
1750+
"COUNTERS:oid:0x1500000000018c": {
1751+
"SAI_QUEUE_STAT_WATERMARK_LEVEL": "10",
1752+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "527",
1753+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL": "8"
1754+
},
1755+
"COUNTERS:oid:0x1500000000018d": {
1756+
"SAI_QUEUE_STAT_WATERMARK_LEVEL": "17",
1757+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_BYTES": "1147",
1758+
"SAI_QUEUE_STAT_CURR_OCCUPANCY_LEVEL": "14"
1759+
},
16201760
"COUNTERS_DEBUG_NAME_PORT_STAT_MAP": {
16211761
"DEBUG_0": "SAI_PORT_STAT_IN_DROP_REASON_RANGE_BASE",
16221762
"DEBUG_2": "SAI_PORT_STAT_OUT_CONFIGURED_DROP_REASONS_1_DROPPED_PKTS"

tests/mock_tables/state_db.json

+34
Original file line numberDiff line numberDiff line change
@@ -946,5 +946,39 @@
946946
},
947947
"ADVERTISE_NETWORK_TABLE|fccc:a250:a251::a6:1/128": {
948948
"profile": ""
949+
},
950+
"FABRIC_PORT_TABLE|PORT0" : {
951+
"STATUS": "up",
952+
"REMOTE_MOD": "0",
953+
"REMOTE_PORT": "79"
954+
},
955+
"FABRIC_PORT_TABLE|PORT1" : {
956+
"STATUS": "down"
957+
},
958+
"FABRIC_PORT_TABLE|PORT2" : {
959+
"STATUS": "up",
960+
"REMOTE_MOD": "0",
961+
"REMOTE_PORT": "94"
962+
},
963+
"FABRIC_PORT_TABLE|PORT3" : {
964+
"STATUS": "down"
965+
},
966+
"FABRIC_PORT_TABLE|PORT4" : {
967+
"STATUS": "up",
968+
"REMOTE_MOD": "0",
969+
"REMOTE_PORT": "85"
970+
},
971+
"FABRIC_PORT_TABLE|PORT5" : {
972+
"STATUS": "down"
973+
},
974+
"FABRIC_PORT_TABLE|PORT6" : {
975+
"STATUS": "up",
976+
"REMOTE_MOD": "0",
977+
"REMOTE_PORT": "84"
978+
},
979+
"FABRIC_PORT_TABLE|PORT7" : {
980+
"STATUS": "up",
981+
"REMOTE_MOD": "0",
982+
"REMOTE_PORT": "93"
949983
}
950984
}

0 commit comments

Comments
 (0)