/// <summary> /// Deploy to a resource group /// </summary> /// <remarks>Default to "Complete" deployment</remarks> /// <param name="requestId"></param> /// <param name="correlationId"></param> /// <param name="subscriptionId">ISV Azure subscription id</param> /// <param name="resourceGroup">ISV Azure resource group</param> /// <param name="deploymentName">Deployment name</param> /// <param name="templatePath">Link to template file</param> /// <param name="parametersPath">Link to parameter file</param> /// <param name="rollbackToLastSuccessful">If true, the rolllback property will be set in the request body</param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task <DeploymentExtendedResult> PutDeploymentAsync( Guid requestId, Guid correlationId, string subscriptionId, string resourceGroup, string deploymentName, string templatePath = default, object template = default, string parametersPath = default, object parameters = default, bool rollbackToLastSuccessful = default, CancellationToken cancellationToken = default) { try { if ((templatePath == null) == (template == null)) { throw new LunaBadRequestUserException(LoggingUtils.ComposeBadXorArgumentMessage("templatePath", "template"), UserErrorCode.InvalidParameter); } if ((parametersPath == null) == (parameters == null)) { throw new LunaBadRequestUserException(LoggingUtils.ComposeBadXorArgumentMessage("parametersPath", "parameters"), UserErrorCode.InvalidParameter); } var requestUrl = GetRequestUri(subscriptionId, resourceGroup, deploymentName); var body = rollbackToLastSuccessful ? new DeploymentRequestBody { Properties = new DeploymentProperties { Mode = nameof(DeploymentMode.Complete), TemplateLink = new TemplateLink { Uri = templatePath }, Template = template, Parameters = parameters, OnErrorDeployment = new OnErrorDeployment { Type = nameof(DeploymentRollback.LastSuccessful) } } } : new DeploymentRequestBody { Properties = new DeploymentProperties { Mode = nameof(DeploymentMode.Complete), TemplateLink = new TemplateLink { Uri = templatePath }, Template = template, Parameters = parameters } } ; var requestBody = JsonConvert.SerializeObject(body); var bearerToken = await _keyVaultHelper.GetBearerToken( _options.AzureActiveDirectory, _options.ClientService.AuthenticationResourceId); var response = await SendRequestAndReturnResult( HttpMethod.Put, requestUrl, requestId, correlationId, bearerToken, null, requestBody, cancellationToken ); return(await DeploymentRequestResult.ParseAsync <DeploymentExtendedResult>(response)); } catch (LunaServerException e) { throw new LunaProvisioningException("Cannot deploy template.", e.IsRetryable, ProvisioningState.ArmTemplatePending, e); } }