Skip to content

Commit ed8cb74

Browse files
{Compute} az vm identity: Migrate commands to aaz-based implementation (#32572)
1 parent 6053d39 commit ed8cb74

File tree

11 files changed

+14386
-13374
lines changed

11 files changed

+14386
-13374
lines changed

src/azure-cli-core/azure/cli/core/commands/arm.py

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -759,46 +759,50 @@ def _find_property(instance, path):
759759

760760

761761
def assign_identity(cli_ctx, getter, setter, identity_role=None, identity_scope=None):
762-
import time
763-
from azure.core.exceptions import HttpResponseError
764-
765762
# get
766763
resource = getter()
767764
resource = setter(resource)
768765

769766
# create role assignment:
770767
if identity_scope:
771768
principal_id = resource.identity.principal_id
769+
create_role_assignment(cli_ctx, principal_id, identity_role, identity_scope)
772770

773-
identity_role_id = resolve_role_id(cli_ctx, identity_role, identity_scope)
774-
assignments_client = get_mgmt_service_client(cli_ctx, ResourceType.MGMT_AUTHORIZATION).role_assignments
775-
RoleAssignmentCreateParameters = get_sdk(cli_ctx, ResourceType.MGMT_AUTHORIZATION,
776-
'RoleAssignmentCreateParameters', mod='models',
777-
operation_group='role_assignments')
778-
parameters = RoleAssignmentCreateParameters(role_definition_id=identity_role_id, principal_id=principal_id,
779-
principal_type=None)
780-
781-
logger.info("Creating an assignment with a role '%s' on the scope of '%s'", identity_role_id, identity_scope)
782-
retry_times = 36
783-
assignment_name = _gen_guid()
784-
for retry_time in range(0, retry_times):
785-
try:
786-
assignments_client.create(scope=identity_scope, role_assignment_name=assignment_name,
787-
parameters=parameters)
788-
break
789-
except HttpResponseError as ex:
790-
if ex.error.code == 'RoleAssignmentExists':
791-
logger.info('Role assignment already exists')
792-
break
793-
if retry_time < retry_times and ' does not exist in the directory ' in ex.message:
794-
time.sleep(5)
795-
logger.warning('Retrying role assignment creation: %s/%s', retry_time + 1,
796-
retry_times)
797-
continue
798-
raise
799771
return resource
800772

801773

774+
def create_role_assignment(cli_ctx, principal_id, identity_role=None, identity_scope=None):
775+
import time
776+
from azure.core.exceptions import HttpResponseError
777+
778+
identity_role_id = resolve_role_id(cli_ctx, identity_role, identity_scope)
779+
assignments_client = get_mgmt_service_client(cli_ctx, ResourceType.MGMT_AUTHORIZATION).role_assignments
780+
RoleAssignmentCreateParameters = get_sdk(cli_ctx, ResourceType.MGMT_AUTHORIZATION,
781+
'RoleAssignmentCreateParameters', mod='models',
782+
operation_group='role_assignments')
783+
parameters = RoleAssignmentCreateParameters(role_definition_id=identity_role_id, principal_id=principal_id,
784+
principal_type=None)
785+
786+
logger.info("Creating an assignment with a role '%s' on the scope of '%s'", identity_role_id, identity_scope)
787+
retry_times = 36
788+
assignment_name = _gen_guid()
789+
for retry_time in range(0, retry_times):
790+
try:
791+
assignments_client.create(scope=identity_scope, role_assignment_name=assignment_name,
792+
parameters=parameters)
793+
break
794+
except HttpResponseError as ex:
795+
if ex.error.code == 'RoleAssignmentExists':
796+
logger.info('Role assignment already exists')
797+
break
798+
if retry_time < retry_times and ' does not exist in the directory ' in ex.message:
799+
time.sleep(5)
800+
logger.warning('Retrying role assignment creation: %s/%s', retry_time + 1,
801+
retry_times)
802+
continue
803+
raise
804+
805+
802806
def resolve_role_id(cli_ctx, role, scope):
803807
import uuid
804808
client = get_mgmt_service_client(cli_ctx, ResourceType.MGMT_AUTHORIZATION).role_definitions

src/azure-cli/azure/cli/command_modules/sqlvm/tests/latest/recordings/test_sqlvm_aad_auth_negative.yaml

Lines changed: 6651 additions & 7141 deletions
Large diffs are not rendered by default.

src/azure-cli/azure/cli/command_modules/sqlvm/tests/latest/test_sqlvm_commands.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def __init__(self, name_prefix=sqlvm_name_prefix, location='westus',
4848
def create_resource(self, name, **kwargs):
4949
group = self._get_resource_group(**kwargs)
5050
template = ('az vm create -l {} -g {} -n {} --admin-username {} --admin-password {} --image {}'
51-
' --size Standard_DS2_v2 --nsg-rule NONE')
51+
' --size Standard_B2ms --nsg-rule NONE')
5252
execute(DummyCli(), template.format(self.location, group, name, self.vm_user, self.vm_password, self.image))
5353
return {self.parameter_name: name}
5454

src/azure-cli/azure/cli/command_modules/vm/_vm_utils.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
import os
88
import re
99
import importlib
10+
from enum import Enum
1011

1112
from urllib.parse import urlparse
1213

1314
from azure.cli.core.commands.arm import ArmTemplateBuilder
15+
from azure.cli.core.commands.client_factory import get_mgmt_service_client
16+
from azure.cli.core.profiles import ResourceType
1417

1518
from knack.log import get_logger
1619
from knack.util import CLIError
@@ -32,7 +35,7 @@ def get_target_network_api(cli_ctx):
3235
if cli_ctx.cloud.profile == 'latest':
3336
version = '2022-01-01'
3437
else:
35-
from azure.cli.core.profiles import get_api_version, ResourceType
38+
from azure.cli.core.profiles import get_api_version
3639
version = get_api_version(cli_ctx, ResourceType.MGMT_NETWORK)
3740
return version
3841

@@ -46,8 +49,6 @@ def read_content_if_is_file(string_or_file):
4649

4750

4851
def _resolve_api_version(cli_ctx, provider_namespace, resource_type, parent_path):
49-
from azure.cli.core.commands.client_factory import get_mgmt_service_client
50-
from azure.cli.core.profiles import ResourceType
5152
client = get_mgmt_service_client(cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES)
5253
provider = client.providers.get(provider_namespace)
5354

@@ -75,10 +76,8 @@ def log_pprint_template(template):
7576
def check_existence(cli_ctx, value, resource_group, provider_namespace, resource_type,
7677
parent_name=None, parent_type=None, static_version=None):
7778
# check for name or ID and set the type flags
78-
from azure.cli.core.commands.client_factory import get_mgmt_service_client
7979
from azure.core.exceptions import HttpResponseError
8080
from azure.mgmt.core.tools import parse_resource_id
81-
from azure.cli.core.profiles import ResourceType
8281
id_parts = parse_resource_id(value)
8382
resource_client = get_mgmt_service_client(cli_ctx, ResourceType.MGMT_RESOURCE_RESOURCES,
8483
subscription_id=id_parts.get('subscription', None)).resources
@@ -414,8 +413,6 @@ def _update(model, lun, value):
414413

415414

416415
def get_storage_blob_uri(cli_ctx, storage):
417-
from azure.cli.core.profiles._shared import ResourceType
418-
from azure.cli.core.commands.client_factory import get_mgmt_service_client
419416
if urlparse(storage).scheme:
420417
storage_uri = storage
421418
else:
@@ -757,3 +754,29 @@ def _open(filename, mode):
757754
f.write(public_bytes)
758755

759756
return public_bytes.decode()
757+
758+
759+
def _gen_guid():
760+
import uuid
761+
return uuid.uuid4()
762+
763+
764+
def assign_identity(cli_ctx, getter, setter, identity_role=None, identity_scope=None):
765+
from azure.cli.core.commands.arm import create_role_assignment
766+
767+
# get
768+
resource = getter()
769+
resource = setter(resource)
770+
771+
# create role assignment:
772+
if identity_scope:
773+
principal_id = resource.get('identity', {}).get('principalId') or resource.get('identity', {}).get('principal_id')
774+
create_role_assignment(cli_ctx, principal_id, identity_role, identity_scope)
775+
return resource
776+
777+
778+
class IdentityType(Enum):
779+
SYSTEM_ASSIGNED = 'SystemAssigned'
780+
USER_ASSIGNED = 'UserAssigned'
781+
SYSTEM_ASSIGNED_USER_ASSIGNED = 'SystemAssigned, UserAssigned'
782+
NONE = 'None'

src/azure-cli/azure/cli/command_modules/vm/commands.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -288,11 +288,12 @@ def load_command_table(self, _):
288288
from .operations.snapshot import SnapshotUpdate
289289
self.command_table['snapshot update'] = SnapshotUpdate(loader=self)
290290

291-
with self.command_group('vm', compute_vm_sdk) as g:
292-
g.custom_command('identity assign', 'assign_vm_identity', validator=process_assign_identity_namespace)
293-
g.custom_command('identity remove', 'remove_vm_identity', validator=process_remove_identity_namespace, min_api='2017-12-01')
294-
g.custom_show_command('identity show', 'show_vm_identity')
291+
with self.command_group('vm identity') as g:
292+
g.custom_command('assign', 'assign_vm_identity', validator=process_assign_identity_namespace)
293+
g.custom_command('remove', 'remove_vm_identity', validator=process_remove_identity_namespace, min_api='2017-12-01')
294+
g.custom_show_command('show', 'show_vm_identity')
295295

296+
with self.command_group('vm', compute_vm_sdk) as g:
296297
g.custom_command('application set', 'set_vm_applications', validator=process_set_applications_namespace, min_api='2021-07-01')
297298
g.custom_command('application list', 'list_vm_applications', min_api='2021-07-01')
298299

0 commit comments

Comments
 (0)