You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2016/08/30 09:36:02 UTC

[38/50] jclouds git commit: docker: get container’s IPs from all networks

docker: get container\u2019s IPs from all networks


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

Branch: refs/heads/master
Commit: fc88756d5a29052a1cc42b260225b3827f2b5f16
Parents: 91339b2
Author: Aled Sage <al...@gmail.com>
Authored: Mon Jun 13 14:03:26 2016 +0100
Committer: Andrea Turli <an...@gmail.com>
Committed: Mon Jun 13 17:17:56 2016 +0200

----------------------------------------------------------------------
 .../functions/ContainerToNodeMetadata.java      | 20 ++++++-
 .../jclouds/docker/domain/NetworkSettings.java  | 28 +++++++++-
 .../functions/ContainerToNodeMetadataTest.java  | 55 ++++++++++++++++++--
 .../docker/parse/ContainerParseTest.java        |  3 +-
 4 files changed, 97 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/fc88756d/apis/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/apis/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java b/apis/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java
index 53b70f1..c3b5831 100644
--- a/apis/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java
+++ b/apis/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java
@@ -31,6 +31,7 @@ import org.jclouds.compute.domain.NodeMetadataBuilder;
 import org.jclouds.compute.domain.Processor;
 import org.jclouds.compute.functions.GroupNamingConvention;
 import org.jclouds.docker.domain.Container;
+import org.jclouds.docker.domain.NetworkSettings;
 import org.jclouds.docker.domain.State;
 import org.jclouds.domain.Location;
 import org.jclouds.providers.ProviderMetadata;
@@ -38,6 +39,7 @@ import org.jclouds.providers.ProviderMetadata;
 import com.google.common.base.Function;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.inject.Singleton;
 
@@ -106,8 +108,24 @@ public class ContainerToNodeMetadata implements Function<Container, NodeMetadata
    }
 
    private Iterable<String> getPrivateIpAddresses(Container container) {
+      // A container can be attached to multiple networks. It can therefore have multiple private
+      // IPs. The NetworkSettings.ipAddress might in fact be blank, with the only IP being on
+      // network objects.
       if (container.networkSettings() == null) return ImmutableList.of();
-      return ImmutableList.of(container.networkSettings().ipAddress());
+      ImmutableSet.Builder<String> builder = ImmutableSet.<String>builder();
+      NetworkSettings settings = container.networkSettings();
+      if (settings.ipAddress() != null && settings.ipAddress().length() > 0) {
+         builder.add(settings.ipAddress());
+      }
+      if (settings.networks() != null) {
+         for (Map.Entry<String, NetworkSettings.Details> entry : settings.networks().entrySet()) {
+            String ipAddress = entry.getValue().ipAddress();
+            if (ipAddress != null && ipAddress.length() > 0) {
+               builder.add(ipAddress);
+            }
+         }
+      }
+      return builder.build();
    }
 
    private List<String> getPublicIpAddresses(Container container) {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/fc88756d/apis/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
----------------------------------------------------------------------
diff --git a/apis/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java b/apis/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
index 2217992..b8c1a83 100644
--- a/apis/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
+++ b/apis/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
@@ -56,8 +56,32 @@ public abstract class NetworkSettings {
       @SerializedNames({ "EndpointID", "Gateway", "IPAddress", "IPPrefixLen", "IPv6Gateway", "GlobalIPv6Address", "GlobalIPv6PrefixLen", "MacAddress" })
       public static Details create(String endpointId, String gateway, String ipAddress, int ipPrefixLen, String ipv6Gateway, String globalIPv6Address,
                                    int globalIPv6PrefixLen, String macAddress) {
-         return new AutoValue_NetworkSettings_Details(endpointId, gateway, ipAddress, ipPrefixLen, ipv6Gateway, globalIPv6Address, globalIPv6PrefixLen,
-                 macAddress);
+         return builder().endpoint(endpointId).gateway(gateway).ipAddress(ipAddress).ipPrefixLen(ipPrefixLen)
+               .ipv6Gateway(ipv6Gateway).globalIPv6Address(globalIPv6Address)
+               .globalIPv6PrefixLen(globalIPv6PrefixLen).macAddress(macAddress)
+               .build();
+      }
+      
+      public Builder toBuilder() {
+         return new AutoValue_NetworkSettings_Details.Builder(this);
+      }
+
+      public static Builder builder() {
+         return new AutoValue_NetworkSettings_Details.Builder();
+      }
+
+      @AutoValue.Builder
+      public abstract static class Builder {
+         public abstract Builder endpoint(String value);
+         public abstract Builder gateway(String value);
+         public abstract Builder ipAddress(String value);
+         public abstract Builder ipPrefixLen(int value);
+         public abstract Builder ipv6Gateway(String value);
+         public abstract Builder globalIPv6Address(String value);
+         public abstract Builder globalIPv6PrefixLen(int value);
+         public abstract Builder macAddress(String value);
+
+         public abstract Details build();
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/fc88756d/apis/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/apis/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java b/apis/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java
index 7588174..c439e47 100644
--- a/apis/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java
+++ b/apis/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java
@@ -131,7 +131,7 @@ public class ContainerToNodeMetadataTest {
               .node(null)
               .build();
       ProviderMetadata providerMetadata = EasyMock.createMock(ProviderMetadata.class);
-      expect(providerMetadata.getEndpoint()).andReturn("http://127.0.0.1:4243");
+      expect(providerMetadata.getEndpoint()).andReturn("http://127.0.0.1:4243").atLeastOnce();
       replay(providerMetadata);
 
       GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
@@ -177,7 +177,7 @@ public class ContainerToNodeMetadataTest {
 
    private Function<State, NodeMetadata.Status> toPortableStatus() {
       StateToStatus function = EasyMock.createMock(StateToStatus.class);
-         expect(function.apply(anyObject(State.class))).andReturn(NodeMetadata.Status.RUNNING);
+         expect(function.apply(anyObject(State.class))).andReturn(NodeMetadata.Status.RUNNING).atLeastOnce();
          replay(function);
          return function;
    }
@@ -193,11 +193,58 @@ public class ContainerToNodeMetadataTest {
       assertEquals(node.getGroup(), "hopeful_mclean");
       assertEquals(node.getImageId(), "af0f59f1c19eef9471c3b8c8d587c39b8f130560b54f3766931b37d76d5de4b6");
       assertEquals(node.getLoginPort(), 49199);
-      assertEquals(node.getPrivateAddresses().size(), 1);
-      assertEquals(node.getPublicAddresses().size(), 1);
+      assertEquals(node.getPrivateAddresses(), ImmutableSet.of("172.17.0.2"));
+      assertEquals(node.getPublicAddresses(), ImmutableSet.of("127.0.0.1"));
+   }
+
+   public void testVirtualMachineWithNetworksToNodeMetadata() {
+      // Example networks taken from container.json
+      Container containerWithNetwork = container.toBuilder()
+            .networkSettings(container.networkSettings().toBuilder()
+                    .networks(ImmutableMap.<String, NetworkSettings.Details>builder()
+                          .put("JCLOUDS_NETWORK", NetworkSettings.Details.builder()
+                                   .endpoint("1a10519f808faf1181cfdf3d1d6dd93e19ede2d1c8fed82562a4c17c297c4db3")
+                                   .gateway("172.19.0.1")
+                                   .ipAddress("172.19.0.2")
+                                   .ipPrefixLen(16)
+                                   .ipv6Gateway("")
+                                   .globalIPv6Address("")
+                                   .globalIPv6PrefixLen(0)
+                                   .macAddress("02:42:ac:13:00:02")
+                                   .build())
+                          .put("bridge", NetworkSettings.Details.builder()
+                                .endpoint("9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6")
+                                .gateway("172.17.0.1")
+                                .ipAddress("172.17.0.2")
+                                .ipPrefixLen(16)
+                                .ipv6Gateway("")
+                                .globalIPv6Address("")
+                                .globalIPv6PrefixLen(0)
+                                .macAddress("02:42:ac:11:00:02")
+                                .build())
+                          .build())
+                    .build())
+            .build();
+
+      Container mockContainer = mockContainer(containerWithNetwork);
+
+      NodeMetadata node = function.apply(mockContainer);
+
+      verify(mockContainer);
+
+      assertEquals(node.getId(), "6d35806c1bd2b25cd92bba2d2c2c5169dc2156f53ab45c2b62d76e2d2fee14a9");
+      assertEquals(node.getGroup(), "hopeful_mclean");
+      assertEquals(node.getImageId(), "af0f59f1c19eef9471c3b8c8d587c39b8f130560b54f3766931b37d76d5de4b6");
+      assertEquals(node.getLoginPort(), 49199);
+      assertEquals(node.getPrivateAddresses(), ImmutableSet.of("172.17.0.2", "172.19.0.2"));
+      assertEquals(node.getPublicAddresses(), ImmutableSet.of("127.0.0.1"));
    }
 
    private Container mockContainer() {
+      return mockContainer(container);
+   }
+   
+   private Container mockContainer(Container container) {
       Container mockContainer = EasyMock.createMock(Container.class);
 
       expect(mockContainer.id()).andReturn(container.id());

http://git-wip-us.apache.org/repos/asf/jclouds/blob/fc88756d/apis/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
----------------------------------------------------------------------
diff --git a/apis/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java b/apis/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
index 884733e..291fa13 100644
--- a/apis/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
+++ b/apis/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
@@ -55,12 +55,11 @@ public class ContainerParseTest extends BaseDockerParseTest<Container> {
               .config(Config.builder()
                       .hostname("6c9932f478bd")
                       .env(ImmutableList.of("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"))
-                      .image("57e570db16baba1e8c0d6f3c15868ddb400f64ff76ec948e65c3ca3f15fb3587")
+                      .image("zettio/weave")
                       .domainname("")
                       .user("")
                       .cmd(ImmutableList.of("-name", "7a:63:a2:39:7b:0f"))
                       .entrypoint(ImmutableList.of("/home/weave/weaver", "-iface", "ethwe", "-wait", "5"))
-                      .image("zettio/weave")
                       .workingDir("/home/weave")
                       .exposedPorts(ImmutableMap.of("6783/tcp", ImmutableMap.of(), "6783/udp", ImmutableMap.of()))
                       .build())