diff --git a/clear/main.py b/clear/main.py index 28dbe5ca88..788061e627 100755 --- a/clear/main.py +++ b/clear/main.py @@ -225,6 +225,13 @@ def srv6counters(): command = ["srv6stat", "-c"] run_command(command) + +@cli.command() +def switchcounters(): + """Clear switch counters""" + command = ["switchstat", "-c"] + run_command(command) + # # 'clear watermarks # diff --git a/counterpoll/main.py b/counterpoll/main.py index f0e08bde67..65a2212e23 100644 --- a/counterpoll/main.py +++ b/counterpoll/main.py @@ -1,9 +1,12 @@ import click -import json -from flow_counter_util.route import exit_if_route_flow_counter_not_support -from swsscommon.swsscommon import ConfigDBConnector +import utilities_common.cli as clicommon + from tabulate import tabulate from sonic_py_common import device_info +from flow_counter_util.route import exit_if_route_flow_counter_not_support +from swsscommon.swsscommon import ConfigDBConnector +from swsscommon.swsscommon import CFG_FLEX_COUNTER_TABLE_NAME as CFG_FLEX_COUNTER_TABLE + BUFFER_POOL_WATERMARK = "BUFFER_POOL_WATERMARK" PORT_BUFFER_DROP = "PORT_BUFFER_DROP" @@ -540,6 +543,56 @@ def disable(ctx): # noqa: F811 ctx.obj.mod_entry("FLEX_COUNTER_TABLE", "SRV6", srv6_info) +# Switch counter commands +@cli.group() +def switch(): + """ Switch counter commands """ + pass + + +@switch.command() +@clicommon.pass_db +@click.argument("poll_interval", type=click.IntRange(1000, 60000)) +def interval(db, poll_interval): # noqa: F811 + """ Set switch counter query interval """ + table = CFG_FLEX_COUNTER_TABLE + key = "SWITCH" + + data = { + "POLL_INTERVAL": poll_interval + } + + db.cfgdb.mod_entry(table, key, data) + + +@switch.command() +@clicommon.pass_db +def enable(db): # noqa: F811 + """ Enable switch counter query """ + table = CFG_FLEX_COUNTER_TABLE + key = "SWITCH" + + data = { + "FLEX_COUNTER_STATUS": ENABLE + } + + db.cfgdb.mod_entry(table, key, data) + + +@switch.command() +@clicommon.pass_db +def disable(db): # noqa: F811 + """ Disable switch counter query """ + table = CFG_FLEX_COUNTER_TABLE + key = "SWITCH" + + data = { + "FLEX_COUNTER_STATUS": DISABLE + } + + db.cfgdb.mod_entry(table, key, data) + + @cli.command() def show(): """ Show the counter configuration """ @@ -561,6 +614,7 @@ def show(): wred_queue_info = configdb.get_entry('FLEX_COUNTER_TABLE', 'WRED_ECN_QUEUE') wred_port_info = configdb.get_entry('FLEX_COUNTER_TABLE', 'WRED_ECN_PORT') srv6_info = configdb.get_entry('FLEX_COUNTER_TABLE', 'SRV6') + switch_info = configdb.get_entry('FLEX_COUNTER_TABLE', 'SWITCH') header = ("Type", "Interval (in ms)", "Status") data = [] @@ -598,6 +652,12 @@ def show(): if srv6_info: data.append(["SRV6_STAT", srv6_info.get("POLL_INTERVAL", DEFLT_10_SEC), srv6_info.get("FLEX_COUNTER_STATUS", DISABLE)]) + if switch_info: + data.append([ + "SWITCH_STAT", + switch_info.get("POLL_INTERVAL", DEFLT_60_SEC), + switch_info.get("FLEX_COUNTER_STATUS", DISABLE) + ]) if is_dpu(configdb) and eni_info: data.append(["ENI_STAT", eni_info.get("POLL_INTERVAL", DEFLT_10_SEC), diff --git a/doc/Command-Reference.md b/doc/Command-Reference.md index 2289d5e751..3d58395001 100644 --- a/doc/Command-Reference.md +++ b/doc/Command-Reference.md @@ -169,6 +169,9 @@ * [Radius](#radius) * [Radius show commands](#show-radius-commands) * [Radius config commands](#Radius-config-commands) +* [Switch](#switch) + * [Switch Show commands](#switch-show-commands) + * [Switch Clear commands](#switch-clear-commands) * [sFlow](#sflow) * [sFlow Show commands](#sflow-show-commands) * [sFlow Config commands](#sflow-config-commands) @@ -5213,6 +5216,10 @@ The "detailed" subcommand is used to display more detailed interface counters. A WRED Red Dropped Packets....................... 0 WRED Total Dropped Packets..................... 0 + Trimmed Packets................................ 0 + Trimmed Sent Packets........................... 0 + Trimmed Dropped Packets........................ 0 + Time Since Counters Last Cleared............... None ``` @@ -5273,11 +5280,11 @@ The "trim" subcommand is used to display the interface packet trimming related s - Example: ``` admin@sonic:~$ show interfaces counters trim - IFACE STATE TRIM_PKTS - ---------- ------- ----------- - Ethernet0 U 0 - Ethernet8 U 100 - Ethernet16 U 200 + IFACE STATE TRIM_PKTS TRIM_TX_PKTS TRIM_DRP_PKTS + ---------- ------- ----------- -------------- --------------- + Ethernet0 U 0 0 0 + Ethernet8 U 100 100 0 + Ethernet16 U 200 100 100 ``` **show interfaces description** @@ -9893,28 +9900,28 @@ This command can be used to clear the counters for all queues of all ports. Note ... admin@sonic:~$ show queue counters --trim - Port TxQ Trim/pkts - --------- ----- ----------- - Ethernet0 UC0 0 - Ethernet0 UC1 0 - Ethernet0 UC2 0 - Ethernet0 UC3 0 - Ethernet0 UC4 0 - Ethernet0 UC5 0 - Ethernet0 UC6 0 - Ethernet0 UC7 0 - Ethernet0 UC8 0 - Ethernet0 UC9 0 - Ethernet0 MC0 N/A - Ethernet0 MC1 N/A - Ethernet0 MC2 N/A - Ethernet0 MC3 N/A - Ethernet0 MC4 N/A - Ethernet0 MC5 N/A - Ethernet0 MC6 N/A - Ethernet0 MC7 N/A - Ethernet0 MC8 N/A - Ethernet0 MC9 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts + --------- ----- ----------- --------------- --------------- + Ethernet0 UC0 0 0 0 + Ethernet0 UC1 100 100 0 + Ethernet0 UC2 200 100 100 + Ethernet0 UC3 300 300 0 + Ethernet0 UC4 400 200 200 + Ethernet0 UC5 500 500 0 + Ethernet0 UC6 600 300 300 + Ethernet0 UC7 700 700 0 + Ethernet0 UC8 800 400 400 + Ethernet0 UC9 900 900 0 + Ethernet0 MC0 N/A N/A N/A + Ethernet0 MC1 N/A N/A N/A + Ethernet0 MC2 N/A N/A N/A + Ethernet0 MC3 N/A N/A N/A + Ethernet0 MC4 N/A N/A N/A + Ethernet0 MC5 N/A N/A N/A + Ethernet0 MC6 N/A N/A N/A + Ethernet0 MC7 N/A N/A N/A + Ethernet0 MC8 N/A N/A N/A + Ethernet0 MC9 N/A N/A N/A ``` Optionally, you can specify an interface name in order to display only that particular interface @@ -10328,6 +10335,83 @@ This command is to config the radius server for various parameter listed. timeout Specify RADIUS server global timeout <1 - 60> ``` + +# Switch + +This section explains the various show, configuration and clear commands available for users. + +### Switch Show commands + +This subsection explains how to display switch configuration or stats. + +**show switch counters** + +This command displays switch stats. + +- Usage: + ```bash + show switch counters [OPTIONS] + show switch counters all [OPTIONS] + show switch counters trim [OPTIONS] + show switch counters detailed [OPTIONS] + ``` + +- Options: + - _-p,--period_: display stats over a specified period (in seconds) + - _-d,--display_: show internal interfaces + - _-n,--namespace_: namespace name or all + - _-j,--json_: display in JSON format + - _-v,--verbose_: enable verbose output + +- Example: + ```bash + admin@sonic:~$ show switch counters + TrimSent/pkts TrimDrop/pkts + --------------- --------------- + 100 100 + + admin@sonic:~$ show switch counters all + TrimSent/pkts TrimDrop/pkts + --------------- --------------- + 100 100 + + admin@sonic:~$ show switch counters trim + TrimSent/pkts TrimDrop/pkts + --------------- --------------- + 100 100 + + admin@sonic:~$ show switch counters detailed + Trimmed Sent Packets........................... 100 + Trimmed Dropped Packets........................ 100 + + admin@sonic:~$ show switch counters --json + { + "trim_drop": "100", + "trim_sent": "100" + } + ``` + +### Switch Clear commands + +This subsection explains how to clear switch stats. + +**sonic-clear switchcounters** + +This command is used to clear switch counters. + +- Usage: + ```bash + sonic-clear switchcounters + ``` + +- Examples: + ```bash + admin@sonic:~$ sonic-clear switchcounters + Cleared switch counters + ``` + +Go Back To [Beginning of the document](#) or [Beginning of this section](#switch) + ## sFlow ### sFlow Show commands diff --git a/scripts/queuestat b/scripts/queuestat index 3a74e5cc57..3516386b11 100755 --- a/scripts/queuestat +++ b/scripts/queuestat @@ -44,12 +44,35 @@ from utilities_common.cli import json_serial, UserCache from utilities_common import constants import utilities_common.multi_asic as multi_asic_util -QueueStats = namedtuple("QueueStats", "queueindex, queuetype, totalpacket, totalbytes, droppacket, dropbytes, trimpacket") -VoqStats = namedtuple("VoqStats", "queueindex, queuetype, totalpacket, totalbytes, droppacket, dropbytes, creditWDpkts") -std_header = ['Port', 'TxQ', 'Counter/pkts', 'Counter/bytes', 'Drop/pkts', 'Drop/bytes'] -all_header = ['Port', 'TxQ', 'Counter/pkts', 'Counter/bytes', 'Drop/pkts', 'Drop/bytes', 'Trim/pkts'] -trim_header = ['Port', 'TxQ', 'Trim/pkts'] -voq_header = ['Port', 'Voq', 'Counter/pkts', 'Counter/bytes', 'Drop/pkts', 'Drop/bytes', 'Credit-WD-Del/pkts'] +QueueStats = namedtuple( + "QueueStats", "queueindex, queuetype, " + "totalpacket, totalbytes, droppacket, dropbytes, " + "trimpkt, trimsentpkt, trimdroppkt" +) +VoqStats = namedtuple( + "VoqStats", "queueindex, queuetype, " + "totalpacket, totalbytes, droppacket, dropbytes, " + "creditWDpkts" +) + +std_header = [ + 'Port', 'TxQ', + 'Counter/pkts', 'Counter/bytes', 'Drop/pkts', 'Drop/bytes' +] +all_header = [ + 'Port', 'TxQ', + 'Counter/pkts', 'Counter/bytes', 'Drop/pkts', 'Drop/bytes', + 'Trim/pkts', 'TrimSent/pkts', 'TrimDrop/pkts' +] +trim_header = [ + 'Port', 'TxQ', + 'Trim/pkts', 'TrimSent/pkts', 'TrimDrop/pkts' +] +voq_header = [ + 'Port', 'Voq', + 'Counter/pkts', 'Counter/bytes', 'Drop/pkts', 'Drop/bytes', + 'Credit-WD-Del/pkts' +] counter_bucket_dict = { 'SAI_QUEUE_STAT_PACKETS': 2, @@ -59,6 +82,8 @@ counter_bucket_dict = { } trim_counter_bucket_dict = { 'SAI_QUEUE_STAT_TRIM_PACKETS': 6, + 'SAI_QUEUE_STAT_TX_TRIM_PACKETS': 7, + 'SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS': 8, } voq_counter_bucket_dict = { 'SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS': 6 @@ -141,10 +166,14 @@ def build_json(port, cnstat, all=False, trim=False, voq=False): "droppacket": k[4], "dropbytes": k[5], "trimpacket": k[6], + "trimsentpacket": k[7], + "trimdroppacket": k[8], } elif trim: # Packet Trimming related statistics p[k[1]] = { "trimpacket": k[2], + "trimsentpacket": k[3], + "trimdroppacket": k[4], } else: # Generic statistics p[k[1]] = { @@ -380,19 +409,19 @@ class Queuestat(object): if not non_zero or \ data['totalpacket'] != '0' or data['totalbytes'] != '0' or \ data['droppacket'] != '0' or data['dropbytes'] != '0' or \ - data['trimpacket'] != '0': + data['trimpkt'] != '0' or data['trimsentpkt'] != '0' or data['trimdroppkt'] != '0': table.append(( port, queuetag, data['totalpacket'], data['totalbytes'], data['droppacket'], data['dropbytes'], - data['trimpacket'] + data['trimpkt'], data['trimsentpkt'], data['trimdroppkt'] )) elif self.trim: # Packet Trimming related statistics if not non_zero or \ - data['trimpacket'] != '0': + data['trimpkt'] != '0' or data['trimsentpkt'] != '0' or data['trimdroppkt'] != '0': table.append(( port, queuetag, - data['trimpacket'] + data['trimpkt'], data['trimsentpkt'], data['trimdroppkt'] )) else: # Generic statistics if not non_zero or \ @@ -460,26 +489,30 @@ class Queuestat(object): totalbytes = ns_diff(cntr['totalbytes'], old_cntr['totalbytes']) droppacket = ns_diff(cntr['droppacket'], old_cntr['droppacket']) dropbytes = ns_diff(cntr['dropbytes'], old_cntr['dropbytes']) - trimpacket = ns_diff(cntr['trimpacket'], old_cntr['trimpacket']) + trimpkt = ns_diff(cntr['trimpkt'], old_cntr['trimpkt']) + trimsentpkt = ns_diff(cntr['trimsentpkt'], old_cntr['trimsentpkt']) + trimdroppkt = ns_diff(cntr['trimdroppkt'], old_cntr['trimdroppkt']) if not non_zero or \ totalpacket != '0' or totalbytes != '0' or \ droppacket != '0' or dropbytes != '0' or \ - trimpacket != '0': + trimpkt != '0' or trimsentpkt != '0' or trimdroppkt != '0': table.append(( port, queuetag, totalpacket, totalbytes, droppacket, dropbytes, - trimpacket + trimpkt, trimsentpkt, trimdroppkt )) elif self.trim: # Packet Trimming related statistics - trimpacket = ns_diff(cntr['trimpacket'], old_cntr['trimpacket']) + trimpkt = ns_diff(cntr['trimpkt'], old_cntr['trimpkt']) + trimsentpkt = ns_diff(cntr['trimsentpkt'], old_cntr['trimsentpkt']) + trimdroppkt = ns_diff(cntr['trimdroppkt'], old_cntr['trimdroppkt']) if not non_zero or \ - trimpacket != '0': + trimpkt != '0' or trimsentpkt != '0' or trimdroppkt != '0': table.append(( port, queuetag, - trimpacket + trimpkt, trimsentpkt, trimdroppkt )) else: # Generic statistics totalpacket = ns_diff(cntr['totalpacket'], old_cntr['totalpacket']) diff --git a/scripts/switchstat b/scripts/switchstat new file mode 100755 index 0000000000..90e9b488e8 --- /dev/null +++ b/scripts/switchstat @@ -0,0 +1,133 @@ +#!/usr/bin/python3 + +import click +import time + +from utilities_common import multi_asic, constants +from utilities_common.switchstat import SwitchStat + + +@click.command() +@click.pass_context +@click.option( + "-a", "--all", + help="Display all the stats counters", + is_flag=True, + default=False +) +@click.option( + "-t", "--trim", + help="Display trimming related statistics", + is_flag=True, + default=False +) +@click.option( + "-l", "--detail", + help="Display detailed statistics", + is_flag=True, + default=False +) +@click.option( + "-r", "--raw", + help="Display raw stats (unmodified output)", + is_flag=True, + default=False +) +@click.option( + "-p", "--period", + help="Display stats over a specified period (in seconds)", + type=click.INT, + default=0, + show_default=True +) +@click.option( + "-c", "--clear", "clear_stats", + help="Copy & clear stats", + is_flag=True, + default=False +) +@click.option( + "-ds", "--delete", "del_stats", + help="Delete saved stats, either the uid or the specified tag", + is_flag=True, + default=False +) +@click.option( + "-da", "--delete-all", "del_all_stats", + help="Delete all saved stats", + is_flag=True, + default=False +) +@click.option( + "-T", "--tag", + help="Save stats with name TAG", + default=None +) +@multi_asic.multi_asic_click_options +@click.option( + "-j", "--json", "json_fmt", + help="Display in JSON format", + is_flag=True, + default=False +) +@click.version_option("1.0", "-v", "--version") +@click.help_option("-h", "--help") +def main(ctx, all, trim, detail, raw, period, clear_stats, del_stats, del_all_stats, tag, display, namespace, json_fmt): + """ Display switch counters """ + + if clear_stats: # save counters for all namespaces + namespace = None + display = constants.DISPLAY_ALL + + switchstat = SwitchStat(namespace, display, tag) + + if del_all_stats: # remove all stats + click.echo("Removed all saved switch stats") + switchstat.remove_stats(all=True) + ctx.exit(0) + + if del_stats: # remove single stat with/without tag + click.echo("Removed saved switch stats{}".format("" if tag is None else " using tag {}".format(tag))) + switchstat.remove_stats() + ctx.exit(0) + + if clear_stats: # reset counters + cnstat_dict = switchstat.get_cnstat_dict(timestamp=True) + + try: + switchstat.save_stats(cnstat_dict) + except OSError as e: + ctx.fail("Failed to clear switch counters: {}".format(str(e))) + + click.echo("Cleared switch counters{}".format("" if tag is None else " using tag {}".format(tag))) + ctx.exit(0) + + if raw: # display raw stats + cnstat_dict = switchstat.get_cnstat_dict() + switchstat.cnstat_print(cnstat_dict, all, trim, detail, json_fmt) + ctx.exit(0) + + if period == 0: # do not wait - display stats diff + cnstat_cached_dict = {} + + if switchstat.is_cache_exists(): # cache exists - display stats diff + try: + cnstat_cached_dict = switchstat.load_stats() + except OSError as e: + ctx.fail("Failed to load saved switch counters: {}".format(str(e))) + + cnstat_dict = switchstat.get_cnstat_dict() + switchstat.cnstat_diff_print(cnstat_dict, cnstat_cached_dict, all, trim, detail, json_fmt) + else: # no cache - display raw stats + cnstat_dict = switchstat.get_cnstat_dict() + switchstat.cnstat_print(cnstat_dict, all, trim, detail, json_fmt) + else: # wait for n seconds - display stats diff + click.echo("The switch stats are calculated within {} seconds period".format(period)) + cnstat_cached_dict = switchstat.get_cnstat_dict(timestamp=True) + time.sleep(period) + cnstat_dict = switchstat.get_cnstat_dict() + switchstat.cnstat_diff_print(cnstat_dict, cnstat_cached_dict, all, trim, detail, json_fmt) + + +if __name__ == "__main__": + main() diff --git a/setup.py b/setup.py index 248a5aff17..6f88ff83ec 100644 --- a/setup.py +++ b/setup.py @@ -171,6 +171,7 @@ 'scripts/storyteller', 'scripts/syseeprom-to-json', 'scripts/srv6stat', + 'scripts/switchstat', 'scripts/teamd_increase_retry_count.py', 'scripts/tempershow', 'scripts/tunnelstat', diff --git a/show/main.py b/show/main.py index c748e96cb4..a1a2839182 100755 --- a/show/main.py +++ b/show/main.py @@ -69,6 +69,7 @@ from . import bgp_cli from . import stp from . import srv6 +from . import switch from . import icmp from . import copp @@ -324,6 +325,7 @@ def cli(ctx): cli.add_command(dns.dns) cli.add_command(stp.spanning_tree) cli.add_command(srv6.srv6) +cli.add_command(switch.switch) cli.add_command(icmp.icmp) cli.add_command(copp.copp) diff --git a/show/switch.py b/show/switch.py new file mode 100644 index 0000000000..3fbfba71f5 --- /dev/null +++ b/show/switch.py @@ -0,0 +1,176 @@ +import click + +import utilities_common.cli as clicommon +from utilities_common import multi_asic + + +# +# Switch CLI ---------------------------------------------------------------------------------------------------------- +# + + +@click.group( + name="switch", + cls=clicommon.AliasedGroup +) +def switch(): + """ Show switch configuration """ + pass + + +@switch.group( + name="counters", + cls=clicommon.AliasedGroup, + invoke_without_command=True +) +@click.option( + "-p", "--period", + help="Display stats over a specified period (in seconds)", + type=click.INT, + default=0, + show_default=True +) +@multi_asic.multi_asic_click_options +@click.option( + "-j", "--json", "json_fmt", + help="Display in JSON format", + is_flag=True, + default=False +) +@click.option( + "-v", "--verbose", + help="Enable verbose output", + is_flag=True, + default=False +) +@click.pass_context +def counters(ctx, period, display, namespace, json_fmt, verbose): + """ Show switch counters """ + + if ctx.invoked_subcommand is not None: + return + + cmd = ["switchstat"] + + if period is not None: + cmd += ["-p", str(period)] + if display is not None: + cmd += ['-d', str(display)] + if namespace is not None: + cmd += ['-n', str(namespace)] + if json_fmt: + cmd += ['-j'] + + clicommon.run_command(cmd, display_cmd=verbose) + + +@counters.command( + name="all" +) +@click.option( + "-p", "--period", + help="Display stats over a specified period (in seconds)", + type=click.INT, + default=0, + show_default=True +) +@multi_asic.multi_asic_click_options +@click.option( + "-j", "--json", "json_fmt", + help="Display in JSON format", + is_flag=True, + default=False +) +@click.option( + "-v", "--verbose", + help="Enable verbose output", + is_flag=True, + default=False +) +def all_stats(period, display, namespace, json_fmt, verbose): + """ Show switch all stats """ + + cmd = ["switchstat", "--all"] + + if period is not None: + cmd += ["-p", str(period)] + if display is not None: + cmd += ['-d', str(display)] + if namespace is not None: + cmd += ['-n', str(namespace)] + if json_fmt: + cmd += ['-j'] + + clicommon.run_command(cmd, display_cmd=verbose) + + +@counters.command( + name="trim" +) +@click.option( + "-p", "--period", + help="Display stats over a specified period (in seconds)", + type=click.INT, + default=0, + show_default=True +) +@multi_asic.multi_asic_click_options +@click.option( + "-j", "--json", "json_fmt", + help="Display in JSON format", + is_flag=True, + default=False +) +@click.option( + "-v", "--verbose", + help="Enable verbose output", + is_flag=True, + default=False +) +def trim_stats(period, display, namespace, json_fmt, verbose): + """ Show switch trimming stats """ + + cmd = ["switchstat", "--trim"] + + if period is not None: + cmd += ["-p", str(period)] + if display is not None: + cmd += ['-d', str(display)] + if namespace is not None: + cmd += ['-n', str(namespace)] + if json_fmt: + cmd += ['-j'] + + clicommon.run_command(cmd, display_cmd=verbose) + + +@counters.command( + name="detailed" +) +@click.option( + "-p", "--period", + help="Display stats over a specified period (in seconds)", + type=click.INT, + default=0, + show_default=True +) +@multi_asic.multi_asic_click_options +@click.option( + "-v", "--verbose", + help="Enable verbose output", + is_flag=True, + default=False +) +def detailed_stats(period, display, namespace, verbose): + """ Show switch detailed stats """ + + cmd = ["switchstat", "--detail"] + + if period is not None: + cmd += ["-p", str(period)] + if display is not None: + cmd += ['-d', str(display)] + if namespace is not None: + cmd += ['-n', str(namespace)] + + clicommon.run_command(cmd, display_cmd=verbose) diff --git a/tests/clear_test.py b/tests/clear_test.py index f61c517e3c..ed3b31ff50 100644 --- a/tests/clear_test.py +++ b/tests/clear_test.py @@ -108,6 +108,13 @@ def test_clear_srv6counters(self, run_command): assert result.exit_code == 0 run_command.assert_called_with(['srv6stat', '-c']) + @patch('clear.main.run_command') + def test_clear_switchcounters(self, run_command): + runner = CliRunner() + result = runner.invoke(clear.cli.commands['switchcounters']) + assert result.exit_code == 0 + run_command.assert_called_with(['switchstat', '-c']) + def teardown(self): print('TEAR DOWN') diff --git a/tests/counterpoll_test.py b/tests/counterpoll_test.py index 55fdeff07a..93eb26577d 100644 --- a/tests/counterpoll_test.py +++ b/tests/counterpoll_test.py @@ -34,6 +34,7 @@ WRED_ECN_QUEUE_STAT 10000 enable WRED_ECN_PORT_STAT 1000 enable SRV6_STAT 10000 enable +SWITCH_STAT 60000 enable """ expected_counterpoll_show_dpu = """Type Interval (in ms) Status @@ -51,6 +52,7 @@ WRED_ECN_QUEUE_STAT 10000 enable WRED_ECN_PORT_STAT 1000 enable SRV6_STAT 10000 enable +SWITCH_STAT 60000 enable ENI_STAT 1000 enable """ @@ -361,6 +363,29 @@ def test_update_srv6_interval(self): table = db.cfgdb.get_table("FLEX_COUNTER_TABLE") assert test_interval == table["SRV6"]["POLL_INTERVAL"] + @pytest.mark.parametrize("status", ["disable", "enable"]) + def test_update_switch_status(self, status): + runner = CliRunner() + db = Db() + + result = runner.invoke(counterpoll.cli.commands["switch"].commands[status], [], obj=db) + print(result.exit_code, result.output) + assert result.exit_code == 0 + + table = db.cfgdb.get_table("FLEX_COUNTER_TABLE") + assert status == table["SWITCH"]["FLEX_COUNTER_STATUS"] + + def test_update_switch_interval(self): + runner = CliRunner() + db = Db() + test_interval = "20000" + + result = runner.invoke(counterpoll.cli.commands["switch"].commands["interval"], [test_interval], obj=db) + print(result.exit_code, result.output) + assert result.exit_code == 0 + + table = db.cfgdb.get_table("FLEX_COUNTER_TABLE") + assert test_interval == table["SWITCH"]["POLL_INTERVAL"] @classmethod def teardown_class(cls): diff --git a/tests/mock_tables/asic0/counters_db.json b/tests/mock_tables/asic0/counters_db.json index b85be89dbe..8e7eb56504 100644 --- a/tests/mock_tables/asic0/counters_db.json +++ b/tests/mock_tables/asic0/counters_db.json @@ -1855,7 +1855,9 @@ "SAI_PORT_STAT_PFC_5_TX_PKTS": "215", "SAI_PORT_STAT_PFC_6_TX_PKTS": "216", "SAI_PORT_STAT_PFC_7_TX_PKTS": "217", - "SAI_PORT_STAT_TRIM_PACKETS": "0" + "SAI_PORT_STAT_TRIM_PACKETS": "0", + "SAI_PORT_STAT_DROPPED_TRIM_PACKETS": "0", + "SAI_PORT_STAT_TX_TRIM_PACKETS": "0" }, "COUNTERS:oid:0x1000000000004": { "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "4", @@ -1916,7 +1918,9 @@ "SAI_PORT_STAT_PFC_5_TX_PKTS": "415", "SAI_PORT_STAT_PFC_6_TX_PKTS": "416", "SAI_PORT_STAT_PFC_7_TX_PKTS": "417", - "SAI_PORT_STAT_TRIM_PACKETS": "100" + "SAI_PORT_STAT_TRIM_PACKETS": "100", + "SAI_PORT_STAT_DROPPED_TRIM_PACKETS": "50", + "SAI_PORT_STAT_TX_TRIM_PACKETS": "50" }, "COUNTERS:oid:0x1000000000006": { "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "6", diff --git a/tests/mock_tables/config_db.json b/tests/mock_tables/config_db.json index 517301c758..b6ea11d31f 100644 --- a/tests/mock_tables/config_db.json +++ b/tests/mock_tables/config_db.json @@ -1832,6 +1832,10 @@ "POLL_INTERVAL": "10000", "FLEX_COUNTER_STATUS": "enable" }, + "FLEX_COUNTER_TABLE|SWITCH": { + "POLL_INTERVAL": "60000", + "FLEX_COUNTER_STATUS": "enable" + }, "PFC_WD|Ethernet0": { "action": "drop", "detection_time": "600", diff --git a/tests/mock_tables/counters_db.json b/tests/mock_tables/counters_db.json index d4453cd4ec..7a213cc959 100644 --- a/tests/mock_tables/counters_db.json +++ b/tests/mock_tables/counters_db.json @@ -9,7 +9,9 @@ "SAI_QUEUE_STAT_WRED_ECN_MARKED_PACKETS": "0", "SAI_QUEUE_STAT_WRED_DROPPED_PACKETS": "0", "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES": "61", - "SAI_QUEUE_STAT_TRIM_PACKETS": "0" + "SAI_QUEUE_STAT_TRIM_PACKETS": "0", + "SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS": "0", + "SAI_QUEUE_STAT_TX_TRIM_PACKETS": "0" }, "COUNTERS:oid:0x15000000000358": { "SAI_QUEUE_STAT_WRED_DROPPED_BYTES": "43", @@ -21,7 +23,9 @@ "SAI_QUEUE_STAT_DROPPED_PACKETS": "39", "SAI_QUEUE_STAT_PACKETS": "60", "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES": "88", - "SAI_QUEUE_STAT_TRIM_PACKETS": "100" + "SAI_QUEUE_STAT_TRIM_PACKETS": "100", + "SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS": "50", + "SAI_QUEUE_STAT_TX_TRIM_PACKETS": "50" }, "COUNTERS:oid:0x15000000000359": { "SAI_QUEUE_STAT_WRED_DROPPED_BYTES": "7", @@ -220,7 +224,9 @@ "SAI_QUEUE_STAT_DROPPED_PACKETS": "70", "SAI_QUEUE_STAT_PACKETS": "41", "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES": "46", - "SAI_QUEUE_STAT_TRIM_PACKETS": "0" + "SAI_QUEUE_STAT_TRIM_PACKETS": "0", + "SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS": "0", + "SAI_QUEUE_STAT_TX_TRIM_PACKETS": "0" }, "COUNTERS:oid:0x15000000000380": { "SAI_QUEUE_STAT_WRED_DROPPED_BYTES": "49", @@ -232,7 +238,9 @@ "SAI_QUEUE_STAT_DROPPED_PACKETS": "63", "SAI_QUEUE_STAT_PACKETS": "18", "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES": "18", - "SAI_QUEUE_STAT_TRIM_PACKETS": "100" + "SAI_QUEUE_STAT_TRIM_PACKETS": "100", + "SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS": "50", + "SAI_QUEUE_STAT_TX_TRIM_PACKETS": "50" }, "COUNTERS:oid:0x15000000000381": { "SAI_QUEUE_STAT_WRED_DROPPED_BYTES": "90", @@ -431,7 +439,9 @@ "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", "SAI_QUEUE_STAT_PACKETS": "0", "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES": "65", - "SAI_QUEUE_STAT_TRIM_PACKETS": "0" + "SAI_QUEUE_STAT_TRIM_PACKETS": "0", + "SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS": "0", + "SAI_QUEUE_STAT_TX_TRIM_PACKETS": "0" }, "COUNTERS:oid:0x150000000003a8": { "SAI_QUEUE_STAT_WRED_DROPPED_BYTES": "17", @@ -443,7 +453,9 @@ "SAI_QUEUE_STAT_DROPPED_PACKETS": "68", "SAI_QUEUE_STAT_PACKETS": "38", "SAI_QUEUE_STAT_SHARED_WATERMARK_BYTES": "94", - "SAI_QUEUE_STAT_TRIM_PACKETS": "100" + "SAI_QUEUE_STAT_TRIM_PACKETS": "100", + "SAI_QUEUE_STAT_DROPPED_TRIM_PACKETS": "50", + "SAI_QUEUE_STAT_TX_TRIM_PACKETS": "50" }, "COUNTERS:oid:0x150000000003a9": { "SAI_QUEUE_STAT_WRED_DROPPED_BYTES": "65", @@ -1264,7 +1276,9 @@ "SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S13": "0", "SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S14": "0", "SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S15": "0", - "SAI_PORT_STAT_TRIM_PACKETS": "0" + "SAI_PORT_STAT_TRIM_PACKETS": "100", + "SAI_PORT_STAT_DROPPED_TRIM_PACKETS": "50", + "SAI_PORT_STAT_TX_TRIM_PACKETS": "50" }, "COUNTERS:oid:0x1000000000013": { "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "4", @@ -1361,7 +1375,9 @@ "SAI_PORT_STAT_YELLOW_WRED_DROPPED_PACKETS":"33", "SAI_PORT_STAT_RED_WRED_DROPPED_PACKETS":"51", "SAI_PORT_STAT_WRED_DROPPED_PACKETS":"101", - "SAI_PORT_STAT_TRIM_PACKETS": "100" + "SAI_PORT_STAT_TRIM_PACKETS": "20000", + "SAI_PORT_STAT_DROPPED_TRIM_PACKETS": "10000", + "SAI_PORT_STAT_TX_TRIM_PACKETS": "10000" }, "COUNTERS:oid:0x1000000000014": { "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "6", diff --git a/tests/portstat_db/counters_db.json b/tests/portstat_db/counters_db.json index c5a29c5c70..50d4cfd5b1 100644 --- a/tests/portstat_db/counters_db.json +++ b/tests/portstat_db/counters_db.json @@ -1238,7 +1238,9 @@ "SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S13": "0", "SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S14": "0", "SAI_PORT_STAT_IF_IN_FEC_CODEWORD_ERRORS_S15": "0", - "SAI_PORT_STAT_TRIM_PACKETS": "0" + "SAI_PORT_STAT_TRIM_PACKETS": "0", + "SAI_PORT_STAT_DROPPED_TRIM_PACKETS": "0", + "SAI_PORT_STAT_TX_TRIM_PACKETS": "0" }, "COUNTERS:oid:0x1000000000013": { "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "4", @@ -1303,7 +1305,9 @@ "SAI_PORT_STAT_YELLOW_WRED_DROPPED_PACKETS":"33", "SAI_PORT_STAT_RED_WRED_DROPPED_PACKETS":"51", "SAI_PORT_STAT_WRED_DROPPED_PACKETS":"101", - "SAI_PORT_STAT_TRIM_PACKETS": "100" + "SAI_PORT_STAT_TRIM_PACKETS": "100", + "SAI_PORT_STAT_DROPPED_TRIM_PACKETS": "50", + "SAI_PORT_STAT_TX_TRIM_PACKETS": "50" }, "COUNTERS:oid:0x1000000000014": { "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "6", @@ -1363,7 +1367,10 @@ "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0", "SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "100317", "SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "0", - "SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "0" + "SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "0", + "SAI_PORT_STAT_TRIM_PACKETS": "20000", + "SAI_PORT_STAT_DROPPED_TRIM_PACKETS": "10000", + "SAI_PORT_STAT_TX_TRIM_PACKETS": "10000" }, "COUNTERS:oid:0x1000000000015": { "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "0", diff --git a/tests/portstat_input/assert_show_output.py b/tests/portstat_input/assert_show_output.py index 4a71c9a93e..9e678c50b6 100644 --- a/tests/portstat_input/assert_show_output.py +++ b/tests/portstat_input/assert_show_output.py @@ -3,94 +3,99 @@ """ trim_counters_all = """\ - IFACE STATE TRIM_PKTS ---------- ------- ----------- -Ethernet0 D 0 -Ethernet4 N/A 100 -Ethernet8 N/A N/A + IFACE STATE TRIM_PKTS TRIM_TX_PKTS TRIM_DRP_PKTS +--------- ------- ----------- -------------- --------------- +Ethernet0 D 100 50 50 +Ethernet4 N/A 20,000 10,000 10,000 +Ethernet8 N/A N/A N/A N/A """ trim_counters_all_json = """\ { "Ethernet0": { "STATE": "D", - "TRIM_PKTS": "0" + "TRIM_DRP_PKTS": "50", + "TRIM_PKTS": "100", + "TRIM_TX_PKTS": "50" }, "Ethernet4": { "STATE": "N/A", - "TRIM_PKTS": "100" + "TRIM_DRP_PKTS": "10,000", + "TRIM_PKTS": "20,000", + "TRIM_TX_PKTS": "10,000" }, "Ethernet8": { "STATE": "N/A", - "TRIM_PKTS": "N/A" + "TRIM_DRP_PKTS": "N/A", + "TRIM_PKTS": "N/A", + "TRIM_TX_PKTS": "N/A" } } """ trim_eth0_counters = """\ - IFACE STATE TRIM_PKTS ---------- ------- ----------- -Ethernet0 D 0 + IFACE STATE TRIM_PKTS TRIM_TX_PKTS TRIM_DRP_PKTS +--------- ------- ----------- -------------- --------------- +Ethernet0 D 100 50 50 """ trim_eth0_counters_json = """\ { "Ethernet0": { "STATE": "D", - "TRIM_PKTS": "0" + "TRIM_DRP_PKTS": "50", + "TRIM_PKTS": "100", + "TRIM_TX_PKTS": "50" } } """ trim_eth4_counters = """\ - IFACE STATE TRIM_PKTS ---------- ------- ----------- -Ethernet4 N/A 100 + IFACE STATE TRIM_PKTS TRIM_TX_PKTS TRIM_DRP_PKTS +--------- ------- ----------- -------------- --------------- +Ethernet4 N/A 20,000 10,000 10,000 """ trim_eth4_counters_json = """\ { "Ethernet4": { "STATE": "N/A", - "TRIM_PKTS": "100" + "TRIM_DRP_PKTS": "10,000", + "TRIM_PKTS": "20,000", + "TRIM_TX_PKTS": "10,000" } } """ trim_eth8_counters = """\ - IFACE STATE TRIM_PKTS ---------- ------- ----------- -Ethernet8 N/A N/A + IFACE STATE TRIM_PKTS TRIM_TX_PKTS TRIM_DRP_PKTS +--------- ------- ----------- -------------- --------------- +Ethernet8 N/A N/A N/A N/A """ trim_eth8_counters_json = """\ { "Ethernet8": { "STATE": "N/A", - "TRIM_PKTS": "N/A" + "TRIM_DRP_PKTS": "N/A", + "TRIM_PKTS": "N/A", + "TRIM_TX_PKTS": "N/A" } } """ trim_counters_period = """\ The rates are calculated within 3 seconds period - IFACE STATE TRIM_PKTS ---------- ------- ----------- -Ethernet0 D 0 -Ethernet4 N/A 0 -Ethernet8 N/A N/A + IFACE STATE TRIM_PKTS TRIM_TX_PKTS TRIM_DRP_PKTS +--------- ------- ----------- -------------- --------------- +Ethernet0 D 0 0 0 +Ethernet4 N/A 0 0 0 +Ethernet8 N/A N/A N/A N/A """ trim_counters_clear_msg = """\ Cleared counters """ trim_counters_clear_stat = """\ - IFACE STATE TRIM_PKTS ---------- ------- ----------- -Ethernet0 D 0 -Ethernet4 N/A 0 -Ethernet8 N/A N/A -""" -trim_counters_clear_raw = """\ - IFACE STATE TRIM_PKTS ---------- ------- ----------- -Ethernet0 D 0 -Ethernet4 N/A 100 -Ethernet8 N/A N/A + IFACE STATE TRIM_PKTS TRIM_TX_PKTS TRIM_DRP_PKTS +--------- ------- ----------- -------------- --------------- +Ethernet0 D 0 0 0 +Ethernet4 N/A 0 0 0 +Ethernet8 N/A N/A N/A N/A """ diff --git a/tests/portstat_test.py b/tests/portstat_test.py index 070441b127..e148564b53 100644 --- a/tests/portstat_test.py +++ b/tests/portstat_test.py @@ -1,16 +1,15 @@ import pytest import logging - import os -import shutil - -from click.testing import CliRunner import clear.main as clear import show.main as show + +from click.testing import CliRunner +from utilities_common.cli import UserCache + from .utils import get_result_and_return_code from .portstat_input import assert_show_output -from utilities_common.cli import UserCache test_path = os.path.dirname(os.path.abspath(__file__)) modules_path = os.path.dirname(test_path) @@ -37,12 +36,12 @@ """ intf_counters_all = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM ---------- ------- ------- ------------ ----------- --------- -------- -------- -------- ------- ------------ ----------- --------- -------- -------- -------- ------ -Ethernet0 D 8 2000.00 MB/s 247000.00/s 64.00% 10 100 N/A 10 1500.00 MB/s 183000.00/s 48.00% N/A N/A N/A 0 -Ethernet4 N/A 4 204.80 KB/s 200.00/s N/A 0 1,000 N/A 40 204.85 KB/s 201.00/s N/A N/A N/A N/A 100 -Ethernet8 N/A 6 1350.00 KB/s 9000.00/s N/A 100 10 N/A 60 13.37 MB/s 9000.00/s N/A N/A N/A N/A N/A -Ethernet9 N/A 0 0.00 B/s 0.00/s N/A 0 0 N/A 0 0.00 B/s 0.00/s N/A N/A N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM TRIM_TX TRIM_DRP +--------- ------- ------- ------------ ----------- --------- -------- -------- -------- ------- ------------ ----------- --------- -------- -------- -------- ------ --------- ---------- +Ethernet0 D 8 2000.00 MB/s 247000.00/s 64.00% 10 100 N/A 10 1500.00 MB/s 183000.00/s 48.00% N/A N/A N/A 0 0 0 +Ethernet4 N/A 4 204.80 KB/s 200.00/s N/A 0 1,000 N/A 40 204.85 KB/s 201.00/s N/A N/A N/A N/A 100 50 50 +Ethernet8 N/A 6 1350.00 KB/s 9000.00/s N/A 100 10 N/A 60 13.37 MB/s 9000.00/s N/A N/A N/A N/A 20,000 10,000 10,000 +Ethernet9 N/A 0 0.00 B/s 0.00/s N/A 0 0 N/A 0 0.00 B/s 0.00/s N/A N/A N/A N/A N/A N/A N/A """ # noqa: E501 intf_fec_counters = """\ @@ -153,45 +152,45 @@ """ multi_asic_external_intf_counters_printall = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM ---------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ------ -Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A 0 -Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A 100 + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM TRIM_TX TRIM_DRP +--------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ------ --------- ---------- +Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A 0 0 0 +Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A 100 50 50 Reminder: Please execute 'show interface counters -d all' to include internal links """ # noqa: E501 multi_asic_intf_counters_printall = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM --------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ------ - Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A 0 - Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A 100 - Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A - Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A -Ethernet-BP256 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A -Ethernet-BP260 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM TRIM_TX TRIM_DRP +-------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ------ --------- ---------- + Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A 0 0 0 + Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A 100 50 50 + Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A N/A + Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A N/A +Ethernet-BP256 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A N/A +Ethernet-BP260 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A N/A Reminder: Please execute 'show interface counters -d all' to include internal links """ # noqa: E501 multi_asic_intf_counters_asic0_printall = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM ------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ------ - Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A 0 - Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A 100 -Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A -Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM TRIM_TX TRIM_DRP +------------ ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ------ --------- ---------- + Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A 0 0 0 + Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A 100 50 50 +Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A N/A +Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A N/A Reminder: Please execute 'show interface counters -d all' to include internal links """ # noqa: E501 multi_asic_intf_counters_bp0 = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM ------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ------ -Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR TRIM TRIM_TX TRIM_DRP +------------ ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ------ --------- ---------- +Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A N/A Reminder: Please execute 'show interface counters -d all' to include internal links @@ -294,7 +293,10 @@ WRED Red Dropped Packets....................... 51 WRED Total Dropped Packets..................... 101 -Packets Trimmed................................ 100 +Trimmed Packets................................ 100 +Trimmed Sent Packets........................... 50 +Trimmed Dropped Packets........................ 50 + Time Since Counters Last Cleared............... None """ diff --git a/tests/queuestat_input/assert_show_output.py b/tests/queuestat_input/assert_show_output.py index 2a446591be..aff334e2f6 100644 --- a/tests/queuestat_input/assert_show_output.py +++ b/tests/queuestat_input/assert_show_output.py @@ -4,108 +4,108 @@ counters_all = """\ For namespace : - Port TxQ Counter/pkts Counter/bytes Drop/pkts Drop/bytes Trim/pkts ---------- ----- -------------- --------------- ----------- ------------ ----------- -Ethernet0 UC0 0 0 0 0 0 -Ethernet0 UC1 60 43 39 1 100 -Ethernet0 UC2 82 7 39 21 N/A -Ethernet0 UC3 52 70 19 76 N/A -Ethernet0 UC4 11 59 12 94 N/A -Ethernet0 UC5 36 62 35 40 N/A -Ethernet0 UC6 49 91 2 88 N/A -Ethernet0 UC7 33 17 94 74 N/A -Ethernet0 UC8 40 71 95 33 N/A -Ethernet0 UC9 54 8 93 78 N/A -Ethernet0 MC10 83 96 74 9 N/A -Ethernet0 MC11 15 60 61 31 N/A -Ethernet0 MC12 45 52 82 94 N/A -Ethernet0 MC13 55 88 89 52 N/A -Ethernet0 MC14 14 70 95 79 N/A -Ethernet0 MC15 68 60 66 81 N/A -Ethernet0 MC16 63 4 48 76 N/A -Ethernet0 MC17 41 73 77 74 N/A -Ethernet0 MC18 60 21 56 54 N/A -Ethernet0 MC19 57 31 12 39 N/A -Ethernet0 ALL20 N/A N/A N/A N/A N/A -Ethernet0 ALL21 N/A N/A N/A N/A N/A -Ethernet0 ALL22 N/A N/A N/A N/A N/A -Ethernet0 ALL23 N/A N/A N/A N/A N/A -Ethernet0 ALL24 N/A N/A N/A N/A N/A -Ethernet0 ALL25 N/A N/A N/A N/A N/A -Ethernet0 ALL26 N/A N/A N/A N/A N/A -Ethernet0 ALL27 N/A N/A N/A N/A N/A -Ethernet0 ALL28 N/A N/A N/A N/A N/A -Ethernet0 ALL29 N/A N/A N/A N/A N/A + Port TxQ Counter/pkts Counter/bytes Drop/pkts Drop/bytes Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- -------------- --------------- ----------- ------------ ----------- --------------- --------------- +Ethernet0 UC0 0 0 0 0 0 0 0 +Ethernet0 UC1 60 43 39 1 100 50 50 +Ethernet0 UC2 82 7 39 21 N/A N/A N/A +Ethernet0 UC3 52 70 19 76 N/A N/A N/A +Ethernet0 UC4 11 59 12 94 N/A N/A N/A +Ethernet0 UC5 36 62 35 40 N/A N/A N/A +Ethernet0 UC6 49 91 2 88 N/A N/A N/A +Ethernet0 UC7 33 17 94 74 N/A N/A N/A +Ethernet0 UC8 40 71 95 33 N/A N/A N/A +Ethernet0 UC9 54 8 93 78 N/A N/A N/A +Ethernet0 MC10 83 96 74 9 N/A N/A N/A +Ethernet0 MC11 15 60 61 31 N/A N/A N/A +Ethernet0 MC12 45 52 82 94 N/A N/A N/A +Ethernet0 MC13 55 88 89 52 N/A N/A N/A +Ethernet0 MC14 14 70 95 79 N/A N/A N/A +Ethernet0 MC15 68 60 66 81 N/A N/A N/A +Ethernet0 MC16 63 4 48 76 N/A N/A N/A +Ethernet0 MC17 41 73 77 74 N/A N/A N/A +Ethernet0 MC18 60 21 56 54 N/A N/A N/A +Ethernet0 MC19 57 31 12 39 N/A N/A N/A +Ethernet0 ALL20 N/A N/A N/A N/A N/A N/A N/A +Ethernet0 ALL21 N/A N/A N/A N/A N/A N/A N/A +Ethernet0 ALL22 N/A N/A N/A N/A N/A N/A N/A +Ethernet0 ALL23 N/A N/A N/A N/A N/A N/A N/A +Ethernet0 ALL24 N/A N/A N/A N/A N/A N/A N/A +Ethernet0 ALL25 N/A N/A N/A N/A N/A N/A N/A +Ethernet0 ALL26 N/A N/A N/A N/A N/A N/A N/A +Ethernet0 ALL27 N/A N/A N/A N/A N/A N/A N/A +Ethernet0 ALL28 N/A N/A N/A N/A N/A N/A N/A +Ethernet0 ALL29 N/A N/A N/A N/A N/A N/A N/A For namespace : - Port TxQ Counter/pkts Counter/bytes Drop/pkts Drop/bytes Trim/pkts ---------- ----- -------------- --------------- ----------- ------------ ----------- -Ethernet4 UC0 41 96 70 98 0 -Ethernet4 UC1 18 49 63 36 100 -Ethernet4 UC2 99 90 3 15 N/A -Ethernet4 UC3 60 89 48 41 N/A -Ethernet4 UC4 8 84 82 94 N/A -Ethernet4 UC5 83 15 75 92 N/A -Ethernet4 UC6 84 26 50 71 N/A -Ethernet4 UC7 27 19 49 80 N/A -Ethernet4 UC8 13 89 13 33 N/A -Ethernet4 UC9 43 48 86 31 N/A -Ethernet4 MC10 50 1 57 82 N/A -Ethernet4 MC11 67 99 84 59 N/A -Ethernet4 MC12 4 58 27 5 N/A -Ethernet4 MC13 74 5 57 39 N/A -Ethernet4 MC14 21 59 4 14 N/A -Ethernet4 MC15 24 61 19 53 N/A -Ethernet4 MC16 51 15 15 32 N/A -Ethernet4 MC17 98 18 23 15 N/A -Ethernet4 MC18 41 34 9 57 N/A -Ethernet4 MC19 57 7 18 99 N/A -Ethernet4 ALL20 N/A N/A N/A N/A N/A -Ethernet4 ALL21 N/A N/A N/A N/A N/A -Ethernet4 ALL22 N/A N/A N/A N/A N/A -Ethernet4 ALL23 N/A N/A N/A N/A N/A -Ethernet4 ALL24 N/A N/A N/A N/A N/A -Ethernet4 ALL25 N/A N/A N/A N/A N/A -Ethernet4 ALL26 N/A N/A N/A N/A N/A -Ethernet4 ALL27 N/A N/A N/A N/A N/A -Ethernet4 ALL28 N/A N/A N/A N/A N/A -Ethernet4 ALL29 N/A N/A N/A N/A N/A + Port TxQ Counter/pkts Counter/bytes Drop/pkts Drop/bytes Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- -------------- --------------- ----------- ------------ ----------- --------------- --------------- +Ethernet4 UC0 41 96 70 98 0 0 0 +Ethernet4 UC1 18 49 63 36 100 50 50 +Ethernet4 UC2 99 90 3 15 N/A N/A N/A +Ethernet4 UC3 60 89 48 41 N/A N/A N/A +Ethernet4 UC4 8 84 82 94 N/A N/A N/A +Ethernet4 UC5 83 15 75 92 N/A N/A N/A +Ethernet4 UC6 84 26 50 71 N/A N/A N/A +Ethernet4 UC7 27 19 49 80 N/A N/A N/A +Ethernet4 UC8 13 89 13 33 N/A N/A N/A +Ethernet4 UC9 43 48 86 31 N/A N/A N/A +Ethernet4 MC10 50 1 57 82 N/A N/A N/A +Ethernet4 MC11 67 99 84 59 N/A N/A N/A +Ethernet4 MC12 4 58 27 5 N/A N/A N/A +Ethernet4 MC13 74 5 57 39 N/A N/A N/A +Ethernet4 MC14 21 59 4 14 N/A N/A N/A +Ethernet4 MC15 24 61 19 53 N/A N/A N/A +Ethernet4 MC16 51 15 15 32 N/A N/A N/A +Ethernet4 MC17 98 18 23 15 N/A N/A N/A +Ethernet4 MC18 41 34 9 57 N/A N/A N/A +Ethernet4 MC19 57 7 18 99 N/A N/A N/A +Ethernet4 ALL20 N/A N/A N/A N/A N/A N/A N/A +Ethernet4 ALL21 N/A N/A N/A N/A N/A N/A N/A +Ethernet4 ALL22 N/A N/A N/A N/A N/A N/A N/A +Ethernet4 ALL23 N/A N/A N/A N/A N/A N/A N/A +Ethernet4 ALL24 N/A N/A N/A N/A N/A N/A N/A +Ethernet4 ALL25 N/A N/A N/A N/A N/A N/A N/A +Ethernet4 ALL26 N/A N/A N/A N/A N/A N/A N/A +Ethernet4 ALL27 N/A N/A N/A N/A N/A N/A N/A +Ethernet4 ALL28 N/A N/A N/A N/A N/A N/A N/A +Ethernet4 ALL29 N/A N/A N/A N/A N/A N/A N/A For namespace : - Port TxQ Counter/pkts Counter/bytes Drop/pkts Drop/bytes Trim/pkts ---------- ----- -------------- --------------- ----------- ------------ ----------- -Ethernet8 UC0 0 0 0 0 0 -Ethernet8 UC1 38 17 68 91 100 -Ethernet8 UC2 16 65 79 51 N/A -Ethernet8 UC3 11 97 63 72 N/A -Ethernet8 UC4 54 89 62 62 N/A -Ethernet8 UC5 13 84 30 59 N/A -Ethernet8 UC6 49 67 99 85 N/A -Ethernet8 UC7 2 63 38 88 N/A -Ethernet8 UC8 0 82 93 43 N/A -Ethernet8 UC9 80 17 91 61 N/A -Ethernet8 MC10 81 63 76 73 N/A -Ethernet8 MC11 29 16 29 66 N/A -Ethernet8 MC12 32 12 61 35 N/A -Ethernet8 MC13 79 17 72 93 N/A -Ethernet8 MC14 23 21 67 50 N/A -Ethernet8 MC15 37 10 97 14 N/A -Ethernet8 MC16 30 17 74 43 N/A -Ethernet8 MC17 0 63 54 84 N/A -Ethernet8 MC18 69 88 24 79 N/A -Ethernet8 MC19 20 12 84 3 N/A -Ethernet8 ALL20 N/A N/A N/A N/A N/A -Ethernet8 ALL21 N/A N/A N/A N/A N/A -Ethernet8 ALL22 N/A N/A N/A N/A N/A -Ethernet8 ALL23 N/A N/A N/A N/A N/A -Ethernet8 ALL24 N/A N/A N/A N/A N/A -Ethernet8 ALL25 N/A N/A N/A N/A N/A -Ethernet8 ALL26 N/A N/A N/A N/A N/A -Ethernet8 ALL27 N/A N/A N/A N/A N/A -Ethernet8 ALL28 N/A N/A N/A N/A N/A -Ethernet8 ALL29 N/A N/A N/A N/A N/A + Port TxQ Counter/pkts Counter/bytes Drop/pkts Drop/bytes Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- -------------- --------------- ----------- ------------ ----------- --------------- --------------- +Ethernet8 UC0 0 0 0 0 0 0 0 +Ethernet8 UC1 38 17 68 91 100 50 50 +Ethernet8 UC2 16 65 79 51 N/A N/A N/A +Ethernet8 UC3 11 97 63 72 N/A N/A N/A +Ethernet8 UC4 54 89 62 62 N/A N/A N/A +Ethernet8 UC5 13 84 30 59 N/A N/A N/A +Ethernet8 UC6 49 67 99 85 N/A N/A N/A +Ethernet8 UC7 2 63 38 88 N/A N/A N/A +Ethernet8 UC8 0 82 93 43 N/A N/A N/A +Ethernet8 UC9 80 17 91 61 N/A N/A N/A +Ethernet8 MC10 81 63 76 73 N/A N/A N/A +Ethernet8 MC11 29 16 29 66 N/A N/A N/A +Ethernet8 MC12 32 12 61 35 N/A N/A N/A +Ethernet8 MC13 79 17 72 93 N/A N/A N/A +Ethernet8 MC14 23 21 67 50 N/A N/A N/A +Ethernet8 MC15 37 10 97 14 N/A N/A N/A +Ethernet8 MC16 30 17 74 43 N/A N/A N/A +Ethernet8 MC17 0 63 54 84 N/A N/A N/A +Ethernet8 MC18 69 88 24 79 N/A N/A N/A +Ethernet8 MC19 20 12 84 3 N/A N/A N/A +Ethernet8 ALL20 N/A N/A N/A N/A N/A N/A N/A +Ethernet8 ALL21 N/A N/A N/A N/A N/A N/A N/A +Ethernet8 ALL22 N/A N/A N/A N/A N/A N/A N/A +Ethernet8 ALL23 N/A N/A N/A N/A N/A N/A N/A +Ethernet8 ALL24 N/A N/A N/A N/A N/A N/A N/A +Ethernet8 ALL25 N/A N/A N/A N/A N/A N/A N/A +Ethernet8 ALL26 N/A N/A N/A N/A N/A N/A N/A +Ethernet8 ALL27 N/A N/A N/A N/A N/A N/A N/A +Ethernet8 ALL28 N/A N/A N/A N/A N/A N/A N/A +Ethernet8 ALL29 N/A N/A N/A N/A N/A N/A N/A -""" +""" # noqa: E501 counters_all_json = """\ { "Ethernet0": { @@ -114,210 +114,270 @@ "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL21": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL22": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL23": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL24": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL25": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL26": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL27": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL28": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL29": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC10": { "dropbytes": "9", "droppacket": "74", "totalbytes": "96", "totalpacket": "83", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC11": { "dropbytes": "31", "droppacket": "61", "totalbytes": "60", "totalpacket": "15", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC12": { "dropbytes": "94", "droppacket": "82", "totalbytes": "52", "totalpacket": "45", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC13": { "dropbytes": "52", "droppacket": "89", "totalbytes": "88", "totalpacket": "55", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC14": { "dropbytes": "79", "droppacket": "95", "totalbytes": "70", "totalpacket": "14", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC15": { "dropbytes": "81", "droppacket": "66", "totalbytes": "60", "totalpacket": "68", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC16": { "dropbytes": "76", "droppacket": "48", "totalbytes": "4", "totalpacket": "63", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC17": { "dropbytes": "74", "droppacket": "77", "totalbytes": "73", "totalpacket": "41", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC18": { "dropbytes": "54", "droppacket": "56", "totalbytes": "21", "totalpacket": "60", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC19": { "dropbytes": "39", "droppacket": "12", "totalbytes": "31", "totalpacket": "57", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC0": { "dropbytes": "0", "droppacket": "0", "totalbytes": "0", "totalpacket": "0", - "trimpacket": "0" + "trimdroppacket": "0", + "trimpacket": "0", + "trimsentpacket": "0" }, "UC1": { "dropbytes": "1", "droppacket": "39", "totalbytes": "43", "totalpacket": "60", - "trimpacket": "100" + "trimdroppacket": "50", + "trimpacket": "100", + "trimsentpacket": "50" }, "UC2": { "dropbytes": "21", "droppacket": "39", "totalbytes": "7", "totalpacket": "82", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC3": { "dropbytes": "76", "droppacket": "19", "totalbytes": "70", "totalpacket": "52", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC4": { "dropbytes": "94", "droppacket": "12", "totalbytes": "59", "totalpacket": "11", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC5": { "dropbytes": "40", "droppacket": "35", "totalbytes": "62", "totalpacket": "36", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC6": { "dropbytes": "88", "droppacket": "2", "totalbytes": "91", "totalpacket": "49", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC7": { "dropbytes": "74", "droppacket": "94", "totalbytes": "17", "totalpacket": "33", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC8": { "dropbytes": "33", "droppacket": "95", "totalbytes": "71", "totalpacket": "40", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC9": { "dropbytes": "78", "droppacket": "93", "totalbytes": "8", "totalpacket": "54", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" } }, "Ethernet4": { @@ -326,210 +386,270 @@ "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL21": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL22": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL23": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL24": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL25": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL26": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL27": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL28": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL29": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC10": { "dropbytes": "82", "droppacket": "57", "totalbytes": "1", "totalpacket": "50", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC11": { "dropbytes": "59", "droppacket": "84", "totalbytes": "99", "totalpacket": "67", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC12": { "dropbytes": "5", "droppacket": "27", "totalbytes": "58", "totalpacket": "4", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC13": { "dropbytes": "39", "droppacket": "57", "totalbytes": "5", "totalpacket": "74", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC14": { "dropbytes": "14", "droppacket": "4", "totalbytes": "59", "totalpacket": "21", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC15": { "dropbytes": "53", "droppacket": "19", "totalbytes": "61", "totalpacket": "24", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC16": { "dropbytes": "32", "droppacket": "15", "totalbytes": "15", "totalpacket": "51", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC17": { "dropbytes": "15", "droppacket": "23", "totalbytes": "18", "totalpacket": "98", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC18": { "dropbytes": "57", "droppacket": "9", "totalbytes": "34", "totalpacket": "41", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC19": { "dropbytes": "99", "droppacket": "18", "totalbytes": "7", "totalpacket": "57", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC0": { "dropbytes": "98", "droppacket": "70", "totalbytes": "96", "totalpacket": "41", - "trimpacket": "0" + "trimdroppacket": "0", + "trimpacket": "0", + "trimsentpacket": "0" }, "UC1": { "dropbytes": "36", "droppacket": "63", "totalbytes": "49", "totalpacket": "18", - "trimpacket": "100" + "trimdroppacket": "50", + "trimpacket": "100", + "trimsentpacket": "50" }, "UC2": { "dropbytes": "15", "droppacket": "3", "totalbytes": "90", "totalpacket": "99", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC3": { "dropbytes": "41", "droppacket": "48", "totalbytes": "89", "totalpacket": "60", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC4": { "dropbytes": "94", "droppacket": "82", "totalbytes": "84", "totalpacket": "8", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC5": { "dropbytes": "92", "droppacket": "75", "totalbytes": "15", "totalpacket": "83", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC6": { "dropbytes": "71", "droppacket": "50", "totalbytes": "26", "totalpacket": "84", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC7": { "dropbytes": "80", "droppacket": "49", "totalbytes": "19", "totalpacket": "27", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC8": { "dropbytes": "33", "droppacket": "13", "totalbytes": "89", "totalpacket": "13", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC9": { "dropbytes": "31", "droppacket": "86", "totalbytes": "48", "totalpacket": "43", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" } }, "Ethernet8": { @@ -538,210 +658,270 @@ "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL21": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL22": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL23": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL24": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL25": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL26": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL27": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL28": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL29": { "dropbytes": "N/A", "droppacket": "N/A", "totalbytes": "N/A", "totalpacket": "N/A", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC10": { "dropbytes": "73", "droppacket": "76", "totalbytes": "63", "totalpacket": "81", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC11": { "dropbytes": "66", "droppacket": "29", "totalbytes": "16", "totalpacket": "29", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC12": { "dropbytes": "35", "droppacket": "61", "totalbytes": "12", "totalpacket": "32", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC13": { "dropbytes": "93", "droppacket": "72", "totalbytes": "17", "totalpacket": "79", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC14": { "dropbytes": "50", "droppacket": "67", "totalbytes": "21", "totalpacket": "23", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC15": { "dropbytes": "14", "droppacket": "97", "totalbytes": "10", "totalpacket": "37", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC16": { "dropbytes": "43", "droppacket": "74", "totalbytes": "17", "totalpacket": "30", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC17": { "dropbytes": "84", "droppacket": "54", "totalbytes": "63", "totalpacket": "0", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC18": { "dropbytes": "79", "droppacket": "24", "totalbytes": "88", "totalpacket": "69", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC19": { "dropbytes": "3", "droppacket": "84", "totalbytes": "12", "totalpacket": "20", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC0": { "dropbytes": "0", "droppacket": "0", "totalbytes": "0", "totalpacket": "0", - "trimpacket": "0" + "trimdroppacket": "0", + "trimpacket": "0", + "trimsentpacket": "0" }, "UC1": { "dropbytes": "91", "droppacket": "68", "totalbytes": "17", "totalpacket": "38", - "trimpacket": "100" + "trimdroppacket": "50", + "trimpacket": "100", + "trimsentpacket": "50" }, "UC2": { "dropbytes": "51", "droppacket": "79", "totalbytes": "65", "totalpacket": "16", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC3": { "dropbytes": "72", "droppacket": "63", "totalbytes": "97", "totalpacket": "11", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC4": { "dropbytes": "62", "droppacket": "62", "totalbytes": "89", "totalpacket": "54", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC5": { "dropbytes": "59", "droppacket": "30", "totalbytes": "84", "totalpacket": "13", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC6": { "dropbytes": "85", "droppacket": "99", "totalbytes": "67", "totalpacket": "49", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC7": { "dropbytes": "88", "droppacket": "38", "totalbytes": "63", "totalpacket": "2", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC8": { "dropbytes": "43", "droppacket": "93", "totalbytes": "82", "totalpacket": "0", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC9": { "dropbytes": "61", "droppacket": "91", "totalbytes": "17", "totalpacket": "80", - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" } } } @@ -749,384 +929,564 @@ trim_counters_all = """\ For namespace : - Port TxQ Trim/pkts ---------- ----- ----------- -Ethernet0 UC0 0 -Ethernet0 UC1 100 -Ethernet0 UC2 N/A -Ethernet0 UC3 N/A -Ethernet0 UC4 N/A -Ethernet0 UC5 N/A -Ethernet0 UC6 N/A -Ethernet0 UC7 N/A -Ethernet0 UC8 N/A -Ethernet0 UC9 N/A -Ethernet0 MC10 N/A -Ethernet0 MC11 N/A -Ethernet0 MC12 N/A -Ethernet0 MC13 N/A -Ethernet0 MC14 N/A -Ethernet0 MC15 N/A -Ethernet0 MC16 N/A -Ethernet0 MC17 N/A -Ethernet0 MC18 N/A -Ethernet0 MC19 N/A -Ethernet0 ALL20 N/A -Ethernet0 ALL21 N/A -Ethernet0 ALL22 N/A -Ethernet0 ALL23 N/A -Ethernet0 ALL24 N/A -Ethernet0 ALL25 N/A -Ethernet0 ALL26 N/A -Ethernet0 ALL27 N/A -Ethernet0 ALL28 N/A -Ethernet0 ALL29 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- ----------- --------------- --------------- +Ethernet0 UC0 0 0 0 +Ethernet0 UC1 100 50 50 +Ethernet0 UC2 N/A N/A N/A +Ethernet0 UC3 N/A N/A N/A +Ethernet0 UC4 N/A N/A N/A +Ethernet0 UC5 N/A N/A N/A +Ethernet0 UC6 N/A N/A N/A +Ethernet0 UC7 N/A N/A N/A +Ethernet0 UC8 N/A N/A N/A +Ethernet0 UC9 N/A N/A N/A +Ethernet0 MC10 N/A N/A N/A +Ethernet0 MC11 N/A N/A N/A +Ethernet0 MC12 N/A N/A N/A +Ethernet0 MC13 N/A N/A N/A +Ethernet0 MC14 N/A N/A N/A +Ethernet0 MC15 N/A N/A N/A +Ethernet0 MC16 N/A N/A N/A +Ethernet0 MC17 N/A N/A N/A +Ethernet0 MC18 N/A N/A N/A +Ethernet0 MC19 N/A N/A N/A +Ethernet0 ALL20 N/A N/A N/A +Ethernet0 ALL21 N/A N/A N/A +Ethernet0 ALL22 N/A N/A N/A +Ethernet0 ALL23 N/A N/A N/A +Ethernet0 ALL24 N/A N/A N/A +Ethernet0 ALL25 N/A N/A N/A +Ethernet0 ALL26 N/A N/A N/A +Ethernet0 ALL27 N/A N/A N/A +Ethernet0 ALL28 N/A N/A N/A +Ethernet0 ALL29 N/A N/A N/A For namespace : - Port TxQ Trim/pkts ---------- ----- ----------- -Ethernet4 UC0 0 -Ethernet4 UC1 100 -Ethernet4 UC2 N/A -Ethernet4 UC3 N/A -Ethernet4 UC4 N/A -Ethernet4 UC5 N/A -Ethernet4 UC6 N/A -Ethernet4 UC7 N/A -Ethernet4 UC8 N/A -Ethernet4 UC9 N/A -Ethernet4 MC10 N/A -Ethernet4 MC11 N/A -Ethernet4 MC12 N/A -Ethernet4 MC13 N/A -Ethernet4 MC14 N/A -Ethernet4 MC15 N/A -Ethernet4 MC16 N/A -Ethernet4 MC17 N/A -Ethernet4 MC18 N/A -Ethernet4 MC19 N/A -Ethernet4 ALL20 N/A -Ethernet4 ALL21 N/A -Ethernet4 ALL22 N/A -Ethernet4 ALL23 N/A -Ethernet4 ALL24 N/A -Ethernet4 ALL25 N/A -Ethernet4 ALL26 N/A -Ethernet4 ALL27 N/A -Ethernet4 ALL28 N/A -Ethernet4 ALL29 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- ----------- --------------- --------------- +Ethernet4 UC0 0 0 0 +Ethernet4 UC1 100 50 50 +Ethernet4 UC2 N/A N/A N/A +Ethernet4 UC3 N/A N/A N/A +Ethernet4 UC4 N/A N/A N/A +Ethernet4 UC5 N/A N/A N/A +Ethernet4 UC6 N/A N/A N/A +Ethernet4 UC7 N/A N/A N/A +Ethernet4 UC8 N/A N/A N/A +Ethernet4 UC9 N/A N/A N/A +Ethernet4 MC10 N/A N/A N/A +Ethernet4 MC11 N/A N/A N/A +Ethernet4 MC12 N/A N/A N/A +Ethernet4 MC13 N/A N/A N/A +Ethernet4 MC14 N/A N/A N/A +Ethernet4 MC15 N/A N/A N/A +Ethernet4 MC16 N/A N/A N/A +Ethernet4 MC17 N/A N/A N/A +Ethernet4 MC18 N/A N/A N/A +Ethernet4 MC19 N/A N/A N/A +Ethernet4 ALL20 N/A N/A N/A +Ethernet4 ALL21 N/A N/A N/A +Ethernet4 ALL22 N/A N/A N/A +Ethernet4 ALL23 N/A N/A N/A +Ethernet4 ALL24 N/A N/A N/A +Ethernet4 ALL25 N/A N/A N/A +Ethernet4 ALL26 N/A N/A N/A +Ethernet4 ALL27 N/A N/A N/A +Ethernet4 ALL28 N/A N/A N/A +Ethernet4 ALL29 N/A N/A N/A For namespace : - Port TxQ Trim/pkts ---------- ----- ----------- -Ethernet8 UC0 0 -Ethernet8 UC1 100 -Ethernet8 UC2 N/A -Ethernet8 UC3 N/A -Ethernet8 UC4 N/A -Ethernet8 UC5 N/A -Ethernet8 UC6 N/A -Ethernet8 UC7 N/A -Ethernet8 UC8 N/A -Ethernet8 UC9 N/A -Ethernet8 MC10 N/A -Ethernet8 MC11 N/A -Ethernet8 MC12 N/A -Ethernet8 MC13 N/A -Ethernet8 MC14 N/A -Ethernet8 MC15 N/A -Ethernet8 MC16 N/A -Ethernet8 MC17 N/A -Ethernet8 MC18 N/A -Ethernet8 MC19 N/A -Ethernet8 ALL20 N/A -Ethernet8 ALL21 N/A -Ethernet8 ALL22 N/A -Ethernet8 ALL23 N/A -Ethernet8 ALL24 N/A -Ethernet8 ALL25 N/A -Ethernet8 ALL26 N/A -Ethernet8 ALL27 N/A -Ethernet8 ALL28 N/A -Ethernet8 ALL29 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- ----------- --------------- --------------- +Ethernet8 UC0 0 0 0 +Ethernet8 UC1 100 50 50 +Ethernet8 UC2 N/A N/A N/A +Ethernet8 UC3 N/A N/A N/A +Ethernet8 UC4 N/A N/A N/A +Ethernet8 UC5 N/A N/A N/A +Ethernet8 UC6 N/A N/A N/A +Ethernet8 UC7 N/A N/A N/A +Ethernet8 UC8 N/A N/A N/A +Ethernet8 UC9 N/A N/A N/A +Ethernet8 MC10 N/A N/A N/A +Ethernet8 MC11 N/A N/A N/A +Ethernet8 MC12 N/A N/A N/A +Ethernet8 MC13 N/A N/A N/A +Ethernet8 MC14 N/A N/A N/A +Ethernet8 MC15 N/A N/A N/A +Ethernet8 MC16 N/A N/A N/A +Ethernet8 MC17 N/A N/A N/A +Ethernet8 MC18 N/A N/A N/A +Ethernet8 MC19 N/A N/A N/A +Ethernet8 ALL20 N/A N/A N/A +Ethernet8 ALL21 N/A N/A N/A +Ethernet8 ALL22 N/A N/A N/A +Ethernet8 ALL23 N/A N/A N/A +Ethernet8 ALL24 N/A N/A N/A +Ethernet8 ALL25 N/A N/A N/A +Ethernet8 ALL26 N/A N/A N/A +Ethernet8 ALL27 N/A N/A N/A +Ethernet8 ALL28 N/A N/A N/A +Ethernet8 ALL29 N/A N/A N/A """ trim_counters_all_json = """\ { "Ethernet0": { "ALL20": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL21": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL22": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL23": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL24": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL25": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL26": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL27": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL28": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL29": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC10": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC11": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC12": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC13": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC14": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC15": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC16": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC17": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC18": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC19": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC0": { - "trimpacket": "0" + "trimdroppacket": "0", + "trimpacket": "0", + "trimsentpacket": "0" }, "UC1": { - "trimpacket": "100" + "trimdroppacket": "50", + "trimpacket": "100", + "trimsentpacket": "50" }, "UC2": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC3": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC4": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC5": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC6": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC7": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC8": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC9": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" } }, "Ethernet4": { "ALL20": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL21": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL22": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL23": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL24": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL25": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL26": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL27": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL28": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL29": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC10": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC11": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC12": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC13": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC14": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC15": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC16": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC17": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC18": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC19": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC0": { - "trimpacket": "0" + "trimdroppacket": "0", + "trimpacket": "0", + "trimsentpacket": "0" }, "UC1": { - "trimpacket": "100" + "trimdroppacket": "50", + "trimpacket": "100", + "trimsentpacket": "50" }, "UC2": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC3": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC4": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC5": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC6": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC7": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC8": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC9": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" } }, "Ethernet8": { "ALL20": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL21": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL22": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL23": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL24": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL25": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL26": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL27": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL28": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL29": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC10": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC11": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC12": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC13": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC14": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC15": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC16": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC17": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC18": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC19": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC0": { - "trimpacket": "0" + "trimdroppacket": "0", + "trimpacket": "0", + "trimsentpacket": "0" }, "UC1": { - "trimpacket": "100" + "trimdroppacket": "50", + "trimpacket": "100", + "trimsentpacket": "50" }, "UC2": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC3": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC4": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC5": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC6": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC7": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC8": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC9": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" } } } @@ -1134,132 +1494,192 @@ trim_eth0_counters = """\ For namespace : - Port TxQ Trim/pkts ---------- ----- ----------- -Ethernet0 UC0 0 -Ethernet0 UC1 100 -Ethernet0 UC2 N/A -Ethernet0 UC3 N/A -Ethernet0 UC4 N/A -Ethernet0 UC5 N/A -Ethernet0 UC6 N/A -Ethernet0 UC7 N/A -Ethernet0 UC8 N/A -Ethernet0 UC9 N/A -Ethernet0 MC10 N/A -Ethernet0 MC11 N/A -Ethernet0 MC12 N/A -Ethernet0 MC13 N/A -Ethernet0 MC14 N/A -Ethernet0 MC15 N/A -Ethernet0 MC16 N/A -Ethernet0 MC17 N/A -Ethernet0 MC18 N/A -Ethernet0 MC19 N/A -Ethernet0 ALL20 N/A -Ethernet0 ALL21 N/A -Ethernet0 ALL22 N/A -Ethernet0 ALL23 N/A -Ethernet0 ALL24 N/A -Ethernet0 ALL25 N/A -Ethernet0 ALL26 N/A -Ethernet0 ALL27 N/A -Ethernet0 ALL28 N/A -Ethernet0 ALL29 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- ----------- --------------- --------------- +Ethernet0 UC0 0 0 0 +Ethernet0 UC1 100 50 50 +Ethernet0 UC2 N/A N/A N/A +Ethernet0 UC3 N/A N/A N/A +Ethernet0 UC4 N/A N/A N/A +Ethernet0 UC5 N/A N/A N/A +Ethernet0 UC6 N/A N/A N/A +Ethernet0 UC7 N/A N/A N/A +Ethernet0 UC8 N/A N/A N/A +Ethernet0 UC9 N/A N/A N/A +Ethernet0 MC10 N/A N/A N/A +Ethernet0 MC11 N/A N/A N/A +Ethernet0 MC12 N/A N/A N/A +Ethernet0 MC13 N/A N/A N/A +Ethernet0 MC14 N/A N/A N/A +Ethernet0 MC15 N/A N/A N/A +Ethernet0 MC16 N/A N/A N/A +Ethernet0 MC17 N/A N/A N/A +Ethernet0 MC18 N/A N/A N/A +Ethernet0 MC19 N/A N/A N/A +Ethernet0 ALL20 N/A N/A N/A +Ethernet0 ALL21 N/A N/A N/A +Ethernet0 ALL22 N/A N/A N/A +Ethernet0 ALL23 N/A N/A N/A +Ethernet0 ALL24 N/A N/A N/A +Ethernet0 ALL25 N/A N/A N/A +Ethernet0 ALL26 N/A N/A N/A +Ethernet0 ALL27 N/A N/A N/A +Ethernet0 ALL28 N/A N/A N/A +Ethernet0 ALL29 N/A N/A N/A """ trim_eth0_counters_json = """\ { "Ethernet0": { "ALL20": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL21": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL22": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL23": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL24": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL25": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL26": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL27": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL28": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL29": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC10": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC11": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC12": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC13": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC14": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC15": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC16": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC17": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC18": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC19": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC0": { - "trimpacket": "0" + "trimdroppacket": "0", + "trimpacket": "0", + "trimsentpacket": "0" }, "UC1": { - "trimpacket": "100" + "trimdroppacket": "50", + "trimpacket": "100", + "trimsentpacket": "50" }, "UC2": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC3": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC4": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC5": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC6": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC7": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC8": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC9": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" } } } @@ -1267,132 +1687,192 @@ trim_eth4_counters = """\ For namespace : - Port TxQ Trim/pkts ---------- ----- ----------- -Ethernet4 UC0 0 -Ethernet4 UC1 100 -Ethernet4 UC2 N/A -Ethernet4 UC3 N/A -Ethernet4 UC4 N/A -Ethernet4 UC5 N/A -Ethernet4 UC6 N/A -Ethernet4 UC7 N/A -Ethernet4 UC8 N/A -Ethernet4 UC9 N/A -Ethernet4 MC10 N/A -Ethernet4 MC11 N/A -Ethernet4 MC12 N/A -Ethernet4 MC13 N/A -Ethernet4 MC14 N/A -Ethernet4 MC15 N/A -Ethernet4 MC16 N/A -Ethernet4 MC17 N/A -Ethernet4 MC18 N/A -Ethernet4 MC19 N/A -Ethernet4 ALL20 N/A -Ethernet4 ALL21 N/A -Ethernet4 ALL22 N/A -Ethernet4 ALL23 N/A -Ethernet4 ALL24 N/A -Ethernet4 ALL25 N/A -Ethernet4 ALL26 N/A -Ethernet4 ALL27 N/A -Ethernet4 ALL28 N/A -Ethernet4 ALL29 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- ----------- --------------- --------------- +Ethernet4 UC0 0 0 0 +Ethernet4 UC1 100 50 50 +Ethernet4 UC2 N/A N/A N/A +Ethernet4 UC3 N/A N/A N/A +Ethernet4 UC4 N/A N/A N/A +Ethernet4 UC5 N/A N/A N/A +Ethernet4 UC6 N/A N/A N/A +Ethernet4 UC7 N/A N/A N/A +Ethernet4 UC8 N/A N/A N/A +Ethernet4 UC9 N/A N/A N/A +Ethernet4 MC10 N/A N/A N/A +Ethernet4 MC11 N/A N/A N/A +Ethernet4 MC12 N/A N/A N/A +Ethernet4 MC13 N/A N/A N/A +Ethernet4 MC14 N/A N/A N/A +Ethernet4 MC15 N/A N/A N/A +Ethernet4 MC16 N/A N/A N/A +Ethernet4 MC17 N/A N/A N/A +Ethernet4 MC18 N/A N/A N/A +Ethernet4 MC19 N/A N/A N/A +Ethernet4 ALL20 N/A N/A N/A +Ethernet4 ALL21 N/A N/A N/A +Ethernet4 ALL22 N/A N/A N/A +Ethernet4 ALL23 N/A N/A N/A +Ethernet4 ALL24 N/A N/A N/A +Ethernet4 ALL25 N/A N/A N/A +Ethernet4 ALL26 N/A N/A N/A +Ethernet4 ALL27 N/A N/A N/A +Ethernet4 ALL28 N/A N/A N/A +Ethernet4 ALL29 N/A N/A N/A """ trim_eth4_counters_json = """\ { "Ethernet4": { "ALL20": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL21": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL22": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL23": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL24": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL25": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL26": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL27": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL28": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL29": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC10": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC11": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC12": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC13": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC14": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC15": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC16": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC17": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC18": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC19": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC0": { - "trimpacket": "0" + "trimdroppacket": "0", + "trimpacket": "0", + "trimsentpacket": "0" }, "UC1": { - "trimpacket": "100" + "trimdroppacket": "50", + "trimpacket": "100", + "trimsentpacket": "50" }, "UC2": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC3": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC4": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC5": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC6": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC7": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC8": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC9": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" } } } @@ -1400,132 +1880,192 @@ trim_eth8_counters = """\ For namespace : - Port TxQ Trim/pkts ---------- ----- ----------- -Ethernet8 UC0 0 -Ethernet8 UC1 100 -Ethernet8 UC2 N/A -Ethernet8 UC3 N/A -Ethernet8 UC4 N/A -Ethernet8 UC5 N/A -Ethernet8 UC6 N/A -Ethernet8 UC7 N/A -Ethernet8 UC8 N/A -Ethernet8 UC9 N/A -Ethernet8 MC10 N/A -Ethernet8 MC11 N/A -Ethernet8 MC12 N/A -Ethernet8 MC13 N/A -Ethernet8 MC14 N/A -Ethernet8 MC15 N/A -Ethernet8 MC16 N/A -Ethernet8 MC17 N/A -Ethernet8 MC18 N/A -Ethernet8 MC19 N/A -Ethernet8 ALL20 N/A -Ethernet8 ALL21 N/A -Ethernet8 ALL22 N/A -Ethernet8 ALL23 N/A -Ethernet8 ALL24 N/A -Ethernet8 ALL25 N/A -Ethernet8 ALL26 N/A -Ethernet8 ALL27 N/A -Ethernet8 ALL28 N/A -Ethernet8 ALL29 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- ----------- --------------- --------------- +Ethernet8 UC0 0 0 0 +Ethernet8 UC1 100 50 50 +Ethernet8 UC2 N/A N/A N/A +Ethernet8 UC3 N/A N/A N/A +Ethernet8 UC4 N/A N/A N/A +Ethernet8 UC5 N/A N/A N/A +Ethernet8 UC6 N/A N/A N/A +Ethernet8 UC7 N/A N/A N/A +Ethernet8 UC8 N/A N/A N/A +Ethernet8 UC9 N/A N/A N/A +Ethernet8 MC10 N/A N/A N/A +Ethernet8 MC11 N/A N/A N/A +Ethernet8 MC12 N/A N/A N/A +Ethernet8 MC13 N/A N/A N/A +Ethernet8 MC14 N/A N/A N/A +Ethernet8 MC15 N/A N/A N/A +Ethernet8 MC16 N/A N/A N/A +Ethernet8 MC17 N/A N/A N/A +Ethernet8 MC18 N/A N/A N/A +Ethernet8 MC19 N/A N/A N/A +Ethernet8 ALL20 N/A N/A N/A +Ethernet8 ALL21 N/A N/A N/A +Ethernet8 ALL22 N/A N/A N/A +Ethernet8 ALL23 N/A N/A N/A +Ethernet8 ALL24 N/A N/A N/A +Ethernet8 ALL25 N/A N/A N/A +Ethernet8 ALL26 N/A N/A N/A +Ethernet8 ALL27 N/A N/A N/A +Ethernet8 ALL28 N/A N/A N/A +Ethernet8 ALL29 N/A N/A N/A """ trim_eth8_counters_json = """\ { "Ethernet8": { "ALL20": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL21": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL22": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL23": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL24": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL25": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL26": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL27": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL28": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "ALL29": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC10": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC11": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC12": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC13": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC14": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC15": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC16": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC17": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC18": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "MC19": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC0": { - "trimpacket": "0" + "trimdroppacket": "0", + "trimpacket": "0", + "trimsentpacket": "0" }, "UC1": { - "trimpacket": "100" + "trimdroppacket": "50", + "trimpacket": "100", + "trimsentpacket": "50" }, "UC2": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC3": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC4": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC5": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC6": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC7": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC8": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" }, "UC9": { - "trimpacket": "N/A" + "trimdroppacket": "N/A", + "trimpacket": "N/A", + "trimsentpacket": "N/A" } } } @@ -1537,102 +2077,102 @@ Clear and update saved counters for Ethernet8 """ trim_counters_clear_stat = """\ - Port TxQ Trim/pkts ---------- ----- ----------- -Ethernet0 UC0 0 -Ethernet0 UC1 0 -Ethernet0 UC2 N/A -Ethernet0 UC3 N/A -Ethernet0 UC4 N/A -Ethernet0 UC5 N/A -Ethernet0 UC6 N/A -Ethernet0 UC7 N/A -Ethernet0 UC8 N/A -Ethernet0 UC9 N/A -Ethernet0 MC10 N/A -Ethernet0 MC11 N/A -Ethernet0 MC12 N/A -Ethernet0 MC13 N/A -Ethernet0 MC14 N/A -Ethernet0 MC15 N/A -Ethernet0 MC16 N/A -Ethernet0 MC17 N/A -Ethernet0 MC18 N/A -Ethernet0 MC19 N/A -Ethernet0 ALL20 N/A -Ethernet0 ALL21 N/A -Ethernet0 ALL22 N/A -Ethernet0 ALL23 N/A -Ethernet0 ALL24 N/A -Ethernet0 ALL25 N/A -Ethernet0 ALL26 N/A -Ethernet0 ALL27 N/A -Ethernet0 ALL28 N/A -Ethernet0 ALL29 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- ----------- --------------- --------------- +Ethernet0 UC0 0 0 0 +Ethernet0 UC1 0 0 0 +Ethernet0 UC2 N/A N/A N/A +Ethernet0 UC3 N/A N/A N/A +Ethernet0 UC4 N/A N/A N/A +Ethernet0 UC5 N/A N/A N/A +Ethernet0 UC6 N/A N/A N/A +Ethernet0 UC7 N/A N/A N/A +Ethernet0 UC8 N/A N/A N/A +Ethernet0 UC9 N/A N/A N/A +Ethernet0 MC10 N/A N/A N/A +Ethernet0 MC11 N/A N/A N/A +Ethernet0 MC12 N/A N/A N/A +Ethernet0 MC13 N/A N/A N/A +Ethernet0 MC14 N/A N/A N/A +Ethernet0 MC15 N/A N/A N/A +Ethernet0 MC16 N/A N/A N/A +Ethernet0 MC17 N/A N/A N/A +Ethernet0 MC18 N/A N/A N/A +Ethernet0 MC19 N/A N/A N/A +Ethernet0 ALL20 N/A N/A N/A +Ethernet0 ALL21 N/A N/A N/A +Ethernet0 ALL22 N/A N/A N/A +Ethernet0 ALL23 N/A N/A N/A +Ethernet0 ALL24 N/A N/A N/A +Ethernet0 ALL25 N/A N/A N/A +Ethernet0 ALL26 N/A N/A N/A +Ethernet0 ALL27 N/A N/A N/A +Ethernet0 ALL28 N/A N/A N/A +Ethernet0 ALL29 N/A N/A N/A - Port TxQ Trim/pkts ---------- ----- ----------- -Ethernet4 UC0 0 -Ethernet4 UC1 0 -Ethernet4 UC2 N/A -Ethernet4 UC3 N/A -Ethernet4 UC4 N/A -Ethernet4 UC5 N/A -Ethernet4 UC6 N/A -Ethernet4 UC7 N/A -Ethernet4 UC8 N/A -Ethernet4 UC9 N/A -Ethernet4 MC10 N/A -Ethernet4 MC11 N/A -Ethernet4 MC12 N/A -Ethernet4 MC13 N/A -Ethernet4 MC14 N/A -Ethernet4 MC15 N/A -Ethernet4 MC16 N/A -Ethernet4 MC17 N/A -Ethernet4 MC18 N/A -Ethernet4 MC19 N/A -Ethernet4 ALL20 N/A -Ethernet4 ALL21 N/A -Ethernet4 ALL22 N/A -Ethernet4 ALL23 N/A -Ethernet4 ALL24 N/A -Ethernet4 ALL25 N/A -Ethernet4 ALL26 N/A -Ethernet4 ALL27 N/A -Ethernet4 ALL28 N/A -Ethernet4 ALL29 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- ----------- --------------- --------------- +Ethernet4 UC0 0 0 0 +Ethernet4 UC1 0 0 0 +Ethernet4 UC2 N/A N/A N/A +Ethernet4 UC3 N/A N/A N/A +Ethernet4 UC4 N/A N/A N/A +Ethernet4 UC5 N/A N/A N/A +Ethernet4 UC6 N/A N/A N/A +Ethernet4 UC7 N/A N/A N/A +Ethernet4 UC8 N/A N/A N/A +Ethernet4 UC9 N/A N/A N/A +Ethernet4 MC10 N/A N/A N/A +Ethernet4 MC11 N/A N/A N/A +Ethernet4 MC12 N/A N/A N/A +Ethernet4 MC13 N/A N/A N/A +Ethernet4 MC14 N/A N/A N/A +Ethernet4 MC15 N/A N/A N/A +Ethernet4 MC16 N/A N/A N/A +Ethernet4 MC17 N/A N/A N/A +Ethernet4 MC18 N/A N/A N/A +Ethernet4 MC19 N/A N/A N/A +Ethernet4 ALL20 N/A N/A N/A +Ethernet4 ALL21 N/A N/A N/A +Ethernet4 ALL22 N/A N/A N/A +Ethernet4 ALL23 N/A N/A N/A +Ethernet4 ALL24 N/A N/A N/A +Ethernet4 ALL25 N/A N/A N/A +Ethernet4 ALL26 N/A N/A N/A +Ethernet4 ALL27 N/A N/A N/A +Ethernet4 ALL28 N/A N/A N/A +Ethernet4 ALL29 N/A N/A N/A - Port TxQ Trim/pkts ---------- ----- ----------- -Ethernet8 UC0 0 -Ethernet8 UC1 0 -Ethernet8 UC2 N/A -Ethernet8 UC3 N/A -Ethernet8 UC4 N/A -Ethernet8 UC5 N/A -Ethernet8 UC6 N/A -Ethernet8 UC7 N/A -Ethernet8 UC8 N/A -Ethernet8 UC9 N/A -Ethernet8 MC10 N/A -Ethernet8 MC11 N/A -Ethernet8 MC12 N/A -Ethernet8 MC13 N/A -Ethernet8 MC14 N/A -Ethernet8 MC15 N/A -Ethernet8 MC16 N/A -Ethernet8 MC17 N/A -Ethernet8 MC18 N/A -Ethernet8 MC19 N/A -Ethernet8 ALL20 N/A -Ethernet8 ALL21 N/A -Ethernet8 ALL22 N/A -Ethernet8 ALL23 N/A -Ethernet8 ALL24 N/A -Ethernet8 ALL25 N/A -Ethernet8 ALL26 N/A -Ethernet8 ALL27 N/A -Ethernet8 ALL28 N/A -Ethernet8 ALL29 N/A + Port TxQ Trim/pkts TrimSent/pkts TrimDrop/pkts +--------- ----- ----------- --------------- --------------- +Ethernet8 UC0 0 0 0 +Ethernet8 UC1 0 0 0 +Ethernet8 UC2 N/A N/A N/A +Ethernet8 UC3 N/A N/A N/A +Ethernet8 UC4 N/A N/A N/A +Ethernet8 UC5 N/A N/A N/A +Ethernet8 UC6 N/A N/A N/A +Ethernet8 UC7 N/A N/A N/A +Ethernet8 UC8 N/A N/A N/A +Ethernet8 UC9 N/A N/A N/A +Ethernet8 MC10 N/A N/A N/A +Ethernet8 MC11 N/A N/A N/A +Ethernet8 MC12 N/A N/A N/A +Ethernet8 MC13 N/A N/A N/A +Ethernet8 MC14 N/A N/A N/A +Ethernet8 MC15 N/A N/A N/A +Ethernet8 MC16 N/A N/A N/A +Ethernet8 MC17 N/A N/A N/A +Ethernet8 MC18 N/A N/A N/A +Ethernet8 MC19 N/A N/A N/A +Ethernet8 ALL20 N/A N/A N/A +Ethernet8 ALL21 N/A N/A N/A +Ethernet8 ALL22 N/A N/A N/A +Ethernet8 ALL23 N/A N/A N/A +Ethernet8 ALL24 N/A N/A N/A +Ethernet8 ALL25 N/A N/A N/A +Ethernet8 ALL26 N/A N/A N/A +Ethernet8 ALL27 N/A N/A N/A +Ethernet8 ALL28 N/A N/A N/A +Ethernet8 ALL29 N/A N/A N/A """ diff --git a/tests/show_test.py b/tests/show_test.py index b7de66a619..6a9717476a 100644 --- a/tests/show_test.py +++ b/tests/show_test.py @@ -2,6 +2,7 @@ import sys import click import pytest +import logging import importlib import subprocess import show.main as show @@ -28,6 +29,10 @@ NAT Zones """ +logger = logging.getLogger(__name__) + +SUCCESS = 0 + class TestShowRunAllCommands(object): @classmethod @@ -1278,3 +1283,123 @@ def test_srv6_stats_with_sid(self, mock_run_command): def teardown(self): print('TEAR DOWN') + + +class TestShowSwitchCounters(object): + @classmethod + def setup_class(cls): + logger.info("Setup class: {}".format(cls.__name__)) + + @classmethod + def teardown_class(cls): + logger.info("Teardown class: {}".format(cls.__name__)) + + def verify_stats(self, mock_run_command, command, options, expected): + runner = CliRunner() + result = runner.invoke(command, options) + + logger.debug("\n" + result.output) + logger.debug(result.exit_code) + + assert result.exit_code == SUCCESS + mock_run_command.assert_called_once_with(expected, display_cmd=True) + + @pytest.mark.parametrize( + "command, options, expected", [ + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["all"], + ["--verbose"], + ["switchstat", "--all", "-p", "0", "-d", "all"], + id="plain-all" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["trim"], + ["--verbose"], + ["switchstat", "--trim", "-p", "0", "-d", "all"], + id="plain-trim" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"], + ["--verbose"], + ["switchstat", "-p", "0", "-d", "all"], + id="plain-std" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["detailed"], + ["--verbose"], + ["switchstat", "--detail", "-p", "0", "-d", "all"], + id="plain-detail" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["all"], + ["--json", "--verbose"], + ["switchstat", "--all", "-p", "0", "-d", "all", "-j"], + id="json-all" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["trim"], + ["--json", "--verbose"], + ["switchstat", "--trim", "-p", "0", "-d", "all", "-j"], + id="json-trim" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"], + ["--json", "--verbose"], + ["switchstat", "-p", "0", "-d", "all", "-j"], + id="json-std" + ) + ] + ) + @patch("utilities_common.cli.run_command") + def test_switch_stats(self, mock_run_command, command, options, expected): + self.verify_stats(mock_run_command, command, options, expected) + + @pytest.mark.parametrize( + "command, options, expected", [ + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["all"], + ["--period", "1", "--verbose"], + ["switchstat", "--all", "-p", "1", "-d", "all"], + id="plain-all" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["trim"], + ["--period", "2", "--verbose"], + ["switchstat", "--trim", "-p", "2", "-d", "all"], + id="plain-trim" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"], + ["--period", "3", "--verbose"], + ["switchstat", "-p", "3", "-d", "all"], + id="plain-std" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["detailed"], + ["--period", "4", "--verbose"], + ["switchstat", "--detail", "-p", "4", "-d", "all"], + id="plain-detail" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["all"], + ["--period", "1", "--json", "--verbose"], + ["switchstat", "--all", "-p", "1", "-d", "all", "-j"], + id="json-all" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"].commands["trim"], + ["--period", "2", "--json", "--verbose"], + ["switchstat", "--trim", "-p", "2", "-d", "all", "-j"], + id="json-trim" + ), + pytest.param( + show.cli.commands["switch"].commands["counters"], + ["--period", "3", "--json", "--verbose"], + ["switchstat", "-p", "3", "-d", "all", "-j"], + id="json-std" + ) + ] + ) + @patch("utilities_common.cli.run_command") + def test_switch_stats_period(self, mock_run_command, command, options, expected): + self.verify_stats(mock_run_command, command, options, expected) diff --git a/tests/switchstat_input/common_output.py b/tests/switchstat_input/common_output.py new file mode 100644 index 0000000000..36a42c4e6a --- /dev/null +++ b/tests/switchstat_input/common_output.py @@ -0,0 +1,29 @@ +""" +Module holding the correct values for show CLI command outputs for the switchstat_test.py +""" + +# clear section ----------------------------------------------------------------------------------------------------- # + +show_switch_clear = """\ +Cleared switch counters +""" + +show_switch_clear_tag1 = """\ +Cleared switch counters using tag test1 +""" + +show_switch_clear_tag2 = """\ +Cleared switch counters using tag test2 +""" + +show_switch_delete = """\ +Removed saved switch stats +""" + +show_switch_delete_tag1 = """\ +Removed saved switch stats using tag test1 +""" + +show_switch_delete_all = """\ +Removed all saved switch stats +""" diff --git a/tests/switchstat_input/mock_counters/all.json b/tests/switchstat_input/mock_counters/all.json new file mode 100644 index 0000000000..9f6cf744e5 --- /dev/null +++ b/tests/switchstat_input/mock_counters/all.json @@ -0,0 +1,9 @@ +{ + "COUNTERS_SWITCH_NAME_MAP": { + "ASIC": "oid:0x21000000000000" + }, + "COUNTERS:oid:0x21000000000000": { + "SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS": "1000", + "SAI_SWITCH_STAT_TX_TRIM_PACKETS": "2000" + } +} diff --git a/tests/switchstat_input/mock_counters/empty.json b/tests/switchstat_input/mock_counters/empty.json new file mode 100644 index 0000000000..9db6e4c5c8 --- /dev/null +++ b/tests/switchstat_input/mock_counters/empty.json @@ -0,0 +1,8 @@ +{ + "COUNTERS_SWITCH_NAME_MAP": { + "ASIC": "oid:0x21000000000000" + }, + "COUNTERS:oid:0x21000000000000": { + "NULL": "NULL" + } +} diff --git a/tests/switchstat_input/mock_counters/no_counters.json b/tests/switchstat_input/mock_counters/no_counters.json new file mode 100644 index 0000000000..8463c20d9b --- /dev/null +++ b/tests/switchstat_input/mock_counters/no_counters.json @@ -0,0 +1,5 @@ +{ + "COUNTERS_SWITCH_NAME_MAP": { + "ASIC": "oid:0x21000000000000" + } +} diff --git a/tests/switchstat_input/mock_counters/no_map.json b/tests/switchstat_input/mock_counters/no_map.json new file mode 100644 index 0000000000..088bbcbac5 --- /dev/null +++ b/tests/switchstat_input/mock_counters/no_map.json @@ -0,0 +1,6 @@ +{ + "COUNTERS:oid:0x21000000000000": { + "SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS": "1000", + "SAI_SWITCH_STAT_TX_TRIM_PACKETS": "2000" + } +} diff --git a/tests/switchstat_input/mock_counters/partial.json b/tests/switchstat_input/mock_counters/partial.json new file mode 100644 index 0000000000..4c8dbe731f --- /dev/null +++ b/tests/switchstat_input/mock_counters/partial.json @@ -0,0 +1,8 @@ +{ + "COUNTERS_SWITCH_NAME_MAP": { + "ASIC": "oid:0x21000000000000" + }, + "COUNTERS:oid:0x21000000000000": { + "SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS": "1000" + } +} diff --git a/tests/switchstat_input/mock_counters/updated.json b/tests/switchstat_input/mock_counters/updated.json new file mode 100644 index 0000000000..343b63e3ce --- /dev/null +++ b/tests/switchstat_input/mock_counters/updated.json @@ -0,0 +1,9 @@ +{ + "COUNTERS_SWITCH_NAME_MAP": { + "ASIC": "oid:0x21000000000000" + }, + "COUNTERS:oid:0x21000000000000": { + "SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS": "1500", + "SAI_SWITCH_STAT_TX_TRIM_PACKETS": "2500" + } +} diff --git a/tests/switchstat_input/mock_counters/updated_tag.json b/tests/switchstat_input/mock_counters/updated_tag.json new file mode 100644 index 0000000000..80137a650f --- /dev/null +++ b/tests/switchstat_input/mock_counters/updated_tag.json @@ -0,0 +1,9 @@ +{ + "COUNTERS_SWITCH_NAME_MAP": { + "ASIC": "oid:0x21000000000000" + }, + "COUNTERS:oid:0x21000000000000": { + "SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS": "2000", + "SAI_SWITCH_STAT_TX_TRIM_PACKETS": "3000" + } +} diff --git a/tests/switchstat_input/multi_asic_output.py b/tests/switchstat_input/multi_asic_output.py new file mode 100644 index 0000000000..f46b277fe5 --- /dev/null +++ b/tests/switchstat_input/multi_asic_output.py @@ -0,0 +1,233 @@ +""" +Module holding the correct values for show CLI command outputs for the switchstat_test.py +""" + +# show section ------------------------------------------------------------------------------------------------------ # + +show_switch_all = """\ +Namespace: asic0 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 2,000 1,000 + +Namespace: asic1 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 2,000 1,000 + +Namespace: asic2 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 2,000 1,000 +""" +show_switch_all_json = """\ +{ + "asic0": { + "trim_drop": "1,000", + "trim_sent": "2,000" + }, + "asic1": { + "trim_drop": "1,000", + "trim_sent": "2,000" + }, + "asic2": { + "trim_drop": "1,000", + "trim_sent": "2,000" + } +} +""" + +show_switch_detailed = """\ +Namespace: asic0 + +Trimmed Sent Packets........................... 2,000 +Trimmed Dropped Packets........................ 1,000 + +Namespace: asic1 + +Trimmed Sent Packets........................... 2,000 +Trimmed Dropped Packets........................ 1,000 + +Namespace: asic2 + +Trimmed Sent Packets........................... 2,000 +Trimmed Dropped Packets........................ 1,000 +""" + +# diff section -------------------------------------------------------------------------------------------------------# + +show_switch_updated = """\ +Namespace: asic0 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 500 500 + +Namespace: asic1 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 500 500 + +Namespace: asic2 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 500 500 +""" +show_switch_updated_json = """\ +{ + "asic0": { + "trim_drop": "500", + "trim_sent": "500" + }, + "asic1": { + "trim_drop": "500", + "trim_sent": "500" + }, + "asic2": { + "trim_drop": "500", + "trim_sent": "500" + } +} +""" + +show_switch_updated_detailed = """\ +Namespace: asic0 + +Trimmed Sent Packets........................... 500 +Trimmed Dropped Packets........................ 500 + + +Namespace: asic1 + +Trimmed Sent Packets........................... 500 +Trimmed Dropped Packets........................ 500 + + +Namespace: asic2 + +Trimmed Sent Packets........................... 500 +Trimmed Dropped Packets........................ 500 +""" + +# negative section ---------------------------------------------------------------------------------------------------# + +show_switch_neg_na = """\ +Namespace: asic0 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + N/A N/A + +Namespace: asic1 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + N/A N/A + +Namespace: asic2 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + N/A N/A +""" +show_switch_neg_na_json = """\ +{ + "asic0": { + "trim_drop": "N/A", + "trim_sent": "N/A" + }, + "asic1": { + "trim_drop": "N/A", + "trim_sent": "N/A" + }, + "asic2": { + "trim_drop": "N/A", + "trim_sent": "N/A" + } +} +""" + +show_switch_neg_partial = """\ +Namespace: asic0 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + N/A 1,000 + +Namespace: asic1 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + N/A 1,000 + +Namespace: asic2 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + N/A 1,000 +""" +show_switch_neg_partial_json = """\ +{ + "asic0": { + "trim_drop": "1,000", + "trim_sent": "N/A" + }, + "asic1": { + "trim_drop": "1,000", + "trim_sent": "N/A" + }, + "asic2": { + "trim_drop": "1,000", + "trim_sent": "N/A" + } +} +""" + +# period section ---------------------------------------------------------------------------------------------------- # + +show_switch_period = """\ +The switch stats are calculated within 1 seconds period +Namespace: asic0 + +Trimmed Sent Packets........................... 0 +Trimmed Dropped Packets........................ 0 + + +Namespace: asic1 + +Trimmed Sent Packets........................... 0 +Trimmed Dropped Packets........................ 0 + + +Namespace: asic2 + +Trimmed Sent Packets........................... 0 +Trimmed Dropped Packets........................ 0 +""" + +# clear section ----------------------------------------------------------------------------------------------------- # + +show_switch_updated_tag = """\ +Namespace: asic0 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 1,000 1,000 + +Namespace: asic1 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 1,000 1,000 + +Namespace: asic2 + + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 1,000 1,000 +""" diff --git a/tests/switchstat_input/single_asic_output.py b/tests/switchstat_input/single_asic_output.py new file mode 100644 index 0000000000..6925225162 --- /dev/null +++ b/tests/switchstat_input/single_asic_output.py @@ -0,0 +1,83 @@ +""" +Module holding the correct values for show CLI command outputs for the switchstat_test.py +""" + +# show section ------------------------------------------------------------------------------------------------------ # + +show_switch_all = """\ + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 2,000 1,000 +""" +show_switch_all_json = """\ +{ + "trim_drop": "1,000", + "trim_sent": "2,000" +} +""" + +show_switch_detailed = """\ +Trimmed Sent Packets........................... 2,000 +Trimmed Dropped Packets........................ 1,000 +""" + +# diff section -------------------------------------------------------------------------------------------------------# + +show_switch_updated = """\ + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 500 500 +""" +show_switch_updated_json = """\ +{ + "trim_drop": "500", + "trim_sent": "500" +} +""" + +show_switch_updated_detailed = """\ +Trimmed Sent Packets........................... 500 +Trimmed Dropped Packets........................ 500 +""" + +# negative section ---------------------------------------------------------------------------------------------------# + +show_switch_neg_na = """\ + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + N/A N/A +""" +show_switch_neg_na_json = """\ +{ + "trim_drop": "N/A", + "trim_sent": "N/A" +} +""" + +show_switch_neg_partial = """\ + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + N/A 1,000 +""" +show_switch_neg_partial_json = """\ +{ + "trim_drop": "1,000", + "trim_sent": "N/A" +} +""" + +# period section ---------------------------------------------------------------------------------------------------- # + +show_switch_period = """\ +The switch stats are calculated within 1 seconds period +Trimmed Sent Packets........................... 0 +Trimmed Dropped Packets........................ 0 +""" + +# clear section ----------------------------------------------------------------------------------------------------- # + +show_switch_updated_tag = """\ + TrimSent/pkts TrimDrop/pkts +--------------- --------------- + 1,000 1,000 +""" diff --git a/tests/switchstat_test.py b/tests/switchstat_test.py new file mode 100644 index 0000000000..fb09d3f63f --- /dev/null +++ b/tests/switchstat_test.py @@ -0,0 +1,388 @@ +import pytest +import importlib +import logging +import os + +from click.testing import CliRunner +from utilities_common.db import Db +from utilities_common.cli import UserCache +from utilities_common.general import load_module_from_source + +from .mock_tables import dbconnector +from .switchstat_input import single_asic_output +from .switchstat_input import multi_asic_output +from .switchstat_input import common_output + + +test_path = os.path.dirname(os.path.abspath(__file__)) +modules_path = os.path.dirname(test_path) +scripts_path = os.path.join(modules_path, "scripts") +input_path = os.path.join(test_path, "switchstat_input") +mock_counters_path = os.path.join(input_path, "mock_counters") +switchstat_path = os.path.join(scripts_path, "switchstat") +switchstat = load_module_from_source("switchstat", switchstat_path) + +logger = logging.getLogger(__name__) + +SUCCESS = 0 + + +def remove_tmp_cnstat_file(): + cache = UserCache("switchstat") + cache.remove_all() + + +class TestSwitchStat(object): + show_switch_period = None + + show_switch_updated = None + show_switch_updated_tag = None + show_switch_all = None + + def remove_timestamp(self, output): + lines = output.splitlines() + pattern = "Time Since Counters Last Cleared" + return "\n".join([line for line in lines if pattern not in line]) + + def verify_counters(self, options, output, timestamp=False): + db = Db() + runner = CliRunner() + + result = runner.invoke(switchstat.main, options, obj=db) + out = self.remove_timestamp(result.output) if timestamp else result.output + rc = result.exit_code + + logger.debug("\n" + result.output) + logger.debug(result.exit_code) + + assert out == output + assert rc == SUCCESS + + def verify_counters_show(self, options, output): + dbconnector.dedicated_dbs["COUNTERS_DB"] = os.path.join(mock_counters_path, "all") + self.verify_counters(options, output) + + def verify_counters_diff(self, options, output): + dbconnector.dedicated_dbs["COUNTERS_DB"] = os.path.join(mock_counters_path, "all") + self.verify_counters(["--clear"], common_output.show_switch_clear) + dbconnector.dedicated_dbs["COUNTERS_DB"] = os.path.join(mock_counters_path, "updated") + self.verify_counters(options, output, "--detail" in options) + self.verify_counters(["--delete"], common_output.show_switch_delete) + + def verify_counters_neg(self, options, output): + self.verify_counters(options, output) + + def verify_counters_period(self): + dbconnector.dedicated_dbs["COUNTERS_DB"] = os.path.join(mock_counters_path, "all") + self.verify_counters(["--detail", "--period", "1"], self.show_switch_period, timestamp=True) + + def verify_counters_clear(self): + # regular stats clear + dbconnector.dedicated_dbs["COUNTERS_DB"] = os.path.join(mock_counters_path, "all") + self.verify_counters(["--clear"], common_output.show_switch_clear) + + # stats clear by tag 1 + self.verify_counters(["--clear", "--tag", "test1"], common_output.show_switch_clear_tag1) + + # stats clear by tag 2 + self.verify_counters(["--clear", "--tag", "test2"], common_output.show_switch_clear_tag2) + + # verify regular stats clear + dbconnector.dedicated_dbs["COUNTERS_DB"] = os.path.join(mock_counters_path, "updated") + self.verify_counters(["--all"], self.show_switch_updated) + + # verify stats clear by tag 1 + dbconnector.dedicated_dbs["COUNTERS_DB"] = os.path.join(mock_counters_path, "updated_tag") + self.verify_counters(["--all", "--tag", "test1"], self.show_switch_updated_tag) + + # verify raw stats + dbconnector.dedicated_dbs["COUNTERS_DB"] = os.path.join(mock_counters_path, "all") + self.verify_counters(["--all", "--raw"], self.show_switch_all) + + # delete regular stats snapshot + self.verify_counters(["--delete"], common_output.show_switch_delete) + + # verify no regular stats snapshot + self.verify_counters(["--all"], self.show_switch_all) + + # delete stats snapshot by tag 1 + self.verify_counters(["--delete", "--tag", "test1"], common_output.show_switch_delete_tag1) + + # verify no stats snapshot by tag 1 + self.verify_counters(["--all", "--tag", "test1"], self.show_switch_all) + + # delete all stats snapshots + self.verify_counters(["--delete-all"], common_output.show_switch_delete_all) + + # verify no stats snapshot by tag 2 + self.verify_counters(["--all", "--tag", "test2"], self.show_switch_all) + + +class TestSingleAsicSwitchStat(TestSwitchStat): + @classmethod + def setup_class(cls): + logger.info("Setup class: {}".format(cls.__name__)) + from .mock_tables import mock_single_asic + importlib.reload(mock_single_asic) + dbconnector.clean_up_config() + dbconnector.load_database_config() + remove_tmp_cnstat_file() + + @classmethod + def teardown_class(cls): + logger.info("Teardown class: {}".format(cls.__name__)) + dbconnector.dedicated_dbs.clear() + dbconnector.clean_up_config() + remove_tmp_cnstat_file() + + @pytest.fixture(scope="class") + def period_data(self, request): + logger.info("Initialize single asic counters period data") + request.cls.show_switch_period = single_asic_output.show_switch_period + + yield + + request.cls.show_switch_period = None + logger.info("Deinitialize single asic counters period data") + + @pytest.fixture(scope="class") + def clear_data(self, request): + logger.info("Initialize single asic counters clear data") + + request.cls.show_switch_updated = single_asic_output.show_switch_updated + request.cls.show_switch_updated_tag = single_asic_output.show_switch_updated_tag + request.cls.show_switch_all = single_asic_output.show_switch_all + + yield + + request.cls.show_switch_updated = None + request.cls.show_switch_updated_tag = None + request.cls.show_switch_all = None + logger.info("Deinitialize single asic counters clear data") + + # ---------- SHOW SINGLE ASIC SWITCH COUNTERS ---------- # + + @pytest.mark.parametrize( + "options, output", [ + pytest.param(["--all"], single_asic_output.show_switch_all, id="plain-all"), + pytest.param(["--trim"], single_asic_output.show_switch_all, id="plain-trim"), + pytest.param([], single_asic_output.show_switch_all, id="plain-std"), + pytest.param(["--detail"], single_asic_output.show_switch_detailed, id="plain-detail"), + pytest.param(["--all", "--json"], single_asic_output.show_switch_all_json, id="json-all"), + pytest.param(["--trim", "--json"], single_asic_output.show_switch_all_json, id="json-trim"), + pytest.param(["--json"], single_asic_output.show_switch_all_json, id="json-std") + ] + ) + def test_counters_show(self, options, output): + self.verify_counters_show(options, output) + + @pytest.mark.parametrize( + "options, output", [ + pytest.param(["--all"], single_asic_output.show_switch_updated, id="plain-all"), + pytest.param(["--trim"], single_asic_output.show_switch_updated, id="plain-trim"), + pytest.param([], single_asic_output.show_switch_updated, id="plain-std"), + pytest.param(["--detail"], single_asic_output.show_switch_updated_detailed, id="plain-detail"), + pytest.param(["--all", "--json"], single_asic_output.show_switch_updated_json, id="json-all"), + pytest.param(["--trim", "--json"], single_asic_output.show_switch_updated_json, id="json-trim"), + pytest.param(["--json"], single_asic_output.show_switch_updated_json, id="json-std") + ] + ) + def test_counters_show_diff(self, options, output): + self.verify_counters_diff(options, output) + + @pytest.mark.parametrize( + "options, output, cntdb", [ + pytest.param( + ["--all"], + single_asic_output.show_switch_neg_na, + os.path.join(mock_counters_path, "no_map"), + id="no-map-plain-all" + ), + pytest.param( + ["--all", "--json"], + single_asic_output.show_switch_neg_na_json, + os.path.join(mock_counters_path, "no_map"), + id="no-map-json-all" + ), + pytest.param( + ["--all"], + single_asic_output.show_switch_neg_na, + os.path.join(mock_counters_path, "no_counters"), + id="no-cnt-plain-all" + ), + pytest.param( + ["--all", "--json"], + single_asic_output.show_switch_neg_na_json, + os.path.join(mock_counters_path, "no_counters"), + id="no-cnt-json-all" + ), + pytest.param( + ["--all"], + single_asic_output.show_switch_neg_na, + os.path.join(mock_counters_path, "empty"), + id="empty-plain-all" + ), + pytest.param( + ["--all", "--json"], + single_asic_output.show_switch_neg_na_json, + os.path.join(mock_counters_path, "empty"), + id="empty-json-all" + ), + pytest.param( + ["--all"], + single_asic_output.show_switch_neg_partial, + os.path.join(mock_counters_path, "partial"), + id="partial-plain-all" + ), + pytest.param( + ["--all", "--json"], + single_asic_output.show_switch_neg_partial_json, + os.path.join(mock_counters_path, "partial"), + id="partial-json-all" + ) + ] + ) + def test_counters_show_neg(self, options, output, cntdb): + dbconnector.dedicated_dbs["COUNTERS_DB"] = cntdb + self.verify_counters_neg(options, output) + + def test_counters_period(self, period_data): + self.verify_counters_period() + + def test_counters_clear(self, clear_data): + self.verify_counters_clear() + + +class TestMultiAsicSwitchStat(TestSwitchStat): + @classmethod + def setup_class(cls): + logger.info("Setup class: {}".format(cls.__name__)) + from .mock_tables import mock_multi_asic_3_asics + importlib.reload(mock_multi_asic_3_asics) + dbconnector.clean_up_config() + dbconnector.load_namespace_config() + remove_tmp_cnstat_file() + + @classmethod + def teardown_class(cls): + logger.info("Teardown class: {}".format(cls.__name__)) + dbconnector.dedicated_dbs.clear() + dbconnector.clean_up_config() + remove_tmp_cnstat_file() + + @pytest.fixture(scope="class") + def period_data(self, request): + logger.info("Initialize multi asic counters period data") + request.cls.show_switch_period = multi_asic_output.show_switch_period + + yield + + request.cls.show_switch_period = None + logger.info("Deinitialize multi asic counters period data") + + @pytest.fixture(scope="class") + def clear_data(self, request): + logger.info("Initialize multi asic counters clear data") + + request.cls.show_switch_updated = multi_asic_output.show_switch_updated + request.cls.show_switch_updated_tag = multi_asic_output.show_switch_updated_tag + request.cls.show_switch_all = multi_asic_output.show_switch_all + + yield + + request.cls.show_switch_updated = None + request.cls.show_switch_updated_tag = None + request.cls.show_switch_all = None + logger.info("Deinitialize multi asic counters clear data") + + # ---------- SHOW MULTI ASIC SWITCH COUNTERS ---------- # + + @pytest.mark.parametrize( + "options, output", [ + pytest.param(["--all"], multi_asic_output.show_switch_all, id="plain-all"), + pytest.param(["--trim"], multi_asic_output.show_switch_all, id="plain-trim"), + pytest.param([], multi_asic_output.show_switch_all, id="plain-std"), + pytest.param(["--detail"], multi_asic_output.show_switch_detailed, id="plain-detail"), + pytest.param(["--all", "--json"], multi_asic_output.show_switch_all_json, id="json-all"), + pytest.param(["--trim", "--json"], multi_asic_output.show_switch_all_json, id="json-trim"), + pytest.param(["--json"], multi_asic_output.show_switch_all_json, id="json-std") + ] + ) + def test_counters_show(self, options, output): + self.verify_counters_show(options, output) + + @pytest.mark.parametrize( + "options, output", [ + pytest.param(["--all"], multi_asic_output.show_switch_updated, id="plain-all"), + pytest.param(["--trim"], multi_asic_output.show_switch_updated, id="plain-trim"), + pytest.param([], multi_asic_output.show_switch_updated, id="plain-std"), + pytest.param(["--detail"], multi_asic_output.show_switch_updated_detailed, id="plain-detail"), + pytest.param(["--all", "--json"], multi_asic_output.show_switch_updated_json, id="json-all"), + pytest.param(["--trim", "--json"], multi_asic_output.show_switch_updated_json, id="json-trim"), + pytest.param(["--json"], multi_asic_output.show_switch_updated_json, id="json-std") + ] + ) + def test_counters_show_diff(self, options, output): + self.verify_counters_diff(options, output) + + @pytest.mark.parametrize( + "options, output, cntdb", [ + pytest.param( + ["--all"], + multi_asic_output.show_switch_neg_na, + os.path.join(mock_counters_path, "no_map"), + id="no-map-plain-all" + ), + pytest.param( + ["--all", "--json"], + multi_asic_output.show_switch_neg_na_json, + os.path.join(mock_counters_path, "no_map"), + id="no-map-json-all" + ), + pytest.param( + ["--all"], + multi_asic_output.show_switch_neg_na, + os.path.join(mock_counters_path, "no_counters"), + id="no-cnt-plain-all" + ), + pytest.param( + ["--all", "--json"], + multi_asic_output.show_switch_neg_na_json, + os.path.join(mock_counters_path, "no_counters"), + id="no-cnt-json-all" + ), + pytest.param( + ["--all"], + multi_asic_output.show_switch_neg_na, + os.path.join(mock_counters_path, "empty"), + id="empty-plain-all" + ), + pytest.param( + ["--all", "--json"], + multi_asic_output.show_switch_neg_na_json, + os.path.join(mock_counters_path, "empty"), + id="empty-json-all" + ), + pytest.param( + ["--all"], + multi_asic_output.show_switch_neg_partial, + os.path.join(mock_counters_path, "partial"), + id="partial-plain-all" + ), + pytest.param( + ["--all", "--json"], + multi_asic_output.show_switch_neg_partial_json, + os.path.join(mock_counters_path, "partial"), + id="partial-json-all" + ) + ] + ) + def test_counters_show_neg(self, options, output, cntdb): + dbconnector.dedicated_dbs["COUNTERS_DB"] = cntdb + self.verify_counters_neg(options, output) + + def test_counters_period(self, period_data): + self.verify_counters_period() + + def test_counters_clear(self, clear_data): + self.verify_counters_clear() diff --git a/tests/synchronous_mode_test.py b/tests/synchronous_mode_test.py index abe65b6f32..51a746b62f 100644 --- a/tests/synchronous_mode_test.py +++ b/tests/synchronous_mode_test.py @@ -2,6 +2,7 @@ from utilities_common.db import Db from unittest import mock from mock import patch +from .mock_tables import dbconnector import config.main as config import config.validated_config_db_connector as validated_config_db_connector @@ -9,6 +10,7 @@ class TestSynchronousMode(object): @classmethod def setup_class(cls): print("SETUP") + dbconnector.load_namespace_config() def __check_result(self, result_msg, mode): if mode == "enable" or mode == "disable": diff --git a/utilities_common/netstat.py b/utilities_common/netstat.py index 5fd1df653e..83b2f4c18e 100755 --- a/utilities_common/netstat.py +++ b/utilities_common/netstat.py @@ -6,7 +6,8 @@ STATUS_NA = 'N/A' PORT_RATE = 40 -def ns_diff(newstr, oldstr): + +def ns_diff(newstr, oldstr, raw=False): """ Calculate the diff. """ @@ -18,7 +19,7 @@ def ns_diff(newstr, oldstr): oldstr = '0' new, old = int(newstr), int(oldstr) - return '{:,}'.format(max(0, new - old)) + return '{:,}'.format((new - old) if raw else max(0, new - old)) def ns_brate(newstr, oldstr, delta): """ @@ -72,10 +73,18 @@ def table_as_json(table, header): return json.dumps(output, indent=4, sort_keys=True) -def format_number_with_comma(number_in_str): +def format_number_with_comma(number_in_str, raw=False): """ Format the number with comma. """ + if raw: + if number_in_str.startswith('-', 0, 1) and number_in_str[1:].isdecimal(): + return '{:,}'.format(int(number_in_str)) + elif number_in_str.isdecimal(): + return '{:,}'.format(int(number_in_str)) + else: + return number_in_str + if number_in_str.isdecimal(): return '{:,}'.format(int(number_in_str)) else: diff --git a/utilities_common/portstat.py b/utilities_common/portstat.py index fb10e1bd51..04e571de77 100644 --- a/utilities_common/portstat.py +++ b/utilities_common/portstat.py @@ -29,15 +29,15 @@ rx_jbr, rx_frag, rx_usize, rx_ovrrun,\ fec_corr, fec_uncorr, fec_symbol_err,\ wred_grn_drp_pkt, wred_ylw_drp_pkt, wred_red_drp_pkt, wred_tot_drp_pkt,\ - trim") + trim, trim_sent, trim_drop") header_all = ['IFACE', 'STATE', 'RX_OK', 'RX_BPS', 'RX_PPS', 'RX_UTIL', 'RX_ERR', 'RX_DRP', 'RX_OVR', - 'TX_OK', 'TX_BPS', 'TX_PPS', 'TX_UTIL', 'TX_ERR', 'TX_DRP', 'TX_OVR', 'TRIM'] + 'TX_OK', 'TX_BPS', 'TX_PPS', 'TX_UTIL', 'TX_ERR', 'TX_DRP', 'TX_OVR', 'TRIM', 'TRIM_TX', 'TRIM_DRP'] header_std = ['IFACE', 'STATE', 'RX_OK', 'RX_BPS', 'RX_UTIL', 'RX_ERR', 'RX_DRP', 'RX_OVR', 'TX_OK', 'TX_BPS', 'TX_UTIL', 'TX_ERR', 'TX_DRP', 'TX_OVR'] header_errors_only = ['IFACE', 'STATE', 'RX_ERR', 'RX_DRP', 'RX_OVR', 'TX_ERR', 'TX_DRP', 'TX_OVR'] header_fec_only = ['IFACE', 'STATE', 'FEC_CORR', 'FEC_UNCORR', 'FEC_SYMBOL_ERR', 'FEC_PRE_BER', 'FEC_POST_BER'] header_rates_only = ['IFACE', 'STATE', 'RX_OK', 'RX_BPS', 'RX_PPS', 'RX_UTIL', 'TX_OK', 'TX_BPS', 'TX_PPS', 'TX_UTIL'] -header_trim_only = ['IFACE', 'STATE', 'TRIM_PKTS'] +header_trim_only = ['IFACE', 'STATE', 'TRIM_PKTS', 'TRIM_TX_PKTS', 'TRIM_DRP_PKTS'] rates_key_list = ['RX_BPS', 'RX_PPS', 'RX_UTIL', 'TX_BPS', 'TX_PPS', 'TX_UTIL', 'FEC_PRE_BER', 'FEC_POST_BER'] ratestat_fields = ("rx_bps", "rx_pps", "rx_util", "tx_bps", "tx_pps", "tx_util", "fec_pre_ber", "fec_post_ber") @@ -47,8 +47,6 @@ The order and count of statistics mentioned below needs to be in sync with the values in portstat script So, any fields added/deleted in here should be reflected in portstat script also """ -BUCKET_NUM = 50 - wred_green_pkt_stat_capable = "false" wred_yellow_pkt_stat_capable = "false" wred_red_pkt_stat_capable = "false" @@ -109,6 +107,8 @@ 47: ['SAI_PORT_STAT_RED_WRED_DROPPED_PACKETS'], 48: ['SAI_PORT_STAT_WRED_DROPPED_PACKETS'], 49: ['SAI_PORT_STAT_TRIM_PACKETS'], + 50: ['SAI_PORT_STAT_TX_TRIM_PACKETS'], + 51: ['SAI_PORT_STAT_DROPPED_TRIM_PACKETS'], } STATUS_NA = 'N/A' @@ -259,7 +259,6 @@ def collect_stat(self): device and store in a dict """ - global BUCKET_NUM global wred_green_pkt_stat_capable global wred_yellow_pkt_stat_capable global wred_red_pkt_stat_capable @@ -287,22 +286,18 @@ def collect_stat(self): if (is_wred_stats_reqd is False) or (wred_green_pkt_stat_capable != "true"): if ('SAI_PORT_STAT_GREEN_WRED_DROPPED_PACKETS' in counter_bucket_dict.keys()): del counter_bucket_dict['SAI_PORT_STAT_GREEN_WRED_DROPPED_PACKETS'] - BUCKET_NUM = (BUCKET_NUM - 1) if (is_wred_stats_reqd is False) or (wred_yellow_pkt_stat_capable != "true"): if ('SAI_PORT_STAT_YELLOW_WRED_DROPPED_PACKETS' in counter_bucket_dict.keys()): del counter_bucket_dict['SAI_PORT_STAT_YELLOW_WRED_DROPPED_PACKETS'] - BUCKET_NUM = (BUCKET_NUM - 1) if (is_wred_stats_reqd is False) or (wred_red_pkt_stat_capable != "true"): if ('SAI_PORT_STAT_RED_WRED_DROPPED_PACKETS' in counter_bucket_dict.keys()): del counter_bucket_dict['SAI_PORT_STAT_RED_WRED_DROPPED_PACKETS'] - BUCKET_NUM = (BUCKET_NUM - 1) if (is_wred_stats_reqd is False) or (wred_total_pkt_stat_capable != "true"): if ('SAI_PORT_STAT_WRED_DROPPED_PACKETS' in counter_bucket_dict.keys()): del counter_bucket_dict['SAI_PORT_STAT_WRED_DROPPED_PACKETS'] - BUCKET_NUM = (BUCKET_NUM - 1) cnstat_dict, ratestat_dict = self.get_cnstat() self.cnstat_dict.update(cnstat_dict) @@ -316,7 +311,7 @@ def get_counters(port): """ Get the counters from specific table. """ - fields = ["0"]*BUCKET_NUM + fields = ["0"] * len(counter_bucket_dict) _, fvs = counter_table.get(PortCounter(), port) fvs = dict(fvs) @@ -421,7 +416,7 @@ def cnstat_intf_diff_print(self, cnstat_new_dict, cnstat_old_dict, intf_list): if key in cnstat_old_dict: old_cntr = cnstat_old_dict.get(key) else: - old_cntr = NStats._make([0] * BUCKET_NUM)._asdict() + old_cntr = NStats._make([0] * len(counter_bucket_dict))._asdict() if intf_list and key not in intf_list: continue @@ -535,8 +530,16 @@ def cnstat_intf_diff_print(self, cnstat_new_dict, cnstat_old_dict, intf_list): ) print("") - print("Packets Trimmed................................ {}".format(ns_diff(cntr['trim'], - old_cntr['trim']))) + print("Trimmed Packets................................ {}".format( + ns_diff(cntr['trim'], old_cntr['trim']) + )) + print("Trimmed Sent Packets........................... {}".format( + ns_diff(cntr['trim_sent'], old_cntr['trim_sent']) + )) + print("Trimmed Dropped Packets........................ {}".format( + ns_diff(cntr['trim_drop'], old_cntr['trim_drop'], raw=True) + )) + print("") print("Time Since Counters Last Cleared............... " + str(cnstat_old_dict.get('time'))) @@ -563,7 +566,7 @@ def cnstat_diff_print(self, cnstat_new_dict, cnstat_old_dict, if key in cnstat_old_dict: old_cntr = cnstat_old_dict.get(key) else: - old_cntr = NStats._make([0] * BUCKET_NUM)._asdict() + old_cntr = NStats._make([0] * len(counter_bucket_dict))._asdict() rates = ratestat_dict.get(key, RateStats._make([STATUS_NA] * len(ratestat_fields))) @@ -599,7 +602,9 @@ def cnstat_diff_print(self, cnstat_new_dict, cnstat_old_dict, ns_diff(cntr["tx_err"], old_cntr["tx_err"]), ns_diff(cntr["tx_drop"], old_cntr["tx_drop"]), ns_diff(cntr["tx_ovr"], old_cntr["tx_ovr"]), - ns_diff(cntr["trim"], old_cntr["trim"]))) + ns_diff(cntr["trim"], old_cntr["trim"]), + ns_diff(cntr["trim_sent"], old_cntr["trim_sent"]), + ns_diff(cntr["trim_drop"], old_cntr["trim_drop"], raw=True))) elif errors_only: header = header_errors_only @@ -650,7 +655,9 @@ def cnstat_diff_print(self, cnstat_new_dict, cnstat_old_dict, if not nonzero or is_non_zero(ns_diff(cntr['trim'], old_cntr['trim'])): table.append((key, self.get_port_state(key), - ns_diff(cntr['trim'], old_cntr['trim']))) + ns_diff(cntr["trim"], old_cntr["trim"]), + ns_diff(cntr["trim_sent"], old_cntr["trim_sent"]), + ns_diff(cntr["trim_drop"], old_cntr["trim_drop"], raw=True))) else: header = header_std diff --git a/utilities_common/switchstat.py b/utilities_common/switchstat.py new file mode 100644 index 0000000000..2e1a47ef2d --- /dev/null +++ b/utilities_common/switchstat.py @@ -0,0 +1,285 @@ +import click +import json +import os + +from natsort import natsorted +from tabulate import tabulate +from datetime import datetime +from swsscommon.swsscommon import COUNTERS_SWITCH_NAME_MAP, COUNTERS_TABLE +from utilities_common import multi_asic as multi_asic_util +from utilities_common.netstat import ns_diff, format_number_with_comma +from utilities_common.cli import UserCache, json_serial + + +HEADER_ALL = ["TrimSent/pkts", "TrimDrop/pkts"] +HEADER_STD = ["TrimSent/pkts", "TrimDrop/pkts"] +HEADER_TRIM = ["TrimSent/pkts", "TrimDrop/pkts"] + +counter_dict = { + "trim_tx": "SAI_SWITCH_STAT_TX_TRIM_PACKETS", + "trim_drp": "SAI_SWITCH_STAT_DROPPED_TRIM_PACKETS" +} + + +class SwitchStat(object): + def __init__(self, namespace, display, tag): + # Initialize cache + self.init_cache(tag) + + # Initialize the multi-asic namespace + self.db = None + self.multi_asic = multi_asic_util.MultiAsic(display, namespace) + + # Initialize counters default dict + self.cnstat_dict_default = {k: "N/A" for k in counter_dict.keys()} + + def init_cache(self, tag): + self.cache = UserCache(app_name="switchstat", tag=tag) + + self.cnstat_file = "switchstat" + self.cnstat_dir = self.cache.get_directory() + self.cnstat_fqn_file = os.path.join(self.cnstat_dir, self.cnstat_file) + + def is_cache_exists(self): + return os.path.isfile(self.cnstat_fqn_file) + + def remove_stats(self, all=False): + if all: + self.cache.remove_all() + else: + self.cache.remove() + + def load_stats(self): + return json.load(open(self.cnstat_fqn_file, "r")) + + def save_stats(self, cnstat_dict): + json.dump(cnstat_dict, open(self.cnstat_fqn_file, "w"), default=json_serial) + + def get_cnstat(self): + cnstat_dict = {} + + if not self.db.exists(self.db.COUNTERS_DB, COUNTERS_SWITCH_NAME_MAP): + return self.cnstat_dict_default + + switch_name_map = self.db.get_all(self.db.COUNTERS_DB, COUNTERS_SWITCH_NAME_MAP) + switch_oid = switch_name_map.get("ASIC", None) + + if switch_oid is None: + return self.cnstat_dict_default + + switch_stat_key = "{}{}{}".format( + COUNTERS_TABLE, + self.db.get_db_separator(self.db.COUNTERS_DB), + switch_oid + ) + + if not self.db.exists(self.db.COUNTERS_DB, switch_stat_key): + return self.cnstat_dict_default + + switch_stat_dict = self.db.get_all(self.db.COUNTERS_DB, switch_stat_key) + + for key, value in counter_dict.items(): + cnstat_dict[key] = switch_stat_dict.get(value, "N/A") + + return cnstat_dict + + @multi_asic_util.run_on_multi_asic + def collect_stat(self): + cnstat_dict = self.get_cnstat() + + if self.multi_asic.is_multi_asic: + self.cnstat_dict[self.multi_asic.current_namespace] = {} + self.cnstat_dict[self.multi_asic.current_namespace].update(cnstat_dict) + else: + self.cnstat_dict.update(cnstat_dict) + + def get_cnstat_dict(self, timestamp=False): + self.cnstat_dict = {} + self.collect_stat() + + if timestamp: # shallow copy to inject timestamp + cnstat_dict = {} + cnstat_dict.update(self.cnstat_dict) + cnstat_dict["time"] = datetime.now() + return cnstat_dict + + return self.cnstat_dict + + def cnstat_print(self, cnstat_dict, print_all, print_trim, detail, json_fmt): + def print_json(cntr): + def build_json(data): + json_dict = {} + + json_dict["trim_sent"] = format_number_with_comma(data["trim_tx"]) + json_dict["trim_drop"] = format_number_with_comma(data["trim_drp"]) + + return json_dict + + if not self.multi_asic.is_multi_asic: + click.echo(json.dumps(build_json(cntr), indent=4, sort_keys=True)) + return + + json_dict = {} + + for ns in cntr.keys(): + json_dict[ns] = build_json(cntr[ns]) + + click.echo(json.dumps(json_dict, indent=4, sort_keys=True)) + + def print_detail(cntr, ns=None): + if ns is not None: + click.echo("Namespace: {}".format(ns)) + click.echo() + + click.echo("Trimmed Sent Packets........................... {}".format( + format_number_with_comma(cntr["trim_tx"]) + )) + click.echo("Trimmed Dropped Packets........................ {}".format( + format_number_with_comma(cntr["trim_drp"]) + )) + + def print_table(cntr, ns=None): + if ns is not None: + click.echo("Namespace: {}".format(ns)) + click.echo() + + header = None + body = [] + + if print_all: # all counters + header = HEADER_ALL + body.append(( + format_number_with_comma(cntr["trim_tx"]), + format_number_with_comma(cntr["trim_drp"]) + )) + elif print_trim: # trim counters + header = HEADER_TRIM + body.append(( + format_number_with_comma(cntr["trim_tx"]), + format_number_with_comma(cntr["trim_drp"]) + )) + else: # standard counters + header = HEADER_STD + body.append(( + format_number_with_comma(cntr["trim_tx"]), + format_number_with_comma(cntr["trim_drp"]) + )) + + click.echo(tabulate(body, header, tablefmt="simple", stralign="right")) + + if json_fmt: + print_json(cnstat_dict) + return + + if not self.multi_asic.is_multi_asic: + if detail: + print_detail(cnstat_dict) + else: + print_table(cnstat_dict) + return + + ns_list = natsorted(cnstat_dict.keys()) + + if detail: + print_detail(cnstat_dict[ns_list[0]], ns_list[0]) + + for ns in ns_list[1:]: + click.echo() + print_detail(cnstat_dict[ns], ns) + else: + print_table(cnstat_dict[ns_list[0]], ns_list[0]) + + for ns in ns_list[1:]: + click.echo() + print_table(cnstat_dict[ns], ns) + + def cnstat_diff_print(self, cnstat_dict, cnstat_old_dict, print_all, print_trim, detail, json_fmt): + def print_json(cntr, old_cntr): + def build_json(data, old_data): + json_dict = {} + + json_dict["trim_sent"] = ns_diff(data["trim_tx"], old_data["trim_tx"]) + json_dict["trim_drop"] = ns_diff(data["trim_drp"], old_data["trim_drp"]) + + return json_dict + + if not self.multi_asic.is_multi_asic: + click.echo(json.dumps(build_json(cntr, old_cntr), indent=4, sort_keys=True)) + return + + json_dict = {} + + for ns in cntr.keys(): + json_dict[ns] = build_json(cntr[ns], old_cntr[ns]) + + click.echo(json.dumps(json_dict, indent=4, sort_keys=True)) + + def print_detail(cntr, old_cntr, ts, ns=None): + if ns is not None: + click.echo("Namespace: {}".format(ns)) + click.echo() + + click.echo("Trimmed Sent Packets........................... {}".format( + ns_diff(cntr["trim_tx"], old_cntr["trim_tx"]) + )) + click.echo("Trimmed Dropped Packets........................ {}".format( + ns_diff(cntr["trim_drp"], old_cntr["trim_drp"]) + )) + click.echo() + + click.echo("Time Since Counters Last Cleared............... {}".format(ts)) + + def print_table(cntr, old_cntr, ns=None): + if ns is not None: + click.echo("Namespace: {}".format(ns)) + click.echo() + + header = None + body = [] + + if print_all: # all counters + header = HEADER_ALL + body.append(( + ns_diff(cntr["trim_tx"], old_cntr["trim_tx"]), + ns_diff(cntr["trim_drp"], old_cntr["trim_drp"]) + )) + elif print_trim: # trim counters + header = HEADER_TRIM + body.append(( + ns_diff(cntr["trim_tx"], old_cntr["trim_tx"]), + ns_diff(cntr["trim_drp"], old_cntr["trim_drp"]) + )) + else: # standard counters + header = HEADER_STD + body.append(( + ns_diff(cntr["trim_tx"], old_cntr["trim_tx"]), + ns_diff(cntr["trim_drp"], old_cntr["trim_drp"]) + )) + + click.echo(tabulate(body, header, tablefmt="simple", stralign="right")) + + if json_fmt: + print_json(cnstat_dict, cnstat_old_dict) + return + + if not self.multi_asic.is_multi_asic: + if detail: + print_detail(cnstat_dict, cnstat_old_dict, cnstat_old_dict["time"]) + else: + print_table(cnstat_dict, cnstat_old_dict) + return + + ns_list = natsorted(cnstat_dict.keys()) + + if detail: + print_detail(cnstat_dict[ns_list[0]], cnstat_old_dict[ns_list[0]], cnstat_old_dict["time"], ns_list[0]) + + for ns in ns_list[1:]: + click.echo() + print_detail(cnstat_dict[ns], cnstat_old_dict[ns], cnstat_old_dict["time"], ns) + else: + print_table(cnstat_dict[ns_list[0]], cnstat_old_dict[ns_list[0]], ns_list[0]) + + for ns in ns_list[1:]: + click.echo() + print_table(cnstat_dict[ns], cnstat_old_dict[ns], ns)