From 2447912c75009346475d60ae4ab3fb22d73c59c3 Mon Sep 17 00:00:00 2001 From: Feng Zhou Date: Wed, 8 Apr 2020 13:45:05 +0800 Subject: [PATCH 1/5] modify update instruction --- src/azure-cli-core/azure/cli/core/__init__.py | 21 ++++++++++++++++--- .../azure/cli/core/_environment.py | 3 +++ .../azure/cli/core/telemetry.py | 3 ++- .../azure/cli/core/tests/test_util.py | 3 ++- src/azure-cli-core/azure/cli/core/util.py | 5 +---- .../cli/command_modules/feedback/custom.py | 3 ++- 6 files changed, 28 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 17464c0cf8d..ad77e0c88f4 100644 --- a/src/azure-cli-core/azure/cli/core/__init__.py +++ b/src/azure-cli-core/azure/cli/core/__init__.py @@ -96,9 +96,24 @@ def show_version(self): if updates_available == -1: logger.warning('Unable to check if your CLI is up-to-date. Check your internet connection.') elif updates_available: - logger.warning('You have %i updates available. Consider updating your CLI installation. ' - 'Instructions can be found at https://docs.microsoft.com/en-us/cli/azure/install-azure-cli', - updates_available) + warning_msg = 'You have %i updates available. Consider updating your CLI installation' + from azure.cli.core._environment import _ENV_AZ_INSTALLER + installer = os.getenv(_ENV_AZ_INSTALLER) + if installer == 'RPM': + warning_msg += ' with \'sudo yum update azure-cli\'' + elif installer == 'DEB': + warning_msg += ' with \'sudo apt-get update && sudo apt-get install --only-upgrade -y azure-cli\'' + elif installer == 'HOMEBREW': + warning_msg += ' with \'brew update && brew upgrade azure-cli\'' + elif installer == 'PIP': + warning_msg += ' with \'pip install --upgrade azure-cli\'' + elif installer == 'DOCKER': + warning_msg += ' with \'docker pull mcr.microsoft.com/azure-cli\'' + elif installer == 'MSI': + warning_msg += " with the latest MSI https://aka.ms/installazurecliwindows" + else: + warning_msg += '. Instructions can be found at https://docs.microsoft.com/en-us/cli/azure/install-azure-cli' # pylint: disable=line-too-long + logger.warning(warning_msg, updates_available) else: print('Your CLI is up-to-date.') diff --git a/src/azure-cli-core/azure/cli/core/_environment.py b/src/azure-cli-core/azure/cli/core/_environment.py index 228addf0ba9..b27d29b4e3b 100644 --- a/src/azure-cli-core/azure/cli/core/_environment.py +++ b/src/azure-cli-core/azure/cli/core/_environment.py @@ -4,6 +4,9 @@ # -------------------------------------------------------------------------------------------- +_ENV_AZ_INSTALLER = 'AZ_INSTALLER' + + def get_config_dir(): import os return os.getenv('AZURE_CONFIG_DIR', None) or os.path.expanduser(os.path.join('~', '.azure')) diff --git a/src/azure-cli-core/azure/cli/core/telemetry.py b/src/azure-cli-core/azure/cli/core/telemetry.py index 95d114d4004..56594e4349b 100644 --- a/src/azure-cli-core/azure/cli/core/telemetry.py +++ b/src/azure-cli-core/azure/cli/core/telemetry.py @@ -173,7 +173,8 @@ def _get_azure_cli_properties(self): set_custom_properties(result, 'Feedback', self.feedback) set_custom_properties(result, 'ExtensionManagementDetail', self.extension_management_detail) set_custom_properties(result, 'Mode', self.mode) - set_custom_properties(result, 'Installer', os.getenv('AZ_INSTALLER')) + from azure.cli.core._environment import _ENV_AZ_INSTALLER + set_custom_properties(result, 'Installer', os.getenv(_ENV_AZ_INSTALLER)) return result diff --git a/src/azure-cli-core/azure/cli/core/tests/test_util.py b/src/azure-cli-core/azure/cli/core/tests/test_util.py index af7efb0c8ab..178cd8a567d 100644 --- a/src/azure-cli-core/azure/cli/core/tests/test_util.py +++ b/src/azure-cli-core/azure/cli/core/tests/test_util.py @@ -213,7 +213,8 @@ def test_configured_default_setter(self): @mock.patch('azure.cli.core.__version__', '7.8.9') def test_get_az_user_agent(self): - with mock.patch.dict('os.environ', {'AZ_INSTALLER': 'PIP'}): + from azure.cli.core._environment import _ENV_AZ_INSTALLER + with mock.patch.dict('os.environ', {_ENV_AZ_INSTALLER: 'PIP'}): actual = get_az_user_agent() self.assertEqual(actual, 'AZURECLI/7.8.9 (PIP)') diff --git a/src/azure-cli-core/azure/cli/core/util.py b/src/azure-cli-core/azure/cli/core/util.py index b4b4d14ffd4..f9d07313e16 100644 --- a/src/azure-cli-core/azure/cli/core/util.py +++ b/src/azure-cli-core/azure/cli/core/util.py @@ -200,9 +200,6 @@ def _get_version_string(name, version_dict): _print() _print('Legal docs and information: aka.ms/AzureCliLegal') _print() - if sys.version.startswith('2.7'): - _print("* DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. \nA future version of Azure CLI will drop support for Python 2.7.") - _print() version_string = output.getvalue() # if unable to query PyPI, use sentinel value to flag that @@ -805,8 +802,8 @@ def get_az_user_agent(): agents = ["AZURECLI/{}".format(core_version)] - _ENV_AZ_INSTALLER = 'AZ_INSTALLER' import os + from azure.cli.core._environment import _ENV_AZ_INSTALLER if _ENV_AZ_INSTALLER in os.environ: agents.append('({})'.format(os.environ[_ENV_AZ_INSTALLER])) diff --git a/src/azure-cli/azure/cli/command_modules/feedback/custom.py b/src/azure-cli/azure/cli/command_modules/feedback/custom.py index 4383498eae0..a322c3db120 100644 --- a/src/azure-cli/azure/cli/command_modules/feedback/custom.py +++ b/src/azure-cli/azure/cli/command_modules/feedback/custom.py @@ -515,7 +515,8 @@ def _build_issue_info_tup(command_log_file=None): format_dict["python_info"] = "Python {}".format(platform.python_version()) format_dict["platform"] = "{}".format(platform.platform()) format_dict["auto_gen_comment"] = _AUTO_GEN_COMMENT - format_dict["installer"] = "Installer: {}".format(os.getenv('AZ_INSTALLER') or '') + from azure.cli.core._environment import _ENV_AZ_INSTALLER + format_dict["installer"] = "Installer: {}".format(os.getenv(_ENV_AZ_INSTALLER) or '') pretty_url_name = _get_extension_repo_url(ext_name) if is_ext else _CLI_ISSUES_URL From 4bdf5b4cb2f21ea75fd064af48969a525ca90e3f Mon Sep 17 00:00:00 2001 From: Feng Zhou Date: Sun, 12 Apr 2020 20:58:46 +0800 Subject: [PATCH 2/5] add instruction link for version update --- src/azure-cli-core/azure/cli/core/__init__.py | 46 +++++++++++++------ src/azure-cli-core/azure/cli/core/util.py | 19 ++++++++ 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/__init__.py b/src/azure-cli-core/azure/cli/core/__init__.py index ad77e0c88f4..1adf9cfa06f 100644 --- a/src/azure-cli-core/azure/cli/core/__init__.py +++ b/src/azure-cli-core/azure/cli/core/__init__.py @@ -2,6 +2,8 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- +# pylint: disable=line-too-long + from __future__ import print_function __version__ = "2.3.1" @@ -29,6 +31,15 @@ 'content_version', 'kwargs', 'client', 'no_wait'] EVENT_FAILED_EXTENSION_LOAD = 'MainLoader.OnFailedExtensionLoad' +_PACKAGE_UPGRADE_INSTRUCTIONS = {"YUM": ("sudo yum update -y azure-cli", "https://docs.microsoft.com/cli/azure/install-azure-cli-yum?view=azure-cli-latest#update"), + "ZYPPER": ("sudo zypper refresh && sudo zypper update -y azure-cli", "https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-zypper?view=azure-cli-latest#update"), + "DEB": ("sudo apt-get update && sudo apt-get install --only-upgrade -y azure-cli", "https://docs.microsoft.com/cli/azure/install-azure-cli-apt?view=azure-cli-latest#update"), + "HOMEBREW": ("brew update && brew upgrade azure-cli", "https://docs.microsoft.com/cli/azure/install-azure-cli-macos?view=azure-cli-latest#update"), + "PIP": ("curl -L https://aka.ms/InstallAzureCli | bash", "https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-linux?view=azure-cli-latest#install-or-update"), + "MSI": ("https://aka.ms/installazurecliwindows", "https://docs.microsoft.com/cli/azure/install-azure-cli-windows?view=azure-cli-latest#install-or-update"), + "DOCKER": ("docker pull mcr.microsoft.com/azure-cli", "https://docs.microsoft.com/en-us/cli/azure/run-azure-cli-docker?view=azure-cli-latest#update-docker-image")} + +_GENERAL_UPGRADE_INSTRUCTION = 'Instructions can be found at https://docs.microsoft.com/en-us/cli/azure/install-azure-cli' class AzCli(CLI): @@ -99,20 +110,29 @@ def show_version(self): warning_msg = 'You have %i updates available. Consider updating your CLI installation' from azure.cli.core._environment import _ENV_AZ_INSTALLER installer = os.getenv(_ENV_AZ_INSTALLER) - if installer == 'RPM': - warning_msg += ' with \'sudo yum update azure-cli\'' - elif installer == 'DEB': - warning_msg += ' with \'sudo apt-get update && sudo apt-get install --only-upgrade -y azure-cli\'' - elif installer == 'HOMEBREW': - warning_msg += ' with \'brew update && brew upgrade azure-cli\'' - elif installer == 'PIP': - warning_msg += ' with \'pip install --upgrade azure-cli\'' - elif installer == 'DOCKER': - warning_msg += ' with \'docker pull mcr.microsoft.com/azure-cli\'' - elif installer == 'MSI': - warning_msg += " with the latest MSI https://aka.ms/installazurecliwindows" + instruction_msg = '' + if installer in _PACKAGE_UPGRADE_INSTRUCTIONS: + if installer == 'RPM': + from azure.cli.core.util import get_linux_distro + distname, _ = get_linux_distro() + if not distname: + instruction_msg = '. {}'.format(_GENERAL_UPGRADE_INSTRUCTION) + else: + distname = distname.lower().strip() + if any(x in distname for x in ['centos', 'rhel', 'red hat', 'fedora']): + installer = 'YUM' + elif any(x in distname for x in ['opensuse', 'suse', 'sles']): + installer = 'ZYPPER' + else: + instruction_msg = '. {}'.format(_GENERAL_UPGRADE_INSTRUCTION) + elif installer == 'PIP': + instruction_msg = " with 'pip install --upgrade azure-cli' or '{}' if you used our script for installing. Detailed instructions can be found at {}".format(_PACKAGE_UPGRADE_INSTRUCTIONS[installer][0], _PACKAGE_UPGRADE_INSTRUCTIONS[installer][1]) + if instruction_msg: + warning_msg += instruction_msg + else: + warning_msg += " with '{}'. Detailed instructions can be found at {}".format(_PACKAGE_UPGRADE_INSTRUCTIONS[installer][0], _PACKAGE_UPGRADE_INSTRUCTIONS[installer][1]) else: - warning_msg += '. Instructions can be found at https://docs.microsoft.com/en-us/cli/azure/install-azure-cli' # pylint: disable=line-too-long + warning_msg += '. {}'.format(_GENERAL_UPGRADE_INSTRUCTION) logger.warning(warning_msg, updates_available) else: print('Your CLI is up-to-date.') diff --git a/src/azure-cli-core/azure/cli/core/util.py b/src/azure-cli-core/azure/cli/core/util.py index f9d07313e16..7cfdff55bb6 100644 --- a/src/azure-cli-core/azure/cli/core/util.py +++ b/src/azure-cli-core/azure/cli/core/util.py @@ -825,3 +825,22 @@ def user_confirmation(message, yes=False): except NoTTYException: raise CLIError( 'Unable to prompt for confirmation as no tty available. Use --yes.') + + +def get_linux_distro(): + if platform.system() != 'Linux': + return None, None + + try: + with open('/etc/os-release') as lines: + tokens = [line.strip() for line in lines] + except Exception: # pylint: disable=broad-except + return None, None + + release_info = {} + for token in tokens: + if '=' in token: + k, v = token.split('=', 1) + release_info[k.lower()] = v.strip('"') + + return release_info.get('name', None), release_info.get('version_id', None) From fa9fed4fdcbc4320408b033a4bc2921f38abe841 Mon Sep 17 00:00:00 2001 From: Feng Zhou Date: Mon, 13 Apr 2020 13:50:59 +0800 Subject: [PATCH 3/5] use short link for instruction pages --- src/azure-cli-core/azure/cli/core/__init__.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/__init__.py b/src/azure-cli-core/azure/cli/core/__init__.py index 1adf9cfa06f..e76044f18f8 100644 --- a/src/azure-cli-core/azure/cli/core/__init__.py +++ b/src/azure-cli-core/azure/cli/core/__init__.py @@ -31,15 +31,15 @@ 'content_version', 'kwargs', 'client', 'no_wait'] EVENT_FAILED_EXTENSION_LOAD = 'MainLoader.OnFailedExtensionLoad' -_PACKAGE_UPGRADE_INSTRUCTIONS = {"YUM": ("sudo yum update -y azure-cli", "https://docs.microsoft.com/cli/azure/install-azure-cli-yum?view=azure-cli-latest#update"), - "ZYPPER": ("sudo zypper refresh && sudo zypper update -y azure-cli", "https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-zypper?view=azure-cli-latest#update"), - "DEB": ("sudo apt-get update && sudo apt-get install --only-upgrade -y azure-cli", "https://docs.microsoft.com/cli/azure/install-azure-cli-apt?view=azure-cli-latest#update"), - "HOMEBREW": ("brew update && brew upgrade azure-cli", "https://docs.microsoft.com/cli/azure/install-azure-cli-macos?view=azure-cli-latest#update"), - "PIP": ("curl -L https://aka.ms/InstallAzureCli | bash", "https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-linux?view=azure-cli-latest#install-or-update"), - "MSI": ("https://aka.ms/installazurecliwindows", "https://docs.microsoft.com/cli/azure/install-azure-cli-windows?view=azure-cli-latest#install-or-update"), - "DOCKER": ("docker pull mcr.microsoft.com/azure-cli", "https://docs.microsoft.com/en-us/cli/azure/run-azure-cli-docker?view=azure-cli-latest#update-docker-image")} - -_GENERAL_UPGRADE_INSTRUCTION = 'Instructions can be found at https://docs.microsoft.com/en-us/cli/azure/install-azure-cli' +_PACKAGE_UPGRADE_INSTRUCTIONS = {"YUM": ("sudo yum update -y azure-cli", "https://aka.ms/doc/UpdateAzureCliYum"), + "ZYPPER": ("sudo zypper refresh && sudo zypper update -y azure-cli", "https://aka.ms/doc/UpdateAzureCliZypper"), + "DEB": ("sudo apt-get update && sudo apt-get install --only-upgrade -y azure-cli", "https://aka.ms/doc/UpdateAzureCliApt"), + "HOMEBREW": ("brew update && brew upgrade azure-cli", "https://aka.ms/doc/UpdateAzureCliHomebrew"), + "PIP": ("curl -L https://aka.ms/InstallAzureCli | bash", "https://aka.ms/doc/UpdateAzureCliLinux"), + "MSI": ("https://aka.ms/installazurecliwindows", "https://aka.ms/doc/UpdateAzureCliMsi"), + "DOCKER": ("docker pull mcr.microsoft.com/azure-cli", "https://aka.ms/doc/UpdateAzureCliDocker")} + +_GENERAL_UPGRADE_INSTRUCTION = 'Instructions can be found at https://aka.ms/doc/InstallAzureCli' class AzCli(CLI): From 2b30229f9cd6ff0061e95faa7e0e094d41ddd925 Mon Sep 17 00:00:00 2001 From: Feng Zhou Date: Mon, 13 Apr 2020 14:55:25 +0800 Subject: [PATCH 4/5] fix style --- src/azure-cli-core/azure/cli/core/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/azure-cli-core/azure/cli/core/__init__.py b/src/azure-cli-core/azure/cli/core/__init__.py index e76044f18f8..029ea89f5d2 100644 --- a/src/azure-cli-core/azure/cli/core/__init__.py +++ b/src/azure-cli-core/azure/cli/core/__init__.py @@ -41,6 +41,7 @@ _GENERAL_UPGRADE_INSTRUCTION = 'Instructions can be found at https://aka.ms/doc/InstallAzureCli' + class AzCli(CLI): def __init__(self, **kwargs): From e88a442af0b195b53509a1c1ab5b0d896e7c2c68 Mon Sep 17 00:00:00 2001 From: Feng Zhou Date: Tue, 14 Apr 2020 19:08:43 +0800 Subject: [PATCH 5/5] modify pip instruction --- src/azure-cli-core/azure/cli/core/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/azure-cli-core/azure/cli/core/__init__.py b/src/azure-cli-core/azure/cli/core/__init__.py index 029ea89f5d2..1a757cd7fc1 100644 --- a/src/azure-cli-core/azure/cli/core/__init__.py +++ b/src/azure-cli-core/azure/cli/core/__init__.py @@ -127,7 +127,10 @@ def show_version(self): else: instruction_msg = '. {}'.format(_GENERAL_UPGRADE_INSTRUCTION) elif installer == 'PIP': - instruction_msg = " with 'pip install --upgrade azure-cli' or '{}' if you used our script for installing. Detailed instructions can be found at {}".format(_PACKAGE_UPGRADE_INSTRUCTIONS[installer][0], _PACKAGE_UPGRADE_INSTRUCTIONS[installer][1]) + import platform + system = platform.system() + alternative_command = " or '{}' if you used our script for installation. Detailed instructions can be found at {}".format(_PACKAGE_UPGRADE_INSTRUCTIONS[installer][0], _PACKAGE_UPGRADE_INSTRUCTIONS[installer][1]) if system != 'Windows' else '' + instruction_msg = " with 'pip install --upgrade azure-cli'{}".format(alternative_command) if instruction_msg: warning_msg += instruction_msg else: