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
+  }
 }

Reply via email to