@@ -2545,18 +2545,81 @@ def _remove_identities(cmd, resource_group_name, name, identities, getter, sette
25452545 return result .identity
25462546
25472547
2548+ def _remove_identities_by_aaz (cmd , resource_group_name , name , identities , getter , setter ):
2549+ from ._vm_utils import MSI_LOCAL_ID , IdentityType
2550+
2551+ remove_system_assigned_identity = False
2552+
2553+ if MSI_LOCAL_ID in identities :
2554+ remove_system_assigned_identity = True
2555+ identities .remove (MSI_LOCAL_ID )
2556+
2557+ resource = getter (cmd , resource_group_name , name )
2558+ existing_identity = resource .get ('identity' )
2559+
2560+ if existing_identity is None :
2561+ return None
2562+
2563+ existing_emsis = [x .lower () for x in list ((existing_identity .get ('userAssignedIdentities' ) or {}).keys ())]
2564+
2565+ if identities :
2566+ emsis_to_remove = [x .lower () for x in identities ]
2567+
2568+ non_existing = [emsis for emsis in emsis_to_remove if not emsis in existing_emsis ]
2569+ if non_existing :
2570+ raise CLIError ("'{}' are not associated with '{}'" .format (',' .join (non_existing ), name ))
2571+
2572+ emsis_to_be_retain = [emsis for emsis in existing_emsis if not emsis in emsis_to_remove ]
2573+
2574+ if not emsis_to_be_retain : # if all emsis are gone, we need to update the type
2575+ if existing_identity ['type' ] == IdentityType .USER_ASSIGNED .value :
2576+ existing_identity ['type' ] = IdentityType .NONE .value
2577+ elif existing_identity ['type' ] == IdentityType .SYSTEM_ASSIGNED_USER_ASSIGNED .value :
2578+ existing_identity ['type' ] = IdentityType .SYSTEM_ASSIGNED .value
2579+
2580+ existing_identity ['userAssignedIdentities' ] = {}
2581+ for emsis in identities :
2582+ existing_identity ['userAssignedIdentities' ][emsis ] = {}
2583+ else :
2584+ existing_identity ['userAssignedIdentities' ] = None
2585+
2586+ if remove_system_assigned_identity :
2587+ if existing_identity ['type' ] == IdentityType .SYSTEM_ASSIGNED_USER_ASSIGNED .value or existing_identity ['type' ] == IdentityType .USER_ASSIGNED .value :
2588+ existing_identity ['type' ] = IdentityType .USER_ASSIGNED .value
2589+ else :
2590+ existing_identity ['type' ] = IdentityType .NONE .value
2591+
2592+ result = LongRunningOperation (cmd .cli_ctx )(setter (resource_group_name , name , resource ))
2593+ return result .get ('identity' ) or None
2594+
2595+
25482596def remove_vm_identity (cmd , resource_group_name , vm_name , identities = None ):
25492597 def setter (resource_group_name , vm_name , vm ):
2550- client = _compute_client_factory (cmd .cli_ctx )
2551- VirtualMachineUpdate = cmd .get_models ('VirtualMachineUpdate' , operation_group = 'virtual_machines' )
2552- vm_update = VirtualMachineUpdate (identity = vm .identity )
2553- return client .virtual_machines .begin_update (resource_group_name , vm_name , vm_update )
2598+ command_args = {
2599+ 'resource_group' : resource_group_name ,
2600+ 'vm_name' : vm_name
2601+ }
2602+
2603+ from ._vm_utils import IdentityType
2604+ if vm .get ('identity' ) and vm .get ('identity' ).get ('type' ) == IdentityType .USER_ASSIGNED .value :
2605+ command_args ['mi_user_assigned' ] = [key for key in list ((vm .get ('identity' ).get ('userAssignedIdentities' ) or {}).keys ())] + ['UserAssigned' ]
2606+ elif vm .get ('identity' ) and vm .get ('identity' ).get ('type' ) == IdentityType .SYSTEM_ASSIGNED .value :
2607+ command_args ['mi_user_assigned' ] = []
2608+ command_args ['mi_system_assigned' ] = 'True'
2609+ elif vm .get ('identity' ) and vm .get ('identity' ).get ('type' ) == IdentityType .SYSTEM_ASSIGNED_USER_ASSIGNED .value :
2610+ command_args ['mi_user_assigned' ] = [key for key in list ((vm .get ('identity' ).get ('userAssignedIdentities' ) or {}).keys ())]
2611+ command_args ['mi_system_assigned' ] = 'True'
2612+ else :
2613+ command_args ['mi_user_assigned' ] = []
2614+
2615+ from .operations .vm import VMIdentityRemove
2616+ return VMIdentityRemove (cli_ctx = cmd .cli_ctx )(command_args = command_args )
25542617
25552618 if identities is None :
25562619 from ._vm_utils import MSI_LOCAL_ID
25572620 identities = [MSI_LOCAL_ID ]
25582621
2559- return _remove_identities (cmd , resource_group_name , vm_name , identities , get_vm , setter )
2622+ return _remove_identities_by_aaz (cmd , resource_group_name , vm_name , identities , get_vm_migrated , setter )
25602623
25612624
25622625# region VirtualMachines Images
0 commit comments