Hello community, here is the log from the commit of package azure-cli-core for openSUSE:Factory checked in at 2019-12-02 11:27:36 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/azure-cli-core (Old) and /work/SRC/openSUSE:Factory/.azure-cli-core.new.4691 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "azure-cli-core" Mon Dec 2 11:27:36 2019 rev:8 rq:751656 version:2.0.77 Changes: -------- --- /work/SRC/openSUSE:Factory/azure-cli-core/azure-cli-core.changes 2019-10-31 18:15:43.554039745 +0100 +++ /work/SRC/openSUSE:Factory/.azure-cli-core.new.4691/azure-cli-core.changes 2019-12-02 11:29:19.770615985 +0100 @@ -1,0 +2,9 @@ +Thu Nov 28 14:47:20 UTC 2019 - John Paul Adrian Glaubitz <adrian.glaubitz@suse.com> + +- New upstream release + + Version 2.0.77 + + For detailed information about changes see the + HISTORY.txt file provided with this package +- Update Requires from setup.py + +------------------------------------------------------------------- Old: ---- azure-cli-core-2.0.75.tar.gz New: ---- azure-cli-core-2.0.77.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ azure-cli-core.spec ++++++ --- /var/tmp/diff_new_pack.zET1y7/_old 2019-12-02 11:29:20.618615593 +0100 +++ /var/tmp/diff_new_pack.zET1y7/_new 2019-12-02 11:29:20.618615593 +0100 @@ -1,7 +1,7 @@ # # spec file for package azure-cli-core # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,12 +17,12 @@ Name: azure-cli-core -Version: 2.0.75 +Version: 2.0.77 Release: 0 Summary: Microsoft Azure CLI Core Module License: MIT Group: System/Management -Url: https://github.com/Azure/azure-cli +URL: https://github.com/Azure/azure-cli Source: https://files.pythonhosted.org/packages/source/a/azure-cli-core/azure-cli-core-%{version}.tar.gz Source1: LICENSE.txt BuildRequires: azure-cli-nspkg @@ -54,7 +54,8 @@ Requires: python3-pip Requires: python3-pyOpenSSL >= 17.1.0 Requires: python3-requests >= 2.20.0 -Requires: python3-six +Requires: python3-six < 2.0.0 +Requires: python3-six >= 1.12 Requires: python3-wheel >= 0.30.0 %if %{python3_version_nodots} < 34 Requires: python-enum34 >= 1.0.4 ++++++ azure-cli-core-2.0.75.tar.gz -> azure-cli-core-2.0.77.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/HISTORY.rst new/azure-cli-core-2.0.77/HISTORY.rst --- old/azure-cli-core-2.0.75/HISTORY.rst 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/HISTORY.rst 2019-11-22 06:26:37.000000000 +0100 @@ -3,9 +3,19 @@ Release History =============== +2.0.77 +++++++ +* Add deprecate message for Python 2.7 +* Refine the help and error messages for `--ids` + +2.0.76 +++++++ +* no changes + 2.0.75 ++++++ * Add syntax check for --set parameter in generic update command. +* Fix #10760: `az login` fails if subscription name is None * Minor change in DeploymentOutputLongRunningOperation 2.0.74 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/PKG-INFO new/azure-cli-core-2.0.77/PKG-INFO --- old/azure-cli-core-2.0.75/PKG-INFO 2019-10-11 10:59:57.000000000 +0200 +++ new/azure-cli-core-2.0.77/PKG-INFO 2019-11-22 06:26:47.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: azure-cli-core -Version: 2.0.75 +Version: 2.0.77 Summary: Microsoft Azure Command-Line Tools Core Module Home-page: https://github.com/Azure/azure-cli Author: Microsoft Corporation @@ -15,9 +15,19 @@ Release History =============== + 2.0.77 + ++++++ + * Add deprecate message for Python 2.7 + * Refine the help and error messages for `--ids` + + 2.0.76 + ++++++ + * no changes + 2.0.75 ++++++ * Add syntax check for --set parameter in generic update command. + * Fix #10760: `az login` fails if subscription name is None * Minor change in DeploymentOutputLongRunningOperation 2.0.74 @@ -475,5 +485,6 @@ Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 Classifier: License :: OSI Approved :: MIT License Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/__init__.py new/azure-cli-core-2.0.77/azure/cli/core/__init__.py --- old/azure-cli-core-2.0.75/azure/cli/core/__init__.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/__init__.py 2019-11-22 06:26:37.000000000 +0100 @@ -4,7 +4,7 @@ # -------------------------------------------------------------------------------------------- from __future__ import print_function -__version__ = "2.0.75" +__version__ = "2.0.77" import os import sys @@ -90,7 +90,9 @@ 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.', 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) else: print('Your CLI is up-to-date.') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/_help.py new/azure-cli-core-2.0.77/azure/cli/core/_help.py --- old/azure-cli-core-2.0.75/azure/cli/core/_help.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/_help.py 2019-11-22 06:26:37.000000000 +0100 @@ -74,6 +74,7 @@ @staticmethod def _print_examples(help_file): + from colorama import Style indent = 0 _print_indent('Examples', indent) for e in help_file.examples: @@ -84,6 +85,9 @@ _print_indent(u'{0}'.format(e.long_summary), indent) _print_indent(u'{0}'.format(e.command), indent) print('') + indent = 0 + message = 'For more specific examples, use: az find "az {}"'.format(help_file.command) + _print_indent(Style.BRIGHT + message + Style.RESET_ALL + '\n', indent) @staticmethod def _process_value_sources(p): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/_profile.py new/azure-cli-core-2.0.77/azure/cli/core/_profile.py --- old/azure-cli-core-2.0.75/azure/cli/core/_profile.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/_profile.py 2019-11-22 06:26:37.000000000 +0100 @@ -18,7 +18,8 @@ from azure.cli.core._environment import get_config_dir from azure.cli.core._session import ACCOUNT -from azure.cli.core.util import get_file_json, in_cloud_console, open_page_in_browser, can_launch_browser +from azure.cli.core.util import get_file_json, in_cloud_console, open_page_in_browser, can_launch_browser,\ + is_windows, is_wsl from azure.cli.core.cloud import get_active_cloud, set_cloud_subscription from knack.log import get_logger @@ -209,7 +210,7 @@ if not allow_no_subscriptions and not subscriptions: raise CLIError("No subscriptions were found for '{}'. If this is expected, use " - "'--allow-no-subscriptions' to have tenant level accesses".format( + "'--allow-no-subscriptions' to have tenant level access".format( username)) if is_service_principal: @@ -222,7 +223,8 @@ t_list = [s.tenant_id for s in subscriptions] bare_tenants = [t for t in subscription_finder.tenants if t not in t_list] profile = Profile(cli_ctx=self.cli_ctx) - subscriptions = profile._build_tenant_level_accounts(bare_tenants) # pylint: disable=protected-access + tenant_accounts = profile._build_tenant_level_accounts(bare_tenants) # pylint: disable=protected-access + subscriptions.extend(tenant_accounts) if not subscriptions: return [] @@ -239,8 +241,10 @@ consolidated = [] for s in subscriptions: display_name = s.display_name + if display_name is None: + display_name = '' try: - s.display_name.encode(sys.getdefaultencoding()) + display_name.encode(sys.getdefaultencoding()) except (UnicodeEncodeError, UnicodeDecodeError): # mainly for Python 2.7 with ascii as the default encoding display_name = re.sub(r'[^\x00-\x7f]', lambda x: '?', display_name) @@ -339,13 +343,12 @@ if allow_no_subscriptions: subscriptions = self._build_tenant_level_accounts([tenant]) else: - raise CLIError('No access was configured for the VM, hence no subscriptions were found') + raise CLIError('No access was configured for the VM, hence no subscriptions were found. ' + "If this is expected, use '--allow-no-subscriptions' to have tenant level access.") consolidated = self._normalize_properties(user, subscriptions, is_service_principal=True, user_assigned_identity_id=base_name) - - # key-off subscription name to allow accounts with same id(but under different identities) - self._set_subscriptions(consolidated, secondary_key_name=_SUBSCRIPTION_NAME) + self._set_subscriptions(consolidated) return deepcopy(consolidated) def find_subscriptions_in_cloud_console(self): @@ -1087,6 +1090,16 @@ import random reply_url = None + + # On Windows, HTTPServer by default doesn't throw error if the port is in-use + # https://github.com/Azure/azure-cli/issues/10578 + if is_windows(): + logger.debug('Windows is detected. Set HTTPServer.allow_reuse_address to False') + ClientRedirectServer.allow_reuse_address = False + elif is_wsl(): + logger.debug('WSL is detected. Set HTTPServer.allow_reuse_address to False') + ClientRedirectServer.allow_reuse_address = False + for port in range(8400, 9000): try: web_server = ClientRedirectServer(('localhost', port), ClientRedirectHandler) @@ -1115,10 +1128,6 @@ results['no_browser'] = True return - # emit a warning for transitioning to the new experience - logger.warning('Note, we have launched a browser for you to login. For old experience' - ' with device code, use "az login --use-device-code"') - # wait for callback from browser. while True: web_server.handle_request() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/_session.py new/azure-cli-core-2.0.77/azure/cli/core/_session.py --- old/azure-cli-core-2.0.75/azure/cli/core/_session.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/_session.py 2019-11-22 06:26:37.000000000 +0100 @@ -43,7 +43,7 @@ try: if max_age > 0: st = os.stat(self.filename) - if st.st_mtime + max_age < time.clock(): + if st.st_mtime + max_age < time.time(): self.save() with codecs_open(self.filename, 'r', encoding=self._encoding) as f: self.data = json.load(f) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/adal_authentication.py new/azure-cli-core-2.0.77/azure/cli/core/adal_authentication.py --- old/azure-cli-core-2.0.75/azure/cli/core/adal_authentication.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/adal_authentication.py 2019-11-22 06:26:37.000000000 +0100 @@ -49,6 +49,9 @@ if not in_cloud_console() else '')) raise CLIError(err) + except requests.exceptions.SSLError as err: + from .util import SSLERROR_TEMPLATE + raise CLIError(SSLERROR_TEMPLATE.format(str(err))) except requests.exceptions.ConnectionError as err: raise CLIError('Please ensure you have network connection. Error detail: ' + str(err)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/cloud.py new/azure-cli-core-2.0.77/azure/cli/core/cloud.py --- old/azure-cli-core-2.0.75/azure/cli/core/cloud.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/cloud.py 2019-11-22 06:26:37.000000000 +0100 @@ -4,11 +4,13 @@ # -------------------------------------------------------------------------------------------- import os +import json from pprint import pformat from six.moves import configparser from azure.cli.core.profiles import API_PROFILES from azure.cli.core._config import GLOBAL_CONFIG_DIR +from azure.cli.core.util import urlretrieve from knack.log import get_logger from knack.util import CLIError @@ -127,6 +129,59 @@ return val +def _get_ossrdbms_resource_id(cloud_name): + ossrdbms_mapper = { + 'AzureCloud': 'https://ossrdbms-aad.database.windows.net', + 'AzureChinaCloud': 'https://ossrdbms-aad.database.chinacloudapi.cn', + 'AzureUSGovernment': 'https://ossrdbms-aad.database.usgovcloudapi.net', + 'AzureGermanCloud': 'https://ossrdbms-aad.database.cloudapi.de' + } + return ossrdbms_mapper.get(cloud_name, None) + + +def _get_microsoft_graph_resource_id(cloud_name): + graph_endpoint_mapper = { + 'AzureCloud': 'https://graph.microsoft.com/', + 'AzureChinaCloud': 'https://microsoftgraph.chinacloudapi.cn/', + 'AzureUSGovernment': 'https://graph.microsoft.us/', + 'AzureGermanCloud': 'https://graph.microsoft.de/' + } + return graph_endpoint_mapper.get(cloud_name, None) + + +def _convert_arm_to_cli(arm_cloud_metadata_dict): + cli_cloud_metadata_dict = {} + for cloud in arm_cloud_metadata_dict: + cli_cloud_metadata_dict[cloud['name']] = _arm_to_cli_mapper(cloud) + return cli_cloud_metadata_dict + + +def _arm_to_cli_mapper(arm_dict): + return Cloud( + arm_dict['name'], + endpoints=CloudEndpoints( + management=arm_dict['authentication']['audiences'][0], + resource_manager=arm_dict['resourceManager'], + sql_management=arm_dict['sqlManagement'], + batch_resource_id=arm_dict['batch'], + gallery=arm_dict['gallery'], + active_directory=arm_dict['authentication']['loginEndpoint'], + active_directory_resource_id=arm_dict['authentication']['audiences'][0], + active_directory_graph_resource_id=arm_dict['graphAudience'], + microsoft_graph_resource_id=_get_microsoft_graph_resource_id(arm_dict['name']), # pylint: disable=line-too-long # change once microsoft_graph_resource_id is fixed in ARM + vm_image_alias_doc=arm_dict['vmImageAliasDoc'], # pylint: disable=line-too-long + media_resource_id=arm_dict['media'], + ossrdbms_resource_id=_get_ossrdbms_resource_id(arm_dict['name']), # pylint: disable=line-too-long # change once ossrdbms_resource_id is available via ARM + active_directory_data_lake_resource_id=arm_dict['activeDirectoryDataLake'] if 'activeDirectoryDataLake' in arm_dict else None), # pylint: disable=line-too-long + suffixes=CloudSuffixes( + storage_endpoint=arm_dict['suffixes']['storage'], + keyvault_dns=arm_dict['suffixes']['keyVaultDns'], + sql_server_hostname=arm_dict['suffixes']['sqlServerHostname'], + azure_datalake_store_file_system_endpoint=arm_dict['suffixes']['azureDataLakeStoreFileSystem'] if 'azureDataLakeStoreFileSystem' in arm_dict['suffixes'] else None, # pylint: disable=line-too-long + azure_datalake_analytics_catalog_and_job_endpoint=arm_dict['suffixes']['azureDataLakeAnalyticsCatalogAndJob'] if 'azureDataLakeAnalyticsCatalogAndJob' in arm_dict['suffixes'] else None, # pylint: disable=line-too-long + acr_login_server_endpoint=arm_dict['suffixes']['acrLoginServer'] if 'acrLoginServer' in arm_dict['suffixes'] else None)) # pylint: disable=line-too-long + + class Cloud(object): # pylint: disable=too-few-public-methods """ Represents an Azure Cloud instance """ @@ -239,9 +294,19 @@ keyvault_dns='.vault.microsoftazure.de', sql_server_hostname='.database.cloudapi.de')) - KNOWN_CLOUDS = [AZURE_PUBLIC_CLOUD, AZURE_CHINA_CLOUD, AZURE_US_GOV_CLOUD, AZURE_GERMAN_CLOUD] +if 'ARM_CLOUD_METADATA_URL' in os.environ: + try: + arm_cloud_dict = json.loads(urlretrieve(os.getenv('ARM_CLOUD_METADATA_URL'))) + cli_cloud_dict = _convert_arm_to_cli(arm_cloud_dict) + if 'AzureCloud' in cli_cloud_dict: + cli_cloud_dict['AzureCloud'].endpoints.active_directory = 'https://login.microsoftonline.com' # pylint: disable=line-too-long # change once active_directory is fixed in ARM for the public cloud + KNOWN_CLOUDS = list(cli_cloud_dict.values()) + except Exception as ex: # pylint: disable=broad-except + logger.warning('Failed to load cloud metadata from the url specified by ARM_CLOUD_METADATA_URL') + raise ex + def _set_active_cloud(cli_ctx, cloud_name): cli_ctx.config.set_value('cloud', 'name', cloud_name) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/commands/__init__.py new/azure-cli-core-2.0.77/azure/cli/core/commands/__init__.py --- old/azure-cli-core-2.0.75/azure/cli/core/commands/__init__.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/commands/__init__.py 2019-11-22 06:26:37.000000000 +0100 @@ -92,7 +92,7 @@ try: return _load_file(poss_file) except IOError: - logger.debug("Failed to load @'%s', assume not a file", arg) + logger.debug("Failed to load '%s', assume not a file", arg) return arg # if @ not at the start it can't be a file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/commands/arm.py new/azure-cli-core-2.0.77/azure/cli/core/commands/arm.py --- old/azure-cli-core-2.0.75/azure/cli/core/commands/arm.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/commands/arm.py 2019-11-22 06:26:37.000000000 +0100 @@ -218,8 +218,9 @@ deprecate_info = id_arg.settings.get('deprecate_info', None) if id_arg else None id_kwargs = { 'metavar': 'ID', - 'help': "One or more resource IDs (space-delimited). If provided, " - "no other 'Resource Id' arguments should be specified.", + 'help': "One or more resource IDs (space-delimited). " + "It should be a complete resource ID containing all information of '{gname}' arguments. " + "If provided, no other '{gname}' arguments should be specified.".format(gname=group_name), '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, @@ -309,7 +310,17 @@ # place the ID parts into the correct property lists parts = parse_resource_id(val) for arg in combined_args: - getattr(namespace, arg.name).append(parts[arg.type.settings['id_part']]) + id_part = arg.type.settings.get('id_part') + id_value = parts.get(id_part, None) + if id_value is None: + argument_name = arg.type.settings.get('options_list')[0] + raise CLIError("Argument {arg_name} cannot be derived from ID {id}. " + "Please provide a complete resource ID " + "containing all information of '{group_name}' " + "arguments. ".format(id=val, + arg_name=argument_name, + group_name=arg.arg_group)) + getattr(namespace, arg.name).append(id_value) # support deprecating --ids deprecate_info = cmd.arguments['ids'].type.settings.get('deprecate_info') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/commands/template_create.py new/azure-cli-core-2.0.77/azure/cli/core/commands/template_create.py --- old/azure-cli-core-2.0.75/azure/cli/core/commands/template_create.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/commands/template_create.py 2019-11-22 06:26:37.000000000 +0100 @@ -42,7 +42,10 @@ # add parent name option string (if applicable) if other_required_option: - help_text = '{} If name specified, also specify {}'.format(help_text, other_required_option) + help_text = '{} If name specified, also specify {}.'.format(help_text, other_required_option) + help_text = '{} If you want to use an existing {display_name} in other resource group or subscription, ' \ + 'please provide the ID instead of the name of the {display_name}'.format(help_text, + display_name=display_name) return help_text diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/profiles/_shared.py new/azure-cli-core-2.0.77/azure/cli/core/profiles/_shared.py --- old/azure-cli-core-2.0.75/azure/cli/core/profiles/_shared.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/profiles/_shared.py 2019-11-22 06:26:37.000000000 +0100 @@ -47,6 +47,7 @@ MGMT_RESOURCE_POLICY = ('azure.mgmt.resource.policy', 'PolicyClient') MGMT_RESOURCE_RESOURCES = ('azure.mgmt.resource.resources', 'ResourceManagementClient') MGMT_RESOURCE_SUBSCRIPTIONS = ('azure.mgmt.resource.subscriptions', 'SubscriptionClient') + MGMT_MONITOR = ('azure.mgmt.monitor', 'MonitorManagementClient') DATA_KEYVAULT = ('azure.keyvault', 'KeyVaultClient') MGMT_EVENTHUB = ('azure.mgmt.eventhub', 'EventHubManagementClient') # the "None" below will stay till a command module fills in the type so "get_mgmt_service_client" @@ -76,7 +77,6 @@ MGMT_IOTCENTRAL = ('azure.mgmt.iotcentral', None) MGMT_DEVTESTLABS = ('azure.mgmt.devtestlabs', None) MGMT_MAPS = ('azure.mgmt.maps', None) - MGMT_MONITOR = ('azure.mgmt.monitor', None) MGMT_POLICYINSIGHTS = ('azure.mgmt.policyinsights', None) MGMT_RDBMS = ('azure.mgmt.rdbms', None) MGMT_REDIS = ('azure.mgmt.redis', None) @@ -124,18 +124,18 @@ AZURE_API_PROFILES = { 'latest': { ResourceType.MGMT_STORAGE: '2019-04-01', - ResourceType.MGMT_NETWORK: '2019-04-01', - ResourceType.MGMT_COMPUTE: SDKProfile('2019-03-01', { + ResourceType.MGMT_NETWORK: '2019-09-01', + ResourceType.MGMT_COMPUTE: SDKProfile('2019-07-01', { 'resource_skus': '2019-04-01', - 'disks': '2019-03-01', - 'snapshots': '2019-03-01', + 'disks': '2019-07-01', + 'snapshots': '2019-07-01', 'galleries': '2019-07-01' }), ResourceType.MGMT_RESOURCE_FEATURES: '2015-12-01', ResourceType.MGMT_RESOURCE_LINKS: '2016-09-01', ResourceType.MGMT_RESOURCE_LOCKS: '2016-09-01', ResourceType.MGMT_RESOURCE_POLICY: '2019-06-01', - ResourceType.MGMT_RESOURCE_RESOURCES: '2019-05-10', + ResourceType.MGMT_RESOURCE_RESOURCES: '2019-07-01', ResourceType.MGMT_RESOURCE_SUBSCRIPTIONS: '2016-06-01', ResourceType.MGMT_NETWORK_DNS: '2018-05-01', ResourceType.MGMT_KEYVAULT: '2018-02-14', @@ -148,7 +148,33 @@ ResourceType.DATA_KEYVAULT: '7.0', ResourceType.DATA_STORAGE: '2018-11-09', ResourceType.DATA_COSMOS_TABLE: '2017-04-17', - ResourceType.MGMT_EVENTHUB: '2017-04-01' + ResourceType.MGMT_EVENTHUB: '2017-04-01', + ResourceType.MGMT_MONITOR: SDKProfile('2019-06-01', { + 'activity_log_alerts': '2017-04-01', + 'activity_logs': '2015-04-01', + 'alert_rule_incidents': '2016-03-01', + 'alert_rules': '2016-03-01', + 'autoscale_settings': '2015-04-01', + 'baseline': '2018-09-01', + 'baselines': '2019-03-01', + 'diagnostic_settings': '2017-05-01-preview', + 'diagnostic_settings_category': '2017-05-01-preview', + 'event_categories': '2015-04-01', + 'guest_diagnostics_settings': '2018-06-01-preview', + 'guest_diagnostics_settings_association': '2018-06-01-preview', + 'log_profiles': '2016-03-01', + 'metric_alerts': '2018-03-01', + 'metric_alerts_status': '2018-03-01', + 'metric_baseline': '2018-09-01', + 'metric_definitions': '2018-01-01', + 'metric_namespaces': '2017-12-01-preview', + 'metrics': '2018-01-01', + 'operations': '2015-04-01', + 'scheduled_query_rules': '2018-04-16', + 'service_diagnostic_settings': '2016-09-01', + 'tenant_activity_logs': '2015-04-01', + 'vm_insights': '2018-11-27-preview' + }) }, '2019-03-01-hybrid': { ResourceType.MGMT_STORAGE: '2017-10-01', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure/cli/core/util.py new/azure-cli-core-2.0.77/azure/cli/core/util.py --- old/azure-cli-core-2.0.75/azure/cli/core/util.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure/cli/core/util.py 2019-11-22 06:26:37.000000000 +0100 @@ -9,16 +9,26 @@ import getpass import base64 import binascii +import platform +import ssl import six +from six.moves.urllib.request import urlopen # pylint: disable=import-error from knack.log import get_logger from knack.util import CLIError, to_snake_case +from azure.common import AzureException logger = get_logger(__name__) CLI_PACKAGE_NAME = 'azure-cli' COMPONENT_PREFIX = 'azure-cli-' +SSLERROR_TEMPLATE = ('Certificate verification failed. This typically happens when using Azure CLI behind a proxy ' + 'that intercepts traffic with a self-signed certificate. ' + # pylint: disable=line-too-long + 'Please add this certificate to the trusted CA bundle: https://github.com/Azure/azure-cli/blob/dev/doc/use_cli_effectively.md#worki.... ' + 'Error detail: {}') + def handle_exception(ex): # pylint: disable=too-many-return-statements # For error code, follow guidelines at https://docs.python.org/2/library/sys.html#sys.exit, @@ -33,14 +43,18 @@ logger.error("To learn more about --query, please visit: " "https://docs.microsoft.com/cli/azure/query-azure-cli?view=azure-cli-latest") return 1 - if isinstance(ex, (CLIError, CloudError)): + if isinstance(ex, (CLIError, CloudError, AzureException)): logger.error(ex.args[0]) return ex.args[1] if len(ex.args) >= 2 else 1 if isinstance(ex, ValidationError): logger.error('validation error: %s', ex) return 1 if isinstance(ex, ClientRequestError): - logger.error("request failed: %s", ex) + msg = str(ex) + if 'SSLError' in msg: + logger.error("request failed: %s", SSLERROR_TEMPLATE.format(msg)) + else: + logger.error("request failed: %s", ex) return 1 if isinstance(ex, KeyboardInterrupt): return 1 @@ -119,7 +133,6 @@ def get_az_version_string(): - import platform from azure.cli.core.extension import get_extensions, EXTENSIONS_DIR, DEV_EXTENSION_SOURCES output = six.StringIO() @@ -179,6 +192,9 @@ _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 @@ -357,9 +373,9 @@ def open_page_in_browser(url): import subprocess import webbrowser - platform_name, release = _get_platform_info() + platform_name, _ = _get_platform_info() - if _is_wsl(platform_name, release): # windows 10 linux subsystem + if is_wsl(): # windows 10 linux subsystem try: return subprocess.call(['cmd.exe', '/c', "start {}".format(url.replace('&', '^&'))]) except OSError: # WSL might be too old # FileNotFoundError introduced in Python 3 @@ -377,7 +393,6 @@ def _get_platform_info(): - import platform uname = platform.uname() # python 2, `platform.uname()` returns: tuple(system, node, release, version, machine, processor) platform_name = getattr(uname, 'system', None) or uname[0] @@ -385,16 +400,21 @@ return platform_name.lower(), release.lower() -def _is_wsl(platform_name, release): +def is_wsl(): platform_name, release = _get_platform_info() return platform_name == 'linux' and release.split('-')[-1] == 'microsoft' +def is_windows(): + platform_name, _ = _get_platform_info() + return platform_name == 'windows' + + def can_launch_browser(): import os import webbrowser - platform_name, release = _get_platform_info() - if _is_wsl(platform_name, release) or platform_name != 'linux': + platform_name, _ = _get_platform_info() + if is_wsl() or platform_name != 'linux': return True # per https://unix.stackexchange.com/questions/46305/is-there-a-way-to-retrieve-th... # and https://unix.stackexchange.com/questions/193827/what-is-display-0 @@ -601,3 +621,18 @@ def __exit__(self, exc_type, exc_val, exc_tb): setattr(self.cli_config, 'use_local_config', self.original_use_local_config) + + +def _ssl_context(): + if sys.version_info < (3, 4) or (in_cloud_console() and platform.system() == 'Windows'): + try: + return ssl.SSLContext(ssl.PROTOCOL_TLS) # added in python 2.7.13 and 3.6 + except AttributeError: + return ssl.SSLContext(ssl.PROTOCOL_TLSv1) + + return ssl.create_default_context() + + +def urlretrieve(url): + req = urlopen(url, context=_ssl_context()) + return req.read() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure_cli_core.egg-info/PKG-INFO new/azure-cli-core-2.0.77/azure_cli_core.egg-info/PKG-INFO --- old/azure-cli-core-2.0.75/azure_cli_core.egg-info/PKG-INFO 2019-10-11 10:59:57.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure_cli_core.egg-info/PKG-INFO 2019-11-22 06:26:47.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: azure-cli-core -Version: 2.0.75 +Version: 2.0.77 Summary: Microsoft Azure Command-Line Tools Core Module Home-page: https://github.com/Azure/azure-cli Author: Microsoft Corporation @@ -15,9 +15,19 @@ Release History =============== + 2.0.77 + ++++++ + * Add deprecate message for Python 2.7 + * Refine the help and error messages for `--ids` + + 2.0.76 + ++++++ + * no changes + 2.0.75 ++++++ * Add syntax check for --set parameter in generic update command. + * Fix #10760: `az login` fails if subscription name is None * Minor change in DeploymentOutputLongRunningOperation 2.0.74 @@ -475,5 +485,6 @@ Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 Classifier: License :: OSI Approved :: MIT License Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/azure_cli_core.egg-info/requires.txt new/azure-cli-core-2.0.77/azure_cli_core.egg-info/requires.txt --- old/azure-cli-core-2.0.75/azure_cli_core.egg-info/requires.txt 2019-10-11 10:59:57.000000000 +0200 +++ new/azure-cli-core-2.0.77/azure_cli_core.egg-info/requires.txt 2019-11-22 06:26:47.000000000 +0100 @@ -12,7 +12,7 @@ pyopenssl>=17.1.0 pyyaml requests~=2.20 -six +six~=1.12 wheel==0.30.0 azure-mgmt-resource~=4.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/azure-cli-core-2.0.75/setup.py new/azure-cli-core-2.0.77/setup.py --- old/azure-cli-core-2.0.75/setup.py 2019-10-11 10:59:52.000000000 +0200 +++ new/azure-cli-core-2.0.77/setup.py 2019-11-22 06:26:37.000000000 +0100 @@ -17,7 +17,7 @@ logger.warn("Wheel is not available, disabling bdist_wheel hook") cmdclass = {} -VERSION = "2.0.75" +VERSION = "2.0.77" # If we have source, validate that our version numbers match # This should prevent uploading releases with mismatched versions. try: @@ -49,6 +49,7 @@ 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'License :: OSI Approved :: MIT License', ] @@ -67,7 +68,7 @@ 'pyopenssl>=17.1.0', # https://github.com/pyca/pyopenssl/pull/612 'pyyaml', 'requests~=2.20', - 'six', + 'six~=1.12', 'wheel==0.30.0', 'azure-mgmt-resource~=4.0', ]