SLIDER-1124 throw exception if bad port range is specified
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/5c391cc6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/5c391cc6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/5c391cc6 Branch: refs/heads/feature/SLIDER-1107_AM_config_generation Commit: 5c391cc6caaf772f8aa4296d3444c19c6c8ed534 Parents: cfb516b Author: Billie Rinaldi <billie.rina...@gmail.com> Authored: Mon May 23 10:04:03 2016 -0700 Committer: Billie Rinaldi <billie.rina...@gmail.com> Committed: Mon May 23 10:04:03 2016 -0700 ---------------------------------------------------------------------- .../apache/slider/common/tools/PortScanner.java | 34 ++++++++++----- .../server/appmaster/SliderAppMaster.java | 3 +- .../slider/common/tools/TestPortScan.groovy | 44 ++++++++++++++++++++ 3 files changed, 70 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5c391cc6/slider-core/src/main/java/org/apache/slider/common/tools/PortScanner.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/common/tools/PortScanner.java b/slider-core/src/main/java/org/apache/slider/common/tools/PortScanner.java index 5b80f9f..64783b6 100644 --- a/slider-core/src/main/java/org/apache/slider/common/tools/PortScanner.java +++ b/slider-core/src/main/java/org/apache/slider/common/tools/PortScanner.java @@ -17,6 +17,7 @@ package org.apache.slider.common.tools; import org.apache.slider.common.SliderExitCodes; +import org.apache.slider.core.exceptions.BadConfigException; import org.apache.slider.core.exceptions.SliderException; import java.io.IOException; @@ -40,25 +41,38 @@ public class PortScanner { public PortScanner() { } - public void setPortRange(String input) { + public void setPortRange(String input) throws BadConfigException { // first split based on commas Set<Integer> inputPorts= new TreeSet<Integer>(); String[] ranges = input.split(","); for ( String range : ranges ) { + if (range.trim().isEmpty()) { + continue; + } Matcher m = SINGLE_NUMBER.matcher(range.trim()); if (m.find()) { inputPorts.add(Integer.parseInt(m.group())); - } else { - m = NUMBER_RANGE.matcher(range.trim()); - if (m.find()) { - String[] boundaryValues = m.group(0).split("-"); - int start = Integer.parseInt(boundaryValues[0].trim()); - int end = Integer.parseInt(boundaryValues[1].trim()); - for (int i = start; i < end + 1; i++) { - inputPorts.add(i); - } + continue; + } + m = NUMBER_RANGE.matcher(range.trim()); + if (m.find()) { + String[] boundaryValues = m.group(0).split("-"); + int start = Integer.parseInt(boundaryValues[0].trim()); + int end = Integer.parseInt(boundaryValues[1].trim()); + if (end < start) { + throw new BadConfigException("End of port range is before start: " + + range + " in input: " + input); } + for (int i = start; i < end + 1; i++) { + inputPorts.add(i); + } + continue; } + throw new BadConfigException("Bad port range: " + range + " in input: " + + input); + } + if (inputPorts.size() == 0) { + throw new BadConfigException("No ports found in range: " + input); } this.remainingPortsToCheck = new ArrayList<Integer>(inputPorts); } http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5c391cc6/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java index 0776a6c..b767059 100644 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java +++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java @@ -1137,7 +1137,8 @@ public class SliderAppMaster extends AbstractSliderLaunchedService /** * Build up the port scanner. This may include setting a port range. */ - private void buildPortScanner(AggregateConf instanceDefinition) { + private void buildPortScanner(AggregateConf instanceDefinition) + throws BadConfigException { portScanner = new PortScanner(); String portRange = instanceDefinition. getAppConfOperations().getGlobalOptions(). http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5c391cc6/slider-core/src/test/groovy/org/apache/slider/common/tools/TestPortScan.groovy ---------------------------------------------------------------------- diff --git a/slider-core/src/test/groovy/org/apache/slider/common/tools/TestPortScan.groovy b/slider-core/src/test/groovy/org/apache/slider/common/tools/TestPortScan.groovy index f009e25..4d87c75 100644 --- a/slider-core/src/test/groovy/org/apache/slider/common/tools/TestPortScan.groovy +++ b/slider-core/src/test/groovy/org/apache/slider/common/tools/TestPortScan.groovy @@ -18,6 +18,7 @@ package org.apache.slider.common.tools +import org.apache.slider.core.exceptions.BadConfigException import org.apache.slider.core.exceptions.SliderException import org.junit.Test @@ -125,4 +126,47 @@ class TestPortScan { server.close() } } + + @Test(expected = BadConfigException.class) + public void testBadRange() { + PortScanner portScanner = new PortScanner() + // note the em dash + portScanner.setPortRange("2000â2010") + } + + @Test(expected = BadConfigException.class) + public void testEndBeforeStart() { + PortScanner portScanner = new PortScanner() + portScanner.setPortRange("2001-2000") + } + + @Test(expected = BadConfigException.class) + public void testEmptyRange() { + PortScanner portScanner = new PortScanner() + portScanner.setPortRange("") + } + + @Test(expected = BadConfigException.class) + public void testBlankRange() { + PortScanner portScanner = new PortScanner() + portScanner.setPortRange(" ") + } + + @Test + public void testExtraComma() { + PortScanner portScanner = new PortScanner() + portScanner.setPortRange("2000-2001, ") + List<Integer> ports = portScanner.remainingPortsToCheck + def expectedPorts = [2000, 2001] + assert ports == expectedPorts + } + + @Test + public void testExtraCommas() { + PortScanner portScanner = new PortScanner() + portScanner.setPortRange("2000-2001,, ,2003,") + List<Integer> ports = portScanner.remainingPortsToCheck + def expectedPorts = [2000, 2001, 2003] + assert ports == expectedPorts + } }