diff --git a/src/azure-cli/azure/cli/command_modules/resource/custom.py b/src/azure-cli/azure/cli/command_modules/resource/custom.py index e4073695217..2e69079e236 100644 --- a/src/azure-cli/azure/cli/command_modules/resource/custom.py +++ b/src/azure-cli/azure/cli/command_modules/resource/custom.py @@ -387,13 +387,11 @@ def _deploy_arm_template_core_unmodified(cmd, resource_group_name, template_file if template_uri: template_link = TemplateLink(uri=template_uri) template_obj = _remove_comments_from_json(_urlretrieve(template_uri).decode('utf-8'), file_path=template_uri) + template_for_deployment = None # Use template_link for URI-based deployments else: - template_content = ( - run_bicep_command(cmd.cli_ctx, ["build", "--stdout", template_file]) - if is_bicep_file(template_file) - else read_file_content(template_file) - ) - template_obj = _remove_comments_from_json(template_content, file_path=template_file) + # This function is resource-group-specific, so we hardcode 'resourceGroup' deployment scope + template_content, template_obj = _process_template_file(cmd, template_file, 'resourceGroup') + template_for_deployment = _get_template_for_deployment(template_uri, None, template_file, template_content, template_obj, None) if rollback_on_error == '': on_error_deployment = OnErrorDeployment(type='LastSuccessful') @@ -406,7 +404,7 @@ def _deploy_arm_template_core_unmodified(cmd, resource_group_name, template_file parameters = json.loads(json.dumps(parameters)) - properties = DeploymentProperties(template=template_content, template_link=template_link, + properties = DeploymentProperties(template=template_for_deployment, template_link=template_link, parameters=parameters, mode=mode, on_error_deployment=on_error_deployment) smc = get_mgmt_service_client(cmd.cli_ctx, ResourceType.MGMT_RESOURCE_DEPLOYMENTS, @@ -479,6 +477,7 @@ def on_request(self, request): # Because the service cannot deserialize the template element: "template": "{\r\n \"$schema\": \"...\",\r\n \"contentVersion\": \"...\",\r\n \"parameters\": {...}}" partial_request = json.dumps(modified_data) json_data = partial_request[:-2] + ", template:" + template + r"}}" + http_request.data = json_data.encode('utf-8') # This caused a very difficult-to-debug issue, because AzCLI's debug logs are written before this transformation. @@ -1121,6 +1120,46 @@ def _load_template_spec_template(cmd, template_spec): return template_obj +def _get_template_for_deployment(template_uri, template_spec, template_file, template_content, template_obj, parameters): + """Determine what to use for template deployment based on the source""" + if template_uri or template_spec: + # For URI and template spec deployments, use None (template_link will be used) + return None + + if _is_bicepparam_file_provided(parameters): + # For bicepparam files, use the content + return template_content + + if template_file and is_bicep_file(template_file): + # For bicep files, convert the parsed object back to compact JSON string + # This avoids the size inflation issue while maintaining compatibility + # with the Azure SDK which expects string content + return json.dumps(template_obj, separators=(',', ':')) + + # For ARM template files, use string content + return template_content + + +def _process_template_file(cmd, template_file, deployment_scope): + """Process template file and return template_content and template_obj""" + if is_bicep_file(template_file): + # Get compiled JSON from bicep + template_content = run_bicep_command(cmd.cli_ctx, ["build", "--stdout", template_file]) + # For bicep files, parse JSON directly to avoid Azure SDK size inflation. + # Bicep compilation outputs clean JSON without comments, so it's safe to + # parse directly. This prevents the 4MB template size limit issue caused + # by Azure SDK string escaping when using template content as string. + template_obj = json.loads(template_content) + template_schema = template_obj.get('$schema', '') + validate_bicep_target_scope(template_schema, deployment_scope) + else: + # For ARM template files, read content and process comments + template_content = read_file_content(template_file) + template_obj = _remove_comments_from_json(template_content, file_path=template_file) + + return template_content, template_obj + + def _prepare_deployment_properties_unmodified(cmd, deployment_scope, template_file=None, template_uri=None, parameters=None, mode=None, rollback_on_error=None, no_prompt=False, template_spec=None, query_string=None, validation_level=None): @@ -1167,17 +1206,7 @@ def _prepare_deployment_properties_unmodified(cmd, deployment_scope, template_fi template_schema = template_obj.get('$schema', '') validate_bicep_target_scope(template_schema, deployment_scope) else: - template_content = ( - run_bicep_command(cmd.cli_ctx, ["build", "--stdout", template_file]) - if is_bicep_file(template_file) - else read_file_content(template_file) - ) - - template_obj = _remove_comments_from_json(template_content, file_path=template_file) - - if is_bicep_file(template_file): - template_schema = template_obj.get('$schema', '') - validate_bicep_target_scope(template_schema, deployment_scope) + template_content, template_obj = _process_template_file(cmd, template_file, deployment_scope) if rollback_on_error == '': on_error_deployment = OnErrorDeployment(type='LastSuccessful') @@ -1193,7 +1222,9 @@ def _prepare_deployment_properties_unmodified(cmd, deployment_scope, template_fi parameters = _get_missing_parameters(parameters, template_obj, _prompt_for_parameters, no_prompt) parameters = json.loads(json.dumps(parameters)) - properties = DeploymentProperties(template=template_content, template_link=template_link, + template_for_deployment = _get_template_for_deployment(template_uri, template_spec, template_file, template_content, template_obj, parameters) + + properties = DeploymentProperties(template=template_for_deployment, template_link=template_link, parameters=parameters, mode=mode, on_error_deployment=on_error_deployment, validation_level=validation_level) return properties diff --git a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/recordings/test_bicep_deployment_size_optimization.yaml b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/recordings/test_bicep_deployment_size_optimization.yaml new file mode 100644 index 00000000000..89605a71eb3 --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/recordings/test_bicep_deployment_size_optimization.yaml @@ -0,0 +1,348 @@ +interactions: +- request: + body: '{"properties": {"parameters": {"keyVaultName": {"value": "testkv000003"}}, + "mode": "Incremental", template:{"$schema":"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion":"1.0.0.0","metadata":{"_generator":{"name":"bicep","version":"0.37.4.10188","templateHash":"12198504944717319814"}},"parameters":{"keyVaultName":{"type":"string"},"location":{"type":"string","defaultValue":"[resourceGroup().location]"},"tenantId":{"type":"string","defaultValue":"[subscription().tenantId]"}},"resources":[{"type":"Microsoft.KeyVault/vaults","apiVersion":"2023-07-01","name":"[parameters(''keyVaultName'')]","location":"[parameters(''location'')]","properties":{"sku":{"family":"A","name":"standard"},"tenantId":"[parameters(''tenantId'')]","accessPolicies":[],"enableRbacAuthorization":true,"enableSoftDelete":true,"softDeleteRetentionInDays":7}}],"outputs":{"keyVaultName":{"type":"string","value":"[parameters(''keyVaultName'')]"},"keyVaultId":{"type":"string","value":"[resourceId(''Microsoft.KeyVault/vaults'', + parameters(''keyVaultName''))]"}}}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + Content-Length: + - '1073' + Content-Type: + - application/json + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: POST + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/mock-deployment/validate?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/deploy000002","name":"deploy000002","type":"Microsoft.Resources/deployments","properties":{"templateHash":"12198504944717319814","parameters":{"keyVaultName":{"type":"String","value":"testkv000003"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Succeeded","timestamp":"2025-08-28T20:53:05.58877Z","duration":"PT0S","correlationId":"6a69a078-24f3-498e-a27d-a7da4cdb6ec2","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[],"validatedResources":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.KeyVault/vaults/testkv000003"}]}}' + headers: + cache-control: + - no-cache + content-length: + - '948' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:53:07 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '11999' + x-ms-ratelimit-remaining-subscription-writes: + - '799' + x-msedge-ref: + - 'Ref A: 8325F732E9574BA5AA3921297A662584 Ref B: CO6AA3150217027 Ref C: 2025-08-28T20:53:05Z' + status: + code: 200 + message: OK +- request: + body: '{"properties": {"parameters": {"keyVaultName": {"value": "testkv000003"}}, + "mode": "Incremental", template:{"$schema":"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion":"1.0.0.0","metadata":{"_generator":{"name":"bicep","version":"0.37.4.10188","templateHash":"12198504944717319814"}},"parameters":{"keyVaultName":{"type":"string"},"location":{"type":"string","defaultValue":"[resourceGroup().location]"},"tenantId":{"type":"string","defaultValue":"[subscription().tenantId]"}},"resources":[{"type":"Microsoft.KeyVault/vaults","apiVersion":"2023-07-01","name":"[parameters(''keyVaultName'')]","location":"[parameters(''location'')]","properties":{"sku":{"family":"A","name":"standard"},"tenantId":"[parameters(''tenantId'')]","accessPolicies":[],"enableRbacAuthorization":true,"enableSoftDelete":true,"softDeleteRetentionInDays":7}}],"outputs":{"keyVaultName":{"type":"string","value":"[parameters(''keyVaultName'')]"},"keyVaultId":{"type":"string","value":"[resourceId(''Microsoft.KeyVault/vaults'', + parameters(''keyVaultName''))]"}}}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + Content-Length: + - '1073' + Content-Type: + - application/json + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/mock-deployment?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/deploy000002","name":"deploy000002","type":"Microsoft.Resources/deployments","properties":{"templateHash":"12198504944717319814","parameters":{"keyVaultName":{"type":"String","value":"testkv000003"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Accepted","timestamp":"2025-08-28T20:53:08.6036584Z","duration":"PT0.0003102S","correlationId":"c7096ac0-99ed-423e-935d-259844297af7","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[]}}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/deploy000002/operationStatuses/08584451924968626181?api-version=2025-04-01&t=638920111909004981&c=MIIIpTCCBo2gAwIBAgITFgGsmnj73LBE7PaBtQABAayaeDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDMwHhcNMjUwNzE4MTIwNDI4WhcNMjYwMTE0MTIwNDI4WjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYwXiklImL5-WfPWj2FX3_Y-JxCd3XXEOuNXx5ggHubZZamujLTqEBSFsFYiH_9NCaqKTiATXu6fBpzW3ghgYhwr0PL071fQT15KnnNUFjd5hFXB7SYti9IwWu1lxSAz-De7HivujKdlsgcmfoV6upRQ0eva9e74EwLV9pCn4WQAhs-6T8p0CytQsi81qHMWybAbNvfom0ox78IEWdS_6g_d4Jl_I4ccYLMyRTOV2NioM96cRECWCZhbpLl1zwoYGSbU5H0MZaiCBjPlhXN40BqagpamZfP98sPYSBfreh6-iMGU5tNTRkh8RiJqzjhzIUpEv3PqLtWTyPUB8JS7aUCAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFghfmRS4WsmTQCAWQCAQcwggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQU0zUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMygxKS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0FNM1BLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9BTTNQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAzKDEpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQU0zUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMygxKS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0FNM1BLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3J0MB0GA1UdDgQWBBTxzPCXgPzIUiTz94us0y0CCMf8BzAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwIwDAYKKwYBBAGCN3sEAjAfBgNVHSMEGDAWgBRIo61gdWpv7GDzaVXRALEyV_xs5DAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAAqNK9Ejzdnb9L4TyakCpJByRYVTN_6nCGbtUd2E2sELjuJGRGiRmujp_jqNyIofO_ghSaP_tqH-3WRTRUbnt5xM8aBYoYJSOgKgTsNrB6clspdhCCmzhJy6EQuOqfUDm3C7hDru1_bN3DwXt3VpDqfuYtM3MAabKg0oCYVWgFwnAKYmZLZMWMQh7k_hZxy1gOCQmE9U08tf_pU21aI0El6n5A5uG2FT0placwchheFmXAtoPjT7nU53HVmRissxUR_vRCDj_ZCFo3K3nZNXCQOKPAMc9-LC0prb9Slg6siKtSHB3iGjNQlT9-nbSnDgifI8zC1cvT8CdaNLOmUywRIB4wvRn1z123NuyfJaIz95igW9P189vBTJEZREF-MgJEboWKdlGNn6bbBtu0waqAmUU7WVLeZKdtUI6EEKF7wRGYuY_BhZx1ipyXnBHZpsufuH4AwgOO289QKmqg8QAy7HFD9c8H8fNCtR7sTZ4YNP2AhEaES0rkMSQUCNVEz42YEBi2GgrSpnI94SPdb3J3PkCMZ4OgFRjztLO7nrgbPtflhSOo_VOE0_7Y74km43WAMQPKL3-44vQrEQ61Hd_24IcFh_ChNXvUDqp39GzYlO3D0zlau4ozll8BeLUZrJwHTQWZS8XR-EifCl4MW5Y3Y1SxOLrIxnukCzQxL7aGmc&s=LIFnYuSrd2nJPefgjwljB1AELBkWmfO1KftEVE2gxhq_yEsGcrtFHnbHVIKMnwZ_8K-rJDGeT82SoUx__ztU3RUR-Cg54yS09Vu-nnoudBhXs6EpTGM0uDoEVHk7kDcqteZ5Muf7NXRx6lF6VYZNBDAXy5MxGNw5KmVtNTjNHJwf3gzv6kdAw_dcA-YJrycn0937PfIN3uUBlylkzDSPQhwP3J3TVM7soVhwiNRzwV-vlqJgt8bib-5T9ZzE1sJRY6kcB5DJ6nnPMryBRTIEuXAA9OjbtbiXcmCAct_apqd21PbuKHq9dypWqSxY2LD3875Uqw10M9WmUKHf5qu_EQ&h=o2DN7Ncf3Tbxr0SGLDcaTllDauEyH5ydi_q0aR9RE3g + cache-control: + - no-cache + content-length: + - '779' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:53:10 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-deployment-engine-version: + - 1.430.0 + x-ms-ratelimit-remaining-subscription-global-writes: + - '11999' + x-ms-ratelimit-remaining-subscription-writes: + - '799' + x-msedge-ref: + - 'Ref A: 90FF512FE33C4798B360F070D035F04E Ref B: MWH011020809023 Ref C: 2025-08-28T20:53:08Z' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/mock-deployment/operationStatuses/08584451924968626181?api-version=2025-04-01&t=638920111909004981&c=MIIIpTCCBo2gAwIBAgITFgGsmnj73LBE7PaBtQABAayaeDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDMwHhcNMjUwNzE4MTIwNDI4WhcNMjYwMTE0MTIwNDI4WjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYwXiklImL5-WfPWj2FX3_Y-JxCd3XXEOuNXx5ggHubZZamujLTqEBSFsFYiH_9NCaqKTiATXu6fBpzW3ghgYhwr0PL071fQT15KnnNUFjd5hFXB7SYti9IwWu1lxSAz-De7HivujKdlsgcmfoV6upRQ0eva9e74EwLV9pCn4WQAhs-6T8p0CytQsi81qHMWybAbNvfom0ox78IEWdS_6g_d4Jl_I4ccYLMyRTOV2NioM96cRECWCZhbpLl1zwoYGSbU5H0MZaiCBjPlhXN40BqagpamZfP98sPYSBfreh6-iMGU5tNTRkh8RiJqzjhzIUpEv3PqLtWTyPUB8JS7aUCAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFghfmRS4WsmTQCAWQCAQcwggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQU0zUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMygxKS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0FNM1BLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9BTTNQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAzKDEpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQU0zUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMygxKS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0FNM1BLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3J0MB0GA1UdDgQWBBTxzPCXgPzIUiTz94us0y0CCMf8BzAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwIwDAYKKwYBBAGCN3sEAjAfBgNVHSMEGDAWgBRIo61gdWpv7GDzaVXRALEyV_xs5DAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAAqNK9Ejzdnb9L4TyakCpJByRYVTN_6nCGbtUd2E2sELjuJGRGiRmujp_jqNyIofO_ghSaP_tqH-3WRTRUbnt5xM8aBYoYJSOgKgTsNrB6clspdhCCmzhJy6EQuOqfUDm3C7hDru1_bN3DwXt3VpDqfuYtM3MAabKg0oCYVWgFwnAKYmZLZMWMQh7k_hZxy1gOCQmE9U08tf_pU21aI0El6n5A5uG2FT0placwchheFmXAtoPjT7nU53HVmRissxUR_vRCDj_ZCFo3K3nZNXCQOKPAMc9-LC0prb9Slg6siKtSHB3iGjNQlT9-nbSnDgifI8zC1cvT8CdaNLOmUywRIB4wvRn1z123NuyfJaIz95igW9P189vBTJEZREF-MgJEboWKdlGNn6bbBtu0waqAmUU7WVLeZKdtUI6EEKF7wRGYuY_BhZx1ipyXnBHZpsufuH4AwgOO289QKmqg8QAy7HFD9c8H8fNCtR7sTZ4YNP2AhEaES0rkMSQUCNVEz42YEBi2GgrSpnI94SPdb3J3PkCMZ4OgFRjztLO7nrgbPtflhSOo_VOE0_7Y74km43WAMQPKL3-44vQrEQ61Hd_24IcFh_ChNXvUDqp39GzYlO3D0zlau4ozll8BeLUZrJwHTQWZS8XR-EifCl4MW5Y3Y1SxOLrIxnukCzQxL7aGmc&s=LIFnYuSrd2nJPefgjwljB1AELBkWmfO1KftEVE2gxhq_yEsGcrtFHnbHVIKMnwZ_8K-rJDGeT82SoUx__ztU3RUR-Cg54yS09Vu-nnoudBhXs6EpTGM0uDoEVHk7kDcqteZ5Muf7NXRx6lF6VYZNBDAXy5MxGNw5KmVtNTjNHJwf3gzv6kdAw_dcA-YJrycn0937PfIN3uUBlylkzDSPQhwP3J3TVM7soVhwiNRzwV-vlqJgt8bib-5T9ZzE1sJRY6kcB5DJ6nnPMryBRTIEuXAA9OjbtbiXcmCAct_apqd21PbuKHq9dypWqSxY2LD3875Uqw10M9WmUKHf5qu_EQ&h=o2DN7Ncf3Tbxr0SGLDcaTllDauEyH5ydi_q0aR9RE3g + response: + body: + string: '{"status":"Running"}' + headers: + cache-control: + - no-cache + content-length: + - '20' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:53:10 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 1FE0A6078DD645BBBF09F8DE01B7190F Ref B: CO6AA3150220051 Ref C: 2025-08-28T20:53:11Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/mock-deployment/operationStatuses/08584451924968626181?api-version=2025-04-01&t=638920111909004981&c=MIIIpTCCBo2gAwIBAgITFgGsmnj73LBE7PaBtQABAayaeDANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDMwHhcNMjUwNzE4MTIwNDI4WhcNMjYwMTE0MTIwNDI4WjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKYwXiklImL5-WfPWj2FX3_Y-JxCd3XXEOuNXx5ggHubZZamujLTqEBSFsFYiH_9NCaqKTiATXu6fBpzW3ghgYhwr0PL071fQT15KnnNUFjd5hFXB7SYti9IwWu1lxSAz-De7HivujKdlsgcmfoV6upRQ0eva9e74EwLV9pCn4WQAhs-6T8p0CytQsi81qHMWybAbNvfom0ox78IEWdS_6g_d4Jl_I4ccYLMyRTOV2NioM96cRECWCZhbpLl1zwoYGSbU5H0MZaiCBjPlhXN40BqagpamZfP98sPYSBfreh6-iMGU5tNTRkh8RiJqzjhzIUpEv3PqLtWTyPUB8JS7aUCAwEAAaOCBJIwggSOMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFghfmRS4WsmTQCAWQCAQcwggHaBggrBgEFBQcBAQSCAcwwggHIMGYGCCsGAQUFBzAChlpodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvQU0zUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMygxKS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0FNM1BLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3J0MFYGCCsGAQUFBzAChkpodHRwOi8vY3JsMi5hbWUuZ2JsL2FpYS9BTTNQS0lJTlRDQTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDAzKDEpLmNydDBWBggrBgEFBQcwAoZKaHR0cDovL2NybDMuYW1lLmdibC9haWEvQU0zUEtJSU5UQ0EwMS5BTUUuR0JMX0FNRSUyMEluZnJhJTIwQ0ElMjAwMygxKS5jcnQwVgYIKwYBBQUHMAKGSmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0FNM1BLSUlOVENBMDEuQU1FLkdCTF9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3J0MB0GA1UdDgQWBBTxzPCXgPzIUiTz94us0y0CCMf8BzAOBgNVHQ8BAf8EBAMCBaAwggE1BgNVHR8EggEsMIIBKDCCASSgggEgoIIBHIZCaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JshjRodHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBJbmZyYSUyMENBJTIwMDMoMSkuY3JsMIGdBgNVHSAEgZUwgZIwDAYKKwYBBAGCN3sBATBmBgorBgEEAYI3ewICMFgwVgYIKwYBBQUHAgIwSh5IADMAMwBlADAAMQA5ADIAMQAtADQAZAA2ADQALQA0AGYAOABjAC0AYQAwADUANQAtADUAYgBkAGEAZgBmAGQANQBlADMAMwBkMAwGCisGAQQBgjd7AwIwDAYKKwYBBAGCN3sEAjAfBgNVHSMEGDAWgBRIo61gdWpv7GDzaVXRALEyV_xs5DAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAAqNK9Ejzdnb9L4TyakCpJByRYVTN_6nCGbtUd2E2sELjuJGRGiRmujp_jqNyIofO_ghSaP_tqH-3WRTRUbnt5xM8aBYoYJSOgKgTsNrB6clspdhCCmzhJy6EQuOqfUDm3C7hDru1_bN3DwXt3VpDqfuYtM3MAabKg0oCYVWgFwnAKYmZLZMWMQh7k_hZxy1gOCQmE9U08tf_pU21aI0El6n5A5uG2FT0placwchheFmXAtoPjT7nU53HVmRissxUR_vRCDj_ZCFo3K3nZNXCQOKPAMc9-LC0prb9Slg6siKtSHB3iGjNQlT9-nbSnDgifI8zC1cvT8CdaNLOmUywRIB4wvRn1z123NuyfJaIz95igW9P189vBTJEZREF-MgJEboWKdlGNn6bbBtu0waqAmUU7WVLeZKdtUI6EEKF7wRGYuY_BhZx1ipyXnBHZpsufuH4AwgOO289QKmqg8QAy7HFD9c8H8fNCtR7sTZ4YNP2AhEaES0rkMSQUCNVEz42YEBi2GgrSpnI94SPdb3J3PkCMZ4OgFRjztLO7nrgbPtflhSOo_VOE0_7Y74km43WAMQPKL3-44vQrEQ61Hd_24IcFh_ChNXvUDqp39GzYlO3D0zlau4ozll8BeLUZrJwHTQWZS8XR-EifCl4MW5Y3Y1SxOLrIxnukCzQxL7aGmc&s=LIFnYuSrd2nJPefgjwljB1AELBkWmfO1KftEVE2gxhq_yEsGcrtFHnbHVIKMnwZ_8K-rJDGeT82SoUx__ztU3RUR-Cg54yS09Vu-nnoudBhXs6EpTGM0uDoEVHk7kDcqteZ5Muf7NXRx6lF6VYZNBDAXy5MxGNw5KmVtNTjNHJwf3gzv6kdAw_dcA-YJrycn0937PfIN3uUBlylkzDSPQhwP3J3TVM7soVhwiNRzwV-vlqJgt8bib-5T9ZzE1sJRY6kcB5DJ6nnPMryBRTIEuXAA9OjbtbiXcmCAct_apqd21PbuKHq9dypWqSxY2LD3875Uqw10M9WmUKHf5qu_EQ&h=o2DN7Ncf3Tbxr0SGLDcaTllDauEyH5ydi_q0aR9RE3g + response: + body: + string: '{"status":"Succeeded"}' + headers: + cache-control: + - no-cache + content-length: + - '22' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:53:41 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 3C3A08DC410E4FF0B14CB29F0EACD58F Ref B: MWH011020808054 Ref C: 2025-08-28T20:53:41Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/mock-deployment?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/deploy000002","name":"deploy000002","type":"Microsoft.Resources/deployments","properties":{"templateHash":"12198504944717319814","parameters":{"keyVaultName":{"type":"String","value":"testkv000003"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Succeeded","timestamp":"2025-08-28T20:53:29.7448066Z","duration":"PT21.1411482S","correlationId":"c7096ac0-99ed-423e-935d-259844297af7","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[],"outputs":{"keyVaultName":{"type":"String","value":"testkv000003"},"keyVaultId":{"type":"String","value":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.KeyVault/vaults/testkv000003"}},"outputResources":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.KeyVault/vaults/testkv000003"}]}}' + headers: + cache-control: + - no-cache + content-length: + - '1211' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:53:41 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: D5DB070D85B9496EB76E39AE2E49786D Ref B: MWH011020809062 Ref C: 2025-08-28T20:53:41Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group show + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/mock-deployment?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.Resources/deployments/deploy000002","name":"deploy000002","type":"Microsoft.Resources/deployments","properties":{"templateHash":"12198504944717319814","parameters":{"keyVaultName":{"type":"String","value":"testkv000003"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Succeeded","timestamp":"2025-08-28T20:53:29.7448066Z","duration":"PT21.1411482S","correlationId":"c7096ac0-99ed-423e-935d-259844297af7","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[],"outputs":{"keyVaultName":{"type":"String","value":"testkv000003"},"keyVaultId":{"type":"String","value":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.KeyVault/vaults/testkv000003"}},"outputResources":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.KeyVault/vaults/testkv000003"}]}}' + headers: + cache-control: + - no-cache + content-length: + - '1211' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:53:41 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 39E57EF2164840E2A05F48105CE7F2D3 Ref B: CO6AA3150218053 Ref C: 2025-08-28T20:53:42Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - keyvault show + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.KeyVault/vaults/testkv000003?api-version=2024-11-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_size_opt000001/providers/Microsoft.KeyVault/vaults/testkv000003","name":"testkv000003","type":"Microsoft.KeyVault/vaults","location":"westus","tags":{},"systemData":{"createdBy":"test@example.com","createdByType":"User","createdAt":"2025-08-28T20:53:11.9Z","lastModifiedBy":"test@example.com","lastModifiedByType":"User","lastModifiedAt":"2025-08-28T20:53:11.9Z"},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[],"enabledForDeployment":false,"enableSoftDelete":true,"softDeleteRetentionInDays":7,"enableRbacAuthorization":true,"vaultUri":"https://testkv000003.vault.azure.net/","provisioningState":"Succeeded","publicNetworkAccess":"Enabled"}}' + headers: + cache-control: + - no-cache + content-length: + - '806' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:53:41 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-keyvault-service-version: + - 2.2.261.0 + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 7A048DB3AD9443D382ECF7EB9B88EB1A Ref B: MWH011020808052 Ref C: 2025-08-28T20:53:42Z' + status: + code: 200 + message: OK +version: 1 diff --git a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/recordings/test_bicep_vs_arm_template_deployment.yaml b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/recordings/test_bicep_vs_arm_template_deployment.yaml new file mode 100644 index 00000000000..9deff3914cc --- /dev/null +++ b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/recordings/test_bicep_vs_arm_template_deployment.yaml @@ -0,0 +1,670 @@ +interactions: +- request: + body: '{"properties": {"parameters": {"keyVaultName": {"value": "bicepkv000004"}}, + "mode": "Incremental", template:{"$schema":"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion":"1.0.0.0","metadata":{"_generator":{"name":"bicep","version":"0.37.4.10188","templateHash":"14716929485202359217"}},"parameters":{"keyVaultName":{"type":"string"},"location":{"type":"string","defaultValue":"[resourceGroup().location]"},"tenantId":{"type":"string","defaultValue":"[subscription().tenantId]"}},"resources":[{"type":"Microsoft.KeyVault/vaults","apiVersion":"2023-07-01","name":"[parameters(''keyVaultName'')]","location":"[parameters(''location'')]","properties":{"sku":{"family":"A","name":"standard"},"tenantId":"[parameters(''tenantId'')]","accessPolicies":[],"enableRbacAuthorization":true,"enableSoftDelete":true,"softDeleteRetentionInDays":7}}],"outputs":{"keyVaultName":{"type":"string","value":"[parameters(''keyVaultName'')]"}}}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + Content-Length: + - '963' + Content-Type: + - application/json + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: POST + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment/validate?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/biceptest000002","name":"biceptest000002","type":"Microsoft.Resources/deployments","properties":{"templateHash":"14716929485202359217","parameters":{"keyVaultName":{"type":"String","value":"bicepkv000004"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Succeeded","timestamp":"2025-08-28T20:48:56.0595611Z","duration":"PT0S","correlationId":"401d8aa9-070e-4012-93fa-f5b1724cfbd8","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[],"validatedResources":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/bicepkv000004"}]}}' + headers: + cache-control: + - no-cache + content-length: + - '962' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:48:57 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '11999' + x-ms-ratelimit-remaining-subscription-writes: + - '799' + x-msedge-ref: + - 'Ref A: 0B1C4E3F11434BC3B81D735F9CD1ABE9 Ref B: MWH011020809040 Ref C: 2025-08-28T20:48:55Z' + status: + code: 200 + message: OK +- request: + body: '{"properties": {"parameters": {"keyVaultName": {"value": "bicepkv000004"}}, + "mode": "Incremental", template:{"$schema":"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion":"1.0.0.0","metadata":{"_generator":{"name":"bicep","version":"0.37.4.10188","templateHash":"14716929485202359217"}},"parameters":{"keyVaultName":{"type":"string"},"location":{"type":"string","defaultValue":"[resourceGroup().location]"},"tenantId":{"type":"string","defaultValue":"[subscription().tenantId]"}},"resources":[{"type":"Microsoft.KeyVault/vaults","apiVersion":"2023-07-01","name":"[parameters(''keyVaultName'')]","location":"[parameters(''location'')]","properties":{"sku":{"family":"A","name":"standard"},"tenantId":"[parameters(''tenantId'')]","accessPolicies":[],"enableRbacAuthorization":true,"enableSoftDelete":true,"softDeleteRetentionInDays":7}}],"outputs":{"keyVaultName":{"type":"string","value":"[parameters(''keyVaultName'')]"}}}}}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + Content-Length: + - '963' + Content-Type: + - application/json + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/biceptest000002","name":"biceptest000002","type":"Microsoft.Resources/deployments","properties":{"templateHash":"14716929485202359217","parameters":{"keyVaultName":{"type":"String","value":"bicepkv000004"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Accepted","timestamp":"2025-08-28T20:48:58.6701608Z","duration":"PT0.0001103S","correlationId":"53b5db79-458e-4ef0-a867-32a1e9470c51","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[]}}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/biceptest000002/operationStatuses/08584451927467952292?api-version=2025-04-01&t=638920109407950878&c=MIIIrzCCBpegAwIBAgITUQB9VQ7j8TP8msVbVQABAH1VDjANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDQwHhcNMjUwNzE3MTAxMTQxWhcNMjYwMTEzMTAxMTQxWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN9uFRCckwovJWtl1-Qq22Rnc8i5ftzF4eCW9m-t2gMd0gI4H3ggHFS8o7Lgo7NFrSHde_fOw5TG4ClBFPIvYtP-yRXA_gQTjDDxbdEKLTNE3lXVjb2lGS92EXrq2q8SW9iUszX4c5rv7wvK4PYYmWBgrA0pnZoN3Sb-PCkHdwTiQ6s-KaN9TaDX22q-VAiBKtuEV3lfxq84cdn8poLqbGH9aJs3mwzZSvSnDtSic6XB7Wn2B9rEtP4D_EPxNAlrtE-8p4QQxJKsU4kvH2HkbDTA3s-9XDYPgpo-bc_TuPA79C9cwY_yDUwxeCiVXq6u1ouDEDRV8y-SdlEtMwA_L3kCAwEAAaOCBJwwggSYMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFghfmRS4WsmTQCAWQCAQcwggHkBggrBgEFBQcBAQSCAdYwggHSMGgGCCsGAQUFBzAChlxodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDEuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDIuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDMuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDQuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDAdBgNVHQ4EFgQUb0zVsI6tU0Ya4PntQPSVi05azTgwDgYDVR0PAQH_BAQDAgWgMIIBNQYDVR0fBIIBLDCCASgwggEkoIIBIKCCARyGQmh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lpbmZyYS9DUkwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDEuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDIuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDMuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDQuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybDCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwHwYDVR0jBBgwFoAUOXFdqRUQLcTffi9ZbkBNwN_vNpowHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4ICAQDNOTwuwpaNg6Wb6rlDJvYkgpjYBgD7v-G5oudCTfWxa38GVpr03GvcKMMKXsPqS9r4NAOXfLjlf7xqYiwUCShYUrJU3IDKm0amgY_xtVwywcT-VPGF7VZHrEHKa7b6ZR0_aUw_msh7FWtVxpZNW3Lq26ebDEtB-rbUQ_BDwH2K2tb_oKc8WzIVNBwAoAWWDHyVWJKRoEVp59P5KYLdqvg8VrchPaYU3B1ZYbSol1dPcoTFBbiR1xTC4gihNsdye7dgkDwJThyhtefnZZ1zeiWxnXwiLxuZk6pf7cEKEN0xfBtqSBq-ShHoa0RC1xAzAdGngTv75eYqs7hVFdEIZwytl9j_DVoh7vDwgUi0D3gu_ArliQZQbJaOgadOSsCvfyC4FDs0zFzh5gJEl4CTM9fYPZWGJPQPaH1nAoBwgqHZE1WF0uh4144LhpYs9GlduCWQ3jQeVjXsFsZdZPSYXdPojWuL34Voqf1gb07y4lB4vNsjgX0MCWgmfG4Jm7I_MwoL3FGM3SQN_84HB4tHG58f3-ztGcxleLHe1VBfPj-Efh6FPeHNFg7Lyc28aIJf6Lti8Bv9FjBGl_x8j5VVCMC3OI6aRMl9fqjNw4qBFbYmAY9f42CiaGsbnlC2k4FIKuYBkHw9mEe9pG9jKYsbU8WWhYfmRSvsH_TDoUW9GnH_HA&s=1lKCP7qsbkeP0ygziVq9A-_u2CdnCz3SSuHxa2bLdwCb74oy4YUo8070OIin-Wlzx1ZFYb6L0Fl9bnqqStJVQTUYbtg5Oo5qFr_A90vGnLCxB-vPVcqf0SvY9dZfbkIFPeXXdEUhrgO8nzMy5Gh23CnWkqjCWSdO6Uif1L0vCEh8F7gkRH4yRn4mSO7UCR2mGu9BLDUsJ5ITxRuWZhkInPRQBVbM9utjKDEZ9b61fpgqwe1zwIy-L880fcd4tbOWVJBx8VNsxlCyYiK2SI8QW_ItB94cnVCVpLrRBTTN6CsleXtEN92gwJJNqWB9jJ09Bx1YEZjtuO5Rrumk9_6OaQ&h=pJaqY15sIN3PQ1TCp1R_snpRJxbt_7hDdPsa5lt2I-8 + cache-control: + - no-cache + content-length: + - '788' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:49:00 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-deployment-engine-version: + - 1.430.0 + x-ms-ratelimit-remaining-subscription-global-writes: + - '11999' + x-ms-ratelimit-remaining-subscription-writes: + - '799' + x-msedge-ref: + - 'Ref A: D1DBD07254284DEAB38A71E4BDC9B06F Ref B: MWH011020808031 Ref C: 2025-08-28T20:48:58Z' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment/operationStatuses/08584451927467952292?api-version=2025-04-01&t=638920109407950878&c=MIIIrzCCBpegAwIBAgITUQB9VQ7j8TP8msVbVQABAH1VDjANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDQwHhcNMjUwNzE3MTAxMTQxWhcNMjYwMTEzMTAxMTQxWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN9uFRCckwovJWtl1-Qq22Rnc8i5ftzF4eCW9m-t2gMd0gI4H3ggHFS8o7Lgo7NFrSHde_fOw5TG4ClBFPIvYtP-yRXA_gQTjDDxbdEKLTNE3lXVjb2lGS92EXrq2q8SW9iUszX4c5rv7wvK4PYYmWBgrA0pnZoN3Sb-PCkHdwTiQ6s-KaN9TaDX22q-VAiBKtuEV3lfxq84cdn8poLqbGH9aJs3mwzZSvSnDtSic6XB7Wn2B9rEtP4D_EPxNAlrtE-8p4QQxJKsU4kvH2HkbDTA3s-9XDYPgpo-bc_TuPA79C9cwY_yDUwxeCiVXq6u1ouDEDRV8y-SdlEtMwA_L3kCAwEAAaOCBJwwggSYMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFghfmRS4WsmTQCAWQCAQcwggHkBggrBgEFBQcBAQSCAdYwggHSMGgGCCsGAQUFBzAChlxodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDEuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDIuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDMuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDQuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDAdBgNVHQ4EFgQUb0zVsI6tU0Ya4PntQPSVi05azTgwDgYDVR0PAQH_BAQDAgWgMIIBNQYDVR0fBIIBLDCCASgwggEkoIIBIKCCARyGQmh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lpbmZyYS9DUkwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDEuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDIuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDMuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDQuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybDCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwHwYDVR0jBBgwFoAUOXFdqRUQLcTffi9ZbkBNwN_vNpowHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4ICAQDNOTwuwpaNg6Wb6rlDJvYkgpjYBgD7v-G5oudCTfWxa38GVpr03GvcKMMKXsPqS9r4NAOXfLjlf7xqYiwUCShYUrJU3IDKm0amgY_xtVwywcT-VPGF7VZHrEHKa7b6ZR0_aUw_msh7FWtVxpZNW3Lq26ebDEtB-rbUQ_BDwH2K2tb_oKc8WzIVNBwAoAWWDHyVWJKRoEVp59P5KYLdqvg8VrchPaYU3B1ZYbSol1dPcoTFBbiR1xTC4gihNsdye7dgkDwJThyhtefnZZ1zeiWxnXwiLxuZk6pf7cEKEN0xfBtqSBq-ShHoa0RC1xAzAdGngTv75eYqs7hVFdEIZwytl9j_DVoh7vDwgUi0D3gu_ArliQZQbJaOgadOSsCvfyC4FDs0zFzh5gJEl4CTM9fYPZWGJPQPaH1nAoBwgqHZE1WF0uh4144LhpYs9GlduCWQ3jQeVjXsFsZdZPSYXdPojWuL34Voqf1gb07y4lB4vNsjgX0MCWgmfG4Jm7I_MwoL3FGM3SQN_84HB4tHG58f3-ztGcxleLHe1VBfPj-Efh6FPeHNFg7Lyc28aIJf6Lti8Bv9FjBGl_x8j5VVCMC3OI6aRMl9fqjNw4qBFbYmAY9f42CiaGsbnlC2k4FIKuYBkHw9mEe9pG9jKYsbU8WWhYfmRSvsH_TDoUW9GnH_HA&s=1lKCP7qsbkeP0ygziVq9A-_u2CdnCz3SSuHxa2bLdwCb74oy4YUo8070OIin-Wlzx1ZFYb6L0Fl9bnqqStJVQTUYbtg5Oo5qFr_A90vGnLCxB-vPVcqf0SvY9dZfbkIFPeXXdEUhrgO8nzMy5Gh23CnWkqjCWSdO6Uif1L0vCEh8F7gkRH4yRn4mSO7UCR2mGu9BLDUsJ5ITxRuWZhkInPRQBVbM9utjKDEZ9b61fpgqwe1zwIy-L880fcd4tbOWVJBx8VNsxlCyYiK2SI8QW_ItB94cnVCVpLrRBTTN6CsleXtEN92gwJJNqWB9jJ09Bx1YEZjtuO5Rrumk9_6OaQ&h=pJaqY15sIN3PQ1TCp1R_snpRJxbt_7hDdPsa5lt2I-8 + response: + body: + string: '{"status":"Accepted"}' + headers: + cache-control: + - no-cache + content-length: + - '21' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:49:01 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 44E03DCEB50F4501A954ACDC95087F00 Ref B: CO6AA3150220027 Ref C: 2025-08-28T20:49:01Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment/operationStatuses/08584451927467952292?api-version=2025-04-01&t=638920109407950878&c=MIIIrzCCBpegAwIBAgITUQB9VQ7j8TP8msVbVQABAH1VDjANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDQwHhcNMjUwNzE3MTAxMTQxWhcNMjYwMTEzMTAxMTQxWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN9uFRCckwovJWtl1-Qq22Rnc8i5ftzF4eCW9m-t2gMd0gI4H3ggHFS8o7Lgo7NFrSHde_fOw5TG4ClBFPIvYtP-yRXA_gQTjDDxbdEKLTNE3lXVjb2lGS92EXrq2q8SW9iUszX4c5rv7wvK4PYYmWBgrA0pnZoN3Sb-PCkHdwTiQ6s-KaN9TaDX22q-VAiBKtuEV3lfxq84cdn8poLqbGH9aJs3mwzZSvSnDtSic6XB7Wn2B9rEtP4D_EPxNAlrtE-8p4QQxJKsU4kvH2HkbDTA3s-9XDYPgpo-bc_TuPA79C9cwY_yDUwxeCiVXq6u1ouDEDRV8y-SdlEtMwA_L3kCAwEAAaOCBJwwggSYMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFghfmRS4WsmTQCAWQCAQcwggHkBggrBgEFBQcBAQSCAdYwggHSMGgGCCsGAQUFBzAChlxodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDEuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDIuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDMuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDQuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDAdBgNVHQ4EFgQUb0zVsI6tU0Ya4PntQPSVi05azTgwDgYDVR0PAQH_BAQDAgWgMIIBNQYDVR0fBIIBLDCCASgwggEkoIIBIKCCARyGQmh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lpbmZyYS9DUkwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDEuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDIuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDMuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDQuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybDCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwHwYDVR0jBBgwFoAUOXFdqRUQLcTffi9ZbkBNwN_vNpowHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4ICAQDNOTwuwpaNg6Wb6rlDJvYkgpjYBgD7v-G5oudCTfWxa38GVpr03GvcKMMKXsPqS9r4NAOXfLjlf7xqYiwUCShYUrJU3IDKm0amgY_xtVwywcT-VPGF7VZHrEHKa7b6ZR0_aUw_msh7FWtVxpZNW3Lq26ebDEtB-rbUQ_BDwH2K2tb_oKc8WzIVNBwAoAWWDHyVWJKRoEVp59P5KYLdqvg8VrchPaYU3B1ZYbSol1dPcoTFBbiR1xTC4gihNsdye7dgkDwJThyhtefnZZ1zeiWxnXwiLxuZk6pf7cEKEN0xfBtqSBq-ShHoa0RC1xAzAdGngTv75eYqs7hVFdEIZwytl9j_DVoh7vDwgUi0D3gu_ArliQZQbJaOgadOSsCvfyC4FDs0zFzh5gJEl4CTM9fYPZWGJPQPaH1nAoBwgqHZE1WF0uh4144LhpYs9GlduCWQ3jQeVjXsFsZdZPSYXdPojWuL34Voqf1gb07y4lB4vNsjgX0MCWgmfG4Jm7I_MwoL3FGM3SQN_84HB4tHG58f3-ztGcxleLHe1VBfPj-Efh6FPeHNFg7Lyc28aIJf6Lti8Bv9FjBGl_x8j5VVCMC3OI6aRMl9fqjNw4qBFbYmAY9f42CiaGsbnlC2k4FIKuYBkHw9mEe9pG9jKYsbU8WWhYfmRSvsH_TDoUW9GnH_HA&s=1lKCP7qsbkeP0ygziVq9A-_u2CdnCz3SSuHxa2bLdwCb74oy4YUo8070OIin-Wlzx1ZFYb6L0Fl9bnqqStJVQTUYbtg5Oo5qFr_A90vGnLCxB-vPVcqf0SvY9dZfbkIFPeXXdEUhrgO8nzMy5Gh23CnWkqjCWSdO6Uif1L0vCEh8F7gkRH4yRn4mSO7UCR2mGu9BLDUsJ5ITxRuWZhkInPRQBVbM9utjKDEZ9b61fpgqwe1zwIy-L880fcd4tbOWVJBx8VNsxlCyYiK2SI8QW_ItB94cnVCVpLrRBTTN6CsleXtEN92gwJJNqWB9jJ09Bx1YEZjtuO5Rrumk9_6OaQ&h=pJaqY15sIN3PQ1TCp1R_snpRJxbt_7hDdPsa5lt2I-8 + response: + body: + string: '{"status":"Succeeded"}' + headers: + cache-control: + - no-cache + content-length: + - '22' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:49:31 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 91C32B4958EB4B6EA2D9660BB60383C0 Ref B: MWH011020806052 Ref C: 2025-08-28T20:49:31Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/biceptest000002","name":"biceptest000002","type":"Microsoft.Resources/deployments","properties":{"templateHash":"14716929485202359217","parameters":{"keyVaultName":{"type":"String","value":"bicepkv000004"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Succeeded","timestamp":"2025-08-28T20:49:21.9834776Z","duration":"PT23.3133168S","correlationId":"53b5db79-458e-4ef0-a867-32a1e9470c51","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[],"outputs":{"keyVaultName":{"type":"String","value":"bicepkv000004"}},"outputResources":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/bicepkv000004"}]}}' + headers: + cache-control: + - no-cache + content-length: + - '1037' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:49:31 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: C1CDFB85F7BB42F082C828317BB9E30A Ref B: MWH011020808052 Ref C: 2025-08-28T20:49:31Z' + status: + code: 200 + message: OK +- request: + body: "{\"properties\": {\"parameters\": {\"keyVaultName\": {\"value\": \"armkv000005\"}}, + \"mode\": \"Incremental\", template:{\n \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n + \ \"contentVersion\": \"1.0.0.0\",\n \"parameters\": {\n \"keyVaultName\": + {\n \"type\": \"string\"\n },\n \"location\": {\n \"type\": + \"string\",\n \"defaultValue\": \"[resourceGroup().location]\"\n },\n + \ \"tenantId\": {\n \"type\": \"string\", \n \"defaultValue\": \"[subscription().tenantId]\"\n + \ }\n },\n \"resources\": [\n {\n \"type\": \"Microsoft.KeyVault/vaults\",\n + \ \"apiVersion\": \"2023-07-01\",\n \"name\": \"[parameters('keyVaultName')]\",\n + \ \"location\": \"[parameters('location')]\",\n \"properties\": {\n + \ \"sku\": {\n \"family\": \"A\",\n \"name\": \"standard\"\n + \ },\n \"tenantId\": \"[parameters('tenantId')]\",\n \"accessPolicies\": + [],\n \"enableRbacAuthorization\": true,\n \"enableSoftDelete\": + true,\n \"softDeleteRetentionInDays\": 7\n }\n }\n ],\n \"outputs\": + {\n \"keyVaultName\": {\n \"type\": \"string\",\n \"value\": \"[parameters('keyVaultName')]\"\n + \ }\n }\n}}}" + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + Content-Length: + - '1136' + Content-Type: + - application/json + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: POST + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment/validate?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/armtest000003","name":"armtest000003","type":"Microsoft.Resources/deployments","properties":{"templateHash":"6162027829745526126","parameters":{"keyVaultName":{"type":"String","value":"armkv000005"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Succeeded","timestamp":"2025-08-28T20:49:32.7949565Z","duration":"PT0S","correlationId":"defda023-8a7a-4fba-a1e5-755814bf3ba8","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[],"validatedResources":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/armkv000005"}]}}' + headers: + cache-control: + - no-cache + content-length: + - '953' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:49:33 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-writes: + - '11999' + x-ms-ratelimit-remaining-subscription-writes: + - '799' + x-msedge-ref: + - 'Ref A: 335A2AA983C34ACBA8EF5C60D8AF7EC9 Ref B: CO6AA3150220009 Ref C: 2025-08-28T20:49:32Z' + status: + code: 200 + message: OK +- request: + body: "{\"properties\": {\"parameters\": {\"keyVaultName\": {\"value\": \"armkv000005\"}}, + \"mode\": \"Incremental\", template:{\n \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n + \ \"contentVersion\": \"1.0.0.0\",\n \"parameters\": {\n \"keyVaultName\": + {\n \"type\": \"string\"\n },\n \"location\": {\n \"type\": + \"string\",\n \"defaultValue\": \"[resourceGroup().location]\"\n },\n + \ \"tenantId\": {\n \"type\": \"string\", \n \"defaultValue\": \"[subscription().tenantId]\"\n + \ }\n },\n \"resources\": [\n {\n \"type\": \"Microsoft.KeyVault/vaults\",\n + \ \"apiVersion\": \"2023-07-01\",\n \"name\": \"[parameters('keyVaultName')]\",\n + \ \"location\": \"[parameters('location')]\",\n \"properties\": {\n + \ \"sku\": {\n \"family\": \"A\",\n \"name\": \"standard\"\n + \ },\n \"tenantId\": \"[parameters('tenantId')]\",\n \"accessPolicies\": + [],\n \"enableRbacAuthorization\": true,\n \"enableSoftDelete\": + true,\n \"softDeleteRetentionInDays\": 7\n }\n }\n ],\n \"outputs\": + {\n \"keyVaultName\": {\n \"type\": \"string\",\n \"value\": \"[parameters('keyVaultName')]\"\n + \ }\n }\n}}}" + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + Content-Length: + - '1136' + Content-Type: + - application/json + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: PUT + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/armtest000003","name":"armtest000003","type":"Microsoft.Resources/deployments","properties":{"templateHash":"6162027829745526126","parameters":{"keyVaultName":{"type":"String","value":"armkv000005"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Accepted","timestamp":"2025-08-28T20:49:34.8017323Z","duration":"PT0.0001171S","correlationId":"dc0810ce-52ff-4ad4-b7ad-1356392c37ad","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[]}}' + headers: + azure-asyncoperation: + - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/armtest000003/operationStatuses/08584451927106724796?api-version=2025-04-01&t=638920109766300116&c=MIIIrzCCBpegAwIBAgITUQB9VQ7j8TP8msVbVQABAH1VDjANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDQwHhcNMjUwNzE3MTAxMTQxWhcNMjYwMTEzMTAxMTQxWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN9uFRCckwovJWtl1-Qq22Rnc8i5ftzF4eCW9m-t2gMd0gI4H3ggHFS8o7Lgo7NFrSHde_fOw5TG4ClBFPIvYtP-yRXA_gQTjDDxbdEKLTNE3lXVjb2lGS92EXrq2q8SW9iUszX4c5rv7wvK4PYYmWBgrA0pnZoN3Sb-PCkHdwTiQ6s-KaN9TaDX22q-VAiBKtuEV3lfxq84cdn8poLqbGH9aJs3mwzZSvSnDtSic6XB7Wn2B9rEtP4D_EPxNAlrtE-8p4QQxJKsU4kvH2HkbDTA3s-9XDYPgpo-bc_TuPA79C9cwY_yDUwxeCiVXq6u1ouDEDRV8y-SdlEtMwA_L3kCAwEAAaOCBJwwggSYMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFghfmRS4WsmTQCAWQCAQcwggHkBggrBgEFBQcBAQSCAdYwggHSMGgGCCsGAQUFBzAChlxodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDEuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDIuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDMuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDQuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDAdBgNVHQ4EFgQUb0zVsI6tU0Ya4PntQPSVi05azTgwDgYDVR0PAQH_BAQDAgWgMIIBNQYDVR0fBIIBLDCCASgwggEkoIIBIKCCARyGQmh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lpbmZyYS9DUkwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDEuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDIuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDMuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDQuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybDCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwHwYDVR0jBBgwFoAUOXFdqRUQLcTffi9ZbkBNwN_vNpowHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4ICAQDNOTwuwpaNg6Wb6rlDJvYkgpjYBgD7v-G5oudCTfWxa38GVpr03GvcKMMKXsPqS9r4NAOXfLjlf7xqYiwUCShYUrJU3IDKm0amgY_xtVwywcT-VPGF7VZHrEHKa7b6ZR0_aUw_msh7FWtVxpZNW3Lq26ebDEtB-rbUQ_BDwH2K2tb_oKc8WzIVNBwAoAWWDHyVWJKRoEVp59P5KYLdqvg8VrchPaYU3B1ZYbSol1dPcoTFBbiR1xTC4gihNsdye7dgkDwJThyhtefnZZ1zeiWxnXwiLxuZk6pf7cEKEN0xfBtqSBq-ShHoa0RC1xAzAdGngTv75eYqs7hVFdEIZwytl9j_DVoh7vDwgUi0D3gu_ArliQZQbJaOgadOSsCvfyC4FDs0zFzh5gJEl4CTM9fYPZWGJPQPaH1nAoBwgqHZE1WF0uh4144LhpYs9GlduCWQ3jQeVjXsFsZdZPSYXdPojWuL34Voqf1gb07y4lB4vNsjgX0MCWgmfG4Jm7I_MwoL3FGM3SQN_84HB4tHG58f3-ztGcxleLHe1VBfPj-Efh6FPeHNFg7Lyc28aIJf6Lti8Bv9FjBGl_x8j5VVCMC3OI6aRMl9fqjNw4qBFbYmAY9f42CiaGsbnlC2k4FIKuYBkHw9mEe9pG9jKYsbU8WWhYfmRSvsH_TDoUW9GnH_HA&s=MxmX1DL8-XqZ4141GX2PcdZTDXtzqEC-8Kz6QIrIjNu6yCRNtuVmXFAFHbdCU_meqSTdUQNXq5Dk3QmUuHef7y4-aRsYRqZR4rGG9NukvTcXj35tc0T8kVf3k6Bayf5NIfxXuo-k3LBx4iAbGDi85-nSMaPEjKN3kBhYhtj_jkjypjX4VkMeH4VDGXD_op8g3ITGkegYIHcBhGi84w46VgQRZZJdsf2sr9bQu1ve2xxaRdg0HbmPpbM3lRceNlnA2DY5Jhpl6r-cYvcMtEY4xsxIBBvDHG4wV4sPTcNEuoVs9em6jGqLXroW_QSoltYpK51jahJkFJqgQ245P4eL_Q&h=gj4LsCiXGBCC49vr_zHpZa19ShWk8LIjU1z9zKrbr18 + cache-control: + - no-cache + content-length: + - '781' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:49:35 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-deployment-engine-version: + - 1.430.0 + x-ms-ratelimit-remaining-subscription-global-writes: + - '11999' + x-ms-ratelimit-remaining-subscription-writes: + - '799' + x-msedge-ref: + - 'Ref A: 66F9D23A90A941818AA789C336EC34BA Ref B: MWH011020809040 Ref C: 2025-08-28T20:49:34Z' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment/operationStatuses/08584451927106724796?api-version=2025-04-01&t=638920109766300116&c=MIIIrzCCBpegAwIBAgITUQB9VQ7j8TP8msVbVQABAH1VDjANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDQwHhcNMjUwNzE3MTAxMTQxWhcNMjYwMTEzMTAxMTQxWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN9uFRCckwovJWtl1-Qq22Rnc8i5ftzF4eCW9m-t2gMd0gI4H3ggHFS8o7Lgo7NFrSHde_fOw5TG4ClBFPIvYtP-yRXA_gQTjDDxbdEKLTNE3lXVjb2lGS92EXrq2q8SW9iUszX4c5rv7wvK4PYYmWBgrA0pnZoN3Sb-PCkHdwTiQ6s-KaN9TaDX22q-VAiBKtuEV3lfxq84cdn8poLqbGH9aJs3mwzZSvSnDtSic6XB7Wn2B9rEtP4D_EPxNAlrtE-8p4QQxJKsU4kvH2HkbDTA3s-9XDYPgpo-bc_TuPA79C9cwY_yDUwxeCiVXq6u1ouDEDRV8y-SdlEtMwA_L3kCAwEAAaOCBJwwggSYMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFghfmRS4WsmTQCAWQCAQcwggHkBggrBgEFBQcBAQSCAdYwggHSMGgGCCsGAQUFBzAChlxodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDEuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDIuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDMuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDQuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDAdBgNVHQ4EFgQUb0zVsI6tU0Ya4PntQPSVi05azTgwDgYDVR0PAQH_BAQDAgWgMIIBNQYDVR0fBIIBLDCCASgwggEkoIIBIKCCARyGQmh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lpbmZyYS9DUkwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDEuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDIuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDMuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDQuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybDCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwHwYDVR0jBBgwFoAUOXFdqRUQLcTffi9ZbkBNwN_vNpowHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4ICAQDNOTwuwpaNg6Wb6rlDJvYkgpjYBgD7v-G5oudCTfWxa38GVpr03GvcKMMKXsPqS9r4NAOXfLjlf7xqYiwUCShYUrJU3IDKm0amgY_xtVwywcT-VPGF7VZHrEHKa7b6ZR0_aUw_msh7FWtVxpZNW3Lq26ebDEtB-rbUQ_BDwH2K2tb_oKc8WzIVNBwAoAWWDHyVWJKRoEVp59P5KYLdqvg8VrchPaYU3B1ZYbSol1dPcoTFBbiR1xTC4gihNsdye7dgkDwJThyhtefnZZ1zeiWxnXwiLxuZk6pf7cEKEN0xfBtqSBq-ShHoa0RC1xAzAdGngTv75eYqs7hVFdEIZwytl9j_DVoh7vDwgUi0D3gu_ArliQZQbJaOgadOSsCvfyC4FDs0zFzh5gJEl4CTM9fYPZWGJPQPaH1nAoBwgqHZE1WF0uh4144LhpYs9GlduCWQ3jQeVjXsFsZdZPSYXdPojWuL34Voqf1gb07y4lB4vNsjgX0MCWgmfG4Jm7I_MwoL3FGM3SQN_84HB4tHG58f3-ztGcxleLHe1VBfPj-Efh6FPeHNFg7Lyc28aIJf6Lti8Bv9FjBGl_x8j5VVCMC3OI6aRMl9fqjNw4qBFbYmAY9f42CiaGsbnlC2k4FIKuYBkHw9mEe9pG9jKYsbU8WWhYfmRSvsH_TDoUW9GnH_HA&s=MxmX1DL8-XqZ4141GX2PcdZTDXtzqEC-8Kz6QIrIjNu6yCRNtuVmXFAFHbdCU_meqSTdUQNXq5Dk3QmUuHef7y4-aRsYRqZR4rGG9NukvTcXj35tc0T8kVf3k6Bayf5NIfxXuo-k3LBx4iAbGDi85-nSMaPEjKN3kBhYhtj_jkjypjX4VkMeH4VDGXD_op8g3ITGkegYIHcBhGi84w46VgQRZZJdsf2sr9bQu1ve2xxaRdg0HbmPpbM3lRceNlnA2DY5Jhpl6r-cYvcMtEY4xsxIBBvDHG4wV4sPTcNEuoVs9em6jGqLXroW_QSoltYpK51jahJkFJqgQ245P4eL_Q&h=gj4LsCiXGBCC49vr_zHpZa19ShWk8LIjU1z9zKrbr18 + response: + body: + string: '{"status":"Running"}' + headers: + cache-control: + - no-cache + content-length: + - '20' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:49:36 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 915C4832A56E496A93DB4645899CBC3C Ref B: MWH011020807023 Ref C: 2025-08-28T20:49:36Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment/operationStatuses/08584451927106724796?api-version=2025-04-01&t=638920109766300116&c=MIIIrzCCBpegAwIBAgITUQB9VQ7j8TP8msVbVQABAH1VDjANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDQwHhcNMjUwNzE3MTAxMTQxWhcNMjYwMTEzMTAxMTQxWjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN9uFRCckwovJWtl1-Qq22Rnc8i5ftzF4eCW9m-t2gMd0gI4H3ggHFS8o7Lgo7NFrSHde_fOw5TG4ClBFPIvYtP-yRXA_gQTjDDxbdEKLTNE3lXVjb2lGS92EXrq2q8SW9iUszX4c5rv7wvK4PYYmWBgrA0pnZoN3Sb-PCkHdwTiQ6s-KaN9TaDX22q-VAiBKtuEV3lfxq84cdn8poLqbGH9aJs3mwzZSvSnDtSic6XB7Wn2B9rEtP4D_EPxNAlrtE-8p4QQxJKsU4kvH2HkbDTA3s-9XDYPgpo-bc_TuPA79C9cwY_yDUwxeCiVXq6u1ouDEDRV8y-SdlEtMwA_L3kCAwEAAaOCBJwwggSYMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYBBQUHAwIwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIhpDjDYTVtHiE8Ys-hZvdFs6dEoFghfmRS4WsmTQCAWQCAQcwggHkBggrBgEFBQcBAQSCAdYwggHSMGgGCCsGAQUFBzAChlxodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEvQ2VydHMvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDEuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDIuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDMuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDBYBggrBgEFBQcwAoZMaHR0cDovL2NybDQuYW1lLmdibC9haWEvbWVsMDFwa2lpbnRjYTAxLkFNRS5HQkxfQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNydDAdBgNVHQ4EFgQUb0zVsI6tU0Ya4PntQPSVi05azTgwDgYDVR0PAQH_BAQDAgWgMIIBNQYDVR0fBIIBLDCCASgwggEkoIIBIKCCARyGQmh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lpbmZyYS9DUkwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDEuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDIuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDMuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybIY0aHR0cDovL2NybDQuYW1lLmdibC9jcmwvQU1FJTIwSW5mcmElMjBDQSUyMDA0KDEpLmNybDCBnQYDVR0gBIGVMIGSMAwGCisGAQQBgjd7AQEwZgYKKwYBBAGCN3sCAjBYMFYGCCsGAQUFBwICMEoeSAAzADMAZQAwADEAOQAyADEALQA0AGQANgA0AC0ANABmADgAYwAtAGEAMAA1ADUALQA1AGIAZABhAGYAZgBkADUAZQAzADMAZDAMBgorBgEEAYI3ewMCMAwGCisGAQQBgjd7BAIwHwYDVR0jBBgwFoAUOXFdqRUQLcTffi9ZbkBNwN_vNpowHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4ICAQDNOTwuwpaNg6Wb6rlDJvYkgpjYBgD7v-G5oudCTfWxa38GVpr03GvcKMMKXsPqS9r4NAOXfLjlf7xqYiwUCShYUrJU3IDKm0amgY_xtVwywcT-VPGF7VZHrEHKa7b6ZR0_aUw_msh7FWtVxpZNW3Lq26ebDEtB-rbUQ_BDwH2K2tb_oKc8WzIVNBwAoAWWDHyVWJKRoEVp59P5KYLdqvg8VrchPaYU3B1ZYbSol1dPcoTFBbiR1xTC4gihNsdye7dgkDwJThyhtefnZZ1zeiWxnXwiLxuZk6pf7cEKEN0xfBtqSBq-ShHoa0RC1xAzAdGngTv75eYqs7hVFdEIZwytl9j_DVoh7vDwgUi0D3gu_ArliQZQbJaOgadOSsCvfyC4FDs0zFzh5gJEl4CTM9fYPZWGJPQPaH1nAoBwgqHZE1WF0uh4144LhpYs9GlduCWQ3jQeVjXsFsZdZPSYXdPojWuL34Voqf1gb07y4lB4vNsjgX0MCWgmfG4Jm7I_MwoL3FGM3SQN_84HB4tHG58f3-ztGcxleLHe1VBfPj-Efh6FPeHNFg7Lyc28aIJf6Lti8Bv9FjBGl_x8j5VVCMC3OI6aRMl9fqjNw4qBFbYmAY9f42CiaGsbnlC2k4FIKuYBkHw9mEe9pG9jKYsbU8WWhYfmRSvsH_TDoUW9GnH_HA&s=MxmX1DL8-XqZ4141GX2PcdZTDXtzqEC-8Kz6QIrIjNu6yCRNtuVmXFAFHbdCU_meqSTdUQNXq5Dk3QmUuHef7y4-aRsYRqZR4rGG9NukvTcXj35tc0T8kVf3k6Bayf5NIfxXuo-k3LBx4iAbGDi85-nSMaPEjKN3kBhYhtj_jkjypjX4VkMeH4VDGXD_op8g3ITGkegYIHcBhGi84w46VgQRZZJdsf2sr9bQu1ve2xxaRdg0HbmPpbM3lRceNlnA2DY5Jhpl6r-cYvcMtEY4xsxIBBvDHG4wV4sPTcNEuoVs9em6jGqLXroW_QSoltYpK51jahJkFJqgQ245P4eL_Q&h=gj4LsCiXGBCC49vr_zHpZa19ShWk8LIjU1z9zKrbr18 + response: + body: + string: '{"status":"Succeeded"}' + headers: + cache-control: + - no-cache + content-length: + - '22' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:50:07 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 56904C063D3C42BEBE8822CB3827B7A1 Ref B: MWH011020807023 Ref C: 2025-08-28T20:50:07Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group create + Connection: + - keep-alive + ParameterSetName: + - -g -n --template-file --parameters + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/mock-deployment?api-version=2025-04-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/armtest000003","name":"armtest000003","type":"Microsoft.Resources/deployments","properties":{"templateHash":"6162027829745526126","parameters":{"keyVaultName":{"type":"String","value":"armkv000005"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Succeeded","timestamp":"2025-08-28T20:49:58.4909422Z","duration":"PT23.6892099S","correlationId":"dc0810ce-52ff-4ad4-b7ad-1356392c37ad","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[],"outputs":{"keyVaultName":{"type":"String","value":"armkv000005"}},"outputResources":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/armkv000005"}]}}' + headers: + cache-control: + - no-cache + content-length: + - '1026' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:50:07 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 20588D8D3AAB4168A103873168B5A90B Ref B: MWH011020808060 Ref C: 2025-08-28T20:50:08Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - deployment group list + Connection: + - keep-alive + ParameterSetName: + - -g + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/?api-version=2025-04-01 + response: + body: + string: '{"value":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/armtest000003","name":"armtest000003","type":"Microsoft.Resources/deployments","properties":{"templateHash":"6162027829745526126","parameters":{"keyVaultName":{"type":"String","value":"armkv000005"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Succeeded","timestamp":"2025-08-28T20:49:58.4909422Z","duration":"PT23.6892099S","correlationId":"dc0810ce-52ff-4ad4-b7ad-1356392c37ad","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[],"outputs":{"keyVaultName":{"type":"String","value":"armkv000005"}},"outputResources":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/armkv000005"}]}},{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.Resources/deployments/biceptest000002","name":"biceptest000002","type":"Microsoft.Resources/deployments","properties":{"templateHash":"14716929485202359217","parameters":{"keyVaultName":{"type":"String","value":"bicepkv000004"},"location":{"type":"String","value":"westus"},"tenantId":{"type":"String","value":"72f988bf-86f1-41af-91ab-2d7cd011db47"}},"mode":"Incremental","provisioningState":"Succeeded","timestamp":"2025-08-28T20:49:21.9834776Z","duration":"PT23.3133168S","correlationId":"53b5db79-458e-4ef0-a867-32a1e9470c51","providers":[{"namespace":"Microsoft.KeyVault","resourceTypes":[{"resourceType":"vaults","locations":["westus"]}]}],"dependencies":[],"outputs":{"keyVaultName":{"type":"String","value":"bicepkv000004"}},"outputResources":[{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/bicepkv000004"}]}}]}' + headers: + cache-control: + - no-cache + content-length: + - '2076' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:50:07 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 99CE2258FFE94A529787407936B13A36 Ref B: CO6AA3150218019 Ref C: 2025-08-28T20:50:08Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - keyvault show + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/bicepkv000004?api-version=2024-11-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/bicepkv000004","name":"bicepkv000004","type":"Microsoft.KeyVault/vaults","location":"westus","tags":{},"systemData":{"createdBy":"test@example.com","createdByType":"User","createdAt":"2025-08-28T20:49:03.43Z","lastModifiedBy":"test@example.com","lastModifiedByType":"User","lastModifiedAt":"2025-08-28T20:49:03.43Z"},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[],"enabledForDeployment":false,"enableSoftDelete":true,"softDeleteRetentionInDays":7,"enableRbacAuthorization":true,"vaultUri":"https://bicepkv000004.vault.azure.net/","provisioningState":"Succeeded","publicNetworkAccess":"Enabled"}}' + headers: + cache-control: + - no-cache + content-length: + - '813' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:50:08 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-keyvault-service-version: + - 2.2.261.0 + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: 4505A40E8CAD436181342CD94E772641 Ref B: MWH011020807052 Ref C: 2025-08-28T20:50:08Z' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + CommandName: + - keyvault show + Connection: + - keep-alive + ParameterSetName: + - -g -n + User-Agent: + - AZURECLI/2.76.0 azsdk-python-core/1.35.0 Python/3.12.3 (Linux-6.8.0-63-generic-x86_64-with-glibc2.39) + method: GET + uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/armkv000005?api-version=2024-11-01 + response: + body: + string: '{"id":"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/cli_test_bicep_vs_arm_opt000001/providers/Microsoft.KeyVault/vaults/armkv000005","name":"armkv000005","type":"Microsoft.KeyVault/vaults","location":"westus","tags":{},"systemData":{"createdBy":"test@example.com","createdByType":"User","createdAt":"2025-08-28T20:49:37.682Z","lastModifiedBy":"test@example.com","lastModifiedByType":"User","lastModifiedAt":"2025-08-28T20:49:37.682Z"},"properties":{"sku":{"family":"A","name":"standard"},"tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47","accessPolicies":[],"enabledForDeployment":false,"enableSoftDelete":true,"softDeleteRetentionInDays":7,"enableRbacAuthorization":true,"vaultUri":"https://armkv000005.vault.azure.net/","provisioningState":"Succeeded","publicNetworkAccess":"Enabled"}}' + headers: + cache-control: + - no-cache + content-length: + - '809' + content-type: + - application/json; charset=utf-8 + date: + - Thu, 28 Aug 2025 20:50:09 GMT + expires: + - '-1' + pragma: + - no-cache + strict-transport-security: + - max-age=31536000; includeSubDomains + x-aspnet-version: + - 4.0.30319 + x-cache: + - CONFIG_NOCACHE + x-content-type-options: + - nosniff + x-ms-keyvault-service-version: + - 2.2.261.0 + x-ms-ratelimit-remaining-subscription-global-reads: + - '16499' + x-msedge-ref: + - 'Ref A: BEA65E7B8DB245EBBD75D36FA56CE07F Ref B: CO6AA3150218049 Ref C: 2025-08-28T20:50:09Z' + status: + code: 200 + message: OK +version: 1 diff --git a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_custom.py b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_custom.py index fc895ea835e..35ae70992d5 100644 --- a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_custom.py +++ b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_custom.py @@ -12,7 +12,8 @@ from unittest import mock -from azure.cli.core.util import CLIError, get_file_json, shell_safe_json_parse +from azure.cli.core.util import CLIError, get_file_json, shell_safe_json_parse, read_file_content +from azure.cli.testsdk import ScenarioTest, ResourceGroupPreparer from azure.cli.command_modules.resource.custom import ( _get_missing_parameters, _extract_lock_params, @@ -28,6 +29,8 @@ deploy_arm_template_at_tenant_scope, format_bicep_file, publish_bicep_file, + _process_template_file, + _prepare_deployment_properties_unmodified, ) from azure.cli.command_modules.resource._bicep import (run_bicep_command) @@ -711,5 +714,372 @@ def test_publish_without_source(self, mock_run_bicep_command, mock_bicep_version ]) mock_run_bicep_command.assert_called_once_with(cmd.cli_ctx, ['publish', file_path, '--target', 'br:contoso.azurecr.io/bicep/mymodule:v1', '--with-source']) + +class TestTemplateSizeOptimization(unittest.TestCase): + """Tests for bicep template size optimization changes.""" + + @mock.patch('azure.cli.command_modules.resource.custom.validate_bicep_target_scope') + @mock.patch('azure.cli.command_modules.resource.custom.run_bicep_command') + @mock.patch('azure.cli.command_modules.resource.custom.is_bicep_file') + def test_process_template_file_bicep_returns_both(self, mock_is_bicep, mock_run_bicep, mock_validate): + """Test that bicep files return both template_content and template_obj.""" + # Arrange + mock_is_bicep.return_value = True + mock_template_json = '{"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#", "resources": []}' + mock_run_bicep.return_value = mock_template_json + mock_validate.return_value = None # No validation errors + + # Act + template_content, template_obj = _process_template_file(cmd, "test.bicep", "resourceGroup") + + # Assert + self.assertEqual(template_content, mock_template_json) + self.assertIsInstance(template_obj, dict) + self.assertEqual(template_obj['$schema'], "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#") + mock_run_bicep.assert_called_once() + mock_validate.assert_called_once() + + @mock.patch('azure.cli.command_modules.resource.custom._remove_comments_from_json') + @mock.patch('azure.cli.command_modules.resource.custom.read_file_content') + @mock.patch('azure.cli.command_modules.resource.custom.is_bicep_file') + def test_process_template_file_arm_returns_both(self, mock_is_bicep, mock_read_file, mock_remove_comments): + """Test that ARM templates return both template_content and template_obj.""" + # Arrange + mock_is_bicep.return_value = False + mock_template_content = '{"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#", "resources": []}' + mock_template_obj = {"$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#", "resources": []} + mock_read_file.return_value = mock_template_content + mock_remove_comments.return_value = mock_template_obj + + # Act + template_content, template_obj = _process_template_file(cmd, "test.json", "resourceGroup") + + # Assert + self.assertEqual(template_content, mock_template_content) + self.assertEqual(template_obj, mock_template_obj) + mock_read_file.assert_called_once_with("test.json") + mock_remove_comments.assert_called_once() + + @mock.patch('azure.cli.command_modules.resource.custom._get_template_for_deployment') + @mock.patch('azure.cli.command_modules.resource.custom._process_template_file') + def test_bicep_deployment_uses_compact_json_string(self, mock_process_template, mock_get_template): + """Test that bicep deployments use compact JSON string to avoid size inflation.""" + # Arrange + mock_template_content = '{"resources": []}' + mock_template_obj = {"resources": []} + mock_process_template.return_value = (mock_template_content, mock_template_obj) + compact_json = '{"resources":[]}' # Compact version + mock_get_template.return_value = compact_json # This is the key - bicep uses compact JSON string + + # Act + properties = _prepare_deployment_properties_unmodified(cmd, "resourceGroup", "test.bicep", None, None, None, None) + + # Assert + self.assertEqual(properties.template, compact_json) + self.assertIsInstance(properties.template, str) # Should be string, not dict + mock_get_template.assert_called_once() + # Verify that _get_template_for_deployment was called with both content and obj + args = mock_get_template.call_args[0] + self.assertIn(mock_template_content, args) # template_content parameter + self.assertIn(mock_template_obj, args) # template_obj parameter + + @mock.patch('azure.cli.command_modules.resource.custom._get_template_for_deployment') + @mock.patch('azure.cli.command_modules.resource.custom._process_template_file') + def test_arm_deployment_uses_template_content(self, mock_process_template, mock_get_template): + """Test that ARM deployments use template_content for JsonC compatibility.""" + # Arrange + mock_template_content = '{"resources": []}' + mock_template_obj = {"resources": []} + mock_process_template.return_value = (mock_template_content, mock_template_obj) + mock_get_template.return_value = mock_template_content # ARM uses template_content + + # Act + properties = _prepare_deployment_properties_unmodified(cmd, "resourceGroup", "test.json", None, None, None, None) + + # Assert + self.assertEqual(properties.template, mock_template_content) + mock_get_template.assert_called_once() + + @mock.patch('azure.cli.command_modules.resource.custom._urlretrieve') + def test_uri_deployment_uses_template_link(self, mock_urlretrieve): + """Test that URI deployments use templateLink without local processing.""" + # Arrange + mock_urlretrieve.return_value = b'{"resources": []}' + + # Act + properties = _prepare_deployment_properties_unmodified(cmd, "resourceGroup", None, "https://example.com/template.json", None, None, None) + + # Assert + self.assertEqual(properties.template_link.uri, "https://example.com/template.json") + self.assertIsNone(properties.template) # Uses templateLink, not template + + @mock.patch('azure.cli.command_modules.resource.custom.is_bicep_file') + def test_get_template_for_deployment_bicep_uses_compact_json(self, mock_is_bicep): + """Test that _get_template_for_deployment returns compact JSON string for bicep files.""" + # Arrange + mock_is_bicep.return_value = True + template_content = '{"resources": []}' + template_obj = {"resources": []} + + # Import the function we're testing + from azure.cli.command_modules.resource.custom import _get_template_for_deployment + + # Act + result = _get_template_for_deployment(None, None, "test.bicep", template_content, template_obj, None) + + # Assert + import json + self.assertEqual(result, json.dumps(template_obj, separators=(',', ':'))) # Should return compact JSON string + self.assertIsInstance(result, str) # Should be a string, not an object + + @mock.patch('azure.cli.command_modules.resource.custom.is_bicep_file') + def test_get_template_for_deployment_arm_uses_content(self, mock_is_bicep): + """Test that _get_template_for_deployment returns template_content for ARM files.""" + # Arrange + mock_is_bicep.return_value = False + template_content = '{"resources": []}' + template_obj = {"resources": []} + + # Import the function we're testing + from azure.cli.command_modules.resource.custom import _get_template_for_deployment + + # Act + result = _get_template_for_deployment(None, None, "test.json", template_content, template_obj, None) + + # Assert + self.assertEqual(result, template_content) # Should return the string, not the object + + def test_bicep_vs_arm_size_comparison(self): + """Test that demonstrates bicep templates avoid string escaping overhead.""" + # This test demonstrates the size optimization concept + + # Sample content with characters that would be escaped in JSON strings + test_content = ''' + { + "description": "A test template\\nwith special \\"chars\\" and 'quotes'", + "value": "Line 1\\nLine 2\\nLine 3\\\\path" + } + ''' + + # When treated as JSON object (bicep path) - no escaping + import json + template_obj = json.loads(test_content) + obj_representation = json.dumps(template_obj, separators=(',', ':')) + + # When treated as string content (ARM path) - escaping applied + import re + escaped_content = re.sub(r'\\', r'\\\\', test_content) # Simplified escaping simulation + escaped_content = re.sub(r'"', r'\\"', escaped_content) + + # Assert that object representation is more compact + self.assertLess(len(obj_representation), len(escaped_content)) + + # This demonstrates why bicep templates using template_obj avoid size inflation + + +class BicepTemplateSizeOptimizationScenarioTest(ScenarioTest): + """Functional tests for bicep template size optimization. + + These scenario tests verify that our bicep template size optimization works + correctly in real deployment scenarios and generates recordings for CI/CD. + """ + + @ResourceGroupPreparer(name_prefix='cli_test_bicep_size_opt') + def test_bicep_deployment_size_optimization(self, resource_group): + """Test that bicep deployments work correctly with size optimization. + + This test verifies that: + 1. Bicep templates deploy successfully with our optimization + 2. The optimization doesn't break existing functionality + 3. Key Vault creation works with bicep templates + """ + self.kwargs.update({ + 'deployment_name': self.create_random_name('deploy', 15), + 'kv_name': self.create_random_name('testkv', 15)[:24] # Key Vault names max 24 chars + }) + + # Create a simple bicep template content that creates a Key Vault + bicep_content = '''param keyVaultName string +param location string = resourceGroup().location +param tenantId string = subscription().tenantId + +resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' = { + name: keyVaultName + location: location + properties: { + sku: { + family: 'A' + name: 'standard' + } + tenantId: tenantId + accessPolicies: [] + enableRbacAuthorization: true + enableSoftDelete: true + softDeleteRetentionInDays: 7 + } +} + +output keyVaultName string = keyVault.name +output keyVaultId string = keyVault.id +''' + + # Create a temporary bicep file + import tempfile + import os + with tempfile.NamedTemporaryFile(mode='w', suffix='.bicep', delete=False) as f: + f.write(bicep_content) + bicep_file_path = f.name + + try: + # Test bicep deployment - this exercises our optimization + result = self.cmd(f'az deployment group create -g {{rg}} -n {{deployment_name}} --template-file "{bicep_file_path}" --parameters keyVaultName={{kv_name}}', checks=[ + self.check('properties.provisioningState', 'Succeeded'), + self.check('properties.outputs.keyVaultName.value', '{kv_name}') + ]) + + # Verify the deployment was successful + self.cmd('az deployment group show -g {rg} -n {deployment_name}', checks=[ + self.check('properties.provisioningState', 'Succeeded'), + self.check('name', '{deployment_name}') + ]) + + # Verify the Key Vault was created successfully + self.cmd('az keyvault show -g {rg} -n {kv_name}', checks=[ + self.check('name', '{kv_name}'), + self.check('properties.sku.name', 'standard'), + self.check('properties.enableSoftDelete', True) + ]) + + finally: + # Clean up temporary file + if os.path.exists(bicep_file_path): + os.unlink(bicep_file_path) + + @ResourceGroupPreparer(name_prefix='cli_test_bicep_vs_arm_opt') + def test_bicep_vs_arm_template_deployment(self, resource_group): + """Test both bicep and ARM template deployments work correctly. + + This test verifies that our optimization doesn't break ARM templates + while optimizing bicep templates. + """ + self.kwargs.update({ + 'bicep_deployment': self.create_random_name('biceptest', 20), + 'arm_deployment': self.create_random_name('armtest', 20), + 'kv_name_bicep': self.create_random_name('bicepkv', 15)[:24], + 'kv_name_arm': self.create_random_name('armkv', 15)[:24] + }) + + # Bicep template content + bicep_content = '''param keyVaultName string +param location string = resourceGroup().location +param tenantId string = subscription().tenantId + +resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' = { + name: keyVaultName + location: location + properties: { + sku: { + family: 'A' + name: 'standard' + } + tenantId: tenantId + accessPolicies: [] + enableRbacAuthorization: true + enableSoftDelete: true + softDeleteRetentionInDays: 7 + } +} + +output keyVaultName string = keyVault.name +''' + + # ARM template content (equivalent to the bicep above) + arm_content = '''{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "keyVaultName": { + "type": "string" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + }, + "tenantId": { + "type": "string", + "defaultValue": "[subscription().tenantId]" + } + }, + "resources": [ + { + "type": "Microsoft.KeyVault/vaults", + "apiVersion": "2023-07-01", + "name": "[parameters('keyVaultName')]", + "location": "[parameters('location')]", + "properties": { + "sku": { + "family": "A", + "name": "standard" + }, + "tenantId": "[parameters('tenantId')]", + "accessPolicies": [], + "enableRbacAuthorization": true, + "enableSoftDelete": true, + "softDeleteRetentionInDays": 7 + } + } + ], + "outputs": { + "keyVaultName": { + "type": "string", + "value": "[parameters('keyVaultName')]" + } + } +}''' + + import tempfile + import os + + # Create temporary files + with tempfile.NamedTemporaryFile(mode='w', suffix='.bicep', delete=False) as f: + f.write(bicep_content) + bicep_file_path = f.name + + with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f: + f.write(arm_content) + arm_file_path = f.name + + try: + # Test bicep deployment (uses our optimization) + self.cmd(f'az deployment group create -g {{rg}} -n {{bicep_deployment}} --template-file "{bicep_file_path}" --parameters keyVaultName={{kv_name_bicep}}', checks=[ + self.check('properties.provisioningState', 'Succeeded') + ]) + + # Test ARM template deployment (should still work normally) + self.cmd(f'az deployment group create -g {{rg}} -n {{arm_deployment}} --template-file "{arm_file_path}" --parameters keyVaultName={{kv_name_arm}}', checks=[ + self.check('properties.provisioningState', 'Succeeded') + ]) + + # Verify both deployments succeeded + self.cmd('az deployment group list -g {rg}', checks=[ + self.check('length(@)', 2) + ]) + + # Verify both key vaults were created + self.cmd('az keyvault show -g {rg} -n {kv_name_bicep}', checks=[ + self.check('name', '{kv_name_bicep}') + ]) + + self.cmd('az keyvault show -g {rg} -n {kv_name_arm}', checks=[ + self.check('name', '{kv_name_arm}') + ]) + + finally: + # Clean up temporary files + for file_path in [bicep_file_path, arm_file_path]: + if os.path.exists(file_path): + os.unlink(file_path) + + if __name__ == '__main__': unittest.main()