From a5e6cd26d2fe09ff662fed5889f52d5ddd919400 Mon Sep 17 00:00:00 2001 From: Zunli Hu Date: Wed, 10 Mar 2021 15:26:54 +0800 Subject: [PATCH 1/6] add spinner --- src/azure-cli-core/azure/cli/core/__init__.py | 4 +-- .../azure/cli/core/commands/__init__.py | 14 +++++++--- .../azure/cli/core/commands/progress.py | 27 ++++++++++++++++--- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/__init__.py b/src/azure-cli-core/azure/cli/core/__init__.py index c2b62d8b81d..54b3809a318 100644 --- a/src/azure-cli-core/azure/cli/core/__init__.py +++ b/src/azure-cli-core/azure/cli/core/__init__.py @@ -115,12 +115,12 @@ def refresh_request_id(self): import uuid self.data['headers']['x-ms-client-request-id'] = str(uuid.uuid1()) - def get_progress_controller(self, det=False): + def get_progress_controller(self, det=False, spinner=None): import azure.cli.core.commands.progress as progress if not self.progress_controller: self.progress_controller = progress.ProgressHook() - self.progress_controller.init_progress(progress.get_progress_view(det)) + self.progress_controller.init_progress(progress.get_progress_view(det, spinner=spinner)) return self.progress_controller def get_cli_version(self): 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 087557cf1c1..bffac003b4b 100644 --- a/src/azure-cli-core/azure/cli/core/commands/__init__.py +++ b/src/azure-cli-core/azure/cli/core/commands/__init__.py @@ -30,7 +30,7 @@ get_command_type_kwarg, read_file_content, get_arg_list, poller_classes) from azure.cli.core.local_context import LocalContextAction import azure.cli.core.telemetry as telemetry - +from azure.cli.core.commands.progress import IndeterminateProgressBar from knack.arguments import CLICommandArgument from knack.commands import CLICommand, CommandGroup, PREVIEW_EXPERIMENTAL_CONFLICT_ERROR @@ -869,7 +869,8 @@ def _validate_arg_level(self, ns, **_): # pylint: disable=no-self-use class LongRunningOperation: # pylint: disable=too-few-public-methods - def __init__(self, cli_ctx, start_msg='', finish_msg='', poller_done_interval_ms=1000.0): + def __init__(self, cli_ctx, start_msg='', finish_msg='', poller_done_interval_ms=500.0, + progress_bar=None): self.cli_ctx = cli_ctx self.start_msg = start_msg @@ -877,6 +878,7 @@ def __init__(self, cli_ctx, start_msg='', finish_msg='', poller_done_interval_ms self.poller_done_interval_ms = poller_done_interval_ms self.deploy_dict = {} self.last_progress_report = datetime.datetime.now() + self.progress_bar = progress_bar if progress_bar is not None else IndeterminateProgressBar(cli_ctx) def _delay(self): time.sleep(self.poller_done_interval_ms / 1000.0) @@ -949,15 +951,17 @@ def __call__(self, poller): correlation_message = '' self.cli_ctx.get_progress_controller().begin() + self.progress_bar.start_time = datetime.datetime.utcnow() correlation_id = None cli_logger = get_logger() # get CLI logger which has the level set through command lines is_verbose = any(handler.level <= logs.INFO for handler in cli_logger.handlers) + telemetry.poll_start() poll_flag = False while not poller.done(): poll_flag = True - self.cli_ctx.get_progress_controller().add(message='Running') + try: # pylint: disable=protected-access correlation_id = json.loads( @@ -975,6 +979,7 @@ def __call__(self, poller): except Exception as ex: # pylint: disable=broad-except logger.warning('%s during progress reporting: %s', getattr(type(ex), '__name__', type(ex)), ex) try: + self.progress_bar.update_progress() self._delay() except KeyboardInterrupt: self.cli_ctx.get_progress_controller().stop() @@ -988,9 +993,10 @@ def __call__(self, poller): self.cli_ctx.get_progress_controller().stop() handle_long_running_operation_exception(client_exception) - self.cli_ctx.get_progress_controller().end() + self.progress_bar.end() if poll_flag: telemetry.poll_end() + return result diff --git a/src/azure-cli-core/azure/cli/core/commands/progress.py b/src/azure-cli-core/azure/cli/core/commands/progress.py index 20c70c733b9..5decfba598f 100644 --- a/src/azure-cli-core/azure/cli/core/commands/progress.py +++ b/src/azure-cli-core/azure/cli/core/commands/progress.py @@ -103,10 +103,10 @@ def is_running(self): class IndeterminateStandardOut(ProgressViewBase): """ custom output for progress reporting """ - def __init__(self, out=None): + def __init__(self, out=None, spinner=None): super(IndeterminateStandardOut, self).__init__( out if out else sys.stderr) - self.spinner = None + self.spinner = spinner def write(self, args): """ @@ -166,8 +166,27 @@ def flush(self): self.out.flush() -def get_progress_view(determinant=False, outstream=sys.stderr): +def get_progress_view(determinant=False, outstream=sys.stderr, spinner=None): """ gets your view """ if determinant: return DeterminateStandardOut(out=outstream) - return IndeterminateStandardOut(out=outstream) + return IndeterminateStandardOut(out=outstream, spinner=spinner) + + +class IndeterminateProgressBar: + """ Define progress bar update view """ + def __init__(self, cli_ctx, message="Running"): + self.cli_ctx = cli_ctx + self.message = message + self.hook = self.cli_ctx.get_progress_controller( + det=False, + spinner=humanfriendly.Spinner( # pylint: disable=no-member + label='Running', + stream=sys.stderr, + hide_cursor=False)) + + def update_progress(self): + self.hook.add(message=self.message) + + def end(self): + self.hook.end() From 402e60ab14a6d5e5bcf00421f00c748e47951cf8 Mon Sep 17 00:00:00 2001 From: Zunli Hu Date: Wed, 10 Mar 2021 15:32:55 +0800 Subject: [PATCH 2/6] remove start time --- src/azure-cli-core/azure/cli/core/commands/__init__.py | 1 - 1 file changed, 1 deletion(-) 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 bffac003b4b..06e03a8ff76 100644 --- a/src/azure-cli-core/azure/cli/core/commands/__init__.py +++ b/src/azure-cli-core/azure/cli/core/commands/__init__.py @@ -951,7 +951,6 @@ def __call__(self, poller): correlation_message = '' self.cli_ctx.get_progress_controller().begin() - self.progress_bar.start_time = datetime.datetime.utcnow() correlation_id = None cli_logger = get_logger() # get CLI logger which has the level set through command lines From a235d9c1b972611dc2419da8df5b2de544aaf396 Mon Sep 17 00:00:00 2001 From: Zunli Hu Date: Wed, 10 Mar 2021 16:58:31 +0800 Subject: [PATCH 3/6] fix what if test --- .../resource/tests/latest/test_resource_custom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_custom.py b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_custom.py index e6eae1d0ae5..43178834752 100644 --- a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_custom.py +++ b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_custom.py @@ -412,7 +412,7 @@ def test_what_if_exclude_change_types(self, long_running_operation_stub): ]) # Act. - result = _what_if_deploy_arm_template_core(cmd, mock.MagicMock(), True, ["create", "igNoRE"]) + result = _what_if_deploy_arm_template_core(cmd.cli_ctx, mock.MagicMock(), True, ["create", "igNoRE"]) # Assert. self.assertEqual(1, len(result.changes)) From e88126e04d885cc168fd446b7c1bfd7ea56d0736 Mon Sep 17 00:00:00 2001 From: Zunli Hu Date: Mon, 29 Mar 2021 14:13:22 +0800 Subject: [PATCH 4/6] Apply suggestions from code review Co-authored-by: kai ru <69238381+kairu-ms@users.noreply.github.com> --- src/azure-cli-core/azure/cli/core/commands/__init__.py | 4 ++-- src/azure-cli-core/azure/cli/core/commands/progress.py | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) 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 06e03a8ff76..03021dde0cf 100644 --- a/src/azure-cli-core/azure/cli/core/commands/__init__.py +++ b/src/azure-cli-core/azure/cli/core/commands/__init__.py @@ -981,7 +981,7 @@ def __call__(self, poller): self.progress_bar.update_progress() self._delay() except KeyboardInterrupt: - self.cli_ctx.get_progress_controller().stop() + self.progress_bar.stop() logger.error('Long-running operation wait cancelled. %s', correlation_message) raise @@ -989,7 +989,7 @@ def __call__(self, poller): result = poller.result() except ClientException as client_exception: from azure.cli.core.commands.arm import handle_long_running_operation_exception - self.cli_ctx.get_progress_controller().stop() + self.progress_bar.stop() handle_long_running_operation_exception(client_exception) self.progress_bar.end() diff --git a/src/azure-cli-core/azure/cli/core/commands/progress.py b/src/azure-cli-core/azure/cli/core/commands/progress.py index 5decfba598f..48152289878 100644 --- a/src/azure-cli-core/azure/cli/core/commands/progress.py +++ b/src/azure-cli-core/azure/cli/core/commands/progress.py @@ -185,6 +185,12 @@ def __init__(self, cli_ctx, message="Running"): stream=sys.stderr, hide_cursor=False)) + def begin(self): + self.hook.begin() + + def stop(self): + self.hook.stop() + def update_progress(self): self.hook.add(message=self.message) From c52aa322f06e7242ec46c4167e0d7c7cc3d89252 Mon Sep 17 00:00:00 2001 From: Zunli Hu Date: Mon, 29 Mar 2021 14:32:49 +0800 Subject: [PATCH 5/6] add begin --- src/azure-cli-core/azure/cli/core/commands/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 03021dde0cf..aa02fd83f74 100644 --- a/src/azure-cli-core/azure/cli/core/commands/__init__.py +++ b/src/azure-cli-core/azure/cli/core/commands/__init__.py @@ -950,7 +950,7 @@ def __call__(self, poller): from msrest.exceptions import ClientException correlation_message = '' - self.cli_ctx.get_progress_controller().begin() + self.progress_bar.begin() correlation_id = None cli_logger = get_logger() # get CLI logger which has the level set through command lines From be511b7a296e388ecc6cb8dd17b2d2c3912f26a1 Mon Sep 17 00:00:00 2001 From: Zunli Hu Date: Mon, 29 Mar 2021 14:50:04 +0800 Subject: [PATCH 6/6] fix style --- src/azure-cli-core/azure/cli/core/commands/progress.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azure-cli-core/azure/cli/core/commands/progress.py b/src/azure-cli-core/azure/cli/core/commands/progress.py index 48152289878..94bab249a6d 100644 --- a/src/azure-cli-core/azure/cli/core/commands/progress.py +++ b/src/azure-cli-core/azure/cli/core/commands/progress.py @@ -187,7 +187,7 @@ def __init__(self, cli_ctx, message="Running"): def begin(self): self.hook.begin() - + def stop(self): self.hook.stop()