From 2bfe3f21aee6fbb68d3ccc2cbd3a8071b881cf1f Mon Sep 17 00:00:00 2001 From: vikumarks Date: Mon, 5 May 2025 18:34:40 -0700 Subject: [PATCH 1/2] Added json output support for queue watermark and persistent-watermark --- scripts/watermarkstat | 21 ++++++++++++++------- show/main.py | 30 ++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/scripts/watermarkstat b/scripts/watermarkstat index 70ea853bc4..2a296c1e95 100755 --- a/scripts/watermarkstat +++ b/scripts/watermarkstat @@ -81,13 +81,13 @@ class WatermarkstatWrapper(object): self.db = None @multi_asic_util.run_on_multi_asic - def run(self, clear, persistent, wm_type): + def run(self, clear, persistent, wm_type, json_output): watermarkstat = Watermarkstat(self.db, self.multi_asic.current_namespace) if clear: watermarkstat.send_clear_notification(("PERSISTENT" if persistent else "USER", wm_type.upper())) else: table_prefix = PERSISTENT_TABLE_PREFIX if persistent else USER_TABLE_PREFIX - watermarkstat.print_all_stat(table_prefix, wm_type) + watermarkstat.print_all_stat(table_prefix, wm_type, json_output) class Watermarkstat(object): @@ -283,8 +283,9 @@ class Watermarkstat(object): fields[pos] = str(int(counter_data)) return fields - def print_all_stat(self, table_prefix, key): + def print_all_stat(self, table_prefix, key, json_output): table = [] + json_result = [] type = self.watermark_types[key] if key in ['buffer_pool', 'headroom_pool']: self.header_list = type['header'] @@ -298,6 +299,7 @@ class Watermarkstat(object): if data is None: data = STATUS_NA table.append((buf_pool, data)) + json_result.append({buf_pool:data}) else: self.build_header(type, key) # Get stat for each port @@ -309,10 +311,14 @@ class Watermarkstat(object): row_data.append(port) row_data.extend(data) table.append(tuple(row_data)) - + json_result.append(dict(zip(self.header_list, [port]+data))) + namespace_str = f" (Namespace {self.namespace})" if multi_asic.is_multi_asic() else '' print(type["message"] + namespace_str) - print(tabulate(table, self.header_list, tablefmt='simple', stralign='right')) + if json_output: + print(json.dumps(json_result, indent=4)) + else: + print(tabulate(table, self.header_list, tablefmt='simple', stralign='right')) def send_clear_notification(self, data): msg = json.dumps(data, separators=(',', ':')) @@ -324,8 +330,9 @@ class Watermarkstat(object): @click.option('-p', '--persistent', is_flag=True, help='Do the operations on the persistent watermark') @click.option('-t', '--type', 'wm_type', type=click.Choice(['pg_headroom', 'pg_shared', 'q_shared_uni', 'q_shared_multi', 'buffer_pool', 'headroom_pool', 'q_shared_all']), help='The type of watermark', required=True) @click.option('-n', '--namespace', type=click.Choice(multi_asic.get_namespace_list()), help='Namespace name or skip for all', default=None) +@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display output in JSON format") @click.version_option(version='1.0') -def main(clear, persistent, wm_type, namespace): +def main(clear, persistent, wm_type, namespace, json_output=False): """ Display the watermark counters @@ -347,7 +354,7 @@ def main(clear, persistent, wm_type, namespace): """ namespace_context = WatermarkstatWrapper(namespace) - namespace_context.run(clear, persistent, wm_type) + namespace_context.run(clear, persistent, wm_type, json_output) sys.exit(0) if __name__ == "__main__": diff --git a/show/main.py b/show/main.py index 3f7a1bca8b..53731f6c1c 100755 --- a/show/main.py +++ b/show/main.py @@ -826,11 +826,14 @@ def watermark(): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -def wm_q_uni(namespace): +@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +def wm_q_uni(namespace, json_output): """Show user WM for unicast queues""" command = ['watermarkstat', '-t', 'q_shared_uni'] if namespace is not None: command += ['-n', str(namespace)] + if json_output: + command += ["-j"] run_command(command) # 'multicast' subcommand ("show queue watermarks multicast") @@ -843,11 +846,14 @@ def wm_q_uni(namespace): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -def wm_q_multi(namespace): +@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +def wm_q_multi(namespace, json_output): """Show user WM for multicast queues""" command = ['watermarkstat', '-t', 'q_shared_multi'] if namespace is not None: command += ['-n', str(namespace)] + if json_output: + command += ["-j"] run_command(command) # 'all' subcommand ("show queue watermarks all") @@ -860,11 +866,14 @@ def wm_q_multi(namespace): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -def wm_q_all(namespace): +@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +def wm_q_all(namespace, json_output): """Show user WM for all queues""" command = ['watermarkstat', '-t', 'q_shared_all'] if namespace is not None: command += ['-n', str(namespace)] + if json_output: + command += ["-j"] run_command(command) # @@ -886,11 +895,14 @@ def persistent_watermark(): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -def pwm_q_uni(namespace): +@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +def pwm_q_uni(namespace, json_output): """Show persistent WM for unicast queues""" command = ['watermarkstat', '-p', '-t', 'q_shared_uni'] if namespace is not None: command += ['-n', str(namespace)] + if json_output: + command += ["-j"] run_command(command) # 'multicast' subcommand ("show queue persistent-watermarks multicast") @@ -903,11 +915,14 @@ def pwm_q_uni(namespace): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -def pwm_q_multi(namespace): +@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +def pwm_q_multi(namespace, json_output): """Show persistent WM for multicast queues""" command = ['watermarkstat', '-p', '-t', 'q_shared_multi'] if namespace is not None: command += ['-n', str(namespace)] + if json_output: + command += ["-j"] run_command(command) # 'all' subcommand ("show queue persistent-watermarks all") @@ -920,11 +935,14 @@ def pwm_q_multi(namespace): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -def pwm_q_all(namespace): +@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +def pwm_q_all(namespace, json_output): """Show persistent WM for all queues""" command = ['watermarkstat', '-p', '-t', 'q_shared_all'] if namespace is not None: command += ['-n', str(namespace)] + if json_output: + command += ["-j"] run_command(command) # From a6392b66735d9632e6932e4dbe6143dcd34e4361 Mon Sep 17 00:00:00 2001 From: vikumarks Date: Fri, 9 May 2025 17:23:18 -0700 Subject: [PATCH 2/2] pre-commit checks fixes --- show/main.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/show/main.py b/show/main.py index 9f1f8129c8..aa0b2b05dc 100755 --- a/show/main.py +++ b/show/main.py @@ -835,7 +835,7 @@ def watermark(): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +@click.option('--json', '-j', 'json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") def wm_q_uni(namespace, json_output): """Show user WM for unicast queues""" command = ['watermarkstat', '-t', 'q_shared_uni'] @@ -855,7 +855,7 @@ def wm_q_uni(namespace, json_output): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +@click.option('--json', '-j', 'json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") def wm_q_multi(namespace, json_output): """Show user WM for multicast queues""" command = ['watermarkstat', '-t', 'q_shared_multi'] @@ -875,7 +875,7 @@ def wm_q_multi(namespace, json_output): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +@click.option('--json', '-j', 'json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") def wm_q_all(namespace, json_output): """Show user WM for all queues""" command = ['watermarkstat', '-t', 'q_shared_all'] @@ -904,7 +904,7 @@ def persistent_watermark(): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +@click.option('--json', '-j', 'json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") def pwm_q_uni(namespace, json_output): """Show persistent WM for unicast queues""" command = ['watermarkstat', '-p', '-t', 'q_shared_uni'] @@ -924,7 +924,7 @@ def pwm_q_uni(namespace, json_output): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +@click.option('--json', '-j', 'json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") def pwm_q_multi(namespace, json_output): """Show persistent WM for multicast queues""" command = ['watermarkstat', '-p', '-t', 'q_shared_multi'] @@ -944,7 +944,7 @@ def pwm_q_multi(namespace, json_output): show_default=True, help='Namespace name or all', callback=multi_asic_util.multi_asic_namespace_validation_callback) -@click.option('--json','-j','json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") +@click.option('--json', '-j', 'json_output', is_flag=True, default=False, show_default=True, help="Display JSON output") def pwm_q_all(namespace, json_output): """Show persistent WM for all queues""" command = ['watermarkstat', '-p', '-t', 'q_shared_all']