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 2014/04/11 20:36:20 UTC

git commit: JCLOUDS-528: Ability to control interfaces to test for SocketFinder

Repository: jclouds
Updated Branches:
  refs/heads/master 84e0b9117 -> b5218e0ce


JCLOUDS-528: Ability to control interfaces to test for SocketFinder


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/b5218e0c
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/b5218e0c
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/b5218e0c

Branch: refs/heads/master
Commit: b5218e0ce6351a9655bff3b59f83b53c6f5b8ab1
Parents: 84e0b91
Author: ashley-taylor <as...@sli-systems.com>
Authored: Wed Apr 9 14:17:38 2014 +1200
Committer: Andrew Phillips <an...@apache.org>
Committed: Fri Apr 11 14:35:17 2014 -0400

----------------------------------------------------------------------
 .../config/ComputeServiceProperties.java        |  5 ++
 .../util/ConcurrentOpenSocketFinder.java        | 42 ++++++++++++++---
 .../util/ConcurrentOpenSocketFinderTest.java    | 49 ++++++++++++++++----
 3 files changed, 81 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/b5218e0c/compute/src/main/java/org/jclouds/compute/config/ComputeServiceProperties.java
----------------------------------------------------------------------
diff --git a/compute/src/main/java/org/jclouds/compute/config/ComputeServiceProperties.java b/compute/src/main/java/org/jclouds/compute/config/ComputeServiceProperties.java
index 4d982da..f294edc 100644
--- a/compute/src/main/java/org/jclouds/compute/config/ComputeServiceProperties.java
+++ b/compute/src/main/java/org/jclouds/compute/config/ComputeServiceProperties.java
@@ -108,4 +108,9 @@ public interface ComputeServiceProperties {
     */
    public static final String OS_VERSION_MAP_JSON = "jclouds.compute.os-version-map-json";
 
+   /**
+    * can be set to either PRIVATE, PUBLIC, ALL (default) controls what interfaces will be used when scanning for an open connection
+    */
+   public static final String SOCKET_FINDER_ALLOWED_INTERFACES = "jclouds.compute.socket-finder-allowed-interfaces";
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/b5218e0c/compute/src/main/java/org/jclouds/compute/util/ConcurrentOpenSocketFinder.java
----------------------------------------------------------------------
diff --git a/compute/src/main/java/org/jclouds/compute/util/ConcurrentOpenSocketFinder.java b/compute/src/main/java/org/jclouds/compute/util/ConcurrentOpenSocketFinder.java
index 5134585..e8ea9e52 100644
--- a/compute/src/main/java/org/jclouds/compute/util/ConcurrentOpenSocketFinder.java
+++ b/compute/src/main/java/org/jclouds/compute/util/ConcurrentOpenSocketFinder.java
@@ -19,13 +19,12 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.base.Predicates.or;
 import static com.google.common.base.Throwables.propagate;
-import static com.google.common.collect.Iterables.concat;
-import static com.google.common.collect.Iterables.size;
 import static com.google.common.util.concurrent.Atomics.newReference;
 import static com.google.common.util.concurrent.MoreExecutors.listeningDecorator;
 import static java.lang.String.format;
 import static org.jclouds.Constants.PROPERTY_USER_THREADS;
 import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
+import static org.jclouds.compute.config.ComputeServiceProperties.SOCKET_FINDER_ALLOWED_INTERFACES;
 import static org.jclouds.util.Predicates2.retry;
 
 import java.util.NoSuchElementException;
@@ -64,6 +63,10 @@ public class ConcurrentOpenSocketFinder implements OpenSocketFinder {
    private final Predicate<AtomicReference<NodeMetadata>> nodeRunning;
    private final ListeningExecutorService userExecutor;
 
+   @Inject(optional = true)
+   @Named(SOCKET_FINDER_ALLOWED_INTERFACES)
+   private AllowedInterfaces allowedInterfaces = AllowedInterfaces.ALL;
+
    @Inject
    @VisibleForTesting
    ConcurrentOpenSocketFinder(SocketOpen socketTester,
@@ -76,7 +79,7 @@ public class ConcurrentOpenSocketFinder implements OpenSocketFinder {
 
    @Override
    public HostAndPort findOpenSocketOnNode(NodeMetadata node, final int port, long timeout, TimeUnit timeUnits) {
-      ImmutableSet<HostAndPort> sockets = checkNodeHasIps(node).transform(new Function<String, HostAndPort>() {
+      ImmutableSet<HostAndPort> sockets = checkNodeHasIps(node, allowedInterfaces).transform(new Function<String, HostAndPort>() {
 
          @Override
          public HostAndPort apply(String from) {
@@ -175,10 +178,18 @@ public class ConcurrentOpenSocketFinder implements OpenSocketFinder {
       };
    }
 
-   private static FluentIterable<String> checkNodeHasIps(NodeMetadata node) {
-      FluentIterable<String> ips = FluentIterable.from(concat(node.getPublicAddresses(), node.getPrivateAddresses()));
-      checkState(size(ips) > 0, "node does not have IP addresses configured: " + node);
-      return ips;
+   @VisibleForTesting
+   static FluentIterable<String> checkNodeHasIps(NodeMetadata node, AllowedInterfaces allowedInterfaces) {
+      ImmutableSet.Builder<String> ipsBuilder = ImmutableSet.builder();
+      if (allowedInterfaces.scanPublic) {
+         ipsBuilder.addAll(node.getPublicAddresses());
+      }
+      if (allowedInterfaces.scanPrivate) {
+         ipsBuilder.addAll(node.getPrivateAddresses());
+      }
+      ImmutableSet<String> ips = ipsBuilder.build();
+      checkState(!ips.isEmpty(), "node does not have IP addresses configured: %s", node);
+      return FluentIterable.from(ips);
    }
 
    private static void blockOn(Iterable<ListenableFuture<?>> immutableList) {
@@ -191,4 +202,21 @@ public class ConcurrentOpenSocketFinder implements OpenSocketFinder {
          throw propagate(e);
       }
    }
+
+   @VisibleForTesting
+   enum AllowedInterfaces {
+      ALL(true, true),
+      PUBLIC(true, false),
+      PRIVATE(false, true);
+
+      private final boolean scanPublic;
+      private final boolean scanPrivate;
+
+      private AllowedInterfaces(boolean scanPublic, boolean scanPrivate) {
+         this.scanPublic = scanPublic;
+         this.scanPrivate = scanPrivate;
+      }
+
+   }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/b5218e0c/compute/src/test/java/org/jclouds/compute/util/ConcurrentOpenSocketFinderTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/util/ConcurrentOpenSocketFinderTest.java b/compute/src/test/java/org/jclouds/compute/util/ConcurrentOpenSocketFinderTest.java
index f00c153..1b6fc59 100644
--- a/compute/src/test/java/org/jclouds/compute/util/ConcurrentOpenSocketFinderTest.java
+++ b/compute/src/test/java/org/jclouds/compute/util/ConcurrentOpenSocketFinderTest.java
@@ -26,6 +26,7 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.jclouds.compute.domain.NodeMetadata.Status.RUNNING;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.fail;
 
 import java.util.Map;
@@ -36,6 +37,7 @@ import java.util.concurrent.atomic.AtomicReference;
 
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.NodeMetadataBuilder;
+import org.jclouds.compute.util.ConcurrentOpenSocketFinder.AllowedInterfaces;
 import org.jclouds.predicates.SocketOpen;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -43,6 +45,7 @@ import org.testng.annotations.Test;
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Stopwatch;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.net.HostAndPort;
@@ -57,10 +60,13 @@ public class ConcurrentOpenSocketFinderTest {
    private static final long SLOW_GRACE = 700;
    private static final long EARLY_GRACE = 10;
 
+   private static final String PUBLIC_IP = "1.2.3.4";
+   private static final String PRIVATE_IP = "1.2.3.5";
+
    private final NodeMetadata node = new NodeMetadataBuilder().id("myid")
                                                               .status(RUNNING)
-                                                              .publicAddresses(ImmutableSet.of("1.2.3.4"))
-                                                              .privateAddresses(ImmutableSet.of("1.2.3.5")).build();
+                                                              .publicAddresses(ImmutableSet.of(PUBLIC_IP))
+                                                              .privateAddresses(ImmutableSet.of(PRIVATE_IP)).build();
 
    private final SocketOpen socketAlwaysClosed = new SocketOpen() {
       @Override
@@ -68,7 +74,12 @@ public class ConcurrentOpenSocketFinderTest {
          return false;
       }
    };
-
+   private final SocketOpen socketAlwaysOpen = new SocketOpen() {
+      @Override
+      public boolean apply(HostAndPort input) {
+         return true;
+      }
+   };
    private final Predicate<AtomicReference<NodeMetadata>> nodeRunning = alwaysTrue();
    private final Predicate<AtomicReference<NodeMetadata>> nodeNotRunning = alwaysFalse();
 
@@ -110,27 +121,27 @@ public class ConcurrentOpenSocketFinderTest {
       SocketOpen secondSocketOpen = new SocketOpen() {
          @Override
          public boolean apply(HostAndPort input) {
-            return HostAndPort.fromParts("1.2.3.5", 22).equals(input);
+            return HostAndPort.fromParts(PRIVATE_IP, 22).equals(input);
          }
       };
 
       OpenSocketFinder finder = new ConcurrentOpenSocketFinder(secondSocketOpen, nodeRunning, userExecutor);
 
       HostAndPort result = finder.findOpenSocketOnNode(node, 22, 2000, MILLISECONDS);
-      assertEquals(result, HostAndPort.fromParts("1.2.3.5", 22));
+      assertEquals(result, HostAndPort.fromParts(PRIVATE_IP, 22));
 
    }
 
    @Test
    public void testChecksSocketsConcurrently() throws Exception {
       ControllableSocketOpen socketTester = new ControllableSocketOpen(ImmutableMap.of(
-            HostAndPort.fromParts("1.2.3.4", 22), new SlowCallable<Boolean>(true, 1500),
-            HostAndPort.fromParts("1.2.3.5", 22), new SlowCallable<Boolean>(true, 1000)));
+            HostAndPort.fromParts(PUBLIC_IP, 22), new SlowCallable<Boolean>(true, 1500),
+            HostAndPort.fromParts(PRIVATE_IP, 22), new SlowCallable<Boolean>(true, 1000)));
 
       OpenSocketFinder finder = new ConcurrentOpenSocketFinder(socketTester, nodeRunning, userExecutor);
 
       HostAndPort result = finder.findOpenSocketOnNode(node, 22, 2000, MILLISECONDS);
-      assertEquals(result, HostAndPort.fromParts("1.2.3.5", 22));
+      assertEquals(result, HostAndPort.fromParts(PRIVATE_IP, 22));
    }
 
    @Test
@@ -164,6 +175,28 @@ public class ConcurrentOpenSocketFinderTest {
       }
    }
 
+
+   @Test
+   public void testSocketFinderAllowedInterfacesAll() throws Exception {
+      FluentIterable<String> ips = ConcurrentOpenSocketFinder.checkNodeHasIps(node, AllowedInterfaces.ALL);
+      assertTrue(ips.contains(PUBLIC_IP));
+      assertTrue(ips.contains(PRIVATE_IP));
+   }
+
+   @Test
+   public void testSocketFinderAllowedInterfacesPrivate() throws Exception {
+      FluentIterable<String> ips = ConcurrentOpenSocketFinder.checkNodeHasIps(node, AllowedInterfaces.PRIVATE);
+      assertFalse(ips.contains(PUBLIC_IP));
+      assertTrue(ips.contains(PRIVATE_IP));
+   }
+
+   @Test
+   public void testSocketFinderAllowedInterfacesPublic() throws Exception {
+      FluentIterable<String> ips = ConcurrentOpenSocketFinder.checkNodeHasIps(node, AllowedInterfaces.PUBLIC);
+      assertTrue(ips.contains(PUBLIC_IP));
+      assertFalse(ips.contains(PRIVATE_IP));
+   }
+
    private static class SlowCallable<T> implements Callable<T> {
       private final T result;
       private final long delay;