public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request) { var azureToken = request.DataStore.GetJson("AzureToken")["access_token"].ToString(); var subscription = request.DataStore.GetJson("SelectedSubscription")["SubscriptionId"].ToString(); var resourceGroup = request.DataStore.GetValue("SelectedResourceGroup"); var deploymentName = request.DataStore.GetValue("DeploymentName"); var repoUrl = request.DataStore.GetValue("RepoUrl"); var name = request.DataStore.GetValue("FunctionName"); var param = new AzureArmParameterGenerator(); param.AddStringParam("storageaccountname", "solutiontemplate" + Path.GetRandomFileName().Replace(".", "").Substring(0, 8)); param.AddStringParam("name", name); param.AddStringParam("repoUrl", repoUrl); param.AddStringParam("resourcegroup", resourceGroup); param.AddStringParam("subscription", subscription); var armTemplate = JsonUtility.GetJObjectFromJsonString(System.IO.File.ReadAllText(Path.Combine(request.ControllerModel.SiteCommonFilePath, "Service/Arm/AzureFunctions.json"))); var armParamTemplate = JsonUtility.GetJObjectFromObject(param.GetDynamicObject()); armTemplate.Remove("parameters"); armTemplate.Add("parameters", armParamTemplate["parameters"]); SubscriptionCloudCredentials creds = new TokenCloudCredentials(subscription, azureToken); ResourceManagementClient client = new ResourceManagementClient(creds); var deployment = new Azure.Management.Resources.Models.Deployment() { Properties = new DeploymentPropertiesExtended() { Template = armTemplate.ToString(), Parameters = JsonUtility.GetEmptyJObject().ToString() } }; var validate = await client.Deployments.ValidateAsync(resourceGroup, deploymentName, deployment, new CancellationToken()); if (!validate.IsValid) { return(new ActionResponse(ActionStatus.Failure, JsonUtility.GetJObjectFromObject(validate), null, DefaultErrorCodes.DefaultErrorCode, $"Azure:{validate.Error.Message} Details:{validate.Error.Details}")); } var deploymentItem = await client.Deployments.CreateOrUpdateAsync(resourceGroup, deploymentName, deployment, new CancellationToken()); return(new ActionResponse(ActionStatus.Success, deploymentItem)); }
public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request) { var azureToken = request.DataStore.GetJson("AzureToken", "access_token"); var subscription = request.DataStore.GetJson("SelectedSubscription", "SubscriptionId"); var resourceGroup = request.DataStore.GetValue("SelectedResourceGroup"); var deploymentName = request.DataStore.GetValue("DeploymentName"); var repoUrl = request.DataStore.GetValue("RepoUrl"); var name = request.DataStore.GetValue("FunctionName"); var hostingPlanName = request.DataStore.GetValue("hostingPlanName") ?? "apphostingplan"; var hostingEnvironment = request.DataStore.GetValue("hostingEnvironment") ?? string.Empty; var sku = request.DataStore.GetValue("sku") ?? "Dynamic"; var skuCode = request.DataStore.GetValue("skuCode") ?? "S1"; var workerSize = request.DataStore.GetValue("workerSize") ?? "0"; var branch = request.DataStore.GetValue("branch") ?? "master"; /*var projectPath = request.DataStore.GetValue("ProjectPath") ?? string.Empty; Commented out until we find a way to hasten deployments -we will bring back functions to the same repo then */ string functionArmDeploymentRelativePath = sku.ToLower() == "standard" ? "Service/Arm/AzureFunctionsStaticAppPlan.json" : "Service/Arm/AzureFunctions.json"; string storageAccountName = "solutiontemplate" + Path.GetRandomFileName().Replace(".", "").Substring(0, 8); var param = new AzureArmParameterGenerator(); param.AddStringParam("storageaccountname", storageAccountName); param.AddStringParam("name", name); param.AddStringParam("repoUrl", repoUrl); param.AddStringParam("resourcegroup", resourceGroup); param.AddStringParam("subscription", subscription); param.AddStringParam("hostingPlanName", hostingPlanName); param.AddStringParam("hostingEnvironment", hostingEnvironment); param.AddStringParam("sku", sku); param.AddStringParam("skuCode", skuCode); param.AddStringParam("workerSize", workerSize); param.AddStringParam("branch", branch); /*param.AddStringParam("projectPath", projectPath); Commented out until we find a way to hasten deployments - we will bring back functions to the same repo then*/ var armTemplate = JsonUtility.GetJObjectFromJsonString(System.IO.File.ReadAllText(Path.Combine(request.ControllerModel.SiteCommonFilePath, functionArmDeploymentRelativePath))); var armParamTemplate = JsonUtility.GetJObjectFromObject(param.GetDynamicObject()); armTemplate.Remove("parameters"); armTemplate.Add("parameters", armParamTemplate["parameters"]); SubscriptionCloudCredentials creds = new TokenCloudCredentials(subscription, azureToken); ResourceManagementClient client = new ResourceManagementClient(creds); var deployment = new Azure.Management.Resources.Models.Deployment() { Properties = new DeploymentPropertiesExtended() { Template = armTemplate.ToString(), Parameters = JsonUtility.GetEmptyJObject().ToString() } }; var validate = await client.Deployments.ValidateAsync(resourceGroup, deploymentName, deployment, new CancellationToken()); if (!validate.IsValid) { return(new ActionResponse(ActionStatus.Failure, JsonUtility.GetJObjectFromObject(validate), null, DefaultErrorCodes.DefaultErrorCode, $"Azure:{validate.Error.Message} Details:{validate.Error.Details}")); } var deploymentItem = await client.Deployments.CreateOrUpdateAsync(resourceGroup, deploymentName, deployment, new CancellationToken()); //Log app hosting plan request.Logger.LogResource(request.DataStore, hostingPlanName, DeployedResourceType.AppServicePlan, CreatedBy.BPST, DateTime.UtcNow.ToString("o"), string.Empty, sku + "" + skuCode + "" + workerSize); //Log function request.Logger.LogResource(request.DataStore, name, DeployedResourceType.Function, CreatedBy.BPST, DateTime.UtcNow.ToString("o"), string.Empty, sku + "" + skuCode + "" + workerSize); //Log storage account request.Logger.LogResource(request.DataStore, storageAccountName, DeployedResourceType.StorageAccount, CreatedBy.BPST, DateTime.UtcNow.ToString("o")); return(new ActionResponse(ActionStatus.Success, deploymentItem)); }