docker: get containerâs 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 <[email protected]> Authored: Mon Jun 13 14:03:26 2016 +0100 Committer: Andrea Turli <[email protected]> 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())
