Repository: jclouds-labs Updated Branches: refs/heads/master 6a51667e6 -> b975be5e8
[azure-arm] add supports to port ranges to addNetworkSecurityGroup - add unit tests Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/b975be5e Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/b975be5e Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/b975be5e Branch: refs/heads/master Commit: b975be5e826a68a541a64416c1e7d0fedb7ae220 Parents: 6a51667 Author: Andrea Turli <[email protected]> Authored: Wed Jul 13 10:47:52 2016 +0200 Committer: Andrea Turli <[email protected]> Committed: Fri Jul 15 10:58:13 2016 +0200 ---------------------------------------------------------------------- .../arm/util/DeploymentTemplateBuilder.java | 91 ++++++++++++++------ .../features/DeploymentTemplateBuilderTest.java | 32 +++++-- 2 files changed, 93 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/b975be5e/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/DeploymentTemplateBuilder.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/DeploymentTemplateBuilder.java b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/DeploymentTemplateBuilder.java index f7850d4..89de398 100644 --- a/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/DeploymentTemplateBuilder.java +++ b/azurecompute-arm/src/main/java/org/jclouds/azurecompute/arm/util/DeploymentTemplateBuilder.java @@ -16,11 +16,11 @@ */ package org.jclouds.azurecompute.arm.util; -import com.google.common.base.Strings; -import com.google.common.collect.Lists; -import com.google.inject.assistedinject.Assisted; -import com.google.common.base.Joiner; -import com.google.common.base.Preconditions; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.jclouds.azurecompute.arm.compute.config.AzureComputeServiceContextModule; import org.jclouds.azurecompute.arm.compute.extensions.AzureComputeImageExtension; @@ -32,38 +32,37 @@ import org.jclouds.azurecompute.arm.domain.DeploymentTemplate; import org.jclouds.azurecompute.arm.domain.DiagnosticsProfile; import org.jclouds.azurecompute.arm.domain.DnsSettings; import org.jclouds.azurecompute.arm.domain.HardwareProfile; +import org.jclouds.azurecompute.arm.domain.IdReference; import org.jclouds.azurecompute.arm.domain.ImageReference; import org.jclouds.azurecompute.arm.domain.IpConfiguration; import org.jclouds.azurecompute.arm.domain.IpConfigurationProperties; import org.jclouds.azurecompute.arm.domain.KeyVaultReference; import org.jclouds.azurecompute.arm.domain.NetworkInterfaceCardProperties; import org.jclouds.azurecompute.arm.domain.NetworkProfile; +import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroupProperties; +import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule; +import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties; import org.jclouds.azurecompute.arm.domain.OSDisk; import org.jclouds.azurecompute.arm.domain.OSProfile; import org.jclouds.azurecompute.arm.domain.PublicIPAddressProperties; +import org.jclouds.azurecompute.arm.domain.ResourceDefinition; import org.jclouds.azurecompute.arm.domain.StorageProfile; import org.jclouds.azurecompute.arm.domain.StorageService; +import org.jclouds.azurecompute.arm.domain.StorageService.StorageServiceProperties; import org.jclouds.azurecompute.arm.domain.TemplateParameterType; import org.jclouds.azurecompute.arm.domain.VHD; import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties; -import org.jclouds.azurecompute.arm.domain.StorageService.StorageServiceProperties; -import org.jclouds.azurecompute.arm.domain.IdReference; -import org.jclouds.azurecompute.arm.domain.ResourceDefinition; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityGroupProperties; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRule; -import org.jclouds.azurecompute.arm.domain.NetworkSecurityRuleProperties; import org.jclouds.compute.domain.Template; import org.jclouds.json.Json; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.google.common.io.BaseEncoding.base64; +import com.google.common.base.Joiner; +import com.google.common.base.Preconditions; +import com.google.common.base.Strings; +import com.google.common.collect.Lists; import com.google.inject.Inject; +import com.google.inject.assistedinject.Assisted; +import static com.google.common.io.BaseEncoding.base64; import static org.jclouds.azurecompute.arm.compute.extensions.AzureComputeImageExtension.CUSTOM_IMAGE_PREFIX; import static org.jclouds.azurecompute.arm.config.AzureComputeProperties.STORAGE_API_VERSION; @@ -280,32 +279,36 @@ public class DeploymentTemplateBuilder { } private void addNetworkSecurityGroup() { - int ports[] = options.getInboundPorts(); - if ((ports != null) && (ports.length > 0)) { + int inboundPorts[] = options.getInboundPorts(); + if ((inboundPorts != null) && (inboundPorts.length > 0)) { variables.put("networkSecurityGroupName", name + "nsg"); variables.put("networkSecurityGroupNameReference", "[resourceId('Microsoft.Network/networkSecurityGroups',variables('networkSecurityGroupName'))]"); + List<String> portRanges = simplifyPorts(inboundPorts); + List<NetworkSecurityRule> rules = new ArrayList<NetworkSecurityRule>(); - for (int i = 0; i < ports.length; i++) { + int priority = 1234; + for (String portRange : portRanges) { NetworkSecurityRuleProperties ruleProperties = NetworkSecurityRuleProperties.builder() - .description("default-allow-port-" + ports[i]) + .description("default-allow-port-" + portRange) .protocol(NetworkSecurityRuleProperties.Protocol.All) .access(NetworkSecurityRuleProperties.Access.Allow) .sourcePortRange("*") - .destinationPortRange(Integer.toString(ports[i])) + .destinationPortRange(portRange) .sourceAddressPrefix("*") .destinationAddressPrefix("*") - .priority(1234 + i) + .priority(priority) .direction(NetworkSecurityRuleProperties.Direction.Inbound) .build(); NetworkSecurityRule networkSecurityRule = NetworkSecurityRule.create( - "default-allow-port-" + ports[i], + "default-allow-port-" + portRange, null, null, ruleProperties); rules.add(networkSecurityRule); + priority++; } NetworkSecurityGroupProperties networkSecurityGroupProperties = NetworkSecurityGroupProperties.builder() @@ -323,6 +326,44 @@ public class DeploymentTemplateBuilder { } + /** + * Helper function for simplifying an array of ports to a list of ranges as list of strings + * @param ports array of int + * @return list of strings representing ranges + */ + public static List<String> simplifyPorts(int[] ports) { + Preconditions.checkArgument(ports != null && ports.length != 0); + ArrayList<String> output = new ArrayList<String>(); + Arrays.sort(ports); + + int range_start = ports[0]; + int range_end = ports[0]; + for (int i = 1; i < ports.length; i++) { + if ((ports[i - 1] == ports[i] - 1) || (ports[i - 1] == ports[i])){ + // Range continues. + range_end = ports[i]; + } + else { + // Range ends. + output.add(formatRange(range_start, range_end)); + range_start = ports[i]; + range_end = ports[i]; + } + } + // Make sure we get the last range. + output.add(formatRange(range_start, range_end)); + return output; + } + + private static String formatRange(int start, int finish) { + if (start == finish){ + return Integer.toString(start); + } + else { + return String.format("%s-%s", Integer.toString(start), Integer.toString(finish)); + } + } + private void addVirtualMachine() { //Build OS Profile final String computerName = name + "pc"; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/b975be5e/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentTemplateBuilderTest.java ---------------------------------------------------------------------- diff --git a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentTemplateBuilderTest.java b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentTemplateBuilderTest.java index ad5b1f3..07ab6ef 100644 --- a/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentTemplateBuilderTest.java +++ b/azurecompute-arm/src/test/java/org/jclouds/azurecompute/arm/features/DeploymentTemplateBuilderTest.java @@ -16,8 +16,9 @@ */ package org.jclouds.azurecompute.arm.features; -import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest; -import org.jclouds.compute.options.TemplateOptions; +import java.util.List; +import java.util.Map; + import org.jclouds.azurecompute.arm.compute.options.AzureTemplateOptions; import org.jclouds.azurecompute.arm.domain.DeploymentBody; import org.jclouds.azurecompute.arm.domain.ImageReference; @@ -29,6 +30,7 @@ import org.jclouds.azurecompute.arm.domain.ResourceDefinition; import org.jclouds.azurecompute.arm.domain.StorageService; import org.jclouds.azurecompute.arm.domain.StorageService.StorageServiceProperties; import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties; +import org.jclouds.azurecompute.arm.internal.BaseAzureComputeApiMockTest; import org.jclouds.azurecompute.arm.util.DeploymentTemplateBuilder; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.HardwareBuilder; @@ -37,14 +39,12 @@ import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.internal.TemplateImpl; +import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.Location; import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; import org.testng.annotations.Test; -import java.util.Map; -import java.util.List; - import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -171,6 +171,28 @@ public class DeploymentTemplateBuilderTest extends BaseAzureComputeApiMockTest { assertNotNull(virtualMachineProperties.osProfile().linuxConfiguration().ssh().publicKeys()); } + @Test(expectedExceptions = IllegalArgumentException.class) + void testSimplifyPortsWithPortsNull() { + int[] ports = null; + DeploymentTemplateBuilder.simplifyPorts(ports); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + void testSimplifyPortsWithPortsEmpty() { + int[] ports = new int[0]; + DeploymentTemplateBuilder.simplifyPorts(ports); + } + + @Test + void testSimplifyPorts() { + int[] ports = {8084, 22, 8081, 8080, 8082}; + List<String> ranges = DeploymentTemplateBuilder.simplifyPorts(ports); + assertEquals(ranges.size(), 3); + assertEquals(ranges.get(0), "22"); + assertEquals(ranges.get(1), "8080-8082"); + assertEquals(ranges.get(2), "8084"); + } + private Template getMockTemplate(TemplateOptions options) { ((AzureTemplateOptions)options).virtualNetworkName(vnetName); ((AzureTemplateOptions)options).subnetId(subnetId);
