diff --git a/src/azure-cli-core/azure/cli/core/util.py b/src/azure-cli-core/azure/cli/core/util.py index ae0c55d5ccf..9799fc59686 100644 --- a/src/azure-cli-core/azure/cli/core/util.py +++ b/src/azure-cli-core/azure/cli/core/util.py @@ -204,6 +204,19 @@ def _get_version_string(name, version_dict): return version_string, updates_available +def get_az_version_json(): + from azure.cli.core.extension import get_extensions + versions = {'extensions': {}} + + for dist in get_installed_cli_distributions(): + versions[dist.key] = dist.version + extensions = get_extensions() + if extensions: + for ext in extensions: + versions['extensions'][ext.name] = ext.version or 'Unknown' + return versions + + def get_json_object(json_string): """ Loads a JSON string as an object and converts all keys to snake case """ diff --git a/src/azure-cli/HISTORY.rst b/src/azure-cli/HISTORY.rst index 9579a9a5f9e..a474895e03b 100644 --- a/src/azure-cli/HISTORY.rst +++ b/src/azure-cli/HISTORY.rst @@ -31,6 +31,10 @@ Release History * Fix `vm create` failure in Azure Stack profile. * vm monitor metrics tail/list-definitions: support query metric and list definitions for a vm. +**Misc.** + +* Add preview command `az version show` to show the versions of Azure CLI modules and extensions in JSON format by default or format configured by --output + **Storage** * `az storage account create`: Remove preview flag for --enable-hierarchical-namespace parameter diff --git a/src/azure-cli/azure/cli/command_modules/resource/_help.py b/src/azure-cli/azure/cli/command_modules/resource/_help.py index 1f9be32d2b4..a3aea38f6f6 100644 --- a/src/azure-cli/azure/cli/command_modules/resource/_help.py +++ b/src/azure-cli/azure/cli/command_modules/resource/_help.py @@ -1307,3 +1307,8 @@ type: group short-summary: Manage resource tags. """ + +helps['version'] = """ +type: command +short-summary: Show the versions of Azure CLI modules and extensions in JSON format by default or format configured by --output +""" diff --git a/src/azure-cli/azure/cli/command_modules/resource/commands.py b/src/azure-cli/azure/cli/command_modules/resource/commands.py index 7df4df4693b..5d68342799a 100644 --- a/src/azure-cli/azure/cli/command_modules/resource/commands.py +++ b/src/azure-cli/azure/cli/command_modules/resource/commands.py @@ -318,3 +318,6 @@ def load_command_table(self, _): with self.command_group('') as g: g.custom_command('rest', 'rest_call') + + with self.command_group('') as g: + g.custom_command('version', 'show_version', is_preview=True) diff --git a/src/azure-cli/azure/cli/command_modules/resource/custom.py b/src/azure-cli/azure/cli/command_modules/resource/custom.py index d0d39ab2dbb..f458c3811b6 100644 --- a/src/azure-cli/azure/cli/command_modules/resource/custom.py +++ b/src/azure-cli/azure/cli/command_modules/resource/custom.py @@ -2025,6 +2025,12 @@ def rest_call(cmd, method, uri, headers=None, uri_parameters=None, print(r.text) +def show_version(cmd): + from azure.cli.core.util import get_az_version_json + versions = get_az_version_json() + return versions + + class _ResourceUtils(object): # pylint: disable=too-many-instance-attributes def __init__(self, cli_ctx, resource_group_name=None, resource_provider_namespace=None, diff --git a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_version.py b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_version.py new file mode 100644 index 00000000000..cade56c37f7 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_version.py @@ -0,0 +1,27 @@ +# -------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for license information. +# -------------------------------------------------------------------------------------------- + +import unittest +from typing import Dict + +from azure.cli.testsdk import ScenarioTest + + +class VersionTest(ScenarioTest): + + def test_version(self): + output = self.cmd('az version').get_output_in_json() + self.assertIn('azure-cli', output) + self.assertIn('azure-cli-command-modules-nspkg', output) + self.assertIn('azure-cli-dev-tools', output) + self.assertIn('azure-cli-nspkg', output) + self.assertIn('azure-cli-telemetry', output) + self.assertIn('azure-cli-testsdk', output) + self.assertIn('extensions', output) + self.assertIsInstance(output['extensions'], Dict) + + +if __name__ == '__main__': + unittest.main()