1- # --------------------------------------------------------------------------------------------
2- # Copyright (c) Microsoft Corporation. All rights reserved.
3- # Licensed under the MIT License. See License.txt in the project root for license information.
4- # --------------------------------------------------------------------------------------------
5-
1+ # Copyright (c) Microsoft Corporation.
2+ # Licensed under the Apache License 2.0.
63
4+ import collections
75import ipaddress
86import re
97from itertools import tee
108
11- from azure .cli .command_modules .aro ._validators import validate_vnet , validate_cidr
12- from azure .cli .command_modules .aro ._rbac import has_role_assignment_on_resource
13- from azure .cli .command_modules .aro .aaz .latest .network .vnet .subnet import Show as subnet_show
14- from azure .cli .command_modules .aro .aaz .latest .network .vnet import Show as vnet_show
159from azure .cli .core .commands .client_factory import get_mgmt_service_client
1610from azure .cli .core .commands .validators import get_default_location_from_resource_group
1711from azure .cli .core .profiles import ResourceType
18- from azure .cli .core .azclierror import CLIInternalError , InvalidArgumentValueError , \
12+ from azure .cli .core .azclierror import (
13+ CLIInternalError ,
14+ InvalidArgumentValueError ,
1915 RequiredArgumentMissingError
20- from azure .core .exceptions import ResourceNotFoundError , HttpResponseError
16+ )
17+ from azure .core .exceptions import HttpResponseError , ResourceNotFoundError
2118from azure .mgmt .core .tools import is_valid_resource_id , parse_resource_id
2219from knack .log import get_logger
20+ from azure .cli .command_modules .aro ._validators import validate_vnet , validate_cidr
21+ from azure .cli .command_modules .aro ._rbac import has_role_assignment_on_resource
22+ from azure .cli .command_modules .aro .aaz .latest .network .vnet .subnet import Show as subnet_show
23+ from azure .cli .command_modules .aro .aaz .latest .network .vnet import Show as vnet_show
2324import azure .cli .command_modules .aro .custom
2425
2526
@@ -289,15 +290,15 @@ def _validate_cidr_ranges(cmd, namespace):
289290 return _validate_cidr_ranges
290291
291292
292- def dyn_validate_resource_permissions (service_principle_ids , resources ):
293+ def dyn_validate_resource_permissions (service_principal_ids , resources ):
293294 prog = get_progress_tracker ("Validating resource permissions" )
294295
295296 @prog
296297 def _validate_resource_permissions (cmd ,
297298 _namespace ):
298299 errors = []
299300
300- for sp_id in service_principle_ids :
301+ for sp_id in service_principal_ids :
301302 for role in sorted (resources ):
302303 for resource in resources [role ]:
303304 try :
@@ -331,7 +332,7 @@ def _validate_version(cmd,
331332 if namespace .location is None :
332333 get_default_location_from_resource_group (cmd , namespace )
333334
334- versions = azure . cli . command_modules . aro .custom .aro_get_versions (namespace .client , namespace .location )
335+ versions = azext_aro .custom .aro_get_versions (namespace .client , namespace .location )
335336
336337 found = False
337338 for version in versions :
@@ -351,15 +352,47 @@ def _validate_version(cmd,
351352
352353def validate_cluster_create (version ,
353354 resources ,
354- service_principle_ids ):
355+ service_principal_ids ):
355356 error_object = []
356357
357358 error_object .append (dyn_validate_vnet ("vnet" ))
358359 error_object .append (dyn_validate_subnet_and_route_tables ("master_subnet" ))
359360 error_object .append (dyn_validate_subnet_and_route_tables ("worker_subnet" ))
360361 error_object .append (dyn_validate_cidr_ranges ())
361- error_object .append (dyn_validate_resource_permissions (service_principle_ids , resources ))
362+ error_object .append (dyn_validate_resource_permissions (service_principal_ids , resources ))
362363 if version is not None :
363364 error_object .append (dyn_validate_version ())
364365
365366 return error_object
367+
368+
369+ def dyn_validate_managed_identity_delete_permissions ():
370+ prog = get_progress_tracker ("Validating Managed Identity Delete Permissions" )
371+
372+ @prog
373+ def _validate_managed_identity_delete_permissions (cmd , namespace ):
374+ errors = []
375+ managed_identities = namespace .managed_identities
376+
377+ for mi in managed_identities :
378+ parts , auth_client = get_clients (mi , cmd )
379+ validation_errors = validate_resource (auth_client , "Managed Identity" , parts , [
380+ "Microsoft.ManagedIdentity/userAssignedIdentities/delete"
381+ ])
382+ for error in validation_errors :
383+ errors .append (f"{ error [3 ]} over { mi } " )
384+
385+ return errors
386+
387+ return _validate_managed_identity_delete_permissions
388+
389+
390+ def validate_cluster_delete (cmd , delete_identities , managed_identities ):
391+ errors = []
392+
393+ if delete_identities :
394+ namespace = collections .namedtuple ("Namespace" , ["managed_identities" ])(managed_identities )
395+ validate_managed_identity_delete = dyn_validate_managed_identity_delete_permissions ()
396+ errors .extend (validate_managed_identity_delete (cmd , namespace ))
397+
398+ return errors
0 commit comments