Repository: brooklyn-server
Updated Branches:
  refs/heads/master b4b48b3fd -> d69fda26e


Add BrooklynNetworkUtils.portRulesToRanges(Collection<String>)


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/2a950a5f
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/2a950a5f
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/2a950a5f

Branch: refs/heads/master
Commit: 2a950a5f3eb854652f323b915cdc7da620cb8705
Parents: 6f148be
Author: Valentin Aitken <[email protected]>
Authored: Fri Jul 29 14:04:38 2016 +0300
Committer: Aled Sage <[email protected]>
Committed: Thu Aug 11 19:53:51 2016 +0100

----------------------------------------------------------------------
 .../util/core/BrooklynNetworkUtils.java         | 22 +++++++--
 .../apache/brooklyn/util/net/Networking.java    | 31 +++++++++++++
 .../brooklyn/util/net/NetworkingUtilsTest.java  | 49 ++++++++++++++++++++
 3 files changed, 97 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a950a5f/core/src/main/java/org/apache/brooklyn/util/core/BrooklynNetworkUtils.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/brooklyn/util/core/BrooklynNetworkUtils.java 
b/core/src/main/java/org/apache/brooklyn/util/core/BrooklynNetworkUtils.java
index 0b99a88..2451844 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/BrooklynNetworkUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/BrooklynNetworkUtils.java
@@ -18,14 +18,23 @@
  */
 package org.apache.brooklyn.util.core;
 
-import java.net.InetAddress;
-
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Range;
+import com.google.common.collect.RangeSet;
+import com.google.common.collect.TreeRangeSet;
 import org.apache.brooklyn.core.location.geo.LocalhostExternalIpLoader;
 import org.apache.brooklyn.core.server.BrooklynServiceAttributes;
 import org.apache.brooklyn.util.JavaGroovyEquivalents;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.net.Networking;
 
+import java.net.InetAddress;
+import java.util.Collection;
+
+/**
+ * <tt>BrooklynNetworkUtils</tt> is for utility methods that rely on some 
other part(s) of Brooklyn,
+ * or seem too custom in how they are used/configured to be considered a 
"common utility".
+ */
 public class BrooklynNetworkUtils {
 
     /** returns the externally-facing IP address from which this host comes, 
or 127.0.0.1 if not resolvable */
@@ -33,10 +42,13 @@ public class BrooklynNetworkUtils {
         return LocalhostExternalIpLoader.getLocalhostIpQuicklyOrDefault();
     }
 
-    /** returns a IP address for localhost paying attention to a system 
property to prevent lookup in some cases */ 
+    /** returns a IP address for localhost paying attention to a system 
property to prevent lookup in some cases */
     public static InetAddress getLocalhostInetAddress() {
-        return 
TypeCoercions.coerce(JavaGroovyEquivalents.elvis(BrooklynServiceAttributes.LOCALHOST_IP_ADDRESS.getValue(),
 
+        return 
TypeCoercions.coerce(JavaGroovyEquivalents.elvis(BrooklynServiceAttributes.LOCALHOST_IP_ADDRESS.getValue(),
                 Networking.getLocalHost()), InetAddress.class);
     }
 
-}
+    private static Range<Integer> closedRange(String from, String to) {
+        return Range.closed(Integer.parseInt(from), Integer.parseInt(to));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a950a5f/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java
----------------------------------------------------------------------
diff --git 
a/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java 
b/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java
index 00eb06c..a561032 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java
@@ -30,6 +30,7 @@ import java.net.Socket;
 import java.net.SocketException;
 import java.net.UnknownHostException;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -37,6 +38,9 @@ import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Pattern;
 
+import com.google.common.collect.Range;
+import com.google.common.collect.RangeSet;
+import com.google.common.collect.TreeRangeSet;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.text.Identifiers;
 import org.apache.brooklyn.util.time.Time;
@@ -49,6 +53,9 @@ import com.google.common.base.Throwables;
 import com.google.common.net.HostAndPort;
 import com.google.common.primitives.UnsignedBytes;
 
+/**
+ * <tt>Networking</tt> is for generic network utility methods.
+ */
 public class Networking {
 
     private static final Logger log = 
LoggerFactory.getLogger(Networking.class);
@@ -227,6 +234,30 @@ public class Networking {
         }
     }
 
+    // TODO it does not add adjacent intervals: {[22, 22], [23, 23]} is not 
merged to {[22, 23]}
+    public static RangeSet<Integer> portRulesToRanges(Collection<String> 
portRules) {
+        RangeSet<Integer> result = TreeRangeSet.create();
+        for (String portRule : portRules) {
+            if (portRule.contains("-")) {
+                String[] fromTo = portRule.split("-");
+                Preconditions.checkState(fromTo.length == 2, "Invalid port 
range '%s'", portRule);
+                result.add(closedRange(fromTo[0], fromTo[1]));
+            } else {
+                result.add(closedRange(portRule, portRule));
+            }
+        }
+        return result;
+    }
+
+    private static Range<Integer> closedRange(String from, String to) {
+        Integer fromPort = Integer.parseInt(from);
+        Integer toPort = Integer.parseInt(to);
+        Preconditions.checkArgument(fromPort >= MIN_PORT_NUMBER && fromPort <= 
MAX_PORT_NUMBER, "fromPort %s should be a number between %s and %s", fromPort, 
MIN_PORT_NUMBER, MAX_PORT_NUMBER);
+        Preconditions.checkArgument(toPort >= MIN_PORT_NUMBER && toPort <= 
MAX_PORT_NUMBER, "toPort %s should be a number between %s and %s", toPort, 
MIN_PORT_NUMBER, MAX_PORT_NUMBER);
+        Preconditions.checkArgument(fromPort <= toPort, "fromNumber should be 
less or equal than toPort %s <= %s", fromPort, toPort);
+        return Range.closed(Integer.parseInt(from), Integer.parseInt(to));
+    }
+
     /**
      * Check if this is a private address, not exposed on the public Internet.
      *

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a950a5f/utils/common/src/test/java/org/apache/brooklyn/util/net/NetworkingUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/utils/common/src/test/java/org/apache/brooklyn/util/net/NetworkingUtilsTest.java
 
b/utils/common/src/test/java/org/apache/brooklyn/util/net/NetworkingUtilsTest.java
index 524d160..80fbe67 100644
--- 
a/utils/common/src/test/java/org/apache/brooklyn/util/net/NetworkingUtilsTest.java
+++ 
b/utils/common/src/test/java/org/apache/brooklyn/util/net/NetworkingUtilsTest.java
@@ -30,13 +30,19 @@ import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.UnknownHostException;
+import java.util.Collection;
 import java.util.concurrent.TimeUnit;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableRangeSet;
+import com.google.common.collect.Range;
+import com.google.common.collect.RangeSet;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.apache.brooklyn.util.net.Networking;
 import org.apache.brooklyn.util.text.Identifiers;
+import org.apache.brooklyn.util.text.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.Assert;
@@ -88,6 +94,49 @@ public class NetworkingUtilsTest {
         InetAddress addr3 = 
Networking.getInetAddressWithFixedName("localhost");
         assertEquals(addr3.getHostName(), "localhost");
     }
+
+    @Test
+    public void testPortRulesToRanges() throws Exception {
+        RangeSet<Integer> actualRangeSet = 
Networking.portRulesToRanges(ImmutableList.of(
+                "22", "23", "5000-6000", "8081", "80-90", "90-100", "23",
+                "8081"));
+
+        Asserts.assertEquals(actualRangeSet, 
ImmutableRangeSet.<Integer>builder()
+                .add(Range.closed(22, 22))
+                .add(Range.closed(23, 23))
+                .add(Range.closed(80, 100))
+                .add(Range.closed(5000, 6000))
+                .add(Range.closed(8081, 8081))
+                .build());
+    }
+
+    @Test
+    public void testPortRulesToRangesWithWrongRanges() throws Exception {
+        try {
+            Networking.portRulesToRanges(ImmutableList.of("-1"));
+            fail("Have to fail parsing");
+        } catch (IllegalArgumentException e) {
+            Asserts.assertTrue(e instanceof NumberFormatException);
+            Asserts.assertEquals(e.getMessage(), "For input string: \"\"");
+        }
+
+        assertCheckException(ImmutableList.of("68000"), 
Strings.format("fromPort 68000 should be a number between %s and %s",
+                Networking.MIN_PORT_NUMBER, 
Networking.MAX_PORT_NUMBER).toString());
+
+        assertCheckException(ImmutableList.of("67000-67000"), "fromPort 67000 
should be a number between 1 and 65535");
+        assertCheckException(ImmutableList.of("0-67000"), "fromPort 0 should 
be a number between 1 and 65535");
+        assertCheckException(ImmutableList.of("300-67000"), "toPort 67000 
should be a number between 1 and 65535");
+        assertCheckException(ImmutableList.of("2-1"), "fromNumber should be 
less or equal than toPort 2 <= 1");
+    }
+
+    private void assertCheckException(Collection<String> ports, String 
message) {
+        try {
+            Networking.portRulesToRanges(ports);
+            fail("Should have failed");
+        } catch (IllegalArgumentException e) {
+            Asserts.assertEquals(e.getMessage(), message);
+        }
+    }
     
     @Test(groups="Integration")
     public void testGetInetAddressWithFixedNameButInvalidIpThrowsException() 
throws Exception {

Reply via email to