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/05/26 10:19:23 UTC
[2/2] jclouds-labs git commit: [JCLOUDS-1118] fix configuration
options location; mark some fields Nullable
[JCLOUDS-1118] fix configuration options location; mark some fields Nullable
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/6d078e69
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/6d078e69
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/6d078e69
Branch: refs/heads/master
Commit: 6d078e6900be92b93babfc640a90cd61bf3129e2
Parents: c269e01
Author: Josef Cacek <jc...@redhat.com>
Authored: Tue May 24 14:51:45 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Thu May 26 12:07:39 2016 +0200
----------------------------------------------------------------------
.../java/org/jclouds/docker/domain/Config.java | 120 +--------
.../org/jclouds/docker/domain/HostConfig.java | 50 +++-
.../java/org/jclouds/docker/domain/Info.java | 4 +-
.../jclouds/docker/domain/NetworkSettings.java | 8 +-
.../org/jclouds/docker/domain/ConfigTest.java | 3 -
.../docker/features/ContainerApiLiveTest.java | 5 +-
.../docker/parse/ContainerParseTest.java | 3 +
.../parse/ContainerVersionMajor1Minor21.java | 263 +++++++++++++++++++
.../jclouds/docker/parse/Info2ParseTest.java | 72 +++++
.../test/resources/container-1.21-create.json | 72 +++++
.../test/resources/container-1.21-inspect.json | 147 +++++++++++
docker/src/test/resources/container.json | 7 +-
docker/src/test/resources/info2.json | 90 +++++++
13 files changed, 712 insertions(+), 132 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/main/java/org/jclouds/docker/domain/Config.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/Config.java b/docker/src/main/java/org/jclouds/docker/domain/Config.java
index fbe07ca..58658de 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/Config.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/Config.java
@@ -23,6 +23,7 @@ import static org.jclouds.docker.internal.NullSafeCopies.copyWithNullOf;
import java.util.List;
import java.util.Map;
+import org.jclouds.docker.domain.HostConfig.Builder;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.json.SerializedNames;
@@ -76,30 +77,6 @@ public abstract class Config {
@Nullable public abstract HostConfig hostConfig();
- @Nullable public abstract List<String> binds();
-
- @Nullable public abstract List<String> links();
-
- public abstract List<Map<String, String>> lxcConf();
-
- public abstract Map<String, List<Map<String, String>>> portBindings();
-
- public abstract boolean publishAllPorts();
-
- public abstract boolean privileged();
-
- @Nullable public abstract List<String> dns();
-
- @Nullable public abstract List<String> dnsSearch();
-
- @Nullable public abstract List<String> volumesFrom();
-
- @Nullable public abstract List<String> capAdd();
-
- @Nullable public abstract List<String> capDrop();
-
- public abstract Map<String, String> restartPolicy();
-
Config() {
}
@@ -107,24 +84,17 @@ public abstract class Config {
{
"Hostname", "Domainname", "User", "Memory", "MemorySwap", "CpuShares", "AttachStdin", "AttachStdout",
"AttachStderr", "Tty", "OpenStdin", "StdinOnce", "Env", "Cmd", "Entrypoint", "Image", "Volumes",
- "WorkingDir", "NetworkDisabled", "ExposedPorts", "SecurityOpts", "HostConfig", "Binds", "Links",
- "LxcConf", "PortBindings", "PublishAllPorts", "Privileged", "Dns", "DnsSearch", "VolumesFrom",
- "CapAdd", "CapDrop", "RestartPolicy"
+ "WorkingDir", "NetworkDisabled", "ExposedPorts", "SecurityOpts", "HostConfig"
})
public static Config create(String hostname, String domainname, String user, int memory, int memorySwap,
int cpuShares, boolean attachStdin, boolean attachStdout, boolean attachStderr, boolean tty,
boolean openStdin, boolean stdinOnce, List<String> env, List<String> cmd, List<String> entrypoint,
String image, Map<String, ?> volumes, String workingDir, boolean networkDisabled,
- Map<String, ?> exposedPorts, List<String> securityOpts, HostConfig hostConfig, List<String> binds,
- List<String> links, List<Map<String, String>> lxcConf, Map<String, List<Map<String, String>>> portBindings,
- boolean publishAllPorts, boolean privileged, List<String> dns, List<String> dnsSearch, List<String> volumesFrom,
- List<String> capAdd, List<String> capDrop, Map<String, String> restartPolicy) {
+ Map<String, ?> exposedPorts, List<String> securityOpts, HostConfig hostConfig) {
return new AutoValue_Config(hostname, domainname, user, memory, memorySwap, cpuShares, attachStdin,
attachStdout, attachStderr, tty, openStdin, stdinOnce, copyWithNullOf(env), copyWithNullOf(cmd),
copyWithNullOf(entrypoint), image, copyWithNullOf(volumes), workingDir, networkDisabled,
- copyOf(exposedPorts), copyOf(securityOpts), hostConfig,
- copyWithNullOf(binds), copyWithNullOf(links), copyOf(lxcConf), copyOf(portBindings), publishAllPorts, privileged,
- copyWithNullOf(dns), copyWithNullOf(dnsSearch), copyWithNullOf(volumesFrom), copyWithNullOf(capAdd), copyWithNullOf(capDrop), copyOf(restartPolicy));
+ copyOf(exposedPorts), copyOf(securityOpts), hostConfig);
}
public static Builder builder() {
@@ -158,18 +128,6 @@ public abstract class Config {
private Map<String, ?> exposedPorts = Maps.newHashMap();
private List<String> securityOpts = Lists.newArrayList();
private HostConfig hostConfig;
- private List<String> binds;
- private List<String> links;
- private List<Map<String, String>> lxcConf = Lists.newArrayList();
- private Map<String, List<Map<String, String>>> portBindings = Maps.newHashMap();
- private boolean publishAllPorts;
- private boolean privileged;
- private List<String> dns;
- private List<String> dnsSearch;
- private List<String> volumesFrom;
- private List<String> capAdd;
- private List<String> capDrop;
- private Map<String, String> restartPolicy = Maps.newHashMap();
public Builder hostname(String hostname) {
this.hostname = hostname;
@@ -287,71 +245,10 @@ public abstract class Config {
return this;
}
- public Builder binds(List<String> binds) {
- this.binds = binds;
- return this;
- }
-
- public Builder links(List<String> links) {
- this.links = links;
- return this;
- }
-
- public Builder lxcConf(List<Map<String, String>> lxcConf) {
- this.lxcConf = lxcConf;
- return this;
- }
-
- public Builder portBindings(Map<String, List<Map<String, String>>> portBindings) {
- this.portBindings = portBindings;
- return this;
- }
-
- public Builder publishAllPorts(boolean publishAllPorts) {
- this.publishAllPorts = publishAllPorts;
- return this;
- }
-
- public Builder privileged(boolean privileged) {
- this.privileged = privileged;
- return this;
- }
-
- public Builder dns(List<String> dns) {
- this.dns = dns;
- return this;
- }
-
- public Builder dnsSearch(List<String> dnsSearch) {
- this.dnsSearch = dnsSearch;
- return this;
- }
-
- public Builder volumesFrom(List<String> volumesFrom) {
- this.volumesFrom = volumesFrom;
- return this;
- }
-
- public Builder capAdd(List<String> capAdd) {
- this.capAdd = capAdd;
- return this;
- }
-
- public Builder capDrop(List<String> capDrop) {
- this.capDrop = capDrop;
- return this;
- }
-
- public Builder restartPolicy(Map<String, String> restartPolicy) {
- this.restartPolicy = restartPolicy;
- return this;
- }
-
public Config build() {
return Config.create(hostname, domainname, user, memory, memorySwap, cpuShares, attachStdin, attachStdout,
attachStderr, tty, openStdin, stdinOnce, env, cmd, entrypoint, image, volumes, workingDir,
- networkDisabled, exposedPorts, securityOpts, hostConfig, binds, links, lxcConf, portBindings,
- publishAllPorts, privileged, dns, dnsSearch, volumesFrom, capAdd, capDrop, restartPolicy);
+ networkDisabled, exposedPorts, securityOpts, hostConfig);
}
public Builder fromConfig(Config in) {
@@ -360,11 +257,8 @@ public abstract class Config {
.attachStdout(in.attachStdout()).attachStderr(in.attachStderr()).tty(in.tty())
.openStdin(in.openStdin()).stdinOnce(in.stdinOnce()).env(in.env()).cmd(in.cmd())
.entrypoint(in.entrypoint()).image(in.image()).volumes(in.volumes()).workingDir(in.workingDir())
- .networkDisabled(in.networkDisabled()).exposedPorts(in.exposedPorts()).securityOpts(in.securityOpts())
- .hostConfig(in.hostConfig()).binds(in.binds()).links(in.links()).lxcConf(in.lxcConf())
- .portBindings(in.portBindings()).publishAllPorts(in.publishAllPorts()).privileged(in.privileged())
- .dns(in.dns()).dnsSearch(in.dnsSearch()).volumesFrom(in.volumesFrom()).capAdd(in.capAdd())
- .capDrop(in.capDrop()).restartPolicy(in.restartPolicy());
+ .networkDisabled(in.networkDisabled()).exposedPorts(in.exposedPorts())
+ .securityOpts(in.securityOpts()).hostConfig(in.hostConfig());
}
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java b/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java
index 1ebdb2c..b4ee4f3 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/HostConfig.java
@@ -55,16 +55,29 @@ public abstract class HostConfig {
@Nullable public abstract String networkMode();
+ @Nullable public abstract List<String> securityOpt();
+
+ @Nullable public abstract List<String> capAdd();
+
+ @Nullable public abstract List<String> capDrop();
+
+ public abstract Map<String, String> restartPolicy();
+
+
+
HostConfig() {
}
@SerializedNames({ "ContainerIDFile", "Binds", "LxcConf", "Privileged", "Dns", "DnsSearch", "PortBindings",
- "Links", "ExtraHosts", "PublishAllPorts", "VolumesFrom", "NetworkMode" })
+ "Links", "ExtraHosts", "PublishAllPorts", "VolumesFrom", "NetworkMode", "SecurityOpt",
+ "CapAdd", "CapDrop", "RestartPolicy" })
public static HostConfig create(String containerIDFile, List<String> binds, List<Map<String, String>> lxcConf,
boolean privileged, List<String> dns, List<String> dnsSearch, Map<String, List<Map<String, String>>> portBindings,
- List<String> links, List<String> extraHosts, boolean publishAllPorts, List<String> volumesFrom, String networkMode) {
+ List<String> links, List<String> extraHosts, boolean publishAllPorts, List<String> volumesFrom, String networkMode,
+ List<String> securityOpt, List<String> capAdd, List<String> capDrop, Map<String, String> restartPolicy) {
return new AutoValue_HostConfig(containerIDFile, copyWithNullOf(binds), copyOf(lxcConf), privileged, copyWithNullOf(dns), copyWithNullOf(dnsSearch),
- copyOf(portBindings), copyWithNullOf(links), copyWithNullOf(extraHosts), publishAllPorts, copyWithNullOf(volumesFrom), networkMode);
+ copyOf(portBindings), copyWithNullOf(links), copyWithNullOf(extraHosts), publishAllPorts, copyWithNullOf(volumesFrom), networkMode,
+ copyOf(securityOpt), copyWithNullOf(capAdd), copyWithNullOf(capDrop), copyOf(restartPolicy));
}
public static Builder builder() {
@@ -89,7 +102,11 @@ public abstract class HostConfig {
private boolean publishAllPorts;
private List<String> volumesFrom;
private String networkMode;
-
+ private List<String> securityOpt = Lists.newArrayList();
+ private List<String> capAdd;
+ private List<String> capDrop;
+ private Map<String, String> restartPolicy = Maps.newHashMap();
+
public Builder containerIDFile(String containerIDFile) {
this.containerIDFile = containerIDFile;
return this;
@@ -150,16 +167,37 @@ public abstract class HostConfig {
return this;
}
+ public Builder securityOpt(List<String> securityOpt) {
+ this.securityOpt = securityOpt;
+ return this;
+ }
+
+ public Builder capAdd(List<String> capAdd) {
+ this.capAdd = capAdd;
+ return this;
+ }
+
+ public Builder capDrop(List<String> capDrop) {
+ this.capDrop = capDrop;
+ return this;
+ }
+
+ public Builder restartPolicy(Map<String, String> restartPolicy) {
+ this.restartPolicy = restartPolicy;
+ return this;
+ }
+
public HostConfig build() {
return HostConfig.create(containerIDFile, binds, lxcConf, privileged, dns, dnsSearch, portBindings, links,
- extraHosts, publishAllPorts, volumesFrom, networkMode);
+ extraHosts, publishAllPorts, volumesFrom, networkMode, securityOpt, capAdd, capDrop, restartPolicy);
}
public Builder fromHostConfig(HostConfig in) {
return this.containerIDFile(in.containerIDFile()).binds(in.binds()).lxcConf(in.lxcConf())
.privileged(in.privileged()).dns(in.dns()).dnsSearch(in.dnsSearch()).links(in.links())
.extraHosts(in.extraHosts()).portBindings(in.portBindings()).publishAllPorts(in.publishAllPorts())
- .volumesFrom(in.volumesFrom()).networkMode(in.networkMode());
+ .volumesFrom(in.volumesFrom()).networkMode(in.networkMode()).securityOpt(in.securityOpt())
+ .capAdd(in.capAdd()).capDrop(in.capDrop()).restartPolicy(in.restartPolicy());
}
}
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/main/java/org/jclouds/docker/domain/Info.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/Info.java b/docker/src/main/java/org/jclouds/docker/domain/Info.java
index e2b51ca..6a071c3 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/Info.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/Info.java
@@ -42,9 +42,9 @@ public abstract class Info {
public abstract String indexServerAddress();
- public abstract String initPath();
+ @Nullable public abstract String initPath();
- public abstract String initSha1();
+ @Nullable public abstract String initSha1();
public abstract String kernelVersion();
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/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 ca27729..2217992 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
@@ -16,16 +16,16 @@
*/
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;
@@ -135,7 +135,7 @@ 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;
@@ -176,7 +176,7 @@ 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;
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/test/java/org/jclouds/docker/domain/ConfigTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/domain/ConfigTest.java b/docker/src/test/java/org/jclouds/docker/domain/ConfigTest.java
index 0eef24d..6ba9ac5 100644
--- a/docker/src/test/java/org/jclouds/docker/domain/ConfigTest.java
+++ b/docker/src/test/java/org/jclouds/docker/domain/ConfigTest.java
@@ -58,8 +58,5 @@ public class ConfigTest {
assertThat(config.domainname()).isNull();
assertThat(config.workingDir()).isNull();
assertThat(config.hostConfig()).isNull();
- assertThat(config.dns()).isNull();
- assertThat(config.dnsSearch()).isNull();
- assertThat(config.volumesFrom()).isNull();
}
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
index 1b23b07..6c024d6 100644
--- a/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
@@ -85,7 +85,10 @@ public class ContainerApiLiveTest extends BaseDockerApiLiveTest {
}
@Test(dependsOnMethods = "testStartContainer")
- public void testAttachContainer() {
+ public void testAttachContainer() throws InterruptedException {
+ // wait 2 seconds - give a container chance to echo the string
+ Thread.sleep(2000L);
+
InputStream attachStream = api().attach(container.id(), AttachOptions.Builder.logs(true).stream(false).stdout(true));
String stream = consumeStream(attachStream);
assertThat(stream.trim()).contains("hello world");
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/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 42e94be..53ef7dc 100644
--- a/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
+++ b/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
@@ -111,10 +111,13 @@ public class ContainerParseTest extends BaseDockerParseTest<Container> {
"6783/tcp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "", "HostPort", "6783")),
"6783/udp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "", "HostPort", "6783")))
)
+ .capAdd(ImmutableList.of("NET_ADMIN"))
+ .capDrop(ImmutableList.of("MKNOD"))
.dns(ImmutableList.of("8.8.8.8", "8.8.4.4"))
.extraHosts(ImmutableList.<String>of("extra:169.254.0.1"))
.privileged(true)
.networkMode("bridge")
+ .restartPolicy(ImmutableMap.<String, String> of("MaximumRetryCount", "0", "Name", ""))
.build())
.driver("aufs")
.execDriver("native-0.2")
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/test/java/org/jclouds/docker/parse/ContainerVersionMajor1Minor21.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/parse/ContainerVersionMajor1Minor21.java b/docker/src/test/java/org/jclouds/docker/parse/ContainerVersionMajor1Minor21.java
new file mode 100644
index 0000000..2b990e1
--- /dev/null
+++ b/docker/src/test/java/org/jclouds/docker/parse/ContainerVersionMajor1Minor21.java
@@ -0,0 +1,263 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.docker.parse;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.docker.domain.Config;
+import org.jclouds.docker.domain.Container;
+import org.jclouds.docker.domain.HostConfig;
+import org.jclouds.docker.domain.NetworkSettings;
+import org.jclouds.docker.domain.State;
+import org.jclouds.docker.internal.BaseDockerParseTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * This class tests Containers and Config parsing for Docker API in version 1.21. The input JSON comes from examples in
+ * <a href="https://docs.docker.com/engine/reference/api/docker_remote_api_v1.21/">Docker Remote API documentation 1.21</a>.
+ * <p>
+ * Two modifications were made in the "/container-1.21-create.json" due to incompatible types
+ * <ul>
+ * <li>the Entrypoint field value was changed from String to List<li>
+ * <li>the LxcConf field value was changed from Map to List</li>
+ * <ul>
+ */
+public class ContainerVersionMajor1Minor21 {
+
+ @Test(groups = "unit")
+ public static class CreateTest extends BaseDockerParseTest<Config> {
+ @Override
+ public String resource() {
+ return "/container-1.21-create.json";
+ }
+
+ @Override
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Config expected() {
+ return Config.builder()
+ .hostname("")
+ .domainname("")
+ .user("")
+ .attachStdin(false)
+ .attachStdout(true)
+ .attachStderr(true)
+ .tty(false)
+ .openStdin(false)
+ .stdinOnce(false)
+ .env(ImmutableList.of("FOO=bar", "BAZ=quux"))
+ .cmd(ImmutableList.of("date"))
+ //original value of the "Entrypoint" in JSON doesn't contain List but String!
+ //Both types are allowed by docker Remote API, but we are not able to parse both.
+ .entrypoint(ImmutableList.of(""))
+ .image("ubuntu")
+// "Labels": {
+// "com.example.vendor": "Acme",
+// "com.example.license": "GPL",
+// "com.example.version": "1.0"
+// },
+ .volumes(ImmutableMap.of("/volumes/data", ImmutableMap.of()))
+ .workingDir("")
+ .networkDisabled(false)
+// "MacAddress": "12:34:56:78:9a:bc",
+ .exposedPorts(ImmutableMap.of("22/tcp", ImmutableMap.of()))
+// "StopSignal": "SIGTERM",
+ .hostConfig(HostConfig.builder()
+ .binds(ImmutableList.of("/tmp:/tmp"))
+ .links(ImmutableList.of("redis3:redis"))
+ //The LxcConf causes the type mismatch too (Map vs List<Map>)
+ .lxcConf(ImmutableList.<Map<String, String>> of(
+ ImmutableMap.<String, String> of("lxc.utsname", "docker")))
+// "Memory": 0,
+// "MemorySwap": 0,
+// "MemoryReservation": 0,
+// "KernelMemory": 0,
+// "CpuShares": 512,
+// "CpuPeriod": 100000,
+// "CpuQuota": 50000,
+// "CpusetCpus": "0,1",
+// "CpusetMems": "0,1",
+// "BlkioWeight": 300,
+// "MemorySwappiness": 60,
+// "OomKillDisable": false,
+ .portBindings(ImmutableMap.<String, List<Map<String, String>>> of(
+ "22/tcp", ImmutableList.<Map<String, String>> of(ImmutableMap.of("HostPort", "11022"))))
+ .publishAllPorts(false)
+ .privileged(false)
+// "ReadonlyRootfs": false,
+ .dns(ImmutableList.of("8.8.8.8"))
+// "DnsOptions": [""],
+ .dnsSearch(ImmutableList.of(""))
+ .extraHosts(null)
+ .volumesFrom(ImmutableList.of("parent", "other:ro"))
+ .capAdd(ImmutableList.of("NET_ADMIN"))
+ .capDrop(ImmutableList.of("MKNOD"))
+// "GroupAdd": ["newgroup"],
+ .restartPolicy(ImmutableMap.of("Name", "", "MaximumRetryCount", "0"))
+ .networkMode("bridge")
+// "Devices": [],
+// "Ulimits": [{}],
+// "LogConfig": { "Type": "json-file", "Config": {} },
+ .securityOpt(ImmutableList.<String>of())
+// "CgroupParent": "",
+// "VolumeDriver": ""
+ .build()
+ )
+ .build();
+ }
+ }
+
+ @Test(groups = "unit")
+ public static class InspectTest extends BaseDockerParseTest<Container> {
+ @Override
+ public String resource() {
+ return "/container-1.21-inspect.json";
+ }
+
+ @Override
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Container expected() {
+ return Container.builder()
+// "AppArmorProfile": "",
+ .args(ImmutableList.<String>of("-c", "exit 9"))
+ .config(Config.builder()
+ .attachStderr(true)
+ .attachStdin(false)
+ .attachStdout(true)
+ .cmd(ImmutableList.<String> of("/bin/sh", "-c", "exit 9"))
+ .domainname("")
+ .entrypoint(null)
+ .env(ImmutableList.<String> of("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"))
+ .exposedPorts(null)
+ .hostname("ba033ac44011")
+ .image("ubuntu")
+// "Labels": {
+// "com.example.vendor": "Acme",
+// "com.example.license": "GPL",
+// "com.example.version": "1.0"
+// },
+// "MacAddress": "",
+ .networkDisabled(false)
+// "OnBuild": null,
+ .openStdin(false)
+ .stdinOnce(false)
+ .tty(false)
+ .user("")
+ .volumes(null)
+ .workingDir("")
+// "StopSignal": "SIGTERM"
+ .build())
+ .created(new SimpleDateFormatDateService().iso8601DateParse("2015-01-06T15:47:31.485331387Z"))
+ .driver("devicemapper")
+ .execDriver("native-0.2")
+// "ExecIDs": null,
+ .hostConfig(HostConfig.builder()
+ .binds(null)
+// "BlkioWeight": 0,
+ .capAdd(null)
+ .capDrop(null)
+ .containerIDFile("")
+// "CpusetCpus": "",
+// "CpusetMems": "",
+// "CpuShares": 0,
+// "CpuPeriod": 100000,
+// "Devices": [],
+ .dns(null)
+// "DnsOptions": null,
+ .dnsSearch(null)
+ .extraHosts(null)
+// "IpcMode": "",
+ .links(null)
+ .lxcConf(ImmutableList.<Map<String, String>> of())
+// "Memory": 0,
+// "MemorySwap": 0,
+// "MemoryReservation": 0,
+// "KernelMemory": 0,
+// "OomKillDisable": false,
+ .networkMode("bridge")
+ .portBindings(ImmutableMap.<String, List<Map<String, String>>> of())
+ .privileged(false)
+// "ReadonlyRootfs": false,
+ .publishAllPorts(false)
+ .restartPolicy(ImmutableMap.<String, String> of("MaximumRetryCount", "2", "Name", "on-failure"))
+// "LogConfig": {
+// "Config": null,
+// "Type": "json-file"
+// },
+ .securityOpt(null)
+ .volumesFrom(null)
+// "Ulimits": [{}],
+// "VolumeDriver": ""
+ .build())
+ .hostnamePath("/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname")
+ .hostsPath("/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts")
+// "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log",
+ .id("ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39")
+ .image("04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2")
+ .mountLabel("")
+ .name("/boring_euclid")
+ .networkSettings(NetworkSettings.builder()
+ .bridge("")
+ .sandboxId("")
+ .hairpinMode(false)
+ .linkLocalIPv6Address("")
+ .linkLocalIPv6PrefixLen(0)
+ .ports(null)
+ .sandboxKey("")
+ .secondaryIPAddresses(null)
+ .secondaryIPv6Addresses(null)
+ .endpointId("")
+ .gateway("")
+ .globalIPv6Address("")
+ .globalIPv6PrefixLen(0)
+ .ipAddress("")
+ .ipPrefixLen(0)
+ .ipv6Gateway("")
+ .macAddress("")
+ .networks(ImmutableMap.<String, NetworkSettings.Details> of(
+ "bridge", NetworkSettings.Details.create("", "", "", 0, "", "", 0, "")))
+ .build())
+ .path("/bin/sh")
+ .processLabel("")
+ .resolvConfPath("/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf")
+// "RestartCount": 1,
+ .state(State.create(0, true, 9, "2015-01-06T15:47:32.072697474Z", "2015-01-06T15:47:32.080254511Z", false, false, "running", false,
+ // We don't have the "Dead" field in this API version!
+ false,
+ ""
+// "Paused": false,
+// "Running": true,
+ ))
+// "Mounts": [
+// {
+// "Source": "/data",
+// "Destination": "/data",
+// "Mode": "ro,Z",
+// "RW": false
+// }
+ .build();
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/test/java/org/jclouds/docker/parse/Info2ParseTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/parse/Info2ParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/Info2ParseTest.java
new file mode 100644
index 0000000..949acc7
--- /dev/null
+++ b/docker/src/test/java/org/jclouds/docker/parse/Info2ParseTest.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.docker.parse;
+
+import java.util.List;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.docker.domain.Info;
+import org.jclouds.docker.internal.BaseDockerParseTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+@Test(groups = "unit")
+public class Info2ParseTest extends BaseDockerParseTest<Info> {
+
+ @Override
+ public String resource() {
+ return "/info2.json";
+ }
+
+ @Override
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Info expected() {
+ return Info.create(
+ 0, // containers
+ false, // debug
+ "aufs", // driver
+ ImmutableList.<List<String>>of(
+ ImmutableList.of("Root Dir", "/var/lib/docker/aufs"),
+ ImmutableList.of("Backing Filesystem", "extfs"),
+ ImmutableList.of("Dirs", "117"),
+ ImmutableList.of( "Dirperm1 Supported", "true")
+ ), // driverStatus
+ "", // ExecutionDriver
+ true, // IPv4Forwarding
+ 39, // Images
+ "https://index.docker.io/v1/", // IndexServerAddress
+ null, // InitPath
+ null, // InitSha1
+ "4.4.0-22-generic", // KernelVersion
+ true, // MemoryLimit
+ 0, // NEventsListener
+ 33, // NFd
+ 83, // NGoroutines
+ "Ubuntu 16.04 LTS", // OperatingSystem
+ false, // SwapLimit
+ "/var/lib/docker", // DockerRootDir
+ null, // Labels
+ 8248356864L, // MemTotal
+ 4, // NCPU
+ "KFWR:PMVY:BEWE:TD52:5WEU:NXF4:I6S3:WDIE:GCRD:L3YA:VWC4:ZRYZ", // ID
+ "test" // name
+ );
+ }
+}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/test/resources/container-1.21-create.json
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/container-1.21-create.json b/docker/src/test/resources/container-1.21-create.json
new file mode 100644
index 0000000..4998569
--- /dev/null
+++ b/docker/src/test/resources/container-1.21-create.json
@@ -0,0 +1,72 @@
+{
+ "Hostname": "",
+ "Domainname": "",
+ "User": "",
+ "AttachStdin": false,
+ "AttachStdout": true,
+ "AttachStderr": true,
+ "Tty": false,
+ "OpenStdin": false,
+ "StdinOnce": false,
+ "Env": [
+ "FOO=bar",
+ "BAZ=quux"
+ ],
+ "Cmd": [
+ "date"
+ ],
+ "Entrypoint": [""],
+ "Image": "ubuntu",
+ "Labels": {
+ "com.example.vendor": "Acme",
+ "com.example.license": "GPL",
+ "com.example.version": "1.0"
+ },
+ "Volumes": {
+ "/volumes/data": {}
+ },
+ "WorkingDir": "",
+ "NetworkDisabled": false,
+ "MacAddress": "12:34:56:78:9a:bc",
+ "ExposedPorts": {
+ "22/tcp": {}
+ },
+ "StopSignal": "SIGTERM",
+ "HostConfig": {
+ "Binds": ["/tmp:/tmp"],
+ "Links": ["redis3:redis"],
+ "LxcConf": [{"lxc.utsname":"docker"}],
+ "Memory": 0,
+ "MemorySwap": 0,
+ "MemoryReservation": 0,
+ "KernelMemory": 0,
+ "CpuShares": 512,
+ "CpuPeriod": 100000,
+ "CpuQuota": 50000,
+ "CpusetCpus": "0,1",
+ "CpusetMems": "0,1",
+ "BlkioWeight": 300,
+ "MemorySwappiness": 60,
+ "OomKillDisable": false,
+ "PortBindings": { "22/tcp": [{ "HostPort": "11022" }] },
+ "PublishAllPorts": false,
+ "Privileged": false,
+ "ReadonlyRootfs": false,
+ "Dns": ["8.8.8.8"],
+ "DnsOptions": [""],
+ "DnsSearch": [""],
+ "ExtraHosts": null,
+ "VolumesFrom": ["parent", "other:ro"],
+ "CapAdd": ["NET_ADMIN"],
+ "CapDrop": ["MKNOD"],
+ "GroupAdd": ["newgroup"],
+ "RestartPolicy": { "Name": "", "MaximumRetryCount": 0 },
+ "NetworkMode": "bridge",
+ "Devices": [],
+ "Ulimits": [{}],
+ "LogConfig": { "Type": "json-file", "Config": {} },
+ "SecurityOpt": [],
+ "CgroupParent": "",
+ "VolumeDriver": ""
+ }
+ }
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/test/resources/container-1.21-inspect.json
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/container-1.21-inspect.json b/docker/src/test/resources/container-1.21-inspect.json
new file mode 100644
index 0000000..ade2851
--- /dev/null
+++ b/docker/src/test/resources/container-1.21-inspect.json
@@ -0,0 +1,147 @@
+{
+ "AppArmorProfile": "",
+ "Args": [
+ "-c",
+ "exit 9"
+ ],
+ "Config": {
+ "AttachStderr": true,
+ "AttachStdin": false,
+ "AttachStdout": true,
+ "Cmd": [
+ "/bin/sh",
+ "-c",
+ "exit 9"
+ ],
+ "Domainname": "",
+ "Entrypoint": null,
+ "Env": [
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+ ],
+ "ExposedPorts": null,
+ "Hostname": "ba033ac44011",
+ "Image": "ubuntu",
+ "Labels": {
+ "com.example.vendor": "Acme",
+ "com.example.license": "GPL",
+ "com.example.version": "1.0"
+ },
+ "MacAddress": "",
+ "NetworkDisabled": false,
+ "OnBuild": null,
+ "OpenStdin": false,
+ "StdinOnce": false,
+ "Tty": false,
+ "User": "",
+ "Volumes": null,
+ "WorkingDir": "",
+ "StopSignal": "SIGTERM"
+ },
+ "Created": "2015-01-06T15:47:31.485331387Z",
+ "Driver": "devicemapper",
+ "ExecDriver": "native-0.2",
+ "ExecIDs": null,
+ "HostConfig": {
+ "Binds": null,
+ "BlkioWeight": 0,
+ "CapAdd": null,
+ "CapDrop": null,
+ "ContainerIDFile": "",
+ "CpusetCpus": "",
+ "CpusetMems": "",
+ "CpuShares": 0,
+ "CpuPeriod": 100000,
+ "Devices": [],
+ "Dns": null,
+ "DnsOptions": null,
+ "DnsSearch": null,
+ "ExtraHosts": null,
+ "IpcMode": "",
+ "Links": null,
+ "LxcConf": [],
+ "Memory": 0,
+ "MemorySwap": 0,
+ "MemoryReservation": 0,
+ "KernelMemory": 0,
+ "OomKillDisable": false,
+ "NetworkMode": "bridge",
+ "PortBindings": {},
+ "Privileged": false,
+ "ReadonlyRootfs": false,
+ "PublishAllPorts": false,
+ "RestartPolicy": {
+ "MaximumRetryCount": 2,
+ "Name": "on-failure"
+ },
+ "LogConfig": {
+ "Config": null,
+ "Type": "json-file"
+ },
+ "SecurityOpt": null,
+ "VolumesFrom": null,
+ "Ulimits": [{}],
+ "VolumeDriver": ""
+ },
+ "HostnamePath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hostname",
+ "HostsPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/hosts",
+ "LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log",
+ "Id": "ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39",
+ "Image": "04c5d3b7b0656168630d3ba35d8889bd0e9caafcaeb3004d2bfbc47e7c5d35d2",
+ "MountLabel": "",
+ "Name": "/boring_euclid",
+ "NetworkSettings": {
+ "Bridge": "",
+ "SandboxID": "",
+ "HairpinMode": false,
+ "LinkLocalIPv6Address": "",
+ "LinkLocalIPv6PrefixLen": 0,
+ "Ports": null,
+ "SandboxKey": "",
+ "SecondaryIPAddresses": null,
+ "SecondaryIPv6Addresses": null,
+ "EndpointID": "",
+ "Gateway": "",
+ "GlobalIPv6Address": "",
+ "GlobalIPv6PrefixLen": 0,
+ "IPAddress": "",
+ "IPPrefixLen": 0,
+ "IPv6Gateway": "",
+ "MacAddress": "",
+ "Networks": {
+ "bridge": {
+ "EndpointID": "",
+ "Gateway": "",
+ "IPAddress": "",
+ "IPPrefixLen": 0,
+ "IPv6Gateway": "",
+ "GlobalIPv6Address": "",
+ "GlobalIPv6PrefixLen": 0,
+ "MacAddress": ""
+ }
+ }
+ },
+ "Path": "/bin/sh",
+ "ProcessLabel": "",
+ "ResolvConfPath": "/var/lib/docker/containers/ba033ac4401106a3b513bc9d639eee123ad78ca3616b921167cd74b20e25ed39/resolv.conf",
+ "RestartCount": 1,
+ "State": {
+ "Error": "",
+ "ExitCode": 9,
+ "FinishedAt": "2015-01-06T15:47:32.080254511Z",
+ "OOMKilled": false,
+ "Paused": false,
+ "Pid": 0,
+ "Restarting": false,
+ "Running": true,
+ "StartedAt": "2015-01-06T15:47:32.072697474Z",
+ "Status": "running"
+ },
+ "Mounts": [
+ {
+ "Source": "/data",
+ "Destination": "/data",
+ "Mode": "ro,Z",
+ "RW": false
+ }
+ ]
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/test/resources/container.json
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/container.json b/docker/src/test/resources/container.json
index fa1b61f..bc18e27 100644
--- a/docker/src/test/resources/container.json
+++ b/docker/src/test/resources/container.json
@@ -40,7 +40,7 @@
"OnBuild": null,
"OpenStdin": false,
"PortSpecs": null,
- "SecurityOpt": null,
+ "SecurityOpts": null,
"StdinOnce": false,
"Tty": false,
"User": "",
@@ -52,8 +52,8 @@
"ExecDriver": "native-0.2",
"HostConfig": {
"Binds": null,
- "CapAdd": null,
- "CapDrop": null,
+ "CapAdd": ["NET_ADMIN"],
+ "CapDrop": ["MKNOD"],
"ContainerIDFile": "",
"Devices": [],
"Dns": [
@@ -137,6 +137,7 @@
"Path": "/home/weave/weaver",
"ProcessLabel": "",
"ResolvConfPath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/resolv.conf",
+ "SecurityOpt": [],
"State": {
"Status": "running",
"Running": true,
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/6d078e69/docker/src/test/resources/info2.json
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/info2.json b/docker/src/test/resources/info2.json
new file mode 100644
index 0000000..11a13d5
--- /dev/null
+++ b/docker/src/test/resources/info2.json
@@ -0,0 +1,90 @@
+{
+ "Architecture": "x86_64",
+ "BridgeNfIp6tables": true,
+ "BridgeNfIptables": true,
+ "CPUSet": true,
+ "CPUShares": true,
+ "CgroupDriver": "cgroupfs",
+ "ClusterAdvertise": "",
+ "ClusterStore": "",
+ "Containers": 0,
+ "ContainersPaused": 0,
+ "ContainersRunning": 0,
+ "ContainersStopped": 0,
+ "CpuCfsPeriod": true,
+ "CpuCfsQuota": true,
+ "Debug": false,
+ "DockerRootDir": "/var/lib/docker",
+ "Driver": "aufs",
+ "DriverStatus": [
+ [
+ "Root Dir",
+ "/var/lib/docker/aufs"
+ ],
+ [
+ "Backing Filesystem",
+ "extfs"
+ ],
+ [
+ "Dirs",
+ "117"
+ ],
+ [
+ "Dirperm1 Supported",
+ "true"
+ ]
+ ],
+ "ExecutionDriver": "",
+ "ExperimentalBuild": false,
+ "HttpProxy": "",
+ "HttpsProxy": "",
+ "ID": "KFWR:PMVY:BEWE:TD52:5WEU:NXF4:I6S3:WDIE:GCRD:L3YA:VWC4:ZRYZ",
+ "IPv4Forwarding": true,
+ "Images": 39,
+ "IndexServerAddress": "https://index.docker.io/v1/",
+ "KernelMemory": true,
+ "KernelVersion": "4.4.0-22-generic",
+ "Labels": null,
+ "LoggingDriver": "json-file",
+ "MemTotal": 8248356864,
+ "MemoryLimit": true,
+ "NCPU": 4,
+ "NEventsListener": 0,
+ "NFd": 33,
+ "NGoroutines": 83,
+ "Name": "test",
+ "NoProxy": "",
+ "OSType": "linux",
+ "OomKillDisable": true,
+ "OperatingSystem": "Ubuntu 16.04 LTS",
+ "Plugins": {
+ "Authorization": null,
+ "Network": [
+ "bridge",
+ "null",
+ "host"
+ ],
+ "Volume": [
+ "local"
+ ]
+ },
+ "RegistryConfig": {
+ "IndexConfigs": {
+ "docker.io": {
+ "Mirrors": null,
+ "Name": "docker.io",
+ "Official": true,
+ "Secure": true
+ }
+ },
+ "InsecureRegistryCIDRs": [
+ "0.0.0.0/0",
+ "127.0.0.0/8"
+ ],
+ "Mirrors": null
+ },
+ "ServerVersion": "1.11.1",
+ "SwapLimit": false,
+ "SystemStatus": null,
+ "SystemTime": "2016-05-24T15:20:15.407969411+02:00"
+}