From 95fdcac6c12247ef18d155953d584875530570e2 Mon Sep 17 00:00:00 2001 From: Yishi Wang Date: Wed, 28 May 2025 17:35:00 +0800 Subject: [PATCH 1/5] az cloud register: Compatible with more response formats from ARM endpoint API --- src/azure-cli-core/azure/cli/core/cloud.py | 2 +- src/azure-cli/azure/cli/command_modules/cloud/custom.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/cloud.py b/src/azure-cli-core/azure/cli/core/cloud.py index ac0d909bd16..c58e6afc1e2 100644 --- a/src/azure-cli-core/azure/cli/core/cloud.py +++ b/src/azure-cli-core/azure/cli/core/cloud.py @@ -246,7 +246,7 @@ def _add_starting_dot(suffix): def _get_arm_endpoint(arm_dict, is_suffix=False): def _get_processed_arm_endpoint(name, add_dot=False, fallback_value=None): if is_suffix: - return (_add_starting_dot(arm_dict['suffixes'][name]) if add_dot else arm_dict['suffixes'][name]) if name in arm_dict['suffixes'] else fallback_value + return (_add_starting_dot(arm_dict['suffixes'][name]) if add_dot else arm_dict['suffixes'][name]) if 'suffixes' in arm_dict and name in arm_dict['suffixes'] else fallback_value return arm_dict[name] if name in arm_dict else fallback_value return _get_processed_arm_endpoint diff --git a/src/azure-cli/azure/cli/command_modules/cloud/custom.py b/src/azure-cli/azure/cli/command_modules/cloud/custom.py index 86f699a0bae..bd19bceae5e 100644 --- a/src/azure-cli/azure/cli/command_modules/cloud/custom.py +++ b/src/azure-cli/azure/cli/command_modules/cloud/custom.py @@ -47,7 +47,13 @@ def _populate_from_metadata_endpoint(arm_endpoint, session=None): response = session.get(metadata_endpoint) if response.status_code == 200: metadata = response.json() - return _arm_to_cli_mapper(metadata) + if isinstance(metadata, dict): + return _arm_to_cli_mapper(metadata) + elif isinstance(metadata, list): + return _arm_to_cli_mapper(metadata[0]) + else: + msg = 'Response body does not contain valid json. Response content: {}'.format(str(metadata)) + raise CLIError(error_msg_fmt.format(msg)) msg = 'Server returned status code {} for {}'.format(response.status_code, metadata_endpoint) raise CLIError(error_msg_fmt.format(msg)) except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err: From 90d90440b43853b503024780b7d0dc04414527eb Mon Sep 17 00:00:00 2001 From: Yishi Wang Date: Wed, 28 May 2025 17:56:51 +0800 Subject: [PATCH 2/5] Check response metadata empty --- src/azure-cli/azure/cli/command_modules/cloud/custom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/cloud/custom.py b/src/azure-cli/azure/cli/command_modules/cloud/custom.py index bd19bceae5e..11166cdd6cc 100644 --- a/src/azure-cli/azure/cli/command_modules/cloud/custom.py +++ b/src/azure-cli/azure/cli/command_modules/cloud/custom.py @@ -47,9 +47,9 @@ def _populate_from_metadata_endpoint(arm_endpoint, session=None): response = session.get(metadata_endpoint) if response.status_code == 200: metadata = response.json() - if isinstance(metadata, dict): + if isinstance(metadata, dict) and metadata: return _arm_to_cli_mapper(metadata) - elif isinstance(metadata, list): + elif isinstance(metadata, list) and metadata: return _arm_to_cli_mapper(metadata[0]) else: msg = 'Response body does not contain valid json. Response content: {}'.format(str(metadata)) From 2c34934335fde4269fe78c285ae769aec4cbda0e Mon Sep 17 00:00:00 2001 From: Yishi Wang Date: Thu, 29 May 2025 14:02:31 +0800 Subject: [PATCH 3/5] Update src/azure-cli/azure/cli/command_modules/cloud/custom.py --- src/azure-cli/azure/cli/command_modules/cloud/custom.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/cloud/custom.py b/src/azure-cli/azure/cli/command_modules/cloud/custom.py index 11166cdd6cc..bea84437b1a 100644 --- a/src/azure-cli/azure/cli/command_modules/cloud/custom.py +++ b/src/azure-cli/azure/cli/command_modules/cloud/custom.py @@ -51,9 +51,8 @@ def _populate_from_metadata_endpoint(arm_endpoint, session=None): return _arm_to_cli_mapper(metadata) elif isinstance(metadata, list) and metadata: return _arm_to_cli_mapper(metadata[0]) - else: - msg = 'Response body does not contain valid json. Response content: {}'.format(str(metadata)) - raise CLIError(error_msg_fmt.format(msg)) + msg = 'Response body does not contain valid json. Response content: {}'.format(str(metadata)) + raise CLIError(error_msg_fmt.format(msg)) msg = 'Server returned status code {} for {}'.format(response.status_code, metadata_endpoint) raise CLIError(error_msg_fmt.format(msg)) except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err: From 858eff80d9b2b8329ff3515af1ede3d38fd1bf60 Mon Sep 17 00:00:00 2001 From: Yishi Wang Date: Thu, 29 May 2025 15:59:10 +0800 Subject: [PATCH 4/5] Update src/azure-cli/azure/cli/command_modules/cloud/custom.py --- src/azure-cli/azure/cli/command_modules/cloud/custom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/cloud/custom.py b/src/azure-cli/azure/cli/command_modules/cloud/custom.py index bea84437b1a..4a62b29e8bb 100644 --- a/src/azure-cli/azure/cli/command_modules/cloud/custom.py +++ b/src/azure-cli/azure/cli/command_modules/cloud/custom.py @@ -49,7 +49,7 @@ def _populate_from_metadata_endpoint(arm_endpoint, session=None): metadata = response.json() if isinstance(metadata, dict) and metadata: return _arm_to_cli_mapper(metadata) - elif isinstance(metadata, list) and metadata: + if isinstance(metadata, list) and metadata: return _arm_to_cli_mapper(metadata[0]) msg = 'Response body does not contain valid json. Response content: {}'.format(str(metadata)) raise CLIError(error_msg_fmt.format(msg)) From 27962e575006dfce8a5843f4da78956ecee477dc Mon Sep 17 00:00:00 2001 From: Yishi Wang Date: Tue, 10 Jun 2025 20:27:37 +0800 Subject: [PATCH 5/5] fallback for arm_dict['suffixes'] --- src/azure-cli-core/azure/cli/core/cloud.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azure-cli-core/azure/cli/core/cloud.py b/src/azure-cli-core/azure/cli/core/cloud.py index c58e6afc1e2..3d332b6b832 100644 --- a/src/azure-cli-core/azure/cli/core/cloud.py +++ b/src/azure-cli-core/azure/cli/core/cloud.py @@ -246,7 +246,7 @@ def _add_starting_dot(suffix): def _get_arm_endpoint(arm_dict, is_suffix=False): def _get_processed_arm_endpoint(name, add_dot=False, fallback_value=None): if is_suffix: - return (_add_starting_dot(arm_dict['suffixes'][name]) if add_dot else arm_dict['suffixes'][name]) if 'suffixes' in arm_dict and name in arm_dict['suffixes'] else fallback_value + return (_add_starting_dot(arm_dict['suffixes'][name]) if add_dot else arm_dict['suffixes'][name]) if name in arm_dict.get('suffixes', {}) else fallback_value return arm_dict[name] if name in arm_dict else fallback_value return _get_processed_arm_endpoint