Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -388,6 +394,9 @@ public AzureVMAgentTemplate(
String subnetName,
boolean usePrivateIP,
String nsgName,
String loadBalancerName,
String loadBalancerResourceGroupName,
String backendPoolName,
String agentWorkspace,
String jvmOptions,
RetentionStrategy retentionStrategy,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -610,6 +622,12 @@ public static Map<String, Object> 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",
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -1218,7 +1259,10 @@ public List<String> verifyTemplate() throws Exception {
getResourceGroupName(),
true,
usePrivateIP,
nsgName);
nsgName,
loadBalancerName,
loadBalancerResourceGroupName,
backendPoolName);
}

@Extension
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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[]{
"",
"",
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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<JsonNode> 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,
Expand Down Expand Up @@ -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<String> verifyTemplate(
Expand All @@ -1975,7 +2026,10 @@ public List<String> verifyTemplate(
String resourceGroupName,
boolean returnOnSingleError,
boolean usePrivateIP,
String nsgName) {
String nsgName,
String loadBalancerName,
String loadBalancerResourceGroupName,
String backendPoolName) {

List<String> errors = new ArrayList<String>();

Expand Down Expand Up @@ -2050,7 +2104,10 @@ public List<String> verifyTemplate(
resourceGroupName,
errors,
usePrivateIP,
nsgName
nsgName,
loadBalancerName,
loadBalancerResourceGroupName,
backendPoolName
);

} catch (Exception e) {
Expand All @@ -2074,7 +2131,10 @@ private void verifyTemplateAsync(
final String resourceGroupName,
List<String> errors,
final boolean usePrivateIP,
final String nsgName) {
final String nsgName,
final String loadBalancerName,
final String loadBalancerResourceGroupName,
final String backendPoolName) {

List<Callable<String>> verificationTaskList = new ArrayList<Callable<String>>();

Expand Down Expand Up @@ -2130,6 +2190,26 @@ public String call() throws Exception {
};
verificationTaskList.add(callVerifyNSG);

// Callable for Load Balancer.
Callable<String> callVerifyLoadBalancer = new Callable<String>() {

@Override
public String call() throws Exception {
return verifyLoadBalancer(loadBalancerResourceGroupName, loadBalancerName, resourceGroupName);
}
};
verificationTaskList.add(callVerifyLoadBalancer);

// Callable for Backend Pool.
Callable<String> callVerifyBackendPool = new Callable<String>() {

@Override
public String call() throws Exception {
return verifyBackendPool(loadBalancerResourceGroupName, loadBalancerName, backendPoolName, resourceGroupName);
}
};
verificationTaskList.add(callVerifyBackendPool);

try {
for (Future<String> validationResult : AzureVMCloud.getThreadPool().invokeAll(verificationTaskList)) {
try {
Expand Down Expand Up @@ -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.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
Loading