diff --git a/src/main/java/com/microsoft/azure/vmagent/AzureVMAgentTemplate.java b/src/main/java/com/microsoft/azure/vmagent/AzureVMAgentTemplate.java index d4d09c63..5ea9ea89 100644 --- a/src/main/java/com/microsoft/azure/vmagent/AzureVMAgentTemplate.java +++ b/src/main/java/com/microsoft/azure/vmagent/AzureVMAgentTemplate.java @@ -305,6 +305,12 @@ public int hashCode() { private final String nsgName; + private String loadBalancerName; + + private String loadBalancerResourceGroupName; + + private String backendPoolName; + private final String jvmOptions; // Indicates whether the template is disabled. @@ -388,6 +394,9 @@ public AzureVMAgentTemplate( String subnetName, boolean usePrivateIP, String nsgName, + String loadBalancerName, + String loadBalancerResourceGroupName, + String backendPoolName, String agentWorkspace, String jvmOptions, RetentionStrategy retentionStrategy, @@ -440,6 +449,9 @@ public AzureVMAgentTemplate( this.subnetName = subnetName; this.usePrivateIP = usePrivateIP; this.nsgName = nsgName; + this.loadBalancerName = loadBalancerName; + this.loadBalancerResourceGroupName = loadBalancerResourceGroupName; + this.backendPoolName = backendPoolName; this.agentWorkspace = agentWorkspace; this.jvmOptions = jvmOptions; this.executeInitScriptAsRoot = executeInitScriptAsRoot; @@ -610,6 +622,12 @@ public static Map getTemplateProperties(AzureVMAgentTemplate tem isBasic ? false : template.getUsePrivateIP()); templateProperties.put("nsgName", isBasic ? "" : template.getNsgName()); + templateProperties.put("loadBalancerName", + isBasic ? "" : template.getLoadBalancerName()); + templateProperties.put("loadBalancerResourceGroupName", + isBasic ? "" : template.getLoadBalancerResourceGroupName()); + templateProperties.put("backendPoolName", + isBasic ? "" : template.getBackendPoolName()); templateProperties.put("jvmOptions", isBasic ? "" : template.getJvmOptions()); templateProperties.put("noOfParallelJobs", @@ -971,6 +989,29 @@ public String getNsgName() { return nsgName; } + public String getLoadBalancerName() { + return loadBalancerName; + } + + public void setLoadBalancerName(String loadBalancerName) { + this.loadBalancerName = loadBalancerName; + } + + public String getLoadBalancerResourceGroupName() { + return loadBalancerResourceGroupName; + } + + public void setLoadBalancerResourceGroupName(String loadBalancerResourceGroupName) { + this.loadBalancerResourceGroupName = loadBalancerResourceGroupName; + } + public String getBackendPoolName() { + return backendPoolName; + } + + public void setBackendPoolName(String backendPoolName) { + this.backendPoolName = backendPoolName; + } + public String getAgentWorkspace() { return agentWorkspace; } @@ -1218,7 +1259,10 @@ public List verifyTemplate() throws Exception { getResourceGroupName(), true, usePrivateIP, - nsgName); + nsgName, + loadBalancerName, + loadBalancerResourceGroupName, + backendPoolName); } @Extension @@ -1549,7 +1593,10 @@ public FormValidation doVerifyConfiguration( @QueryParameter String subnetName, @QueryParameter boolean usePrivateIP, @QueryParameter String nsgName, - @QueryParameter String jvmOptions) { + @QueryParameter String jvmOptions, + @QueryParameter String loadBalancerName, + @QueryParameter String loadBalancerResourceGroupName, + @QueryParameter String backendPoolName) { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); ImageReferenceTypeClass image = new ImageReferenceTypeClass( @@ -1606,7 +1653,10 @@ public FormValidation doVerifyConfiguration( + "galleryImageDefinition: {30}\n\t" + "galleryImageVersion: {31}\n\t" + "galleryResourceGroup: {32}\n\t" - + "gallerySubscriptionId: {33}", + + "gallerySubscriptionId: {33}\n\t" + + "loadBalancerName: {34};\n\t" + + "loadBalancerResourceGroupName: {35};\n\t" + + "backendPoolName: {36};", new Object[]{ "", "", @@ -1641,7 +1691,10 @@ public FormValidation doVerifyConfiguration( galleryImageDefinition, galleryImageVersion, galleryResourceGroup, - gallerySubscriptionId}); + gallerySubscriptionId, + loadBalancerName, + loadBalancerResourceGroupName, + backendPoolName}); // First validate the subscription info. If it is not correct, // then we can't validate the @@ -1674,7 +1727,10 @@ public FormValidation doVerifyConfiguration( resourceGroupName, false, usePrivateIP, - nsgName); + nsgName, + loadBalancerName, + loadBalancerResourceGroupName, + backendPoolName); if (errors.size() > 0) { StringBuilder errorString = new StringBuilder(Messages.Azure_GC_Template_Error_List()).append("\n"); diff --git a/src/main/java/com/microsoft/azure/vmagent/AzureVMManagementServiceDelegate.java b/src/main/java/com/microsoft/azure/vmagent/AzureVMManagementServiceDelegate.java index 7b83ce78..a628c268 100644 --- a/src/main/java/com/microsoft/azure/vmagent/AzureVMManagementServiceDelegate.java +++ b/src/main/java/com/microsoft/azure/vmagent/AzureVMManagementServiceDelegate.java @@ -25,9 +25,7 @@ import com.microsoft.azure.PagedList; import com.microsoft.azure.management.Azure; import com.microsoft.azure.management.compute.*; -import com.microsoft.azure.management.network.Network; -import com.microsoft.azure.management.network.NetworkSecurityGroup; -import com.microsoft.azure.management.network.PublicIPAddress; +import com.microsoft.azure.management.network.*; import com.microsoft.azure.management.resources.DeploymentMode; import com.microsoft.azure.management.resources.GenericResource; import com.microsoft.azure.management.resources.fluentcore.arm.ExpandableStringEnum; @@ -540,11 +538,19 @@ public AzureVMDeploymentInfo createDeployment( addNSGNode(tmp, mapper, (String) properties.get("nsgName")); } + if (StringUtils.isNotBlank((String) properties.get("loadBalancerName")) && StringUtils.isNotBlank((String) properties.get("backendPoolName"))) { + if (StringUtils.isNotBlank((String) properties.get("loadBalancerResourceGroupName"))) { + copyVariable(tmp, properties, "loadBalancerResourceGroupName"); + } else { + putVariable(tmp, "loadBalancerResourceGroupName", resourceGroupName); + } + addBackendPoolNode(tmp, mapper, (String) properties.get("loadBalancerName"), (String) properties.get("backendPoolName")); + } + // Register the deployment for cleanup deploymentRegistrar.registerDeployment( cloudName, template.getResourceGroupName(), deploymentName, scriptUri); // Create the deployment - azureClient.deployments().define(deploymentName) .withExistingResourceGroup(template.getResourceGroupName()) .withTemplate(tmp.toString()) @@ -682,6 +688,47 @@ private void addPublicIPResourceNode( } } + private static void addBackendPoolNode( + final JsonNode template, + final ObjectMapper mapper, + final String loadBalancerName, + final String backendPoolName) throws IOException { + + ObjectNode.class.cast(template.get("variables")).put("loadBalancerName", loadBalancerName).put("backendPoolName", backendPoolName); + // ObjectNode.class.cast(template.get("variables")).put("loadBalancerResourceGroupName", resourceGroupName); + + ArrayNode resourcesNodes = ArrayNode.class.cast(template.get("resources")); + Iterator resourcesNodesIter = resourcesNodes.elements(); + while (resourcesNodesIter.hasNext()) { + JsonNode resourcesNode = resourcesNodesIter.next(); + JsonNode typeNode = resourcesNode.get("type"); + if (typeNode == null || !typeNode.asText().equals("Microsoft.Network/networkInterfaces")) { + continue; + } + + ArrayNode backendPoolsNode = mapper.createArrayNode(); + ObjectNode backendPoolNode = mapper.createObjectNode(); + backendPoolNode.put( + "id", + "[concat(resourceId(variables('loadBalancerResourceGroupName'),'Microsoft.Network/loadBalancers', variables('loadBalancerName')), '/backendAddressPools/', variables('backendPoolName'))]" + ); + backendPoolsNode.add(backendPoolNode); + + // Find the properties node + ObjectNode propertiesNode = ObjectNode.class.cast(resourcesNode.get("properties")); + + // Find ipConfigurations node + ArrayNode ipConfigurationsNode = ArrayNode.class.cast(propertiesNode.get("ipConfigurations")); + + // Find ipconfig1 which is always first element in ipConfigurations array + ObjectNode ipconfig1PropertiesNode = ObjectNode.class.cast(ipConfigurationsNode.get(0).get("properties")); + + // We will attach the provided load balancer backend pool and not check if it's valid because that's done in the verification step + ipconfig1PropertiesNode.set("loadBalancerBackendAddressPools", backendPoolsNode); + break; + } + } + private static void addNSGNode( JsonNode template, ObjectMapper mapper, @@ -1950,6 +1997,10 @@ private static String getLocationName(String location) { * @param returnOnSingleError * @param resourceGroupName * @param usePrivateIP + * @param nsgName + * @param loadBalancerName + * @param loadBalancerResourceGroupName + * @param backendPoolName * @return */ public List verifyTemplate( @@ -1975,7 +2026,10 @@ public List verifyTemplate( String resourceGroupName, boolean returnOnSingleError, boolean usePrivateIP, - String nsgName) { + String nsgName, + String loadBalancerName, + String loadBalancerResourceGroupName, + String backendPoolName) { List errors = new ArrayList(); @@ -2050,7 +2104,10 @@ public List verifyTemplate( resourceGroupName, errors, usePrivateIP, - nsgName + nsgName, + loadBalancerName, + loadBalancerResourceGroupName, + backendPoolName ); } catch (Exception e) { @@ -2074,7 +2131,10 @@ private void verifyTemplateAsync( final String resourceGroupName, List errors, final boolean usePrivateIP, - final String nsgName) { + final String nsgName, + final String loadBalancerName, + final String loadBalancerResourceGroupName, + final String backendPoolName) { List> verificationTaskList = new ArrayList>(); @@ -2130,6 +2190,26 @@ public String call() throws Exception { }; verificationTaskList.add(callVerifyNSG); + // Callable for Load Balancer. + Callable callVerifyLoadBalancer = new Callable() { + + @Override + public String call() throws Exception { + return verifyLoadBalancer(loadBalancerResourceGroupName, loadBalancerName, resourceGroupName); + } + }; + verificationTaskList.add(callVerifyLoadBalancer); + + // Callable for Backend Pool. + Callable callVerifyBackendPool = new Callable() { + + @Override + public String call() throws Exception { + return verifyBackendPool(loadBalancerResourceGroupName, loadBalancerName, backendPoolName, resourceGroupName); + } + }; + verificationTaskList.add(callVerifyBackendPool); + try { for (Future validationResult : AzureVMCloud.getThreadPool().invokeAll(verificationTaskList)) { try { @@ -2478,6 +2558,41 @@ public String verifyNSG( return Constants.OP_SUCCESS; } + public String verifyLoadBalancer( + final String loadBalancerResourceGroupName, + final String loadBalancerName, + final String resourceGroupName) { + if (StringUtils.isNotBlank(loadBalancerName)) { + String finalResourceGroupName = resourceGroupName; + if (StringUtils.isNotBlank(loadBalancerResourceGroupName)) { + finalResourceGroupName = loadBalancerResourceGroupName; + } + LoadBalancer lb = azureClient.loadBalancers().getByResourceGroup(finalResourceGroupName, loadBalancerName); + if (lb == null) { + return Messages.Azure_GC_Template_LoadBalancer_NotFound(loadBalancerName, finalResourceGroupName); + } + } + return Constants.OP_SUCCESS; + } + + public String verifyBackendPool( + final String loadBalancerResourceGroupName, + final String loadBalancerName, + final String backendPoolName, + final String resourceGroupName) { + if (StringUtils.isNotBlank(loadBalancerName) && StringUtils.isNotBlank(backendPoolName)) { + String finalResourceGroupName = resourceGroupName; + if (StringUtils.isNotBlank(loadBalancerResourceGroupName)) { + finalResourceGroupName = loadBalancerResourceGroupName; + } + LoadBalancerBackend backend = azureClient.loadBalancers().getByResourceGroup(finalResourceGroupName, loadBalancerName).backends().get(backendPoolName); + if (backend == null) { + return Messages.Azure_GC_Template_BackendPool_NotFound(backendPoolName); + } + } + return Constants.OP_SUCCESS; + } + /** * Create Azure resource Group. * diff --git a/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImage.java b/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImage.java index d7798f5f..86aef664 100644 --- a/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImage.java +++ b/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImage.java @@ -57,6 +57,12 @@ public class AdvancedImage { private String nsgName; + private String loadBalancerName; + + private String loadBalancerResourceGroupName; + + private String backendPoolName; + private String jvmOptions; private String noOfParallelJobs; @@ -90,6 +96,9 @@ public AdvancedImage(String imageReferenceType, String subnetName, boolean usePrivateIP, String nsgName, + String loadBalancerName, + String loadBalancerResourceGroupName, + String backendPoolName, String jvmOptions, String noOfParallelJobs, boolean templateDisabled) { @@ -120,6 +129,9 @@ public AdvancedImage(String imageReferenceType, this.subnetName = subnetName; this.usePrivateIP = usePrivateIP; this.nsgName = nsgName; + this.loadBalancerName = loadBalancerName; + this.loadBalancerResourceGroupName = loadBalancerResourceGroupName; + this.backendPoolName = backendPoolName; this.jvmOptions = jvmOptions; this.noOfParallelJobs = noOfParallelJobs; this.templateDisabled = templateDisabled; @@ -233,6 +245,18 @@ public String getNsgName() { return nsgName; } + public String getLoadBalancerName() { + return loadBalancerName; + } + + public String getLoadBalancerResourceGroupName() { + return loadBalancerResourceGroupName; + } + + public String getBackendPoolName() { + return backendPoolName; + } + public String getJvmOptions() { return jvmOptions; } diff --git a/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImageBuilder.java b/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImageBuilder.java index 14539a57..2afcecf6 100644 --- a/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImageBuilder.java +++ b/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImageBuilder.java @@ -34,6 +34,9 @@ public AdvancedImageBuilder(AdvancedImageFluent fluent, AdvancedImage image) fluent.withSubnetName(image.getSubnetName()); fluent.withUsePrivateIP(image.isUsePrivateIP()); fluent.withNetworkSecurityGroupName(image.getNsgName()); + fluent.withLoadBalancerName(image.getLoadBalancerName()); + fluent.withLoadBalancerResourceGroupName(image.getLoadBalancerResourceGroupName()); + fluent.withBackendPoolName(image.getBackendPoolName()); fluent.withJvmOptions(image.getJvmOptions()); fluent.withDisableTemplate(image.isTemplateDisabled()); fluent.withRunScriptAsRoot(image.isExecuteInitScriptAsRoot()); @@ -68,6 +71,9 @@ public AdvancedImageBuilder(AdvancedImage image) { fluent.withSubnetName(image.getSubnetName()); fluent.withUsePrivateIP(image.isUsePrivateIP()); fluent.withNetworkSecurityGroupName(image.getNsgName()); + fluent.withLoadBalancerName(image.getLoadBalancerName()); + fluent.withLoadBalancerResourceGroupName(image.getLoadBalancerResourceGroupName()); + fluent.withBackendPoolName(image.getBackendPoolName()); fluent.withJvmOptions(image.getJvmOptions()); fluent.withDisableTemplate(image.isTemplateDisabled()); fluent.withRunScriptAsRoot(image.isExecuteInitScriptAsRoot()); @@ -102,6 +108,9 @@ public AdvancedImage build() { fluent.getSubnetName(), fluent.isUsePrivateIP(), fluent.getNsgName(), + fluent.getLoadBalancerName(), + fluent.getLoadBalancerResourceGroupName(), + fluent.getBackendPoolName(), fluent.getJvmOptions(), fluent.getNoOfParallelJobs(), fluent.isTemplateDisabled()); diff --git a/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImageFluent.java b/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImageFluent.java index c89c183d..4574ac71 100644 --- a/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImageFluent.java +++ b/src/main/java/com/microsoft/azure/vmagent/builders/AdvancedImageFluent.java @@ -60,6 +60,12 @@ public class AdvancedImageFluent> { private String nsgName; + private String loadBalancerName; + + private String loadBalancerResourceGroupName; + + private String backendPoolName; + private String jvmOptions; private String noOfParallelJobs; @@ -195,6 +201,21 @@ public T withNetworkSecurityGroupName(String nsgName) { this.nsgName = nsgName; return (T) this; } + + public T withLoadBalancerName(String loadBalancerName) { + this.loadBalancerName = loadBalancerName; + return (T) this; + } + + public T withLoadBalancerResourceGroupName(String loadBalancerResourceGroupName) { + this.loadBalancerResourceGroupName= loadBalancerResourceGroupName; + return (T) this; + } + + public T withBackendPoolName(String backendPoolName) { + this.backendPoolName = backendPoolName; + return (T) this; + } public T withJvmOptions(String jvmOptions) { this.jvmOptions = jvmOptions; @@ -319,6 +340,18 @@ public String getNsgName() { return nsgName; } + public String getLoadBalancerName() { + return loadBalancerName; + } + + public String getLoadBalancerResourceGroupName() { + return loadBalancerResourceGroupName; + } + + public String getBackendPoolName() { + return backendPoolName; + } + public String getJvmOptions() { return jvmOptions; } diff --git a/src/main/java/com/microsoft/azure/vmagent/builders/AzureVMTemplateBuilder.java b/src/main/java/com/microsoft/azure/vmagent/builders/AzureVMTemplateBuilder.java index 86290410..d2e286fb 100644 --- a/src/main/java/com/microsoft/azure/vmagent/builders/AzureVMTemplateBuilder.java +++ b/src/main/java/com/microsoft/azure/vmagent/builders/AzureVMTemplateBuilder.java @@ -118,6 +118,9 @@ public AzureVMAgentTemplate build() { fluent.getAdvancedImage().getSubnetName(), fluent.getAdvancedImage().isUsePrivateIP(), fluent.getAdvancedImage().getNsgName(), + fluent.getAdvancedImage().getLoadBalancerName(), + fluent.getAdvancedImage().getLoadBalancerResourceGroupName(), + fluent.getAdvancedImage().getBackendPoolName(), fluent.getWorkspace(), fluent.getAdvancedImage().getJvmOptions(), fluent.getRetentionStrategy(), diff --git a/src/main/resources/com/microsoft/azure/vmagent/AzureVMAgentTemplate/config.jelly b/src/main/resources/com/microsoft/azure/vmagent/AzureVMAgentTemplate/config.jelly index a9b3c6a8..6d2324bf 100644 --- a/src/main/resources/com/microsoft/azure/vmagent/AzureVMAgentTemplate/config.jelly +++ b/src/main/resources/com/microsoft/azure/vmagent/AzureVMAgentTemplate/config.jelly @@ -230,6 +230,17 @@ + + + + + + + + + + + diff --git a/src/main/resources/com/microsoft/azure/vmagent/AzureVMAgentTemplate/config.properties b/src/main/resources/com/microsoft/azure/vmagent/AzureVMAgentTemplate/config.properties index 462e1bad..d7e799dc 100644 --- a/src/main/resources/com/microsoft/azure/vmagent/AzureVMAgentTemplate/config.properties +++ b/src/main/resources/com/microsoft/azure/vmagent/AzureVMAgentTemplate/config.properties @@ -69,6 +69,9 @@ Subnet_Name=Subnet Name shutdownOnIdle=Shutdown Only (Do Not Delete) After Retention Time Use_Private_Ip=Make VM agent IP private NSG_Name=Network Security Group Name +LoadBalancer_Name=Load Balancer Name +LoadBalancerResourceGroup_Name=Load Balancer Resource Group Name +BackendPool_Name=Load Balancer Backend Pool Name Enable_MSI=Enable System Assigned Managed Identity(MSI) Enable_UAMI=Enable User Assigned Managed Identity(UAMI) UAMI_ID=User Assigned Managed Identity Resource ID diff --git a/src/main/resources/com/microsoft/azure/vmagent/Messages.properties b/src/main/resources/com/microsoft/azure/vmagent/Messages.properties index 62aff301..94bdee23 100644 --- a/src/main/resources/com/microsoft/azure/vmagent/Messages.properties +++ b/src/main/resources/com/microsoft/azure/vmagent/Messages.properties @@ -78,3 +78,5 @@ SA_Blank_Create_New=(Leave blank to create a new storage account) Azure_VM_Agent_Attach_Public_IP_Success=Successfully attached a public IP Azure_VM_Agent_Attach_Public_IP_Failure=Failed to attach a public IP Azure_GC_Template_NSG_NotFound=The Network Security Group {0} does not exist in the Resource Group. +Azure_GC_Template_LoadBalancer_NotFound=The Load Balancer {0} does not exist in the Resource Group {1}. +Azure_GC_Template_BackendPool_NotFound=The BackendPool {0} does not exist in the Resource Group or doesn't belong to Load Balancer. diff --git a/src/main/resources/customImageTemplate.json b/src/main/resources/customImageTemplate.json index 20952d26..5b97493e 100644 --- a/src/main/resources/customImageTemplate.json +++ b/src/main/resources/customImageTemplate.json @@ -7,6 +7,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/resources/customImageTemplateWithManagedDisk.json b/src/main/resources/customImageTemplateWithManagedDisk.json index dfd6cae9..08534e23 100644 --- a/src/main/resources/customImageTemplateWithManagedDisk.json +++ b/src/main/resources/customImageTemplateWithManagedDisk.json @@ -7,6 +7,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/resources/customImageTemplateWithScript.json b/src/main/resources/customImageTemplateWithScript.json index 70962504..6b06a3df 100644 --- a/src/main/resources/customImageTemplateWithScript.json +++ b/src/main/resources/customImageTemplateWithScript.json @@ -11,6 +11,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/resources/customImageTemplateWithScriptAndManagedDisk.json b/src/main/resources/customImageTemplateWithScriptAndManagedDisk.json index a2908f30..2d0772f8 100644 --- a/src/main/resources/customImageTemplateWithScriptAndManagedDisk.json +++ b/src/main/resources/customImageTemplateWithScriptAndManagedDisk.json @@ -11,6 +11,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/resources/referenceImageIDTemplateWithManagedDisk.json b/src/main/resources/referenceImageIDTemplateWithManagedDisk.json index fa21a9e5..be8093d3 100644 --- a/src/main/resources/referenceImageIDTemplateWithManagedDisk.json +++ b/src/main/resources/referenceImageIDTemplateWithManagedDisk.json @@ -7,6 +7,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/resources/referenceImageIDTemplateWithScriptAndManagedDisk.json b/src/main/resources/referenceImageIDTemplateWithScriptAndManagedDisk.json index 2f561538..8d5999d8 100644 --- a/src/main/resources/referenceImageIDTemplateWithScriptAndManagedDisk.json +++ b/src/main/resources/referenceImageIDTemplateWithScriptAndManagedDisk.json @@ -11,6 +11,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/resources/referenceImageTemplate.json b/src/main/resources/referenceImageTemplate.json index aa77d6e8..5cddb044 100644 --- a/src/main/resources/referenceImageTemplate.json +++ b/src/main/resources/referenceImageTemplate.json @@ -7,6 +7,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/resources/referenceImageTemplateWithManagedDisk.json b/src/main/resources/referenceImageTemplateWithManagedDisk.json index a27614f9..ddff576b 100644 --- a/src/main/resources/referenceImageTemplateWithManagedDisk.json +++ b/src/main/resources/referenceImageTemplateWithManagedDisk.json @@ -7,6 +7,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/resources/referenceImageTemplateWithScript.json b/src/main/resources/referenceImageTemplateWithScript.json index 205ef4ca..a663de75 100644 --- a/src/main/resources/referenceImageTemplateWithScript.json +++ b/src/main/resources/referenceImageTemplateWithScript.json @@ -11,6 +11,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/resources/referenceImageTemplateWithScriptAndManagedDisk.json b/src/main/resources/referenceImageTemplateWithScriptAndManagedDisk.json index 62c6d1e7..81972f83 100644 --- a/src/main/resources/referenceImageTemplateWithScriptAndManagedDisk.json +++ b/src/main/resources/referenceImageTemplateWithScriptAndManagedDisk.json @@ -11,6 +11,9 @@ "virtualNetworkResourceGroupName": "", "subnetName": "", "nsgName": "", + "loadBalancerName": "", + "loadBalancerResourceGroupName": "", + "backendPoolName": "", "storageAccountName": "[concat('jnk',uniqueString(resourceGroup().id))]", "vnetID": "[resourceId(variables('virtualNetworkResourceGroupName'), 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]", diff --git a/src/main/webapp/help-backendPoolName.html b/src/main/webapp/help-backendPoolName.html new file mode 100644 index 00000000..52910cf5 --- /dev/null +++ b/src/main/webapp/help-backendPoolName.html @@ -0,0 +1,2 @@ +The name of an existing load balancer's Backend Pool in Azure located in the same resource group as the virtual machines, as specified +in the General Configuration section of the template. \ No newline at end of file diff --git a/src/main/webapp/help-loadBalancerName.html b/src/main/webapp/help-loadBalancerName.html new file mode 100644 index 00000000..a09359cb --- /dev/null +++ b/src/main/webapp/help-loadBalancerName.html @@ -0,0 +1,2 @@ +The name of an existing Load Balancer in Azure located in the same resource group as the virtual machines, as specified +in the General Configuration section of the template. \ No newline at end of file diff --git a/src/main/webapp/help-loadBalancerResourceGroupName.html b/src/main/webapp/help-loadBalancerResourceGroupName.html new file mode 100644 index 00000000..1b4fd8a8 --- /dev/null +++ b/src/main/webapp/help-loadBalancerResourceGroupName.html @@ -0,0 +1 @@ +The name of an existing resource group in Azure where the load balancer is located. If left blank, the resourceGroup as specified in the General Configuration section of the template is used. \ No newline at end of file