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 {
