Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

{Core} Add arm_tools.py #29973

Draft
wants to merge 3 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions doc/authoring_command_modules/authoring_commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,7 @@ DO:
```Python
def my_command(cmd, resource_group_name, foo_name, storage_account):
from azure.cli.core.commands.client_factory import get_subscription_id
from msrestazure.tools import is_valid_resource_id, resource_id
from azure.cli.core.arm_tools import is_valid_resource_id, resource_id
if not is_valid_resource_id(storage_account):
storage_account = resource_id(
subscription=get_subscription_id(cmd.cli_ctx),
Expand All @@ -537,7 +537,7 @@ def my_command(cmd, resource_group_name, foo_name, storage_account):
```Python
def validate_storage_name_or_id(cmd, namespace):
from azure.cli.core.commands.client_factory import get_subscription_id
from msrestazure.tools import is_valid_resource_id, resource_id
from azure.cli.core.arm_tools import is_valid_resource_id, resource_id
if namespace.storage_account:
if not is_valid_resource_id(namespace.storage_account):
namespace.storage_account = resource_id(
Expand Down
2 changes: 1 addition & 1 deletion src/azure-cli-core/azure/cli/core/_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ def login(self,

def login_with_managed_identity(self, identity_id=None, allow_no_subscriptions=None):
import jwt
from azure.mgmt.core.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
from azure.cli.core.auth.adal_authentication import MSIAuthenticationWrapper
resource = self.cli_ctx.cloud.endpoints.active_directory_resource_id

Expand Down
2 changes: 1 addition & 1 deletion src/azure-cli-core/azure/cli/core/aaz/_arg_fmt.py
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,7 @@ def __init__(self, template=None):
self._template = self._Template(template)

def __call__(self, ctx, value):
from azure.mgmt.core.tools import parse_resource_id
from azure.cli.core.arm_tools import parse_resource_id

assert isinstance(value, AAZSimpleValue)

Expand Down
22 changes: 22 additions & 0 deletions src/azure-cli-core/azure/cli/core/arm_tools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------

"""
This file contains util tools for working with ARM resources.

Initially, they were from msrestazure.tools. Now we import them from azure.mgmt.core.tools.

In the future, we many consider vendoring them or providing our own implementations.
"""

# ATTENTION: Importing from azure.mgmt.core is time-consuming. Only import this file when necessary.

# pylint: disable=unused-import
from azure.mgmt.core.tools import (
is_valid_resource_id,
is_valid_resource_name,
parse_resource_id,
resource_id
)
6 changes: 3 additions & 3 deletions src/azure-cli-core/azure/cli/core/commands/arm.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ def deployment_validate_table_format(result):
class ResourceId(str):

def __new__(cls, val):
from azure.mgmt.core.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(val):
raise ValueError()
return str.__new__(cls, val)
Expand Down Expand Up @@ -316,7 +316,7 @@ def assemble_json(ids):
if full_id_list:
setattr(namespace, '_ids', full_id_list)

from azure.mgmt.core.tools import parse_resource_id, is_valid_resource_id
from azure.cli.core.arm_tools import parse_resource_id, is_valid_resource_id
for val in full_id_list:
if not is_valid_resource_id(val):
raise CLIError('invalid resource ID: {}'.format(val))
Expand Down Expand Up @@ -786,7 +786,7 @@ def _gen_guid():


def get_arm_resource_by_id(cli_ctx, arm_id, api_version=None):
from azure.mgmt.core.tools import parse_resource_id, is_valid_resource_id
from azure.cli.core.arm_tools import parse_resource_id, is_valid_resource_id

if not is_valid_resource_id(arm_id):
raise CLIError("'{}' is not a valid ID.".format(arm_id))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def get_folded_parameter_help_string(
def _validate_name_or_id(
cli_ctx, resource_group_name, property_value, property_type, parent_value, parent_type):
from azure.cli.core.commands.client_factory import get_subscription_id
from azure.mgmt.core.tools import parse_resource_id, is_valid_resource_id
from azure.cli.core.arm_tools import parse_resource_id, is_valid_resource_id
has_parent = parent_type is not None
if is_valid_resource_id(property_value):
resource_id_parts = parse_resource_id(property_value)
Expand Down Expand Up @@ -95,7 +95,7 @@ def get_folded_parameter_validator(

# construct the validator
def validator(cmd, namespace):
from azure.mgmt.core.tools import resource_id
from azure.cli.core.arm_tools import resource_id
type_field_name = '{}_type'.format(property_name)
property_val = getattr(namespace, property_name, None)
parent_val = getattr(namespace, parent_name, None) if parent_name else None
Expand Down
2 changes: 1 addition & 1 deletion src/azure-cli/azure/cli/command_modules/acr/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -587,7 +587,7 @@ def get_scope_map_from_id(cmd, scope_map_id):
def resolve_identity_client_id(cli_ctx, managed_identity_resource_id):
from azure.mgmt.msi import ManagedServiceIdentityClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client
from msrestazure.tools import parse_resource_id
from azure.cli.core.arm_tools import parse_resource_id

res = parse_resource_id(managed_identity_resource_id)
client = get_mgmt_service_client(cli_ctx, ManagedServiceIdentityClient, subscription_id=res['subscription'])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ def _check_registry_health(cmd, registry_name, ignore_errors):

def _check_private_endpoint(cmd, registry_name, vnet_of_private_endpoint): # pylint: disable=too-many-locals, too-many-statements
import socket
from msrestazure.tools import parse_resource_id, is_valid_resource_id, resource_id
from azure.cli.core.arm_tools import parse_resource_id, is_valid_resource_id, resource_id

if registry_name is None:
raise CLIError("Registry name must be provided to verify DNS routings of its private endpoints")
Expand Down
4 changes: 2 additions & 2 deletions src/azure-cli/azure/cli/command_modules/acr/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def acr_create(cmd,
lro_poller = client.begin_create(resource_group_name, registry_name, registry)

if workspace:
from msrestazure.tools import is_valid_resource_id, resource_id
from azure.cli.core.arm_tools import is_valid_resource_id, resource_id
from azure.cli.core.commands import LongRunningOperation
from azure.cli.core.commands.client_factory import get_subscription_id
acr = LongRunningOperation(cmd.cli_ctx)(lro_poller)
Expand Down Expand Up @@ -609,7 +609,7 @@ def _analyze_identities(identities):


def _ensure_identity_resource_id(subscription_id, resource_group, resource):
from msrestazure.tools import resource_id, is_valid_resource_id
from azure.cli.core.arm_tools import resource_id, is_valid_resource_id
if is_valid_resource_id(resource):
return resource
return resource_id(subscription=subscription_id,
Expand Down
2 changes: 1 addition & 1 deletion src/azure-cli/azure/cli/command_modules/acr/import.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from knack.util import CLIError
from knack.log import get_logger
from msrestazure.tools import is_valid_resource_id, parse_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id, parse_resource_id
from azure.cli.command_modules.acr._docker_utils import get_login_server_suffix
from azure.cli.core.commands import LongRunningOperation
from azure.cli.core.util import sdk_no_wait
Expand Down
4 changes: 2 additions & 2 deletions src/azure-cli/azure/cli/command_modules/acr/network_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,13 @@ def acr_network_rule_remove(cmd,


def _validate_subnet(cli_ctx, subnet, vnet_name, resource_group_name):
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
subnet_is_id = is_valid_resource_id(subnet)

if subnet_is_id and not vnet_name:
return subnet
if subnet and not subnet_is_id and vnet_name:
from msrestazure.tools import resource_id
from azure.cli.core.arm_tools import resource_id
from azure.cli.core.commands.client_factory import get_subscription_id
return resource_id(
subscription=get_subscription_id(cli_ctx),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ def ensure_aks_acr_role_assignment(cmd, assignee, registry_id, detach=False, is_

# pylint: disable=unused-argument
def ensure_aks_acr(cmd, assignee, acr_name_or_id, subscription_id, detach=False, is_service_principal=True):
from msrestazure.tools import is_valid_resource_id, parse_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id, parse_resource_id

# Check if the ACR exists by resource ID.
if is_valid_resource_id(acr_name_or_id):
Expand Down
20 changes: 10 additions & 10 deletions src/azure-cli/azure/cli/command_modules/acs/_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ def validate_pod_subnet_id(namespace):
def _validate_subnet_id(subnet_id, name):
if subnet_id is None or subnet_id == '':
return
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(subnet_id):
raise InvalidArgumentValueError(name + " is not a valid Azure resource ID.")

Expand All @@ -374,7 +374,7 @@ def validate_ppg(namespace):
if namespace.ppg is not None:
if namespace.ppg == '':
return
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(namespace.ppg):
raise CLIError("--ppg is not a valid Azure resource ID.")

Expand Down Expand Up @@ -478,7 +478,7 @@ def validate_assign_identity(namespace):
if namespace.assign_identity is not None:
if namespace.assign_identity == '':
return
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(namespace.assign_identity):
raise InvalidArgumentValueError("--assign-identity is not a valid Azure resource ID.")

Expand All @@ -487,35 +487,35 @@ def validate_assign_kubelet_identity(namespace):
if namespace.assign_kubelet_identity is not None:
if namespace.assign_kubelet_identity == '':
return
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(namespace.assign_kubelet_identity):
raise InvalidArgumentValueError("--assign-kubelet-identity is not a valid Azure resource ID.")


def validate_nodepool_id(namespace):
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(namespace.nodepool_id):
raise InvalidArgumentValueError("--nodepool-id is not a valid Azure resource ID.")


def validate_snapshot_id(namespace):
if namespace.snapshot_id:
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(namespace.snapshot_id):
raise InvalidArgumentValueError("--snapshot-id is not a valid Azure resource ID.")


def validate_host_group_id(namespace):
if namespace.host_group_id:
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(namespace.host_group_id):
raise InvalidArgumentValueError("--host-group-id is not a valid Azure resource ID.")


def validate_crg_id(namespace):
if namespace.crg_id is None:
return
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(namespace.crg_id):
raise InvalidArgumentValueError(
"--crg-id is not a valid Azure resource ID.")
Expand Down Expand Up @@ -630,7 +630,7 @@ def validate_azure_keyvault_kms_key_vault_resource_id(namespace):
key_vault_resource_id = namespace.azure_keyvault_kms_key_vault_resource_id
if key_vault_resource_id is None or key_vault_resource_id == '':
return
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if not is_valid_resource_id(key_vault_resource_id):
raise InvalidArgumentValueError("--azure-keyvault-kms-key-vault-resource-id is not a valid Azure resource ID.")

Expand Down Expand Up @@ -792,7 +792,7 @@ def validate_application_security_groups(namespace):
if not asg_ids:
return

from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
for asg in asg_ids:
if not is_valid_resource_id(asg):
raise InvalidArgumentValueError(asg + " is not a valid Azure resource ID.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
from azure.cli.core.util import send_raw_request
from azure.core.exceptions import HttpResponseError
from knack.log import get_logger
from msrestazure.tools import parse_resource_id, resource_id
from azure.cli.core.arm_tools import parse_resource_id, resource_id

logger = get_logger(__name__)
# mapping for azure public cloud
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

def get_amw_region(cmd, azure_monitor_workspace_resource_id):
import re
from msrestazure.tools import parse_resource_id
from azure.cli.core.arm_tools import parse_resource_id
# Define the allowed characters in the final string
allowed_chars = re.compile(r'[^a-zA-Z0-9]')

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def register_rps(cmd, subscription_id, rp_namespaces, user_agent):


def rp_registrations(cmd, cluster_subscription_id, raw_parameters):
from msrestazure.tools import parse_resource_id
from azure.cli.core.arm_tools import parse_resource_id
cluster_rp_namespaces = {
"microsoft.insights": False,
"microsoft.alertsmanagement": False
Expand Down
2 changes: 1 addition & 1 deletion src/azure-cli/azure/cli/command_modules/acs/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -3189,7 +3189,7 @@ def aks_approuting_zone_list(
resource_group_name,
name
):
from msrestazure.tools import parse_resource_id
from azure.cli.core.arm_tools import parse_resource_id
mc = client.get(resource_group_name, name)

if mc.ingress_profile and mc.ingress_profile.web_app_routing and mc.ingress_profile.web_app_routing.enabled:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@
from knack.prompting import NoTTYException, prompt, prompt_pass, prompt_y_n
from knack.util import CLIError
from msrestazure.azure_exceptions import CloudError
from msrestazure.tools import is_valid_resource_id, parse_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id, parse_resource_id

logger = get_logger(__name__)

Expand Down Expand Up @@ -6796,7 +6796,7 @@ def postprocessing_after_mc_created(self, cluster: ManagedCluster) -> None:
# mdm metrics is supported only in azure public cloud, so add the role assignment only in this cloud
cloud_name = self.cmd.cli_ctx.cloud.name
if cloud_name.lower() == "azurecloud":
from msrestazure.tools import resource_id
from azure.cli.core.arm_tools import resource_id

cluster_resource_id = resource_id(
subscription=self.context.get_subscription_id(),
Expand Down Expand Up @@ -8559,7 +8559,7 @@ def postprocessing_after_mc_created(self, cluster: ManagedCluster) -> None:
# mdm metrics is supported only in azure public cloud, so add the role assignment only in this cloud
cloud_name = self.cmd.cli_ctx.cloud.name
if cloud_name.lower() == "azurecloud":
from msrestazure.tools import resource_id
from azure.cli.core.arm_tools import resource_id

cluster_resource_id = resource_id(
subscription=self.context.get_subscription_id(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3663,7 +3663,7 @@ def test_aks_byo_appgw_with_ingress_appgw_addon(self, resource_group, resource_g
self.cmd(create_appgw)

# construct group id
from msrestazure.tools import parse_resource_id, resource_id
from azure.cli.core.arm_tools import parse_resource_id, resource_id
parsed_vnet_id = parse_resource_id(vnet_id)
group_id = resource_id(subscription=parsed_vnet_id["subscription"],
resource_group=parsed_vnet_id["resource_group"])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test_sanitize_resource_id(self):
# Test case where resource_id needs leading slash and trailing slash removed
self.assertEqual(sanitize_resource_id("test/resource/"), "/test/resource")

@patch('msrestazure.tools.parse_resource_id')
@patch('azure.cli.core.arm_tools.parse_resource_id')
@patch('azure.cli.command_modules.acs.azuremonitormetrics.helper.register_rps')
def test_subscription_id_selection(self, mock_register_rps, mock_parse_resource_id):
# Mocking return value of parse_resource_id
Expand Down
2 changes: 1 addition & 1 deletion src/azure-cli/azure/cli/command_modules/ams/_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
def validate_storage_account_id(cmd, namespace):
"""Validate storage account name"""
from azure.cli.core.commands.client_factory import get_subscription_id
from msrestazure.tools import is_valid_resource_id, resource_id
from azure.cli.core.arm_tools import is_valid_resource_id, resource_id

if namespace.storage_account:
if not is_valid_resource_id(namespace.storage_account):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def __init__(self, cli_ctx, resource_group_name, account_name):
self.access_token = self._get_v2_access_token()

def _get_v2_api_endpoint(self, cli_ctx, resource_group_name, account_name):
from msrestazure.tools import resource_id
from azure.cli.core.arm_tools import resource_id
from azure.cli.command_modules.ams._sdk_utils import (get_media_namespace, get_media_type)

access_token = self.profile.get_raw_token()[0][2].get('accessToken')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# --------------------------------------------------------------------------------------------

from azure.cli.testsdk import ScenarioTest, ResourceGroupPreparer, StorageAccountPreparer
from msrestazure.tools import resource_id
from azure.cli.core.arm_tools import resource_id

class AmsAccountIdentityTests(ScenarioTest):
@ResourceGroupPreparer()
Expand Down Expand Up @@ -78,4 +78,4 @@ def test_ams_add_user_identity(self, resource_group, storage_account_for_create)
self.check('identity.type', 'UserAssigned')
])

self.cmd('az ams account delete -n {amsname} -g {rg}')
self.cmd('az ams account delete -n {amsname} -g {rg}')
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ def validate_export(namespace):

def validate_appservice_name_or_id(cmd, namespace):
from azure.cli.core.commands.client_factory import get_subscription_id
from msrestazure.tools import is_valid_resource_id, parse_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id, parse_resource_id
if namespace.appservice_account:
if not is_valid_resource_id(namespace.appservice_account):
config_store_name = ""
Expand Down Expand Up @@ -219,7 +219,7 @@ def validate_identity(namespace):
return

for identity in identities:
from msrestazure.tools import is_valid_resource_id
from azure.cli.core.arm_tools import is_valid_resource_id
if identity == '[all]' and subcommand == 'remove':
continue

Expand Down
Loading
Loading