From a11b0103cf7153f12f41484165342e58e5a104fe Mon Sep 17 00:00:00 2001 From: Jiashuo Li Date: Wed, 11 Mar 2020 16:55:48 +0800 Subject: [PATCH] add experimental tag --- src/azure-cli-core/azure/cli/core/__init__.py | 8 ++++- src/azure-cli-core/azure/cli/core/_help.py | 1 + .../azure/cli/core/commands/__init__.py | 31 ++++++++++++++++++- .../azure/cli/core/commands/arm.py | 1 + .../azure/cli/core/commands/constants.py | 3 +- src/azure-cli-core/azure/cli/core/parser.py | 1 + 6 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/__init__.py b/src/azure-cli-core/azure/cli/core/__init__.py index b4ab074a924..bb80d5ade7d 100644 --- a/src/azure-cli-core/azure/cli/core/__init__.py +++ b/src/azure-cli-core/azure/cli/core/__init__.py @@ -18,6 +18,7 @@ from knack.introspection import extract_args_from_signature, extract_full_summary_from_signature from knack.log import get_logger from knack.preview import PreviewItem +from knack.experimental import ExperimentalItem from knack.util import CLIError from knack.arguments import ArgumentsContext, CaseInsensitiveList # pylint: disable=unused-import @@ -162,7 +163,7 @@ def _update_command_table_from_modules(args): # Changing this error message requires updating CI script that checks for failed # module loading. import azure.cli.core.telemetry as telemetry - logger.error("Error loading command module '%s'", mod) + logger.error("Error loading command module '%s': %s", mod, ex) telemetry.set_exception(exception=ex, fault_type='module-load-error-' + mod, summary='Error loading module: {}'.format(mod)) logger.debug(traceback.format_exc()) @@ -451,6 +452,11 @@ def command_group(self, group_name, command_type=None, **kwargs): target=group_name, object_type='command group' ) + if kwargs.get('is_experimental', False): + kwargs['experimental_info'] = ExperimentalItem( + target=group_name, + object_type='command group' + ) return self._command_group_cls(self, group_name, **kwargs) def argument_context(self, scope, **kwargs): diff --git a/src/azure-cli-core/azure/cli/core/_help.py b/src/azure-cli-core/azure/cli/core/_help.py index 500dbeebafb..459deb9147a 100644 --- a/src/azure-cli-core/azure/cli/core/_help.py +++ b/src/azure-cli-core/azure/cli/core/_help.py @@ -285,6 +285,7 @@ def __init__(self, help_ctx, delimiters, parser): 'name_source': [action.metavar or action.dest], 'deprecate_info': getattr(action, 'deprecate_info', None), 'preview_info': getattr(action, 'preview_info', None), + 'experimental_info': getattr(action, 'experimental_info', None), 'description': action.help, 'choices': action.choices, 'required': False, diff --git a/src/azure-cli-core/azure/cli/core/commands/__init__.py b/src/azure-cli-core/azure/cli/core/commands/__init__.py index bf9e43ccb05..d684491559c 100644 --- a/src/azure-cli-core/azure/cli/core/commands/__init__.py +++ b/src/azure-cli-core/azure/cli/core/commands/__init__.py @@ -34,6 +34,7 @@ from knack.deprecation import ImplicitDeprecated, resolve_deprecate_info from knack.invocation import CommandInvoker from knack.preview import ImplicitPreviewItem, PreviewItem, resolve_preview_info +from knack.experimental import ImplicitExperimentalItem, ExperimentalItem, resolve_experimental_info from knack.log import get_logger from knack.util import CLIError, CommandResultItem, todict from knack.events import EVENT_INVOKER_TRANSFORM_RESULT @@ -724,11 +725,31 @@ def _resolve_preview_and_deprecation_warnings(self, cmd, parsed_args): del preview_kwargs['_get_message'] previews.append(ImplicitPreviewItem(**preview_kwargs)) + experimentals = [] + getattr(parsed_args, '_argument_experimentals', []) + if cmd.experimental_info: + experimentals.append(cmd.experimental_info) + else: + # search for implicit command experimental status + path_comps = cmd.name.split()[:-1] + implicit_experimental_info = None + while path_comps and not implicit_experimental_info: + implicit_experimental_info = resolve_experimental_info(self.cli_ctx, ' '.join(path_comps)) + del path_comps[-1] + + if implicit_experimental_info: + experimental_kwargs = implicit_experimental_info.__dict__.copy() + experimental_kwargs['object_type'] = 'command' + del experimental_kwargs['_get_tag'] + del experimental_kwargs['_get_message'] + experimentals.append(ImplicitExperimentalItem(**experimental_kwargs)) + colorama.init() for d in deprecations: print(d.message, file=sys.stderr) for p in previews: - print(p.message, file=sys.stderr) + print(p.message, file=sys.stderr) + for e in experimentals: + print(e.message, file=sys.stderr) colorama.deinit() def _resolve_extension_override_warning(self, cmd): # pylint: disable=no-self-use @@ -1162,6 +1183,11 @@ def _command(self, name, method_name, custom_command=False, **kwargs): self.command_loader.cli_ctx, object_type='command' ) + if kwargs.get('is_experimental', False): + merged_kwargs['experimental_info'] = ExperimentalItem( + self.command_loader.cli_ctx, + object_type='command' + ) operations_tmpl = merged_kwargs['operations_tmpl'] command_name = '{} {}'.format(self.group_name, name) if self.group_name else name self.command_loader._cli_command(command_name, # pylint: disable=protected-access @@ -1204,6 +1230,7 @@ def generic_update_command(self, name, getter_name='get', getter_type=None, # don't inherit deprecation or preview info from command group merged_kwargs['deprecate_info'] = kwargs.get('deprecate_info', None) merged_kwargs['preview_info'] = kwargs.get('preview_info', None) + merged_kwargs['experimental_info'] = kwargs.get('experimental_info', None) getter_op = self._resolve_operation(merged_kwargs, getter_name, getter_type) setter_op = self._resolve_operation(merged_kwargs, setter_name, setter_type) @@ -1237,6 +1264,7 @@ def _wait_command(self, name, getter_name='get', getter_type=None, custom_comman # don't inherit deprecation or preview info from command group merged_kwargs['deprecate_info'] = kwargs.get('deprecate_info', None) merged_kwargs['preview_info'] = kwargs.get('preview_info', None) + merged_kwargs['experimental_info'] = kwargs.get('experimental_info', None) if getter_type: merged_kwargs = _merge_kwargs(getter_type.settings, merged_kwargs, CLI_COMMAND_KWARGS) @@ -1257,6 +1285,7 @@ def _show_command(self, name, getter_name='get', getter_type=None, custom_comman # don't inherit deprecation or preview info from command group merged_kwargs['deprecate_info'] = kwargs.get('deprecate_info', None) merged_kwargs['preview_info'] = kwargs.get('preview_info', None) + merged_kwargs['experimental_info'] = kwargs.get('experimental_info', None) if getter_type: merged_kwargs = _merge_kwargs(getter_type.settings, merged_kwargs, CLI_COMMAND_KWARGS) diff --git a/src/azure-cli-core/azure/cli/core/commands/arm.py b/src/azure-cli-core/azure/cli/core/commands/arm.py index d0fdd3c523c..20aeaf50364 100644 --- a/src/azure-cli-core/azure/cli/core/commands/arm.py +++ b/src/azure-cli-core/azure/cli/core/commands/arm.py @@ -224,6 +224,7 @@ def add_ids_arguments(_, **kwargs): # pylint: disable=unused-argument 'dest': 'ids' if id_arg else '_ids', 'deprecate_info': deprecate_info, 'is_preview': id_arg.settings.get('is_preview', None) if id_arg else None, + 'is_experimental': id_arg.settings.get('is_experimental', None) if id_arg else None, 'nargs': '+', 'arg_group': group_name } diff --git a/src/azure-cli-core/azure/cli/core/commands/constants.py b/src/azure-cli-core/azure/cli/core/commands/constants.py index ed9dfe710fb..bf15c7bf219 100644 --- a/src/azure-cli-core/azure/cli/core/commands/constants.py +++ b/src/azure-cli-core/azure/cli/core/commands/constants.py @@ -8,7 +8,8 @@ CLI_COMMON_KWARGS = ['min_api', 'max_api', 'resource_type', 'operation_group', - 'custom_command_type', 'command_type', 'is_preview', 'preview_info'] + 'custom_command_type', 'command_type', 'is_preview', 'preview_info', + 'is_experimental', 'experimental_info'] CLI_COMMAND_KWARGS = ['transform', 'table_transformer', 'confirmation', 'exception_handler', 'client_factory', 'operations_tmpl', 'no_wait_param', 'supports_no_wait', 'validator', diff --git a/src/azure-cli-core/azure/cli/core/parser.py b/src/azure-cli-core/azure/cli/core/parser.py index c93530d373b..83615ab86b5 100644 --- a/src/azure-cli-core/azure/cli/core/parser.py +++ b/src/azure-cli-core/azure/cli/core/parser.py @@ -119,6 +119,7 @@ def load_command_table(self, command_loader): param.completer = arg.completer param.deprecate_info = arg.deprecate_info param.preview_info = arg.preview_info + param.experimental_info = arg.experimental_info command_parser.set_defaults( func=metadata, command=command_name,