DnyaneshSurya
DnyaneshSurya

Reputation: 207

How to validate ARM Template using azure .net SDK or Fluent API?

How to validate uploaded ARM Template using azure .net SDK or Fluent API ? I want to validate my uploaded ARM template like azure portal do using azure .net SDK or Fluent API ? For reference please see below image azure is showing message if ARM template not valid so same thing i want to implement using any .net API or REST API.

enter image description here

@Jim Below error I am getting:

enter image description here

Upvotes: 1

Views: 1156

Answers (2)

crimbo
crimbo

Reputation: 11201

I like that the accepted answer adds the "what if" to validation. However, Microsoft.Azure.Management.ResourceManager is deprecated, and it took me a bit to figure out a way to validate an ARM template using the replacement library: Azure.ResourceManager.

Here's a code snippet that provides template validation using the new library (it doesn't include the what-if call):

        var credential = new DefaultAzureCredential();
        var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
        var client = new ArmClient(credential, subscriptionId);

       var deploymentContent = new ArmDeploymentContent(new ArmDeploymentProperties(ArmDeploymentMode.Incremental)
                {
                    Template = BinaryData.FromString(templateContent),
                    Parameters = BinaryData.FromObjectAsJson(new
                    {
                        hostingPlanName = new
                        {
                            value = hostingPlanName
                        },
                        webSiteName = new
                        {
                            value = webAppName
                        },
                        skuName = new
                        {
                            value = webSkuName
                        },
                        skuCapacity = new
                        {
                            value = webSkuCapacity
                        },
                    })
                });

        var resourceGroupId = ResourceGroupResource.CreateResourceIdentifier(SubscriptionId!, resourceGroupName);
        // This ArmDeploymentResource resource may or may not exist, but it doesn't matter - it's just a placeholder for validation
        var deploymentResourceId = ArmDeploymentResource.CreateResourceIdentifier(resourceGroupId, deploymentName);
        var armDeployment = client.GetArmDeploymentResource(deploymentResourceId);

        var validateOperation = await armDeployment.ValidateAsync(WaitUntil.Completed, toValidate, _cancellationToken);

        var validateResult = validateOperation.Value;
        if (validateResult.Error != null)
        {
            _logger.LogEndOperation(loggerOpKey, false, validateResult.Error.Message ?? "Validation errored");
            _logger.LogError(JsonConvert.SerializeObject(validateResult.Error, Formatting.Indented));
            return false;
        }

        // Log this if you want:
        string deploymentDetails = $"Deployment: {deploymentName} ProvisioningState:{validateResult.Properties.ProvisioningState}\n"
                                   + $"    started:{validateResult.Properties.Timestamp} duration:{validateResult.Properties.Duration}\n"
                                   + $"    correlationId:{validateResult.Properties.CorrelationId}\n"
                                   + $"    outputs:{JsonConvert.SerializeObject(validateResult.Properties.Outputs)}";
        bool succeeded = validateResult.Properties.ProvisioningState == "Succeeded";
        return succeeded;

Upvotes: 3

Jim Xu
Jim Xu

Reputation: 23111

If you want to validate your arm template, please refer to the following steps

  1. Create a service principal and assign Contributor role to the sp
az ad sp create-for-rbac -n "MyApp"
  1. Install Package
Install-Package Microsoft.Azure.Management.ResourceManager.Fluent -Version 1.34.0
  1. Code
 string clientId = "23****9c";
            string clientSecret = "?s****/k";
            string tenantDomain = "";
            string subscription = "";
            var creds= SdkContext.AzureCredentialsFactory.FromServicePrincipal(clientId, clientSecret, tenantDomain, AzureEnvironment.AzureGlobalCloud);
            var restClient = RestClient.Configure()
                .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
                .WithCredentials(creds)
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.BodyAndHeaders)
                .Build();


            ResourceManagementClient managementClient = new ResourceManagementClient(restClient);
            managementClient.SubscriptionId = subscription;

            //Validates whether the specified template is syntactically correct and will be accepted by Azure Resource Manager..
            DeploymentValidateResultInner res = await managementClient.Deployments.ValidateAsync("<groupName>", "<deployName>", new DeploymentInner()
            {
                Location = "",
                Properties = new DeploymentProperties()
                {
                    ParametersLink = new ParametersLink("uri"),
                    TemplateLink = new TemplateLink("")
                }
            });

            Console.WriteLine(res.Error.Message);

            // get changes that will be made by the deployment if executed at the scope of resource group
            WhatIfOperationResultInner res1 = await  managementClient.Deployments.WhatIfAsync("<groupName>", "<deployName>", new DeploymentWhatIf() { 
                  Location="",
                   Properties= new DeploymentWhatIfProperties() {
                       ParametersLink = new ParametersLink("uri"),
                       TemplateLink = new TemplateLink("")
                   }
            });

            foreach (var change in res1.Changes) {
               // 
            }

Upvotes: 2

Related Questions