/// <summary> /// Creates a deployment at provided target scope and returns deployment succeeded/failed message. /// </summary> /// <param name="deploymentCollectionProvider">deployment collection provider</param> /// <param name="armClient">arm client</param> /// <param name="template">template used in deployment</param> /// <param name="parameterFilePath">path to parameter file used in deployment</param> /// <param name="id">id string to create the ResourceIdentifier from</param> /// <param name="scope">target scope</param> /// <param name="location">location to store the deployment data</param> /// <returns>deployment succeeded/failed message</returns> public static async Task <string> CreateDeployment( IDeploymentCollectionProvider deploymentCollectionProvider, ArmClient armClient, string template, string parameterFilePath, string id, string scope, string location) { if ((scope == LanguageConstants.TargetScopeTypeSubscription || scope == LanguageConstants.TargetScopeTypeManagementGroup) && string.IsNullOrWhiteSpace(location)) { return(LangServerResources.MissingLocationDeploymentFailedMessage); } DeploymentCollection?deploymentCollection; var resourceIdentifier = new ResourceIdentifier(id); try { deploymentCollection = deploymentCollectionProvider.GetDeploymentCollection(armClient, resourceIdentifier, scope); } catch (Exception e) { return(string.Format(LangServerResources.DeploymentFailedWithExceptionMessage, e.Message)); } if (deploymentCollection is not null) { JsonElement parameters; try { parameters = GetParameters(parameterFilePath); } catch (Exception e) { return(e.Message); } var deploymentProperties = new DeploymentProperties(DeploymentMode.Incremental) { Template = JsonDocument.Parse(template).RootElement, Parameters = parameters }; var input = new DeploymentInput(deploymentProperties) { Location = location, }; string deployment = "bicep_deployment_" + DateTime.UtcNow.ToString("yyyyMMddHHmmss"); try { var deploymentCreateOrUpdateOperation = await deploymentCollection.CreateOrUpdateAsync(waitForCompletion : true, deployment, input); return(GetDeploymentResultMessage(deploymentCreateOrUpdateOperation)); } catch (Exception e) { return(string.Format(LangServerResources.DeploymentFailedWithExceptionMessage, e.Message)); } } return(LangServerResources.DeploymentFailedMessage); }
/// <summary> /// Starts a deployment at provided target scope and returns <see cref="BicepDeploymentStartResponse"/>. /// </summary> /// <param name="deploymentCollectionProvider">deployment collection provider</param> /// <param name="armClient">arm client</param> /// <param name="documentPath">path to bicep file used in deployment</param> /// <param name="template">template used in deployment</param> /// <param name="parametersFilePath">path to parameter file used in deployment</param> /// <param name="id">id string to create the ResourceIdentifier from</param> /// <param name="scope">target scope</param> /// <param name="location">location to store the deployment data</param> /// <param name="deploymentId">deployment id</param> /// <param name="parametersFileName">parameters file name</param> /// <param name="parametersFileUpdateOption"><see cref="ParametersFileUpdateOption"/>update, create or overwrite parameters file</param> /// <param name="updatedDeploymentParameters">parameters that were updated during deployment flow</param> /// <param name="portalUrl">azure management portal URL</param> /// <param name="deploymentName">deployment name</param> /// <param name="deploymentOperationsCache">deployment operations cache that needs to be updated</param> /// <returns><see cref="BicepDeploymentStartResponse"/></returns> public static async Task <BicepDeploymentStartResponse> StartDeploymentAsync( IDeploymentCollectionProvider deploymentCollectionProvider, ArmClient armClient, string documentPath, string template, string parametersFilePath, string id, string scope, string location, string deploymentId, string parametersFileName, ParametersFileUpdateOption parametersFileUpdateOption, List <BicepUpdatedDeploymentParameter> updatedDeploymentParameters, string portalUrl, string deploymentName, IDeploymentOperationsCache deploymentOperationsCache) { if ((scope == LanguageConstants.TargetScopeTypeSubscription || scope == LanguageConstants.TargetScopeTypeManagementGroup) && string.IsNullOrWhiteSpace(location)) { return(new BicepDeploymentStartResponse(false, string.Format(LangServerResources.MissingLocationDeploymentFailedMessage, documentPath), null)); } ArmDeploymentCollection?deploymentCollection; var resourceIdentifier = new ResourceIdentifier(id); try { deploymentCollection = deploymentCollectionProvider.GetDeploymentCollection(armClient, resourceIdentifier, scope); } catch (Exception e) { return(new BicepDeploymentStartResponse(false, string.Format(LangServerResources.DeploymentFailedWithExceptionMessage, documentPath, e.Message), null)); } if (deploymentCollection is not null) { JsonElement parameters; try { var updatedParametersFileContents = DeploymentParametersHelper.GetUpdatedParametersFileContents(documentPath, parametersFileName, parametersFilePath, parametersFileUpdateOption, updatedDeploymentParameters); parameters = JsonElementFactory.CreateElement(updatedParametersFileContents); } catch (Exception e) { return(new BicepDeploymentStartResponse(false, e.Message, null)); } var deploymentProperties = new ArmDeploymentProperties(ArmDeploymentMode.Incremental) { Template = new BinaryData(JsonDocument.Parse(template).RootElement), Parameters = new BinaryData(parameters) }; var armDeploymentContent = new ArmDeploymentContent(deploymentProperties) { Location = location, }; try { var deploymentOperation = await deploymentCollection.CreateOrUpdateAsync(WaitUntil.Started, deploymentName, armDeploymentContent); if (deploymentOperation is null) { return(new BicepDeploymentStartResponse(false, string.Format(LangServerResources.DeploymentFailedMessage, documentPath), null)); } deploymentOperationsCache.CacheDeploymentOperation(deploymentId, deploymentOperation); var linkToDeploymentInAzurePortal = GetLinkToDeploymentInAzurePortal(portalUrl, id, deploymentName); return(new BicepDeploymentStartResponse( true, string.Format(LangServerResources.DeploymentStartedMessage, documentPath), string.Format(LangServerResources.ViewDeploymentInPortalMessage, linkToDeploymentInAzurePortal))); } catch (Exception e) { return(new BicepDeploymentStartResponse(false, string.Format(LangServerResources.DeploymentFailedWithExceptionMessage, documentPath, e.Message), null)); } } return(new BicepDeploymentStartResponse(false, string.Format(LangServerResources.DeploymentFailedMessage, documentPath), null)); }