From 49a797f36e13f1eba804fdb562dc082584aa6343 Mon Sep 17 00:00:00 2001 From: Maisam Arif Date: Mon, 16 Oct 2023 06:24:42 -0500 Subject: [PATCH] Fixed set & reset parser no argument handling Change-Id: If8161059810a9a4fc7845eb4ffd6d3dbd0e8df64 Signed-off-by: Maisam Arif [ROCm/amdsmi commit: 5405615062688391f9884e04386e06027e0d19cd] --- .../amdsmi_cli/amdsmi_cli_exceptions.py | 19 ++++++++ projects/amdsmi/amdsmi_cli/amdsmi_commands.py | 12 +++++ projects/amdsmi/amdsmi_cli/amdsmi_parser.py | 46 ++++++++++--------- 3 files changed, 55 insertions(+), 22 deletions(-) diff --git a/projects/amdsmi/amdsmi_cli/amdsmi_cli_exceptions.py b/projects/amdsmi/amdsmi_cli/amdsmi_cli_exceptions.py index 13fe9753eb..e42fc9f9f2 100644 --- a/projects/amdsmi/amdsmi_cli/amdsmi_cli_exceptions.py +++ b/projects/amdsmi/amdsmi_cli/amdsmi_cli_exceptions.py @@ -61,6 +61,7 @@ def _get_error_message(error_code): return AMDSMI_ERROR_MESSAGES[abs(error_code)] return "Generic error" + class AmdSmiException(Exception): def __init__(self): self.json_message = {} @@ -125,6 +126,7 @@ class AmdSmiDeviceNotFoundException(AmdSmiException): self.csv_message = f"error,code\n{common_message}, {self.value}" self.stdout_message = f"{common_message} Error code: {self.value}" + class AmdSmiInvalidFilePathException(AmdSmiException): def __init__(self, command, outputformat): super().__init__() @@ -184,6 +186,22 @@ class AmdSmiParameterNotSupportedException(AmdSmiException): self.csv_message = f"error,code\n{common_message}, {self.value}" self.stdout_message = f"{common_message} Error code: {self.value}" + +class AmdSmiRequiredCommandException(AmdSmiException): + def __init__(self, command, outputformat): + super().__init__() + self.value = -9 + self.command = command + self.output_format = outputformat + + common_message = f"Command '{self.command}' requires a target argument. Run '--help' for more info." + + self.json_message["error"] = common_message + self.json_message["code"] = self.value + self.csv_message = f"error,code\n{common_message}, {self.value}" + self.stdout_message = f"{common_message} Error code: {self.value}" + + class AmdSmiUnknownErrorException(AmdSmiException): def __init__(self, command, outputformat): super().__init__() @@ -198,6 +216,7 @@ class AmdSmiUnknownErrorException(AmdSmiException): self.csv_message = f"error,code\n{common_message}, {self.value}" self.stdout_message = f"{common_message} Error code: {self.value}" + class AmdSmiAMDSMIErrorException(AmdSmiException): def __init__(self, outputformat, error_code): super().__init__() diff --git a/projects/amdsmi/amdsmi_cli/amdsmi_commands.py b/projects/amdsmi/amdsmi_cli/amdsmi_commands.py index 7326c83214..36f86fecb9 100644 --- a/projects/amdsmi/amdsmi_cli/amdsmi_commands.py +++ b/projects/amdsmi/amdsmi_cli/amdsmi_commands.py @@ -20,6 +20,7 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # +import argparse import logging import sys import threading @@ -28,6 +29,7 @@ import time from _version import __version__ from amdsmi_helpers import AMDSMIHelpers from amdsmi_logger import AMDSMILogger +from amdsmi_cli_exceptions import AmdSmiRequiredCommandException from amdsmi import amdsmi_interface from amdsmi import amdsmi_exception @@ -1780,6 +1782,11 @@ class AMDSMICommands(): args.gpu = device_handle + # Error if no subcommand args are passed + if not any([args.fan, args.perflevel, args.profile, args.perfdeterminism]): + command = " ".join(sys.argv[1:]) + raise AmdSmiRequiredCommandException(command, self.logger.format) + # Build GPU string for errors try: gpu_bdf = amdsmi_interface.amdsmi_get_gpu_device_bdf(args.gpu) @@ -1904,6 +1911,11 @@ class AMDSMICommands(): # Get gpu_id for logging gpu_id = self.helpers.get_gpu_id_from_device_handle(args.gpu) + # Error if no subcommand args are passed + if not any([args.gpureset, args.clocks, args.fans, args.profile, args.xgmierr, args.perfdeterminism]): + command = " ".join(sys.argv[1:]) + raise AmdSmiRequiredCommandException(command, self.logger.format) + if args.gpureset: if self.helpers.is_amd_device(args.gpu): try: diff --git a/projects/amdsmi/amdsmi_cli/amdsmi_parser.py b/projects/amdsmi/amdsmi_cli/amdsmi_parser.py index 8ad7686f86..27c42f696f 100644 --- a/projects/amdsmi/amdsmi_cli/amdsmi_parser.py +++ b/projects/amdsmi/amdsmi_cli/amdsmi_parser.py @@ -281,6 +281,8 @@ class AMDSMIParser(argparse.ArgumentParser): version_parser._optionals.title = None version_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) version_parser.set_defaults(func=func) + + # Add Universal Arguments self._add_command_modifiers(version_parser) @@ -298,10 +300,8 @@ class AMDSMIParser(argparse.ArgumentParser): list_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) list_parser.set_defaults(func=func) - # Add Command Modifiers + # Add Universal Arguments self._add_command_modifiers(list_parser) - - # Add Device args self._add_device_arguments(list_parser, required=False) @@ -337,9 +337,9 @@ class AMDSMIParser(argparse.ArgumentParser): static_parser._optionals.title = static_optionals_title static_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) static_parser.set_defaults(func=func) - self._add_command_modifiers(static_parser) - # Add Device args + # Add Universal Arguments + self._add_command_modifiers(static_parser) self._add_device_arguments(static_parser, required=False) # Optional Args @@ -381,9 +381,9 @@ class AMDSMIParser(argparse.ArgumentParser): firmware_parser._optionals.title = firmware_optionals_title firmware_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) firmware_parser.set_defaults(func=func) - self._add_command_modifiers(firmware_parser) - # Add Device args + # Add Universal Arguments + self._add_command_modifiers(firmware_parser) self._add_device_arguments(firmware_parser, required=False) # Optional Args @@ -414,9 +414,9 @@ class AMDSMIParser(argparse.ArgumentParser): bad_pages_parser._optionals.title = bad_pages_optionals_title bad_pages_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) bad_pages_parser.set_defaults(func=func) - self._add_command_modifiers(bad_pages_parser) - # Add Device args + # Add Universal Arguments + self._add_command_modifiers(bad_pages_parser) self._add_device_arguments(bad_pages_parser, required=False) # Optional Args @@ -464,9 +464,9 @@ class AMDSMIParser(argparse.ArgumentParser): metric_parser._optionals.title = metric_optionals_title metric_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) metric_parser.set_defaults(func=func) - self._add_command_modifiers(metric_parser) - # Add Device args + # Add Universal Arguments + self._add_command_modifiers(metric_parser) self._add_device_arguments(metric_parser, required=False) # Add Watch args @@ -527,9 +527,9 @@ class AMDSMIParser(argparse.ArgumentParser): process_parser._optionals.title = process_optionals_title process_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) process_parser.set_defaults(func=func) - self._add_command_modifiers(process_parser) - # Add Device args + # Add Universal Arguments + self._add_command_modifiers(process_parser) self._add_device_arguments(process_parser, required=False) # Add Watch args @@ -557,9 +557,9 @@ class AMDSMIParser(argparse.ArgumentParser): profile_parser._optionals.title = profile_optionals_title profile_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) profile_parser.set_defaults(func=func) - self._add_command_modifiers(profile_parser) - # Add Device args + # Add Universal Arguments + self._add_command_modifiers(profile_parser) self._add_device_arguments(profile_parser, required=False) @@ -578,9 +578,9 @@ class AMDSMIParser(argparse.ArgumentParser): event_parser._optionals.title = event_optionals_title event_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) event_parser.set_defaults(func=func) - self._add_command_modifiers(event_parser) - # Add Device args + # Add Universal Arguments + self._add_command_modifiers(event_parser) self._add_device_arguments(event_parser, required=False) @@ -607,9 +607,9 @@ class AMDSMIParser(argparse.ArgumentParser): topology_parser._optionals.title = topology_optionals_title topology_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) topology_parser.set_defaults(func=func) - self._add_command_modifiers(topology_parser) - # Add Device args + # Add Universal Arguments + self._add_command_modifiers(topology_parser) self._add_device_arguments(topology_parser, required=False) # Optional Args @@ -644,8 +644,9 @@ class AMDSMIParser(argparse.ArgumentParser): set_value_parser._optionals.title = set_value_optionals_title set_value_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) set_value_parser.set_defaults(func=func) - self._add_command_modifiers(set_value_parser) + # Add Universal Arguments + self._add_command_modifiers(set_value_parser) # Device args are required as safeguard from the user applying the operation to all gpus unintentionally self._add_device_arguments(set_value_parser, required=True) @@ -777,12 +778,13 @@ class AMDSMIParser(argparse.ArgumentParser): reset_parser._optionals.title = reset_optionals_title reset_parser.formatter_class=lambda prog: AMDSMISubparserHelpFormatter(prog) reset_parser.set_defaults(func=func) - self._add_command_modifiers(reset_parser) + # Add Universal Arguments + self._add_command_modifiers(reset_parser) # Device args are required as safeguard from the user applying the operation to all gpus unintentionally self._add_device_arguments(reset_parser, required=True) - # Optional Args + # Add reset arguments reset_parser.add_argument('-G', '--gpureset', action='store_true', required=False, help=gpureset_help) reset_parser.add_argument('-c', '--clocks', action='store_true', required=False, help=reset_clocks_help) reset_parser.add_argument('-f', '--fans', action='store_true', required=False, help=reset_fans_help)