33# Licensed under the MIT License. See License.txt in the project root for license information.
44# --------------------------------------------------------------------------------------------
55
6-
6+ import collections
77import ipaddress
88import re
99from itertools import tee
1010
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
1511from azure .cli .core .commands .client_factory import get_mgmt_service_client
1612from azure .cli .core .commands .validators import get_default_location_from_resource_group
1713from azure .cli .core .profiles import ResourceType
18- from azure .cli .core .azclierror import CLIInternalError , InvalidArgumentValueError , \
14+ from azure .cli .core .azclierror import (
15+ CLIInternalError ,
16+ InvalidArgumentValueError ,
1917 RequiredArgumentMissingError
20- from azure .core .exceptions import ResourceNotFoundError , HttpResponseError
18+ )
19+ from azure .core .exceptions import HttpResponseError , ResourceNotFoundError
2120from azure .mgmt .core .tools import is_valid_resource_id , parse_resource_id
21+ from azure .cli .command_modules .aro ._validators import validate_vnet , validate_cidr
22+ from azure .cli .command_modules .aro ._rbac import has_role_assignment_on_resource
23+ from azure .cli .command_modules .aro .aaz .latest .network .vnet .subnet import Show as subnet_show
24+ from azure .cli .command_modules .aro .aaz .latest .network .vnet import Show as vnet_show
25+
2226from knack .log import get_logger
23- import azure .cli .command_modules .aro .custom
2427
2528
2629logger = get_logger (__name__ )
@@ -289,15 +292,15 @@ def _validate_cidr_ranges(cmd, namespace):
289292 return _validate_cidr_ranges
290293
291294
292- def dyn_validate_resource_permissions (service_principle_ids , resources ):
295+ def dyn_validate_resource_permissions (service_principal_ids , resources ):
293296 prog = get_progress_tracker ("Validating resource permissions" )
294297
295298 @prog
296299 def _validate_resource_permissions (cmd ,
297300 _namespace ):
298301 errors = []
299302
300- for sp_id in service_principle_ids :
303+ for sp_id in service_principal_ids :
301304 for role in sorted (resources ):
302305 for resource in resources [role ]:
303306 try :
@@ -331,7 +334,8 @@ def _validate_version(cmd,
331334 if namespace .location is None :
332335 get_default_location_from_resource_group (cmd , namespace )
333336
334- versions = azure .cli .command_modules .aro .custom .aro_get_versions (namespace .client , namespace .location )
337+ from azure .cli .command_modules .aro .custom import aro_get_versions
338+ versions = aro_get_versions (namespace .client , namespace .location )
335339
336340 found = False
337341 for version in versions :
@@ -351,15 +355,47 @@ def _validate_version(cmd,
351355
352356def validate_cluster_create (version ,
353357 resources ,
354- service_principle_ids ):
358+ service_principal_ids ):
355359 error_object = []
356360
357361 error_object .append (dyn_validate_vnet ("vnet" ))
358362 error_object .append (dyn_validate_subnet_and_route_tables ("master_subnet" ))
359363 error_object .append (dyn_validate_subnet_and_route_tables ("worker_subnet" ))
360364 error_object .append (dyn_validate_cidr_ranges ())
361- error_object .append (dyn_validate_resource_permissions (service_principle_ids , resources ))
365+ error_object .append (dyn_validate_resource_permissions (service_principal_ids , resources ))
362366 if version is not None :
363367 error_object .append (dyn_validate_version ())
364368
365369 return error_object
370+
371+
372+ def dyn_validate_managed_identity_delete_permissions ():
373+ prog = get_progress_tracker ("Validating Managed Identity Delete Permissions" )
374+
375+ @prog
376+ def _validate_managed_identity_delete_permissions (cmd , namespace ):
377+ errors = []
378+ managed_identities = namespace .managed_identities
379+
380+ for mi in managed_identities :
381+ parts , auth_client = get_clients (mi , cmd )
382+ validation_errors = validate_resource (auth_client , "Managed Identity" , parts , [
383+ "Microsoft.ManagedIdentity/userAssignedIdentities/delete"
384+ ])
385+ for error in validation_errors :
386+ errors .append (f"{ error [3 ]} over { mi } " )
387+
388+ return errors
389+
390+ return _validate_managed_identity_delete_permissions
391+
392+
393+ def validate_cluster_delete (cmd , delete_identities , managed_identities ):
394+ errors = []
395+
396+ if delete_identities :
397+ namespace = collections .namedtuple ("Namespace" , ["managed_identities" ])(managed_identities )
398+ validate_managed_identity_delete = dyn_validate_managed_identity_delete_permissions ()
399+ errors .extend (validate_managed_identity_delete (cmd , namespace ))
400+
401+ return errors
0 commit comments