Repository: jclouds-labs Updated Branches: refs/heads/1.9.x df583b45e -> 42d2352c3
docker container ips: cherry-pick PR #284 * Copies latest NetworkSettings from master - to get networks() * Copies ContainerToNodeMetadata.getPrivateIpAddresses() - to get IPs from networks as well. * Copies ContainerParseTest, and an updated container.json (which tests networkSettings.networks) * Copies ContainerToNodeMetadataTest (which tests IPs from private networks) Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/42d2352c Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/42d2352c Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/42d2352c Branch: refs/heads/1.9.x Commit: 42d2352c3f2ce3e47005c3ce9db10d3d829e38ea Parents: df583b4 Author: Aled Sage <[email protected]> Authored: Mon Jun 13 20:03:49 2016 +0100 Committer: Andrea Turli <[email protected]> Committed: Tue Jun 14 11:11:48 2016 +0200 ---------------------------------------------------------------------- .../functions/ContainerToNodeMetadata.java | 20 +- .../jclouds/docker/domain/NetworkSettings.java | 205 ++++++++++++- .../functions/ContainerToNodeMetadataTest.java | 74 +++-- .../docker/config/DockerParserModuleTest.java | 69 ++++- .../docker/parse/ContainerParseTest.java | 48 ++- docker/src/test/resources/container.json | 300 +++++++++++-------- 6 files changed, 533 insertions(+), 183 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/42d2352c/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java ---------------------------------------------------------------------- diff --git a/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java b/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java index 53b70f1..c3b5831 100644 --- a/docker/src/main/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadata.java +++ b/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-labs/blob/42d2352c/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java ---------------------------------------------------------------------- diff --git a/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java b/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java index fee82f2..b8c1a83 100644 --- a/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java +++ b/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java @@ -16,39 +16,132 @@ */ package org.jclouds.docker.domain; -import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.docker.internal.NullSafeCopies.copyOf; import java.util.List; import java.util.Map; +import org.jclouds.docker.internal.NullSafeCopies; import org.jclouds.javax.annotation.Nullable; import org.jclouds.json.SerializedNames; import com.google.auto.value.AutoValue; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; @AutoValue public abstract class NetworkSettings { + + @AutoValue + public abstract static class Details { + + Details() {} // For AutoValue only! + + public abstract String endpoint(); + + public abstract String gateway(); + + public abstract String ipAddress(); + + public abstract int ipPrefixLen(); + + public abstract String ipv6Gateway(); + + public abstract String globalIPv6Address(); + + public abstract int globalIPv6PrefixLen(); + + public abstract String macAddress(); + + @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 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(); + } + } + + public abstract String bridge(); + + @Nullable public abstract String sandboxId(); + + public abstract boolean hairpinMode(); + + @Nullable public abstract String linkLocalIPv6Address(); + + public abstract int linkLocalIPv6PrefixLen(); + + @Nullable public abstract Map<String, List<Map<String, String>>> ports(); + + @Nullable public abstract String sandboxKey(); + + public abstract List<String> secondaryIPAddresses(); + + public abstract List<String> secondaryIPv6Addresses(); + + @Nullable public abstract String endpointId(); + + public abstract String gateway(); + + @Nullable public abstract String globalIPv6Address(); + + public abstract int globalIPv6PrefixLen(); + public abstract String ipAddress(); public abstract int ipPrefixLen(); - public abstract String gateway(); + @Nullable public abstract String ipv6Gateway(); - public abstract String bridge(); + @Nullable public abstract String macAddress(); - @Nullable public abstract String portMapping(); + public abstract Map<String, Details> networks(); - public abstract Map<String, List<Map<String, String>>> ports(); + @Nullable public abstract String portMapping(); NetworkSettings() { } - @SerializedNames({ "IPAddress", "IPPrefixLen", "Gateway", "Bridge", "PortMapping", "Ports" }) - public static NetworkSettings create(String ipAddress, int ipPrefixLen, String gateway, String bridge, - String portMapping, Map<String, List<Map<String, String>>> ports) { - return new AutoValue_NetworkSettings(ipAddress, ipPrefixLen, gateway, bridge, portMapping, copyOf(ports)); + @SerializedNames({ "Bridge", "SandboxID", "HairpinMode", "LinkLocalIPv6Address", + "LinkLocalIPv6PrefixLen", "Ports", "SandboxKey", "SecondaryIPAddresses", + "SecondaryIPv6Addresses", "EndpointID", "Gateway", "GlobalIPv6Address", + "GlobalIPv6PrefixLen", "IPAddress", "IPPrefixLen", "IPv6Gateway", + "MacAddress", "Networks", "PortMapping" }) + public static NetworkSettings create(String bridge, String sandboxId, boolean hairpinMode, String linkLocalIPv6Address, + int linkLocalIPv6PrefixLen, Map<String, List<Map<String, String>>> ports, String sandboxKey, List<String> secondaryIPAddresses, + List<String> secondaryIPv6Addresses, String endpointId, String gateway, String globalIPv6Address, + int globalIPv6PrefixLen, String ipAddress, int ipPrefixLen, String ipv6Gateway, + String macAddress, Map<String, Details> networks, String portMapping) { + return new AutoValue_NetworkSettings( + bridge, sandboxId, hairpinMode, linkLocalIPv6Address, + linkLocalIPv6PrefixLen, ports, sandboxKey, copyOf(secondaryIPAddresses), copyOf(secondaryIPv6Addresses), + endpointId, gateway, globalIPv6Address, globalIPv6PrefixLen, + ipAddress, ipPrefixLen, ipv6Gateway, + macAddress, copyOf(networks), portMapping); } public static Builder builder() { @@ -66,7 +159,20 @@ public abstract class NetworkSettings { private String gateway; private String bridge; private String portMapping; - private Map<String, List<Map<String, String>>> ports = ImmutableMap.of(); + private Map<String, List<Map<String, String>>> ports; + private String sandboxId; + private boolean hairpinMode; + private String linkLocalIPv6Address; + private int linkLocalIPv6PrefixLen; + private String sandboxKey; + private List<String> secondaryIPAddresses = Lists.newArrayList(); + private List<String> secondaryIPv6Addresses = Lists.newArrayList(); + private String endpointId; + private String globalIPv6Address; + private int globalIPv6PrefixLen; + private String ipv6Gateway; + private String macAddress; + private Map<String, Details> networks = Maps.newHashMap(); public Builder ipAddress(String ipAddress) { this.ipAddress = ipAddress; @@ -94,17 +200,88 @@ public abstract class NetworkSettings { } public Builder ports(Map<String, List<Map<String, String>>> ports) { - this.ports = ImmutableMap.copyOf(checkNotNull(ports, "ports")); + this.ports = NullSafeCopies.copyWithNullOf(ports); + return this; + } + + public Builder sandboxId(String sandboxId) { + this.sandboxId = sandboxId; + return this; + } + + public Builder hairpinMode(boolean hairpinMode) { + this.hairpinMode = hairpinMode; + return this; + } + + public Builder linkLocalIPv6Address(String linkLocalIPv6Address) { + this.linkLocalIPv6Address = linkLocalIPv6Address; + return this; + } + + public Builder linkLocalIPv6PrefixLen(int linkLocalIPv6PrefixLen) { + this.linkLocalIPv6PrefixLen = linkLocalIPv6PrefixLen; + return this; + } + + public Builder sandboxKey(String sandboxKey) { + this.sandboxKey = sandboxKey; + return this; + } + + public Builder secondaryIPAddresses(List<String> secondaryIPAddresses) { + this.secondaryIPAddresses = secondaryIPAddresses; + return this; + } + + public Builder secondaryIPv6Addresses(List<String> secondaryIPv6Addresses) { + this.secondaryIPv6Addresses = secondaryIPv6Addresses; + return this; + } + + public Builder endpointId(String endpointId) { + this.endpointId = endpointId; + return this; + } + + public Builder globalIPv6Address(String globalIPv6Address) { + this.globalIPv6Address = globalIPv6Address; + return this; + } + + public Builder globalIPv6PrefixLen(int globalIPv6PrefixLen) { + this.globalIPv6PrefixLen = globalIPv6PrefixLen; + return this; + } + + public Builder ipv6Gateway(String ipv6Gateway) { + this.ipv6Gateway = ipv6Gateway; + return this; + } + + public Builder macAddress(String macAddress) { + this.macAddress = macAddress; + return this; + } + + public Builder networks(Map<String, Details> networks) { + this.networks.putAll(networks); return this; } public NetworkSettings build() { - return NetworkSettings.create(ipAddress, ipPrefixLen, gateway, bridge, portMapping, ports); + return NetworkSettings.create(bridge, sandboxId, hairpinMode, linkLocalIPv6Address, linkLocalIPv6PrefixLen, ports, + sandboxKey, secondaryIPAddresses, secondaryIPv6Addresses, endpointId, gateway, + globalIPv6Address, globalIPv6PrefixLen, ipAddress, ipPrefixLen, ipv6Gateway, macAddress, networks, portMapping); } public Builder fromNetworkSettings(NetworkSettings in) { return this.ipAddress(in.ipAddress()).ipPrefixLen(in.ipPrefixLen()).gateway(in.gateway()).bridge(in.bridge()) - .portMapping(in.portMapping()).ports(in.ports()); + .portMapping(in.portMapping()).ports(in.ports()).sandboxId(in.sandboxId()).hairpinMode(in.hairpinMode()).linkLocalIPv6Address(in + .linkLocalIPv6Address()).linkLocalIPv6PrefixLen(in.linkLocalIPv6PrefixLen()).sandboxKey(in.sandboxKey()).secondaryIPAddresses(in + .secondaryIPAddresses()).secondaryIPv6Addresses(in.secondaryIPv6Addresses()).endpointId(in.endpointId()).globalIPv6Address(in + .globalIPv6Address()).globalIPv6PrefixLen(in.globalIPv6PrefixLen()).ipv6Gateway(in.ipv6Gateway()).macAddress(in.macAddress()) + .networks(in.networks()); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/42d2352c/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java b/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java index 8c9d7a3..1dc912c 100644 --- a/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java +++ b/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java @@ -16,10 +16,8 @@ */ package org.jclouds.docker.compute.functions; -import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; import static org.testng.Assert.assertEquals; import java.util.Arrays; @@ -48,7 +46,6 @@ import org.jclouds.providers.ProviderMetadata; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -127,7 +124,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); @@ -167,44 +164,57 @@ public class ContainerToNodeMetadataTest { } }; - function = new ContainerToNodeMetadata(providerMetadata, toPortableStatus(), namingConvention, images, locations, + function = new ContainerToNodeMetadata(providerMetadata, new StateToStatus(), namingConvention, images, locations, new LoginPortForContainer.LoginPortLookupChain(null)); } - private Function<State, NodeMetadata.Status> toPortableStatus() { - StateToStatus function = EasyMock.createMock(StateToStatus.class); - expect(function.apply(anyObject(State.class))).andReturn(NodeMetadata.Status.RUNNING); - replay(function); - return function; - } - public void testVirtualMachineToNodeMetadata() { - Container mockContainer = mockContainer(); - - NodeMetadata node = function.apply(mockContainer); - - verify(mockContainer); + NodeMetadata node = function.apply(container); assertEquals(node.getId(), "6d35806c1bd2b25cd92bba2d2c2c5169dc2156f53ab45c2b62d76e2d2fee14a9"); 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.getStatus(), NodeMetadata.Status.RUNNING); + assertEquals(node.getImageId(), "af0f59f1c19eef9471c3b8c8d587c39b8f130560b54f3766931b37d76d5de4b6"); + assertEquals(node.getPrivateAddresses(), ImmutableSet.of("172.17.0.2")); + assertEquals(node.getPublicAddresses(), ImmutableSet.of("127.0.0.1")); } - private Container mockContainer() { - Container mockContainer = EasyMock.createMock(Container.class); - - expect(mockContainer.id()).andReturn(container.id()); - expect(mockContainer.name()).andReturn(container.name()); - expect(mockContainer.config()).andReturn(container.config()).anyTimes(); - expect(mockContainer.networkSettings()).andReturn(container.networkSettings()).anyTimes(); - expect(mockContainer.node()).andReturn(container.node()).anyTimes(); - expect(mockContainer.state()).andReturn(container.state()); - expect(mockContainer.image()).andReturn(container.image()).anyTimes(); - replay(mockContainer); - - return mockContainer; + 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(); + + NodeMetadata node = function.apply(containerWithNetwork); + + // Only asserting network-related aspects; the rest is covered by testVirtualMachineToNodeMetadata + 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")); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/42d2352c/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java b/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java index 57659c5..33564ea 100644 --- a/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java +++ b/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java @@ -19,6 +19,9 @@ package org.jclouds.docker.config; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; +import java.util.List; +import java.util.Map; + import org.jclouds.docker.domain.Container; import org.jclouds.docker.domain.NetworkSettings; import org.jclouds.docker.domain.Port; @@ -53,8 +56,70 @@ public class DockerParserModuleTest { } public void networkSettings() { - String text = "{\"IPAddress\":\"XX.XX.206.98\",\"IPPrefixLen\":27,\"Gateway\":\"XX.XX.206.105\",\"Bridge\":\"public\",\"Ports\":{}}"; - NetworkSettings settings = NetworkSettings.create("XX.XX.206.98", 27, "XX.XX.206.105", "public", null, null); + String text = "{" + + "\"Bridge\":\"\"," + + "\"SandboxID\":\"3ef128b055eb9ef62a6a2c281d97a2dfde5f47947d490f1dd2a81612611d961f\"," + + "\"HairpinMode\":false," + + "\"LinkLocalIPv6Address\":\"\"," + + "\"LinkLocalIPv6PrefixLen\":0," + + "\"Ports\":{}," + + "\"SandboxKey\":\"/var/run/docker/netns/3ef128b055eb\"," + + "\"SecondaryIPAddresses\":[]," + + "\"SecondaryIPv6Addresses\":[]," + + "\"EndpointID\":\"9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6\"," + + "\"Gateway\":\"172.17.0.1\"," + + "\"GlobalIPv6Address\":\"\"," + + "\"GlobalIPv6PrefixLen\":0," + + "\"IPAddress\":\"172.17.0.2\"," + + "\"IPPrefixLen\":16," + + "\"IPv6Gateway\":\"\"," + + "\"MacAddress\":\"02:42:ac:11:00:02\"," + + "\"Networks\":{" + + "\"bridge\":{" + + "\"EndpointID\":\"9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6\"," + + "\"Gateway\":\"172.17.0.1\"," + + "\"IPAddress\":\"172.17.0.2\"," + + "\"IPPrefixLen\":16," + + "\"IPv6Gateway\":\"\"," + + "\"GlobalIPv6Address\":\"\"," + + "\"GlobalIPv6PrefixLen\":0," + + "\"MacAddress\":\"02:42:ac:11:00:02\"" + + "}" + + "}" + + "}"; + NetworkSettings settings = NetworkSettings.create( + "", // Bridge + "3ef128b055eb9ef62a6a2c281d97a2dfde5f47947d490f1dd2a81612611d961f", // SandboxID + false, // HairpinMode + "", // LinkLocalIPv6Address + 0, // LinkLocalIPv6PrefixLen + ImmutableMap.<String, List<Map<String, String>>> of(), // Ports + "/var/run/docker/netns/3ef128b055eb", // SandboxKey + null, // SecondaryIPAddresses + null, // SecondaryIPv6Addresses + "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6", // EndpointID + "172.17.0.1", // Gateway + "", // GlobalIPv6Address + 0, // GlobalIPv6PrefixLen + "172.17.0.2", // IPAddress + 16, // IPPrefixLen + "", // IPv6Gateway + "02:42:ac:11:00:02", // MacAddress + ImmutableMap.of( + "bridge", NetworkSettings.Details.create( + "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6", // EndpointID + "172.17.0.1", // Gateway + "172.17.0.2", // IPAddress + 16, // IPPrefixLen + "", // IPv6Gateway + "", // GlobalIPv6Address + 0, // GlobalIPv6PrefixLen + "02:42:ac:11:00:02" // MacAddress + ) + ), + null // PortMapping + ); + assertEquals(json.fromJson(text, NetworkSettings.class), settings); assertEquals(json.toJson(settings), text); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/42d2352c/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java index cf52d3c..b646af7 100644 --- a/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java +++ b/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java @@ -55,26 +55,54 @@ 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()) - .state(State.create(3939, true, 0, "2014-10-31T17:00:21.802008706Z", "0001-01-01T00:00:00Z", false, false)) + .state(State.create(10357, true, 0, "2015-11-10T09:33:21.68146124Z", "0001-01-01T00:00:00Z", false, false)) .image("57e570db16baba1e8c0d6f3c15868ddb400f64ff76ec948e65c3ca3f15fb3587") .networkSettings(NetworkSettings.builder() - .ipAddress("172.17.0.7") + .sandboxId("3ef128b055eb9ef62a6a2c281d97a2dfde5f47947d490f1dd2a81612611d961f") + .hairpinMode(false) + .linkLocalIPv6Address("") + .linkLocalIPv6PrefixLen(0) + .globalIPv6Address("") + .globalIPv6PrefixLen(0) + .ipv6Gateway("") + .sandboxKey("/var/run/docker/netns/3ef128b055eb") + .endpointId("9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6") + .ipAddress("172.17.0.2") .ipPrefixLen(16) - .gateway("172.17.42.1") - .bridge("docker0") - .ports(ImmutableMap.<String, List<Map<String, String>>>of( - "6783/tcp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "0.0.0.0", "HostPort", "6783")), - "6783/udp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "0.0.0.0", "HostPort", "6783"))) - ) + .gateway("172.17.0.1") + .bridge("") + .ports(ImmutableMap.<String, List<Map<String, String>>>of()) + .macAddress("02:42:ac:11:00:02") + .networks(ImmutableMap.of( + "JCLOUDS_NETWORK", NetworkSettings.Details.create( + "04268fbb4dc368b5a53bb1c3f89294a4f0c72095deb944db3c4efc6d6a439304", + "172.19.0.1", + "172.19.0.2", + 16, + "", + "", + 0, + "02:42:ac:13:00:02" + ), + "bridge", NetworkSettings.Details.create( + "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6", + "172.17.0.1", + "172.17.0.2", + 16, + "", + "", + 0, + "02:42:ac:11:00:02" + ) + )) .build()) .resolvConfPath("/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/resolv.conf") .hostConfig(HostConfig.builder() http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/42d2352c/docker/src/test/resources/container.json ---------------------------------------------------------------------- diff --git a/docker/src/test/resources/container.json b/docker/src/test/resources/container.json index 7dccd1b..e48573f 100644 --- a/docker/src/test/resources/container.json +++ b/docker/src/test/resources/container.json @@ -1,132 +1,184 @@ +// 20160613195536 +// https://raw.githubusercontent.com/jclouds/jclouds-labs/master/docker/src/test/resources/container.json + { - "Args": [ - "-iface", - "ethwe", - "-wait", - "5", - "-name", - "7a:63:a2:39:7b:0f" + "Args": [ + "-iface", + "ethwe", + "-wait", + "5", + "-name", + "7a:63:a2:39:7b:0f" + ], + "Config": { + "AttachStderr": false, + "AttachStdin": false, + "AttachStdout": false, + "Cmd": [ + "-name", + "7a:63:a2:39:7b:0f" ], - "Config": { - "AttachStderr": false, - "AttachStdin": false, - "AttachStdout": false, - "Cmd": [ - "-name", - "7a:63:a2:39:7b:0f" - ], - "CpuShares": 0, - "Cpuset": "", - "Domainname": "", - "Entrypoint": [ - "/home/weave/weaver", - "-iface", - "ethwe", - "-wait", - "5" - ], - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - ], - "ExposedPorts": { - "6783/tcp": {}, - "6783/udp": {} - }, - "Hostname": "6c9932f478bd", - "Image": "zettio/weave", - "Memory": 0, - "MemorySwap": 0, - "NetworkDisabled": false, - "OnBuild": null, - "OpenStdin": false, - "PortSpecs": null, - "SecurityOpt": null, - "StdinOnce": false, - "Tty": false, - "User": "", - "Volumes": null, - "WorkingDir": "/home/weave" - }, - "Created": "2014-10-31T17:00:21.544197943Z", - "Driver": "aufs", - "ExecDriver": "native-0.2", - "HostConfig": { - "Binds": null, - "CapAdd": null, - "CapDrop": null, - "ContainerIDFile": "", - "Devices": [], - "Dns": [ "8.8.8.8", "8.8.4.4" ], - "DnsSearch": null, - "ExtraHosts": [ "extra:169.254.0.1" ], - "Links": null, - "LxcConf": [], - "NetworkMode": "bridge", - "PortBindings": { - "6783/tcp": [ - { - "HostIp": "", - "HostPort": "6783" - } - ], - "6783/udp": [ - { - "HostIp": "", - "HostPort": "6783" - } - ] - }, - "Privileged": true, - "PublishAllPorts": false, - "RestartPolicy": { - "MaximumRetryCount": 0, - "Name": "" - }, - "VolumesFrom": null + "CpuShares": 0, + "Cpuset": "", + "Domainname": "", + "Entrypoint": [ + "/home/weave/weaver", + "-iface", + "ethwe", + "-wait", + "5" + ], + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "ExposedPorts": { + "6783/tcp": { + + }, + "6783/udp": { + + } }, - "HostnamePath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hostname", - "HostsPath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hosts", - "Id": "6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524", - "Image": "57e570db16baba1e8c0d6f3c15868ddb400f64ff76ec948e65c3ca3f15fb3587", - "MountLabel": "", - "Name": "/weave", - "NetworkSettings": { - "Bridge": "docker0", - "Gateway": "172.17.42.1", - "IPAddress": "172.17.0.7", - "IPPrefixLen": 16, - "MacAddress": "02:42:ac:11:00:07", - "PortMapping": null, - "Ports": { - "6783/tcp": [ - { - "HostIp": "0.0.0.0", - "HostPort": "6783" - } - ], - "6783/udp": [ - { - "HostIp": "0.0.0.0", - "HostPort": "6783" - } - ] + "Hostname": "6c9932f478bd", + "Image": "zettio/weave", + "Memory": 0, + "MemorySwap": 0, + "NetworkDisabled": false, + "OnBuild": null, + "OpenStdin": false, + "PortSpecs": null, + "SecurityOpts": null, + "StdinOnce": false, + "Tty": false, + "User": "", + "Volumes": null, + "WorkingDir": "/home/weave" + }, + "Created": "2014-10-31T17:00:21.544197943Z", + "Driver": "aufs", + "ExecDriver": "native-0.2", + "HostConfig": { + "Binds": null, + "CapAdd": [ + "NET_ADMIN" + ], + "CapDrop": [ + "MKNOD" + ], + "ContainerIDFile": "", + "Devices": [ + + ], + "Dns": [ + "8.8.8.8", + "8.8.4.4" + ], + "DnsSearch": null, + "ExtraHosts": [ + "extra:169.254.0.1" + ], + "Links": null, + "LxcConf": [ + + ], + "NetworkMode": "bridge", + "PortBindings": { + "6783/tcp": [ + { + "HostIp": "", + "HostPort": "6783" } + ], + "6783/udp": [ + { + "HostIp": "", + "HostPort": "6783" + } + ] }, - "Node": { - "IP": "10.10.10.10" + "Privileged": true, + "PublishAllPorts": false, + "RestartPolicy": { + "MaximumRetryCount": 0, + "Name": "" }, - "Path": "/home/weave/weaver", - "ProcessLabel": "", - "ResolvConfPath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/resolv.conf", - "State": { - "ExitCode": 0, - "FinishedAt": "0001-01-01T00:00:00Z", - "Paused": false, - "Pid": 3939, - "Restarting": false, - "Running": true, - "StartedAt": "2014-10-31T17:00:21.802008706Z" + "VolumesFrom": null + }, + "HostnamePath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hostname", + "HostsPath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hosts", + "Id": "6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524", + "Image": "57e570db16baba1e8c0d6f3c15868ddb400f64ff76ec948e65c3ca3f15fb3587", + "MountLabel": "", + "Name": "/weave", + "NetworkSettings": { + "Bridge": "", + "SandboxID": "3ef128b055eb9ef62a6a2c281d97a2dfde5f47947d490f1dd2a81612611d961f", + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "Ports": { + }, - "Volumes": {}, - "VolumesRW": {} + "SandboxKey": "/var/run/docker/netns/3ef128b055eb", + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6", + "Gateway": "172.17.0.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "MacAddress": "02:42:ac:11:00:02", + "Networks": { + "JCLOUDS_NETWORK": { + "EndpointID": "04268fbb4dc368b5a53bb1c3f89294a4f0c72095deb944db3c4efc6d6a439304", + "Gateway": "172.19.0.1", + "IPAddress": "172.19.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "MacAddress": "02:42:ac:13:00:02" + }, + "bridge": { + "EndpointID": "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "MacAddress": "02:42:ac:11:00:02" + } + } + }, + "Node": { + "IP": "10.10.10.10" + }, + "Path": "/home/weave/weaver", + "ProcessLabel": "", + "ResolvConfPath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/resolv.conf", + "SecurityOpt": [ + + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 10357, + "ExitCode": 0, + "Error": "", + "StartedAt": "2015-11-10T09:33:21.68146124Z", + "FinishedAt": "0001-01-01T00:00:00Z" + }, + "Volumes": { + + }, + "VolumesRW": { + + } } \ No newline at end of file
