Skip to content

Commit 8c13278

Browse files
jeskewzhoxing-ms
andauthored
[ARM] az deployment: Expose --validation-level parameter at all scopes for create, validate, and what-if subcommands (#31747)
Co-authored-by: Xing Zhou <Zhou.Xing@microsoft.com>
1 parent 41969a2 commit 8c13278

13 files changed

+2792
-110
lines changed

src/azure-cli/azure/cli/command_modules/resource/_params.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def load_arguments(self, _):
3333

3434
ExemptionCategory = self.get_models('ExemptionCategory', resource_type=ResourceType.MGMT_RESOURCE_POLICY,
3535
operation_group='policy_exemptions')
36-
DeploymentMode, WhatIfResultFormat, ChangeType = self.get_models('DeploymentMode', 'WhatIfResultFormat', 'ChangeType')
36+
DeploymentMode, WhatIfResultFormat, ChangeType, ValidationLevel = self.get_models('DeploymentMode', 'WhatIfResultFormat', 'ChangeType', 'ValidationLevel')
3737

3838
# BASIC PARAMETER CONFIGURATION
3939

@@ -58,6 +58,13 @@ def load_arguments(self, _):
5858
deployment_template_spec_type = CLIArgumentType(options_list=['--template-spec', '-s'], min_api='2019-06-01', help="The template spec resource id.")
5959
deployment_query_string_type = CLIArgumentType(options_list=['--query-string', '-q'], help="The query string (a SAS token) to be used with the template-uri in the case of linked templates.")
6060
deployment_parameters_type = CLIArgumentType(options_list=['--parameters', '-p'], action='append', nargs='+', completer=FilesCompleter(), help='the deployment parameters')
61+
deployment_validation_level_type = CLIArgumentType(options_list=['--validation-level'], arg_type=get_enum_type(ValidationLevel, None),
62+
help='The deployment validation level. May be set to "Provider" (the default), "Template", or '
63+
'"ProviderNoRbac". With a validation level of "provider", ARM will perform full validation and check that'
64+
' you have sufficient permission to deploy all resources in the template. With a validation level of '
65+
'"providerNoRbac", ARM will perform full validation but only check for read permissions on each resource.'
66+
' With a validation level of "template", only static validation will be performed: preflight and '
67+
'permissions checks will be skipped.')
6168
filter_type = CLIArgumentType(options_list=['--filter'], is_preview=True,
6269
help='Filter expression using OData notation. You can use --filter "provisioningState eq \'{state}\'" to filter provisioningState. '
6370
'To get more information, please visit https://learn.microsoft.com/rest/api/resources/deployments/listatsubscriptionscope#uri-parameters')
@@ -366,12 +373,14 @@ def load_arguments(self, _):
366373
help="Space-separated list of resource change types to be excluded from What-If results. Applicable when --confirm-with-what-if is set.")
367374
c.argument('what_if', arg_type=deployment_what_if_type)
368375
c.argument('proceed_if_no_change', arg_type=deployment_what_if_proceed_if_no_change_type)
376+
c.argument('validation_level', arg_type=deployment_validation_level_type)
369377

370378
with self.argument_context('deployment validate') as c:
371379
c.argument('deployment_name', arg_type=deployment_create_name_type)
372380
c.argument('handle_extended_json_format', arg_type=extended_json_format_type,
373381
deprecate_info=c.deprecate(target='--handle-extended-json-format/-j'))
374382
c.argument('no_prompt', arg_type=no_prompt)
383+
c.argument('validation_level', arg_type=deployment_validation_level_type)
375384

376385
with self.argument_context('deployment operation') as c:
377386
c.argument('operation_ids', nargs='+', help='A list of operation ids to show')
@@ -395,19 +404,22 @@ def load_arguments(self, _):
395404
help="Space-separated list of resource change types to be excluded from What-If results. Applicable when --confirm-with-what-if is set.")
396405
c.argument('what_if', arg_type=deployment_what_if_type)
397406
c.argument('proceed_if_no_change', arg_type=deployment_what_if_proceed_if_no_change_type)
407+
c.argument('validation_level', arg_type=deployment_validation_level_type)
398408

399409
with self.argument_context('deployment sub what-if') as c:
400410
c.argument('deployment_name', arg_type=deployment_create_name_type)
401411
c.argument('no_prompt', arg_type=no_prompt)
402412
c.argument('result_format', arg_type=deployment_what_if_result_format_type)
403413
c.argument('no_pretty_print', arg_type=deployment_what_if_no_pretty_print_type)
404414
c.argument('exclude_change_types', arg_type=deployment_what_if_exclude_change_types_type)
415+
c.argument('validation_level', arg_type=deployment_validation_level_type)
405416

406417
with self.argument_context('deployment sub validate') as c:
407418
c.argument('deployment_name', arg_type=deployment_create_name_type)
408419
c.argument('handle_extended_json_format', arg_type=extended_json_format_type,
409420
deprecate_info=c.deprecate(target='--handle-extended-json-format/-j'))
410421
c.argument('no_prompt', arg_type=no_prompt)
422+
c.argument('validation_level', arg_type=deployment_validation_level_type)
411423

412424
with self.argument_context('deployment sub list') as c:
413425
c.argument('filter_string', arg_type=filter_type)
@@ -436,6 +448,7 @@ def load_arguments(self, _):
436448
help="Space-separated list of resource change types to be excluded from What-If results. Applicable when --confirm-with-what-if is set.")
437449
c.argument('what_if', arg_type=deployment_what_if_type)
438450
c.argument('proceed_if_no_change', arg_type=deployment_what_if_proceed_if_no_change_type)
451+
c.argument('validation_level', arg_type=deployment_validation_level_type)
439452

440453
with self.argument_context('deployment group what-if') as c:
441454
c.argument('deployment_name', arg_type=deployment_create_name_type)
@@ -446,12 +459,14 @@ def load_arguments(self, _):
446459
c.argument('no_pretty_print', arg_type=deployment_what_if_no_pretty_print_type)
447460
c.argument('exclude_change_types', arg_type=deployment_what_if_exclude_change_types_type)
448461
c.ignore("rollback_on_error")
462+
c.argument('validation_level', arg_type=deployment_validation_level_type)
449463

450464
with self.argument_context('deployment group validate') as c:
451465
c.argument('deployment_name', arg_type=deployment_create_name_type)
452466
c.argument('handle_extended_json_format', arg_type=extended_json_format_type,
453467
deprecate_info=c.deprecate(target='--handle-extended-json-format/-j'))
454468
c.argument('no_prompt', arg_type=no_prompt)
469+
c.argument('validation_level', arg_type=deployment_validation_level_type)
455470

456471
with self.argument_context('deployment group list') as c:
457472
c.argument('filter_string', arg_type=filter_type)
@@ -475,19 +490,22 @@ def load_arguments(self, _):
475490
c.argument('what_if', arg_type=deployment_what_if_type)
476491
c.argument('proceed_if_no_change', arg_type=deployment_what_if_proceed_if_no_change_type)
477492
c.argument('mode', arg_type=get_enum_type(DeploymentMode, default='incremental'), help='The mode that is used to deploy resources. This value can be either Incremental or Complete. In Incremental mode, resources are deployed without deleting existing resources that are not included in the template. In Complete mode, resources are deployed and existing resources in the resource group that are not included in the template are deleted. Be careful when using Complete mode as you may unintentionally delete resources.')
493+
c.argument('validation_level', arg_type=deployment_validation_level_type)
478494

479495
with self.argument_context('deployment mg what-if') as c:
480496
c.argument('deployment_name', arg_type=deployment_create_name_type)
481497
c.argument('no_prompt', arg_type=no_prompt)
482498
c.argument('result_format', arg_type=deployment_what_if_result_format_type)
483499
c.argument('no_pretty_print', arg_type=deployment_what_if_no_pretty_print_type)
484500
c.argument('exclude_change_types', arg_type=deployment_what_if_exclude_change_types_type)
501+
c.argument('validation_level', arg_type=deployment_validation_level_type)
485502

486503
with self.argument_context('deployment mg validate') as c:
487504
c.argument('deployment_name', arg_type=deployment_create_name_type)
488505
c.argument('handle_extended_json_format', arg_type=extended_json_format_type,
489506
deprecate_info=c.deprecate(target='--handle-extended-json-format/-j'))
490507
c.argument('no_prompt', arg_type=no_prompt)
508+
c.argument('validation_level', arg_type=deployment_validation_level_type)
491509

492510
with self.argument_context('deployment mg list') as c:
493511
c.argument('filter_string', arg_type=filter_type)
@@ -512,19 +530,22 @@ def load_arguments(self, _):
512530
min_api="2019-10-01")
513531
c.argument('what_if', arg_type=deployment_what_if_type)
514532
c.argument('proceed_if_no_change', arg_type=deployment_what_if_proceed_if_no_change_type)
533+
c.argument('validation_level', arg_type=deployment_validation_level_type)
515534

516535
with self.argument_context('deployment tenant what-if') as c:
517536
c.argument('deployment_name', arg_type=deployment_create_name_type)
518537
c.argument('no_prompt', arg_type=no_prompt)
519538
c.argument('result_format', arg_type=deployment_what_if_result_format_type)
520539
c.argument('no_pretty_print', arg_type=deployment_what_if_no_pretty_print_type)
521540
c.argument('exclude_change_types', arg_type=deployment_what_if_exclude_change_types_type)
541+
c.argument('validation_level', arg_type=deployment_validation_level_type)
522542

523543
with self.argument_context('deployment tenant validate') as c:
524544
c.argument('deployment_name', arg_type=deployment_create_name_type)
525545
c.argument('handle_extended_json_format', arg_type=extended_json_format_type,
526546
deprecate_info=c.deprecate(target='--handle-extended-json-format/-j'))
527547
c.argument('no_prompt', arg_type=no_prompt)
548+
c.argument('validation_level', arg_type=deployment_validation_level_type)
528549

529550
with self.argument_context('deployment tenant list') as c:
530551
c.argument('filter_string', arg_type=filter_type)

0 commit comments

Comments
 (0)