You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by an...@apache.org on 2016/07/15 08:59:23 UTC

jclouds-labs git commit: [azure-arm] add supports to port ranges to addNetworkSecurityGroup

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 <an...@gmail.com>
Authored: Wed Jul 13 10:47:52 2016 +0200
Committer: Andrea Turli <an...@gmail.com>
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);