From 9639cb7bdf602887899feccdd639406e4c9323ca Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 28 Mar 2016 00:33:12 +0300
Subject: [PATCH 001/736] Refactor CertUtils. Support ECDSA and PrivateKey.
---
.../core/util/CertificateUtils.java | 206 +++++++++++-------
1 file changed, 128 insertions(+), 78 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java
index 562a954a7..6e1925630 100644
--- a/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java
+++ b/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java
@@ -2,30 +2,38 @@
import java.io.BufferedReader;
import java.io.File;
-import java.io.FileReader;
import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
import java.security.KeyFactory;
-import java.security.KeyPair;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
-import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;
-import org.apache.commons.io.IOUtils;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.bouncycastle.asn1.ASN1ObjectIdentifier;
+import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.CheckForNull;
+
+import static java.util.Objects.requireNonNull;
public class CertificateUtils {
+ private static final Logger LOG = LoggerFactory.getLogger(CertificateUtils.class);
+
private CertificateUtils() {
// utility class
}
@@ -41,115 +49,157 @@ public static boolean verifyCertificatesExist(String dockerCertPath) {
return result;
}
+ /**
+ * @param dockerCertPath with standard named files.
+ */
public static KeyStore createKeyStore(final String dockerCertPath) throws NoSuchAlgorithmException,
InvalidKeySpecException, IOException, CertificateException, KeyStoreException {
- KeyPair keyPair = loadPrivateKey(dockerCertPath);
- List privateCertificates = loadCertificates(dockerCertPath);
+ return createKeyStore("key.pem", "cert.pem");
+ }
+
+
+ @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE")
+ public static KeyStore createKeyStore(final String keypem, final String certpem) throws NoSuchAlgorithmException,
+ InvalidKeySpecException, IOException, CertificateException, KeyStoreException {
+ PrivateKey privateKey = loadPrivateKey(keypem);
+ requireNonNull(privateKey);
+ List privateCertificates = loadCertificates(certpem);
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null);
- keyStore.setKeyEntry("docker", keyPair.getPrivate(), "docker".toCharArray(),
- privateCertificates.toArray(new Certificate[privateCertificates.size()]));
+ keyStore.setKeyEntry("docker",
+ privateKey,
+ "docker".toCharArray(),
+ privateCertificates.toArray(new Certificate[privateCertificates.size()])
+ );
+
return keyStore;
}
- public static KeyStore createTrustStore(final String dockerCertPath) throws IOException, CertificateException,
- KeyStoreException, NoSuchAlgorithmException {
- File caPath = new File(dockerCertPath, "ca.pem");
- BufferedReader reader = new BufferedReader(new FileReader(caPath));
- PEMParser pemParser = null;
-
- try {
- pemParser = new PEMParser(reader);
- X509CertificateHolder certificateHolder = (X509CertificateHolder) pemParser.readObject();
- Certificate caCertificate = new JcaX509CertificateConverter().setProvider("BC").getCertificate(
- certificateHolder);
-
- KeyStore trustStore = KeyStore.getInstance("JKS");
- trustStore.load(null);
- trustStore.setCertificateEntry("ca", caCertificate);
- return trustStore;
-
- } finally {
- if (pemParser != null) {
- IOUtils.closeQuietly(pemParser);
- }
-
- if (reader != null) {
- IOUtils.closeQuietly(reader);
- }
+ /**
+ * from "cert.pem" String
+ */
+ private static List loadCertificates(final String certpem) throws IOException,
+ CertificateException {
+ final StringReader certReader = new StringReader(certpem);
+ try (BufferedReader reader = new BufferedReader(certReader)) {
+ return loadCertificates(reader);
}
-
}
- private static List loadCertificates(final String dockerCertPath) throws IOException,
+ /**
+ * "cert.pem" from reader
+ */
+ private static List loadCertificates(final Reader reader) throws IOException,
CertificateException {
- File certificate = new File(dockerCertPath, "cert.pem");
- BufferedReader reader = new BufferedReader(new FileReader(certificate));
- PEMParser pemParser = null;
-
- try {
+ try (PEMParser pemParser = new PEMParser(reader)) {
List certificates = new ArrayList<>();
- pemParser = new PEMParser(reader);
+
JcaX509CertificateConverter certificateConverter = new JcaX509CertificateConverter().setProvider("BC");
Object certObj = pemParser.readObject();
- while (certObj != null) {
+ if (certObj instanceof X509CertificateHolder) {
X509CertificateHolder certificateHolder = (X509CertificateHolder) certObj;
certificates.add(certificateConverter.getCertificate(certificateHolder));
-
- certObj = pemParser.readObject();
}
return certificates;
- } finally {
- if (pemParser != null) {
- IOUtils.closeQuietly(pemParser);
- }
-
- if (reader != null) {
- IOUtils.closeQuietly(reader);
- }
}
-
}
- private static KeyPair loadPrivateKey(final String dockerCertPath) throws IOException, NoSuchAlgorithmException,
- InvalidKeySpecException {
- File certificate = new File(dockerCertPath, "key.pem");
- BufferedReader reader = new BufferedReader(new FileReader(certificate));
- PEMParser pemParser = null;
+ /**
+ * Return private key ("key.pem") from Reader
+ */
+ @CheckForNull
+ private static PrivateKey loadPrivateKey(final Reader reader) throws IOException, NoSuchAlgorithmException,
+ InvalidKeySpecException {
+ try (PEMParser pemParser = new PEMParser(reader)) {
+ Object readObject = pemParser.readObject();
+ while (readObject != null) {
+ if (readObject instanceof PEMKeyPair) {
+ PEMKeyPair pemKeyPair = (PEMKeyPair) readObject;
+ PrivateKey privateKey = guessKey(pemKeyPair.getPrivateKeyInfo().getEncoded());
+ if (privateKey != null) {
+ return privateKey;
+ }
+ } else if (readObject instanceof PrivateKeyInfo) {
+ PrivateKeyInfo privateKeyInfo = (PrivateKeyInfo) readObject;
+ PrivateKey privateKey = guessKey(privateKeyInfo.getEncoded());
+ if (privateKey != null) {
+ return privateKey;
+ }
+ } else if (readObject instanceof ASN1ObjectIdentifier) {
+ // no idea how it can be used
+ final ASN1ObjectIdentifier asn1ObjectIdentifier = (ASN1ObjectIdentifier) readObject;
+ LOG.trace("Ignoring asn1ObjectIdentifier {}", asn1ObjectIdentifier);
+ } else {
+ LOG.warn("Unknown object '{}' from PEMParser", readObject);
+ }
+
+ readObject = pemParser.readObject();
+ }
+ }
- try {
- pemParser = new PEMParser(reader);
+ return null;
+ }
- PEMKeyPair pemKeyPair = (PEMKeyPair) pemParser.readObject();
+ @CheckForNull
+ private static PrivateKey guessKey(byte[] encodedKey) throws NoSuchAlgorithmException {
+ //no way to know, so iterate
+ for (String guessFactory : new String[]{"RSA", "ECDSA"}) {
+ try {
+ KeyFactory factory = KeyFactory.getInstance(guessFactory);
- byte[] pemPrivateKeyEncoded = pemKeyPair.getPrivateKeyInfo().getEncoded();
- byte[] pemPublicKeyEncoded = pemKeyPair.getPublicKeyInfo().getEncoded();
+ PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedKey);
+ return factory.generatePrivate(privateKeySpec);
+ } catch (InvalidKeySpecException ignore) {
+ }
+ }
- KeyFactory factory = KeyFactory.getInstance("RSA");
+ return null;
+ }
- X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pemPublicKeyEncoded);
- PublicKey publicKey = factory.generatePublic(publicKeySpec);
+ /**
+ * Return KeyPair from "key.pem"
+ */
+ @CheckForNull
+ private static PrivateKey loadPrivateKey(final String keypem) throws IOException, NoSuchAlgorithmException,
+ InvalidKeySpecException {
+ try (StringReader certReader = new StringReader(keypem);
+ BufferedReader reader = new BufferedReader(certReader)) {
+ return loadPrivateKey(reader);
+ }
+ }
- PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(pemPrivateKeyEncoded);
- PrivateKey privateKey = factory.generatePrivate(privateKeySpec);
+ /**
+ * "ca.pem" from String
+ */
+ public static KeyStore createTrustStore(String capem) throws IOException, CertificateException,
+ KeyStoreException, NoSuchAlgorithmException {
+ try (Reader certReader = new StringReader(capem)) {
+ return createTrustStore(certReader);
+ }
+ }
- return new KeyPair(publicKey, privateKey);
+ /**
+ * "ca.pem" from Reader
+ */
+ public static KeyStore createTrustStore(final Reader certReader) throws IOException, CertificateException,
+ KeyStoreException, NoSuchAlgorithmException {
+ try (PEMParser pemParser = new PEMParser(certReader)) {
+ X509CertificateHolder certificateHolder = (X509CertificateHolder) pemParser.readObject();
+ Certificate caCertificate = new JcaX509CertificateConverter()
+ .setProvider("BC")
+ .getCertificate(certificateHolder);
- } finally {
- if (pemParser != null) {
- IOUtils.closeQuietly(pemParser);
- }
+ KeyStore trustStore = KeyStore.getInstance("JKS");
+ trustStore.load(null);
+ trustStore.setCertificateEntry("ca", caCertificate);
- if (reader != null) {
- IOUtils.closeQuietly(reader);
- }
+ return trustStore;
}
-
}
}
From 4d605506b2a1512977103f9313259b503917d35d Mon Sep 17 00:00:00 2001
From: fb
Date: Sat, 27 Feb 2016 11:11:47 +0100
Subject: [PATCH 002/736] implement links and aliases for user defined networks
add missing network options add tests
---
.../api/command/ConnectToNetworkCmd.java | 6 +
.../api/command/CreateContainerCmd.java | 34 ++++-
.../api/command/CreateNetworkCmd.java | 33 +++--
.../api/command/DisconnectFromNetworkCmd.java | 5 +
.../api/model/ContainerNetwork.java | 73 +++++++++--
.../dockerjava/api/model/HostConfig.java | 12 ++
.../github/dockerjava/api/model/Network.java | 35 ++++-
.../dockerjava/api/model/NetworkSettings.java | 90 +------------
.../core/command/ConnectToNetworkCmdImpl.java | 15 +++
.../core/command/CreateContainerCmdImpl.java | 122 ++++++++++++++++--
.../core/command/CreateNetworkCmdImpl.java | 51 +++++++-
.../command/DisconnectFromNetworkCmdImpl.java | 14 ++
.../core/command/RemoveNetworkCmdImpl.java | 1 -
.../command/ConnectToNetworkCmdImplTest.java | 52 +++++++-
.../command/CreateContainerCmdImplTest.java | 106 +++++++++++++++
.../DisconnectFromNetworkCmdImplTest.java | 22 ++++
16 files changed, 542 insertions(+), 129 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java
index cd5c57774..0f384e043 100644
--- a/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.api.command;
+import com.github.dockerjava.api.model.ContainerNetwork;
import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
@@ -18,10 +19,15 @@ public interface ConnectToNetworkCmd extends SyncDockerCmd {
@CheckForNull
String getContainerId();
+ @CheckForNull
+ ContainerNetwork getContainerConfig();
+
ConnectToNetworkCmd withNetworkId(@Nonnull String networkId);
ConnectToNetworkCmd withContainerId(@Nonnull String containerId);
+ ConnectToNetworkCmd withContainerNetwork(@Nonnull ContainerNetwork endpointConfig);
+
interface Exec extends DockerCmdSyncExec {
}
}
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
index ffcb01c98..196763560 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -1,10 +1,5 @@
package com.github.dockerjava.api.command;
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.CheckForNull;
-
import com.github.dockerjava.api.exception.ConflictException;
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.Bind;
@@ -21,8 +16,15 @@
import com.github.dockerjava.api.model.Volume;
import com.github.dockerjava.api.model.VolumesFrom;
+import javax.annotation.CheckForNull;
+import java.util.List;
+import java.util.Map;
+
public interface CreateContainerCmd extends SyncDockerCmd {
+ @CheckForNull
+ List getAliases();
+
@CheckForNull
Bind[] getBinds();
@@ -92,6 +94,12 @@ public interface CreateContainerCmd extends SyncDockerCmd getLabels();
@@ -185,6 +193,18 @@ public interface CreateContainerCmd extends SyncDockerCmd aliases);
+
CreateContainerCmd withAttachStderr(Boolean attachStderr);
CreateContainerCmd withAttachStdin(Boolean attachStdin);
@@ -304,6 +324,10 @@ public interface CreateContainerCmd extends SyncDockerCmd labels);
/**
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
index 6ad26b605..39989bd13 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
@@ -1,14 +1,13 @@
package com.github.dockerjava.api.command;
-import java.util.Map;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnull;
-
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.api.model.Network.Ipam;
import com.github.dockerjava.core.RemoteApiVersion;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import java.util.Map;
+
/**
* Create a network.
*
@@ -25,18 +24,36 @@ public interface CreateNetworkCmd extends SyncDockerCmd {
@CheckForNull
Network.Ipam getIpam();
+ @CheckForNull
+ Map getOptions();
+
+ @CheckForNull
+ Boolean getCheckDuplicate();
+
+ @CheckForNull
+ Boolean getInternal();
+
+ @CheckForNull
+ Boolean getEnableIPv6();
+
/** The new network's name. Required. */
CreateNetworkCmd withName(@Nonnull String name);
- /** Optional custom IP scheme for the network. */
- CreateNetworkCmd withIpamConfig(Ipam.Config config);
-
/** Name of the network driver to use. Defaults to bridge. */
CreateNetworkCmd withDriver(String driver);
+ /** Ipam config, such es subnet, gateway and ip range of the network */
+ CreateNetworkCmd withIpam(Ipam ipam);
+
/** Driver specific options */
CreateNetworkCmd withOptions(Map options);
+ CreateNetworkCmd withCheckDuplicate(boolean checkForDuplicate);
+
+ CreateNetworkCmd withInternal(boolean internal);
+
+ CreateNetworkCmd withEnableIpv6(boolean enableIpv6);
+
interface Exec extends DockerCmdSyncExec {
}
}
diff --git a/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java
index ca870ef37..ce75172b4 100644
--- a/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java
@@ -18,10 +18,15 @@ public interface DisconnectFromNetworkCmd extends SyncDockerCmd {
@CheckForNull
String getContainerId();
+ @CheckForNull
+ Boolean getForce();
+
DisconnectFromNetworkCmd withNetworkId(@Nonnull String networkId);
DisconnectFromNetworkCmd withContainerId(@Nonnull String containerId);
+ DisconnectFromNetworkCmd withForce(@Nonnull Boolean force);
+
interface Exec extends DockerCmdSyncExec {
}
}
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java b/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
index 4bfde8bfd..9b2160e98 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
+++ b/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.api.model;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.github.dockerjava.core.RemoteApiVersion;
@@ -8,9 +9,14 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.util.Arrays;
import java.util.List;
/**
+ * Types taken form
+ * {@see https://github.com/docker/engine-api/blob/release/1.10/types/network/network.go}
+ * Docker named it EndpointSettings
+ *
* @see ContainerNetworkSettings
* @author Kanstantsin Shautsou
*/
@@ -20,16 +26,16 @@ public class ContainerNetwork {
* FIXME verify
*/
@JsonProperty("IPAMConfig")
- private Network.Ipam.Config ipamConfig;
+ private Ipam ipamConfig;
/**
* FIXME verify
*/
@JsonProperty("Links")
- private List links;
+ private Links links;
/**
- * FIXME no docs, unknown field.
+ * Add network-scoped alias for the container
* Type picked from `docker/vendor/src/github.com/docker/engine-api/types/network/network.go`
*
* @since {@link RemoteApiVersion#VERSION_1_22}
@@ -80,6 +86,14 @@ public ContainerNetwork withAliases(List aliases) {
return this;
}
+ /**
+ * @see #aliases
+ */
+ public ContainerNetwork withAliases(String... aliases) {
+ this.aliases = Arrays.asList(aliases);
+ return this;
+ }
+
/**
* @see #endpointId
*/
@@ -155,7 +169,7 @@ public String getIpAddress() {
/**
* @see #ipAddress
*/
- public ContainerNetwork withIpAddress(String ipAddress) {
+ public ContainerNetwork withIpv4Address(String ipAddress) {
this.ipAddress = ipAddress;
return this;
}
@@ -164,14 +178,14 @@ public ContainerNetwork withIpAddress(String ipAddress) {
* @see #ipamConfig
*/
@CheckForNull
- public Network.Ipam.Config getIpamConfig() {
+ public Ipam getIpamConfig() {
return ipamConfig;
}
/**
* @see #ipamConfig
*/
- public ContainerNetwork withIpamConfig(Network.Ipam.Config ipamConfig) {
+ public ContainerNetwork withIpamConfig(Ipam ipamConfig) {
this.ipamConfig = ipamConfig;
return this;
}
@@ -212,15 +226,24 @@ public ContainerNetwork withIpV6Gateway(String ipV6Gateway) {
* @see #links
*/
@CheckForNull
- public List getLinks() {
- return links;
+ @JsonIgnore
+ public Link[] getLinks() {
+ return links == null ? new Link[0] : links.getLinks();
+ }
+
+ /**
+ * @see #links
+ */
+ public ContainerNetwork withLinks(List links) {
+ this.links = new Links(links);
+ return this;
}
/**
* @see #links
*/
- public ContainerNetwork withLinks(List links) {
- this.links = links;
+ public ContainerNetwork withLinks(Link... links) {
+ this.links = new Links(links);
return this;
}
@@ -270,4 +293,34 @@ public boolean equals(Object o) {
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
+
+ /**
+ * Docker named it EndpointIPAMConfig
+ */
+ public static class Ipam {
+
+ @JsonProperty("IPv4Address")
+ private String ipv4Address;
+
+ @JsonProperty("IPv6Address")
+ private String ipv6Address;
+
+ public String getIpv4Address() {
+ return ipv4Address;
+ }
+
+ public String getIpv6Address() {
+ return ipv6Address;
+ }
+
+ public Ipam withIpv4Address(String ipv4Address) {
+ this.ipv4Address = ipv4Address;
+ return this;
+ }
+
+ public Ipam withIpv6Address(String ipv6Address) {
+ this.ipv6Address = ipv6Address;
+ return this;
+ }
+ }
}
diff --git a/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
index 400ae29dd..19a6a9128 100644
--- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
@@ -11,6 +11,7 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.util.Arrays;
import java.util.List;
/**
@@ -21,6 +22,8 @@
@JsonInclude(Include.NON_NULL)
public class HostConfig {
+ private static final List PREDEFINED_NETWORKS = Arrays.asList("bridge", "host", "none");
+
@JsonProperty("Binds")
private Binds binds;
@@ -410,6 +413,15 @@ public String getVolumeDriver() {
return volumeDriver;
}
+ /**
+ * Parse the network mode as specified at
+ * {@see https://github.com/docker/engine-api/blob/master/types/container/hostconfig_unix.go}
+ */
+ @JsonIgnore
+ public boolean isUserDefinedNetwork() {
+ return networkMode != null && !PREDEFINED_NETWORKS.contains(networkMode) && !networkMode.startsWith("container:");
+ }
+
@JsonIgnore
public void setBinds(Bind... binds) {
this.binds = new Binds(binds);
diff --git a/src/main/java/com/github/dockerjava/api/model/Network.java b/src/main/java/com/github/dockerjava/api/model/Network.java
index 546904254..6f4114914 100644
--- a/src/main/java/com/github/dockerjava/api/model/Network.java
+++ b/src/main/java/com/github/dockerjava/api/model/Network.java
@@ -6,6 +6,7 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -111,16 +112,33 @@ public static class Ipam {
private String driver;
@JsonProperty("Config")
- List config = new ArrayList<>();
+ private List config = new ArrayList<>();
+
+ @JsonProperty("Options")
+ private Map options = null;
public String getDriver() {
return driver;
}
+ public Map getOptions() {
+ return options;
+ }
+
public List getConfig() {
return config;
}
+ public Ipam withConfig(List ipamConfigs) {
+ config = ipamConfigs;
+ return this;
+ }
+
+ public Ipam withConfig(Config... ipamConfigs) {
+ config = Arrays.asList(ipamConfigs);
+ return this;
+ }
+
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
@@ -149,6 +167,21 @@ public String getIpRange() {
public String getGateway() {
return gateway;
}
+
+ public Config withSubnet(String subnet) {
+ this.subnet = subnet;
+ return this;
+ }
+
+ public Config withIpRange(String ipRange) {
+ this.ipRange = ipRange;
+ return this;
+ }
+
+ public Config withGateway(String gateway) {
+ this.gateway = gateway;
+ return this;
+ }
}
}
}
diff --git a/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java
index 680048c18..1d523bf4b 100644
--- a/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java
+++ b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java
@@ -3,15 +3,12 @@
*/
package com.github.dockerjava.api.model;
-import java.util.Map;
-
-import org.apache.commons.lang.builder.ToStringBuilder;
-
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.github.dockerjava.core.RemoteApiVersion;
+import org.apache.commons.lang.builder.ToStringBuilder;
-import javax.annotation.CheckForNull;
+import java.util.Map;
/**
*
@@ -76,7 +73,7 @@ public class NetworkSettings {
private String macAddress;
@JsonProperty("Networks")
- private Map networks;
+ private Map networks;
/**
* @deprecated since {@link RemoteApiVersion#VERSION_1_21}
@@ -135,7 +132,7 @@ public String getIpV6Gateway() {
/**
* @since {@link RemoteApiVersion#VERSION_1_21}
*/
- public Map getNetworks() {
+ public Map getNetworks() {
return networks;
}
@@ -206,83 +203,4 @@ public Integer getGlobalIPv6PrefixLen() {
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
-
- @JsonIgnoreProperties(ignoreUnknown = true)
- public static class Network {
-
- @JsonProperty("IPAMConfig")
- private String ipamConfig;
-
- /**
- * @since {@link RemoteApiVersion#VERSION_1_22}
- */
- @JsonProperty("NetworkID")
- private String networkID;
-
- @JsonProperty("EndpointID")
- private String endpointId;
-
- @JsonProperty("Gateway")
- private String gateway;
-
- @JsonProperty("IPAddress")
- private String ipAddress;
-
- @JsonProperty("IPPrefixLen")
- private Integer ipPrefixLen;
-
- @JsonProperty("IPv6Gateway")
- private String ipV6Gateway;
-
- @JsonProperty("GlobalIPv6Address")
- private String globalIPv6Address;
-
- @JsonProperty("GlobalIPv6PrefixLen")
- private Integer globalIPv6PrefixLen;
-
- @JsonProperty("MacAddress")
- private String macAddress;
-
- @CheckForNull
- public String getNetworkID() {
- return networkID;
- }
-
- public String getEndpointId() {
- return endpointId;
- }
-
- public String getGateway() {
- return gateway;
- }
-
- public String getIpAddress() {
- return ipAddress;
- }
-
- public Integer getIpPrefixLen() {
- return ipPrefixLen;
- }
-
- public String getIpV6Gateway() {
- return ipV6Gateway;
- }
-
- public String getGlobalIPv6Address() {
- return globalIPv6Address;
- }
-
- public Integer getGlobalIPv6PrefixLen() {
- return globalIPv6PrefixLen;
- }
-
- public String getMacAddress() {
- return macAddress;
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
- }
}
diff --git a/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java
index 7014704b1..93fd8abb8 100644
--- a/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java
@@ -4,6 +4,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.github.dockerjava.api.command.ConnectToNetworkCmd;
import com.github.dockerjava.api.command.DockerCmdSyncExec;
+import com.github.dockerjava.api.model.ContainerNetwork;
public class ConnectToNetworkCmdImpl extends AbstrDockerCmd implements ConnectToNetworkCmd {
@@ -13,6 +14,9 @@ public class ConnectToNetworkCmdImpl extends AbstrDockerCmd execution) {
super(execution);
}
@@ -27,6 +31,11 @@ public String getContainerId() {
return containerId;
}
+ @Override
+ public ContainerNetwork getContainerConfig() {
+ return endpointConfig;
+ }
+
@Override
public ConnectToNetworkCmd withNetworkId(String networkId) {
this.networkId = networkId;
@@ -38,4 +47,10 @@ public ConnectToNetworkCmd withContainerId(String containerId) {
this.containerId = containerId;
return this;
}
+
+ @Override
+ public ConnectToNetworkCmd withContainerNetwork(ContainerNetwork endpointConfig) {
+ this.endpointConfig = endpointConfig;
+ return this;
+ }
}
diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
index 48b93a004..0b6944b04 100644
--- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
@@ -1,14 +1,5 @@
package com.github.dockerjava.core.command;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ToStringBuilder;
-
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@@ -19,6 +10,7 @@
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.Bind;
import com.github.dockerjava.api.model.Capability;
+import com.github.dockerjava.api.model.ContainerNetwork;
import com.github.dockerjava.api.model.Device;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.ExposedPorts;
@@ -33,6 +25,16 @@
import com.github.dockerjava.api.model.Volume;
import com.github.dockerjava.api.model.Volumes;
import com.github.dockerjava.api.model.VolumesFrom;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Collections.singletonMap;
/**
* Creates a new container.
@@ -113,6 +115,18 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd labels;
+ @JsonProperty("NetworkingConfig")
+ private NetworkingConfig networkingConfig;
+
+ @JsonIgnore
+ private String ipv4Address = null;
+
+ @JsonIgnore
+ private String ipv6Address = null;
+
+ @JsonIgnore
+ private List aliases = null;
+
public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) {
super(exec);
checkNotNull(image, "image was not specified");
@@ -127,9 +141,48 @@ public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) {
*/
@Override
public CreateContainerResponse exec() throws NotFoundException, ConflictException {
+ //code flow taken from https://github.com/docker/docker/blob/master/runconfig/opts/parse.go
+ ContainerNetwork containerNetwork = null;
+
+ if (ipv4Address != null || ipv6Address != null) {
+ containerNetwork = new ContainerNetwork()
+ .withIpamConfig(new ContainerNetwork.Ipam()
+ .withIpv4Address(ipv4Address)
+ .withIpv6Address(ipv6Address)
+ );
+
+ }
+
+ if (hostConfig.isUserDefinedNetwork() && hostConfig.getLinks().length > 0) {
+ if (containerNetwork == null) {
+ containerNetwork = new ContainerNetwork();
+ }
+
+ containerNetwork.withLinks(hostConfig.getLinks());
+ }
+
+ if (aliases != null) {
+ if (containerNetwork == null) {
+ containerNetwork = new ContainerNetwork();
+ }
+
+ containerNetwork.withAliases(aliases);
+ }
+
+ if (containerNetwork != null) {
+ networkingConfig = new NetworkingConfig()
+ .withEndpointsConfig(singletonMap(hostConfig.getNetworkMode(), containerNetwork));
+ }
+
return super.exec();
}
+ @Override
+ @JsonIgnore
+ public List getAliases() {
+ return aliases;
+ }
+
@Override
@JsonIgnore
public Bind[] getBinds() {
@@ -247,6 +300,16 @@ public String getImage() {
return image;
}
+ @Override
+ public String getIpv4Address() {
+ return ipv4Address;
+ }
+
+ @Override
+ public String getIpv6Address() {
+ return ipv6Address;
+ }
+
@Override
@JsonIgnore
public Map getLabels() {
@@ -414,6 +477,19 @@ public String getCgroupParent() {
return hostConfig.getCgroupParent();
}
+ @Override
+ public CreateContainerCmd withAliases(String... aliases) {
+ this.aliases = Arrays.asList(aliases);
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withAliases(List aliases) {
+ checkNotNull(aliases, "aliases was not specified");
+ this.aliases = aliases;
+ return this;
+ }
+
@Override
public CreateContainerCmd withAttachStderr(Boolean attachStderr) {
checkNotNull(attachStderr, "attachStderr was not specified");
@@ -648,6 +724,20 @@ public CreateContainerCmd withImage(String image) {
return this;
}
+ @Override
+ public CreateContainerCmd withIpv4Address(String ipv4Address) {
+ checkNotNull(ipv4Address, "no ipv4Address was specified");
+ this.ipv4Address = ipv4Address;
+ return this;
+ }
+
+ @Override
+ public CreateContainerCmd withIpv6Address(String ipv6Address) {
+ checkNotNull(ipv6Address, "no ipv6Address was specified");
+ this.ipv6Address = ipv6Address;
+ return this;
+ }
+
@Override
public CreateContainerCmd withLabels(Map labels) {
checkNotNull(labels, "labels was not specified");
@@ -900,4 +990,18 @@ public boolean equals(Object o) {
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
+
+ public static class NetworkingConfig {
+ @JsonProperty("EndpointsConfig")
+ public Map endpointsConfig;
+
+ public Map getEndpointsConfig() {
+ return endpointsConfig;
+ }
+
+ public NetworkingConfig withEndpointsConfig(Map endpointsConfig) {
+ this.endpointsConfig = endpointsConfig;
+ return this;
+ }
+ }
}
diff --git a/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java
index c7d3b0abb..834aa6905 100644
--- a/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java
@@ -25,6 +25,15 @@ public class CreateNetworkCmdImpl extends AbstrDockerCmd options = new HashMap<>();
+ @JsonProperty("CheckDuplicate")
+ private Boolean checkDuplicate;
+
+ @JsonProperty("Internal")
+ private Boolean internal;
+
+ @JsonProperty("EnableIPv6")
+ private Boolean enableIpv6;
+
public CreateNetworkCmdImpl(DockerCmdSyncExec execution) {
super(execution);
}
@@ -44,6 +53,26 @@ public Network.Ipam getIpam() {
return ipam;
}
+ @Override
+ public Map getOptions() {
+ return options;
+ }
+
+ @Override
+ public Boolean getCheckDuplicate() {
+ return checkDuplicate;
+ }
+
+ @Override
+ public Boolean getInternal() {
+ return internal;
+ }
+
+ @Override
+ public Boolean getEnableIPv6() {
+ return enableIpv6;
+ }
+
@Override
public CreateNetworkCmd withName(String name) {
this.name = name;
@@ -57,8 +86,8 @@ public CreateNetworkCmd withDriver(String driver) {
}
@Override
- public CreateNetworkCmd withIpamConfig(Ipam.Config config) {
- this.ipam.getConfig().add(config);
+ public CreateNetworkCmd withIpam(Ipam ipam) {
+ this.ipam = ipam;
return this;
}
@@ -67,4 +96,22 @@ public CreateNetworkCmd withOptions(Map options) {
this.options = options;
return this;
}
+
+ @Override
+ public CreateNetworkCmd withCheckDuplicate(boolean checkDuplicate) {
+ this.checkDuplicate = checkDuplicate;
+ return this;
+ }
+
+ @Override
+ public CreateNetworkCmd withInternal(boolean internal) {
+ this.internal = internal;
+ return this;
+ }
+
+ @Override
+ public CreateNetworkCmd withEnableIpv6(boolean enableIpv6) {
+ this.enableIpv6 = enableIpv6;
+ return this;
+ }
}
diff --git a/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java
index ae24946b6..b871b36c6 100644
--- a/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java
@@ -14,6 +14,9 @@ public class DisconnectFromNetworkCmdImpl extends AbstrDockerCmd execution) {
super(execution);
}
@@ -28,6 +31,11 @@ public String getContainerId() {
return containerId;
}
+ @Override
+ public Boolean getForce() {
+ return force;
+ }
+
@Override
public DisconnectFromNetworkCmd withNetworkId(String networkId) {
this.networkId = networkId;
@@ -39,4 +47,10 @@ public DisconnectFromNetworkCmd withContainerId(String containerId) {
this.containerId = containerId;
return this;
}
+
+ @Override
+ public DisconnectFromNetworkCmd withForce(Boolean force) {
+ this.force = force;
+ return this;
+ }
}
diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java
index ced7279f9..cc9465244 100644
--- a/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java
@@ -14,7 +14,6 @@ public RemoveNetworkCmdImpl(DockerCmdSyncExec execution,
@Override
public String getNetworkId() {
-
return networkId;
}
diff --git a/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java
index ad051e0bd..f67994de6 100644
--- a/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java
@@ -1,7 +1,11 @@
package com.github.dockerjava.core.command;
-import java.lang.reflect.Method;
-
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.CreateNetworkResponse;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.model.ContainerNetwork;
+import com.github.dockerjava.api.model.Network;
+import com.github.dockerjava.client.AbstractDockerClientTest;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
@@ -9,11 +13,8 @@
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
-import com.github.dockerjava.api.command.CreateContainerResponse;
-import com.github.dockerjava.api.command.CreateNetworkResponse;
-import com.github.dockerjava.api.command.InspectContainerResponse;
-import com.github.dockerjava.api.model.Network;
-import com.github.dockerjava.client.AbstractDockerClientTest;
+import java.lang.reflect.Method;
+import java.util.Collections;
@Test(groups = "integration")
public class ConnectToNetworkCmdImplTest extends AbstractDockerClientTest {
@@ -56,4 +57,41 @@ public void connectToNetwork() throws InterruptedException {
assertNotNull(inspectContainerResponse.getNetworkSettings().getNetworks().get("testNetwork"));
}
+
+ @Test
+ public void connectToNetworkWithContainerNetwork() throws InterruptedException {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ CreateNetworkResponse network = dockerClient.createNetworkCmd()
+ .withName("testNetwork")
+ .withIpam(new Network.Ipam()
+ .withConfig(new Network.Ipam.Config()
+ .withSubnet("10.100.100.0/24")))
+ .exec();
+
+ dockerClient.connectToNetworkCmd()
+ .withNetworkId(network.getId())
+ .withContainerId(container.getId())
+ .withContainerNetwork(new ContainerNetwork()
+ .withAliases("testing")
+ .withIpamConfig(new ContainerNetwork.Ipam()
+ .withIpv4Address("10.100.100.100")))
+ .exec();
+
+ Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec();
+
+ Network.ContainerNetworkConfig containerNetworkConfig = updatedNetwork.getContainers().get(container.getId());
+ assertNotNull(containerNetworkConfig);
+ assertEquals("10.100.100.100", containerNetworkConfig.getIpv4Address());
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ ContainerNetwork testNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get("testNetwork");
+ assertNotNull(testNetwork);
+ assertEquals(Collections.singletonList("testing"), testNetwork.getAliases());
+ assertEquals("10.100.100.0", testNetwork.getGateway());
+ assertEquals("10.100.100.100", testNetwork.getIpAddress());
+ }
}
diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
index f2fd32b6a..682edc4ce 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -1,15 +1,18 @@
package com.github.dockerjava.core.command;
import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.CreateNetworkResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.exception.ConflictException;
import com.github.dockerjava.api.exception.DockerException;
import com.github.dockerjava.api.model.Bind;
+import com.github.dockerjava.api.model.ContainerNetwork;
import com.github.dockerjava.api.model.Device;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.api.model.Link;
import com.github.dockerjava.api.model.LogConfig;
+import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.api.model.Ports;
import com.github.dockerjava.api.model.RestartPolicy;
import com.github.dockerjava.api.model.Ulimit;
@@ -22,10 +25,12 @@
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
+import org.testng.internal.junit.ArrayAsserts;
import java.lang.reflect.Method;
import java.security.SecureRandom;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@@ -268,6 +273,107 @@ public void createContainerWithLink() throws DockerException {
"container1Link")}));
}
+ @Test
+ public void createContainerWithLinkInCustomNetwork() throws DockerException {
+
+ CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd()
+ .withName("linkNet")
+ .exec();
+
+ assertNotNull(createNetworkResponse.getId());
+
+ CreateContainerResponse container1 = dockerClient.createContainerCmd(BUSYBOX_IMAGE)
+ .withNetworkMode("linkNet")
+ .withCmd("sleep", "9999")
+ .withName("container1")
+ .exec();
+
+ assertThat(container1.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container1.getId()).exec();
+
+ InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId())
+ .exec();
+ LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString());
+ assertThat(inspectContainerResponse1.getState().getRunning(), is(true));
+
+ CreateContainerResponse container2 = dockerClient.createContainerCmd(BUSYBOX_IMAGE)
+ .withNetworkMode("linkNet")
+ .withName("container2")
+ .withCmd("env")
+ .withLinks(new Link("container1", "container1Link"))
+ .exec();
+
+ LOG.info("Created container {}", container2.toString());
+ assertThat(container2.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId())
+ .exec();
+
+ ContainerNetwork linkNet = inspectContainerResponse2.getNetworkSettings().getNetworks().get("linkNet");
+ assertNotNull(linkNet);
+ ArrayAsserts.assertArrayEquals(new Link[]{ new Link("container1", "container1Link")}, linkNet.getLinks());
+ }
+
+ @Test
+ public void createContainerWithCustomIp() throws DockerException {
+
+ CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd()
+ .withIpam(new Network.Ipam()
+ .withConfig(new Network.Ipam.Config()
+ .withSubnet("10.100.101.0/24")))
+ .withName("customIpNet")
+ .exec();
+
+ assertNotNull(createNetworkResponse.getId());
+
+ CreateContainerResponse container = dockerClient.createContainerCmd(BUSYBOX_IMAGE)
+ .withNetworkMode("customIpNet")
+ .withCmd("sleep", "9999")
+ .withName("container")
+ .withIpv4Address("10.100.101.100")
+ .exec();
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId())
+ .exec();
+
+ ContainerNetwork customIpNet = inspectContainerResponse.getNetworkSettings().getNetworks().get("customIpNet");
+ assertNotNull(customIpNet);
+ assertEquals("10.100.101.0", customIpNet.getGateway());
+ assertEquals("10.100.101.100", customIpNet.getIpAddress());
+ }
+
+ @Test
+ public void createContainerWithAlias() throws DockerException {
+
+ CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd()
+ .withName("aliasNet")
+ .exec();
+
+ assertNotNull(createNetworkResponse.getId());
+
+ CreateContainerResponse container = dockerClient.createContainerCmd(BUSYBOX_IMAGE)
+ .withNetworkMode("aliasNet")
+ .withCmd("sleep", "9999")
+ .withName("container")
+ .withAliases("server")
+ .exec();
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId())
+ .exec();
+
+ ContainerNetwork aliasNet = inspectContainerResponse.getNetworkSettings().getNetworks().get("aliasNet");
+ assertEquals(Collections.singletonList("server"), aliasNet.getAliases());
+ }
+
@Test
public void createContainerWithCapAddAndCapDrop() throws DockerException {
diff --git a/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java
index 7f94c5a0f..c4219b54e 100644
--- a/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java
@@ -56,4 +56,26 @@ public void disconnectFromNetwork() throws InterruptedException {
assertFalse(updatedNetwork.getContainers().containsKey(container.getId()));
}
+
+ @Test
+ public void forceDisconnectFromNetwork() throws InterruptedException {
+
+ CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("testNetwork").exec();
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withNetworkMode("testNetwork")
+ .withCmd("sleep", "9999")
+ .exec();
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ dockerClient.disconnectFromNetworkCmd()
+ .withNetworkId(network.getId())
+ .withContainerId(container.getId())
+ .withForce(true)
+ .exec();
+
+ Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec();
+ assertFalse(updatedNetwork.getContainers().containsKey(container.getId()));
+ }
}
From a1d1e3dfda7a2ade9304c990f73d42aa573ef342 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Tue, 24 May 2016 14:19:28 -0600
Subject: [PATCH 003/736] Fixes Issue #584
Adds RootDir property to GraphData. This was seen on a
CentOS system without aufs support.
---
.../dockerjava/api/command/GraphData.java | 26 ++-
.../api/command/InspectImageResponseTest.java | 197 +++++++++---------
2 files changed, 122 insertions(+), 101 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/GraphData.java b/src/main/java/com/github/dockerjava/api/command/GraphData.java
index dc55810ba..a00f44e5d 100644
--- a/src/main/java/com/github/dockerjava/api/command/GraphData.java
+++ b/src/main/java/com/github/dockerjava/api/command/GraphData.java
@@ -1,17 +1,23 @@
package com.github.dockerjava.api.command;
-import com.fasterxml.jackson.annotation.JsonProperty;
+import javax.annotation.CheckForNull;
+
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
-import javax.annotation.CheckForNull;
+import com.fasterxml.jackson.annotation.JsonProperty;
/**
* part of {@link GraphDriver}
+ *
* @author Kanstantsin Shautsou
*/
public class GraphData {
+
+ @JsonProperty("RootDir")
+ private String rootDir;
+
@JsonProperty("DeviceId")
private String deviceId;
@@ -21,6 +27,22 @@ public class GraphData {
@JsonProperty("DeviceSize")
private String deviceSize;
+ /**
+ * @see #rootDir
+ */
+ @CheckForNull
+ public String getRootDir() {
+ return rootDir;
+ }
+
+ /**
+ * @see #deviceId
+ */
+ public GraphData withRootDir(String rootDir) {
+ this.rootDir = rootDir;
+ return this;
+ }
+
/**
* @see #deviceId
*/
diff --git a/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java b/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java
index 410d5b32a..e7cd2aaa8 100644
--- a/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java
+++ b/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java
@@ -1,13 +1,5 @@
package com.github.dockerjava.api.command;
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.dockerjava.api.model.ContainerConfig;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.Collections;
-
import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_22;
import static com.github.dockerjava.test.serdes.JSONSamples.testRoundTrip;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -21,65 +13,72 @@
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
+import java.io.IOException;
+import java.util.Collections;
+
+import org.testng.annotations.Test;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.dockerjava.api.model.ContainerConfig;
+
/**
* @author Kanstantsin Shautsou
*/
public class InspectImageResponseTest {
+
@Test
public void serder1_22Json() throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final JavaType type = mapper.getTypeFactory().constructType(InspectImageResponse.class);
- final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22,
- "images/image1/inspect1.json",
- type
- );
-
- final ContainerConfig config = new ContainerConfig()
- .withAttachStderr(false)
- .withAttachStdin(false)
- .withAttachStdout(false)
- .withCmd(null)
- .withDomainName("")
- .withEntrypoint(null)
- .withEnv(new String[]{"HOME=/", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"})
- .withExposedPorts(null)
- .withHostName("aee9ba801acc")
- .withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
- .withLabels(null)
- .withMacAddress(null)
- .withNetworkDisabled(null)
- .withOnBuild(new String[]{})
- .withStdinOpen(false)
- .withPortSpecs(null)
- .withStdInOnce(false)
- .withTty(false)
- .withUser("")
- .withVolumes(null)
- .withWorkingDir("");
-
- final ContainerConfig containerConfig = new ContainerConfig()
- .withAttachStderr(false)
- .withAttachStdin(false)
- .withAttachStdout(false)
- .withCmd(new String[]{"/bin/sh", "-c", "#(nop) MAINTAINER hack@worldticket.net"})
- .withDomainName("")
- .withEntrypoint(null)
- .withEnv(new String[]{"HOME=/", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"})
- .withExposedPorts(null)
- .withHostName("aee9ba801acc")
- .withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
- .withLabels(null)
- .withMacAddress(null)
- .withNetworkDisabled(null)
- .withOnBuild(new String[]{})
- .withStdinOpen(false)
- .withPortSpecs(null)
- .withStdInOnce(false)
- .withTty(false)
- .withUser("")
- .withVolumes(null)
- .withWorkingDir("");
+ final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/image1/inspect1.json", type);
+
+ final ContainerConfig config = new ContainerConfig().withAttachStderr(false)
+ .withAttachStdin(false)
+ .withAttachStdout(false)
+ .withCmd(null)
+ .withDomainName("")
+ .withEntrypoint(null)
+ .withEnv(new String[] { "HOME=/",
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" })
+ .withExposedPorts(null)
+ .withHostName("aee9ba801acc")
+ .withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
+ .withLabels(null)
+ .withMacAddress(null)
+ .withNetworkDisabled(null)
+ .withOnBuild(new String[] {})
+ .withStdinOpen(false)
+ .withPortSpecs(null)
+ .withStdInOnce(false)
+ .withTty(false)
+ .withUser("")
+ .withVolumes(null)
+ .withWorkingDir("");
+
+ final ContainerConfig containerConfig = new ContainerConfig().withAttachStderr(false)
+ .withAttachStdin(false)
+ .withAttachStdout(false)
+ .withCmd(new String[] { "/bin/sh", "-c", "#(nop) MAINTAINER hack@worldticket.net" })
+ .withDomainName("")
+ .withEntrypoint(null)
+ .withEnv(new String[] { "HOME=/",
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" })
+ .withExposedPorts(null)
+ .withHostName("aee9ba801acc")
+ .withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
+ .withLabels(null)
+ .withMacAddress(null)
+ .withNetworkDisabled(null)
+ .withOnBuild(new String[] {})
+ .withStdinOpen(false)
+ .withPortSpecs(null)
+ .withStdInOnce(false)
+ .withTty(false)
+ .withUser("")
+ .withVolumes(null)
+ .withWorkingDir("");
assertThat(inspectImage, notNullValue());
assertThat(inspectImage.getArch(), is("amd64"));
@@ -113,52 +112,41 @@ public void serder1_22Json() throws IOException {
assertThat(inspectImage.getVirtualSize(), is(0L));
-
final InspectImageResponse inspectImageResponse = new InspectImageResponse().withArch("amd64")
- .withAuthor("hack@worldticket.net")
- .withComment("")
- .withConfig(config)
- .withContainer("aee9ba801acca0e648ffd91df204ba82ae85d97608a4864a019e2004d7e1b133")
- .withContainerConfig(containerConfig)
- .withCreated("2014-04-29T19:59:10.84997669Z")
- .withDockerVersion("0.8.1")
- .withId("sha256:ee45fe0d1fcdf1a0f9c2d1e36c6f4b3202bbb2032f14d7c9312b27bfcf6aee24")
- .withOs("linux")
- .withParent("")
- .withSize(0L)
- .withRepoTags(Collections.singletonList("hackmann/empty:latest"))
- .withRepoDigests(Collections.emptyList())
- .withVirtualSize(0L)
- .withGraphDriver(aufsGraphDriver);
+ .withAuthor("hack@worldticket.net")
+ .withComment("")
+ .withConfig(config)
+ .withContainer("aee9ba801acca0e648ffd91df204ba82ae85d97608a4864a019e2004d7e1b133")
+ .withContainerConfig(containerConfig)
+ .withCreated("2014-04-29T19:59:10.84997669Z")
+ .withDockerVersion("0.8.1")
+ .withId("sha256:ee45fe0d1fcdf1a0f9c2d1e36c6f4b3202bbb2032f14d7c9312b27bfcf6aee24")
+ .withOs("linux")
+ .withParent("")
+ .withSize(0L)
+ .withRepoTags(Collections.singletonList("hackmann/empty:latest"))
+ .withRepoDigests(Collections. emptyList())
+ .withVirtualSize(0L)
+ .withGraphDriver(aufsGraphDriver);
assertThat(inspectImage, equalTo(inspectImageResponse));
}
-
@Test
public void serder1_22_doc() throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final JavaType type = mapper.getTypeFactory().constructType(InspectImageResponse.class);
- final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22,
- "images/docImage/doc.json",
- type
- );
+ final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/docImage/doc.json", type);
assertThat(inspectImage, notNullValue());
assertThat(inspectImage.getRepoDigests(), hasSize(1));
assertThat(inspectImage.getRepoDigests(),
- contains("localhost:5000/test/busybox/example@" +
- "sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf")
- );
+ contains("localhost:5000/test/busybox/example@" + "sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"));
assertThat(inspectImage.getRepoTags(), hasSize(3));
- assertThat(inspectImage.getRepoTags(), containsInAnyOrder(
- "example:1.0",
- "example:latest",
- "example:stable"
- ));
+ assertThat(inspectImage.getRepoTags(), containsInAnyOrder("example:1.0", "example:latest", "example:stable"));
}
@Test
@@ -166,15 +154,11 @@ public void serder1_22_inspect_doc() throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final JavaType type = mapper.getTypeFactory().constructType(InspectImageResponse.class);
- final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22,
- "images/docImage/inspect_doc.json",
- type
- );
+ final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/docImage/inspect_doc.json", type);
- GraphData newGraphData = new GraphData()
- .withDeviceId("5")
- .withDeviceName("docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47")
- .withDeviceSize("171798691840");
+ GraphData newGraphData = new GraphData().withDeviceId("5")
+ .withDeviceName("docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47")
+ .withDeviceSize("171798691840");
assertThat(inspectImage, notNullValue());
GraphDriver graphDriver = inspectImage.getGraphDriver();
@@ -184,9 +168,24 @@ public void serder1_22_inspect_doc() throws IOException {
assertThat(data, is(newGraphData));
assertThat(data.getDeviceId(), is("5"));
- assertThat(data.getDeviceName(),
- is("docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47"));
- assertThat(data.getDeviceSize(),
- is("171798691840"));
+ assertThat(data.getDeviceName(), is("docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47"));
+ assertThat(data.getDeviceSize(), is("171798691840"));
+ }
+
+ @Test
+ private void testOverlayNetworkRootDir() throws IOException {
+ final ObjectMapper mapper = new ObjectMapper();
+ final JavaType type = mapper.getTypeFactory().constructType(InspectImageResponse.class);
+
+ final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/overlay/inspectOverlay.json", type);
+
+ final GraphData overlayGraphData = new GraphData().withRootDir("/var/lib/docker/overlay/7e8d362d6b78d47eafe4863fd129cbcada35dbd419d7188cc1dbf1233d505576/root");
+ final GraphDriver overlayGraphDriver = new GraphDriver().withName("overlay").withData(overlayGraphData);
+ final GraphDriver graphDriver = inspectImage.getGraphDriver();
+ assertThat(graphDriver, notNullValue());
+ assertThat(graphDriver, equalTo(overlayGraphDriver));
+ assertThat(graphDriver.getName(), is("overlay"));
+ assertThat(graphDriver.getData(), equalTo(overlayGraphData));
+
}
}
\ No newline at end of file
From 3f71f1f165d652ceb044151c9abea2b1707d56c9 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Tue, 24 May 2016 14:19:28 -0600
Subject: [PATCH 004/736] Fixes Issue #584
Adds RootDir property to GraphData. This was seen on a
CentOS system without aufs support.
---
.../api/command/InspectImageResponseTest.java | 128 +++++++++---------
.../1.22/images/overlay/inspectOverlay.json | 93 +++++++++++++
2 files changed, 157 insertions(+), 64 deletions(-)
create mode 100644 src/test/resources/samples/1.22/images/overlay/inspectOverlay.json
diff --git a/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java b/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java
index e7cd2aaa8..5bce25a48 100644
--- a/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java
+++ b/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java
@@ -34,51 +34,49 @@ public void serder1_22Json() throws IOException {
final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/image1/inspect1.json", type);
- final ContainerConfig config = new ContainerConfig().withAttachStderr(false)
- .withAttachStdin(false)
- .withAttachStdout(false)
- .withCmd(null)
- .withDomainName("")
- .withEntrypoint(null)
- .withEnv(new String[] { "HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" })
- .withExposedPorts(null)
- .withHostName("aee9ba801acc")
- .withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
- .withLabels(null)
- .withMacAddress(null)
- .withNetworkDisabled(null)
- .withOnBuild(new String[] {})
- .withStdinOpen(false)
- .withPortSpecs(null)
- .withStdInOnce(false)
- .withTty(false)
- .withUser("")
- .withVolumes(null)
- .withWorkingDir("");
+ final ContainerConfig config = new ContainerConfig().withAttachStdout(false)
+ .withCmd(null)
+ .withDomainName("")
+ .withEntrypoint(null)
+ .withEnv(new String[] {"HOME=/",
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"})
+ .withExposedPorts(null)
+ .withHostName("aee9ba801acc")
+ .withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
+ .withLabels(null)
+ .withMacAddress(null)
+ .withNetworkDisabled(null)
+ .withOnBuild(new String[] {})
+ .withStdinOpen(false)
+ .withPortSpecs(null)
+ .withStdInOnce(false)
+ .withTty(false)
+ .withUser("")
+ .withVolumes(null)
+ .withWorkingDir("");
final ContainerConfig containerConfig = new ContainerConfig().withAttachStderr(false)
- .withAttachStdin(false)
- .withAttachStdout(false)
- .withCmd(new String[] { "/bin/sh", "-c", "#(nop) MAINTAINER hack@worldticket.net" })
- .withDomainName("")
- .withEntrypoint(null)
- .withEnv(new String[] { "HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" })
- .withExposedPorts(null)
- .withHostName("aee9ba801acc")
- .withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
- .withLabels(null)
- .withMacAddress(null)
- .withNetworkDisabled(null)
- .withOnBuild(new String[] {})
- .withStdinOpen(false)
- .withPortSpecs(null)
- .withStdInOnce(false)
- .withTty(false)
- .withUser("")
- .withVolumes(null)
- .withWorkingDir("");
+ .withAttachStdin(false)
+ .withAttachStdout(false)
+ .withCmd(new String[] {"/bin/sh", "-c", "#(nop) MAINTAINER hack@worldticket.net"})
+ .withDomainName("")
+ .withEntrypoint(null)
+ .withEnv(new String[] {"HOME=/",
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"})
+ .withExposedPorts(null)
+ .withHostName("aee9ba801acc")
+ .withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
+ .withLabels(null)
+ .withMacAddress(null)
+ .withNetworkDisabled(null)
+ .withOnBuild(new String[] {})
+ .withStdinOpen(false)
+ .withPortSpecs(null)
+ .withStdInOnce(false)
+ .withTty(false)
+ .withUser("")
+ .withVolumes(null)
+ .withWorkingDir("");
assertThat(inspectImage, notNullValue());
assertThat(inspectImage.getArch(), is("amd64"));
@@ -113,21 +111,21 @@ public void serder1_22Json() throws IOException {
assertThat(inspectImage.getVirtualSize(), is(0L));
final InspectImageResponse inspectImageResponse = new InspectImageResponse().withArch("amd64")
- .withAuthor("hack@worldticket.net")
- .withComment("")
- .withConfig(config)
- .withContainer("aee9ba801acca0e648ffd91df204ba82ae85d97608a4864a019e2004d7e1b133")
- .withContainerConfig(containerConfig)
- .withCreated("2014-04-29T19:59:10.84997669Z")
- .withDockerVersion("0.8.1")
- .withId("sha256:ee45fe0d1fcdf1a0f9c2d1e36c6f4b3202bbb2032f14d7c9312b27bfcf6aee24")
- .withOs("linux")
- .withParent("")
- .withSize(0L)
- .withRepoTags(Collections.singletonList("hackmann/empty:latest"))
- .withRepoDigests(Collections. emptyList())
- .withVirtualSize(0L)
- .withGraphDriver(aufsGraphDriver);
+ .withAuthor("hack@worldticket.net")
+ .withComment("")
+ .withConfig(config)
+ .withContainer("aee9ba801acca0e648ffd91df204ba82ae85d97608a4864a019e2004d7e1b133")
+ .withContainerConfig(containerConfig)
+ .withCreated("2014-04-29T19:59:10.84997669Z")
+ .withDockerVersion("0.8.1")
+ .withId("sha256:ee45fe0d1fcdf1a0f9c2d1e36c6f4b3202bbb2032f14d7c9312b27bfcf6aee24")
+ .withOs("linux")
+ .withParent("")
+ .withSize(0L)
+ .withRepoTags(Collections.singletonList("hackmann/empty:latest"))
+ .withRepoDigests(Collections. emptyList())
+ .withVirtualSize(0L)
+ .withGraphDriver(aufsGraphDriver);
assertThat(inspectImage, equalTo(inspectImageResponse));
}
@@ -143,7 +141,9 @@ public void serder1_22_doc() throws IOException {
assertThat(inspectImage.getRepoDigests(), hasSize(1));
assertThat(inspectImage.getRepoDigests(),
- contains("localhost:5000/test/busybox/example@" + "sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"));
+
+ contains("localhost:5000/test/busybox/example@"
+ + "sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"));
assertThat(inspectImage.getRepoTags(), hasSize(3));
assertThat(inspectImage.getRepoTags(), containsInAnyOrder("example:1.0", "example:latest", "example:stable"));
@@ -157,9 +157,8 @@ public void serder1_22_inspect_doc() throws IOException {
final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/docImage/inspect_doc.json", type);
GraphData newGraphData = new GraphData().withDeviceId("5")
- .withDeviceName("docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47")
- .withDeviceSize("171798691840");
-
+ .withDeviceName("docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47")
+ .withDeviceSize("171798691840");
assertThat(inspectImage, notNullValue());
GraphDriver graphDriver = inspectImage.getGraphDriver();
assertThat(graphDriver, notNullValue());
@@ -179,7 +178,8 @@ private void testOverlayNetworkRootDir() throws IOException {
final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/overlay/inspectOverlay.json", type);
- final GraphData overlayGraphData = new GraphData().withRootDir("/var/lib/docker/overlay/7e8d362d6b78d47eafe4863fd129cbcada35dbd419d7188cc1dbf1233d505576/root");
+ final GraphData overlayGraphData = new GraphData()
+ .withRootDir("/var/lib/docker/overlay/7e8d362d6b78d47eafe4863fd129cbcada35dbd419d7188cc1dbf1233d505576/root");
final GraphDriver overlayGraphDriver = new GraphDriver().withName("overlay").withData(overlayGraphData);
final GraphDriver graphDriver = inspectImage.getGraphDriver();
assertThat(graphDriver, notNullValue());
@@ -188,4 +188,4 @@ private void testOverlayNetworkRootDir() throws IOException {
assertThat(graphDriver.getData(), equalTo(overlayGraphData));
}
-}
\ No newline at end of file
+}
diff --git a/src/test/resources/samples/1.22/images/overlay/inspectOverlay.json b/src/test/resources/samples/1.22/images/overlay/inspectOverlay.json
new file mode 100644
index 000000000..7e3fe0bea
--- /dev/null
+++ b/src/test/resources/samples/1.22/images/overlay/inspectOverlay.json
@@ -0,0 +1,93 @@
+{
+ "Id": "sha256:0ac989a7cba2ce7f5fbe5d520b338e780055ec251371ee35f7462ae9944696c5",
+ "RepoTags": [
+ "test-image:latest"
+ ],
+ "RepoDigests": [],
+ "Parent": "",
+ "Comment": "",
+ "Created": "2016-05-24T19:25:01.31608131Z",
+ "Container": "221f000eccdec85b74cd4f4f37c7c0392d0f620bee45e9618cac3e57409a6d2c",
+ "ContainerConfig": {
+ "Hostname": "6ea525e7ec5c",
+ "Domainname": "",
+ "User": "",
+ "AttachStdin": false,
+ "AttachStdout": false,
+ "AttachStderr": false,
+ "Tty": false,
+ "OpenStdin": false,
+ "StdinOnce": false,
+ "Env": [
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+ ],
+ "Cmd": [
+ "/bin/sh",
+ "-c",
+ "#(nop) ENTRYPOINT [\"bin/run.sh\"]"
+ ],
+ "Image": "sha256:f8321fac5b5484874c1c5c02719905ec815c8ad20c2bc66222cfde19cd0491b7",
+ "Volumes": {
+ "/var/lib/docker": {}
+ },
+ "WorkingDir": "/opt",
+ "Entrypoint": [
+ "bin/run.sh"
+ ],
+ "OnBuild": [],
+ "Labels": {}
+ },
+ "DockerVersion": "1.11.1",
+ "Author": "",
+ "Config": {
+ "Hostname": "6ea525e7ec5c",
+ "Domainname": "",
+ "User": "",
+ "AttachStdin": false,
+ "AttachStdout": false,
+ "AttachStderr": false,
+ "Tty": false,
+ "OpenStdin": false,
+ "StdinOnce": false,
+ "Env": [
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+ ],
+ "Cmd": null,
+ "Image": "sha256:f8321fac5b5484874c1c5c02719905ec815c8ad20c2bc66222cfde19cd0491b7",
+ "Volumes": {
+ "/var/lib/docker": {}
+ },
+ "WorkingDir": "/opt",
+ "Entrypoint": [
+ "bin/run.sh"
+ ],
+ "OnBuild": [],
+ "Labels": {}
+ },
+ "Architecture": "amd64",
+ "Os": "linux",
+ "Size": 345943268,
+ "VirtualSize": 345943268,
+ "GraphDriver": {
+ "Name": "overlay",
+ "Data": {
+ "RootDir": "/var/lib/docker/overlay/7e8d362d6b78d47eafe4863fd129cbcada35dbd419d7188cc1dbf1233d505576/root"
+ }
+ },
+ "RootFS": {
+ "Type": "layers",
+ "Layers": [
+ "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
+ "sha256:bd8153423e4131205018c431283e0a08298b291838db9bc6c19620523f5a818c",
+ "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
+ "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
+ "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
+ "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
+ "sha256:bb0716c3f5f5be1e5ee6912f7e9f44193898e0b3ed9031a0416f8ca262e89975",
+ "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
+ "sha256:58845ae9bfa7659900a9b30abb2c96330eff09bfbc6521ea77937ba60f8cc131",
+ "sha256:8c22161a61c24eb6f7aa130d45189354fd8dbe9467e5b2debf828908113eacb0",
+ "sha256:0c0c9045d2542e7845a2bdd8ead0e0fb2722be2c07c5553838dd61ffe051d672"
+ ]
+ }
+}
\ No newline at end of file
From 9b8ca72947b771c6fbeda00d17b9382fed2c09a6 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Tue, 24 May 2016 14:19:28 -0600
Subject: [PATCH 005/736] Fixes Issue #584
Adds RootDir property to GraphData. This was seen on a
CentOS system without aufs support.
---
.../dockerjava/api/command/GraphData.java | 6 +-
.../api/command/InspectImageResponseTest.java | 80 ++++++++++++-------
2 files changed, 51 insertions(+), 35 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/GraphData.java b/src/main/java/com/github/dockerjava/api/command/GraphData.java
index a00f44e5d..1aac8db84 100644
--- a/src/main/java/com/github/dockerjava/api/command/GraphData.java
+++ b/src/main/java/com/github/dockerjava/api/command/GraphData.java
@@ -1,16 +1,14 @@
package com.github.dockerjava.api.command;
-import javax.annotation.CheckForNull;
-
+import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
-import com.fasterxml.jackson.annotation.JsonProperty;
+import javax.annotation.CheckForNull;
/**
* part of {@link GraphDriver}
- *
* @author Kanstantsin Shautsou
*/
public class GraphData {
diff --git a/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java b/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java
index 5bce25a48..4c604e6a0 100644
--- a/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java
+++ b/src/test/java/com/github/dockerjava/api/command/InspectImageResponseTest.java
@@ -1,5 +1,13 @@
package com.github.dockerjava.api.command;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.dockerjava.api.model.ContainerConfig;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.util.Collections;
+
import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_22;
import static com.github.dockerjava.test.serdes.JSONSamples.testRoundTrip;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -13,40 +21,35 @@
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
-import java.io.IOException;
-import java.util.Collections;
-
-import org.testng.annotations.Test;
-
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.dockerjava.api.model.ContainerConfig;
-
/**
* @author Kanstantsin Shautsou
*/
public class InspectImageResponseTest {
-
@Test
public void serder1_22Json() throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final JavaType type = mapper.getTypeFactory().constructType(InspectImageResponse.class);
- final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/image1/inspect1.json", type);
+ final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22,
+ "images/image1/inspect1.json",
+ type
+ );
- final ContainerConfig config = new ContainerConfig().withAttachStdout(false)
+ final ContainerConfig config = new ContainerConfig()
+ .withAttachStderr(false)
+ .withAttachStdin(false)
+ .withAttachStdout(false)
.withCmd(null)
.withDomainName("")
.withEntrypoint(null)
- .withEnv(new String[] {"HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"})
+ .withEnv(new String[]{"HOME=/", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"})
.withExposedPorts(null)
.withHostName("aee9ba801acc")
.withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
.withLabels(null)
.withMacAddress(null)
.withNetworkDisabled(null)
- .withOnBuild(new String[] {})
+ .withOnBuild(new String[]{})
.withStdinOpen(false)
.withPortSpecs(null)
.withStdInOnce(false)
@@ -55,21 +58,21 @@ public void serder1_22Json() throws IOException {
.withVolumes(null)
.withWorkingDir("");
- final ContainerConfig containerConfig = new ContainerConfig().withAttachStderr(false)
+ final ContainerConfig containerConfig = new ContainerConfig()
+ .withAttachStderr(false)
.withAttachStdin(false)
.withAttachStdout(false)
- .withCmd(new String[] {"/bin/sh", "-c", "#(nop) MAINTAINER hack@worldticket.net"})
+ .withCmd(new String[]{"/bin/sh", "-c", "#(nop) MAINTAINER hack@worldticket.net"})
.withDomainName("")
.withEntrypoint(null)
- .withEnv(new String[] {"HOME=/",
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"})
+ .withEnv(new String[]{"HOME=/", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"})
.withExposedPorts(null)
.withHostName("aee9ba801acc")
.withImage("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")
.withLabels(null)
.withMacAddress(null)
.withNetworkDisabled(null)
- .withOnBuild(new String[] {})
+ .withOnBuild(new String[]{})
.withStdinOpen(false)
.withPortSpecs(null)
.withStdInOnce(false)
@@ -110,6 +113,7 @@ public void serder1_22Json() throws IOException {
assertThat(inspectImage.getVirtualSize(), is(0L));
+
final InspectImageResponse inspectImageResponse = new InspectImageResponse().withArch("amd64")
.withAuthor("hack@worldticket.net")
.withComment("")
@@ -123,30 +127,38 @@ public void serder1_22Json() throws IOException {
.withParent("")
.withSize(0L)
.withRepoTags(Collections.singletonList("hackmann/empty:latest"))
- .withRepoDigests(Collections. emptyList())
+ .withRepoDigests(Collections.emptyList())
.withVirtualSize(0L)
.withGraphDriver(aufsGraphDriver);
assertThat(inspectImage, equalTo(inspectImageResponse));
}
+
@Test
public void serder1_22_doc() throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final JavaType type = mapper.getTypeFactory().constructType(InspectImageResponse.class);
- final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/docImage/doc.json", type);
+ final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22,
+ "images/docImage/doc.json",
+ type
+ );
assertThat(inspectImage, notNullValue());
assertThat(inspectImage.getRepoDigests(), hasSize(1));
assertThat(inspectImage.getRepoDigests(),
-
- contains("localhost:5000/test/busybox/example@"
- + "sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf"));
+ contains("localhost:5000/test/busybox/example@" +
+ "sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf")
+ );
assertThat(inspectImage.getRepoTags(), hasSize(3));
- assertThat(inspectImage.getRepoTags(), containsInAnyOrder("example:1.0", "example:latest", "example:stable"));
+ assertThat(inspectImage.getRepoTags(), containsInAnyOrder(
+ "example:1.0",
+ "example:latest",
+ "example:stable"
+ ));
}
@Test
@@ -154,11 +166,16 @@ public void serder1_22_inspect_doc() throws IOException {
final ObjectMapper mapper = new ObjectMapper();
final JavaType type = mapper.getTypeFactory().constructType(InspectImageResponse.class);
- final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22, "images/docImage/inspect_doc.json", type);
+ final InspectImageResponse inspectImage = testRoundTrip(VERSION_1_22,
+ "images/docImage/inspect_doc.json",
+ type
+ );
- GraphData newGraphData = new GraphData().withDeviceId("5")
+ GraphData newGraphData = new GraphData()
+ .withDeviceId("5")
.withDeviceName("docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47")
.withDeviceSize("171798691840");
+
assertThat(inspectImage, notNullValue());
GraphDriver graphDriver = inspectImage.getGraphDriver();
assertThat(graphDriver, notNullValue());
@@ -167,8 +184,10 @@ public void serder1_22_inspect_doc() throws IOException {
assertThat(data, is(newGraphData));
assertThat(data.getDeviceId(), is("5"));
- assertThat(data.getDeviceName(), is("docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47"));
- assertThat(data.getDeviceSize(), is("171798691840"));
+ assertThat(data.getDeviceName(),
+ is("docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47"));
+ assertThat(data.getDeviceSize(),
+ is("171798691840"));
}
@Test
@@ -186,6 +205,5 @@ private void testOverlayNetworkRootDir() throws IOException {
assertThat(graphDriver, equalTo(overlayGraphDriver));
assertThat(graphDriver.getName(), is("overlay"));
assertThat(graphDriver.getData(), equalTo(overlayGraphData));
-
}
}
From d05e38078117c8e1f20ab4ecc20575b64cb801bc Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Tue, 24 May 2016 14:19:28 -0600
Subject: [PATCH 006/736] Fixes Issue #584
Adds RootDir property to GraphData. This was seen on a
CentOS system without aufs support.
---
src/main/java/com/github/dockerjava/api/command/GraphData.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/GraphData.java b/src/main/java/com/github/dockerjava/api/command/GraphData.java
index 1aac8db84..5130fafc7 100644
--- a/src/main/java/com/github/dockerjava/api/command/GraphData.java
+++ b/src/main/java/com/github/dockerjava/api/command/GraphData.java
@@ -34,7 +34,7 @@ public String getRootDir() {
}
/**
- * @see #deviceId
+ * @see #rootDir
*/
public GraphData withRootDir(String rootDir) {
this.rootDir = rootDir;
From fac1ba22dc904f86774d16c56754a280a7ac4e97 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Thu, 2 Jun 2016 20:22:40 +0200
Subject: [PATCH 007/736] Add ignore unknown properties annotation
---
src/main/java/com/github/dockerjava/api/command/GraphData.java | 3 +++
.../java/com/github/dockerjava/api/command/GraphDriver.java | 3 +++
2 files changed, 6 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/command/GraphData.java b/src/main/java/com/github/dockerjava/api/command/GraphData.java
index 5130fafc7..5a2944e0b 100644
--- a/src/main/java/com/github/dockerjava/api/command/GraphData.java
+++ b/src/main/java/com/github/dockerjava/api/command/GraphData.java
@@ -1,6 +1,8 @@
package com.github.dockerjava.api.command;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
@@ -11,6 +13,7 @@
* part of {@link GraphDriver}
* @author Kanstantsin Shautsou
*/
+@JsonIgnoreProperties(ignoreUnknown = true)
public class GraphData {
@JsonProperty("RootDir")
diff --git a/src/main/java/com/github/dockerjava/api/command/GraphDriver.java b/src/main/java/com/github/dockerjava/api/command/GraphDriver.java
index 0d41364aa..1394e866e 100644
--- a/src/main/java/com/github/dockerjava/api/command/GraphDriver.java
+++ b/src/main/java/com/github/dockerjava/api/command/GraphDriver.java
@@ -1,6 +1,8 @@
package com.github.dockerjava.api.command;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
@@ -13,6 +15,7 @@
* @author Kanstantsin Shautsou
* @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21}
*/
+@JsonIgnoreProperties(ignoreUnknown = true)
public class GraphDriver {
/**
* @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21}
From ad83c3adc410a901f25e22f20185dea5b0beb0cf Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Thu, 2 Jun 2016 20:24:31 +0200
Subject: [PATCH 008/736] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 429f4b275..c4a771d25 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ Notes
All changes
+* [#585] (https://github.com/docker-java/docker-java/pull/585) Add RootDir property to GraphData
* [#580] (https://github.com/docker-java/docker-java/pull/580) Fixes execute permissions for files when copied to container
* [#579] (https://github.com/docker-java/docker-java/pull/579) Adds missing name filter evaluation to netty version of ListImagesCmdExec
* [#578] (https://github.com/docker-java/docker-java/pull/578) Fix error during image build when Dockerfile in subdirectory of build context
From 0c48b5fe0984388a27a65a3e4fbc2383a3821a30 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Thu, 2 Jun 2016 21:52:06 +0200
Subject: [PATCH 009/736] Add missing tests for netty impl
---
.../exec/ConnectToNetworkCmdExecTest.java | 98 +++++++++++++++++++
.../DisconnectFromNetworkCmdExecTest.java | 82 ++++++++++++++++
2 files changed, 180 insertions(+)
create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExecTest.java
create mode 100644 src/test/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExecTest.java
diff --git a/src/test/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExecTest.java
new file mode 100644
index 000000000..ee1a681b6
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExecTest.java
@@ -0,0 +1,98 @@
+package com.github.dockerjava.netty.exec;
+
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.CreateNetworkResponse;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.model.ContainerNetwork;
+import com.github.dockerjava.api.model.Network;
+import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
+
+import org.testng.ITestResult;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Method;
+import java.util.Collections;
+
+@Test(groups = "integration")
+public class ConnectToNetworkCmdExecTest extends AbstractNettyDockerClientTest {
+
+ @BeforeTest
+ public void beforeTest() throws Exception {
+ super.beforeTest();
+ }
+
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ }
+
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ super.afterMethod(result);
+ }
+
+ @Test
+ public void connectToNetwork() throws InterruptedException {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("testNetwork").exec();
+
+ dockerClient.connectToNetworkCmd().withNetworkId(network.getId()).withContainerId(container.getId()).exec();
+
+ Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec();
+
+ assertTrue(updatedNetwork.getContainers().containsKey(container.getId()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ assertNotNull(inspectContainerResponse.getNetworkSettings().getNetworks().get("testNetwork"));
+ }
+
+ @Test
+ public void connectToNetworkWithContainerNetwork() throws InterruptedException {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ CreateNetworkResponse network = dockerClient.createNetworkCmd()
+ .withName("testNetwork")
+ .withIpam(new Network.Ipam()
+ .withConfig(new Network.Ipam.Config()
+ .withSubnet("10.100.100.0/24")))
+ .exec();
+
+ dockerClient.connectToNetworkCmd()
+ .withNetworkId(network.getId())
+ .withContainerId(container.getId())
+ .withContainerNetwork(new ContainerNetwork()
+ .withAliases("testing")
+ .withIpamConfig(new ContainerNetwork.Ipam()
+ .withIpv4Address("10.100.100.100")))
+ .exec();
+
+ Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec();
+
+ Network.ContainerNetworkConfig containerNetworkConfig = updatedNetwork.getContainers().get(container.getId());
+ assertNotNull(containerNetworkConfig);
+ assertEquals(containerNetworkConfig.getIpv4Address(), "10.100.100.100/24");
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ ContainerNetwork testNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get("testNetwork");
+ assertNotNull(testNetwork);
+ assertEquals(testNetwork.getAliases(), Collections.singletonList("testing"));
+ assertEquals(testNetwork.getGateway(), "10.100.100.1");
+ assertEquals(testNetwork.getIpAddress(), "10.100.100.100");
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExecTest.java
new file mode 100644
index 000000000..1f2563dec
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExecTest.java
@@ -0,0 +1,82 @@
+package com.github.dockerjava.netty.exec;
+
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.CreateNetworkResponse;
+import com.github.dockerjava.api.model.Network;
+import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
+
+import org.testng.ITestResult;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Method;
+
+@Test(groups = "integration")
+public class DisconnectFromNetworkCmdExecTest extends AbstractNettyDockerClientTest {
+
+ @BeforeTest
+ public void beforeTest() throws Exception {
+ super.beforeTest();
+ }
+
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ }
+
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ super.afterMethod(result);
+ }
+
+ @Test
+ public void disconnectFromNetwork() throws InterruptedException {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("testNetwork").exec();
+
+ dockerClient.connectToNetworkCmd().withNetworkId(network.getId()).withContainerId(container.getId()).exec();
+
+ Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec();
+
+ assertTrue(updatedNetwork.getContainers().containsKey(container.getId()));
+
+ dockerClient.disconnectFromNetworkCmd().withNetworkId(network.getId()).withContainerId(container.getId()).exec();
+
+ updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec();
+
+ assertFalse(updatedNetwork.getContainers().containsKey(container.getId()));
+ }
+
+ @Test
+ public void forceDisconnectFromNetwork() throws InterruptedException {
+
+ CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("testNetwork").exec();
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withNetworkMode("testNetwork")
+ .withCmd("sleep", "9999")
+ .exec();
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ dockerClient.disconnectFromNetworkCmd()
+ .withNetworkId(network.getId())
+ .withContainerId(container.getId())
+ .withForce(true)
+ .exec();
+
+ Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec();
+ assertFalse(updatedNetwork.getContainers().containsKey(container.getId()));
+ }
+}
From 19acfcc8496ace6fe52c25d1359c7f891c01a04b Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Thu, 2 Jun 2016 21:54:43 +0200
Subject: [PATCH 010/736] Update CHANGELOG.md
---
CHANGELOG.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c4a771d25..7a6bae5af 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,7 +18,8 @@ All changes
* [#574] (https://github.com/docker-java/docker-java/pull/574) Fix for copyArchiveToContainerCmd bug
* [#572] (https://github.com/docker-java/docker-java/pull/572) Inspect container command now shows sizes if requested
* [#563] (https://github.com/docker-java/docker-java/pull/563) Fix memory leak in netty implementation of DockerCmdExecFactory
-* [#550] (https://github.com/docker-java/docker-java/pull/550) Add ability to configure IPAM config for CreateNetworkCmd
+* [#550] (https://github.com/docker-java/docker-java/pull/550) Add ability to configure IPAM config for CreateNetworkCmd
+* [#484] (https://github.com/docker-java/docker-java/pull/484) Implement missing network api options for v1.22
Included in 3.0.0-RC5
From 7d1f64f7678b9857b3605558434c76d140aac172 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Thu, 2 Jun 2016 23:19:50 +0200
Subject: [PATCH 011/736] Fix issue #480
---
.../dockerjava/core/DockerClientConfig.java | 16 ++++++++++------
...b.dockerjava.api.command.DockerCmdExecFactory | 1 -
src/main/resources/docker-java.properties | 12 +++---------
.../dockerjava/core/DockerClientConfigTest.java | 10 +++-------
4 files changed, 16 insertions(+), 23 deletions(-)
delete mode 100644 src/main/resources/META-INF/services/com.github.dockerjava.api.command.DockerCmdExecFactory
diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java
index a03d6e086..31cfc0c58 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java
@@ -109,14 +109,16 @@ private String checkDockerCertPath(boolean dockerTlsVerify, String dockerCertPat
if (!certPath.exists()) {
throw new DockerClientException(
- "Certificate path (DOCKER_CERT_PATH) '" + dockerCertPath + "' doesn't exist.");
+ "Enabled TLS verification (DOCKER_TLS_VERIFY=1) but certificate path (DOCKER_CERT_PATH) '" + dockerCertPath
+ + "' doesn't exist.");
}
if (certPath.isDirectory()) {
return dockerCertPath;
} else {
throw new DockerClientException(
- "Certificate path (DOCKER_CERT_PATH) '" + dockerCertPath + "' doesn't point to a directory.");
+ "Enabled TLS verification (DOCKER_TLS_VERIFY=1) but certificate path (DOCKER_CERT_PATH) '" + dockerCertPath
+ + "' doesn't point to a directory.");
}
}
} else {
@@ -375,7 +377,6 @@ public final DockerClientConfigBuilder withDockerHost(String dockerHost) {
return this;
}
-
public final DockerClientConfigBuilder withApiVersion(RemoteApiVersion apiVersion) {
this.apiVersion = apiVersion.getVersion();
return this;
@@ -417,8 +418,12 @@ public final DockerClientConfigBuilder withDockerConfig(String dockerConfig) {
}
public final DockerClientConfigBuilder withDockerTlsVerify(String dockerTlsVerify) {
- String trimmed = dockerTlsVerify.trim();
- this.dockerTlsVerify = "true".equalsIgnoreCase(trimmed) || "1".equals(trimmed);
+ if (dockerTlsVerify != null) {
+ String trimmed = dockerTlsVerify.trim();
+ this.dockerTlsVerify = "true".equalsIgnoreCase(trimmed) || "1".equals(trimmed);
+ } else {
+ this.dockerTlsVerify = false;
+ }
return this;
}
@@ -433,4 +438,3 @@ public DockerClientConfig build() {
}
}
}
-
diff --git a/src/main/resources/META-INF/services/com.github.dockerjava.api.command.DockerCmdExecFactory b/src/main/resources/META-INF/services/com.github.dockerjava.api.command.DockerCmdExecFactory
deleted file mode 100644
index f0686bc9f..000000000
--- a/src/main/resources/META-INF/services/com.github.dockerjava.api.command.DockerCmdExecFactory
+++ /dev/null
@@ -1 +0,0 @@
-com.github.dockerjava.jaxrs.DockerCmdExecFactoryImpl
\ No newline at end of file
diff --git a/src/main/resources/docker-java.properties b/src/main/resources/docker-java.properties
index ea85f6c01..fc9209c97 100644
--- a/src/main/resources/docker-java.properties
+++ b/src/main/resources/docker-java.properties
@@ -1,13 +1,7 @@
-#docker.io.url=https://localhost:2376
-#docker.io.dockerCertPath=${user.home}/.docker
-#docker.io.dockerCfgPath=${user.home}/.dockercfg
-#docker.io.username=${user.name}
-#docker.io.serverAddress=https://index.docker.io/v1/
-#
-DOCKER_HOST=tcp://localhost:2376
-DOCKER_TLS_VERIFY=1
+DOCKER_HOST=unix:///var/run/docker.sock
DOCKER_CONFIG=${user.home}/.docker
-DOCKER_CERT_PATH=${user.home}/.docker/certs
+#DOCKER_TLS_VERIFY=1
+#DOCKER_CERT_PATH=${user.home}/.docker/certs
api.version=
registry.url=https://index.docker.io/v1/
diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java
index a363e12ec..ee679a0af 100644
--- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java
+++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java
@@ -4,8 +4,7 @@
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.core.Is.is;
import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertNull;
import java.lang.reflect.Field;
import java.net.URI;
@@ -54,8 +53,6 @@ public void environmentDockerHost() throws Exception {
// and it looks to be SSL disabled
env.remove("DOCKER_CERT_PATH");
-
-
// given default cert path
Properties systemProperties = new Properties();
systemProperties.setProperty("user.name", "someUserName");
@@ -82,7 +79,6 @@ public void environment() throws Exception {
env.put(DockerClientConfig.DOCKER_CERT_PATH, dockerCertPath());
env.put(DockerClientConfig.DOCKER_TLS_VERIFY, "1");
-
// when you build a config
DockerClientConfig config = buildConfig(env, new Properties());
@@ -106,12 +102,12 @@ public void defaults() throws Exception {
DockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties);
// then the cert path is as expected
- assertEquals(config.getDockerHost(), URI.create("tcp://localhost:2376"));
+ assertEquals(config.getDockerHost(), URI.create("unix:///var/run/docker.sock"));
assertEquals(config.getRegistryUsername(), "someUserName");
assertEquals(config.getRegistryUrl(), AuthConfig.DEFAULT_SERVER_ADDRESS);
assertEquals(config.getApiVersion(), RemoteApiVersion.unknown());
assertEquals(config.getDockerConfig(), homeDir() + "/.docker");
- assertEquals(config.getDockerCertPath(), homeDir() + "/.docker/certs");
+ assertNull(config.getDockerCertPath());
}
@Test
From 94e860e574d7eebc64ee8e7fa4090d1d4c82d8a7 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Fri, 3 Jun 2016 21:12:42 +0200
Subject: [PATCH 012/736] Update CHANGELOG.md
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7a6bae5af..ee0dae776 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,7 +9,7 @@ Notes
* The configuration has been changed to better match the docker CLI configuration options. The properties file was renamed from `docker.io.properties` to `docker-java.properties`. See README.md for details.
All changes
-
+* [#590] (https://github.com/docker-java/docker-java/pull/590) Fix default docker.properties to match with docker CLI defaults
* [#585] (https://github.com/docker-java/docker-java/pull/585) Add RootDir property to GraphData
* [#580] (https://github.com/docker-java/docker-java/pull/580) Fixes execute permissions for files when copied to container
* [#579] (https://github.com/docker-java/docker-java/pull/579) Adds missing name filter evaluation to netty version of ListImagesCmdExec
From fc38f319311821f790c1dcb8f1990676cc0e44f3 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 3 Jun 2016 21:53:02 +0200
Subject: [PATCH 013/736] [maven-release-plugin] prepare release
docker-java-3.0.0
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 9ee5cad51..3b77e6e98 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.0-SNAPSHOT
+ 3.0.0docker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ docker-java-3.0.0
From 37afc15c5baeb5f479a56ca5e858bf230adb1102 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Fri, 3 Jun 2016 21:53:10 +0200
Subject: [PATCH 014/736] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 3b77e6e98..bee178a6d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.0
+ 3.0.1-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- docker-java-3.0.0
+ HEAD
From 2f3d90c0a6bd564f8f8c53696198f9d74cdcd045 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Fri, 3 Jun 2016 22:02:41 +0200
Subject: [PATCH 015/736] Update CHANGELOG.md
---
CHANGELOG.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ee0dae776..f55b2cd75 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,11 +1,11 @@
Change Log
===
-3.0.0-SNAPSHOT
+v3.0.0
---
Notes
-* The upcoming release will contain multiple API breaking changes therefore the major version switch. It will support a subset of v.1.22 of the docker remote API. It also includes an experimental netty based implementation of `DockerCmdExecFactory` that probably will replace the current jersey/httpclient based one in a later release.
+* The 3.0.0 release contains multiple API breaking changes compared to 2.x therefore the major version switch. It supports a subset of v.1.22 of the docker remote API. It also includes an experimental netty based implementation of `DockerCmdExecFactory` that probably will replace the current jersey/httpclient based one in a later release. Take a look at the [Wiki](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) how to use it.
* The configuration has been changed to better match the docker CLI configuration options. The properties file was renamed from `docker.io.properties` to `docker-java.properties`. See README.md for details.
All changes
From 9a59b10c5a28e6ae4d29af770f2412b1f88fc7dd Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Fri, 3 Jun 2016 22:54:02 +0200
Subject: [PATCH 016/736] Update README.md
---
README.md | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/README.md b/README.md
index f2135f61b..1b39ebab3 100644
--- a/README.md
+++ b/README.md
@@ -58,21 +58,12 @@ Run build without integration tests:
## Docker-Java maven dependencies
### Latest release version
-Supports a subset of the Docker Remote API [v1.19](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.19.md), Docker Server version 1.7.x
-
-
- com.github.docker-java
- docker-java
- 2.2.3
-
-
-### Latest release candidate
Supports a subset of the Docker Remote API [v1.22](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.22.md), Docker Server version 1.10.x
com.github.docker-javadocker-java
- 3.0.0-RC5
+ 3.0.0
### Latest development version
@@ -83,7 +74,7 @@ You can find the latest development version including javadoc and source files o
com.github.docker-javadocker-java
- 3.0.0-SNAPSHOT
+ 3.0.1-SNAPSHOT
From 0a1b34c3b2a201f82a16821e1f3f6ca0337854ca Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sat, 4 Jun 2016 00:16:29 +0200
Subject: [PATCH 017/736] Update README.md
---
README.md | 44 +++++++++++++++-----------------------------
1 file changed, 15 insertions(+), 29 deletions(-)
diff --git a/README.md b/README.md
index 1b39ebab3..e47b6e5a4 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,9 @@ Java API client for [Docker](http://docs.docker.io/ "Docker")
Developer forum for [docker-java](https://groups.google.com/forum/?#!forum/docker-java-dev "docker-java")
+[Changelog](https://github.com/docker-java/docker-java/blob/master/CHANGELOG.md)
+[Wiki](https://github.com/docker-java/docker-java/wiki)
+
## Build with Maven
###### Prerequisites:
@@ -15,10 +18,6 @@ Developer forum for [docker-java](https://groups.google.com/forum/?#!forum/docke
* Java 1.7
* Maven 3.0.5
-If you need SSL, then you'll need to put your `*.pem` file into `~/.docker/`, if you're using boot2docker, do this:
-
- $ ln -s /Users/alex.collins/.boot2docker/certs/boot2docker-vm .docker
-
Build and run integration tests as follows:
$ mvn clean install
@@ -27,35 +26,22 @@ If you do not have access to a Docker server or just want to execute the build q
$ mvn clean install -DskipITs
-By default Docker server is using UNIX sockets for communication with the Docker client, however docker-java
-client uses TCP/IP to connect to the Docker server by default, so you will need to make sure that your Docker server is
-listening on TCP port. To allow Docker server to use TCP add the following line to /etc/default/docker
+By default the docker engine is using local UNIX sockets for communication with the docker CLI so docker-java
+client also uses UNIX domain sockets to connect to the docker daemon by default. To make the docker daemon listening on a TCP (http/https) port you have to configure it by setting the DOCKER_OPTS environment variable to something like the following:
DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"
-
-However you can force docker-java to use UNIX socket communication by configure the following (see [Configuration](.#Configuration) for details):
-
- DOCKER_HOST=unix:///var/run/docker.sock
- DOCKER_TLS_VERIFY=0
-
+
More details about setting up Docker server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/
-Now make sure that docker is up:
+To force docker-java to use TCP (http) configure the following (see [Configuration](https://github.com/docker-java/docker-java#configuration) for details):
- $ docker -H tcp://127.0.0.1:2375 version
-
- Client version: 0.8.0
- Go version (client): go1.2
- Git commit (client): cc3a8c8
- Server version: 1.2.0
- Git commit (server): fa7b24f
- Go version (server): go1.3.1
-
-Run build without integration tests:
-
- $ mvn clean install -DskipITs
+ DOCKER_HOST=tcp://127.0.0.1:2375
+
+For secure tls (https) communication:
-## Docker-Java maven dependencies
+ DOCKER_HOST=tcp://127.0.0.1:2376
+ DOCKER_TLS_VERIFY=1
+ DOCKER_CERT_PATH=/Users/marcus/.docker/machine/machines/docker-1.10.2
### Latest release version
Supports a subset of the Docker Remote API [v1.22](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.22.md), Docker Server version 1.10.x
@@ -128,11 +114,11 @@ In your application, e.g.
##### System Properties:
- java -Dregistry.username=dockeruser pkg.Main
+ java -DDOCKER_HOST=tcp://localhost:2375 -Dregistry.username=dockeruser pkg.Main
##### System Environment
- export DOCKER_URL=tcp://localhost:2376
+ export DOCKER_HOST=tcp://localhost:2376
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=/home/user/.docker/certs
export DOCKER_CONFIG=/home/user/.docker
From 3a3318282a4cf5d37b20b7d85ac00ef7549df84d Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Sun, 5 Jun 2016 15:30:00 +0200
Subject: [PATCH 018/736] Reorganize image build tests
---
.../client/AbstractDockerClientTest.java | 2 -
.../core/command/BuildImageCmdImplTest.java | 144 +++++-----------
.../DockerfileAddMultipleFilesTest.java | 14 +-
.../core/dockerfile/DockerfileTest.java | 49 ------
.../netty/exec/BuildImageCmdExecTest.java | 159 +++++++-----------
.../ADD/file}/Dockerfile | 0
.../ADD/file}/testrun.sh | 0
.../ADD/fileInSubfolder}/Dockerfile | 0
.../ADD/fileInSubfolder}/files/testrun.sh | 0
.../ADD/files}/Dockerfile | 0
.../ADD/files}/src1 | 0
.../ADD/files}/src2 | 0
.../ADD/filesViaWildcard}/Dockerfile | 0
.../ADD/filesViaWildcard}/folder1/testrun.sh | 0
.../filesViaWildcard}/folder2/testinclude1.sh | 0
.../filesViaWildcard}/ignore/testinclude2.sh | 0
.../ADD/folder}/Dockerfile | 0
.../ADD/folder}/folderA/testAddFolder.sh | 0
.../ADD/url}/Dockerfile | 2 +-
.../resources/buildTests/ADD/url/testrun.sh | 4 +
.../{nginx => buildTests/AUTHOR}/Dockerfile | 2 +-
.../ENV}/Dockerfile | 0
.../ENV}/subst-file-2-abc123.txt | 0
.../ENV}/subst-file-abc123.txt | 0
.../ENV}/testrun.sh | 0
.../FROM/privateRegistry}/Dockerfile | 0
.../ONBUILD/child}/Dockerfile | 0
.../ONBUILD/child}/testrun.sh | 0
.../ONBUILD/parent}/Dockerfile | 0
.../buildArgs}/Dockerfile | 0
.../dockerfileFolder/Dockerfile | 0
.../testrunFolder/testrun.sh | 0
.../DockerfileIgnored}/.dockerignore | 0
.../DockerfileIgnored}/Dockerfile | 0
.../DockerfileIgnored}/testrun.sh | 0
.../DockerfileNotIgnored}/.dockerignore | 0
.../DockerfileNotIgnored}/Dockerfile | 0
.../InvalidDockerignorePattern}/.dockerignore | 0
.../InvalidDockerignorePattern}/Dockerfile | 0
.../InvalidDockerignorePattern}/testrun.sh | 0
.../ValidDockerignorePattern}/.dockerignore | 0
.../ValidDockerignorePattern}/Dockerfile | 0
.../ValidDockerignorePattern}/a/a | 0
.../ValidDockerignorePattern}/a/b | 0
.../ValidDockerignorePattern}/a/c | 0
.../ValidDockerignorePattern}/a/d | 0
.../ValidDockerignorePattern}/testrun.sh | 0
src/test/resources/netcat/Dockerfile | 11 --
.../subdirectory/Dockerfile-nonstandard | 12 --
src/test/resources/testAddUrl/testrun.sh | 4 -
src/test/resources/testEnv/Dockerfile | 10 --
.../resources/testEnv/subFolder/testrun.sh | 3 -
52 files changed, 111 insertions(+), 305 deletions(-)
delete mode 100644 src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java
rename src/test/resources/{testAddFile => buildTests/ADD/file}/Dockerfile (100%)
rename src/test/resources/{testAddFile => buildTests/ADD/file}/testrun.sh (100%)
rename src/test/resources/{testAddFileInSubfolder => buildTests/ADD/fileInSubfolder}/Dockerfile (100%)
rename src/test/resources/{testAddFileInSubfolder => buildTests/ADD/fileInSubfolder}/files/testrun.sh (100%)
rename src/test/resources/{testAddMultipleFiles => buildTests/ADD/files}/Dockerfile (100%)
rename src/test/resources/{testAddMultipleFiles => buildTests/ADD/files}/src1 (100%)
rename src/test/resources/{testAddMultipleFiles => buildTests/ADD/files}/src2 (100%)
rename src/test/resources/{testAddFilesViaWildcard => buildTests/ADD/filesViaWildcard}/Dockerfile (100%)
rename src/test/resources/{testAddFilesViaWildcard => buildTests/ADD/filesViaWildcard}/folder1/testrun.sh (100%)
rename src/test/resources/{testAddFilesViaWildcard => buildTests/ADD/filesViaWildcard}/folder2/testinclude1.sh (100%)
rename src/test/resources/{testAddFilesViaWildcard => buildTests/ADD/filesViaWildcard}/ignore/testinclude2.sh (100%)
rename src/test/resources/{testAddFolder => buildTests/ADD/folder}/Dockerfile (100%)
rename src/test/resources/{testAddFolder => buildTests/ADD/folder}/folderA/testAddFolder.sh (100%)
rename src/test/resources/{testAddUrl => buildTests/ADD/url}/Dockerfile (71%)
create mode 100755 src/test/resources/buildTests/ADD/url/testrun.sh
rename src/test/resources/{nginx => buildTests/AUTHOR}/Dockerfile (81%)
rename src/test/resources/{testENVSubstitution => buildTests/ENV}/Dockerfile (100%)
rename src/test/resources/{testENVSubstitution => buildTests/ENV}/subst-file-2-abc123.txt (100%)
rename src/test/resources/{testENVSubstitution => buildTests/ENV}/subst-file-abc123.txt (100%)
rename src/test/resources/{testENVSubstitution => buildTests/ENV}/testrun.sh (100%)
rename src/test/resources/{testBuildFromPrivateRegistry => buildTests/FROM/privateRegistry}/Dockerfile (100%)
rename src/test/resources/{testAddOnBuild/test => buildTests/ONBUILD/child}/Dockerfile (100%)
rename src/test/resources/{testAddOnBuild/test => buildTests/ONBUILD/child}/testrun.sh (100%)
rename src/test/resources/{testAddOnBuild/onbuild => buildTests/ONBUILD/parent}/Dockerfile (100%)
rename src/test/resources/{testBuildArgs => buildTests/buildArgs}/Dockerfile (100%)
rename src/test/resources/{testDockerfileNotInBaseDirectory => buildTests/dockerfileNotInBaseDirectory}/dockerfileFolder/Dockerfile (100%)
rename src/test/resources/{testDockerfileNotInBaseDirectory => buildTests/dockerfileNotInBaseDirectory}/testrunFolder/testrun.sh (100%)
rename src/test/resources/{testDockerfileIgnored => buildTests/dockerignore/DockerfileIgnored}/.dockerignore (100%)
rename src/test/resources/{testDockerfileIgnored => buildTests/dockerignore/DockerfileIgnored}/Dockerfile (100%)
rename src/test/resources/{testDockerfileIgnored => buildTests/dockerignore/DockerfileIgnored}/testrun.sh (100%)
rename src/test/resources/{testDockerfileNotIgnored => buildTests/dockerignore/DockerfileNotIgnored}/.dockerignore (100%)
rename src/test/resources/{testDockerfileNotIgnored => buildTests/dockerignore/DockerfileNotIgnored}/Dockerfile (100%)
rename src/test/resources/{testInvalidDockerignorePattern => buildTests/dockerignore/InvalidDockerignorePattern}/.dockerignore (100%)
rename src/test/resources/{testInvalidDockerignorePattern => buildTests/dockerignore/InvalidDockerignorePattern}/Dockerfile (100%)
rename src/test/resources/{testInvalidDockerignorePattern => buildTests/dockerignore/InvalidDockerignorePattern}/testrun.sh (100%)
rename src/test/resources/{testDockerignore => buildTests/dockerignore/ValidDockerignorePattern}/.dockerignore (100%)
rename src/test/resources/{testDockerignore => buildTests/dockerignore/ValidDockerignorePattern}/Dockerfile (100%)
rename src/test/resources/{testDockerignore => buildTests/dockerignore/ValidDockerignorePattern}/a/a (100%)
rename src/test/resources/{testDockerignore => buildTests/dockerignore/ValidDockerignorePattern}/a/b (100%)
rename src/test/resources/{testDockerignore => buildTests/dockerignore/ValidDockerignorePattern}/a/c (100%)
rename src/test/resources/{testDockerignore => buildTests/dockerignore/ValidDockerignorePattern}/a/d (100%)
rename src/test/resources/{testDockerignore => buildTests/dockerignore/ValidDockerignorePattern}/testrun.sh (100%)
delete mode 100644 src/test/resources/netcat/Dockerfile
delete mode 100644 src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard
delete mode 100755 src/test/resources/testAddUrl/testrun.sh
delete mode 100644 src/test/resources/testEnv/Dockerfile
delete mode 100755 src/test/resources/testEnv/subFolder/testrun.sh
diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
index 4c8750ecc..231e709c1 100644
--- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
+++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
@@ -228,8 +228,6 @@ public static class LogContainerTestCallback extends LogContainerResultCallback
@Override
public void onNext(Frame frame) {
log.append(new String(frame.getPayload()));
- System.err.println("LogContainerTestCallback: " + log.toString());
- // super.onNext(frame);
}
@Override
diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
index 950b80a24..31f3c3045 100644
--- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
@@ -5,7 +5,6 @@
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import java.io.File;
@@ -26,7 +25,6 @@
import com.github.dockerjava.api.command.BuildImageCmd;
import com.github.dockerjava.api.command.CreateContainerResponse;
-import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.command.InspectImageResponse;
import com.github.dockerjava.api.exception.DockerClientException;
import com.github.dockerjava.api.model.AuthConfig;
@@ -61,10 +59,9 @@ public void afterMethod(ITestResult result) {
}
@Test
- public void testNginxDockerfileBuilder() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nginx").getFile());
+ public void author() throws Exception {
- String imageId = buildImage(baseDir);
+ String imageId = buildImage(fileFromBuildTestResource("AUTHOR"));
InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
assertThat(inspectImageResponse, not(nullValue()));
@@ -73,27 +70,9 @@ public void testNginxDockerfileBuilder() throws Exception {
assertThat(inspectImageResponse.getAuthor(), equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\""));
}
- @Test(groups = "ignoreInCircleCi")
- public void testNonstandard1() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader()
- .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile());
-
- buildImage(baseDir);
- }
-
- @Test(groups = "ignoreInCircleCi")
- public void testNonstandard2() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nonstandard").getFile());
- File dockerFile = new File(Thread.currentThread().getContextClassLoader()
- .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile());
-
- dockerClient.buildImageCmd().withBaseDirectory(baseDir).withDockerfile(dockerFile).withNoCache(true)
- .exec(new BuildImageResultCallback()).awaitImageId();
- }
-
@Test
- public void testDockerBuilderFromTar() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFile").getFile());
+ public void buildImageFromTar() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/file");
Collection files = FileUtils.listFiles(baseDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
File tarFile = CompressArchiveUtil.archiveTARFiles(baseDir, files, UUID.randomUUID().toString());
String response = dockerfileBuild(new FileInputStream(tarFile));
@@ -101,54 +80,45 @@ public void testDockerBuilderFromTar() throws Exception {
}
@Test
- public void testDockerBuildWithOnBuild() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddOnBuild/onbuild")
- .getFile());
+ public void onBuild() throws Exception {
+ File baseDir = fileFromBuildTestResource("ONBUILD/parent");
+
dockerClient.buildImageCmd(baseDir).withNoCache(true).withTag("docker-java-onbuild")
.exec(new BuildImageResultCallback()).awaitImageId();
- baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddOnBuild/test").getFile());
+ baseDir = fileFromBuildTestResource("ONBUILD/child");
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("Successfully executed testrun.sh"));
}
@Test
- public void testDockerBuilderAddUrl() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddUrl").getFile());
+ public void addUrl() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/url");
String response = dockerfileBuild(baseDir);
- assertThat(response, containsString("Docker"));
+ assertThat(response, containsString("Example Domain"));
}
@Test
- public void testDockerBuilderAddFileInSubfolder() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFileInSubfolder")
- .getFile());
+ public void addFileInSubfolder() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/fileInSubfolder");
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("Successfully executed testrun.sh"));
}
@Test
- public void testDockerBuilderAddFilesViaWildcard() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFilesViaWildcard")
- .getFile());
+ public void addFilesViaWildcard() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/filesViaWildcard");
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("Successfully executed testinclude1.sh"));
assertThat(response, not(containsString("Successfully executed testinclude2.sh")));
}
@Test
- public void testDockerBuilderAddFolder() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFolder").getFile());
+ public void addFolder() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/folder");
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("Successfully executed testAddFolder.sh"));
}
- @Test
- public void testDockerBuilderEnv() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testEnv").getFile());
- String response = dockerfileBuild(baseDir);
- assertThat(response, containsString("Successfully executed testrun.sh"));
- }
-
private String dockerfileBuild(InputStream tarInputStream) throws Exception {
return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream));
@@ -175,80 +145,42 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception {
}
@Test(expectedExceptions = {DockerClientException.class})
- public void testDockerfileIgnored() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored")
- .getFile());
+ public void dockerignoreDockerfileIgnored() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/DockerfileIgnored");
dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId();
}
@Test
- public void testDockerfileNotIgnored() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileNotIgnored")
- .getFile());
+ public void dockerignoreDockerfileNotIgnored() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/DockerfileNotIgnored");
dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId();
}
@Test(expectedExceptions = {DockerClientException.class})
- public void testInvalidDockerIgnorePattern() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader()
- .getResource("testInvalidDockerignorePattern").getFile());
+ public void dockerignoreInvalidDockerIgnorePattern() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/InvalidDockerignorePattern");
dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId();
}
- @Test(groups = "ignoreInCircleCi")
- public void testDockerIgnore() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerignore")
- .getFile());
+ @Test()
+ public void dockerignoreValidDockerIgnorePattern() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/ValidDockerignorePattern");
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("/tmp/a/a /tmp/a/c /tmp/a/d"));
}
@Test
- public void testNetCatDockerfileBuilder() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile());
-
- String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback())
- .awaitImageId();
-
- assertNotNull(imageId, "Not successful in build");
-
- InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
- assertThat(inspectImageResponse, not(nullValue()));
- assertThat(inspectImageResponse.getId(), not(nullValue()));
- LOG.info("Image Inspect: {}", inspectImageResponse.toString());
-
- CreateContainerResponse container = dockerClient.createContainerCmd(inspectImageResponse.getId()).exec();
- assertThat(container.getId(), not(isEmptyString()));
- dockerClient.startContainerCmd(container.getId()).exec();
-
- InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
-
- assertThat(inspectContainerResponse.getId(), notNullValue());
- assertThat(inspectContainerResponse.getNetworkSettings().getPorts(), notNullValue());
-
- // No use as such if not running on the server
- // for (Ports.Port p : inspectContainerResponse.getNetworkSettings().getPorts().getAllPorts()) {
- // int port = Integer.valueOf(p.getHostPort());
- // LOG.info("Checking port {} is open", port);
- // assertThat(available(port), is(false));
- // }
- dockerClient.stopContainerCmd(container.getId()).withTimeout(0).exec();
-
- }
-
- @Test
- public void testAddAndCopySubstitution() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testENVSubstitution")
- .getFile());
+ public void env() throws Exception {
+ File baseDir = fileFromBuildTestResource("ENV");
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("testENVSubstitution successfully completed"));
}
@Test
- public void testBuildFromPrivateRegistry() throws Exception {
+ public void fromPrivateRegistry() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("privateRegistry").getFile());
String imageId = buildImage(baseDir);
@@ -289,8 +221,7 @@ public void testBuildFromPrivateRegistry() throws Exception {
dockerClient.removeImageCmd("localhost:5000/testuser/busybox").withForce(true).exec();
- baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildFromPrivateRegistry")
- .getFile());
+ baseDir = fileFromBuildTestResource("FROM/privateRegistry");
AuthConfigurations authConfigurations = new AuthConfigurations();
authConfigurations.addConfig(authConfig);
@@ -305,8 +236,8 @@ public void testBuildFromPrivateRegistry() throws Exception {
}
@Test
- public void testBuildArgs() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildArgs").getFile());
+ public void buildArgs() throws Exception {
+ File baseDir = fileFromBuildTestResource("buildArgs");
String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "abc")
.exec(new BuildImageResultCallback())
@@ -319,9 +250,9 @@ public void testBuildArgs() throws Exception {
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
}
- public void testDockerfileNotInBaseDirectory() throws Exception {
- File baseDirectory = getResource("testDockerfileNotInBaseDirectory");
- File dockerfile = getResource("testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
+ public void dockerfileNotInBaseDirectory() throws Exception {
+ File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
+ File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
BuildImageCmd command = dockerClient.buildImageCmd()
.withBaseDirectory(baseDirectory)
.withDockerfile(dockerfile);
@@ -331,7 +262,8 @@ public void testDockerfileNotInBaseDirectory() throws Exception {
assertThat(response, containsString("Successfully executed testrun.sh"));
}
- private File getResource(String path) {
- return new File(Thread.currentThread().getContextClassLoader().getResource(path).getFile());
+ private File fileFromBuildTestResource(String resource) {
+ return new File(Thread.currentThread().getContextClassLoader()
+ .getResource("buildTests/" + resource).getFile());
}
}
diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java
index 8997a6d80..164246957 100644
--- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java
+++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java
@@ -1,7 +1,7 @@
package com.github.dockerjava.core.dockerfile;
import com.google.common.base.Function;
-import junit.framework.TestCase;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
@@ -14,7 +14,7 @@
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
-public class DockerfileAddMultipleFilesTest extends TestCase {
+public class DockerfileAddMultipleFilesTest {
private static final Logger log = LoggerFactory.getLogger(DockerfileAddMultipleFilesTest.class);
@@ -26,13 +26,17 @@ public String apply(File file) {
};
@Test
- public void testAddMultipleFiles() throws IOException {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddMultipleFiles")
- .getFile());
+ public void addFiles() throws IOException {
+ File baseDir = fileFromBuildTestResource("ADD/files");
Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"), baseDir);
Dockerfile.ScannedResult result = dockerfile.parse();
Collection filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES);
assertThat(filesToAdd, containsInAnyOrder("Dockerfile", "src1", "src2"));
}
+
+ private File fileFromBuildTestResource(String resource) {
+ return new File(Thread.currentThread().getContextClassLoader()
+ .getResource("buildTests/" + resource).getFile());
+ }
}
diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java
deleted file mode 100644
index 390bcf647..000000000
--- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.github.dockerjava.core.dockerfile;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-public class DockerfileTest extends TestCase {
-
- private static final Logger log = LoggerFactory.getLogger(DockerfileTest.class);
-
- @Test
- public void testAllItems() throws IOException {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile());
-
- File root = baseDir.getParentFile();
-
- Map dockerfiles = new HashMap();
- Map results = new HashMap();
-
- for (File child : root.listFiles()) {
- if (new File(child, "Dockerfile").exists()) {
- Dockerfile dockerfile = new Dockerfile(new File(child, "Dockerfile"), baseDir);
- dockerfiles.put(child.getName(), dockerfile);
- }
- }
-
- for (String name : dockerfiles.keySet()) {
- log.info("Scanning {}", name);
- try {
- results.put(name, dockerfiles.get(name).parse());
- } catch (Exception ex) {
- log.error("Error in {}", name, ex);
- }
-
- }
-
- for (String name : results.keySet()) {
- log.info("Name: {} = {}", name, results.get(name));
- }
- }
-
-}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
index 92975f38f..1474ef25f 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
@@ -5,7 +5,6 @@
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import java.io.File;
@@ -65,10 +64,9 @@ public void afterMethod(ITestResult result) {
}
@Test
- public void testNginxDockerfileBuilder() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nginx").getFile());
+ public void author() throws Exception {
- String imageId = buildImage(baseDir);
+ String imageId = buildImage(fileFromBuildTestResource("AUTHOR"));
InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
assertThat(inspectImageResponse, not(nullValue()));
@@ -77,27 +75,9 @@ public void testNginxDockerfileBuilder() throws Exception {
assertThat(inspectImageResponse.getAuthor(), equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\""));
}
- @Test(groups = "ignoreInCircleCi")
- public void testNonstandard1() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader()
- .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile());
-
- buildImage(baseDir);
- }
-
- @Test(groups = "ignoreInCircleCi")
- public void testNonstandard2() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nonstandard").getFile());
- File dockerFile = new File(Thread.currentThread().getContextClassLoader()
- .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile());
-
- dockerClient.buildImageCmd().withBaseDirectory(baseDir).withDockerfile(dockerFile).withNoCache(true)
- .exec(new BuildImageResultCallback()).awaitImageId();
- }
-
@Test
- public void testDockerBuilderFromTar() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFile").getFile());
+ public void buildImageFromTar() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/file");
Collection files = FileUtils.listFiles(baseDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
File tarFile = CompressArchiveUtil.archiveTARFiles(baseDir, files, UUID.randomUUID().toString());
String response = dockerfileBuild(new FileInputStream(tarFile));
@@ -105,41 +85,43 @@ public void testDockerBuilderFromTar() throws Exception {
}
@Test
- public void testDockerBuilderAddUrl() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddUrl").getFile());
+ public void onBuild() throws Exception {
+ File baseDir = fileFromBuildTestResource("ONBUILD/parent");
+
+ dockerClient.buildImageCmd(baseDir).withNoCache(true).withTag("docker-java-onbuild")
+ .exec(new BuildImageResultCallback()).awaitImageId();
+ baseDir = fileFromBuildTestResource("ONBUILD/child");
String response = dockerfileBuild(baseDir);
- assertThat(response, containsString("Docker"));
+ assertThat(response, containsString("Successfully executed testrun.sh"));
}
@Test
- public void testDockerBuilderAddFileInSubfolder() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFileInSubfolder")
- .getFile());
+ public void addUrl() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/url");
String response = dockerfileBuild(baseDir);
- assertThat(response, containsString("Successfully executed testrun.sh"));
+ assertThat(response, containsString("Example Domain"));
}
@Test
- public void testDockerBuilderAddFilesViaWildcard() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFilesViaWildcard")
- .getFile());
+ public void addFileInSubfolder() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/fileInSubfolder");
String response = dockerfileBuild(baseDir);
- assertThat(response, containsString("Successfully executed testinclude1.sh"));
- assertThat(response, not(containsString("Successfully executed testinclude2.sh")));
+ assertThat(response, containsString("Successfully executed testrun.sh"));
}
@Test
- public void testDockerBuilderAddFolder() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFolder").getFile());
+ public void addFilesViaWildcard() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/filesViaWildcard");
String response = dockerfileBuild(baseDir);
- assertThat(response, containsString("Successfully executed testAddFolder.sh"));
+ assertThat(response, containsString("Successfully executed testinclude1.sh"));
+ assertThat(response, not(containsString("Successfully executed testinclude2.sh")));
}
@Test
- public void testDockerBuilderEnv() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testEnv").getFile());
+ public void addFolder() throws Exception {
+ File baseDir = fileFromBuildTestResource("ADD/folder");
String response = dockerfileBuild(baseDir);
- assertThat(response, containsString("Successfully executed testrun.sh"));
+ assertThat(response, containsString("Successfully executed testAddFolder.sh"));
}
private String dockerfileBuild(InputStream tarInputStream) throws Exception {
@@ -168,80 +150,42 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception {
}
@Test(expectedExceptions = {DockerClientException.class})
- public void testDockerfileIgnored() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored")
- .getFile());
+ public void dockerignoreDockerfileIgnored() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/DockerfileIgnored");
dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId();
}
@Test
- public void testDockerfileNotIgnored() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileNotIgnored")
- .getFile());
+ public void dockerignoreDockerfileNotIgnored() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/DockerfileNotIgnored");
dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId();
}
@Test(expectedExceptions = {DockerClientException.class})
- public void testInvalidDockerIgnorePattern() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader()
- .getResource("testInvalidDockerignorePattern").getFile());
+ public void dockerignoreInvalidDockerIgnorePattern() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/InvalidDockerignorePattern");
dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId();
}
- @Test(groups = "ignoreInCircleCi")
- public void testDockerIgnore() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerignore")
- .getFile());
+ @Test()
+ public void dockerignoreValidDockerIgnorePattern() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/ValidDockerignorePattern");
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("/tmp/a/a /tmp/a/c /tmp/a/d"));
}
@Test
- public void testNetCatDockerfileBuilder() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile());
-
- String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback())
- .awaitImageId();
-
- assertNotNull(imageId, "Not successful in build");
-
- InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
- assertThat(inspectImageResponse, not(nullValue()));
- assertThat(inspectImageResponse.getId(), not(nullValue()));
- LOG.info("Image Inspect: {}", inspectImageResponse.toString());
-
- CreateContainerResponse container = dockerClient.createContainerCmd(inspectImageResponse.getId()).exec();
- assertThat(container.getId(), not(isEmptyString()));
- dockerClient.startContainerCmd(container.getId()).exec();
-
- InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
-
- assertThat(inspectContainerResponse.getId(), notNullValue());
- assertThat(inspectContainerResponse.getNetworkSettings().getPorts(), notNullValue());
-
- // No use as such if not running on the server
- // for (Ports.Port p : inspectContainerResponse.getNetworkSettings().getPorts().getAllPorts()) {
- // int port = Integer.valueOf(p.getHostPort());
- // LOG.info("Checking port {} is open", port);
- // assertThat(available(port), is(false));
- // }
- dockerClient.stopContainerCmd(container.getId()).withTimeout(0).exec();
-
- }
-
- @Test
- public void testAddAndCopySubstitution() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testENVSubstitution")
- .getFile());
+ public void env() throws Exception {
+ File baseDir = fileFromBuildTestResource("ENV");
String response = dockerfileBuild(baseDir);
assertThat(response, containsString("testENVSubstitution successfully completed"));
}
@Test
- public void testBuildFromPrivateRegistry() throws Exception {
+ public void fromPrivateRegistry() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("privateRegistry").getFile());
String imageId = buildImage(baseDir);
@@ -282,17 +226,13 @@ public void testBuildFromPrivateRegistry() throws Exception {
dockerClient.removeImageCmd("localhost:5000/testuser/busybox").withForce(true).exec();
- baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildFromPrivateRegistry")
- .getFile());
+ baseDir = fileFromBuildTestResource("FROM/privateRegistry");
AuthConfigurations authConfigurations = new AuthConfigurations();
authConfigurations.addConfig(authConfig);
- imageId = dockerClient.buildImageCmd(baseDir)
- .withNoCache(true)
- .withBuildAuthConfigs(authConfigurations)
- .exec(new BuildImageResultCallback())
- .awaitImageId();
+ imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildAuthConfigs(authConfigurations)
+ .exec(new BuildImageResultCallback()).awaitImageId();
inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
assertThat(inspectImageResponse, not(nullValue()));
@@ -301,8 +241,8 @@ public void testBuildFromPrivateRegistry() throws Exception {
}
@Test
- public void testBuildArgs() throws Exception {
- File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildArgs").getFile());
+ public void buildArgs() throws Exception {
+ File baseDir = fileFromBuildTestResource("buildArgs");
String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "abc")
.exec(new BuildImageResultCallback())
@@ -314,4 +254,21 @@ public void testBuildArgs() throws Exception {
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
}
+
+ public void dockerfileNotInBaseDirectory() throws Exception {
+ File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
+ File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
+ BuildImageCmd command = dockerClient.buildImageCmd()
+ .withBaseDirectory(baseDirectory)
+ .withDockerfile(dockerfile);
+
+ String response = execBuild(command);
+
+ assertThat(response, containsString("Successfully executed testrun.sh"));
+ }
+
+ private File fileFromBuildTestResource(String resource) {
+ return new File(Thread.currentThread().getContextClassLoader()
+ .getResource("buildTests/" + resource).getFile());
+ }
}
diff --git a/src/test/resources/testAddFile/Dockerfile b/src/test/resources/buildTests/ADD/file/Dockerfile
similarity index 100%
rename from src/test/resources/testAddFile/Dockerfile
rename to src/test/resources/buildTests/ADD/file/Dockerfile
diff --git a/src/test/resources/testAddFile/testrun.sh b/src/test/resources/buildTests/ADD/file/testrun.sh
similarity index 100%
rename from src/test/resources/testAddFile/testrun.sh
rename to src/test/resources/buildTests/ADD/file/testrun.sh
diff --git a/src/test/resources/testAddFileInSubfolder/Dockerfile b/src/test/resources/buildTests/ADD/fileInSubfolder/Dockerfile
similarity index 100%
rename from src/test/resources/testAddFileInSubfolder/Dockerfile
rename to src/test/resources/buildTests/ADD/fileInSubfolder/Dockerfile
diff --git a/src/test/resources/testAddFileInSubfolder/files/testrun.sh b/src/test/resources/buildTests/ADD/fileInSubfolder/files/testrun.sh
similarity index 100%
rename from src/test/resources/testAddFileInSubfolder/files/testrun.sh
rename to src/test/resources/buildTests/ADD/fileInSubfolder/files/testrun.sh
diff --git a/src/test/resources/testAddMultipleFiles/Dockerfile b/src/test/resources/buildTests/ADD/files/Dockerfile
similarity index 100%
rename from src/test/resources/testAddMultipleFiles/Dockerfile
rename to src/test/resources/buildTests/ADD/files/Dockerfile
diff --git a/src/test/resources/testAddMultipleFiles/src1 b/src/test/resources/buildTests/ADD/files/src1
similarity index 100%
rename from src/test/resources/testAddMultipleFiles/src1
rename to src/test/resources/buildTests/ADD/files/src1
diff --git a/src/test/resources/testAddMultipleFiles/src2 b/src/test/resources/buildTests/ADD/files/src2
similarity index 100%
rename from src/test/resources/testAddMultipleFiles/src2
rename to src/test/resources/buildTests/ADD/files/src2
diff --git a/src/test/resources/testAddFilesViaWildcard/Dockerfile b/src/test/resources/buildTests/ADD/filesViaWildcard/Dockerfile
similarity index 100%
rename from src/test/resources/testAddFilesViaWildcard/Dockerfile
rename to src/test/resources/buildTests/ADD/filesViaWildcard/Dockerfile
diff --git a/src/test/resources/testAddFilesViaWildcard/folder1/testrun.sh b/src/test/resources/buildTests/ADD/filesViaWildcard/folder1/testrun.sh
similarity index 100%
rename from src/test/resources/testAddFilesViaWildcard/folder1/testrun.sh
rename to src/test/resources/buildTests/ADD/filesViaWildcard/folder1/testrun.sh
diff --git a/src/test/resources/testAddFilesViaWildcard/folder2/testinclude1.sh b/src/test/resources/buildTests/ADD/filesViaWildcard/folder2/testinclude1.sh
similarity index 100%
rename from src/test/resources/testAddFilesViaWildcard/folder2/testinclude1.sh
rename to src/test/resources/buildTests/ADD/filesViaWildcard/folder2/testinclude1.sh
diff --git a/src/test/resources/testAddFilesViaWildcard/ignore/testinclude2.sh b/src/test/resources/buildTests/ADD/filesViaWildcard/ignore/testinclude2.sh
similarity index 100%
rename from src/test/resources/testAddFilesViaWildcard/ignore/testinclude2.sh
rename to src/test/resources/buildTests/ADD/filesViaWildcard/ignore/testinclude2.sh
diff --git a/src/test/resources/testAddFolder/Dockerfile b/src/test/resources/buildTests/ADD/folder/Dockerfile
similarity index 100%
rename from src/test/resources/testAddFolder/Dockerfile
rename to src/test/resources/buildTests/ADD/folder/Dockerfile
diff --git a/src/test/resources/testAddFolder/folderA/testAddFolder.sh b/src/test/resources/buildTests/ADD/folder/folderA/testAddFolder.sh
similarity index 100%
rename from src/test/resources/testAddFolder/folderA/testAddFolder.sh
rename to src/test/resources/buildTests/ADD/folder/folderA/testAddFolder.sh
diff --git a/src/test/resources/testAddUrl/Dockerfile b/src/test/resources/buildTests/ADD/url/Dockerfile
similarity index 71%
rename from src/test/resources/testAddUrl/Dockerfile
rename to src/test/resources/buildTests/ADD/url/Dockerfile
index d9a0676d4..2b10c34e5 100644
--- a/src/test/resources/testAddUrl/Dockerfile
+++ b/src/test/resources/buildTests/ADD/url/Dockerfile
@@ -2,7 +2,7 @@ FROM ubuntu:latest
# Copy testrun.sh files into the container
-ADD https://hub.docker.com/r/marcuslinke/busybox/ /tmp/docker_home.html
+ADD http://www.example.com/index.html /tmp/some.html
ADD ./testrun.sh /tmp/
RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh
diff --git a/src/test/resources/buildTests/ADD/url/testrun.sh b/src/test/resources/buildTests/ADD/url/testrun.sh
new file mode 100755
index 000000000..4d240d5ae
--- /dev/null
+++ b/src/test/resources/buildTests/ADD/url/testrun.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cat /tmp/some.html
+
diff --git a/src/test/resources/nginx/Dockerfile b/src/test/resources/buildTests/AUTHOR/Dockerfile
similarity index 81%
rename from src/test/resources/nginx/Dockerfile
rename to src/test/resources/buildTests/AUTHOR/Dockerfile
index 2d0fa24cb..32ffcedc7 100644
--- a/src/test/resources/nginx/Dockerfile
+++ b/src/test/resources/buildTests/AUTHOR/Dockerfile
@@ -9,4 +9,4 @@ MAINTAINER Guillaume J. Charmes "guillaume@dotcloud.com"
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
-RUN apt-get install -y inotify-tools nginx apache2 openssh-server
\ No newline at end of file
+RUN apt-get install -y nginx
\ No newline at end of file
diff --git a/src/test/resources/testENVSubstitution/Dockerfile b/src/test/resources/buildTests/ENV/Dockerfile
similarity index 100%
rename from src/test/resources/testENVSubstitution/Dockerfile
rename to src/test/resources/buildTests/ENV/Dockerfile
diff --git a/src/test/resources/testENVSubstitution/subst-file-2-abc123.txt b/src/test/resources/buildTests/ENV/subst-file-2-abc123.txt
similarity index 100%
rename from src/test/resources/testENVSubstitution/subst-file-2-abc123.txt
rename to src/test/resources/buildTests/ENV/subst-file-2-abc123.txt
diff --git a/src/test/resources/testENVSubstitution/subst-file-abc123.txt b/src/test/resources/buildTests/ENV/subst-file-abc123.txt
similarity index 100%
rename from src/test/resources/testENVSubstitution/subst-file-abc123.txt
rename to src/test/resources/buildTests/ENV/subst-file-abc123.txt
diff --git a/src/test/resources/testENVSubstitution/testrun.sh b/src/test/resources/buildTests/ENV/testrun.sh
similarity index 100%
rename from src/test/resources/testENVSubstitution/testrun.sh
rename to src/test/resources/buildTests/ENV/testrun.sh
diff --git a/src/test/resources/testBuildFromPrivateRegistry/Dockerfile b/src/test/resources/buildTests/FROM/privateRegistry/Dockerfile
similarity index 100%
rename from src/test/resources/testBuildFromPrivateRegistry/Dockerfile
rename to src/test/resources/buildTests/FROM/privateRegistry/Dockerfile
diff --git a/src/test/resources/testAddOnBuild/test/Dockerfile b/src/test/resources/buildTests/ONBUILD/child/Dockerfile
similarity index 100%
rename from src/test/resources/testAddOnBuild/test/Dockerfile
rename to src/test/resources/buildTests/ONBUILD/child/Dockerfile
diff --git a/src/test/resources/testAddOnBuild/test/testrun.sh b/src/test/resources/buildTests/ONBUILD/child/testrun.sh
similarity index 100%
rename from src/test/resources/testAddOnBuild/test/testrun.sh
rename to src/test/resources/buildTests/ONBUILD/child/testrun.sh
diff --git a/src/test/resources/testAddOnBuild/onbuild/Dockerfile b/src/test/resources/buildTests/ONBUILD/parent/Dockerfile
similarity index 100%
rename from src/test/resources/testAddOnBuild/onbuild/Dockerfile
rename to src/test/resources/buildTests/ONBUILD/parent/Dockerfile
diff --git a/src/test/resources/testBuildArgs/Dockerfile b/src/test/resources/buildTests/buildArgs/Dockerfile
similarity index 100%
rename from src/test/resources/testBuildArgs/Dockerfile
rename to src/test/resources/buildTests/buildArgs/Dockerfile
diff --git a/src/test/resources/testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile b/src/test/resources/buildTests/dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile
similarity index 100%
rename from src/test/resources/testDockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile
rename to src/test/resources/buildTests/dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile
diff --git a/src/test/resources/testDockerfileNotInBaseDirectory/testrunFolder/testrun.sh b/src/test/resources/buildTests/dockerfileNotInBaseDirectory/testrunFolder/testrun.sh
similarity index 100%
rename from src/test/resources/testDockerfileNotInBaseDirectory/testrunFolder/testrun.sh
rename to src/test/resources/buildTests/dockerfileNotInBaseDirectory/testrunFolder/testrun.sh
diff --git a/src/test/resources/testDockerfileIgnored/.dockerignore b/src/test/resources/buildTests/dockerignore/DockerfileIgnored/.dockerignore
similarity index 100%
rename from src/test/resources/testDockerfileIgnored/.dockerignore
rename to src/test/resources/buildTests/dockerignore/DockerfileIgnored/.dockerignore
diff --git a/src/test/resources/testDockerfileIgnored/Dockerfile b/src/test/resources/buildTests/dockerignore/DockerfileIgnored/Dockerfile
similarity index 100%
rename from src/test/resources/testDockerfileIgnored/Dockerfile
rename to src/test/resources/buildTests/dockerignore/DockerfileIgnored/Dockerfile
diff --git a/src/test/resources/testDockerfileIgnored/testrun.sh b/src/test/resources/buildTests/dockerignore/DockerfileIgnored/testrun.sh
similarity index 100%
rename from src/test/resources/testDockerfileIgnored/testrun.sh
rename to src/test/resources/buildTests/dockerignore/DockerfileIgnored/testrun.sh
diff --git a/src/test/resources/testDockerfileNotIgnored/.dockerignore b/src/test/resources/buildTests/dockerignore/DockerfileNotIgnored/.dockerignore
similarity index 100%
rename from src/test/resources/testDockerfileNotIgnored/.dockerignore
rename to src/test/resources/buildTests/dockerignore/DockerfileNotIgnored/.dockerignore
diff --git a/src/test/resources/testDockerfileNotIgnored/Dockerfile b/src/test/resources/buildTests/dockerignore/DockerfileNotIgnored/Dockerfile
similarity index 100%
rename from src/test/resources/testDockerfileNotIgnored/Dockerfile
rename to src/test/resources/buildTests/dockerignore/DockerfileNotIgnored/Dockerfile
diff --git a/src/test/resources/testInvalidDockerignorePattern/.dockerignore b/src/test/resources/buildTests/dockerignore/InvalidDockerignorePattern/.dockerignore
similarity index 100%
rename from src/test/resources/testInvalidDockerignorePattern/.dockerignore
rename to src/test/resources/buildTests/dockerignore/InvalidDockerignorePattern/.dockerignore
diff --git a/src/test/resources/testInvalidDockerignorePattern/Dockerfile b/src/test/resources/buildTests/dockerignore/InvalidDockerignorePattern/Dockerfile
similarity index 100%
rename from src/test/resources/testInvalidDockerignorePattern/Dockerfile
rename to src/test/resources/buildTests/dockerignore/InvalidDockerignorePattern/Dockerfile
diff --git a/src/test/resources/testInvalidDockerignorePattern/testrun.sh b/src/test/resources/buildTests/dockerignore/InvalidDockerignorePattern/testrun.sh
similarity index 100%
rename from src/test/resources/testInvalidDockerignorePattern/testrun.sh
rename to src/test/resources/buildTests/dockerignore/InvalidDockerignorePattern/testrun.sh
diff --git a/src/test/resources/testDockerignore/.dockerignore b/src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/.dockerignore
similarity index 100%
rename from src/test/resources/testDockerignore/.dockerignore
rename to src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/.dockerignore
diff --git a/src/test/resources/testDockerignore/Dockerfile b/src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/Dockerfile
similarity index 100%
rename from src/test/resources/testDockerignore/Dockerfile
rename to src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/Dockerfile
diff --git a/src/test/resources/testDockerignore/a/a b/src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/a/a
similarity index 100%
rename from src/test/resources/testDockerignore/a/a
rename to src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/a/a
diff --git a/src/test/resources/testDockerignore/a/b b/src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/a/b
similarity index 100%
rename from src/test/resources/testDockerignore/a/b
rename to src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/a/b
diff --git a/src/test/resources/testDockerignore/a/c b/src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/a/c
similarity index 100%
rename from src/test/resources/testDockerignore/a/c
rename to src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/a/c
diff --git a/src/test/resources/testDockerignore/a/d b/src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/a/d
similarity index 100%
rename from src/test/resources/testDockerignore/a/d
rename to src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/a/d
diff --git a/src/test/resources/testDockerignore/testrun.sh b/src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/testrun.sh
similarity index 100%
rename from src/test/resources/testDockerignore/testrun.sh
rename to src/test/resources/buildTests/dockerignore/ValidDockerignorePattern/testrun.sh
diff --git a/src/test/resources/netcat/Dockerfile b/src/test/resources/netcat/Dockerfile
deleted file mode 100644
index 1974f1063..000000000
--- a/src/test/resources/netcat/Dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-# Firefox over VNC
-#
-# VERSION 0.3
-
-FROM ubuntu:latest
-
-#install netcat
-RUN apt-get install -y netcat
-
-EXPOSE 6900
-CMD ["nc", "-l", "6900"]
\ No newline at end of file
diff --git a/src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard b/src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard
deleted file mode 100644
index 2d0fa24cb..000000000
--- a/src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard
+++ /dev/null
@@ -1,12 +0,0 @@
-# Nginx
-#
-# VERSION 0.0.1
-
-FROM ubuntu:latest
-MAINTAINER Guillaume J. Charmes "guillaume@dotcloud.com"
-
-# make sure the package repository is up to date
-RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
-RUN apt-get update
-
-RUN apt-get install -y inotify-tools nginx apache2 openssh-server
\ No newline at end of file
diff --git a/src/test/resources/testAddUrl/testrun.sh b/src/test/resources/testAddUrl/testrun.sh
deleted file mode 100755
index 8eb4630b3..000000000
--- a/src/test/resources/testAddUrl/testrun.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-cat /tmp/docker_home.html
-
diff --git a/src/test/resources/testEnv/Dockerfile b/src/test/resources/testEnv/Dockerfile
deleted file mode 100644
index a0a084633..000000000
--- a/src/test/resources/testEnv/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM ubuntu:latest
-
-ENV varA ./subFolder
-ENV varB $varA/testrun.sh
-
-ADD $varB /tmp/
-
-RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh
-
-CMD ["testrun.sh"]
diff --git a/src/test/resources/testEnv/subFolder/testrun.sh b/src/test/resources/testEnv/subFolder/testrun.sh
deleted file mode 100755
index 14259aa77..000000000
--- a/src/test/resources/testEnv/subFolder/testrun.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-echo "Successfully executed testrun.sh"
\ No newline at end of file
From 4280ee7c639605291f8acda039051395055414ae Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 7 Jun 2016 22:08:41 +0200
Subject: [PATCH 019/736] Use expectExceptions in test annotation
---
.../github/dockerjava/netty/exec/AuthCmdExecTest.java | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/netty/exec/AuthCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AuthCmdExecTest.java
index 66ac1bce3..690d478f4 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/AuthCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/AuthCmdExecTest.java
@@ -44,14 +44,8 @@ public void testAuth() throws Exception {
assertEquals(response.getStatus(), "Login Succeeded");
}
- @Test()
+ @Test(expectedExceptions = UnauthorizedException.class)
public void testAuthInvalid() throws Exception {
-
- try {
- DockerClientBuilder.getInstance(config("garbage")).build().authCmd().exec();
- fail("Expected a UnauthorizedException caused by a bad password.");
- } catch (UnauthorizedException e) {
- assertEquals(e.getMessage(), "Wrong login/password, please try again\n");
- }
+ DockerClientBuilder.getInstance(config("garbage")).build().authCmd().exec();
}
}
From 84cf070278343867bf2a984a6fa18839a5a635e5 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 7 Jun 2016 22:09:59 +0200
Subject: [PATCH 020/736] Fix test for v.1.23
---
.../netty/exec/ExecStartCmdExecTest.java | 60 +++++++++++++------
1 file changed, 43 insertions(+), 17 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java
index 2938ac8c0..e87c56d74 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java
@@ -46,7 +46,7 @@ public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
- @Test(groups = "ignoreInCircleCi")
+ @Test()
public void execStart() throws Exception {
String containerName = "generated_" + new SecureRandom().nextInt();
@@ -58,9 +58,14 @@ public void execStart() throws Exception {
dockerClient.startContainerCmd(container.getId()).exec();
ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId())
- .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec();
- dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false)
- .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion();
+ .withAttachStdout(true)
+ .withCmd("touch", "/execStartTest.log")
+ .exec();
+
+ dockerClient.execStartCmd(execCreateCmdResponse.getId())
+ .withDetach(false)
+ .exec(new ExecStartResultCallback(System.out, System.err))
+ .awaitCompletion();
InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec();
@@ -73,7 +78,7 @@ public void execStart() throws Exception {
assertTrue(responseAsString.length() > 0);
}
- @Test(groups = "ignoreInCircleCi")
+ @Test()
public void execStartAttached() throws Exception {
String containerName = "generated_" + new SecureRandom().nextInt();
@@ -85,9 +90,14 @@ public void execStartAttached() throws Exception {
dockerClient.startContainerCmd(container.getId()).exec();
ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId())
- .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec();
- dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false)
- .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion();
+ .withAttachStdout(true)
+ .withCmd("touch", "/execStartTest.log")
+ .exec();
+
+ dockerClient.execStartCmd(execCreateCmdResponse.getId())
+ .withDetach(false)
+ .exec(new ExecStartResultCallback(System.out, System.err))
+ .awaitCompletion();
InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec();
Boolean bytesAvailable = response.available() > 0;
@@ -99,7 +109,7 @@ public void execStartAttached() throws Exception {
assertTrue(responseAsString.length() > 0);
}
- @Test(groups = "ignoreInCircleCi")
+ @Test()
public void execStartAttachStdin() throws Exception {
String containerName = "generated_" + new SecureRandom().nextInt();
@@ -115,14 +125,23 @@ public void execStartAttachStdin() throws Exception {
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId())
- .withAttachStdout(true).withAttachStdin(true).withCmd("cat").exec();
- boolean completed = dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true).withStdIn(stdin)
- .exec(new ExecStartResultCallback(stdout, System.err)).awaitCompletion(5, TimeUnit.SECONDS);
+ .withAttachStdout(true)
+ .withAttachStdin(true)
+ .withCmd("cat")
+ .exec();
+
+ boolean completed = dockerClient.execStartCmd(execCreateCmdResponse.getId())
+ .withDetach(false)
+ .withTty(true)
+ .withStdIn(stdin)
+ .exec(new ExecStartResultCallback(stdout, System.err))
+ .awaitCompletion(5, TimeUnit.SECONDS);
assertTrue(completed, "The process was not finished.");
assertEquals(stdout.toString("UTF-8"), "STDIN\n");
}
+ @Test()
public void execStartAttachStdinToShell() throws Exception {
String containerName = "generated_" + new SecureRandom().nextInt();
@@ -156,7 +175,7 @@ public void execStartAttachStdinToShell() throws Exception {
assertThat(stdout.toString(), containsString("etc\n"));
}
- @Test(groups = "ignoreInCircleCi")
+ @Test()
public void execStartNotAttachedStdin() throws Exception {
String containerName = "generated_" + new SecureRandom().nextInt();
@@ -172,11 +191,18 @@ public void execStartNotAttachedStdin() throws Exception {
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId())
- .withAttachStdout(true).withAttachStdin(false).withCmd("/bin/sh").exec();
- boolean completed = dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withStdIn(stdin)
- .exec(new ExecStartResultCallback(stdout, System.err)).awaitCompletion(5, TimeUnit.SECONDS);
+ .withAttachStdout(true)
+ .withAttachStdin(false)
+ .withCmd("/bin/sh").exec();
- assertTrue(completed, "The process was not finished.");
+ boolean completed = dockerClient.execStartCmd(execCreateCmdResponse.getId())
+ .withDetach(false)
+ .withStdIn(stdin)
+ .exec(new ExecStartResultCallback(stdout, System.err))
+ .awaitCompletion(5, TimeUnit.SECONDS);
+
+ // with v1.22 of the remote api the server closed the connection when no stdin was attached while exec create, so completed was true
+ assertFalse(completed, "The process was not finished.");
assertEquals(stdout.toString(), "");
}
}
From 63f276a99c0f5245e47e869431d6c2b11a2dd101 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Tue, 7 Jun 2016 23:36:25 +0200
Subject: [PATCH 021/736] Fix load certs from file system
---
.../dockerjava/core/LocalDirectorySSLConfig.java | 15 +++++++++++++--
.../dockerjava/core/util/CertificateUtils.java | 10 +---------
2 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java
index e39a2bc40..961c282de 100644
--- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java
+++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java
@@ -2,7 +2,10 @@
import static com.google.common.base.Preconditions.checkNotNull;
+import java.io.File;
import java.io.Serializable;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import java.security.Security;
import javax.net.ssl.SSLContext;
@@ -50,9 +53,17 @@ public SSLContext getSSLContext() {
System.setProperty("https.protocols", httpProtocols);
}
- sslConfig.keyStore(CertificateUtils.createKeyStore(dockerCertPath));
+ String caPemPath = dockerCertPath + File.separator + "ca.pem";
+ String keyPemPath = dockerCertPath + File.separator + "key.pem";
+ String certPemPath = dockerCertPath + File.separator + "cert.pem";
+
+ String keypem = new String(Files.readAllBytes(Paths.get(keyPemPath)));
+ String certpem = new String(Files.readAllBytes(Paths.get(certPemPath)));
+ String capem = new String(Files.readAllBytes(Paths.get(caPemPath)));
+
+ sslConfig.keyStore(CertificateUtils.createKeyStore(keypem, certpem));
sslConfig.keyStorePassword("docker");
- sslConfig.trustStore(CertificateUtils.createTrustStore(dockerCertPath));
+ sslConfig.trustStore(CertificateUtils.createTrustStore(capem));
return sslConfig.createSSLContext();
diff --git a/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java
index 6e1925630..c760331d6 100644
--- a/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java
+++ b/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java
@@ -18,6 +18,7 @@
import java.util.List;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.cert.X509CertificateHolder;
@@ -49,15 +50,6 @@ public static boolean verifyCertificatesExist(String dockerCertPath) {
return result;
}
- /**
- * @param dockerCertPath with standard named files.
- */
- public static KeyStore createKeyStore(final String dockerCertPath) throws NoSuchAlgorithmException,
- InvalidKeySpecException, IOException, CertificateException, KeyStoreException {
- return createKeyStore("key.pem", "cert.pem");
- }
-
-
@SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE")
public static KeyStore createKeyStore(final String keypem, final String certpem) throws NoSuchAlgorithmException,
InvalidKeySpecException, IOException, CertificateException, KeyStoreException {
From fefd16017d70b29e1d1f337bf9338ce0cb9543a3 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Tue, 7 Jun 2016 23:38:37 +0200
Subject: [PATCH 022/736] Update CHANGELOG.md
---
CHANGELOG.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f55b2cd75..6125ab5b7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,12 @@
Change Log
===
+3.0.0-SNAPSHOT
+---
+
+All changes
+* [#529] (https://github.com/docker-java/docker-java/pull/529) Refactor CertUtils. Support ECDSA and PrivateKey
+
v3.0.0
---
Notes
From 605815651521f3270e01b67b0e89b183e10cedbe Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Tue, 7 Jun 2016 23:39:22 +0200
Subject: [PATCH 023/736] Update CHANGELOG.md
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6125ab5b7..1f3b7e9b9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,7 @@
Change Log
===
-3.0.0-SNAPSHOT
+3.0.1-SNAPSHOT
---
All changes
From 3a2dcc490879d345c6c96b215f1e47c995d293f5 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 8 Jun 2016 21:59:57 +0300
Subject: [PATCH 024/736] Implemented Device parser (#593)
* Implement Device parser
Signed-off-by: Kanstantsin Shautsou
* Add more tests, fix.
---
.../github/dockerjava/api/model/Device.java | 76 +++++++++++++++
.../dockerjava/api/model/DeviceTest.java | 95 +++++++++++++++++++
2 files changed, 171 insertions(+)
create mode 100644 src/test/java/com/github/dockerjava/api/model/DeviceTest.java
diff --git a/src/main/java/com/github/dockerjava/api/model/Device.java b/src/main/java/com/github/dockerjava/api/model/Device.java
index 9240239b1..f2b75e3f5 100644
--- a/src/main/java/com/github/dockerjava/api/model/Device.java
+++ b/src/main/java/com/github/dockerjava/api/model/Device.java
@@ -1,6 +1,8 @@
package com.github.dockerjava.api.model;
import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.commons.lang.BooleanUtils.isNotTrue;
+import static org.apache.commons.lang.StringUtils.isEmpty;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
@@ -9,6 +11,11 @@
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
+import javax.annotation.Nonnull;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
@JsonInclude(Include.NON_NULL)
public class Device {
@@ -45,6 +52,75 @@ public String getPathOnHost() {
return pathOnHost;
}
+ /**
+ * @link https://github.com/docker/docker/blob/6b4a46f28266031ce1a1315f17fb69113a06efe1/runconfig/opts/parse_test.go#L468
+ */
+ @Nonnull
+ public static Device parse(@Nonnull String deviceStr) {
+ String src = "";
+ String dst = "";
+ String permissions = "rwm";
+ final String[] arr = deviceStr.trim().split(":");
+ // java String.split() returns wrong length, use tokenizer instead
+ switch (new StringTokenizer(deviceStr, ":").countTokens()) {
+ case 3: {
+ // Mismatches docker code logic. While there is no validations after parsing, checking heregit
+ if (validDeviceMode(arr[2])) {
+ permissions = arr[2];
+ } else {
+ throw new IllegalArgumentException("Invalid device specification: " + deviceStr);
+ }
+ }
+ case 2: {
+ if (validDeviceMode(arr[1])) {
+ permissions = arr[1];
+ } else {
+ dst = arr[1];
+ }
+ }
+ case 1: {
+ src = arr[0];
+ break;
+ }
+ default: {
+ throw new IllegalArgumentException("Invalid device specification: " + deviceStr);
+ }
+ }
+
+ if (isEmpty(dst)) {
+ dst = src;
+ }
+
+ return new Device(permissions, dst, src);
+ }
+
+ /**
+ * ValidDeviceMode checks if the mode for device is valid or not.
+ * Valid mode is a composition of r (read), w (write), and m (mknod).
+ *
+ * @link https://github.com/docker/docker/blob/6b4a46f28266031ce1a1315f17fb69113a06efe1/runconfig/opts/parse.go#L796
+ */
+ private static boolean validDeviceMode(String deviceMode) {
+ Map validModes = new HashMap<>(3);
+ validModes.put("r", true);
+ validModes.put("w", true);
+ validModes.put("m", true);
+
+ if (isEmpty(deviceMode)) {
+ return false;
+ }
+
+ for (char ch : deviceMode.toCharArray()) {
+ final String mode = String.valueOf(ch);
+ if (isNotTrue(validModes.get(mode))) {
+ return false; // wrong mode
+ }
+ validModes.put(mode, false);
+ }
+
+ return true;
+ }
+
@Override
public boolean equals(Object obj) {
if (obj instanceof Device) {
diff --git a/src/test/java/com/github/dockerjava/api/model/DeviceTest.java b/src/test/java/com/github/dockerjava/api/model/DeviceTest.java
new file mode 100644
index 000000000..5c48c4886
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/api/model/DeviceTest.java
@@ -0,0 +1,95 @@
+package com.github.dockerjava.api.model;
+
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import static junit.framework.Assert.fail;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * @author Kanstantsin Shautsou
+ */
+public class DeviceTest {
+
+ public static List validPaths = Arrays.asList(
+ "/home",
+ "/home:/home",
+ "/home:/something/else",
+ "/with space",
+ "/home:/with space",
+ "relative:/absolute-path",
+ "hostPath:/containerPath:r",
+ "/hostPath:/containerPath:rw",
+ "/hostPath:/containerPath:mrw"
+ );
+
+ public static HashMap badPaths = new LinkedHashMap() {{
+ put("", "bad format for path: ");
+ // TODO implement ValidatePath
+// put("./", "./ is not an absolute path");
+// put("../", "../ is not an absolute path");
+// put("/:../", "../ is not an absolute path");
+// put("/:path", "path is not an absolute path");
+// put(":", "bad format for path: :");
+// put("/tmp:", " is not an absolute path");
+// put(":test", "bad format for path: :test");
+// put(":/test", "bad format for path: :/test");
+// put("tmp:", " is not an absolute path");
+// put(":test:", "bad format for path: :test:");
+// put("::", "bad format for path: ::");
+// put(":::", "bad format for path: :::");
+// put("/tmp:::", "bad format for path: /tmp:::");
+// put(":/tmp::", "bad format for path: :/tmp::");
+// put("path:ro", "ro is not an absolute path");
+// put("path:rr", "rr is not an absolute path");
+ put("a:/b:ro", "bad mode specified: ro");
+ put("a:/b:rr", "bad mode specified: rr");
+ }};
+
+ @Test
+ public void testParse() throws Exception {
+ assertThat(Device.parse("/dev/sda:/dev/xvdc:r"),
+ equalTo(new Device("r", "/dev/xvdc", "/dev/sda")));
+
+ assertThat(Device.parse("/dev/snd:rw"),
+ equalTo(new Device("rw", "/dev/snd", "/dev/snd")));
+
+ assertThat(Device.parse("/dev/snd:/something"),
+ equalTo(new Device("rwm", "/something", "/dev/snd")));
+
+ assertThat(Device.parse("/dev/snd:/something:rw"),
+ equalTo(new Device("rw", "/something", "/dev/snd")));
+
+ }
+
+ @Test
+ public void testParseBadPaths() {
+ for (Map.Entry entry : badPaths.entrySet()) {
+ final String deviceStr = entry.getKey();
+ try {
+ Device.parse(deviceStr);
+ fail("Should fail because: " + entry.getValue() + " '" + deviceStr + "'");
+ } catch (IllegalArgumentException ex) {
+ assertThat(ex.getMessage(), containsString("Invalid device specification:"));
+ }
+ }
+ }
+
+ @Test
+ public void testParseValidPaths() {
+ for (String path : validPaths) {
+ Device.parse(path);
+ }
+ }
+}
From 72597d723e56d84890d3821d734a46cc2e0a9441 Mon Sep 17 00:00:00 2001
From: Marcus Linke
Date: Thu, 9 Jun 2016 23:44:04 +0200
Subject: [PATCH 025/736] Complement logging tests
---
.../client/AbstractDockerClientTest.java | 18 ++++
.../core/command/LogContainerCmdImplTest.java | 93 ++++++++++++++-----
.../netty/exec/LogContainerCmdExecTest.java | 93 ++++++++++++++-----
3 files changed, 162 insertions(+), 42 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
index 231e709c1..1a52bbd3f 100644
--- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
+++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java
@@ -225,8 +225,21 @@ protected String containerLog(String containerId) throws Exception {
public static class LogContainerTestCallback extends LogContainerResultCallback {
protected final StringBuffer log = new StringBuffer();
+ List collectedFrames = new ArrayList();
+
+ boolean collectFrames = false;
+
+ public LogContainerTestCallback() {
+ this(false);
+ }
+
+ public LogContainerTestCallback(boolean collectFrames) {
+ this.collectFrames = collectFrames;
+ }
+
@Override
public void onNext(Frame frame) {
+ if(collectFrames) collectedFrames.add(frame);
log.append(new String(frame.getPayload()));
}
@@ -234,6 +247,11 @@ public void onNext(Frame frame) {
public String toString() {
return log.toString();
}
+
+
+ public List getCollectedFrames() {
+ return collectedFrames;
+ }
}
protected String buildImage(File baseDir) throws Exception {
diff --git a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java
index 817179eb2..869bcbb1a 100644
--- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java
@@ -8,6 +8,7 @@
import java.io.IOException;
import java.lang.reflect.Method;
+import java.util.concurrent.TimeUnit;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
@@ -17,6 +18,7 @@
import org.testng.annotations.Test;
import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.api.model.StreamType;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.client.AbstractDockerClientTest;
@@ -44,31 +46,65 @@ public void afterMethod(ITestResult result) {
}
@Test
- public void asyncLogContainer() throws Exception {
+ public void asyncLogContainerWithTtyEnabled() throws Exception {
- String snippet = "hello world";
-
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet)
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("/bin/sh", "-c", "while true; do echo hello; sleep 1; done")
+ .withTty(true)
.exec();
LOG.info("Created container: {}", container.toString());
assertThat(container.getId(), not(isEmptyString()));
- dockerClient.startContainerCmd(container.getId()).exec();
+ dockerClient.startContainerCmd(container.getId())
+ .exec();
- int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback())
- .awaitStatusCode();
+ LogContainerTestCallback loggingCallback = new LogContainerTestCallback(true);
- assertThat(exitCode, equalTo(0));
+ // this essentially test the since=0 case
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .withFollowStream(true)
+ .withTailAll()
+ .exec(loggingCallback);
- LogContainerTestCallback loggingCallback = new LogContainerTestCallback();
+ loggingCallback.awaitCompletion(3, TimeUnit.SECONDS);
+
+ assertTrue(loggingCallback.toString().contains("hello"));
+
+ assertEquals(loggingCallback.getCollectedFrames().get(0).getStreamType(), StreamType.RAW);
+ }
+
+ @Test
+ public void asyncLogContainerWithTtyDisabled() throws Exception {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("/bin/sh", "-c", "while true; do echo hello; sleep 1; done")
+ .withTty(false)
+ .exec();
+
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId())
+ .exec();
+
+ LogContainerTestCallback loggingCallback = new LogContainerTestCallback(true);
// this essentially test the since=0 case
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback);
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .withFollowStream(true)
+ .withTailAll()
+ .exec(loggingCallback);
- loggingCallback.awaitCompletion();
+ loggingCallback.awaitCompletion(3, TimeUnit.SECONDS);
- assertTrue(loggingCallback.toString().contains(snippet));
+ assertTrue(loggingCallback.toString().contains("hello"));
+
+ assertEquals(loggingCallback.getCollectedFrames().get(0).getStreamType(), StreamType.STDOUT);
}
@Test
@@ -105,7 +141,8 @@ public void asyncMultipleLogContainer() throws Exception {
String snippet = "hello world";
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet)
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("/bin/echo", snippet)
.exec();
LOG.info("Created container: {}", container.toString());
@@ -113,26 +150,36 @@ public void asyncMultipleLogContainer() throws Exception {
dockerClient.startContainerCmd(container.getId()).exec();
- int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback())
+ int exitCode = dockerClient.waitContainerCmd(container.getId())
+ .exec(new WaitContainerResultCallback())
.awaitStatusCode();
assertThat(exitCode, equalTo(0));
LogContainerTestCallback loggingCallback = new LogContainerTestCallback();
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback);
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .exec(loggingCallback);
loggingCallback.close();
loggingCallback = new LogContainerTestCallback();
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback);
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .exec(loggingCallback);
loggingCallback.close();
loggingCallback = new LogContainerTestCallback();
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback);
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .exec(loggingCallback);
loggingCallback.awaitCompletion();
@@ -143,7 +190,8 @@ public void asyncMultipleLogContainer() throws Exception {
public void asyncLogContainerWithSince() throws Exception {
String snippet = "hello world";
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet)
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("/bin/echo", snippet)
.exec();
LOG.info("Created container: {}", container.toString());
@@ -153,19 +201,22 @@ public void asyncLogContainerWithSince() throws Exception {
dockerClient.startContainerCmd(container.getId()).exec();
- int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback())
+ int exitCode = dockerClient.waitContainerCmd(container.getId())
+ .exec(new WaitContainerResultCallback())
.awaitStatusCode();
assertThat(exitCode, equalTo(0));
LogContainerTestCallback loggingCallback = new LogContainerTestCallback();
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withSince(timestamp)
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .withSince(timestamp)
.exec(loggingCallback);
loggingCallback.awaitCompletion();
assertThat(loggingCallback.toString(), containsString(snippet));
}
-
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java
index 310994755..fe408ac18 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java
@@ -8,6 +8,7 @@
import java.io.IOException;
import java.lang.reflect.Method;
+import java.util.concurrent.TimeUnit;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
@@ -18,6 +19,7 @@
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.api.model.StreamType;
import com.github.dockerjava.core.command.WaitContainerResultCallback;
import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
@@ -45,31 +47,65 @@ public void afterMethod(ITestResult result) {
}
@Test
- public void asyncLogContainer() throws Exception {
+ public void asyncLogContainerWithTtyEnabled() throws Exception {
- String snippet = "hello world";
-
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet)
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("/bin/sh", "-c", "while true; do echo hello; sleep 1; done")
+ .withTty(true)
.exec();
LOG.info("Created container: {}", container.toString());
assertThat(container.getId(), not(isEmptyString()));
- dockerClient.startContainerCmd(container.getId()).exec();
+ dockerClient.startContainerCmd(container.getId())
+ .exec();
- int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback())
- .awaitStatusCode();
+ LogContainerTestCallback loggingCallback = new LogContainerTestCallback(true);
- assertThat(exitCode, equalTo(0));
+ // this essentially test the since=0 case
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .withFollowStream(true)
+ .withTailAll()
+ .exec(loggingCallback);
- LogContainerTestCallback loggingCallback = new LogContainerTestCallback();
+ loggingCallback.awaitCompletion(3, TimeUnit.SECONDS);
+
+ assertTrue(loggingCallback.toString().contains("hello"));
+
+ assertEquals(loggingCallback.getCollectedFrames().get(0).getStreamType(), StreamType.RAW);
+ }
+
+ @Test
+ public void asyncLogContainerWithTtyDisabled() throws Exception {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("/bin/sh", "-c", "while true; do echo hello; sleep 1; done")
+ .withTty(false)
+ .exec();
+
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId())
+ .exec();
+
+ LogContainerTestCallback loggingCallback = new LogContainerTestCallback(true);
// this essentially test the since=0 case
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback);
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .withFollowStream(true)
+ .withTailAll()
+ .exec(loggingCallback);
- loggingCallback.awaitCompletion();
+ loggingCallback.awaitCompletion(3, TimeUnit.SECONDS);
- assertTrue(loggingCallback.toString().contains(snippet));
+ assertTrue(loggingCallback.toString().contains("hello"));
+
+ assertEquals(loggingCallback.getCollectedFrames().get(0).getStreamType(), StreamType.STDOUT);
}
@Test
@@ -106,7 +142,8 @@ public void asyncMultipleLogContainer() throws Exception {
String snippet = "hello world";
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet)
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("/bin/echo", snippet)
.exec();
LOG.info("Created container: {}", container.toString());
@@ -114,26 +151,36 @@ public void asyncMultipleLogContainer() throws Exception {
dockerClient.startContainerCmd(container.getId()).exec();
- int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback())
+ int exitCode = dockerClient.waitContainerCmd(container.getId())
+ .exec(new WaitContainerResultCallback())
.awaitStatusCode();
assertThat(exitCode, equalTo(0));
LogContainerTestCallback loggingCallback = new LogContainerTestCallback();
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback);
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .exec(loggingCallback);
loggingCallback.close();
loggingCallback = new LogContainerTestCallback();
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback);
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .exec(loggingCallback);
loggingCallback.close();
loggingCallback = new LogContainerTestCallback();
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback);
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .exec(loggingCallback);
loggingCallback.awaitCompletion();
@@ -144,7 +191,8 @@ public void asyncMultipleLogContainer() throws Exception {
public void asyncLogContainerWithSince() throws Exception {
String snippet = "hello world";
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet)
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("/bin/echo", snippet)
.exec();
LOG.info("Created container: {}", container.toString());
@@ -154,19 +202,22 @@ public void asyncLogContainerWithSince() throws Exception {
dockerClient.startContainerCmd(container.getId()).exec();
- int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback())
+ int exitCode = dockerClient.waitContainerCmd(container.getId())
+ .exec(new WaitContainerResultCallback())
.awaitStatusCode();
assertThat(exitCode, equalTo(0));
LogContainerTestCallback loggingCallback = new LogContainerTestCallback();
- dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withSince(timestamp)
+ dockerClient.logContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .withSince(timestamp)
.exec(loggingCallback);
loggingCallback.awaitCompletion();
assertThat(loggingCallback.toString(), containsString(snippet));
}
-
}
From 9ae14cb9567b8257be26f41423f94cf61391969c Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Mon, 13 Jun 2016 22:56:48 +0200
Subject: [PATCH 026/736] Refactor configuration of SSL to allow override with
custom config (#596)
* Refactor configuration of SSL to allow override with custom config
* Store SSLConfig instead SSLContext
* avoid NPE
* prepare release
* Coding style changes
---
pom.xml | 2 +-
.../api/command/DockerCmdExecFactory.java | 4 -
.../core/DefaultDockerClientConfig.java | 455 ++++++++++++++++++
.../dockerjava/core/DockerClientBuilder.java | 4 +-
.../dockerjava/core/DockerClientConfig.java | 436 +----------------
.../dockerjava/core/DockerClientImpl.java | 4 +-
.../jaxrs/DockerCmdExecFactoryImpl.java | 28 +-
.../netty/DockerCmdExecFactoryImpl.java | 38 +-
.../client/AbstractDockerClientTest.java | 8 +-
...ava => DefaultDockerClientConfigTest.java} | 96 ++--
.../dockerjava/core/DockerClientImplTest.java | 2 +-
.../core/TestDockerCmdExecFactory.java | 6 -
12 files changed, 552 insertions(+), 531 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
rename src/test/java/com/github/dockerjava/core/{DockerClientConfigTest.java => DefaultDockerClientConfigTest.java} (54%)
diff --git a/pom.xml b/pom.xml
index bee178a6d..3f9caa55a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.1-SNAPSHOT
+ 3.0.0-kostyasha-3docker-javahttps://github.com/docker-java/docker-java
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
index ae090e434..0de3afe38 100644
--- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
@@ -3,8 +3,6 @@
import java.io.Closeable;
import java.io.IOException;
-import javax.net.ssl.SSLContext;
-
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.RemoteApiVersion;
@@ -117,8 +115,6 @@ public interface DockerCmdExecFactory extends Closeable {
DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec();
- DockerCmdExecFactory withSSLContext(SSLContext sslContext);
-
@Override
void close() throws IOException;
diff --git a/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
new file mode 100644
index 000000000..4641f9d3c
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
@@ -0,0 +1,455 @@
+package com.github.dockerjava.core;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
+import com.github.dockerjava.api.exception.DockerClientException;
+import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.AuthConfigurations;
+import com.github.dockerjava.core.NameParser.HostnameReposName;
+import com.github.dockerjava.core.NameParser.ReposTag;
+
+/**
+ * Respects some of the docker CLI options. See https://docs.docker.com/engine/reference/commandline/cli/#environment-variables
+ */
+public class DefaultDockerClientConfig implements Serializable, DockerClientConfig {
+
+ private static final long serialVersionUID = -4307357472441531489L;
+
+ public static final String DOCKER_HOST = "DOCKER_HOST";
+
+ public static final String DOCKER_TLS_VERIFY = "DOCKER_TLS_VERIFY";
+
+ public static final String DOCKER_CONFIG = "DOCKER_CONFIG";
+
+ public static final String DOCKER_CERT_PATH = "DOCKER_CERT_PATH";
+
+ public static final String API_VERSION = "api.version";
+
+ public static final String REGISTRY_USERNAME = "registry.username";
+
+ public static final String REGISTRY_PASSWORD = "registry.password";
+
+ public static final String REGISTRY_EMAIL = "registry.email";
+
+ public static final String REGISTRY_URL = "registry.url";
+
+ private static final String DOCKER_JAVA_PROPERTIES = "docker-java.properties";
+
+ private static final String DOCKER_CFG = ".dockercfg";
+
+ private static final Set CONFIG_KEYS = new HashSet();
+
+ static {
+ CONFIG_KEYS.add(DOCKER_HOST);
+ CONFIG_KEYS.add(DOCKER_TLS_VERIFY);
+ CONFIG_KEYS.add(DOCKER_CONFIG);
+ CONFIG_KEYS.add(DOCKER_CERT_PATH);
+ CONFIG_KEYS.add(API_VERSION);
+ CONFIG_KEYS.add(REGISTRY_USERNAME);
+ CONFIG_KEYS.add(REGISTRY_PASSWORD);
+ CONFIG_KEYS.add(REGISTRY_EMAIL);
+ CONFIG_KEYS.add(REGISTRY_URL);
+ }
+
+ private final URI dockerHost;
+
+ private final String registryUsername, registryPassword, registryEmail, registryUrl, dockerConfig;
+
+ private final SSLConfig sslConfig;
+
+ private final RemoteApiVersion apiVersion;
+
+ DefaultDockerClientConfig(URI dockerHost, String dockerConfig, String apiVersion, String registryUrl,
+ String registryUsername, String registryPassword, String registryEmail, SSLConfig sslConfig) {
+ this.dockerHost = checkDockerHostScheme(dockerHost);
+ this.dockerConfig = dockerConfig;
+ this.apiVersion = RemoteApiVersion.parseConfigWithDefault(apiVersion);
+ this.sslConfig = sslConfig;
+ this.registryUsername = registryUsername;
+ this.registryPassword = registryPassword;
+ this.registryEmail = registryEmail;
+ this.registryUrl = registryUrl;
+ }
+
+ private URI checkDockerHostScheme(URI dockerHost) {
+ if ("tcp".equals(dockerHost.getScheme()) || "unix".equals(dockerHost.getScheme())) {
+ return dockerHost;
+ } else {
+ throw new DockerClientException("Unsupported protocol scheme found: '" + dockerHost
+ + "'. Only 'tcp://' or 'unix://' supported.");
+ }
+ }
+
+ private static Properties loadIncludedDockerProperties(Properties systemProperties) {
+ try (InputStream is = DefaultDockerClientConfig.class.getResourceAsStream("/" + DOCKER_JAVA_PROPERTIES)) {
+ Properties p = new Properties();
+ p.load(is);
+ replaceProperties(p, systemProperties);
+ return p;
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static void replaceProperties(Properties properties, Properties replacements) {
+ for (Object objectKey : properties.keySet()) {
+ String key = objectKey.toString();
+ properties.setProperty(key, replaceProperties(properties.getProperty(key), replacements));
+ }
+ }
+
+ private static String replaceProperties(String s, Properties replacements) {
+ for (Map.Entry
- *
- * Connector instances created via this connector provider use {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED chunked
- * encoding} as a default setting. This can be overridden by the
- * {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING}. By default the
- * {@link org.glassfish.jersey.client.ClientProperties#CHUNKED_ENCODING_SIZE} property is only supported when using the default
- * {@code org.apache.http.conn.HttpClientConnectionManager} instance. If custom connection manager is used, then chunked encoding size can
- * be set by providing a custom {@code org.apache.http.HttpClientConnection} (via custom
- * {@code org.apache.http.impl.conn.ManagedHttpClientConnectionFactory}) and overriding it's {@code createOutputStream} method.
- *
- *
- * Use of authorization by the AHC-based connectors is dependent on the chunk encoding setting. If the entity buffering is enabled, the
- * entity is buffered and authorization can be performed automatically in response to a 401 by sending the request again. When entity
- * buffering is disabled (chunked encoding is used) then the property
- * {@link org.glassfish.jersey.apache.connector.ApacheClientProperties#PREEMPTIVE_BASIC_AUTHENTICATION} must be set to {@code true}.
- *
- *
- * If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an entity is not read from the response then
- * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called after processing the response to release connection-based
- * resources.
- *
- *
- * If a response entity is obtained that is an instance of {@link java.io.Closeable} then the instance MUST be closed after processing the
- * entity to release connection-based resources.
- *
- *
- * The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE.
- *
- *
- * @author Pavel Bucek (pavel.bucek at oracle.com)
- * @author Arul Dhesiaseelan (aruld at acm.org)
- * @author jorgeluisw at mac.com
- * @author Marek Potociar (marek.potociar at oracle.com)
- * @author Paul Sandoz (paul.sandoz at oracle.com)
- * @since 2.5
- */
-public class ApacheConnectorProvider implements ConnectorProvider {
-
- @Override
- public Connector getConnector(Client client, Configuration runtimeConfig) {
- return new ApacheConnector(runtimeConfig);
- }
-
- /**
- * Retrieve the underlying Apache {@link HttpClient} instance from {@link org.glassfish.jersey.client.JerseyClient} or
- * {@link org.glassfish.jersey.client.JerseyWebTarget} configured to use {@code ApacheConnectorProvider}.
- *
- * @param component
- * {@code JerseyClient} or {@code JerseyWebTarget} instance that is configured to use {@code ApacheConnectorProvider}.
- * @return underlying Apache {@code HttpClient} instance.
- *
- * @throws java.lang.IllegalArgumentException
- * in case the {@code component} is neither {@code JerseyClient} nor {@code JerseyWebTarget} instance or in case the
- * component is not configured to use a {@code ApacheConnectorProvider}.
- * @since 2.8
- */
- public static HttpClient getHttpClient(Configurable> component) {
- if (!(component instanceof Initializable)) {
- throw new IllegalArgumentException(LocalizationMessages.INVALID_CONFIGURABLE_COMPONENT_TYPE(component
- .getClass().getName()));
- }
-
- final Initializable> initializable = (Initializable>) component;
- Connector connector = initializable.getConfiguration().getConnector();
- if (connector == null) {
- initializable.preInitialize();
- connector = initializable.getConfiguration().getConnector();
- }
-
- if (connector instanceof ApacheConnector) {
- return ((ApacheConnector) connector).getHttpClient();
- }
-
- throw new IllegalArgumentException(LocalizationMessages.EXPECTED_CONNECTOR_PROVIDER_NOT_USED());
- }
-}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt b/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt
deleted file mode 100644
index c3c1415f1..000000000
--- a/src/main/java/com/github/dockerjava/jaxrs/connector/README.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This package exists as a workaround to https://java.net/jira/browse/JERSEY-2852.
-It introduces ApacheConnectorClientResponse which extends ClientResponse and closes
-the underlying CloseableHttpResponse when close() is called.
\ No newline at end of file
diff --git a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
index 21507e44e..f8bf33fef 100644
--- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.core.command;
+import static org.apache.commons.lang.StringUtils.isEmpty;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.isEmptyString;
@@ -11,7 +12,9 @@
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;
+import org.apache.commons.codec.binary.StringUtils;
import org.testng.ITestResult;
+import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
@@ -74,7 +77,7 @@ public void onNext(Frame frame) {
assertThat(callback.toString(), containsString(snippet));
}
- @Test
+ @Test(groups = "badTests", enabled = false)
public void attachContainerWithTTY() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
@@ -97,14 +100,24 @@ public void onNext(Frame frame) {
};
};
- dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true)
- .exec(callback).awaitCompletion(15, TimeUnit.SECONDS);
+ dockerClient.attachContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .withFollowStream(true)
+ .exec(callback)
+ .awaitCompletion();
+// .awaitCompletion(15, TimeUnit.SECONDS);
callback.close();
+ dockerClient.close();
+
System.out.println("log: " + callback.toString());
// HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0);
-
+ RuntimeException firstError = callback.getFirstError();
+ if (isEmpty(callback.toString())) {
+ throw new SkipException("com.github.dockerjava.api.exception.InternalServerErrorException: http: Hijack is incompatible with use of CloseNotifier");
+ }
assertThat(callback.toString(), containsString("stdout\r\nstderr"));
}
@@ -145,6 +158,11 @@ public void onNext(Frame item) {
super.onNext(item);
}
+ @Override
+ public RuntimeException getFirstError() {
+ return super.getFirstError();
+ }
+
@Override
public String toString() {
return log.toString();
diff --git a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
index 7f8e66609..ba3d5a9ca 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
@@ -134,8 +134,12 @@ public void onNext(Frame frame) {
};
};
- dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true)
- .exec(callback).awaitCompletion(10, TimeUnit.SECONDS);
+ dockerClient.attachContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .withFollowStream(true)
+ .exec(callback)
+ .awaitCompletion(10, TimeUnit.SECONDS);
callback.close();
// HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0);
From 52ff6d82952a4b1ff2426a24e239547e32f38314 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 8 Jul 2016 00:31:26 +0300
Subject: [PATCH 044/736] revert dep and test
---
pom.xml | 18 ++++--------------
.../command/AttachContainerCmdImplTest.java | 11 ++---------
2 files changed, 6 insertions(+), 23 deletions(-)
diff --git a/pom.xml b/pom.xml
index cb43f2897..a13ac1fc0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,7 +57,7 @@
1.7.211.54
- 2016-04-06T22-21-19
+ 2015-01-27T15-02-1419.0
@@ -104,20 +104,10 @@
jersey-client${jersey.version}
-
-
-
-
-
- com.kohlschutter.junixsocket
- junixsocket-common
- 2.0.4
-
-
- com.kohlschutter.junixsocket
- junixsocket-native-common
- 2.0.4
+ de.gesellix
+ unix-socket-factory
+ ${unix-socket-factory.version}
diff --git a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
index f8bf33fef..ef69984f3 100644
--- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java
@@ -77,7 +77,7 @@ public void onNext(Frame frame) {
assertThat(callback.toString(), containsString(snippet));
}
- @Test(groups = "badTests", enabled = false)
+ @Test
public void attachContainerWithTTY() throws Exception {
File baseDir = new File(Thread.currentThread().getContextClassLoader()
@@ -105,19 +105,12 @@ public void onNext(Frame frame) {
.withStdOut(true)
.withFollowStream(true)
.exec(callback)
- .awaitCompletion();
-// .awaitCompletion(15, TimeUnit.SECONDS);
+ .awaitCompletion(15, TimeUnit.SECONDS);
callback.close();
- dockerClient.close();
-
System.out.println("log: " + callback.toString());
// HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0);
- RuntimeException firstError = callback.getFirstError();
- if (isEmpty(callback.toString())) {
- throw new SkipException("com.github.dockerjava.api.exception.InternalServerErrorException: http: Hijack is incompatible with use of CloseNotifier");
- }
assertThat(callback.toString(), containsString("stdout\r\nstderr"));
}
From 19d5f84c0bfe9494d558f991e073680195989371 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 8 Jul 2016 00:44:37 +0300
Subject: [PATCH 045/736] Fix version
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 3f9caa55a..bee178a6d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.0-kostyasha-3
+ 3.0.1-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
From 1a148f2e51ac908cfa9a23e0f847a07b2c155797 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 8 Jul 2016 01:14:28 +0300
Subject: [PATCH 046/736] Skip auth tests
---
pom.xml | 3 ++-
.../github/dockerjava/core/command/PushImageCmdImplTest.java | 2 +-
.../com/github/dockerjava/netty/exec/PushImageCmdExecTest.java | 2 +-
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/pom.xml b/pom.xml
index a13ac1fc0..2437baa22 100644
--- a/pom.xml
+++ b/pom.xml
@@ -388,6 +388,7 @@
${maven-surefire-plugin.version}integration
+ integration-auth
@@ -403,7 +404,7 @@
integration
-
+ integration-auth**/*Test.java
diff --git a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java
index e89a071b8..a48750bd1 100644
--- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java
@@ -19,7 +19,7 @@
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.client.AbstractDockerClientTest;
-@Test(groups = "integration")
+@Test(groups = "integration-auth")
public class PushImageCmdImplTest extends AbstractDockerClientTest {
public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdImplTest.class);
diff --git a/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java
index 777cc8eed..5e77a6765 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java
@@ -21,7 +21,7 @@
import com.github.dockerjava.core.command.PushImageResultCallback;
import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
-@Test(groups = "integration")
+@Test(groups = "integration-auth")
public class PushImageCmdExecTest extends AbstractNettyDockerClientTest {
public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdExecTest.class);
From 3a782a9834449f78368c54356d5dd3412ae89917 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 8 Jul 2016 01:26:19 +0300
Subject: [PATCH 047/736] Enable cache
---
.travis.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index b6e6f953b..4491de529 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -33,7 +33,7 @@ env:
cache:
directories:
- $HOME/.travis_cache
-# - $HOME/.m2 install would pollute it
+ - $HOME/.m2 # install will pollute it
before_install:
- pip install --user codecov
From 31d5627be8dad851941f126a5af0aa5385e002b4 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 8 Jul 2016 01:45:09 +0300
Subject: [PATCH 048/736] Disable experimental/testing
---
.travis.yml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 4491de529..9c96c5abd 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -25,10 +25,10 @@ env:
- repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty"
- repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty"
- repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.10.3-0~trusty"
- - repo="testing" DOCKER_HOST="tcp://127.0.0.1:2375"
- - repo="testing" DOCKER_HOST="unix:///var/run/docker.sock"
- - repo="experimental" DOCKER_HOST="tcp://127.0.0.1:2375"
- - repo="experimental" DOCKER_HOST="unix:///var/run/docker.sock"
+# - repo="testing" DOCKER_HOST="tcp://127.0.0.1:2375"
+# - repo="testing" DOCKER_HOST="unix:///var/run/docker.sock"
+# - repo="experimental" DOCKER_HOST="tcp://127.0.0.1:2375"
+# - repo="experimental" DOCKER_HOST="unix:///var/run/docker.sock"
cache:
directories:
From 007f66899f9a84bde102f4740631816973e2fb9a Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 8 Jul 2016 02:12:48 +0300
Subject: [PATCH 049/736] run codecov only on one run
---
.travis.yml | 3 +--
.travis/travis-after-success.sh | 4 +++-
.travis/travis-before-install.sh | 3 +--
.../github/dockerjava/core/command/PushImageCmdImplTest.java | 2 +-
.../github/dockerjava/netty/exec/PushImageCmdExecTest.java | 2 +-
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 9c96c5abd..bb559fd93 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,8 +21,7 @@ env:
- COVERITY_SCAN_NOTIFICATION_EMAIL="kanstantsin.sha@gmail.com"
matrix:
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true FAST_BUILD=true COVERITY=true
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty"
+ - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true COVERITY=true CODECOV=true
- repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty"
- repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.10.3-0~trusty"
# - repo="testing" DOCKER_HOST="tcp://127.0.0.1:2375"
diff --git a/.travis/travis-after-success.sh b/.travis/travis-after-success.sh
index 6d198daf5..695358122 100755
--- a/.travis/travis-after-success.sh
+++ b/.travis/travis-after-success.sh
@@ -1,7 +1,9 @@
#!/usr/bin/env bash
+if [[ $CODECOV == "true" ]]; then
+ codecov
+fi
-codecov
if [[ $TRAVIS_BRANCH == "master" ]] && [[ $TRAVIS_PULL_REQUEST == "false" ]] && [[ $DEPLOY == "true" ]];
then
cat <> ~/settings.xml
diff --git a/.travis/travis-before-install.sh b/.travis/travis-before-install.sh
index 13034fc74..970425f63 100755
--- a/.travis/travis-before-install.sh
+++ b/.travis/travis-before-install.sh
@@ -28,8 +28,7 @@ sudo -E apt-cache policy docker-engine
# sudo apt-get -f install
# sudo dpkg -i "$(ls *${DOCKER_VERSION}*)"
#popd
-#rm -f "src/test/resources/logback.xml"
-mv "src/test/resources/travis-logback.xml" "src/test/resources/logback.xml"
+
echo 'DOCKER_OPTS="-H=unix:///var/run/docker.sock -H=tcp://127.0.0.1:2375"' | sudo tee -a /etc/default/docker
sudo -E restart docker
diff --git a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java
index a48750bd1..0fb32c311 100644
--- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java
@@ -19,7 +19,7 @@
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.client.AbstractDockerClientTest;
-@Test(groups = "integration-auth")
+@Test(groups = {"integration-auth", "integration"})
public class PushImageCmdImplTest extends AbstractDockerClientTest {
public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdImplTest.class);
diff --git a/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java
index 5e77a6765..73e99af6d 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java
@@ -21,7 +21,7 @@
import com.github.dockerjava.core.command.PushImageResultCallback;
import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
-@Test(groups = "integration-auth")
+@Test(groups = {"integration", "integration-auth"})
public class PushImageCmdExecTest extends AbstractNettyDockerClientTest {
public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdExecTest.class);
From 3854e2efd477ae4cba4e0d1c85302ccc2d085c41 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 8 Jul 2016 02:15:44 +0300
Subject: [PATCH 050/736] revert typo
---
.travis/travis-before-install.sh | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.travis/travis-before-install.sh b/.travis/travis-before-install.sh
index 970425f63..13034fc74 100755
--- a/.travis/travis-before-install.sh
+++ b/.travis/travis-before-install.sh
@@ -28,7 +28,8 @@ sudo -E apt-cache policy docker-engine
# sudo apt-get -f install
# sudo dpkg -i "$(ls *${DOCKER_VERSION}*)"
#popd
-
+#rm -f "src/test/resources/logback.xml"
+mv "src/test/resources/travis-logback.xml" "src/test/resources/logback.xml"
echo 'DOCKER_OPTS="-H=unix:///var/run/docker.sock -H=tcp://127.0.0.1:2375"' | sudo tee -a /etc/default/docker
sudo -E restart docker
From 24d3a15001da56083a5c83f47a1f5076e1468195 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 8 Jul 2016 02:31:08 +0300
Subject: [PATCH 051/736] tune timeout
---
.../dockerjava/netty/exec/AttachContainerCmdExecTest.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
index ba3d5a9ca..675c11177 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
@@ -105,7 +105,9 @@ public void onNext(Frame frame) {
InputStream stdin = new ByteArrayInputStream((snippet + "\n").getBytes());
dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true)
- .withStdIn(stdin).exec(callback).awaitCompletion(2, TimeUnit.SECONDS);
+ .withStdIn(stdin)
+ .exec(callback)
+ .awaitCompletion(5, TimeUnit.SECONDS);
callback.close();
assertThat(callback.toString(), containsString(snippet));
From 8837ac38a9a6b820ea292a8afc82a658cb24d883 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 8 Jul 2016 10:50:27 +0300
Subject: [PATCH 052/736] Fix shell scripting
---
.travis/travis-script.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis/travis-script.sh b/.travis/travis-script.sh
index 7046940ff..aeae555ef 100755
--- a/.travis/travis-script.sh
+++ b/.travis/travis-script.sh
@@ -15,7 +15,7 @@ if [ "${FAST_BUILD}" == "true" ]; then
fi
else
if [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$COVERITY" == "true" ] && [ "$IS_COVERITY_SCAN_BRANCH" = "1" ]; then
- COVERITY_SCAN_BUILD_COMMAND="mvn verify"
+ export COVERITY_SCAN_BUILD_COMMAND="mvn verify"
#curl -s "https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh" | bash
./.travis/travisci_build_coverity_scan.sh
else
From 1c14bc3cf04f22a0768e47431a0124425f53e787 Mon Sep 17 00:00:00 2001
From: tejksat
Date: Sat, 9 Jul 2016 11:19:43 +0300
Subject: [PATCH 053/736] Fix for #625 (#630)
* Fix for #625
* Checkstyle errors fixed
---
.../github/dockerjava/netty/WebTarget.java | 63 +++++++++++++++----
.../dockerjava/netty/WebTargetTest.java | 39 ++++++++++++
2 files changed, 89 insertions(+), 13 deletions(-)
create mode 100644 src/test/java/com/github/dockerjava/netty/WebTargetTest.java
diff --git a/src/main/java/com/github/dockerjava/netty/WebTarget.java b/src/main/java/com/github/dockerjava/netty/WebTarget.java
index 090fea67c..ef1510f5c 100644
--- a/src/main/java/com/github/dockerjava/netty/WebTarget.java
+++ b/src/main/java/com/github/dockerjava/netty/WebTarget.java
@@ -2,12 +2,14 @@
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
/**
* This class is basically a replacement of javax.ws.rs.client.WebTarget to allow simpler migration of JAX-RS code to a netty based
* implementation.
@@ -16,32 +18,40 @@
*/
public class WebTarget {
- private ChannelProvider channelProvider;
+ private final ChannelProvider channelProvider;
- private List path = new ArrayList();
+ private final ImmutableList path;
- private Map queryParams = new HashMap();
+ private final ImmutableMap queryParams;
private static final String PATH_SEPARATOR = "/";
public WebTarget(ChannelProvider channelProvider) {
+ this(channelProvider, ImmutableList.of(), ImmutableMap.of());
+ }
+
+ private WebTarget(ChannelProvider channelProvider,
+ ImmutableList path,
+ ImmutableMap queryParams) {
this.channelProvider = channelProvider;
+ this.path = path;
+ this.queryParams = queryParams;
}
public WebTarget path(String... components) {
+ ImmutableList.Builder newPath = ImmutableList.builder().addAll(this.path);
for (String component : components) {
-
- path.addAll(Arrays.asList(StringUtils.split(component, PATH_SEPARATOR)));
+ newPath.addAll(Arrays.asList(StringUtils.split(component, PATH_SEPARATOR)));
}
- return this;
+ return new WebTarget(channelProvider, newPath.build(), queryParams);
}
public InvocationBuilder request() {
String resource = PATH_SEPARATOR + StringUtils.join(path, PATH_SEPARATOR);
- List params = new ArrayList();
+ List params = new ArrayList<>();
for (Map.Entry entry : queryParams.entrySet()) {
params.add(entry.getKey() + "=" + entry.getValue());
}
@@ -54,20 +64,47 @@ public InvocationBuilder request() {
}
public WebTarget resolveTemplate(String name, Object value) {
- List newPath = new ArrayList();
+ ImmutableList.Builder newPath = ImmutableList.builder();
for (String component : path) {
component = component.replaceAll("\\{" + name + "\\}", value.toString());
newPath.add(component);
}
- path = newPath;
- return this;
+ return new WebTarget(channelProvider, newPath.build(), queryParams);
}
public WebTarget queryParam(String name, Object value) {
+ ImmutableMap.Builder builder = ImmutableMap.builder().putAll(queryParams);
if (value != null) {
- queryParams.put(name, value.toString());
+ builder.put(name, value.toString());
}
- return this;
+ return new WebTarget(channelProvider, path, builder.build());
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ WebTarget webTarget = (WebTarget) o;
+
+ if (channelProvider != null ? !channelProvider.equals(webTarget.channelProvider) : webTarget.channelProvider != null) {
+ return false;
+ }
+ if (path != null ? !path.equals(webTarget.path) : webTarget.path != null) {
+ return false;
+ }
+ return queryParams != null ? queryParams.equals(webTarget.queryParams) : webTarget.queryParams == null;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = channelProvider != null ? channelProvider.hashCode() : 0;
+ result = 31 * result + (path != null ? path.hashCode() : 0);
+ result = 31 * result + (queryParams != null ? queryParams.hashCode() : 0);
+ return result;
+ }
}
diff --git a/src/test/java/com/github/dockerjava/netty/WebTargetTest.java b/src/test/java/com/github/dockerjava/netty/WebTargetTest.java
new file mode 100644
index 000000000..a462eb8b5
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/netty/WebTargetTest.java
@@ -0,0 +1,39 @@
+package com.github.dockerjava.netty;
+
+import static org.testng.Assert.assertEquals;
+
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * @author Alexander Koshevoy
+ */
+public class WebTargetTest {
+ @Mock private ChannelProvider channelProvider;
+
+ @BeforeMethod
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void verifyImmutability() throws Exception {
+ WebTarget emptyWebTarget = new WebTarget(channelProvider);
+
+ WebTarget initWebTarget = emptyWebTarget.path("/containers/{id}/attach").resolveTemplate("id", "d03da378b592")
+ .queryParam("logs", "true");
+
+ WebTarget anotherWebTarget = emptyWebTarget.path("/containers/{id}/attach")
+ .resolveTemplate("id", "2cfada4e3c07").queryParam("stdin", "true");
+
+ assertEquals(new WebTarget(channelProvider), emptyWebTarget);
+
+ assertEquals(new WebTarget(channelProvider).path("/containers/d03da378b592/attach")
+ .queryParam("logs", "true"), initWebTarget);
+
+ assertEquals(new WebTarget(channelProvider).path("/containers/2cfada4e3c07/attach")
+ .queryParam("stdin", "true"), anotherWebTarget);
+ }
+}
From 1923e7e5866374dc4cb771ef9d7d3317aba2704b Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sat, 9 Jul 2016 10:22:03 +0200
Subject: [PATCH 054/736] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 10065afad..e1f16ec14 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@ Change Log
---
All changes
+* [#630 ] (https://github.com/docker-java/docker-java/pull/630) Fix: Second execution of a docker command in Netty implementation always fails
* [#596] (https://github.com/docker-java/docker-java/pull/596) Refactor configuration of SSL to allow override with custom config
* [#529] (https://github.com/docker-java/docker-java/pull/529) Refactor CertUtils. Support ECDSA and PrivateKey
* [#593] (https://github.com/docker-java/docker-java/pull/593) Added Device.parse() method with simple verification.
From 5f9e2bfe2f840467394152cb18695002302e0767 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Tue, 12 Jul 2016 11:28:35 +0300
Subject: [PATCH 055/736] Change serial until we didn't ship release
---
.../com/github/dockerjava/core/DefaultDockerClientConfig.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
index b21e227ec..a9a15bb36 100644
--- a/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
+++ b/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
@@ -31,7 +31,7 @@
*/
public class DefaultDockerClientConfig implements Serializable, DockerClientConfig {
- private static final long serialVersionUID = -4307357472441531489L;
+ private static final long serialVersionUID = 1L;
public static final String DOCKER_HOST = "DOCKER_HOST";
From 2f50240329e336d097239b7813949d1ba29d607e Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Tue, 12 Jul 2016 11:29:28 +0300
Subject: [PATCH 056/736] Test also on 1.10
---
.travis.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.travis.yml b/.travis.yml
index bb559fd93..31a062e79 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -23,6 +23,7 @@ env:
matrix:
- repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true COVERITY=true CODECOV=true
- repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty"
+ - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.10.3-0~trusty"
- repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.10.3-0~trusty"
# - repo="testing" DOCKER_HOST="tcp://127.0.0.1:2375"
# - repo="testing" DOCKER_HOST="unix:///var/run/docker.sock"
From d803c4692efc51bf0e8c138ca3a396947274391d Mon Sep 17 00:00:00 2001
From: Leonid Rudenko
Date: Thu, 14 Jul 2016 23:42:54 +0400
Subject: [PATCH 057/736] Implement POST /images/load endpoint (#627)
---
.../github/dockerjava/api/DockerClient.java | 13 +++
.../api/command/DockerCmdExecFactory.java | 2 +
.../dockerjava/api/command/LoadImageCmd.java | 21 +++++
.../dockerjava/core/DockerClientImpl.java | 7 ++
.../dockerjava/core/RemoteApiVersion.java | 5 ++
.../core/command/LoadImageCmdImpl.java | 39 +++++++++
.../jaxrs/DockerCmdExecFactoryImpl.java | 6 ++
.../dockerjava/jaxrs/LoadImageCmdExec.java | 31 +++++++
.../netty/DockerCmdExecFactoryImpl.java | 7 ++
.../netty/exec/LoadImageCmdExec.java | 29 +++++++
.../core/TestDockerCmdExecFactory.java | 12 +++
.../core/command/LoadImageCmdImplTest.java | 76 ++++++++++++++++++
.../netty/exec/LoadImageCmdExecTest.java | 76 ++++++++++++++++++
.../dockerjava/utils/TestResources.java | 14 ++++
src/test/resources/api/images/load/image.tar | Bin 0 -> 11264 bytes
15 files changed, 338 insertions(+)
create mode 100644 src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java
create mode 100644 src/main/java/com/github/dockerjava/core/command/LoadImageCmdImpl.java
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/LoadImageCmdExec.java
create mode 100644 src/main/java/com/github/dockerjava/netty/exec/LoadImageCmdExec.java
create mode 100644 src/test/java/com/github/dockerjava/core/command/LoadImageCmdImplTest.java
create mode 100644 src/test/java/com/github/dockerjava/netty/exec/LoadImageCmdExecTest.java
create mode 100644 src/test/java/com/github/dockerjava/utils/TestResources.java
create mode 100644 src/test/resources/api/images/load/image.tar
diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java
index 4c0e2ed56..491c11ac8 100644
--- a/src/main/java/com/github/dockerjava/api/DockerClient.java
+++ b/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -35,6 +35,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
@@ -90,6 +91,18 @@ public interface DockerClient extends Closeable {
CreateImageCmd createImageCmd(@Nonnull String repository, @Nonnull InputStream imageStream);
+ /**
+ * Loads a tarball with a set of images and tags into a Docker repository.
+ *
+ * Corresponds to POST /images/load API endpoint.
+ *
+ * @param imageStream
+ * stream of the tarball file
+ * @return created command
+ * @since {@link RemoteApiVersion#VERSION_1_7}
+ */
+ LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream);
+
SearchImagesCmd searchImagesCmd(@Nonnull String term);
RemoveImageCmd removeImageCmd(@Nonnull String imageId);
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
index 0de3afe38..671c0d535 100644
--- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
@@ -28,6 +28,8 @@ public interface DockerCmdExecFactory extends Closeable {
CreateImageCmd.Exec createCreateImageCmdExec();
+ LoadImageCmd.Exec createLoadImageCmdExec();
+
SearchImagesCmd.Exec createSearchImagesCmdExec();
RemoveImageCmd.Exec createRemoveImageCmdExec();
diff --git a/src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java b/src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java
new file mode 100644
index 000000000..184b7ef33
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java
@@ -0,0 +1,21 @@
+package com.github.dockerjava.api.command;
+
+import java.io.InputStream;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+public interface LoadImageCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ InputStream getImageStream();
+
+ /**
+ * @param imageStream
+ * the InputStream of the tar file
+ */
+ LoadImageCmd withImageStream(@Nonnull InputStream imageStream);
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
index e11ca4f30..2d0b5caab 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
@@ -37,6 +37,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
@@ -89,6 +90,7 @@
import com.github.dockerjava.core.command.ListImagesCmdImpl;
import com.github.dockerjava.core.command.ListNetworksCmdImpl;
import com.github.dockerjava.core.command.ListVolumesCmdImpl;
+import com.github.dockerjava.core.command.LoadImageCmdImpl;
import com.github.dockerjava.core.command.LogContainerCmdImpl;
import com.github.dockerjava.core.command.PauseContainerCmdImpl;
import com.github.dockerjava.core.command.PingCmdImpl;
@@ -249,6 +251,11 @@ public CreateImageCmd createImageCmd(String repository, InputStream imageStream)
return new CreateImageCmdImpl(getDockerCmdExecFactory().createCreateImageCmdExec(), repository, imageStream);
}
+ @Override
+ public LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream) {
+ return new LoadImageCmdImpl(getDockerCmdExecFactory().createLoadImageCmdExec(), imageStream);
+ }
+
@Override
public SearchImagesCmd searchImagesCmd(String term) {
return new SearchImagesCmdImpl(getDockerCmdExecFactory().createSearchImagesCmdExec(), term);
diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
index 992125414..954ed9971 100644
--- a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
+++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
@@ -22,6 +22,11 @@ public class RemoteApiVersion implements Serializable {
private static final Pattern VERSION_REGEX = Pattern.compile("v?(\\d+)\\.(\\d+)");
+ /**
+ * Online documentation is not available anymore.
+ */
+ public static final RemoteApiVersion VERSION_1_7 = RemoteApiVersion.create(1, 7);
+
/**
* @see Docker API 1.16
*/
diff --git a/src/main/java/com/github/dockerjava/core/command/LoadImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/LoadImageCmdImpl.java
new file mode 100644
index 000000000..496ea3176
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/command/LoadImageCmdImpl.java
@@ -0,0 +1,39 @@
+package com.github.dockerjava.core.command;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.InputStream;
+
+import com.github.dockerjava.api.command.LoadImageCmd;
+
+import javax.annotation.Nonnull;
+
+public class LoadImageCmdImpl extends AbstrDockerCmd implements LoadImageCmd {
+
+ private InputStream imageStream;
+
+ /**
+ * @param imageStream
+ * the InputStream of the tar file
+ */
+ public LoadImageCmdImpl(LoadImageCmd.Exec exec, InputStream imageStream) {
+ super(exec);
+ withImageStream(imageStream);
+ }
+
+ @Override
+ public InputStream getImageStream() {
+ return imageStream;
+ }
+
+ /**
+ * @param imageStream
+ * the InputStream of the tar file
+ */
+ @Override
+ public LoadImageCmdImpl withImageStream(@Nonnull InputStream imageStream) {
+ checkNotNull(imageStream, "imageStream was not specified");
+ this.imageStream = imageStream;
+ return this;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
index 4800f22ae..7e573a123 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
@@ -63,6 +63,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
@@ -322,6 +323,11 @@ public CreateImageCmd.Exec createCreateImageCmdExec() {
return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
}
+ @Override
+ public LoadImageCmd.Exec createLoadImageCmdExec() {
+ return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
diff --git a/src/main/java/com/github/dockerjava/jaxrs/LoadImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LoadImageCmdExec.java
new file mode 100644
index 000000000..23d6c493a
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/LoadImageCmdExec.java
@@ -0,0 +1,31 @@
+package com.github.dockerjava.jaxrs;
+
+import static javax.ws.rs.client.Entity.entity;
+
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.github.dockerjava.api.command.LoadImageCmd;
+import com.github.dockerjava.core.DockerClientConfig;
+
+public class LoadImageCmdExec extends AbstrSyncDockerCmdExec implements LoadImageCmd.Exec {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageCmdExec.class);
+
+ public LoadImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
+ super(baseResource, dockerClientConfig);
+ }
+
+ @Override
+ protected Void execute(LoadImageCmd command) {
+ WebTarget webTarget = getBaseResource().path("/images/load");
+
+ LOGGER.trace("POST: {}", webTarget);
+ webTarget.request().post(entity(command.getImageStream(), MediaType.APPLICATION_OCTET_STREAM));
+
+ return null;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java
index 1f55c61a8..dff69a228 100644
--- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java
@@ -29,6 +29,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
@@ -82,6 +83,7 @@
import com.github.dockerjava.netty.exec.ListImagesCmdExec;
import com.github.dockerjava.netty.exec.ListNetworksCmdExec;
import com.github.dockerjava.netty.exec.ListVolumesCmdExec;
+import com.github.dockerjava.netty.exec.LoadImageCmdExec;
import com.github.dockerjava.netty.exec.LogContainerCmdExec;
import com.github.dockerjava.netty.exec.PauseContainerCmdExec;
import com.github.dockerjava.netty.exec.PingCmdExec;
@@ -366,6 +368,11 @@ public CreateImageCmd.Exec createCreateImageCmdExec() {
return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
}
+ @Override
+ public LoadImageCmd.Exec createLoadImageCmdExec() {
+ return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
diff --git a/src/main/java/com/github/dockerjava/netty/exec/LoadImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/LoadImageCmdExec.java
new file mode 100644
index 000000000..23581119f
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/netty/exec/LoadImageCmdExec.java
@@ -0,0 +1,29 @@
+package com.github.dockerjava.netty.exec;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.github.dockerjava.api.command.LoadImageCmd;
+import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.netty.WebTarget;
+
+public class LoadImageCmdExec extends AbstrSyncDockerCmdExec implements
+ LoadImageCmd.Exec {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageCmdExec.class);
+
+ public LoadImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
+ super(baseResource, dockerClientConfig);
+ }
+
+ @Override
+ protected Void execute(LoadImageCmd command) {
+ WebTarget webResource = getBaseResource().path("/images/load");
+
+ LOGGER.trace("POST: {}", webResource);
+ return webResource.request()
+ .post(new TypeReference() {
+ }, command.getImageStream());
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java
index 48ea1e164..46d6d4dcc 100644
--- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java
+++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java
@@ -34,6 +34,7 @@
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.PauseContainerCmd;
import com.github.dockerjava.api.command.PingCmd;
@@ -131,6 +132,17 @@ public CreateImageResponse exec(CreateImageCmd command) {
};
}
+ @Override
+ public LoadImageCmd.Exec createLoadImageCmdExec() {
+ return new LoadImageCmd.Exec() {
+ @Override
+ public Void exec(LoadImageCmd command) {
+ delegate.createLoadImageCmdExec().exec(command);
+ return null;
+ }
+ };
+ }
+
@Override
public RemoveImageCmd.Exec createRemoveImageCmdExec() {
return new RemoveImageCmd.Exec() {
diff --git a/src/test/java/com/github/dockerjava/core/command/LoadImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/LoadImageCmdImplTest.java
new file mode 100644
index 000000000..7cecf7334
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/core/command/LoadImageCmdImplTest.java
@@ -0,0 +1,76 @@
+package com.github.dockerjava.core.command;
+
+import com.github.dockerjava.api.model.Image;
+import com.github.dockerjava.client.AbstractDockerClientTest;
+
+import com.github.dockerjava.utils.TestResources;
+import org.testng.ITestResult;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.nio.file.Files;
+import java.util.List;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.singletonList;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.core.IsEqual.equalTo;
+
+@Test(groups = "integration")
+public class LoadImageCmdImplTest extends AbstractDockerClientTest {
+
+ private String expectedImageId;
+
+ @BeforeTest
+ public void beforeTest() throws Exception {
+ super.beforeTest();
+ }
+
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ expectedImageId = "sha256:56031f66eb0cef2e2e5cb2d1dabafaa0ebcd0a18a507d313b5bdb8c0472c5eba";
+ if (findImageWithId(expectedImageId, dockerClient.listImagesCmd().exec()) != null) {
+ dockerClient.removeImageCmd(expectedImageId).exec();
+ }
+ }
+
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ dockerClient.removeImageCmd(expectedImageId).exec();
+ super.afterMethod(result);
+ }
+
+ @Test
+ public void loadImageFromTar() throws Exception {
+ try (InputStream uploadStream = Files.newInputStream(TestResources.getApiImagesLoadTestTarball())) {
+ dockerClient.loadImageCmd(uploadStream).exec();
+ }
+
+ final Image image = findImageWithId(expectedImageId, dockerClient.listImagesCmd().exec());
+
+ assertThat("Can't find expected image after loading from a tar archive!", image, notNullValue());
+ assertThat("Image after loading from a tar archive has wrong tags!",
+ asList(image.getRepoTags()), equalTo(singletonList("docker-java/load:1.0")));
+ }
+
+ private Image findImageWithId(final String id, final List images) {
+ for (Image image : images) {
+ if (id.equals(image.getId())) {
+ return image;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/LoadImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/LoadImageCmdExecTest.java
new file mode 100644
index 000000000..d978f5662
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/netty/exec/LoadImageCmdExecTest.java
@@ -0,0 +1,76 @@
+package com.github.dockerjava.netty.exec;
+
+import com.github.dockerjava.api.model.Image;
+
+import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
+import com.github.dockerjava.utils.TestResources;
+import org.testng.ITestResult;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.nio.file.Files;
+import java.util.List;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.singletonList;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.core.IsEqual.equalTo;
+
+@Test(groups = "integration")
+public class LoadImageCmdExecTest extends AbstractNettyDockerClientTest {
+
+ private String expectedImageId;
+
+ @BeforeTest
+ public void beforeTest() throws Exception {
+ super.beforeTest();
+ }
+
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ expectedImageId = "sha256:56031f66eb0cef2e2e5cb2d1dabafaa0ebcd0a18a507d313b5bdb8c0472c5eba";
+ if (findImageWithId(expectedImageId, dockerClient.listImagesCmd().exec()) != null) {
+ dockerClient.removeImageCmd(expectedImageId).exec();
+ }
+ }
+
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ dockerClient.removeImageCmd(expectedImageId).exec();
+ super.afterMethod(result);
+ }
+
+ @Test
+ public void loadImageFromTar() throws Exception {
+ try (InputStream uploadStream = Files.newInputStream(TestResources.getApiImagesLoadTestTarball())) {
+ dockerClient.loadImageCmd(uploadStream).exec();
+ }
+
+ final Image image = findImageWithId(expectedImageId, dockerClient.listImagesCmd().exec());
+
+ assertThat("Can't find expected image after loading from a tar archive!", image, notNullValue());
+ assertThat("Image after loading from a tar archive has wrong tags!",
+ asList(image.getRepoTags()), equalTo(singletonList("docker-java/load:1.0")));
+ }
+
+ private Image findImageWithId(final String id, final List images) {
+ for (Image image : images) {
+ if (id.equals(image.getId())) {
+ return image;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/utils/TestResources.java b/src/test/java/com/github/dockerjava/utils/TestResources.java
new file mode 100644
index 000000000..35ece680f
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/utils/TestResources.java
@@ -0,0 +1,14 @@
+package com.github.dockerjava.utils;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class TestResources {
+
+ private TestResources() {
+ }
+
+ public static Path getApiImagesLoadTestTarball() {
+ return Paths.get("src/test/resources/api/images/load/image.tar");
+ }
+}
diff --git a/src/test/resources/api/images/load/image.tar b/src/test/resources/api/images/load/image.tar
new file mode 100644
index 0000000000000000000000000000000000000000..6f2f08f9e945811249c0027eec3a0de531ead521
GIT binary patch
literal 11264
zcmeHNU2oeq6!r6dg~7dSfMfHUl7KyQX@C|e=Az9ybU_eM{7BTwQXt7e1H=D)SGJQl
zZc`_<5_AalV2kACC3%i6DISUw%9s-|cByxSTE>L%Owu^wR>{~?N(lB&lGIZk5$z(u
zm`oMJ80$#kQE&T&F~>@X9#mJE6eGJe5nab(LwazFe
zau2ILEDs4!h)gIO#)?WQW5)h%P0OOuS>Y-$_Hi0x?&FvlDJ&;mOD!~IX+#+Dm@DpL
ztWzs36A|a|mLRZnOgax4g3xt$C*as;rzn}BS7qH4dg3-(0PC0K1lnGeLHh4{(GR$L
z(KOney>Dz*pv3FEc58X%wD~&IRWO8=u*JQ{(FCa
z{PtttXSqv+RVtq}P++db5s*Ov94w|m0d@BaiQsj&Xv3227}
zi|M>Wf8TPog@2%*-tbQ;?Ef)gBJlq$EW6IrzjW;}_zMUG1Ofs9f&T*nLSoovOX*T<
zoTrXDVNz;|)v5Mc!?A#|Sd&N#tSloe6{$@l1N(AngiH0X1O12NP5p-`9M=CQd3J?Ynf@b+
ziE~gB*Hoqfs>-tQAUn-ab9vrsQ45iw1~JNJ-k)R^%8pQdrm2vLW1M;d$Jf#*2WQj~
z7cm7T*~Lz!B-TVyr5#Cyj%}<(Y?x&auat%)u&@9O40>-di@NZa=R
zjFPppVE8_O!1^EbpC5($LG@sA*k2u*pibTeAxPi3^YT!iE`oG9Kka?e7a9&Yv`yf^
zxjj92)5?Ymi|!Oih~(oSXFQ1hUIkp$87vf;s~=YL{?^;#pYZE%g4(ZW+W40u#Q*&P
m-obLVI&Hg&(018vgS3M~;rTp-;||<}ssVw3KtSLz5%>?llNJ&H
literal 0
HcmV?d00001
From 8be5180513b65be8da2444a71de62f7dba5106c3 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 14 Jul 2016 22:44:12 +0300
Subject: [PATCH 058/736] Update CHANGELOG.md
---
CHANGELOG.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e1f16ec14..4d28a9319 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,8 @@ Change Log
---
All changes
-* [#630 ] (https://github.com/docker-java/docker-java/pull/630) Fix: Second execution of a docker command in Netty implementation always fails
+* [#627] (https://github.com/docker-java/docker-java/pull/627) Implementation of POST /images/load endpoint
+* [#630] (https://github.com/docker-java/docker-java/pull/630) Fix: Second execution of a docker command in Netty implementation always fails
* [#596] (https://github.com/docker-java/docker-java/pull/596) Refactor configuration of SSL to allow override with custom config
* [#529] (https://github.com/docker-java/docker-java/pull/529) Refactor CertUtils. Support ECDSA and PrivateKey
* [#593] (https://github.com/docker-java/docker-java/pull/593) Added Device.parse() method with simple verification.
From 369a12e410cd4c1fe7d58dde8b5a49920330c4e4 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 15 Jul 2016 14:27:25 +0300
Subject: [PATCH 059/736] Try cache coverity (#636)
---
.travis.yml | 1 +
.travis/travisci_build_coverity_scan.sh | 8 +++++---
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 31a062e79..bb93f49b5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -33,6 +33,7 @@ env:
cache:
directories:
- $HOME/.travis_cache
+ - /tmp/coverity-cache
- $HOME/.m2 # install will pollute it
before_install:
diff --git a/.travis/travisci_build_coverity_scan.sh b/.travis/travisci_build_coverity_scan.sh
index 13af2c275..160945f40 100755
--- a/.travis/travisci_build_coverity_scan.sh
+++ b/.travis/travisci_build_coverity_scan.sh
@@ -11,7 +11,7 @@ echo -e "\033[33;1mNote: COVERITY_SCAN_PROJECT_NAME and COVERITY_SCAN_TOKEN are
[ -z "$COVERITY_SCAN_TOKEN" ] && echo "ERROR: COVERITY_SCAN_TOKEN must be set" && exit 1
PLATFORM=`uname`
-TOOL_ARCHIVE=/tmp/cov-analysis-${PLATFORM}.tgz
+TOOL_ARCHIVE=/tmp/coverity-cache/cov-analysis-${PLATFORM}.tgz
TOOL_URL=https://scan.coverity.com/download/${PLATFORM}
TOOL_BASE=/tmp/coverity-scan-analysis
UPLOAD_URL="https://scan.coverity.com/builds"
@@ -49,18 +49,20 @@ else
fi
fi
+mkdir -p /tmp/coverity-cache || :
+
if [ ! -d $TOOL_BASE ]; then
# Download Coverity Scan Analysis Tool
if [ ! -e $TOOL_ARCHIVE ]; then
echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m"
- wget -nv -O $TOOL_ARCHIVE $TOOL_URL --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=$COVERITY_SCAN_TOKEN"
+ wget -nvN -O $TOOL_ARCHIVE $TOOL_URL --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=$COVERITY_SCAN_TOKEN"
fi
# Extract Coverity Scan Analysis Tool
echo -e "\033[33;1mExtracting Coverity Scan Analysis Tool...\033[0m"
mkdir -p $TOOL_BASE
pushd $TOOL_BASE
- tar xzf $TOOL_ARCHIVE
+ tar -xf $TOOL_ARCHIVE
popd
fi
From a87b7894272ff3cb9ffecadd6848fdb45ad777a7 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 15 Jul 2016 14:34:19 +0300
Subject: [PATCH 060/736] Update travisci_build_coverity_scan.sh
---
.travis/travisci_build_coverity_scan.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis/travisci_build_coverity_scan.sh b/.travis/travisci_build_coverity_scan.sh
index 160945f40..a4d978e22 100755
--- a/.travis/travisci_build_coverity_scan.sh
+++ b/.travis/travisci_build_coverity_scan.sh
@@ -55,7 +55,7 @@ if [ ! -d $TOOL_BASE ]; then
# Download Coverity Scan Analysis Tool
if [ ! -e $TOOL_ARCHIVE ]; then
echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m"
- wget -nvN -O $TOOL_ARCHIVE $TOOL_URL --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=$COVERITY_SCAN_TOKEN"
+ wget -nv -N -O $TOOL_ARCHIVE $TOOL_URL --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=$COVERITY_SCAN_TOKEN"
fi
# Extract Coverity Scan Analysis Tool
From 7bcf6fbe2f561e51d45727b4dac9773f4d162f2f Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 15 Jul 2016 14:52:36 +0300
Subject: [PATCH 061/736] Update travisci_build_coverity_scan.sh
---
.travis/travisci_build_coverity_scan.sh | 3 +++
1 file changed, 3 insertions(+)
diff --git a/.travis/travisci_build_coverity_scan.sh b/.travis/travisci_build_coverity_scan.sh
index a4d978e22..8d0fff04b 100755
--- a/.travis/travisci_build_coverity_scan.sh
+++ b/.travis/travisci_build_coverity_scan.sh
@@ -62,6 +62,9 @@ if [ ! -d $TOOL_BASE ]; then
echo -e "\033[33;1mExtracting Coverity Scan Analysis Tool...\033[0m"
mkdir -p $TOOL_BASE
pushd $TOOL_BASE
+ du -sh $TOOL_ARCHIVE
+ file $TOOL_ARCHIVE
+ ls -la $TOOL_ARCHIVE
tar -xf $TOOL_ARCHIVE
popd
fi
From a57fec6f7fa10645589b3b5b9d5e5ea7d2590254 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 15 Jul 2016 17:25:34 +0300
Subject: [PATCH 062/736] Add second run that should be successfull
@coverity fails without any clear reason.
---
.travis.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.travis.yml b/.travis.yml
index bb93f49b5..a8cbe29e2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,6 +21,7 @@ env:
- COVERITY_SCAN_NOTIFICATION_EMAIL="kanstantsin.sha@gmail.com"
matrix:
+ - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true CODECOV=true
- repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true COVERITY=true CODECOV=true
- repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty"
- repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.10.3-0~trusty"
From 236e1be53547f86bf279fbbc4ec8daef6e8cf83e Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 00:56:00 +0300
Subject: [PATCH 063/736] Try debug bad travis download
---
.travis/travisci_build_coverity_scan.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/.travis/travisci_build_coverity_scan.sh b/.travis/travisci_build_coverity_scan.sh
index 8d0fff04b..6bf9a9b1f 100755
--- a/.travis/travisci_build_coverity_scan.sh
+++ b/.travis/travisci_build_coverity_scan.sh
@@ -64,6 +64,7 @@ if [ ! -d $TOOL_BASE ]; then
pushd $TOOL_BASE
du -sh $TOOL_ARCHIVE
file $TOOL_ARCHIVE
+ file $TOOL_ARCHIVE | grep HTML && cat $TOOL_ARCHIVE || :
ls -la $TOOL_ARCHIVE
tar -xf $TOOL_ARCHIVE
popd
From 5dbde940d32b02c57b6c55e87be455846d511eac Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 00:59:46 +0300
Subject: [PATCH 064/736] Fix IT run when it shouldn't
CSV and not list.
---
pom.xml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 5842ac320..130977ba3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -387,8 +387,7 @@
maven-surefire-plugin${maven-surefire-plugin.version}
- integration
- integration-auth
+ integration,integration-auth
From 4db9bee87c58e564479ed55a4929f3e1fa4662a1 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 02:08:13 +0300
Subject: [PATCH 065/736] fix concurrency issue
---
.../exec/AttachContainerCmdExecTest.java | 24 ++++++++++++-------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
index 675c11177..7daa59b25 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.netty.exec;
+import static java.util.concurrent.TimeUnit.SECONDS;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.isEmptyString;
@@ -70,7 +71,7 @@ public void onNext(Frame frame) {
};
dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true)
- .withLogs(true).exec(callback).awaitCompletion(10, TimeUnit.SECONDS);
+ .withLogs(true).exec(callback).awaitCompletion(10, SECONDS);
callback.close();
assertThat(callback.toString(), containsString(snippet));
@@ -81,33 +82,40 @@ public void attachContainerWithStdin() throws Exception {
String snippet = "hello world";
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/sh", "-c", "read line && echo $line")
- .withTty(false).withStdinOpen(true).exec();
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("/bin/sh", "-c", "sleep 1 && read line && echo $line")
+ .withTty(false)
+ .withStdinOpen(true)
+ .exec();
LOG.info("Created container: {}", container.toString());
assertThat(container.getId(), not(isEmptyString()));
dockerClient.startContainerCmd(container.getId()).exec();
+ Thread.sleep(SECONDS.toMillis(3)); //wait bash initialisation
+
InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
assertTrue(inspectContainerResponse.getState().getRunning());
AttachContainerTestCallback callback = new AttachContainerTestCallback() {
-
@Override
public void onNext(Frame frame) {
assertEquals(frame.getStreamType(), StreamType.STDOUT);
super.onNext(frame);
- };
+ }
};
InputStream stdin = new ByteArrayInputStream((snippet + "\n").getBytes());
- dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true)
+ dockerClient.attachContainerCmd(container.getId())
+ .withStdErr(true)
+ .withStdOut(true)
+ .withFollowStream(true)
.withStdIn(stdin)
.exec(callback)
- .awaitCompletion(5, TimeUnit.SECONDS);
+ .awaitCompletion(15, SECONDS);
callback.close();
assertThat(callback.toString(), containsString(snippet));
@@ -141,7 +149,7 @@ public void onNext(Frame frame) {
.withStdOut(true)
.withFollowStream(true)
.exec(callback)
- .awaitCompletion(10, TimeUnit.SECONDS);
+ .awaitCompletion(10, SECONDS);
callback.close();
// HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0);
From 582331a85ad9bc529b4d8a37d1d80d286bd57b25 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 02:48:09 +0300
Subject: [PATCH 066/736] Verify coverity before not downloading it
---
.travis/travisci_build_coverity_scan.sh | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/.travis/travisci_build_coverity_scan.sh b/.travis/travisci_build_coverity_scan.sh
index 6bf9a9b1f..a73c66536 100755
--- a/.travis/travisci_build_coverity_scan.sh
+++ b/.travis/travisci_build_coverity_scan.sh
@@ -52,6 +52,13 @@ fi
mkdir -p /tmp/coverity-cache || :
if [ ! -d $TOOL_BASE ]; then
+
+ # verify that binary is right
+ if file $TOOL_ARCHIVE | grep HTML ; then
+ echo "Removing $TOOL_ARCHIVE"
+ rm -f $TOOL_ARCHIVE
+ fi
+
# Download Coverity Scan Analysis Tool
if [ ! -e $TOOL_ARCHIVE ]; then
echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m"
From eacea85d70e689e03407572ff982983ecea0c640 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 03:23:56 +0300
Subject: [PATCH 067/736] Don't spam with warnings
@coverity using bsd tar??
---
.travis/travisci_build_coverity_scan.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis/travisci_build_coverity_scan.sh b/.travis/travisci_build_coverity_scan.sh
index a73c66536..7f30638e1 100755
--- a/.travis/travisci_build_coverity_scan.sh
+++ b/.travis/travisci_build_coverity_scan.sh
@@ -73,7 +73,7 @@ if [ ! -d $TOOL_BASE ]; then
file $TOOL_ARCHIVE
file $TOOL_ARCHIVE | grep HTML && cat $TOOL_ARCHIVE || :
ls -la $TOOL_ARCHIVE
- tar -xf $TOOL_ARCHIVE
+ tar -xf $TOOL_ARCHIVE | grep -v "Ignoring unknown extended header keyword"
popd
fi
From 59db6da8f40f7559c9e33968f5ba5a8283df3673 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 03:26:10 +0300
Subject: [PATCH 068/736] Try limit threadCount
Default is parallel test, when there are many tests they become slow and fails.
---
pom.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/pom.xml b/pom.xml
index 130977ba3..7f51e9d99 100644
--- a/pom.xml
+++ b/pom.xml
@@ -402,6 +402,9 @@
verify
+ true
+ true
+ 1integrationintegration-auth
From 51fe92d8400541afb7fdeb170b55bfa91538920e Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 03:54:24 +0300
Subject: [PATCH 069/736] Update travisci_build_coverity_scan.sh
---
.travis/travisci_build_coverity_scan.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis/travisci_build_coverity_scan.sh b/.travis/travisci_build_coverity_scan.sh
index 7f30638e1..933ddae37 100755
--- a/.travis/travisci_build_coverity_scan.sh
+++ b/.travis/travisci_build_coverity_scan.sh
@@ -73,7 +73,7 @@ if [ ! -d $TOOL_BASE ]; then
file $TOOL_ARCHIVE
file $TOOL_ARCHIVE | grep HTML && cat $TOOL_ARCHIVE || :
ls -la $TOOL_ARCHIVE
- tar -xf $TOOL_ARCHIVE | grep -v "Ignoring unknown extended header keyword"
+ tar -xf $TOOL_ARCHIVE |& grep -v "Ignoring unknown extended header keyword"
popd
fi
From 9578981d860478f0c8bda9d1da5b481bdd960c5d Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 03:57:44 +0300
Subject: [PATCH 070/736] Update netty
Try fix #632
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 7f51e9d99..1d4328f9b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,7 +63,7 @@
1.1.76.9.10
- 4.1.1.Final
+ 4.1.3.Final1.31.82.3.3
From 22fe7a6794c91f6a73988099eaf7e2f3e91bf25b Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 04:18:14 +0300
Subject: [PATCH 071/736] Update travisci_build_coverity_scan.sh
---
.travis/travisci_build_coverity_scan.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis/travisci_build_coverity_scan.sh b/.travis/travisci_build_coverity_scan.sh
index 933ddae37..074d0a46f 100755
--- a/.travis/travisci_build_coverity_scan.sh
+++ b/.travis/travisci_build_coverity_scan.sh
@@ -73,7 +73,7 @@ if [ ! -d $TOOL_BASE ]; then
file $TOOL_ARCHIVE
file $TOOL_ARCHIVE | grep HTML && cat $TOOL_ARCHIVE || :
ls -la $TOOL_ARCHIVE
- tar -xf $TOOL_ARCHIVE |& grep -v "Ignoring unknown extended header keyword"
+ tar -xf $TOOL_ARCHIVE #|& grep -v "Ignoring unknown extended header keyword"
popd
fi
From 83ac192b85614c0263aebfcb5ef298d9a9cf0b52 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 22 Jul 2016 11:10:09 +0300
Subject: [PATCH 072/736] Name classes normally (#639)
* Name classes normally
---
.../dockerjava/core/DockerClientBuilder.java | 4 +-
.../jaxrs/DockerCmdExecFactoryImpl.java | 586 +-----------------
.../jaxrs/JerseyDockerCmdExecFactory.java | 583 +++++++++++++++++
.../netty/DockerCmdExecFactoryImpl.java | 585 +----------------
.../netty/NettyDockerCmdExecFactory.java | 586 ++++++++++++++++++
.../netty/AbstractNettyDockerClientTest.java | 2 +-
6 files changed, 1182 insertions(+), 1164 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
create mode 100644 src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java
diff --git a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java
index 743b8c2ef..991bdbb86 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java
@@ -3,7 +3,7 @@
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.DockerCmdExecFactory;
import com.github.dockerjava.core.DefaultDockerClientConfig.Builder;
-import com.github.dockerjava.jaxrs.DockerCmdExecFactoryImpl;
+import com.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory;
public class DockerClientBuilder {
@@ -32,7 +32,7 @@ public static DockerClientBuilder getInstance(String serverUrl) {
}
public static DockerCmdExecFactory getDefaultDockerCmdExecFactory() {
- return new DockerCmdExecFactoryImpl();
+ return new JerseyDockerCmdExecFactory();
}
public DockerClientBuilder withDockerCmdExecFactory(DockerCmdExecFactory dockerCmdExecFactory) {
diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
index 7e573a123..1d407e233 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java
@@ -1,583 +1,9 @@
package com.github.dockerjava.jaxrs;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Proxy;
-import java.net.ProxySelector;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-
-import javax.net.ssl.SSLContext;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.ClientRequestFilter;
-import javax.ws.rs.client.ClientResponseFilter;
-import javax.ws.rs.client.WebTarget;
-
-import com.github.dockerjava.api.command.UpdateContainerCmd;
-import com.github.dockerjava.core.SSLConfig;
-
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.glassfish.jersey.CommonProperties;
-import org.glassfish.jersey.apache.connector.ApacheClientProperties;
-import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-import org.glassfish.jersey.client.ClientConfig;
-import org.glassfish.jersey.client.ClientProperties;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
-import com.github.dockerjava.api.command.AttachContainerCmd;
-import com.github.dockerjava.api.command.AuthCmd;
-import com.github.dockerjava.api.command.BuildImageCmd;
-import com.github.dockerjava.api.command.CommitCmd;
-import com.github.dockerjava.api.command.ConnectToNetworkCmd;
-import com.github.dockerjava.api.command.ContainerDiffCmd;
-import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
-import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
-import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
-import com.github.dockerjava.api.command.CreateContainerCmd;
-import com.github.dockerjava.api.command.CreateImageCmd;
-import com.github.dockerjava.api.command.CreateNetworkCmd;
-import com.github.dockerjava.api.command.CreateVolumeCmd;
-import com.github.dockerjava.api.command.DisconnectFromNetworkCmd;
-import com.github.dockerjava.api.command.DockerCmdExecFactory;
-import com.github.dockerjava.api.command.EventsCmd;
-import com.github.dockerjava.api.command.ExecCreateCmd;
-import com.github.dockerjava.api.command.ExecStartCmd;
-import com.github.dockerjava.api.command.InfoCmd;
-import com.github.dockerjava.api.command.InspectContainerCmd;
-import com.github.dockerjava.api.command.InspectExecCmd;
-import com.github.dockerjava.api.command.InspectImageCmd;
-import com.github.dockerjava.api.command.InspectNetworkCmd;
-import com.github.dockerjava.api.command.InspectVolumeCmd;
-import com.github.dockerjava.api.command.KillContainerCmd;
-import com.github.dockerjava.api.command.ListContainersCmd;
-import com.github.dockerjava.api.command.ListImagesCmd;
-import com.github.dockerjava.api.command.ListNetworksCmd;
-import com.github.dockerjava.api.command.ListVolumesCmd;
-import com.github.dockerjava.api.command.LoadImageCmd;
-import com.github.dockerjava.api.command.LogContainerCmd;
-import com.github.dockerjava.api.command.PauseContainerCmd;
-import com.github.dockerjava.api.command.PingCmd;
-import com.github.dockerjava.api.command.PullImageCmd;
-import com.github.dockerjava.api.command.PushImageCmd;
-import com.github.dockerjava.api.command.RemoveContainerCmd;
-import com.github.dockerjava.api.command.RemoveImageCmd;
-import com.github.dockerjava.api.command.RemoveNetworkCmd;
-import com.github.dockerjava.api.command.RemoveVolumeCmd;
-import com.github.dockerjava.api.command.RestartContainerCmd;
-import com.github.dockerjava.api.command.SaveImageCmd;
-import com.github.dockerjava.api.command.SearchImagesCmd;
-import com.github.dockerjava.api.command.StartContainerCmd;
-import com.github.dockerjava.api.command.StatsCmd;
-import com.github.dockerjava.api.command.StopContainerCmd;
-import com.github.dockerjava.api.command.TagImageCmd;
-import com.github.dockerjava.api.command.TopContainerCmd;
-import com.github.dockerjava.api.command.UnpauseContainerCmd;
-import com.github.dockerjava.api.command.VersionCmd;
-import com.github.dockerjava.api.command.WaitContainerCmd;
-import com.github.dockerjava.api.command.RenameContainerCmd;
-import com.github.dockerjava.api.exception.DockerClientException;
-import com.github.dockerjava.core.DockerClientConfig;
-import com.github.dockerjava.jaxrs.filter.JsonClientFilter;
-import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter;
-import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter;
-
-//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
-// see https://github.com/docker-java/docker-java/issues/196
-
-public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName());
-
- private Client client;
-
- private WebTarget baseResource;
-
- private Integer readTimeout = null;
-
- private Integer connectTimeout = null;
-
- private Integer maxTotalConnections = null;
-
- private Integer maxPerRouteConnections = null;
-
- private ClientRequestFilter[] clientRequestFilters = null;
-
- private ClientResponseFilter[] clientResponseFilters = null;
-
- private DockerClientConfig dockerClientConfig;
-
- private PoolingHttpClientConnectionManager connManager = null;
-
- @Override
- public void init(DockerClientConfig dockerClientConfig) {
- checkNotNull(dockerClientConfig, "config was not specified");
- this.dockerClientConfig = dockerClientConfig;
-
- ClientConfig clientConfig = new ClientConfig();
- clientConfig.connectorProvider(new ApacheConnectorProvider());
- clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);
-
- clientConfig.register(ResponseStatusExceptionFilter.class);
- clientConfig.register(JsonClientFilter.class);
- clientConfig.register(JacksonJsonProvider.class);
-
- // logging may disabled via log level
- clientConfig.register(new SelectiveLoggingFilter(LOGGER, true));
-
- if (readTimeout != null) {
- clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout);
- }
-
- if (connectTimeout != null) {
- clientConfig.property(ClientProperties.CONNECT_TIMEOUT, connectTimeout);
- }
-
- if (clientResponseFilters != null) {
- for (ClientResponseFilter clientResponseFilter : clientResponseFilters) {
- if (clientResponseFilter != null) {
- clientConfig.register(clientResponseFilter);
- }
- }
- }
-
- if (clientRequestFilters != null) {
- for (ClientRequestFilter clientRequestFilter : clientRequestFilters) {
- if (clientRequestFilter != null) {
- clientConfig.register(clientRequestFilter);
- }
- }
- }
-
- URI originalUri = dockerClientConfig.getDockerHost();
-
- String protocol = null;
-
- SSLContext sslContext = null;
-
- try {
- final SSLConfig sslConfig = dockerClientConfig.getSSLConfig();
- if (sslConfig != null) {
- sslContext = sslConfig.getSSLContext();
- }
- } catch (Exception ex) {
- throw new DockerClientException("Error in SSL Configuration", ex);
- }
-
- if (sslContext != null) {
- protocol = "https";
- } else {
- protocol = "http";
- }
-
- if (!originalUri.getScheme().equals("unix")) {
-
- try {
- originalUri = new URI(originalUri.toString().replaceFirst("tcp", protocol));
- } catch (URISyntaxException e) {
- throw new RuntimeException(e);
- }
-
- configureProxy(clientConfig, protocol);
- }
-
- connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry(
- originalUri, sslContext)) {
-
- @Override
- public void close() {
- super.shutdown();
- }
-
- @Override
- public void shutdown() {
- // Disable shutdown of the pool. This will be done later, when this factory is closed
- // This is a workaround for finalize method on jerseys ClientRuntime which
- // closes the client and shuts down the connection pool when it is garbage collected
- }
- };
-
- if (maxTotalConnections != null) {
- connManager.setMaxTotal(maxTotalConnections);
- }
- if (maxPerRouteConnections != null) {
- connManager.setDefaultMaxPerRoute(maxPerRouteConnections);
- }
-
- clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager);
-
- // Configure connection pool timeout
- // clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, RequestConfig.custom()
- // .setConnectionRequestTimeout(1000).build());
-
- ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig);
-
- if (sslContext != null) {
- clientBuilder.sslContext(sslContext);
- }
-
- client = clientBuilder.build();
-
- baseResource = client.target(sanitizeUrl(originalUri).toString()).path(dockerClientConfig.getApiVersion().asWebPathPart());
- }
-
- private URI sanitizeUrl(URI originalUri) {
- if (originalUri.getScheme().equals("unix")) {
- return UnixConnectionSocketFactory.sanitizeUri(originalUri);
- }
- return originalUri;
- }
-
- private void configureProxy(ClientConfig clientConfig, String protocol) {
-
- List proxies = ProxySelector.getDefault().select(dockerClientConfig.getDockerHost());
-
- for (Proxy proxy : proxies) {
- InetSocketAddress address = (InetSocketAddress) proxy.address();
- if (address != null) {
- String hostname = address.getHostName();
- int port = address.getPort();
-
- clientConfig.property(ClientProperties.PROXY_URI, "http://" + hostname + ":" + port);
-
- String httpProxyUser = System.getProperty(protocol + ".proxyUser");
- if (httpProxyUser != null) {
- clientConfig.property(ClientProperties.PROXY_USERNAME, httpProxyUser);
- String httpProxyPassword = System.getProperty(protocol + ".proxyPassword");
- if (httpProxyPassword != null) {
- clientConfig.property(ClientProperties.PROXY_PASSWORD, httpProxyPassword);
- }
- }
- }
- }
- }
-
- private org.apache.http.config.Registry getSchemeRegistry(final URI originalUri,
- SSLContext sslContext) {
- RegistryBuilder registryBuilder = RegistryBuilder.create();
- registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory());
- if (sslContext != null) {
- registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext));
- }
- registryBuilder.register("unix", new UnixConnectionSocketFactory(originalUri));
- return registryBuilder.build();
- }
-
- protected WebTarget getBaseResource() {
- checkNotNull(baseResource, "Factory not initialized, baseResource not set. You probably forgot to call init()!");
- return baseResource;
- }
-
- protected DockerClientConfig getDockerClientConfig() {
- checkNotNull(dockerClientConfig,
- "Factor not initialized, dockerClientConfig not set. You probably forgot to call init()!");
- return dockerClientConfig;
- }
-
- @Override
- public AuthCmd.Exec createAuthCmdExec() {
- return new AuthCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InfoCmd.Exec createInfoCmdExec() {
- return new InfoCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public PingCmd.Exec createPingCmdExec() {
- return new PingCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public VersionCmd.Exec createVersionCmdExec() {
- return new VersionCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public PullImageCmd.Exec createPullImageCmdExec() {
- return new PullImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public PushImageCmd.Exec createPushImageCmdExec() {
- return new PushImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public SaveImageCmd.Exec createSaveImageCmdExec() {
- return new SaveImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CreateImageCmd.Exec createCreateImageCmdExec() {
- return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public LoadImageCmd.Exec createLoadImageCmdExec() {
- return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public SearchImagesCmd.Exec createSearchImagesCmdExec() {
- return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RemoveImageCmd.Exec createRemoveImageCmdExec() {
- return new RemoveImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ListImagesCmd.Exec createListImagesCmdExec() {
- return new ListImagesCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectImageCmd.Exec createInspectImageCmdExec() {
- return new InspectImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ListContainersCmd.Exec createListContainersCmdExec() {
- return new ListContainersCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CreateContainerCmd.Exec createCreateContainerCmdExec() {
- return new CreateContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public StartContainerCmd.Exec createStartContainerCmdExec() {
- return new StartContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectContainerCmd.Exec createInspectContainerCmdExec() {
- return new InspectContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ExecCreateCmd.Exec createExecCmdExec() {
- return new ExecCreateCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RemoveContainerCmd.Exec createRemoveContainerCmdExec() {
- return new RemoveContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public WaitContainerCmd.Exec createWaitContainerCmdExec() {
- return new WaitContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public AttachContainerCmd.Exec createAttachContainerCmdExec() {
- return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ExecStartCmd.Exec createExecStartCmdExec() {
- return new ExecStartCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectExecCmd.Exec createInspectExecCmdExec() {
- return new InspectExecCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public LogContainerCmd.Exec createLogContainerCmdExec() {
- return new LogContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() {
- return new CopyArchiveFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
- return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() {
- return new CopyArchiveToContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public StopContainerCmd.Exec createStopContainerCmdExec() {
- return new StopContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ContainerDiffCmd.Exec createContainerDiffCmdExec() {
- return new ContainerDiffCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public KillContainerCmd.Exec createKillContainerCmdExec() {
- return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public UpdateContainerCmd.Exec createUpdateContainerCmdExec() {
- return new UpdateContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RenameContainerCmd.Exec createRenameContainerCmdExec() {
- return new RenameContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RestartContainerCmd.Exec createRestartContainerCmdExec() {
- return new RestartContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CommitCmd.Exec createCommitCmdExec() {
- return new CommitCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public BuildImageCmd.Exec createBuildImageCmdExec() {
- return new BuildImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public TopContainerCmd.Exec createTopContainerCmdExec() {
- return new TopContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public TagImageCmd.Exec createTagImageCmdExec() {
- return new TagImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public PauseContainerCmd.Exec createPauseContainerCmdExec() {
- return new PauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
- return new UnpauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public EventsCmd.Exec createEventsCmdExec() {
- return new EventsCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public StatsCmd.Exec createStatsCmdExec() {
- return new StatsCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CreateVolumeCmd.Exec createCreateVolumeCmdExec() {
- return new CreateVolumeCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectVolumeCmd.Exec createInspectVolumeCmdExec() {
- return new InspectVolumeCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() {
- return new RemoveVolumeCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ListVolumesCmd.Exec createListVolumesCmdExec() {
- return new ListVolumesCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ListNetworksCmd.Exec createListNetworksCmdExec() {
- return new ListNetworksCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectNetworkCmd.Exec createInspectNetworkCmdExec() {
-
- return new InspectNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CreateNetworkCmd.Exec createCreateNetworkCmdExec() {
-
- return new CreateNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() {
-
- return new RemoveNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() {
-
- return new ConnectToNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() {
-
- return new DisconnectFromNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public void close() throws IOException {
- checkNotNull(client, "Factory not initialized. You probably forgot to call init()!");
- client.close();
- connManager.close();
- }
-
- public DockerCmdExecFactoryImpl withReadTimeout(Integer readTimeout) {
- this.readTimeout = readTimeout;
- return this;
- }
-
- public DockerCmdExecFactoryImpl withConnectTimeout(Integer connectTimeout) {
- this.connectTimeout = connectTimeout;
- return this;
- }
-
- public DockerCmdExecFactoryImpl withMaxTotalConnections(Integer maxTotalConnections) {
- this.maxTotalConnections = maxTotalConnections;
- return this;
- }
-
- public DockerCmdExecFactoryImpl withMaxPerRouteConnections(Integer maxPerRouteConnections) {
- this.maxPerRouteConnections = maxPerRouteConnections;
- return this;
- }
-
- public DockerCmdExecFactoryImpl withClientResponseFilters(ClientResponseFilter... clientResponseFilter) {
- this.clientResponseFilters = clientResponseFilter;
- return this;
- }
-
- public DockerCmdExecFactoryImpl withClientRequestFilters(ClientRequestFilter... clientRequestFilters) {
- this.clientRequestFilters = clientRequestFilters;
- return this;
- }
-
+/**
+ * @author Kanstantsin Shautsou
+ * @deprecated clashes with netty impl.
+ */
+@Deprecated
+public class DockerCmdExecFactoryImpl extends JerseyDockerCmdExecFactory {
}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
new file mode 100644
index 000000000..3339a2696
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
@@ -0,0 +1,583 @@
+package com.github.dockerjava.jaxrs;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.ProxySelector;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import javax.net.ssl.SSLContext;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.client.ClientResponseFilter;
+import javax.ws.rs.client.WebTarget;
+
+import com.github.dockerjava.api.command.UpdateContainerCmd;
+import com.github.dockerjava.core.SSLConfig;
+
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.glassfish.jersey.CommonProperties;
+import org.glassfish.jersey.apache.connector.ApacheClientProperties;
+import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.client.ClientProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import com.github.dockerjava.api.command.AttachContainerCmd;
+import com.github.dockerjava.api.command.AuthCmd;
+import com.github.dockerjava.api.command.BuildImageCmd;
+import com.github.dockerjava.api.command.CommitCmd;
+import com.github.dockerjava.api.command.ConnectToNetworkCmd;
+import com.github.dockerjava.api.command.ContainerDiffCmd;
+import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
+import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
+import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
+import com.github.dockerjava.api.command.CreateContainerCmd;
+import com.github.dockerjava.api.command.CreateImageCmd;
+import com.github.dockerjava.api.command.CreateNetworkCmd;
+import com.github.dockerjava.api.command.CreateVolumeCmd;
+import com.github.dockerjava.api.command.DisconnectFromNetworkCmd;
+import com.github.dockerjava.api.command.DockerCmdExecFactory;
+import com.github.dockerjava.api.command.EventsCmd;
+import com.github.dockerjava.api.command.ExecCreateCmd;
+import com.github.dockerjava.api.command.ExecStartCmd;
+import com.github.dockerjava.api.command.InfoCmd;
+import com.github.dockerjava.api.command.InspectContainerCmd;
+import com.github.dockerjava.api.command.InspectExecCmd;
+import com.github.dockerjava.api.command.InspectImageCmd;
+import com.github.dockerjava.api.command.InspectNetworkCmd;
+import com.github.dockerjava.api.command.InspectVolumeCmd;
+import com.github.dockerjava.api.command.KillContainerCmd;
+import com.github.dockerjava.api.command.ListContainersCmd;
+import com.github.dockerjava.api.command.ListImagesCmd;
+import com.github.dockerjava.api.command.ListNetworksCmd;
+import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
+import com.github.dockerjava.api.command.LogContainerCmd;
+import com.github.dockerjava.api.command.PauseContainerCmd;
+import com.github.dockerjava.api.command.PingCmd;
+import com.github.dockerjava.api.command.PullImageCmd;
+import com.github.dockerjava.api.command.PushImageCmd;
+import com.github.dockerjava.api.command.RemoveContainerCmd;
+import com.github.dockerjava.api.command.RemoveImageCmd;
+import com.github.dockerjava.api.command.RemoveNetworkCmd;
+import com.github.dockerjava.api.command.RemoveVolumeCmd;
+import com.github.dockerjava.api.command.RestartContainerCmd;
+import com.github.dockerjava.api.command.SaveImageCmd;
+import com.github.dockerjava.api.command.SearchImagesCmd;
+import com.github.dockerjava.api.command.StartContainerCmd;
+import com.github.dockerjava.api.command.StatsCmd;
+import com.github.dockerjava.api.command.StopContainerCmd;
+import com.github.dockerjava.api.command.TagImageCmd;
+import com.github.dockerjava.api.command.TopContainerCmd;
+import com.github.dockerjava.api.command.UnpauseContainerCmd;
+import com.github.dockerjava.api.command.VersionCmd;
+import com.github.dockerjava.api.command.WaitContainerCmd;
+import com.github.dockerjava.api.command.RenameContainerCmd;
+import com.github.dockerjava.api.exception.DockerClientException;
+import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.jaxrs.filter.JsonClientFilter;
+import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter;
+import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter;
+
+//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
+// see https://github.com/docker-java/docker-java/issues/196
+
+public class JerseyDockerCmdExecFactory implements DockerCmdExecFactory {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(JerseyDockerCmdExecFactory.class.getName());
+
+ private Client client;
+
+ private WebTarget baseResource;
+
+ private Integer readTimeout = null;
+
+ private Integer connectTimeout = null;
+
+ private Integer maxTotalConnections = null;
+
+ private Integer maxPerRouteConnections = null;
+
+ private ClientRequestFilter[] clientRequestFilters = null;
+
+ private ClientResponseFilter[] clientResponseFilters = null;
+
+ private DockerClientConfig dockerClientConfig;
+
+ private PoolingHttpClientConnectionManager connManager = null;
+
+ @Override
+ public void init(DockerClientConfig dockerClientConfig) {
+ checkNotNull(dockerClientConfig, "config was not specified");
+ this.dockerClientConfig = dockerClientConfig;
+
+ ClientConfig clientConfig = new ClientConfig();
+ clientConfig.connectorProvider(new ApacheConnectorProvider());
+ clientConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);
+
+ clientConfig.register(ResponseStatusExceptionFilter.class);
+ clientConfig.register(JsonClientFilter.class);
+ clientConfig.register(JacksonJsonProvider.class);
+
+ // logging may disabled via log level
+ clientConfig.register(new SelectiveLoggingFilter(LOGGER, true));
+
+ if (readTimeout != null) {
+ clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout);
+ }
+
+ if (connectTimeout != null) {
+ clientConfig.property(ClientProperties.CONNECT_TIMEOUT, connectTimeout);
+ }
+
+ if (clientResponseFilters != null) {
+ for (ClientResponseFilter clientResponseFilter : clientResponseFilters) {
+ if (clientResponseFilter != null) {
+ clientConfig.register(clientResponseFilter);
+ }
+ }
+ }
+
+ if (clientRequestFilters != null) {
+ for (ClientRequestFilter clientRequestFilter : clientRequestFilters) {
+ if (clientRequestFilter != null) {
+ clientConfig.register(clientRequestFilter);
+ }
+ }
+ }
+
+ URI originalUri = dockerClientConfig.getDockerHost();
+
+ String protocol = null;
+
+ SSLContext sslContext = null;
+
+ try {
+ final SSLConfig sslConfig = dockerClientConfig.getSSLConfig();
+ if (sslConfig != null) {
+ sslContext = sslConfig.getSSLContext();
+ }
+ } catch (Exception ex) {
+ throw new DockerClientException("Error in SSL Configuration", ex);
+ }
+
+ if (sslContext != null) {
+ protocol = "https";
+ } else {
+ protocol = "http";
+ }
+
+ if (!originalUri.getScheme().equals("unix")) {
+
+ try {
+ originalUri = new URI(originalUri.toString().replaceFirst("tcp", protocol));
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+
+ configureProxy(clientConfig, protocol);
+ }
+
+ connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry(
+ originalUri, sslContext)) {
+
+ @Override
+ public void close() {
+ super.shutdown();
+ }
+
+ @Override
+ public void shutdown() {
+ // Disable shutdown of the pool. This will be done later, when this factory is closed
+ // This is a workaround for finalize method on jerseys ClientRuntime which
+ // closes the client and shuts down the connection pool when it is garbage collected
+ }
+ };
+
+ if (maxTotalConnections != null) {
+ connManager.setMaxTotal(maxTotalConnections);
+ }
+ if (maxPerRouteConnections != null) {
+ connManager.setDefaultMaxPerRoute(maxPerRouteConnections);
+ }
+
+ clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager);
+
+ // Configure connection pool timeout
+ // clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, RequestConfig.custom()
+ // .setConnectionRequestTimeout(1000).build());
+
+ ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig);
+
+ if (sslContext != null) {
+ clientBuilder.sslContext(sslContext);
+ }
+
+ client = clientBuilder.build();
+
+ baseResource = client.target(sanitizeUrl(originalUri).toString()).path(dockerClientConfig.getApiVersion().asWebPathPart());
+ }
+
+ private URI sanitizeUrl(URI originalUri) {
+ if (originalUri.getScheme().equals("unix")) {
+ return UnixConnectionSocketFactory.sanitizeUri(originalUri);
+ }
+ return originalUri;
+ }
+
+ private void configureProxy(ClientConfig clientConfig, String protocol) {
+
+ List proxies = ProxySelector.getDefault().select(dockerClientConfig.getDockerHost());
+
+ for (Proxy proxy : proxies) {
+ InetSocketAddress address = (InetSocketAddress) proxy.address();
+ if (address != null) {
+ String hostname = address.getHostName();
+ int port = address.getPort();
+
+ clientConfig.property(ClientProperties.PROXY_URI, "http://" + hostname + ":" + port);
+
+ String httpProxyUser = System.getProperty(protocol + ".proxyUser");
+ if (httpProxyUser != null) {
+ clientConfig.property(ClientProperties.PROXY_USERNAME, httpProxyUser);
+ String httpProxyPassword = System.getProperty(protocol + ".proxyPassword");
+ if (httpProxyPassword != null) {
+ clientConfig.property(ClientProperties.PROXY_PASSWORD, httpProxyPassword);
+ }
+ }
+ }
+ }
+ }
+
+ private org.apache.http.config.Registry getSchemeRegistry(final URI originalUri,
+ SSLContext sslContext) {
+ RegistryBuilder registryBuilder = RegistryBuilder.create();
+ registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory());
+ if (sslContext != null) {
+ registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext));
+ }
+ registryBuilder.register("unix", new UnixConnectionSocketFactory(originalUri));
+ return registryBuilder.build();
+ }
+
+ protected WebTarget getBaseResource() {
+ checkNotNull(baseResource, "Factory not initialized, baseResource not set. You probably forgot to call init()!");
+ return baseResource;
+ }
+
+ protected DockerClientConfig getDockerClientConfig() {
+ checkNotNull(dockerClientConfig,
+ "Factor not initialized, dockerClientConfig not set. You probably forgot to call init()!");
+ return dockerClientConfig;
+ }
+
+ @Override
+ public AuthCmd.Exec createAuthCmdExec() {
+ return new AuthCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InfoCmd.Exec createInfoCmdExec() {
+ return new InfoCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public PingCmd.Exec createPingCmdExec() {
+ return new PingCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public VersionCmd.Exec createVersionCmdExec() {
+ return new VersionCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public PullImageCmd.Exec createPullImageCmdExec() {
+ return new PullImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public PushImageCmd.Exec createPushImageCmdExec() {
+ return new PushImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public SaveImageCmd.Exec createSaveImageCmdExec() {
+ return new SaveImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CreateImageCmd.Exec createCreateImageCmdExec() {
+ return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public LoadImageCmd.Exec createLoadImageCmdExec() {
+ return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public SearchImagesCmd.Exec createSearchImagesCmdExec() {
+ return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RemoveImageCmd.Exec createRemoveImageCmdExec() {
+ return new RemoveImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ListImagesCmd.Exec createListImagesCmdExec() {
+ return new ListImagesCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectImageCmd.Exec createInspectImageCmdExec() {
+ return new InspectImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ListContainersCmd.Exec createListContainersCmdExec() {
+ return new ListContainersCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CreateContainerCmd.Exec createCreateContainerCmdExec() {
+ return new CreateContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public StartContainerCmd.Exec createStartContainerCmdExec() {
+ return new StartContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectContainerCmd.Exec createInspectContainerCmdExec() {
+ return new InspectContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ExecCreateCmd.Exec createExecCmdExec() {
+ return new ExecCreateCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RemoveContainerCmd.Exec createRemoveContainerCmdExec() {
+ return new RemoveContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public WaitContainerCmd.Exec createWaitContainerCmdExec() {
+ return new WaitContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public AttachContainerCmd.Exec createAttachContainerCmdExec() {
+ return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ExecStartCmd.Exec createExecStartCmdExec() {
+ return new ExecStartCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectExecCmd.Exec createInspectExecCmdExec() {
+ return new InspectExecCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public LogContainerCmd.Exec createLogContainerCmdExec() {
+ return new LogContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() {
+ return new CopyArchiveFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
+ return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() {
+ return new CopyArchiveToContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public StopContainerCmd.Exec createStopContainerCmdExec() {
+ return new StopContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ContainerDiffCmd.Exec createContainerDiffCmdExec() {
+ return new ContainerDiffCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public KillContainerCmd.Exec createKillContainerCmdExec() {
+ return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public UpdateContainerCmd.Exec createUpdateContainerCmdExec() {
+ return new UpdateContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RenameContainerCmd.Exec createRenameContainerCmdExec() {
+ return new RenameContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RestartContainerCmd.Exec createRestartContainerCmdExec() {
+ return new RestartContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CommitCmd.Exec createCommitCmdExec() {
+ return new CommitCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public BuildImageCmd.Exec createBuildImageCmdExec() {
+ return new BuildImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public TopContainerCmd.Exec createTopContainerCmdExec() {
+ return new TopContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public TagImageCmd.Exec createTagImageCmdExec() {
+ return new TagImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public PauseContainerCmd.Exec createPauseContainerCmdExec() {
+ return new PauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
+ return new UnpauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public EventsCmd.Exec createEventsCmdExec() {
+ return new EventsCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public StatsCmd.Exec createStatsCmdExec() {
+ return new StatsCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CreateVolumeCmd.Exec createCreateVolumeCmdExec() {
+ return new CreateVolumeCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectVolumeCmd.Exec createInspectVolumeCmdExec() {
+ return new InspectVolumeCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() {
+ return new RemoveVolumeCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ListVolumesCmd.Exec createListVolumesCmdExec() {
+ return new ListVolumesCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ListNetworksCmd.Exec createListNetworksCmdExec() {
+ return new ListNetworksCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectNetworkCmd.Exec createInspectNetworkCmdExec() {
+
+ return new InspectNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CreateNetworkCmd.Exec createCreateNetworkCmdExec() {
+
+ return new CreateNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() {
+
+ return new RemoveNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() {
+
+ return new ConnectToNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() {
+
+ return new DisconnectFromNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public void close() throws IOException {
+ checkNotNull(client, "Factory not initialized. You probably forgot to call init()!");
+ client.close();
+ connManager.close();
+ }
+
+ public JerseyDockerCmdExecFactory withReadTimeout(Integer readTimeout) {
+ this.readTimeout = readTimeout;
+ return this;
+ }
+
+ public JerseyDockerCmdExecFactory withConnectTimeout(Integer connectTimeout) {
+ this.connectTimeout = connectTimeout;
+ return this;
+ }
+
+ public JerseyDockerCmdExecFactory withMaxTotalConnections(Integer maxTotalConnections) {
+ this.maxTotalConnections = maxTotalConnections;
+ return this;
+ }
+
+ public JerseyDockerCmdExecFactory withMaxPerRouteConnections(Integer maxPerRouteConnections) {
+ this.maxPerRouteConnections = maxPerRouteConnections;
+ return this;
+ }
+
+ public JerseyDockerCmdExecFactory withClientResponseFilters(ClientResponseFilter... clientResponseFilter) {
+ this.clientResponseFilters = clientResponseFilter;
+ return this;
+ }
+
+ public JerseyDockerCmdExecFactory withClientRequestFilters(ClientRequestFilter... clientRequestFilters) {
+ this.clientRequestFilters = clientRequestFilters;
+ return this;
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java
index dff69a228..25825d169 100644
--- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java
+++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java
@@ -1,586 +1,9 @@
package com.github.dockerjava.netty;
-import com.github.dockerjava.api.command.AttachContainerCmd;
-import com.github.dockerjava.api.command.AuthCmd;
-import com.github.dockerjava.api.command.BuildImageCmd;
-import com.github.dockerjava.api.command.CommitCmd;
-import com.github.dockerjava.api.command.ConnectToNetworkCmd;
-import com.github.dockerjava.api.command.ContainerDiffCmd;
-import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
-import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
-import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
-import com.github.dockerjava.api.command.CreateContainerCmd;
-import com.github.dockerjava.api.command.CreateImageCmd;
-import com.github.dockerjava.api.command.CreateNetworkCmd;
-import com.github.dockerjava.api.command.CreateVolumeCmd;
-import com.github.dockerjava.api.command.DisconnectFromNetworkCmd;
-import com.github.dockerjava.api.command.DockerCmdExecFactory;
-import com.github.dockerjava.api.command.EventsCmd;
-import com.github.dockerjava.api.command.ExecCreateCmd;
-import com.github.dockerjava.api.command.ExecStartCmd;
-import com.github.dockerjava.api.command.InfoCmd;
-import com.github.dockerjava.api.command.InspectContainerCmd;
-import com.github.dockerjava.api.command.InspectExecCmd;
-import com.github.dockerjava.api.command.InspectImageCmd;
-import com.github.dockerjava.api.command.InspectNetworkCmd;
-import com.github.dockerjava.api.command.InspectVolumeCmd;
-import com.github.dockerjava.api.command.KillContainerCmd;
-import com.github.dockerjava.api.command.ListContainersCmd;
-import com.github.dockerjava.api.command.ListImagesCmd;
-import com.github.dockerjava.api.command.ListNetworksCmd;
-import com.github.dockerjava.api.command.ListVolumesCmd;
-import com.github.dockerjava.api.command.LoadImageCmd;
-import com.github.dockerjava.api.command.LogContainerCmd;
-import com.github.dockerjava.api.command.PauseContainerCmd;
-import com.github.dockerjava.api.command.PingCmd;
-import com.github.dockerjava.api.command.PullImageCmd;
-import com.github.dockerjava.api.command.PushImageCmd;
-import com.github.dockerjava.api.command.RemoveContainerCmd;
-import com.github.dockerjava.api.command.RemoveImageCmd;
-import com.github.dockerjava.api.command.RemoveNetworkCmd;
-import com.github.dockerjava.api.command.RemoveVolumeCmd;
-import com.github.dockerjava.api.command.RestartContainerCmd;
-import com.github.dockerjava.api.command.SaveImageCmd;
-import com.github.dockerjava.api.command.SearchImagesCmd;
-import com.github.dockerjava.api.command.StartContainerCmd;
-import com.github.dockerjava.api.command.StatsCmd;
-import com.github.dockerjava.api.command.StopContainerCmd;
-import com.github.dockerjava.api.command.TagImageCmd;
-import com.github.dockerjava.api.command.TopContainerCmd;
-import com.github.dockerjava.api.command.UnpauseContainerCmd;
-import com.github.dockerjava.api.command.UpdateContainerCmd;
-import com.github.dockerjava.api.command.VersionCmd;
-import com.github.dockerjava.api.command.WaitContainerCmd;
-import com.github.dockerjava.api.command.RenameContainerCmd;
-import com.github.dockerjava.core.DockerClientConfig;
-import com.github.dockerjava.core.DockerClientImpl;
-import com.github.dockerjava.core.SSLConfig;
-import com.github.dockerjava.netty.exec.AttachContainerCmdExec;
-import com.github.dockerjava.netty.exec.AuthCmdExec;
-import com.github.dockerjava.netty.exec.BuildImageCmdExec;
-import com.github.dockerjava.netty.exec.CommitCmdExec;
-import com.github.dockerjava.netty.exec.ConnectToNetworkCmdExec;
-import com.github.dockerjava.netty.exec.ContainerDiffCmdExec;
-import com.github.dockerjava.netty.exec.CopyArchiveFromContainerCmdExec;
-import com.github.dockerjava.netty.exec.CopyArchiveToContainerCmdExec;
-import com.github.dockerjava.netty.exec.CopyFileFromContainerCmdExec;
-import com.github.dockerjava.netty.exec.CreateContainerCmdExec;
-import com.github.dockerjava.netty.exec.CreateImageCmdExec;
-import com.github.dockerjava.netty.exec.CreateNetworkCmdExec;
-import com.github.dockerjava.netty.exec.CreateVolumeCmdExec;
-import com.github.dockerjava.netty.exec.DisconnectFromNetworkCmdExec;
-import com.github.dockerjava.netty.exec.EventsCmdExec;
-import com.github.dockerjava.netty.exec.ExecCreateCmdExec;
-import com.github.dockerjava.netty.exec.ExecStartCmdExec;
-import com.github.dockerjava.netty.exec.InfoCmdExec;
-import com.github.dockerjava.netty.exec.InspectContainerCmdExec;
-import com.github.dockerjava.netty.exec.InspectExecCmdExec;
-import com.github.dockerjava.netty.exec.InspectImageCmdExec;
-import com.github.dockerjava.netty.exec.InspectNetworkCmdExec;
-import com.github.dockerjava.netty.exec.InspectVolumeCmdExec;
-import com.github.dockerjava.netty.exec.KillContainerCmdExec;
-import com.github.dockerjava.netty.exec.ListContainersCmdExec;
-import com.github.dockerjava.netty.exec.ListImagesCmdExec;
-import com.github.dockerjava.netty.exec.ListNetworksCmdExec;
-import com.github.dockerjava.netty.exec.ListVolumesCmdExec;
-import com.github.dockerjava.netty.exec.LoadImageCmdExec;
-import com.github.dockerjava.netty.exec.LogContainerCmdExec;
-import com.github.dockerjava.netty.exec.PauseContainerCmdExec;
-import com.github.dockerjava.netty.exec.PingCmdExec;
-import com.github.dockerjava.netty.exec.PullImageCmdExec;
-import com.github.dockerjava.netty.exec.PushImageCmdExec;
-import com.github.dockerjava.netty.exec.RemoveContainerCmdExec;
-import com.github.dockerjava.netty.exec.RemoveImageCmdExec;
-import com.github.dockerjava.netty.exec.RemoveNetworkCmdExec;
-import com.github.dockerjava.netty.exec.RemoveVolumeCmdExec;
-import com.github.dockerjava.netty.exec.RestartContainerCmdExec;
-import com.github.dockerjava.netty.exec.SaveImageCmdExec;
-import com.github.dockerjava.netty.exec.SearchImagesCmdExec;
-import com.github.dockerjava.netty.exec.StartContainerCmdExec;
-import com.github.dockerjava.netty.exec.StatsCmdExec;
-import com.github.dockerjava.netty.exec.StopContainerCmdExec;
-import com.github.dockerjava.netty.exec.TagImageCmdExec;
-import com.github.dockerjava.netty.exec.TopContainerCmdExec;
-import com.github.dockerjava.netty.exec.UnpauseContainerCmdExec;
-import com.github.dockerjava.netty.exec.UpdateContainerCmdExec;
-import com.github.dockerjava.netty.exec.VersionCmdExec;
-import com.github.dockerjava.netty.exec.WaitContainerCmdExec;
-import com.github.dockerjava.netty.exec.RenameContainerCmdExec;
-
-import io.netty.bootstrap.Bootstrap;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.epoll.EpollDomainSocketChannel;
-import io.netty.channel.epoll.EpollEventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.DuplexChannel;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import io.netty.channel.unix.DomainSocketAddress;
-import io.netty.channel.unix.UnixChannel;
-import io.netty.handler.codec.http.HttpClientCodec;
-import io.netty.handler.logging.LoggingHandler;
-import io.netty.handler.ssl.SslHandler;
-import io.netty.util.concurrent.DefaultThreadFactory;
-
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
-
-import javax.net.ssl.SSLEngine;
-import javax.net.ssl.SSLParameters;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.security.Security;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
/**
- * Experimental implementation of {@link DockerCmdExecFactory} that supports http connection hijacking that is needed to pass STDIN to the
- * container.
- *
- * To use it just pass an instance via {@link DockerClientImpl#withDockerCmdExecFactory(DockerCmdExecFactory)}
- *
- * @see https://docs.docker.com/engine/reference/api/docker_remote_api_v1.21/#attach-to-a-container
- * @see https://docs.docker.com/engine/reference/api/docker_remote_api_v1.21/#exec-start
- *
- *
- * @author Marcus Linke
+ * @author Kanstantsin Shautsou
+ * @deprecated old clashing name
*/
-public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory {
-
- private static String threadPrefix = "dockerjava-netty";
-
- /*
- * useful links:
- *
- * http://stackoverflow.com/questions/33296749/netty-connect-to-unix-domain-socket-failed
- * http://netty.io/wiki/native-transports.html
- * https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/http/snoop/HttpSnoopClient.java
- * https://github.com/slandelle/netty-request-chunking/blob/master/src/test/java/slandelle/ChunkingTest.java
- */
-
- private DockerClientConfig dockerClientConfig;
-
- private Bootstrap bootstrap;
-
- private EventLoopGroup eventLoopGroup;
-
- private NettyInitializer nettyInitializer;
-
- private ChannelProvider channelProvider = new ChannelProvider() {
- @Override
- public DuplexChannel getChannel() {
- DuplexChannel channel = connect();
- channel.pipeline().addLast(new LoggingHandler(getClass()));
- return channel;
- }
- };
-
- @Override
- public void init(DockerClientConfig dockerClientConfig) {
- checkNotNull(dockerClientConfig, "config was not specified");
- this.dockerClientConfig = dockerClientConfig;
-
- bootstrap = new Bootstrap();
-
- String scheme = dockerClientConfig.getDockerHost().getScheme();
-
- if ("unix".equals(scheme)) {
- nettyInitializer = new UnixDomainSocketInitializer();
- } else if ("tcp".equals(scheme)) {
- nettyInitializer = new InetSocketInitializer();
- }
-
- eventLoopGroup = nettyInitializer.init(bootstrap, dockerClientConfig);
- }
-
- private DuplexChannel connect() {
- try {
- return connect(bootstrap);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
-
- private DuplexChannel connect(final Bootstrap bootstrap) throws InterruptedException {
- return nettyInitializer.connect(bootstrap);
- }
-
- private interface NettyInitializer {
- EventLoopGroup init(final Bootstrap bootstrap, DockerClientConfig dockerClientConfig);
-
- DuplexChannel connect(final Bootstrap bootstrap) throws InterruptedException;
- }
-
- private class UnixDomainSocketInitializer implements NettyInitializer {
- @Override
- public EventLoopGroup init(Bootstrap bootstrap, DockerClientConfig dockerClientConfig) {
- EventLoopGroup epollEventLoopGroup = new EpollEventLoopGroup(0, new DefaultThreadFactory(threadPrefix));
- bootstrap.group(epollEventLoopGroup).channel(EpollDomainSocketChannel.class)
- .handler(new ChannelInitializer() {
- @Override
- protected void initChannel(final UnixChannel channel) throws Exception {
- channel.pipeline().addLast(new HttpClientCodec());
- }
- });
- return epollEventLoopGroup;
- }
-
- @Override
- public DuplexChannel connect(Bootstrap bootstrap) throws InterruptedException {
- return (DuplexChannel) bootstrap.connect(new DomainSocketAddress("/var/run/docker.sock")).sync().channel();
- }
- }
-
- private class InetSocketInitializer implements NettyInitializer {
- @Override
- public EventLoopGroup init(Bootstrap bootstrap, final DockerClientConfig dockerClientConfig) {
- EventLoopGroup nioEventLoopGroup = new NioEventLoopGroup(0, new DefaultThreadFactory(threadPrefix));
-
- InetAddress addr = InetAddress.getLoopbackAddress();
-
- final SocketAddress proxyAddress = new InetSocketAddress(addr, 8008);
-
- Security.addProvider(new BouncyCastleProvider());
-
- bootstrap.group(nioEventLoopGroup).channel(NioSocketChannel.class)
- .handler(new ChannelInitializer() {
- @Override
- protected void initChannel(final SocketChannel channel) throws Exception {
- // channel.pipeline().addLast(new
- // HttpProxyHandler(proxyAddress));
- channel.pipeline().addLast(new HttpClientCodec());
- }
- });
-
- return nioEventLoopGroup;
- }
-
- @Override
- public DuplexChannel connect(Bootstrap bootstrap) throws InterruptedException {
- String host = dockerClientConfig.getDockerHost().getHost();
- int port = dockerClientConfig.getDockerHost().getPort();
-
- if (port == -1) {
- throw new RuntimeException("no port configured for " + host);
- }
-
- DuplexChannel channel = (DuplexChannel) bootstrap.connect(host, port).sync().channel();
-
- final SslHandler ssl = initSsl(dockerClientConfig);
-
- if (ssl != null) {
- channel.pipeline().addFirst(ssl);
- }
-
- return channel;
- }
-
- private SslHandler initSsl(DockerClientConfig dockerClientConfig) {
- SslHandler ssl = null;
-
- try {
- String host = dockerClientConfig.getDockerHost().getHost();
- int port = dockerClientConfig.getDockerHost().getPort();
-
- final SSLConfig sslConfig = dockerClientConfig.getSSLConfig();
-
- if (sslConfig != null && sslConfig.getSSLContext() != null) {
-
- SSLEngine engine = sslConfig.getSSLContext().createSSLEngine(host, port);
- engine.setUseClientMode(true);
- engine.setSSLParameters(enableHostNameVerification(engine.getSSLParameters()));
-
- // in the future we may use HostnameVerifier like here:
- // https://github.com/AsyncHttpClient/async-http-client/blob/1.8.x/src/main/java/com/ning/http/client/providers/netty/NettyConnectListener.java#L76
-
- ssl = new SslHandler(engine);
- }
-
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- return ssl;
- }
- }
-
- protected DockerClientConfig getDockerClientConfig() {
- checkNotNull(dockerClientConfig,
- "Factor not initialized, dockerClientConfig not set. You probably forgot to call init()!");
- return dockerClientConfig;
- }
-
- public SSLParameters enableHostNameVerification(SSLParameters sslParameters) {
- sslParameters.setEndpointIdentificationAlgorithm("HTTPS");
- return sslParameters;
- }
-
- @Override
- public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() {
- return new CopyArchiveFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() {
- return new CopyArchiveToContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public AuthCmd.Exec createAuthCmdExec() {
- return new AuthCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InfoCmd.Exec createInfoCmdExec() {
- return new InfoCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public PingCmd.Exec createPingCmdExec() {
- return new PingCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public VersionCmd.Exec createVersionCmdExec() {
- return new VersionCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public PullImageCmd.Exec createPullImageCmdExec() {
- return new PullImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public PushImageCmd.Exec createPushImageCmdExec() {
- return new PushImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public SaveImageCmd.Exec createSaveImageCmdExec() {
- return new SaveImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CreateImageCmd.Exec createCreateImageCmdExec() {
- return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public LoadImageCmd.Exec createLoadImageCmdExec() {
- return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public SearchImagesCmd.Exec createSearchImagesCmdExec() {
- return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RemoveImageCmd.Exec createRemoveImageCmdExec() {
- return new RemoveImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ListImagesCmd.Exec createListImagesCmdExec() {
- return new ListImagesCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectImageCmd.Exec createInspectImageCmdExec() {
- return new InspectImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ListContainersCmd.Exec createListContainersCmdExec() {
- return new ListContainersCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CreateContainerCmd.Exec createCreateContainerCmdExec() {
- return new CreateContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public StartContainerCmd.Exec createStartContainerCmdExec() {
- return new StartContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectContainerCmd.Exec createInspectContainerCmdExec() {
- return new InspectContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ExecCreateCmd.Exec createExecCmdExec() {
- return new ExecCreateCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RemoveContainerCmd.Exec createRemoveContainerCmdExec() {
- return new RemoveContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public WaitContainerCmd.Exec createWaitContainerCmdExec() {
- return new WaitContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public AttachContainerCmd.Exec createAttachContainerCmdExec() {
- return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ExecStartCmd.Exec createExecStartCmdExec() {
- return new ExecStartCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectExecCmd.Exec createInspectExecCmdExec() {
- return new InspectExecCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public LogContainerCmd.Exec createLogContainerCmdExec() {
- return new LogContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
- return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public StopContainerCmd.Exec createStopContainerCmdExec() {
- return new StopContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ContainerDiffCmd.Exec createContainerDiffCmdExec() {
- return new ContainerDiffCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public KillContainerCmd.Exec createKillContainerCmdExec() {
- return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public UpdateContainerCmd.Exec createUpdateContainerCmdExec() {
- return new UpdateContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RenameContainerCmd.Exec createRenameContainerCmdExec() {
- return new RenameContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RestartContainerCmd.Exec createRestartContainerCmdExec() {
- return new RestartContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CommitCmd.Exec createCommitCmdExec() {
- return new CommitCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public BuildImageCmd.Exec createBuildImageCmdExec() {
- return new BuildImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public TopContainerCmd.Exec createTopContainerCmdExec() {
- return new TopContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public TagImageCmd.Exec createTagImageCmdExec() {
- return new TagImageCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public PauseContainerCmd.Exec createPauseContainerCmdExec() {
- return new PauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
- return new UnpauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public EventsCmd.Exec createEventsCmdExec() {
- return new EventsCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public StatsCmd.Exec createStatsCmdExec() {
- return new StatsCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CreateVolumeCmd.Exec createCreateVolumeCmdExec() {
- return new CreateVolumeCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectVolumeCmd.Exec createInspectVolumeCmdExec() {
- return new InspectVolumeCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() {
- return new RemoveVolumeCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ListVolumesCmd.Exec createListVolumesCmdExec() {
- return new ListVolumesCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ListNetworksCmd.Exec createListNetworksCmdExec() {
- return new ListNetworksCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public InspectNetworkCmd.Exec createInspectNetworkCmdExec() {
- return new InspectNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public CreateNetworkCmd.Exec createCreateNetworkCmdExec() {
- return new CreateNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() {
- return new RemoveNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() {
- return new ConnectToNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() {
- return new DisconnectFromNetworkCmdExec(getBaseResource(), getDockerClientConfig());
- }
-
- @Override
- public void close() throws IOException {
- checkNotNull(eventLoopGroup, "Factory not initialized. You probably forgot to call init()!");
-
- eventLoopGroup.shutdownGracefully();
- }
-
- private WebTarget getBaseResource() {
- return new WebTarget(channelProvider);
- }
+@Deprecated
+public class DockerCmdExecFactoryImpl extends NettyDockerCmdExecFactory {
}
diff --git a/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java
new file mode 100644
index 000000000..cead92e92
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java
@@ -0,0 +1,586 @@
+package com.github.dockerjava.netty;
+
+import com.github.dockerjava.api.command.AttachContainerCmd;
+import com.github.dockerjava.api.command.AuthCmd;
+import com.github.dockerjava.api.command.BuildImageCmd;
+import com.github.dockerjava.api.command.CommitCmd;
+import com.github.dockerjava.api.command.ConnectToNetworkCmd;
+import com.github.dockerjava.api.command.ContainerDiffCmd;
+import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
+import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
+import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
+import com.github.dockerjava.api.command.CreateContainerCmd;
+import com.github.dockerjava.api.command.CreateImageCmd;
+import com.github.dockerjava.api.command.CreateNetworkCmd;
+import com.github.dockerjava.api.command.CreateVolumeCmd;
+import com.github.dockerjava.api.command.DisconnectFromNetworkCmd;
+import com.github.dockerjava.api.command.DockerCmdExecFactory;
+import com.github.dockerjava.api.command.EventsCmd;
+import com.github.dockerjava.api.command.ExecCreateCmd;
+import com.github.dockerjava.api.command.ExecStartCmd;
+import com.github.dockerjava.api.command.InfoCmd;
+import com.github.dockerjava.api.command.InspectContainerCmd;
+import com.github.dockerjava.api.command.InspectExecCmd;
+import com.github.dockerjava.api.command.InspectImageCmd;
+import com.github.dockerjava.api.command.InspectNetworkCmd;
+import com.github.dockerjava.api.command.InspectVolumeCmd;
+import com.github.dockerjava.api.command.KillContainerCmd;
+import com.github.dockerjava.api.command.ListContainersCmd;
+import com.github.dockerjava.api.command.ListImagesCmd;
+import com.github.dockerjava.api.command.ListNetworksCmd;
+import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
+import com.github.dockerjava.api.command.LogContainerCmd;
+import com.github.dockerjava.api.command.PauseContainerCmd;
+import com.github.dockerjava.api.command.PingCmd;
+import com.github.dockerjava.api.command.PullImageCmd;
+import com.github.dockerjava.api.command.PushImageCmd;
+import com.github.dockerjava.api.command.RemoveContainerCmd;
+import com.github.dockerjava.api.command.RemoveImageCmd;
+import com.github.dockerjava.api.command.RemoveNetworkCmd;
+import com.github.dockerjava.api.command.RemoveVolumeCmd;
+import com.github.dockerjava.api.command.RestartContainerCmd;
+import com.github.dockerjava.api.command.SaveImageCmd;
+import com.github.dockerjava.api.command.SearchImagesCmd;
+import com.github.dockerjava.api.command.StartContainerCmd;
+import com.github.dockerjava.api.command.StatsCmd;
+import com.github.dockerjava.api.command.StopContainerCmd;
+import com.github.dockerjava.api.command.TagImageCmd;
+import com.github.dockerjava.api.command.TopContainerCmd;
+import com.github.dockerjava.api.command.UnpauseContainerCmd;
+import com.github.dockerjava.api.command.UpdateContainerCmd;
+import com.github.dockerjava.api.command.VersionCmd;
+import com.github.dockerjava.api.command.WaitContainerCmd;
+import com.github.dockerjava.api.command.RenameContainerCmd;
+import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.core.DockerClientImpl;
+import com.github.dockerjava.core.SSLConfig;
+import com.github.dockerjava.netty.exec.AttachContainerCmdExec;
+import com.github.dockerjava.netty.exec.AuthCmdExec;
+import com.github.dockerjava.netty.exec.BuildImageCmdExec;
+import com.github.dockerjava.netty.exec.CommitCmdExec;
+import com.github.dockerjava.netty.exec.ConnectToNetworkCmdExec;
+import com.github.dockerjava.netty.exec.ContainerDiffCmdExec;
+import com.github.dockerjava.netty.exec.CopyArchiveFromContainerCmdExec;
+import com.github.dockerjava.netty.exec.CopyArchiveToContainerCmdExec;
+import com.github.dockerjava.netty.exec.CopyFileFromContainerCmdExec;
+import com.github.dockerjava.netty.exec.CreateContainerCmdExec;
+import com.github.dockerjava.netty.exec.CreateImageCmdExec;
+import com.github.dockerjava.netty.exec.CreateNetworkCmdExec;
+import com.github.dockerjava.netty.exec.CreateVolumeCmdExec;
+import com.github.dockerjava.netty.exec.DisconnectFromNetworkCmdExec;
+import com.github.dockerjava.netty.exec.EventsCmdExec;
+import com.github.dockerjava.netty.exec.ExecCreateCmdExec;
+import com.github.dockerjava.netty.exec.ExecStartCmdExec;
+import com.github.dockerjava.netty.exec.InfoCmdExec;
+import com.github.dockerjava.netty.exec.InspectContainerCmdExec;
+import com.github.dockerjava.netty.exec.InspectExecCmdExec;
+import com.github.dockerjava.netty.exec.InspectImageCmdExec;
+import com.github.dockerjava.netty.exec.InspectNetworkCmdExec;
+import com.github.dockerjava.netty.exec.InspectVolumeCmdExec;
+import com.github.dockerjava.netty.exec.KillContainerCmdExec;
+import com.github.dockerjava.netty.exec.ListContainersCmdExec;
+import com.github.dockerjava.netty.exec.ListImagesCmdExec;
+import com.github.dockerjava.netty.exec.ListNetworksCmdExec;
+import com.github.dockerjava.netty.exec.ListVolumesCmdExec;
+import com.github.dockerjava.netty.exec.LoadImageCmdExec;
+import com.github.dockerjava.netty.exec.LogContainerCmdExec;
+import com.github.dockerjava.netty.exec.PauseContainerCmdExec;
+import com.github.dockerjava.netty.exec.PingCmdExec;
+import com.github.dockerjava.netty.exec.PullImageCmdExec;
+import com.github.dockerjava.netty.exec.PushImageCmdExec;
+import com.github.dockerjava.netty.exec.RemoveContainerCmdExec;
+import com.github.dockerjava.netty.exec.RemoveImageCmdExec;
+import com.github.dockerjava.netty.exec.RemoveNetworkCmdExec;
+import com.github.dockerjava.netty.exec.RemoveVolumeCmdExec;
+import com.github.dockerjava.netty.exec.RestartContainerCmdExec;
+import com.github.dockerjava.netty.exec.SaveImageCmdExec;
+import com.github.dockerjava.netty.exec.SearchImagesCmdExec;
+import com.github.dockerjava.netty.exec.StartContainerCmdExec;
+import com.github.dockerjava.netty.exec.StatsCmdExec;
+import com.github.dockerjava.netty.exec.StopContainerCmdExec;
+import com.github.dockerjava.netty.exec.TagImageCmdExec;
+import com.github.dockerjava.netty.exec.TopContainerCmdExec;
+import com.github.dockerjava.netty.exec.UnpauseContainerCmdExec;
+import com.github.dockerjava.netty.exec.UpdateContainerCmdExec;
+import com.github.dockerjava.netty.exec.VersionCmdExec;
+import com.github.dockerjava.netty.exec.WaitContainerCmdExec;
+import com.github.dockerjava.netty.exec.RenameContainerCmdExec;
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.epoll.EpollDomainSocketChannel;
+import io.netty.channel.epoll.EpollEventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.DuplexChannel;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.channel.unix.DomainSocketAddress;
+import io.netty.channel.unix.UnixChannel;
+import io.netty.handler.codec.http.HttpClientCodec;
+import io.netty.handler.logging.LoggingHandler;
+import io.netty.handler.ssl.SslHandler;
+import io.netty.util.concurrent.DefaultThreadFactory;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLParameters;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.security.Security;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Experimental implementation of {@link DockerCmdExecFactory} that supports http connection hijacking that is needed to pass STDIN to the
+ * container.
+ *
+ * To use it just pass an instance via {@link DockerClientImpl#withDockerCmdExecFactory(DockerCmdExecFactory)}
+ *
+ * @see https://docs.docker.com/engine/reference/api/docker_remote_api_v1.21/#attach-to-a-container
+ * @see https://docs.docker.com/engine/reference/api/docker_remote_api_v1.21/#exec-start
+ *
+ *
+ * @author Marcus Linke
+ */
+public class NettyDockerCmdExecFactory implements DockerCmdExecFactory {
+
+ private static String threadPrefix = "dockerjava-netty";
+
+ /*
+ * useful links:
+ *
+ * http://stackoverflow.com/questions/33296749/netty-connect-to-unix-domain-socket-failed
+ * http://netty.io/wiki/native-transports.html
+ * https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/http/snoop/HttpSnoopClient.java
+ * https://github.com/slandelle/netty-request-chunking/blob/master/src/test/java/slandelle/ChunkingTest.java
+ */
+
+ private DockerClientConfig dockerClientConfig;
+
+ private Bootstrap bootstrap;
+
+ private EventLoopGroup eventLoopGroup;
+
+ private NettyInitializer nettyInitializer;
+
+ private ChannelProvider channelProvider = new ChannelProvider() {
+ @Override
+ public DuplexChannel getChannel() {
+ DuplexChannel channel = connect();
+ channel.pipeline().addLast(new LoggingHandler(getClass()));
+ return channel;
+ }
+ };
+
+ @Override
+ public void init(DockerClientConfig dockerClientConfig) {
+ checkNotNull(dockerClientConfig, "config was not specified");
+ this.dockerClientConfig = dockerClientConfig;
+
+ bootstrap = new Bootstrap();
+
+ String scheme = dockerClientConfig.getDockerHost().getScheme();
+
+ if ("unix".equals(scheme)) {
+ nettyInitializer = new UnixDomainSocketInitializer();
+ } else if ("tcp".equals(scheme)) {
+ nettyInitializer = new InetSocketInitializer();
+ }
+
+ eventLoopGroup = nettyInitializer.init(bootstrap, dockerClientConfig);
+ }
+
+ private DuplexChannel connect() {
+ try {
+ return connect(bootstrap);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private DuplexChannel connect(final Bootstrap bootstrap) throws InterruptedException {
+ return nettyInitializer.connect(bootstrap);
+ }
+
+ private interface NettyInitializer {
+ EventLoopGroup init(final Bootstrap bootstrap, DockerClientConfig dockerClientConfig);
+
+ DuplexChannel connect(final Bootstrap bootstrap) throws InterruptedException;
+ }
+
+ private class UnixDomainSocketInitializer implements NettyInitializer {
+ @Override
+ public EventLoopGroup init(Bootstrap bootstrap, DockerClientConfig dockerClientConfig) {
+ EventLoopGroup epollEventLoopGroup = new EpollEventLoopGroup(0, new DefaultThreadFactory(threadPrefix));
+ bootstrap.group(epollEventLoopGroup).channel(EpollDomainSocketChannel.class)
+ .handler(new ChannelInitializer() {
+ @Override
+ protected void initChannel(final UnixChannel channel) throws Exception {
+ channel.pipeline().addLast(new HttpClientCodec());
+ }
+ });
+ return epollEventLoopGroup;
+ }
+
+ @Override
+ public DuplexChannel connect(Bootstrap bootstrap) throws InterruptedException {
+ return (DuplexChannel) bootstrap.connect(new DomainSocketAddress("/var/run/docker.sock")).sync().channel();
+ }
+ }
+
+ private class InetSocketInitializer implements NettyInitializer {
+ @Override
+ public EventLoopGroup init(Bootstrap bootstrap, final DockerClientConfig dockerClientConfig) {
+ EventLoopGroup nioEventLoopGroup = new NioEventLoopGroup(0, new DefaultThreadFactory(threadPrefix));
+
+ InetAddress addr = InetAddress.getLoopbackAddress();
+
+ final SocketAddress proxyAddress = new InetSocketAddress(addr, 8008);
+
+ Security.addProvider(new BouncyCastleProvider());
+
+ bootstrap.group(nioEventLoopGroup).channel(NioSocketChannel.class)
+ .handler(new ChannelInitializer() {
+ @Override
+ protected void initChannel(final SocketChannel channel) throws Exception {
+ // channel.pipeline().addLast(new
+ // HttpProxyHandler(proxyAddress));
+ channel.pipeline().addLast(new HttpClientCodec());
+ }
+ });
+
+ return nioEventLoopGroup;
+ }
+
+ @Override
+ public DuplexChannel connect(Bootstrap bootstrap) throws InterruptedException {
+ String host = dockerClientConfig.getDockerHost().getHost();
+ int port = dockerClientConfig.getDockerHost().getPort();
+
+ if (port == -1) {
+ throw new RuntimeException("no port configured for " + host);
+ }
+
+ DuplexChannel channel = (DuplexChannel) bootstrap.connect(host, port).sync().channel();
+
+ final SslHandler ssl = initSsl(dockerClientConfig);
+
+ if (ssl != null) {
+ channel.pipeline().addFirst(ssl);
+ }
+
+ return channel;
+ }
+
+ private SslHandler initSsl(DockerClientConfig dockerClientConfig) {
+ SslHandler ssl = null;
+
+ try {
+ String host = dockerClientConfig.getDockerHost().getHost();
+ int port = dockerClientConfig.getDockerHost().getPort();
+
+ final SSLConfig sslConfig = dockerClientConfig.getSSLConfig();
+
+ if (sslConfig != null && sslConfig.getSSLContext() != null) {
+
+ SSLEngine engine = sslConfig.getSSLContext().createSSLEngine(host, port);
+ engine.setUseClientMode(true);
+ engine.setSSLParameters(enableHostNameVerification(engine.getSSLParameters()));
+
+ // in the future we may use HostnameVerifier like here:
+ // https://github.com/AsyncHttpClient/async-http-client/blob/1.8.x/src/main/java/com/ning/http/client/providers/netty/NettyConnectListener.java#L76
+
+ ssl = new SslHandler(engine);
+ }
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ return ssl;
+ }
+ }
+
+ protected DockerClientConfig getDockerClientConfig() {
+ checkNotNull(dockerClientConfig,
+ "Factor not initialized, dockerClientConfig not set. You probably forgot to call init()!");
+ return dockerClientConfig;
+ }
+
+ public SSLParameters enableHostNameVerification(SSLParameters sslParameters) {
+ sslParameters.setEndpointIdentificationAlgorithm("HTTPS");
+ return sslParameters;
+ }
+
+ @Override
+ public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() {
+ return new CopyArchiveFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() {
+ return new CopyArchiveToContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public AuthCmd.Exec createAuthCmdExec() {
+ return new AuthCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InfoCmd.Exec createInfoCmdExec() {
+ return new InfoCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public PingCmd.Exec createPingCmdExec() {
+ return new PingCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public VersionCmd.Exec createVersionCmdExec() {
+ return new VersionCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public PullImageCmd.Exec createPullImageCmdExec() {
+ return new PullImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public PushImageCmd.Exec createPushImageCmdExec() {
+ return new PushImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public SaveImageCmd.Exec createSaveImageCmdExec() {
+ return new SaveImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CreateImageCmd.Exec createCreateImageCmdExec() {
+ return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public LoadImageCmd.Exec createLoadImageCmdExec() {
+ return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public SearchImagesCmd.Exec createSearchImagesCmdExec() {
+ return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RemoveImageCmd.Exec createRemoveImageCmdExec() {
+ return new RemoveImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ListImagesCmd.Exec createListImagesCmdExec() {
+ return new ListImagesCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectImageCmd.Exec createInspectImageCmdExec() {
+ return new InspectImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ListContainersCmd.Exec createListContainersCmdExec() {
+ return new ListContainersCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CreateContainerCmd.Exec createCreateContainerCmdExec() {
+ return new CreateContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public StartContainerCmd.Exec createStartContainerCmdExec() {
+ return new StartContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectContainerCmd.Exec createInspectContainerCmdExec() {
+ return new InspectContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ExecCreateCmd.Exec createExecCmdExec() {
+ return new ExecCreateCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RemoveContainerCmd.Exec createRemoveContainerCmdExec() {
+ return new RemoveContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public WaitContainerCmd.Exec createWaitContainerCmdExec() {
+ return new WaitContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public AttachContainerCmd.Exec createAttachContainerCmdExec() {
+ return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ExecStartCmd.Exec createExecStartCmdExec() {
+ return new ExecStartCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectExecCmd.Exec createInspectExecCmdExec() {
+ return new InspectExecCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public LogContainerCmd.Exec createLogContainerCmdExec() {
+ return new LogContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
+ return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public StopContainerCmd.Exec createStopContainerCmdExec() {
+ return new StopContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ContainerDiffCmd.Exec createContainerDiffCmdExec() {
+ return new ContainerDiffCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public KillContainerCmd.Exec createKillContainerCmdExec() {
+ return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public UpdateContainerCmd.Exec createUpdateContainerCmdExec() {
+ return new UpdateContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RenameContainerCmd.Exec createRenameContainerCmdExec() {
+ return new RenameContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RestartContainerCmd.Exec createRestartContainerCmdExec() {
+ return new RestartContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CommitCmd.Exec createCommitCmdExec() {
+ return new CommitCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public BuildImageCmd.Exec createBuildImageCmdExec() {
+ return new BuildImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public TopContainerCmd.Exec createTopContainerCmdExec() {
+ return new TopContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public TagImageCmd.Exec createTagImageCmdExec() {
+ return new TagImageCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public PauseContainerCmd.Exec createPauseContainerCmdExec() {
+ return new PauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
+ return new UnpauseContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public EventsCmd.Exec createEventsCmdExec() {
+ return new EventsCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public StatsCmd.Exec createStatsCmdExec() {
+ return new StatsCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CreateVolumeCmd.Exec createCreateVolumeCmdExec() {
+ return new CreateVolumeCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectVolumeCmd.Exec createInspectVolumeCmdExec() {
+ return new InspectVolumeCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() {
+ return new RemoveVolumeCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ListVolumesCmd.Exec createListVolumesCmdExec() {
+ return new ListVolumesCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ListNetworksCmd.Exec createListNetworksCmdExec() {
+ return new ListNetworksCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public InspectNetworkCmd.Exec createInspectNetworkCmdExec() {
+ return new InspectNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public CreateNetworkCmd.Exec createCreateNetworkCmdExec() {
+ return new CreateNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() {
+ return new RemoveNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() {
+ return new ConnectToNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() {
+ return new DisconnectFromNetworkCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ @Override
+ public void close() throws IOException {
+ checkNotNull(eventLoopGroup, "Factory not initialized. You probably forgot to call init()!");
+
+ eventLoopGroup.shutdownGracefully();
+ }
+
+ private WebTarget getBaseResource() {
+ return new WebTarget(channelProvider);
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java b/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java
index 44a541808..57f7aa421 100644
--- a/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java
+++ b/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java
@@ -12,6 +12,6 @@ public abstract class AbstractNettyDockerClientTest extends AbstractDockerClient
@Override
protected TestDockerCmdExecFactory initTestDockerCmdExecFactory() {
- return new TestDockerCmdExecFactory(new DockerCmdExecFactoryImpl());
+ return new TestDockerCmdExecFactory(new NettyDockerCmdExecFactory());
}
}
From e8b8519bbfb32cc1c5f3b6533b8b32fe7950103a Mon Sep 17 00:00:00 2001
From: tjlee
Date: Fri, 29 Jul 2016 17:11:02 +0300
Subject: [PATCH 073/736] [tests] Added integration tests for pause / unpause
commands (#647)
* [tests] Added integration tests for pause / unpause commands
* [tests] added missing netty tests; fixed javadoc text; fixed annotations;
---
.../core/command/PauseCmdImplTest.java | 103 +++++++++++++++
.../core/command/UnpauseCmdImplTest.java | 118 ++++++++++++++++++
.../netty/exec/PauseCmdImplTest.java | 103 +++++++++++++++
.../netty/exec/UnpauseCmdImplTest.java | 118 ++++++++++++++++++
.../dockerjava/utils/ContainerUtils.java | 70 +++++++++++
5 files changed, 512 insertions(+)
create mode 100644 src/test/java/com/github/dockerjava/core/command/PauseCmdImplTest.java
create mode 100644 src/test/java/com/github/dockerjava/core/command/UnpauseCmdImplTest.java
create mode 100644 src/test/java/com/github/dockerjava/netty/exec/PauseCmdImplTest.java
create mode 100644 src/test/java/com/github/dockerjava/netty/exec/UnpauseCmdImplTest.java
create mode 100644 src/test/java/com/github/dockerjava/utils/ContainerUtils.java
diff --git a/src/test/java/com/github/dockerjava/core/command/PauseCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PauseCmdImplTest.java
new file mode 100644
index 000000000..f100c4f89
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/core/command/PauseCmdImplTest.java
@@ -0,0 +1,103 @@
+package com.github.dockerjava.core.command;
+
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.exception.InternalServerErrorException;
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.client.AbstractDockerClientTest;
+import com.github.dockerjava.utils.ContainerUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.ITestResult;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Method;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.isEmptyString;
+import static org.hamcrest.Matchers.not;
+
+@Test(groups = {"integration", "ignoreInCircleCi"})
+public class PauseCmdImplTest extends AbstractDockerClientTest {
+
+ public static final Logger LOG = LoggerFactory.getLogger(PauseCmdImplTest.class);
+
+ @BeforeTest
+ public void beforeTest() throws Exception {
+ super.beforeTest();
+ }
+
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ }
+
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ super.afterMethod(result);
+ }
+
+ @Test
+ public void pauseRunningContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.pauseContainer(dockerClient, container);
+ }
+
+ @Test(expectedExceptions = NotFoundException.class)
+ public void pauseNonExistingContainer() {
+
+ dockerClient.pauseContainerCmd("non-existing").exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void pauseStoppedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.stopContainer(dockerClient, container);
+
+ dockerClient.pauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void pausePausedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.pauseContainer(dockerClient, container);
+
+ dockerClient.pauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void pauseCreatedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.pauseContainerCmd(container.getId()).exec();
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/core/command/UnpauseCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/UnpauseCmdImplTest.java
new file mode 100644
index 000000000..f640c4182
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/core/command/UnpauseCmdImplTest.java
@@ -0,0 +1,118 @@
+package com.github.dockerjava.core.command;
+
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.exception.InternalServerErrorException;
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.client.AbstractDockerClientTest;
+import com.github.dockerjava.utils.ContainerUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.ITestResult;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Method;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.isEmptyString;
+import static org.hamcrest.Matchers.not;
+
+@Test(groups = {"integration", "ignoreInCircleCi"})
+public class UnpauseCmdImplTest extends AbstractDockerClientTest {
+
+ public static final Logger LOG = LoggerFactory.getLogger(UnpauseCmdImplTest.class);
+
+ @BeforeTest
+ public void beforeTest() throws Exception {
+ super.beforeTest();
+ }
+
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ }
+
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ super.afterMethod(result);
+ }
+
+ @Test
+ public void unpausePausedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.pauseContainer(dockerClient, container);
+
+ ContainerUtils.unpaseContainer(dockerClient, container);
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void unpauseRunningContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void unpauseStoppedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.stopContainer(dockerClient, container);
+
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = NotFoundException.class)
+ public void unpauseNonExistingContainer() {
+
+ dockerClient.unpauseContainerCmd("non-existing").exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void unpauseCreatedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void unpauseUnpausedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.pauseContainer(dockerClient, container);
+
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/PauseCmdImplTest.java b/src/test/java/com/github/dockerjava/netty/exec/PauseCmdImplTest.java
new file mode 100644
index 000000000..612c3efd2
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/netty/exec/PauseCmdImplTest.java
@@ -0,0 +1,103 @@
+package com.github.dockerjava.netty.exec;
+
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.exception.InternalServerErrorException;
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
+import com.github.dockerjava.utils.ContainerUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.ITestResult;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Method;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.isEmptyString;
+import static org.hamcrest.Matchers.not;
+
+@Test(groups = {"integration", "ignoreInCircleCi"})
+public class PauseCmdImplTest extends AbstractNettyDockerClientTest {
+
+ public static final Logger LOG = LoggerFactory.getLogger(PauseCmdImplTest.class);
+
+ @BeforeTest
+ public void beforeTest() throws Exception {
+ super.beforeTest();
+ }
+
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ }
+
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ super.afterMethod(result);
+ }
+
+ @Test
+ public void pauseRunningContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.pauseContainer(dockerClient, container);
+ }
+
+ @Test(expectedExceptions = NotFoundException.class)
+ public void pauseNonExistingContainer() {
+
+ dockerClient.pauseContainerCmd("non-existing").exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void pauseStoppedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.stopContainer(dockerClient, container);
+
+ dockerClient.pauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void pausePausedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.pauseContainer(dockerClient, container);
+
+ dockerClient.pauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void pauseCreatedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.pauseContainerCmd(container.getId()).exec();
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/UnpauseCmdImplTest.java b/src/test/java/com/github/dockerjava/netty/exec/UnpauseCmdImplTest.java
new file mode 100644
index 000000000..db91bc9f9
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/netty/exec/UnpauseCmdImplTest.java
@@ -0,0 +1,118 @@
+package com.github.dockerjava.netty.exec;
+
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.exception.InternalServerErrorException;
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
+import com.github.dockerjava.utils.ContainerUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.ITestResult;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.lang.reflect.Method;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.isEmptyString;
+import static org.hamcrest.Matchers.not;
+
+@Test(groups = {"integration", "ignoreInCircleCi"})
+public class UnpauseCmdImplTest extends AbstractNettyDockerClientTest {
+
+ public static final Logger LOG = LoggerFactory.getLogger(UnpauseCmdImplTest.class);
+
+ @BeforeTest
+ public void beforeTest() throws Exception {
+ super.beforeTest();
+ }
+
+ @AfterTest
+ public void afterTest() {
+ super.afterTest();
+ }
+
+ @BeforeMethod
+ public void beforeMethod(Method method) {
+ super.beforeMethod(method);
+ }
+
+ @AfterMethod
+ public void afterMethod(ITestResult result) {
+ super.afterMethod(result);
+ }
+
+ @Test
+ public void unpausePausedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.pauseContainer(dockerClient, container);
+
+ ContainerUtils.unpaseContainer(dockerClient, container);
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void unpauseRunningContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void unpauseStoppedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.stopContainer(dockerClient, container);
+
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = NotFoundException.class)
+ public void unpauseNonExistingContainer() {
+
+ dockerClient.unpauseContainerCmd("non-existing").exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void unpauseCreatedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ }
+
+ @Test(expectedExceptions = InternalServerErrorException.class)
+ public void unpauseUnpausedContainer() {
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
+ LOG.info("Created container: {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ ContainerUtils.startContainer(dockerClient, container);
+
+ ContainerUtils.pauseContainer(dockerClient, container);
+
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/utils/ContainerUtils.java b/src/test/java/com/github/dockerjava/utils/ContainerUtils.java
new file mode 100644
index 000000000..75be6c4d9
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/utils/ContainerUtils.java
@@ -0,0 +1,70 @@
+package com.github.dockerjava.utils;
+
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Container cmd utils
+ */
+public class ContainerUtils {
+
+ private ContainerUtils() {
+ }
+
+ /**
+ * Starts container and ensures that it running
+ *
+ * @param dockerClient docker client
+ * @param container container
+ */
+ public static void startContainer(DockerClient dockerClient, CreateContainerResponse container) {
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse.getState().getRunning(), is(true));
+ }
+
+ /**
+ * Pauses container and ensures that it paused
+ *
+ * @param dockerClient docker client
+ * @param container container
+ */
+ public static void pauseContainer(DockerClient dockerClient, CreateContainerResponse container) {
+ dockerClient.pauseContainerCmd(container.getId()).exec();
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse.getState().getPaused(), is(true));
+ }
+
+ /**
+ * Stops container and ensures that it stopped
+ *
+ * @param dockerClient docker client
+ * @param container container
+ */
+ public static void stopContainer(DockerClient dockerClient, CreateContainerResponse container) {
+ dockerClient.stopContainerCmd(container.getId()).exec();
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse.getState().getRunning(), is(false));
+ }
+
+ /**
+ * Unpauses container and ensures that it unpaused (running)
+ *
+ * @param dockerClient docker client
+ * @param container container
+ */
+ public static void unpaseContainer(DockerClient dockerClient, CreateContainerResponse container) {
+ dockerClient.unpauseContainerCmd(container.getId()).exec();
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+ assertThat(inspectContainerResponse.getState().getPaused(), is(false));
+ assertThat(inspectContainerResponse.getState().getRunning(), is(true));
+ }
+}
From d78a1cfb3a1c3a198389c0f86c9d92caa37db8de Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 29 Jul 2016 19:58:13 +0300
Subject: [PATCH 074/736] Add 1.12.0 for tests
---
.travis.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index a8cbe29e2..a9e93162a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,7 +21,8 @@ env:
- COVERITY_SCAN_NOTIFICATION_EMAIL="kanstantsin.sha@gmail.com"
matrix:
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true CODECOV=true
+ - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.12.0-0~trusty"
+ - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.12.0-0~trusty"
- repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true COVERITY=true CODECOV=true
- repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty"
- repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.10.3-0~trusty"
From 4c663e18bf1685600d4aa032a7517ab3f0f6042f Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 1 Aug 2016 16:57:52 +0300
Subject: [PATCH 075/736] Fix test for different API behaviour. (#642)
---
.../github/dockerjava/core/RemoteApiVersion.java | 10 ++++++++++
.../netty/exec/ExecStartCmdExecTest.java | 16 +++++++++++++---
2 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
index 954ed9971..f40b5b4d5 100644
--- a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
+++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
@@ -62,6 +62,16 @@ public class RemoteApiVersion implements Serializable {
*/
public static final RemoteApiVersion VERSION_1_22 = RemoteApiVersion.create(1, 22);
+ /**
+ * @see Docker API 1.22
+ */
+ public static final RemoteApiVersion VERSION_1_23 = RemoteApiVersion.create(1, 23);
+
+ /**
+ * @see Docker API 1.22
+ */
+ public static final RemoteApiVersion VERSION_1_24 = RemoteApiVersion.create(1, 24);
+
/**
* Unknown, docker doesn't reflect reality. I.e. we implemented method, but for javadoc it not clear when it was added.
*/
diff --git a/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java
index e87c56d74..52db7fe44 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java
@@ -1,5 +1,8 @@
package com.github.dockerjava.netty.exec;
+import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_22;
+import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_23;
+import static com.github.dockerjava.utils.TestUtils.getVersion;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
@@ -12,6 +15,7 @@
import java.security.SecureRandom;
import java.util.concurrent.TimeUnit;
+import com.github.dockerjava.core.RemoteApiVersion;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
@@ -193,7 +197,8 @@ public void execStartNotAttachedStdin() throws Exception {
ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId())
.withAttachStdout(true)
.withAttachStdin(false)
- .withCmd("/bin/sh").exec();
+ .withCmd("/bin/sh")
+ .exec();
boolean completed = dockerClient.execStartCmd(execCreateCmdResponse.getId())
.withDetach(false)
@@ -201,8 +206,13 @@ public void execStartNotAttachedStdin() throws Exception {
.exec(new ExecStartResultCallback(stdout, System.err))
.awaitCompletion(5, TimeUnit.SECONDS);
- // with v1.22 of the remote api the server closed the connection when no stdin was attached while exec create, so completed was true
- assertFalse(completed, "The process was not finished.");
assertEquals(stdout.toString(), "");
+
+ if (getVersion(dockerClient).isGreaterOrEqual(VERSION_1_23)) {
+ assertFalse(completed, "The process was not finished.");
+ } else {
+ assertTrue(completed, "with v1.22 of the remote api the server closed the connection when no stdin " +
+ "was attached while exec create, so completed was true");
+ }
}
}
From 6195eb888f34293217d463bb205041d51b2602dc Mon Sep 17 00:00:00 2001
From: tjlee
Date: Mon, 1 Aug 2016 20:43:25 +0300
Subject: [PATCH 076/736] [tests] use expectedExceptions (#649)
---
.../core/command/AuthCmdImplTest.java | 9 ++-------
.../core/command/CommitCmdImplTest.java | 10 +++-------
.../command/ContainerDiffCmdImplTest.java | 10 +++-------
.../CopyArchiveFromContainerCmdImplTest.java | 9 +++------
.../CopyArchiveToContainerCmdImplTest.java | 10 +++-------
.../CopyFileFromContainerCmdImplTest.java | 9 +++------
.../command/CreateContainerCmdImplTest.java | 8 ++------
.../command/KillContainerCmdImplTest.java | 8 ++------
.../command/RemoveContainerCmdImplTest.java | 9 +++------
.../core/command/RemoveImageCmdImplTest.java | 8 ++------
.../command/RemoveNetworkCmdImplTest.java | 9 +++------
.../core/command/RemoveVolumeCmdImplTest.java | 9 ++-------
.../command/RestartContainerCmdImplTest.java | 9 ++-------
.../command/StartContainerCmdImplTest.java | 17 ++++-------------
.../command/StopContainerCmdImplTest.java | 8 ++------
.../core/command/TagImageCmdImplTest.java | 10 +++-------
.../netty/exec/CommitCmdExecTest.java | 9 +++------
.../netty/exec/ContainerDiffCmdExecTest.java | 9 +++------
.../CopyArchiveFromContainerCmdExecTest.java | 9 +++------
.../CopyArchiveToContainerCmdExecTest.java | 10 +++-------
.../CopyFileFromContainerCmdExecTest.java | 9 +++------
.../netty/exec/KillContainerCmdExecTest.java | 8 ++------
.../exec/RemoveContainerCmdExecTest.java | 9 +++------
.../netty/exec/RemoveImageCmdExecTest.java | 8 ++------
.../netty/exec/RemoveNetworkCmdExecTest.java | 9 +++------
.../netty/exec/RemoveVolumeCmdExecTest.java | 9 ++-------
.../exec/RestartContainerCmdExecTest.java | 8 ++------
.../netty/exec/StartContainerCmdExecTest.java | 19 +++++--------------
.../netty/exec/StopContainerCmdExecTest.java | 8 ++------
.../netty/exec/TagImageCmdExecTest.java | 10 +++-------
30 files changed, 81 insertions(+), 205 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java
index c01c8b8cd..887c99130 100644
--- a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java
@@ -45,14 +45,9 @@ public void testAuth() throws Exception {
}
// Disabled because of 500/InternalServerException
- @Test(enabled = false)
+ @Test(enabled = false, expectedExceptions = UnauthorizedException.class, expectedExceptionsMessageRegExp = "Wrong login/password, please try again")
public void testAuthInvalid() throws Exception {
- try {
- DockerClientBuilder.getInstance(config("garbage")).build().authCmd().exec();
- fail("Expected a UnauthorizedException caused by a bad password.");
- } catch (UnauthorizedException e) {
- assertEquals(e.getMessage(), "Wrong login/password, please try again\n");
- }
+ DockerClientBuilder.getInstance(config("garbage")).build().authCmd().exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java
index b8758d332..64e1d7ddf 100644
--- a/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java
@@ -68,13 +68,9 @@ public void commit() throws DockerException {
assertThat(inspectImageResponse.getParent(), equalTo(busyboxImg.getId()));
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void commitNonExistingContainer() throws DockerException {
- try {
- dockerClient.commitCmd("non-existent").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
- }
+ dockerClient.commitCmd("non-existent").exec();
+ }
}
diff --git a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java
index 62c7b2ec0..e51db21f4 100644
--- a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java
@@ -67,13 +67,9 @@ public void testContainerDiff() throws DockerException {
assertThat(testChangeLog, hasField("kind", equalTo(1)));
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void testContainerDiffWithNonExistingContainer() throws DockerException {
- try {
- dockerClient.containerDiffCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
- }
+ dockerClient.containerDiffCmd("non-existing").exec();
+ }
}
diff --git a/src/test/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImplTest.java
index 9b30dd891..59c459382 100644
--- a/src/test/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImplTest.java
@@ -70,13 +70,10 @@ public void copyFromContainer() throws Exception {
assertTrue(responseAsString.length() > 0);
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void copyFromNonExistingContainer() throws Exception {
- try {
- dockerClient.copyArchiveFromContainerCmd("non-existing", "/test").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException ignored) {
- }
+
+ dockerClient.copyArchiveFromContainerCmd("non-existing", "/test").exec();
}
@Test
diff --git a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java
index a1006277c..658c1f090 100644
--- a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java
@@ -83,14 +83,10 @@ private void assertFileCopied(CreateContainerResponse container) throws IOExcept
}
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void copyToNonExistingContainer() throws Exception {
- try {
- dockerClient.copyArchiveToContainerCmd("non-existing").withHostResource("src/test/resources/testReadFile")
- .exec();
- fail("expected NotFoundException");
- } catch (NotFoundException ignored) {
- }
+
+ dockerClient.copyArchiveToContainerCmd("non-existing").withHostResource("src/test/resources/testReadFile").exec();
}
@Test
diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java
index 3e4e88612..8bd2c44fe 100644
--- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java
@@ -62,12 +62,9 @@ public void copyFromContainer() throws Exception {
assertTrue(responseAsString.length() > 0);
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void copyFromNonExistingContainer() throws Exception {
- try {
- dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException ignored) {
- }
+
+ dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
index a9c0acb8c..214bb2f4a 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -231,7 +231,7 @@ public void createContainerWithHostname() throws Exception {
assertThat(containerLog(container.getId()), containsString("HOSTNAME=docker-java"));
}
- @Test
+ @Test(expectedExceptions = ConflictException.class)
public void createContainerWithName() throws DockerException {
CreateContainerResponse container = dockerClient.createContainerCmd(BUSYBOX_IMAGE).withName("container")
@@ -245,12 +245,8 @@ public void createContainerWithName() throws DockerException {
assertThat(inspectContainerResponse.getName(), equalTo("/container"));
- try {
- dockerClient.createContainerCmd(BUSYBOX_IMAGE).withName("container").withCmd("env").exec();
- fail("Expected ConflictException");
- } catch (ConflictException e) {
- }
+ dockerClient.createContainerCmd(BUSYBOX_IMAGE).withName("container").withCmd("env").exec();
}
@Test
diff --git a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java
index 3ba85928e..c8589271e 100644
--- a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java
@@ -67,14 +67,10 @@ public void killContainer() throws DockerException {
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void killNonExistingContainer() throws DockerException {
- try {
- dockerClient.killContainerCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ dockerClient.killContainerCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java
index 87ace71df..26c8e0e19 100644
--- a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java
@@ -68,13 +68,10 @@ public void removeContainer() throws DockerException {
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void removeNonExistingContainer() throws DockerException {
- try {
- dockerClient.removeContainerCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+
+ dockerClient.removeContainerCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java
index 90be81c7f..4427da997 100644
--- a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java
@@ -74,14 +74,10 @@ public void removeImage() throws DockerException, InterruptedException {
assertThat(containers, matcher);
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void removeNonExistingImage() throws DockerException, InterruptedException {
- try {
- dockerClient.removeImageCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ dockerClient.removeImageCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java
index e1e4e45fe..228e48c4d 100644
--- a/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java
@@ -64,13 +64,10 @@ public void removeNetwork() throws DockerException {
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void removeNonExistingContainer() throws DockerException {
- try {
- dockerClient.removeNetworkCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+
+ dockerClient.removeNetworkCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java
index 249bf8493..9ed690b65 100644
--- a/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java
@@ -41,7 +41,7 @@ public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void removeVolume() throws DockerException {
String volumeName = "volume1";
@@ -55,11 +55,6 @@ public void removeVolume() throws DockerException {
dockerClient.removeVolumeCmd(volumeName).exec();
- try {
- dockerClient.inspectVolumeCmd(volumeName).exec();
- fail("Expected NotFoundException");
- } catch (NotFoundException e) {
- // just ignore
- }
+ dockerClient.inspectVolumeCmd(volumeName).exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java
index 4920ac087..84916f082 100644
--- a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java
@@ -71,14 +71,9 @@ public void restartContainer() throws DockerException {
dockerClient.killContainerCmd(container.getId()).exec();
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void restartNonExistingContainer() throws DockerException, InterruptedException {
- try {
- dockerClient.restartContainerCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ dockerClient.restartContainerCmd("non-existing").exec();
}
-
}
diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
index 2b32e00c5..4bb8f2b99 100644
--- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java
@@ -251,7 +251,7 @@ public void startContainerWithRandomPortBindings() throws DockerException {
}
- @Test
+ @Test(expectedExceptions = InternalServerErrorException.class)
public void startContainerWithConflictingPortBindings() throws DockerException {
ExposedPort tcp22 = ExposedPort.tcp(22);
@@ -268,13 +268,7 @@ public void startContainerWithConflictingPortBindings() throws DockerException {
assertThat(container.getId(), not(isEmptyString()));
- try {
- dockerClient.startContainerCmd(container.getId()).exec();
- fail("expected InternalServerErrorException");
- } catch (InternalServerErrorException e) {
-
- }
-
+ dockerClient.startContainerCmd(container.getId()).exec();
}
@Test
@@ -412,13 +406,10 @@ public void startContainer() throws DockerException {
}
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void testStartNonExistingContainer() throws DockerException {
- try {
+
dockerClient.startContainerCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
}
/**
diff --git a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java
index 913ed9474..382e5b29c 100644
--- a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java
@@ -76,14 +76,10 @@ public void testStopContainer() throws DockerException {
}
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void testStopNonExistingContainer() throws DockerException {
- try {
- dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java
index 94d4291d0..3bf033212 100644
--- a/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java
@@ -49,15 +49,11 @@ public void tagImage() throws Exception {
dockerClient.removeImageCmd("docker-java/busybox:" + tag).exec();
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void tagNonExistingImage() throws Exception {
- String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE);
- try {
- dockerClient.tagImageCmd("non-existing", "docker-java/busybox", tag).exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE);
+ dockerClient.tagImageCmd("non-existing", "docker-java/busybox", tag).exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/CommitCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CommitCmdExecTest.java
index 0186f4233..3d1a66333 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/CommitCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/CommitCmdExecTest.java
@@ -68,13 +68,10 @@ public void commit() throws DockerException {
assertThat(inspectImageResponse.getParent(), equalTo(busyboxImg.getId()));
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void commitNonExistingContainer() throws DockerException {
- try {
- dockerClient.commitCmd("non-existent").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+
+ dockerClient.commitCmd("non-existent").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExecTest.java
index 57c4b46a0..c21c426b5 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExecTest.java
@@ -68,13 +68,10 @@ public void testContainerDiff() throws DockerException {
assertThat(testChangeLog, hasField("kind", equalTo(1)));
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void testContainerDiffWithNonExistingContainer() throws DockerException {
- try {
- dockerClient.containerDiffCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+
+ dockerClient.containerDiffCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java
index caec336a2..02b56156d 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java
@@ -70,13 +70,10 @@ public void copyFromContainer() throws Exception {
assertTrue(responseAsString.length() > 0);
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void copyFromNonExistingContainer() throws Exception {
- try {
- dockerClient.copyArchiveFromContainerCmd("non-existing", "/test").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException ignored) {
- }
+
+ dockerClient.copyArchiveFromContainerCmd("non-existing", "/test").exec();
}
@Test
diff --git a/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExecTest.java
index eb43b54de..d75d36ea8 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExecTest.java
@@ -84,14 +84,10 @@ private void assertFileCopied(CreateContainerResponse container) throws IOExcept
}
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void copyToNonExistingContainer() throws Exception {
- try {
- dockerClient.copyArchiveToContainerCmd("non-existing").withHostResource("src/test/resources/testReadFile")
- .exec();
- fail("expected NotFoundException");
- } catch (NotFoundException ignored) {
- }
+
+ dockerClient.copyArchiveToContainerCmd("non-existing").withHostResource("src/test/resources/testReadFile").exec();
}
@Test
diff --git a/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java
index b9682c592..b512cfa69 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java
@@ -62,12 +62,9 @@ public void copyFromContainer() throws Exception {
assertTrue(responseAsString.length() > 0);
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void copyFromNonExistingContainer() throws Exception {
- try {
- dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException ignored) {
- }
+
+ dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/KillContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/KillContainerCmdExecTest.java
index 867373e63..d354c8df3 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/KillContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/KillContainerCmdExecTest.java
@@ -67,14 +67,10 @@ public void killContainer() throws DockerException {
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void killNonExistingContainer() throws DockerException {
- try {
- dockerClient.killContainerCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ dockerClient.killContainerCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExecTest.java
index ffe456c09..1e7abebdb 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExecTest.java
@@ -69,13 +69,10 @@ public void removeContainer() throws DockerException {
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void removeNonExistingContainer() throws DockerException {
- try {
- dockerClient.removeContainerCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+
+ dockerClient.removeContainerCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java
index e2f69ac1e..857bec714 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java
@@ -74,14 +74,10 @@ public void removeImage() throws DockerException, InterruptedException {
assertThat(containers, matcher);
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void removeNonExistingImage() throws DockerException, InterruptedException {
- try {
- dockerClient.removeImageCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ dockerClient.removeImageCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java
index 9fda49f21..f8e7d26ca 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java
@@ -64,13 +64,10 @@ public void removeNetwork() throws DockerException {
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void removeNonExistingContainer() throws DockerException {
- try {
- dockerClient.removeNetworkCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+
+ dockerClient.removeNetworkCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java
index 59aafde67..d7995861c 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java
@@ -41,7 +41,7 @@ public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void removeVolume() throws DockerException {
String volumeName = "volume1";
@@ -55,11 +55,6 @@ public void removeVolume() throws DockerException {
dockerClient.removeVolumeCmd(volumeName).exec();
- try {
- dockerClient.inspectVolumeCmd(volumeName).exec();
- fail("Expected NotFoundException");
- } catch (NotFoundException e) {
- // just ignore
- }
+ dockerClient.inspectVolumeCmd(volumeName).exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/RestartContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RestartContainerCmdExecTest.java
index 3360057a8..3b1ada5c2 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/RestartContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/RestartContainerCmdExecTest.java
@@ -71,14 +71,10 @@ public void restartContainer() throws DockerException {
dockerClient.killContainerCmd(container.getId()).exec();
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void restartNonExistingContainer() throws DockerException, InterruptedException {
- try {
- dockerClient.restartContainerCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ dockerClient.restartContainerCmd("non-existing").exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java
index f4a36c2b1..eed82fcd9 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java
@@ -254,7 +254,7 @@ public void startContainerWithRandomPortBindings() throws DockerException {
}
- @Test
+ @Test(expectedExceptions = InternalServerErrorException.class)
public void startContainerWithConflictingPortBindings() throws DockerException {
ExposedPort tcp22 = ExposedPort.tcp(22);
@@ -271,13 +271,7 @@ public void startContainerWithConflictingPortBindings() throws DockerException {
assertThat(container.getId(), not(isEmptyString()));
- try {
- dockerClient.startContainerCmd(container.getId()).exec();
- fail("expected InternalServerErrorException");
- } catch (InternalServerErrorException e) {
-
- }
-
+ dockerClient.startContainerCmd(container.getId()).exec();
}
@Test
@@ -415,13 +409,10 @@ public void startContainer() throws DockerException {
}
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void testStartNonExistingContainer() throws DockerException {
- try {
- dockerClient.startContainerCmd("non-existing").exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+
+ dockerClient.startContainerCmd("non-existing").exec();
}
/**
diff --git a/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java
index b3f545a42..1dca12890 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java
@@ -76,14 +76,10 @@ public void testStopContainer() throws DockerException {
}
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void testStopNonExistingContainer() throws DockerException {
- try {
- dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/TagImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/TagImageCmdExecTest.java
index bbab169ef..6c84775ee 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/TagImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/TagImageCmdExecTest.java
@@ -49,15 +49,11 @@ public void tagImage() throws Exception {
dockerClient.removeImageCmd("docker-java/busybox:" + tag).exec();
}
- @Test
+ @Test(expectedExceptions = NotFoundException.class)
public void tagNonExistingImage() throws Exception {
- String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE);
- try {
- dockerClient.tagImageCmd("non-existing", "docker-java/busybox", tag).exec();
- fail("expected NotFoundException");
- } catch (NotFoundException e) {
- }
+ String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE);
+ dockerClient.tagImageCmd("non-existing", "docker-java/busybox", tag).exec();
}
}
From b1ed66b10c3def348091809d3ecc5234396d8190 Mon Sep 17 00:00:00 2001
From: tejksat
Date: Mon, 1 Aug 2016 20:46:47 +0300
Subject: [PATCH 077/736] Fix for #643 (#648)
* Fix for #643
.dockerignore rules handling refactored. A rule is translated to a regexp pattern and then a path is checked against it.
* Fix for #643
Failing tests on Windows fixed: Windows file separator escaped.
---
.../dockerjava/core/GoLangFileMatch.java | 305 +++++++++---------
.../core/dockerfile/Dockerfile.java | 19 +-
.../dockerjava/core/GoLangFileMatchTest.java | 22 +-
.../DockerfileAddMultipleFilesTest.java | 49 ++-
.../.dockerignore | 3 +
.../EffectiveDockerignorePatterns/Dockerfile | 3 +
.../README-secret.md | 1 +
.../EffectiveDockerignorePatterns/README.md | 0
.../.dockerignore | 3 +
.../IneffectiveDockerignorePattern/Dockerfile | 3 +
.../README-secret.md | 0
.../IneffectiveDockerignorePattern/README.md | 0
.../NestedDirsDockerignore/.dockerignore | 5 +
.../NestedDirsDockerignore/Dockerfile | 3 +
.../NestedDirsDockerignore/parent/README.md | 0
.../NestedDirsDockerignore/parent/a.txt | 0
.../parent/anotherChild/README-child.md | 0
.../anotherChild/grandChild/README-grand.md | 0
.../parent/anotherChild/grandChild/c.txt | 0
.../NestedDirsDockerignore/parent/child/b.txt | 0
20 files changed, 231 insertions(+), 185 deletions(-)
create mode 100644 src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/.dockerignore
create mode 100644 src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/Dockerfile
create mode 100644 src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/README-secret.md
create mode 100644 src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/README.md
create mode 100644 src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/.dockerignore
create mode 100644 src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/Dockerfile
create mode 100644 src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/README-secret.md
create mode 100644 src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/README.md
create mode 100644 src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/.dockerignore
create mode 100644 src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/Dockerfile
create mode 100644 src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/README.md
create mode 100644 src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/a.txt
create mode 100644 src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/anotherChild/README-child.md
create mode 100644 src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/anotherChild/grandChild/README-grand.md
create mode 100644 src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/anotherChild/grandChild/c.txt
create mode 100644 src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/child/b.txt
diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java
index fa5dba722..09d5e4978 100644
--- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java
+++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java
@@ -6,6 +6,7 @@
import java.io.File;
import java.util.ArrayList;
import java.util.List;
+import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
@@ -49,6 +50,8 @@ private GoLangFileMatch() {
public static final boolean IS_WINDOWS = File.separatorChar == '\\';
+ private static final String PATTERN_CHARS_TO_ESCAPE = "\\.[]{}()*+-?^$|";
+
public static boolean match(List patterns, File file) {
return !match(patterns, file.getPath()).isEmpty();
}
@@ -71,196 +74,194 @@ public static List match(List patterns, String name) {
}
public static boolean match(String pattern, String name) {
- Pattern: while (!pattern.isEmpty()) {
- ScanResult scanResult = scanChunk(pattern);
- pattern = scanResult.pattern;
- if (scanResult.star && StringUtils.isEmpty(scanResult.chunk)) {
- // Trailing * matches rest of string unless it has a /.
- return name.indexOf(File.separatorChar) < 0;
- }
- // Look for match at current position.
- String matchResult = matchChunk(scanResult.chunk, name);
+ return buildPattern(pattern).matcher(name).matches();
+ }
- // if we're the last chunk, make sure we've exhausted the name
- // otherwise we'll give a false result even if we could still match
- // using the star
- if (matchResult != null && (matchResult.isEmpty() || !pattern.isEmpty())) {
- name = matchResult;
- continue;
- }
- if (scanResult.star) {
- for (int i = 0; i < name.length() && name.charAt(i) != File.separatorChar; i++) {
- matchResult = matchChunk(scanResult.chunk, name.substring(i + 1));
- if (matchResult != null) {
- // if we're the last chunk, make sure we exhausted the name
- if (pattern.isEmpty() && !matchResult.isEmpty()) {
- continue;
- }
- name = matchResult;
- continue Pattern;
- }
- }
+ private static Pattern buildPattern(String pattern) {
+ StringBuilder patternStringBuilder = new StringBuilder("^");
+ while (!pattern.isEmpty()) {
+ pattern = appendChunkPattern(patternStringBuilder, pattern);
+
+ if (!pattern.isEmpty()) {
+ patternStringBuilder.append(quote(File.separatorChar));
}
- return false;
}
- return name.isEmpty();
+ patternStringBuilder.append("(").append(quote(File.separatorChar)).append(".*").append(")?");
+ return Pattern.compile(patternStringBuilder.toString());
}
- static ScanResult scanChunk(String pattern) {
- boolean star = false;
- if (!pattern.isEmpty() && pattern.charAt(0) == '*') {
- pattern = pattern.substring(1);
- star = true;
+ private static String quote(char separatorChar) {
+ if (StringUtils.contains(PATTERN_CHARS_TO_ESCAPE, separatorChar)) {
+ return "\\" + separatorChar;
+ } else {
+ return String.valueOf(separatorChar);
}
+ }
+
+ private static String appendChunkPattern(StringBuilder patternStringBuilder, String pattern) {
+ if (pattern.equals("**") || pattern.startsWith("**" + File.separator)) {
+ patternStringBuilder.append("(")
+ .append("[^").append(quote(File.separatorChar)).append("]*")
+ .append("(")
+ .append(quote(File.separatorChar)).append("[^").append(quote(File.separatorChar)).append("]*")
+ .append(")*").append(")?");
+ return pattern.substring(pattern.length() == 2 ? 2 : 3);
+ }
+
boolean inRange = false;
+ int rangeFrom = 0;
+ RangeParseState rangeParseState = RangeParseState.CHAR_EXPECTED;
+ boolean isEsc = false;
int i;
- Scan: for (i = 0; i < pattern.length(); i++) {
- switch (pattern.charAt(i)) {
- case '\\': {
- if (!IS_WINDOWS && i + 1 < pattern.length()) {
- i++;
+ for (i = 0; i < pattern.length(); i++) {
+ char c = pattern.charAt(i);
+ switch (c) {
+ case '/':
+ if (!inRange) {
+ if (!IS_WINDOWS && !isEsc) {
+ // end of chunk
+ return pattern.substring(i + 1);
+ } else {
+ patternStringBuilder.append(quote(c));
+ }
+ } else {
+ rangeParseState = nextStateAfterChar(rangeParseState);
}
+ isEsc = false;
break;
- }
- case '[':
- inRange = true;
- break;
- case ']':
- inRange = false;
- break;
- case '*':
+ case '\\':
if (!inRange) {
- break Scan;
+ if (!IS_WINDOWS) {
+ if (isEsc) {
+ patternStringBuilder.append(quote(c));
+ isEsc = false;
+ } else {
+ isEsc = true;
+ }
+ } else {
+ // end of chunk
+ return pattern.substring(i + 1);
+ }
+ } else {
+ if (IS_WINDOWS || isEsc) {
+ rangeParseState = nextStateAfterChar(rangeParseState);
+ isEsc = false;
+ } else {
+ isEsc = true;
+ }
}
- }
- }
- return new ScanResult(star, pattern.substring(0, i), pattern.substring(i));
- }
-
- static String matchChunk(String chunk, String s) {
- int chunkLength = chunk.length();
- int chunkOffset = 0;
- int sLength = s.length();
- int sOffset = 0;
- char r;
- while (chunkOffset < chunkLength) {
- if (sOffset == sLength) {
- return null;
- }
- switch (chunk.charAt(chunkOffset)) {
+ break;
case '[':
- r = s.charAt(sOffset);
- sOffset++;
- chunkOffset++;
- // We can't end right after '[', we're expecting at least
- // a closing bracket and possibly a caret.
- if (chunkOffset == chunkLength) {
- throw new GoLangFileMatchException();
- }
- // possibly negated
- boolean negated = chunk.charAt(chunkOffset) == '^';
- if (negated) {
- chunkOffset++;
+ if (!isEsc) {
+ if (inRange) {
+ //"[ is not expected, ] had not reached"
+ throw new GoLangFileMatchException();
+ }
+ rangeFrom = i;
+ rangeParseState = RangeParseState.CHAR_EXPECTED;
+ inRange = true;
+ } else {
+ if (!inRange) {
+ patternStringBuilder.append(c);
+ } else {
+ rangeParseState = nextStateAfterChar(rangeParseState);
+ }
}
- // parse all ranges
- boolean match = false;
- int nrange = 0;
- while (true) {
- if (chunkOffset < chunkLength && chunk.charAt(chunkOffset) == ']' && nrange > 0) {
- chunkOffset++;
- break;
+ isEsc = false;
+ break;
+ case ']':
+ if (!isEsc) {
+ if (!inRange) {
+ //"] is not expected, [ was not met"
+ throw new GoLangFileMatchException();
}
- GetEscResult result = getEsc(chunk, chunkOffset, chunkLength);
- char lo = result.lo;
- char hi = lo;
- chunkOffset = result.chunkOffset;
- if (chunk.charAt(chunkOffset) == '-') {
- result = getEsc(chunk, ++chunkOffset, chunkLength);
- chunkOffset = result.chunkOffset;
- hi = result.lo;
+ if (rangeParseState == RangeParseState.CHAR_EXPECTED_AFTER_DASH) {
+ // character range not finished
+ throw new GoLangFileMatchException();
}
- if (lo <= r && r <= hi) {
- match = true;
+ patternStringBuilder.append(pattern.substring(rangeFrom, i + 1));
+ inRange = false;
+ } else {
+ if (!inRange) {
+ patternStringBuilder.append(c);
+ } else {
+ rangeParseState = nextStateAfterChar(rangeParseState);
}
- nrange++;
}
- if (match == negated) {
- return null;
+ isEsc = false;
+ break;
+ case '*':
+ if (!inRange) {
+ if (!isEsc) {
+ patternStringBuilder.append("[^").append(quote(File.separatorChar)).append("]*");
+ } else {
+ patternStringBuilder.append(quote(c));
+ }
+ } else {
+ rangeParseState = nextStateAfterChar(rangeParseState);
}
+ isEsc = false;
break;
-
case '?':
- if (s.charAt(sOffset) == File.separatorChar) {
- return null;
+ if (!inRange) {
+ if (!isEsc) {
+ patternStringBuilder.append("[^").append(quote(File.separatorChar)).append("]");
+ } else {
+ patternStringBuilder.append(quote(c));
+ }
+ } else {
+ rangeParseState = nextStateAfterChar(rangeParseState);
}
- sOffset++;
- chunkOffset++;
+ isEsc = false;
break;
- case '\\':
- if (!IS_WINDOWS) {
- chunkOffset++;
- if (chunkOffset == chunkLength) {
- throw new GoLangFileMatchException();
+ case '-':
+ if (!inRange) {
+ patternStringBuilder.append(quote(c));
+ } else {
+ if (!isEsc) {
+ if (rangeParseState != RangeParseState.CHAR_OR_DASH_EXPECTED) {
+ // - not expected
+ throw new GoLangFileMatchException();
+ }
+ rangeParseState = RangeParseState.CHAR_EXPECTED_AFTER_DASH;
+ } else {
+ rangeParseState = nextStateAfterChar(rangeParseState);
}
}
- // fallthrough
+ isEsc = false;
+ break;
default:
- if (chunk.charAt(chunkOffset) != s.charAt(sOffset)) {
- return null;
+ if (!inRange) {
+ patternStringBuilder.append(quote(c));
+ } else {
+ rangeParseState = nextStateAfterChar(rangeParseState);
}
- sOffset++;
- chunkOffset++;
+ isEsc = false;
}
}
- return s.substring(sOffset);
- }
-
- static GetEscResult getEsc(String chunk, int chunkOffset, int chunkLength) {
- if (chunkOffset == chunkLength) {
+ if (isEsc) {
+ // "Escaped character missing"
throw new GoLangFileMatchException();
}
- char r = chunk.charAt(chunkOffset);
- if (r == '-' || r == ']') {
+ if (inRange) {
+ // "Character range not finished"
throw new GoLangFileMatchException();
}
- if (r == '\\' && !IS_WINDOWS) {
- chunkOffset++;
- if (chunkOffset == chunkLength) {
- throw new GoLangFileMatchException();
- }
-
- }
- r = chunk.charAt(chunkOffset);
- chunkOffset++;
- if (chunkOffset == chunkLength) {
- throw new GoLangFileMatchException();
- }
- return new GetEscResult(r, chunkOffset);
+ return "";
}
- private static final class ScanResult {
- public boolean star;
-
- public String chunk;
-
- public String pattern;
-
- ScanResult(boolean star, String chunk, String pattern) {
- this.star = star;
- this.chunk = chunk;
- this.pattern = pattern;
+ private static RangeParseState nextStateAfterChar(RangeParseState currentState) {
+ if (currentState == RangeParseState.CHAR_EXPECTED_AFTER_DASH) {
+ return RangeParseState.CHAR_EXPECTED;
+ } else {
+ return RangeParseState.CHAR_OR_DASH_EXPECTED;
}
}
- private static final class GetEscResult {
- public char lo;
-
- public int chunkOffset;
-
- GetEscResult(char lo, int chunkOffset) {
- this.lo = lo;
- this.chunkOffset = chunkOffset;
- }
+ private enum RangeParseState {
+ CHAR_EXPECTED,
+ CHAR_OR_DASH_EXPECTED,
+ CHAR_EXPECTED_AFTER_DASH
}
}
diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java
index c970d6c2d..9dcd20199 100644
--- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java
+++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java
@@ -204,9 +204,10 @@ private List matchingIgnorePatterns(String fileName) {
int lineNumber = 0;
for (String pattern : ignores) {
+ String goLangPattern = pattern.startsWith("!") ? pattern.substring(1) : pattern;
lineNumber++;
try {
- if (GoLangFileMatch.match(pattern, fileName)) {
+ if (GoLangFileMatch.match(goLangPattern, fileName)) {
matches.add(pattern);
}
} catch (GoLangFileMatchException e) {
@@ -233,21 +234,7 @@ private String effectiveMatchingIgnorePattern(File file) {
String lastMatchingPattern = matchingPattern.get(matchingPattern.size() - 1);
- int lastMatchingPatternIndex = ignores.lastIndexOf(lastMatchingPattern);
-
- if (lastMatchingPatternIndex == ignores.size() - 1) {
- return lastMatchingPattern;
- }
-
- List remainingIgnorePattern = ignores.subList(lastMatchingPatternIndex + 1, ignores.size());
-
- for (String ignorePattern : remainingIgnorePattern) {
- if (ignorePattern.equals("!" + relativeFilename)) {
- return null;
- }
- }
-
- return lastMatchingPattern;
+ return !lastMatchingPattern.startsWith("!") ? lastMatchingPattern : null;
}
}
}
diff --git a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java
index 0fd870194..62b342595 100644
--- a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java
+++ b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java
@@ -5,13 +5,14 @@
import java.io.IOException;
-import com.github.dockerjava.core.exception.GoLangFileMatchException;
-import junit.framework.Assert;
-
import org.apache.commons.io.FilenameUtils;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
+import com.github.dockerjava.core.exception.GoLangFileMatchException;
+
+import junit.framework.Assert;
+
public class GoLangFileMatchTest {
@Test(dataProvider = "getTestData")
@@ -31,7 +32,7 @@ public void testMatch(MatchTestCase testCase) throws IOException {
if (testCase.expectException) {
Assert.fail("Expected GoFileMatchException");
}
- Assert.assertEquals(testCase.matches, matched);
+ Assert.assertEquals(testCase.toString(), testCase.matches, matched);
} catch (GoLangFileMatchException e) {
if (!testCase.expectException) {
throw e;
@@ -41,12 +42,13 @@ public void testMatch(MatchTestCase testCase) throws IOException {
@DataProvider
public Object[][] getTestData() {
- return new Object[][] {new Object[] {new MatchTestCase("abc", "abc", true, false)},
+ return new Object[][] {new Object[] {new MatchTestCase("", "abc", false, false)},
+ new Object[] {new MatchTestCase("abc", "abc", true, false)},
new Object[] {new MatchTestCase("*", "abc", true, false)},
new Object[] {new MatchTestCase("*c", "abc", true, false)},
new Object[] {new MatchTestCase("a*", "a", true, false)},
new Object[] {new MatchTestCase("a*", "abc", true, false)},
- new Object[] {new MatchTestCase("a*", "ab/c", false, false)},
+ new Object[] {new MatchTestCase("a*", "ab/c", true, false)},
new Object[] {new MatchTestCase("a*/b", "abc/b", true, false)},
new Object[] {new MatchTestCase("a*/b", "a/c/b", false, false)},
new Object[] {new MatchTestCase("a*b*c*d*e*/f", "axbxcxdxe/f", true, false)},
@@ -92,9 +94,13 @@ public Object[][] getTestData() {
new Object[] {new MatchTestCase("[", "a", false, true)},
new Object[] {new MatchTestCase("[^", "a", false, true)},
new Object[] {new MatchTestCase("[^bc", "a", false, true)},
- new Object[] {new MatchTestCase("a[", "a", false, false)},
+ new Object[] {new MatchTestCase("a[", "a", false, true)},
new Object[] {new MatchTestCase("a[", "ab", false, true)},
- new Object[] {new MatchTestCase("*x", "xxx", true, false)}};
+ new Object[] {new MatchTestCase("*x", "xxx", true, false)},
+ new Object[] {new MatchTestCase("a", "a/b/c", true, false)},
+ new Object[] {new MatchTestCase("*/b", "a/b/c", true, false)},
+ new Object[] {new MatchTestCase("**/b/*/d", "a/b/c/d", true, false)},
+ new Object[] {new MatchTestCase("**/c", "a/b/c", true, false)}};
}
private final class MatchTestCase {
diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java
index 164246957..b37754a6a 100644
--- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java
+++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java
@@ -1,20 +1,20 @@
package com.github.dockerjava.core.dockerfile;
-import com.google.common.base.Function;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
+import static com.google.common.collect.Collections2.transform;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsInAnyOrder;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
-import static com.google.common.collect.Collections2.transform;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsInAnyOrder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Test;
-public class DockerfileAddMultipleFilesTest {
+import com.google.common.base.Function;
+
+public class DockerfileAddMultipleFilesTest {
private static final Logger log = LoggerFactory.getLogger(DockerfileAddMultipleFilesTest.class);
@@ -25,6 +25,37 @@ public String apply(File file) {
}
};
+ @Test
+ public void nestedDirsPatterns() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/NestedDirsDockerignore");
+ Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"), baseDir);
+ Dockerfile.ScannedResult result = dockerfile.parse();
+ Collection filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES);
+
+ assertThat(filesToAdd,
+ containsInAnyOrder("Dockerfile", ".dockerignore", "README.md", "README-grand.md", "b.txt"));
+ }
+
+ @Test
+ public void effectiveIgnorePatterns() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/EffectiveDockerignorePatterns");
+ Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"), baseDir);
+ Dockerfile.ScannedResult result = dockerfile.parse();
+ Collection filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES);
+
+ assertThat(filesToAdd, containsInAnyOrder("Dockerfile", ".dockerignore", "README.md"));
+ }
+
+ @Test
+ public void ineffectiveIgnorePattern() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerignore/IneffectiveDockerignorePattern");
+ Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"), baseDir);
+ Dockerfile.ScannedResult result = dockerfile.parse();
+ Collection filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES);
+
+ assertThat(filesToAdd, containsInAnyOrder("Dockerfile", ".dockerignore", "README.md", "README-secret.md"));
+ }
+
@Test
public void addFiles() throws IOException {
File baseDir = fileFromBuildTestResource("ADD/files");
diff --git a/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/.dockerignore b/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/.dockerignore
new file mode 100644
index 000000000..f22e777b8
--- /dev/null
+++ b/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/.dockerignore
@@ -0,0 +1,3 @@
+*.md
+!README*.md
+README-secret.md
\ No newline at end of file
diff --git a/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/Dockerfile b/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/Dockerfile
new file mode 100644
index 000000000..65fa210c7
--- /dev/null
+++ b/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/Dockerfile
@@ -0,0 +1,3 @@
+FROM ubuntu:latest
+
+CMD ["echo", "Success"]
diff --git a/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/README-secret.md b/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/README-secret.md
new file mode 100644
index 000000000..64237b5a7
--- /dev/null
+++ b/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/README-secret.md
@@ -0,0 +1 @@
+No markdown files are included in the context except README files other than README-secret.md.
\ No newline at end of file
diff --git a/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/README.md b/src/test/resources/buildTests/dockerignore/EffectiveDockerignorePatterns/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/.dockerignore b/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/.dockerignore
new file mode 100644
index 000000000..f1a1f3799
--- /dev/null
+++ b/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/.dockerignore
@@ -0,0 +1,3 @@
+*.md
+README-secret.md
+!README*.md
diff --git a/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/Dockerfile b/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/Dockerfile
new file mode 100644
index 000000000..65fa210c7
--- /dev/null
+++ b/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/Dockerfile
@@ -0,0 +1,3 @@
+FROM ubuntu:latest
+
+CMD ["echo", "Success"]
diff --git a/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/README-secret.md b/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/README-secret.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/README.md b/src/test/resources/buildTests/dockerignore/IneffectiveDockerignorePattern/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/.dockerignore b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/.dockerignore
new file mode 100644
index 000000000..d32df2a06
--- /dev/null
+++ b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/.dockerignore
@@ -0,0 +1,5 @@
+**/*.txt
+parent/*/grandChild/README*.md
+parent/anotherChild/README*.md
+!parent/anotherChild/*/*.md
+!parent/child
\ No newline at end of file
diff --git a/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/Dockerfile b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/Dockerfile
new file mode 100644
index 000000000..65fa210c7
--- /dev/null
+++ b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/Dockerfile
@@ -0,0 +1,3 @@
+FROM ubuntu:latest
+
+CMD ["echo", "Success"]
diff --git a/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/README.md b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/a.txt b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/a.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/anotherChild/README-child.md b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/anotherChild/README-child.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/anotherChild/grandChild/README-grand.md b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/anotherChild/grandChild/README-grand.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/anotherChild/grandChild/c.txt b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/anotherChild/grandChild/c.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/child/b.txt b/src/test/resources/buildTests/dockerignore/NestedDirsDockerignore/parent/child/b.txt
new file mode 100644
index 000000000..e69de29bb
From 5cf12cfbeec2b38f96915563e725d6e659fc025c Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 1 Aug 2016 20:50:45 +0300
Subject: [PATCH 078/736] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4d28a9319..c8bf1d3c5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,8 @@ Change Log
---
All changes
+* Updated all dependencies
+* [#643] (https://github.com/docker-java/docker-java/pull/643) Fixes for .dockerignore filtering
* [#627] (https://github.com/docker-java/docker-java/pull/627) Implementation of POST /images/load endpoint
* [#630] (https://github.com/docker-java/docker-java/pull/630) Fix: Second execution of a docker command in Netty implementation always fails
* [#596] (https://github.com/docker-java/docker-java/pull/596) Refactor configuration of SSL to allow override with custom config
From 1221eddda9a382734eb5bd25967a079fb2d20794 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 1 Aug 2016 23:02:31 +0300
Subject: [PATCH 079/736] Relax checkstyle
---
src/test/resources/checkstyle/checkstyle-config.xml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml
index 33508c723..76671ded3 100644
--- a/src/test/resources/checkstyle/checkstyle-config.xml
+++ b/src/test/resources/checkstyle/checkstyle-config.xml
@@ -92,7 +92,9 @@
-
+
+
+
From 6d8476e494280e122e4f2ef9b043d5870d28286f Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 1 Aug 2016 23:03:43 +0300
Subject: [PATCH 080/736] Document debug case (#641)
* Document debug case
---
docs/devel.adoc | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/docs/devel.adoc b/docs/devel.adoc
index 50c6a7279..2305b89d0 100644
--- a/docs/devel.adoc
+++ b/docs/devel.adoc
@@ -23,3 +23,11 @@
* Integration tests for commands.
* If model object has builders, then fill it with data and compare by `equals()` with expected response
from docker daemon. If failed, then some fields mappings are wrong.
+
+### Debug
+ * When there are unreproducible Travis errors:
+ ** Try locally run test 10-20 times in IDE against the same docker daemon version and same connection type (tcp or socket).
+ ** Limit `.travis.yml` to single run (to not consume their resources with matrix run).
+ ** Remove `travis-logback.xml` replacement (build can't output everything in every run because travis has log limitation).
+ ** Set single test in `pom.xml` `for maven-failsafe-plugin`
+ ** Make PR or if you are maintainer push to branch, catch log and fix.
From 227ca791733c73f2f7a413a1997c692931b37f85 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 1 Aug 2016 23:20:34 +0300
Subject: [PATCH 081/736] Disable java8 doc lint
---
pom.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/pom.xml b/pom.xml
index 1d4328f9b..39695185b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -352,6 +352,9 @@
jar
+
+ -Xdoclint:none
+
From 0d9c3c3a70050557a9989e49f5fc1c777a08d625 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 1 Aug 2016 23:25:48 +0300
Subject: [PATCH 082/736] [maven-release-plugin] prepare release 3.0.1
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 39695185b..337dae2ed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.1-SNAPSHOT
+ 3.0.1docker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ 3.0.1
From 4bd03a7e6162e2ef72c5365df1ea6d57f246688f Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 1 Aug 2016 23:25:56 +0300
Subject: [PATCH 083/736] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 337dae2ed..d8db16134 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.1
+ 3.0.2-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- 3.0.1
+ HEAD
From fa3310dd02466b211c6d8256198b98533a1edb8a Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 1 Aug 2016 23:46:54 +0300
Subject: [PATCH 084/736] Update for release
---
README.md | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/README.md b/README.md
index 159108dd8..1ec338523 100644
--- a/README.md
+++ b/README.md
@@ -21,8 +21,8 @@ Developer forum for [docker-java](https://groups.google.com/forum/?#!forum/docke
###### Prerequisites:
-* Java 1.7
-* Maven 3.0.5
+* Java min 1.7
+* Maven 3
Build and run integration tests as follows:
@@ -47,26 +47,26 @@ For secure tls (https) communication:
DOCKER_HOST=tcp://127.0.0.1:2376
DOCKER_TLS_VERIFY=1
- DOCKER_CERT_PATH=/Users/marcus/.docker/machine/machines/docker-1.10.2
+ DOCKER_CERT_PATH=/Users/marcus/.docker/machine/machines/docker-1.11.2
### Latest release version
-Supports a subset of the Docker Remote API [v1.22](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.22.md), Docker Server version 1.10.x
+Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.23.md), Docker Server version 1.11.x
com.github.docker-javadocker-java
- 3.0.0
+ 3.0.1
### Latest development version
-Supports a subset of the Docker Remote API [v1.22](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.22.md), Docker Server version 1.10.x
+Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.23.md), Docker Server version 1.11.x
You can find the latest development version including javadoc and source files on [Sonatypes OSS repository](https://oss.sonatype.org/content/groups/public/com/github/docker-java/docker-java/).
com.github.docker-javadocker-java
- 3.0.1-SNAPSHOT
+ 3.0.2-SNAPSHOT
@@ -82,7 +82,7 @@ There are a couple of configuration items, all of which have sensible defaults:
* `DOCKER_TLS_VERIFY` enable/disable TLS verification (switch between `http` and `https` protocol)
* `DOCKER_CERT_PATH` Path to the certificates needed for TLS verification
* `DOCKER_CONFIG` Path for additional docker configuration files (like `.dockercfg`)
-* `api.version` The API version, e.g. `1.21`.
+* `api.version` The API version, e.g. `1.23`.
* `registry.url` Your registry's address.
* `registry.username` Your registry username (required to push containers).
* `registry.password` Your registry password.
@@ -98,7 +98,7 @@ In your application, e.g.
.withDockerTlsVerify(true)
.withDockerCertPath("/home/user/.docker/certs")
.withDockerConfig("/home/user/.docker")
- .withApiVersion("1.21")
+ .withApiVersion("1.23")
.withRegistryUrl("https://index.docker.io/v1/")
.withRegistryUsername("dockeruser")
.withRegistryPassword("ilovedocker")
@@ -112,7 +112,7 @@ In your application, e.g.
DOCKER_TLS_VERIFY=1
DOCKER_CERT_PATH=/home/user/.docker/certs
DOCKER_CONFIG=/home/user/.docker
- api.version=1.21
+ api.version=1.23
registry.url=https://index.docker.io/v1/
registry.username=dockeruser
registry.password=ilovedocker
From c2e4f2c54fdd136ee9c800a38bce4c160b7d5582 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Tue, 2 Aug 2016 01:36:09 +0300
Subject: [PATCH 085/736] Include integration tests (#652)
---
pom.xml | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index d8db16134..2e0523feb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -508,13 +508,28 @@
prepare-agent
+
- report
+ post-unit-testtestreport
+
+
+ pre-integration-test
+ pre-integration-test
+
+ prepare-agent-integration
+
+
+
+ report-integration
+
+ report-integration
+
+
From da6b013dbc169caafad565fe244356981887d27b Mon Sep 17 00:00:00 2001
From: Alexander Koshevoy
Date: Tue, 2 Aug 2016 15:37:58 +0300
Subject: [PATCH 086/736] Fix checkstyle of GoLangFileMatch
---
.../dockerjava/core/GoLangFileMatch.java | 18 ++++++------------
.../exception/GoLangFileMatchException.java | 3 +++
2 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java
index 09d5e4978..b26b7db44 100644
--- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java
+++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java
@@ -154,8 +154,7 @@ private static String appendChunkPattern(StringBuilder patternStringBuilder, Str
case '[':
if (!isEsc) {
if (inRange) {
- //"[ is not expected, ] had not reached"
- throw new GoLangFileMatchException();
+ throw new GoLangFileMatchException("[ not expected, closing bracket ] not yet reached");
}
rangeFrom = i;
rangeParseState = RangeParseState.CHAR_EXPECTED;
@@ -172,12 +171,10 @@ private static String appendChunkPattern(StringBuilder patternStringBuilder, Str
case ']':
if (!isEsc) {
if (!inRange) {
- //"] is not expected, [ was not met"
- throw new GoLangFileMatchException();
+ throw new GoLangFileMatchException("] is not expected, [ was not met");
}
if (rangeParseState == RangeParseState.CHAR_EXPECTED_AFTER_DASH) {
- // character range not finished
- throw new GoLangFileMatchException();
+ throw new GoLangFileMatchException("Character range not finished");
}
patternStringBuilder.append(pattern.substring(rangeFrom, i + 1));
inRange = false;
@@ -220,8 +217,7 @@ private static String appendChunkPattern(StringBuilder patternStringBuilder, Str
} else {
if (!isEsc) {
if (rangeParseState != RangeParseState.CHAR_OR_DASH_EXPECTED) {
- // - not expected
- throw new GoLangFileMatchException();
+ throw new GoLangFileMatchException("- character not expected");
}
rangeParseState = RangeParseState.CHAR_EXPECTED_AFTER_DASH;
} else {
@@ -240,12 +236,10 @@ private static String appendChunkPattern(StringBuilder patternStringBuilder, Str
}
}
if (isEsc) {
- // "Escaped character missing"
- throw new GoLangFileMatchException();
+ throw new GoLangFileMatchException("Escaped character missing");
}
if (inRange) {
- // "Character range not finished"
- throw new GoLangFileMatchException();
+ throw new GoLangFileMatchException("Character range not finished");
}
return "";
}
diff --git a/src/main/java/com/github/dockerjava/core/exception/GoLangFileMatchException.java b/src/main/java/com/github/dockerjava/core/exception/GoLangFileMatchException.java
index 3bbdc2a72..2d92389e7 100644
--- a/src/main/java/com/github/dockerjava/core/exception/GoLangFileMatchException.java
+++ b/src/main/java/com/github/dockerjava/core/exception/GoLangFileMatchException.java
@@ -7,4 +7,7 @@ public class GoLangFileMatchException extends IllegalArgumentException {
private static final long serialVersionUID = -1204971075600864898L;
+ public GoLangFileMatchException(String s) {
+ super(s);
+ }
}
From b87e0d668a2dfd233fd4178cd6f4a1ae3ec6b9cf Mon Sep 17 00:00:00 2001
From: monksy
Date: Tue, 2 Aug 2016 14:29:08 -0500
Subject: [PATCH 087/736] Fixed a bad implimentation reference
DockerClientConfig is an interface and does not have a method called: DockerClientConfig.createDefaultConfigBuilder().
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 1ec338523..feddb82a2 100644
--- a/README.md
+++ b/README.md
@@ -93,7 +93,7 @@ There are three ways to configure, in descending order of precedence:
#### Programmatic:
In your application, e.g.
- DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder()
+ DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost("tcp://my-docker-host.tld:2376")
.withDockerTlsVerify(true)
.withDockerCertPath("/home/user/.docker/certs")
From fd421d800e735efe3e860999e564f54d45219bcd Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 3 Aug 2016 03:13:53 +0300
Subject: [PATCH 088/736] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index feddb82a2..da474ff85 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
-[]()
+[]()
+[](https://bintray.com/kostyasha/maven/com.github.docker-java%3Adocker-java/_latestVersion)
[](https://www.versioneye.com/java/com.github.docker-java:docker-java/references)
[](https://travis-ci.org/docker-java/docker-java)
[](https://scan.coverity.com/projects/9177)
From f355e6e756589804cd683e0da279435066a2dc61 Mon Sep 17 00:00:00 2001
From: Pavel Eremeev
Date: Thu, 11 Aug 2016 01:31:06 +0300
Subject: [PATCH 089/736] Ability to set container shm size (#659)
* Added setShmSize option to 'create container' command
* Changed shmSize type to Long
* Exposed hostConfig
---
.../api/command/CreateContainerCmd.java | 6 ++++++
.../dockerjava/api/model/HostConfig.java | 6 +++---
.../core/command/CreateContainerCmdImpl.java | 11 +++++++++++
.../command/CreateContainerCmdImplTest.java | 18 ++++++++++++++++++
.../netty/exec/CreateContainerCmdExecTest.java | 18 ++++++++++++++++++
5 files changed, 56 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
index 196763560..77bf100ac 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -6,6 +6,7 @@
import com.github.dockerjava.api.model.Capability;
import com.github.dockerjava.api.model.Device;
import com.github.dockerjava.api.model.ExposedPort;
+import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Link;
import com.github.dockerjava.api.model.LogConfig;
import com.github.dockerjava.api.model.LxcConf;
@@ -187,6 +188,9 @@ public interface CreateContainerCmd extends SyncDockerCmd securityOpts) {
/**
* @see #shmSize
*/
- public HostConfig withShmSize(String shmSize) {
+ public HostConfig withShmSize(Long shmSize) {
this.shmSize = shmSize;
return this;
}
diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
index 0b6944b04..f3cfefa05 100644
--- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java
@@ -472,6 +472,11 @@ public String getPidMode() {
return hostConfig.getPidMode();
}
+ @Override
+ public HostConfig getHostConfig() {
+ return hostConfig;
+ }
+
@Override
public String getCgroupParent() {
return hostConfig.getCgroupParent();
@@ -976,6 +981,12 @@ public CreateContainerCmd withPidMode(String pidMode) {
return this;
}
+ @Override
+ public CreateContainerCmd withHostConfig(HostConfig hostConfig) {
+ this.hostConfig = hostConfig;
+ return this;
+ }
+
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
index 214bb2f4a..7babafc91 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -10,6 +10,7 @@
import com.github.dockerjava.api.model.Device;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Link;
import com.github.dockerjava.api.model.LogConfig;
import com.github.dockerjava.api.model.Network;
@@ -21,6 +22,7 @@
import com.github.dockerjava.api.model.Ports.Binding;
import com.github.dockerjava.client.AbstractDockerClientTest;
+import org.apache.commons.io.FileUtils;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
@@ -735,4 +737,20 @@ public void createContainerWithCgroupParent() throws DockerException {
assertThat(inspectContainer.getHostConfig().getCgroupParent(), is("/parent"));
}
+
+ @SuppressWarnings("Duplicates")
+ @Test
+ public void createContainerWithShmSize() throws DockerException {
+ HostConfig hostConfig = new HostConfig().withShmSize(96 * FileUtils.ONE_MB);
+ CreateContainerResponse container = dockerClient.createContainerCmd(BUSYBOX_IMAGE)
+ .withHostConfig(hostConfig).withCmd("true").exec();
+
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ assertEquals(inspectContainerResponse.getHostConfig().getShmSize(), hostConfig.getShmSize());
+ }
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java
index ec35f930a..2213ca7b7 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java
@@ -9,6 +9,7 @@
import com.github.dockerjava.api.model.ContainerNetwork;
import com.github.dockerjava.api.model.Device;
import com.github.dockerjava.api.model.ExposedPort;
+import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Link;
import com.github.dockerjava.api.model.LogConfig;
import com.github.dockerjava.api.model.Network;
@@ -20,6 +21,7 @@
import com.github.dockerjava.api.model.VolumesFrom;
import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
+import org.apache.commons.io.FileUtils;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
@@ -676,4 +678,20 @@ public void createContainerWithCgroupParent() throws DockerException {
assertThat(inspectContainer.getHostConfig().getCgroupParent(), is("/parent"));
}
+
+ @SuppressWarnings("Duplicates")
+ @Test
+ public void createContainerWithShmSize() throws DockerException {
+ HostConfig hostConfig = new HostConfig().withShmSize(96 * FileUtils.ONE_MB);
+ CreateContainerResponse container = dockerClient.createContainerCmd(BUSYBOX_IMAGE)
+ .withHostConfig(hostConfig).withCmd("true").exec();
+
+ LOG.info("Created container {}", container.toString());
+
+ assertThat(container.getId(), not(isEmptyString()));
+
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
+
+ assertEquals(inspectContainerResponse.getHostConfig().getShmSize(), hostConfig.getShmSize());
+ }
}
From 5893681e3969507afa4915ccab5636ee6c18f5b0 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 11 Aug 2016 11:25:29 +0300
Subject: [PATCH 090/736] [maven-release-plugin] prepare release 3.0.2
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 2e0523feb..0dfef8ca9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.2-SNAPSHOT
+ 3.0.2docker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ 3.0.2
From 701aa0b25bf2c0ad0f3ec0096e287b1c6660a0c5 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 11 Aug 2016 11:25:35 +0300
Subject: [PATCH 091/736] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 0dfef8ca9..208d52705 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.2
+ 3.0.3-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- 3.0.2
+ HEAD
From ee76c14d3b9340a3e1c0ed83d530a58afe424aa4 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 11 Aug 2016 11:38:33 +0300
Subject: [PATCH 092/736] Update CHANGELOG.md
---
CHANGELOG.md | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c8bf1d3c5..132f3c6b1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,15 @@
Change Log
===
-3.0.1-SNAPSHOT
----
+## 3.0.3-SNAPSHOT
+
+
+## 3.0.2
+ * Enhanced Dockerignore filtering.
+ * Added shmsize for hostconfig.
+ * Exposed HostConfig instead of spaghetty calls.
+
+## 3.0.1
All changes
* Updated all dependencies
From e8f82e829befe25e6f45a4f8363c09a4af776a46 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sun, 14 Aug 2016 16:36:33 +0300
Subject: [PATCH 093/736] Update .travis.yml (#654)
---
.travis.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index a9e93162a..ba8c62ad0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,12 +21,12 @@ env:
- COVERITY_SCAN_NOTIFICATION_EMAIL="kanstantsin.sha@gmail.com"
matrix:
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.12.0-0~trusty"
- - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.12.0-0~trusty"
+ - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.12.0-0~trusty" CODECOV=true
+ - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.12.0-0~trusty" CODECOV=true
- repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true COVERITY=true CODECOV=true
- - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty"
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.10.3-0~trusty"
- - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.10.3-0~trusty"
+ - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty" CODECOV=true
+ - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.10.3-0~trusty" CODECOV=true
+ - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.10.3-0~trusty" CODECOV=true
# - repo="testing" DOCKER_HOST="tcp://127.0.0.1:2375"
# - repo="testing" DOCKER_HOST="unix:///var/run/docker.sock"
# - repo="experimental" DOCKER_HOST="tcp://127.0.0.1:2375"
From 7af8f8f4eacb13bd4de09dfaf14b8dffc63d733c Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sun, 14 Aug 2016 17:06:05 +0300
Subject: [PATCH 094/736] Fix body request for jersey.
---
.../github/dockerjava/jaxrs/StartContainerCmdExec.java | 10 +++++-----
.../dockerjava/netty/exec/StartContainerCmdExec.java | 4 +++-
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java
index 0f75c4f2f..2851a26c7 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java
@@ -1,7 +1,5 @@
package com.github.dockerjava.jaxrs;
-import static javax.ws.rs.client.Entity.entity;
-
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
@@ -22,11 +20,13 @@ public StartContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerCl
@Override
protected Void execute(StartContainerCmd command) {
- WebTarget webResource = getBaseResource().path("/containers/{id}/start").resolveTemplate("id",
- command.getContainerId());
+ WebTarget webResource = getBaseResource().path("/containers/{id}/start")
+ .resolveTemplate("id", command.getContainerId());
LOGGER.trace("POST: {}", webResource);
- webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON))
+ webResource.request()
+ .accept(MediaType.APPLICATION_JSON)
+ .post(null)
.close();
return null;
diff --git a/src/main/java/com/github/dockerjava/netty/exec/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/StartContainerCmdExec.java
index 12f2d8cbc..039006f2d 100644
--- a/src/main/java/com/github/dockerjava/netty/exec/StartContainerCmdExec.java
+++ b/src/main/java/com/github/dockerjava/netty/exec/StartContainerCmdExec.java
@@ -23,7 +23,9 @@ protected Void execute(StartContainerCmd command) {
command.getContainerId());
LOGGER.trace("POST: {}", webResource);
- webResource.request().accept(MediaType.APPLICATION_JSON).post(command);
+ webResource.request()
+ .accept(MediaType.APPLICATION_JSON)
+ .post(command);
return null;
}
From 8a3108fbb5cd844fff8e7eaef4bf509fe8299227 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sun, 14 Aug 2016 17:29:57 +0300
Subject: [PATCH 095/736] Fix integration tests
---
.../get-docker-com.sh | 2 +-
.travis/travis-before-install.sh | 53 +++++++++++++++++--
2 files changed, 49 insertions(+), 6 deletions(-)
rename get-docker-com.sh => .travis/get-docker-com.sh (99%)
diff --git a/get-docker-com.sh b/.travis/get-docker-com.sh
similarity index 99%
rename from get-docker-com.sh
rename to .travis/get-docker-com.sh
index 66ca4aefc..d9c0142a2 100755
--- a/get-docker-com.sh
+++ b/.travis/get-docker-com.sh
@@ -310,4 +310,4 @@ do_install() {
# wrapped up in a function so that we have some protection against only getting
# half the file during "curl | sh"
-do_install
\ No newline at end of file
+do_install
diff --git a/.travis/travis-before-install.sh b/.travis/travis-before-install.sh
index 13034fc74..6935f7a7d 100755
--- a/.travis/travis-before-install.sh
+++ b/.travis/travis-before-install.sh
@@ -3,6 +3,7 @@
sudo apt-get install -y -q ca-certificates
+export HOST_PORT=2375
echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
@@ -21,7 +22,10 @@ sudo -E apt-get install -q -y wget
sudo -E apt-get -q -y --purge remove docker-engine
sudo -E apt-cache policy docker-engine
-./get-docker-com.sh
+./.travis/get-docker-com.sh
+
+sudo -E stop docker
+
#mkdir "${HOME}/.cache" || :
#pushd "${HOME}/.cache"
# wget -N "https://apt.dockerproject.org/repo/pool/main/d/docker-engine/docker-engine_${DOCKER_VERSION}_amd64.deb"
@@ -31,10 +35,49 @@ sudo -E apt-cache policy docker-engine
#rm -f "src/test/resources/logback.xml"
mv "src/test/resources/travis-logback.xml" "src/test/resources/logback.xml"
-echo 'DOCKER_OPTS="-H=unix:///var/run/docker.sock -H=tcp://127.0.0.1:2375"' | sudo tee -a /etc/default/docker
-sudo -E restart docker
-sleep 10
-docker version
+# https://github.com/docker/docker/issues/18113
+sudo rm /var/lib/docker/network/files/local-kv.db
+
+sudo cat /etc/default/docker
+
+cat << EOF | sudo tee /etc/default/docker
+DOCKER_OPTS="\
+--dns 8.8.8.8 \
+--dns 8.8.4.4 \
+-D \
+-H=unix:///var/run/docker.sock \
+-H=tcp://0.0.0.0:${HOST_PORT} \
+"
+EOF
+
+sudo cat /etc/default/docker
+sudo bash -c ':> /var/log/upstart/docker.log'
+
+date
+sudo -E start docker
+
+tries=20
+sleep=5
+for i in $(seq 1 $tries); do
+ if sudo grep "API listen on" /var/log/upstart/docker.log ; then
+ echo "Docker started. Delay $(($i * $sleep))"
+ break
+ elif [[ $i -ge $tries ]]; then
+ echo "Docker didn't start. Exiting!"
+ sudo cat /var/log/upstart/docker.log
+ exit 1
+ else
+ echo "Docker didn't start, sleeping for 5 secs..."
+ sleep $sleep
+ fi
+done
+
+
+sudo ss -antpl
+
+curl -V
+
+docker version || sudo cat /var/log/upstart/docker.log
docker info
set +u
From 699080417ae678d77da5b46ef39a36810d620329 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sun, 14 Aug 2016 21:30:49 +0300
Subject: [PATCH 096/736] Fix network test.
---
.../command/ConnectToNetworkCmdImplTest.java | 40 ++++++++++++------
.../exec/ConnectToNetworkCmdExecTest.java | 41 +++++++++++++------
2 files changed, 57 insertions(+), 24 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java
index 84bb59a81..207d2a0d5 100644
--- a/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java
@@ -3,6 +3,7 @@
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.CreateNetworkResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.exception.DockerException;
import com.github.dockerjava.api.model.ContainerNetwork;
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.client.AbstractDockerClientTest;
@@ -16,6 +17,10 @@
import java.lang.reflect.Method;
import java.util.Collections;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
@Test(groups = "integration")
public class ConnectToNetworkCmdImplTest extends AbstractDockerClientTest {
@@ -60,38 +65,49 @@ public void connectToNetwork() throws InterruptedException {
@Test
public void connectToNetworkWithContainerNetwork() throws InterruptedException {
+ final String NETWORK_SUBNET = "10.100.102.0/24";
+ final String NETWORK_NAME = "jerseyTestNetwork";
+ final String CONTAINER_IP = "10.100.102.100";
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("sleep", "9999")
+ .exec();
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
dockerClient.startContainerCmd(container.getId()).exec();
+ try {
+ dockerClient.removeNetworkCmd(NETWORK_NAME).exec();
+ } catch (DockerException ignore) {
+ }
+
CreateNetworkResponse network = dockerClient.createNetworkCmd()
- .withName("testNetwork")
+ .withName(NETWORK_NAME)
.withIpam(new Network.Ipam()
- .withConfig(new Network.Ipam.Config()
- .withSubnet("10.100.100.0/24")))
+ .withConfig(new Network.Ipam.Config()
+ .withSubnet(NETWORK_SUBNET)))
.exec();
dockerClient.connectToNetworkCmd()
.withNetworkId(network.getId())
.withContainerId(container.getId())
.withContainerNetwork(new ContainerNetwork()
- .withAliases("testing")
- .withIpamConfig(new ContainerNetwork.Ipam()
- .withIpv4Address("10.100.100.100")))
+ .withAliases("aliasName")
+ .withIpamConfig(new ContainerNetwork.Ipam()
+ .withIpv4Address(CONTAINER_IP)))
.exec();
Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec();
Network.ContainerNetworkConfig containerNetworkConfig = updatedNetwork.getContainers().get(container.getId());
assertNotNull(containerNetworkConfig);
- assertEquals(containerNetworkConfig.getIpv4Address(), "10.100.100.100/24");
+ assertThat(containerNetworkConfig.getIpv4Address(), is(CONTAINER_IP + "/24"));
InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- ContainerNetwork testNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get("testNetwork");
+ ContainerNetwork testNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get(NETWORK_NAME);
assertNotNull(testNetwork);
- assertEquals(testNetwork.getAliases(), Collections.singletonList("testing"));
- assertEquals(testNetwork.getGateway(), "10.100.100.1");
- assertEquals(testNetwork.getIpAddress(), "10.100.100.100");
+ assertThat(testNetwork.getAliases(), hasItem("aliasName"));
+ assertEquals(testNetwork.getGateway(), "10.100.102.1");
+ assertEquals(testNetwork.getIpAddress(), CONTAINER_IP);
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExecTest.java
index ee1a681b6..7e290a98e 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExecTest.java
@@ -3,6 +3,8 @@
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.CreateNetworkResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.exception.DockerException;
+import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.ContainerNetwork;
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.netty.AbstractNettyDockerClientTest;
@@ -17,6 +19,10 @@
import java.lang.reflect.Method;
import java.util.Collections;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
@Test(groups = "integration")
public class ConnectToNetworkCmdExecTest extends AbstractNettyDockerClientTest {
@@ -61,38 +67,49 @@ public void connectToNetwork() throws InterruptedException {
@Test
public void connectToNetworkWithContainerNetwork() throws InterruptedException {
+ final String NETWORK_SUBNET = "10.100.101.0/24";
+ final String NETWORK_NAME = "nettyTestNetwork";
+ final String CONTAINER_IP = "10.100.101.100";
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
+ .withCmd("sleep", "9999")
+ .exec();
- CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec();
dockerClient.startContainerCmd(container.getId()).exec();
+ try {
+ dockerClient.removeNetworkCmd(NETWORK_NAME).exec();
+ } catch (DockerException ignore) {
+ }
+
CreateNetworkResponse network = dockerClient.createNetworkCmd()
- .withName("testNetwork")
+ .withName(NETWORK_NAME)
.withIpam(new Network.Ipam()
- .withConfig(new Network.Ipam.Config()
- .withSubnet("10.100.100.0/24")))
+ .withConfig(new Network.Ipam.Config()
+ .withSubnet(NETWORK_SUBNET)))
.exec();
dockerClient.connectToNetworkCmd()
.withNetworkId(network.getId())
.withContainerId(container.getId())
.withContainerNetwork(new ContainerNetwork()
- .withAliases("testing")
- .withIpamConfig(new ContainerNetwork.Ipam()
- .withIpv4Address("10.100.100.100")))
+ .withAliases("aliasName")
+ .withIpamConfig(new ContainerNetwork.Ipam()
+ .withIpv4Address(CONTAINER_IP)))
.exec();
Network updatedNetwork = dockerClient.inspectNetworkCmd().withNetworkId(network.getId()).exec();
Network.ContainerNetworkConfig containerNetworkConfig = updatedNetwork.getContainers().get(container.getId());
assertNotNull(containerNetworkConfig);
- assertEquals(containerNetworkConfig.getIpv4Address(), "10.100.100.100/24");
+ assertThat(containerNetworkConfig.getIpv4Address(), is(CONTAINER_IP + "/24"));
InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
- ContainerNetwork testNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get("testNetwork");
+ ContainerNetwork testNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get(NETWORK_NAME);
assertNotNull(testNetwork);
- assertEquals(testNetwork.getAliases(), Collections.singletonList("testing"));
- assertEquals(testNetwork.getGateway(), "10.100.100.1");
- assertEquals(testNetwork.getIpAddress(), "10.100.100.100");
+ assertThat(testNetwork.getAliases(), hasItem("aliasName"));
+ assertEquals(testNetwork.getGateway(), "10.100.101.1");
+ assertEquals(testNetwork.getIpAddress(), CONTAINER_IP);
}
}
From a68cf85da7918886c669e7ddc92e6c246046a4ea Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sun, 14 Aug 2016 21:33:15 +0300
Subject: [PATCH 097/736] Fix create with alias tests.
---
.../dockerjava/core/command/CreateContainerCmdImplTest.java | 2 +-
.../dockerjava/netty/exec/CreateContainerCmdExecTest.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
index 7babafc91..1f62527e9 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -375,7 +375,7 @@ public void createContainerWithAlias() throws DockerException {
.exec();
ContainerNetwork aliasNet = inspectContainerResponse.getNetworkSettings().getNetworks().get("aliasNet");
- assertEquals(aliasNet.getAliases(), Collections.singletonList("server"));
+ assertThat(aliasNet.getAliases(), hasItem("server"));
}
@Test
diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java
index 2213ca7b7..3694ca7fb 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java
@@ -370,7 +370,7 @@ public void createContainerWithAlias() throws DockerException {
.exec();
ContainerNetwork aliasNet = inspectContainerResponse.getNetworkSettings().getNetworks().get("aliasNet");
- assertEquals(aliasNet.getAliases(), Collections.singletonList("server"));
+ assertThat(aliasNet.getAliases(), hasItem("server"));
}
@Test
From af891e25521d6b09f0213f458be256933caded06 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sun, 14 Aug 2016 21:38:58 +0300
Subject: [PATCH 098/736] Fix test for 1.24
---
src/main/java/com/github/dockerjava/api/DockerClient.java | 1 +
.../core/command/CopyFileFromContainerCmdImplTest.java | 8 ++++++++
.../netty/exec/CopyFileFromContainerCmdExecTest.java | 7 +++++++
3 files changed, 16 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java
index 491c11ac8..832890e87 100644
--- a/src/main/java/com/github/dockerjava/api/DockerClient.java
+++ b/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -170,6 +170,7 @@ public interface DockerClient extends Closeable {
* @return created command
* @see #copyArchiveFromContainerCmd(String, String)
* @deprecated since docker API version 1.20, replaced by {@link #copyArchiveFromContainerCmd(String, String)}
+ * since 1.24 fails.
*/
@Deprecated
CopyFileFromContainerCmd copyFileFromContainerCmd(@Nonnull String containerId, @Nonnull String resource);
diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java
index 8bd2c44fe..ec66287eb 100644
--- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.core.command;
+import static com.github.dockerjava.utils.TestUtils.getVersion;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.isEmptyOrNullString;
import static org.hamcrest.Matchers.not;
@@ -7,7 +8,10 @@
import java.io.InputStream;
import java.lang.reflect.Method;
+import com.github.dockerjava.core.RemoteApiVersion;
+import com.github.dockerjava.utils.TestUtils;
import org.testng.ITestResult;
+import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
@@ -43,6 +47,10 @@ public void afterMethod(ITestResult result) {
@Test
public void copyFromContainer() throws Exception {
+ if (getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_24)) {
+ throw new SkipException("Doesn't work since 1.24");
+ }
+
// TODO extract this into a shared method
CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
.withName("docker-java-itest-copyFromContainer").withCmd("touch", "/copyFromContainer").exec();
diff --git a/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java
index b512cfa69..1060ae82a 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.netty.exec;
+import static com.github.dockerjava.utils.TestUtils.getVersion;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.isEmptyOrNullString;
import static org.hamcrest.Matchers.not;
@@ -7,7 +8,9 @@
import java.io.InputStream;
import java.lang.reflect.Method;
+import com.github.dockerjava.core.RemoteApiVersion;
import org.testng.ITestResult;
+import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
@@ -43,6 +46,10 @@ public void afterMethod(ITestResult result) {
@Test
public void copyFromContainer() throws Exception {
+ if (getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_24)) {
+ throw new SkipException("Doesn't work since 1.24");
+ }
+
// TODO extract this into a shared method
CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
.withName("docker-java-itest-copyFromContainer").withCmd("touch", "/copyFromContainer").exec();
From 78a2a007303f93211fca4398198f977cf4bba173 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sun, 14 Aug 2016 21:39:09 +0300
Subject: [PATCH 099/736] Fix typo
---
.../com/github/dockerjava/core/command/UnpauseCmdImplTest.java | 2 +-
.../com/github/dockerjava/netty/exec/UnpauseCmdImplTest.java | 2 +-
src/test/java/com/github/dockerjava/utils/ContainerUtils.java | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/core/command/UnpauseCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/UnpauseCmdImplTest.java
index f640c4182..2f41b67ae 100644
--- a/src/test/java/com/github/dockerjava/core/command/UnpauseCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/UnpauseCmdImplTest.java
@@ -56,7 +56,7 @@ public void unpausePausedContainer() {
ContainerUtils.pauseContainer(dockerClient, container);
- ContainerUtils.unpaseContainer(dockerClient, container);
+ ContainerUtils.unpauseContainer(dockerClient, container);
}
@Test(expectedExceptions = InternalServerErrorException.class)
diff --git a/src/test/java/com/github/dockerjava/netty/exec/UnpauseCmdImplTest.java b/src/test/java/com/github/dockerjava/netty/exec/UnpauseCmdImplTest.java
index db91bc9f9..cb30babc4 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/UnpauseCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/UnpauseCmdImplTest.java
@@ -56,7 +56,7 @@ public void unpausePausedContainer() {
ContainerUtils.pauseContainer(dockerClient, container);
- ContainerUtils.unpaseContainer(dockerClient, container);
+ ContainerUtils.unpauseContainer(dockerClient, container);
}
@Test(expectedExceptions = InternalServerErrorException.class)
diff --git a/src/test/java/com/github/dockerjava/utils/ContainerUtils.java b/src/test/java/com/github/dockerjava/utils/ContainerUtils.java
index 75be6c4d9..206be0693 100644
--- a/src/test/java/com/github/dockerjava/utils/ContainerUtils.java
+++ b/src/test/java/com/github/dockerjava/utils/ContainerUtils.java
@@ -60,7 +60,7 @@ public static void stopContainer(DockerClient dockerClient, CreateContainerRespo
* @param dockerClient docker client
* @param container container
*/
- public static void unpaseContainer(DockerClient dockerClient, CreateContainerResponse container) {
+ public static void unpauseContainer(DockerClient dockerClient, CreateContainerResponse container) {
dockerClient.unpauseContainerCmd(container.getId()).exec();
InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
From a520aaa56b0e8cb05dc7a84da7b04377418c2f55 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 00:35:48 +0300
Subject: [PATCH 100/736] Fix test again?
---
.../dockerjava/netty/exec/AttachContainerCmdExecTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
index 7daa59b25..d3e8094cf 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
@@ -93,7 +93,7 @@ public void attachContainerWithStdin() throws Exception {
dockerClient.startContainerCmd(container.getId()).exec();
- Thread.sleep(SECONDS.toMillis(3)); //wait bash initialisation
+ Thread.sleep(SECONDS.toMillis(10)); //wait bash initialisation
InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
From 03b1c72caced14037d3531a636508d48a16e874f Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 13:58:19 +0300
Subject: [PATCH 101/736] Update CHANGELOG.md
---
CHANGELOG.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 132f3c6b1..64bea7c57 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,9 @@
Change Log
===
+## Next
-## 3.0.3-SNAPSHOT
-
+## 3.0.3
+ * [JERSEY] Don't send body for start container request.
## 3.0.2
* Enhanced Dockerignore filtering.
From ec124aeee4edf771204dd1d8d7c680df65502610 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 14:05:51 +0300
Subject: [PATCH 102/736] [maven-release-plugin] prepare release 3.0.3
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 208d52705..4327d0b60 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.3-SNAPSHOT
+ 3.0.3docker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ 3.0.3
From 76bfdc9f4da0a280310212a53ae959b6e66834a4 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 14:05:57 +0300
Subject: [PATCH 103/736] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 4327d0b60..586d2a209 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.3
+ 3.0.4-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- 3.0.3
+ HEAD
From 03b8bb0ceaa45f044ef8ded07a3edf194fd8cd68 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 14:41:19 +0300
Subject: [PATCH 104/736] Don't fail build because of coverity
---
.travis/travis-script.sh | 31 ++++++++++++++++++++++++++++---
1 file changed, 28 insertions(+), 3 deletions(-)
diff --git a/.travis/travis-script.sh b/.travis/travis-script.sh
index aeae555ef..1cdc84fa5 100755
--- a/.travis/travis-script.sh
+++ b/.travis/travis-script.sh
@@ -1,12 +1,34 @@
#!/usr/bin/env bash
-set -ex
+
IS_COVERITY_SCAN_BRANCH=`ruby -e "puts '${TRAVIS_BRANCH}' =~ /\\A$COVERITY_SCAN_BRANCH_PATTERN\\z/ ? 1 : 0"`
+export COVERITY_ALLOWED=true
+# Verify upload is permitted
+AUTH_RES=`curl -s --form project="$COVERITY_SCAN_PROJECT_NAME" --form token="$COVERITY_SCAN_TOKEN" $SCAN_URL/api/upload_permitted`
+if [ "$AUTH_RES" = "Access denied" ]; then
+ echo -e "\033[33;1mCoverity Scan API access denied. Check COVERITY_SCAN_PROJECT_NAME and COVERITY_SCAN_TOKEN.\033[0m"
+ COVERITY_ALLOWED=false
+else
+ AUTH=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['upload_permitted']"`
+ if [ "$AUTH" = "true" ]; then
+ echo -e "\033[33;1mCoverity Scan analysis authorized per quota.\033[0m"
+ else
+ WHEN=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['next_upload_permitted_at']"`
+ echo -e "\033[33;1mCoverity Scan analysis NOT authorized until $WHEN.\033[0m"
+
+ COVERITY_ALLOWED=false
+ fi
+fi
+
+set -ex
if [ "${FAST_BUILD}" == "true" ]; then
- if [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$COVERITY" == "true" ] && [ "$IS_COVERITY_SCAN_BRANCH" = "1" ]; then
+ if [ "$TRAVIS_PULL_REQUEST" == "false" ] &&
+ [ "$COVERITY" == "true" ] &&
+ [ "$IS_COVERITY_SCAN_BRANCH" = "1" ] &&
+ [ "$COVERITY_ALLOWED" == "true" ]; then
export COVERITY_SCAN_BUILD_COMMAND="mvn package"
#curl -s "https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh" | bash
./.travis/travisci_build_coverity_scan.sh
@@ -14,7 +36,10 @@ if [ "${FAST_BUILD}" == "true" ]; then
mvn package
fi
else
- if [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$COVERITY" == "true" ] && [ "$IS_COVERITY_SCAN_BRANCH" = "1" ]; then
+ if [ "$TRAVIS_PULL_REQUEST" == "false" ] &&
+ [ "$COVERITY" == "true" ] &&
+ [ "$IS_COVERITY_SCAN_BRANCH" = "1" ] &&
+ [ "$COVERITY_ALLOWED" == "true" ]; then
export COVERITY_SCAN_BUILD_COMMAND="mvn verify"
#curl -s "https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh" | bash
./.travis/travisci_build_coverity_scan.sh
From 26c0e277de537edfe623ea6ec531a08c5fbb296e Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 14:48:52 +0300
Subject: [PATCH 105/736] Adjust developers
---
pom.xml | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/pom.xml b/pom.xml
index 586d2a209..a14a31e5f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,6 +32,16 @@
+
+ marcuslinke
+ Marcus Linke
+ marcus.linke@gmx.de
+
+
+ kostyasha
+ Kanstantsin Shautsou
+ kanstantsin.sha@gmail.com
+ kpelykhKonstantin Pelykh
From f2826175e86239c85a327c10ae98c181a8f6e762 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 15:17:23 +0300
Subject: [PATCH 106/736] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index da474ff85..e65215648 100644
--- a/README.md
+++ b/README.md
@@ -56,7 +56,7 @@ Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/doc
com.github.docker-javadocker-java
- 3.0.1
+ 3.0.3
### Latest development version
@@ -67,7 +67,7 @@ You can find the latest development version including javadoc and source files o
com.github.docker-javadocker-java
- 3.0.2-SNAPSHOT
+ 3.0.4-SNAPSHOT
From b93d0636ef0e3c24966753c79273b19aba601d97 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 19:59:42 +0300
Subject: [PATCH 107/736] Don't hide utils
---
.../github/dockerjava/core/util/CertificateUtils.java | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java
index c760331d6..b5a5dcae6 100644
--- a/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java
+++ b/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java
@@ -72,7 +72,7 @@ public static KeyStore createKeyStore(final String keypem, final String certpem)
/**
* from "cert.pem" String
*/
- private static List loadCertificates(final String certpem) throws IOException,
+ public static List loadCertificates(final String certpem) throws IOException,
CertificateException {
final StringReader certReader = new StringReader(certpem);
try (BufferedReader reader = new BufferedReader(certReader)) {
@@ -83,7 +83,7 @@ private static List loadCertificates(final String certpem) throws I
/**
* "cert.pem" from reader
*/
- private static List loadCertificates(final Reader reader) throws IOException,
+ public static List loadCertificates(final Reader reader) throws IOException,
CertificateException {
try (PEMParser pemParser = new PEMParser(reader)) {
List certificates = new ArrayList<>();
@@ -105,7 +105,7 @@ private static List loadCertificates(final Reader reader) throws IO
* Return private key ("key.pem") from Reader
*/
@CheckForNull
- private static PrivateKey loadPrivateKey(final Reader reader) throws IOException, NoSuchAlgorithmException,
+ public static PrivateKey loadPrivateKey(final Reader reader) throws IOException, NoSuchAlgorithmException,
InvalidKeySpecException {
try (PEMParser pemParser = new PEMParser(reader)) {
Object readObject = pemParser.readObject();
@@ -138,7 +138,7 @@ private static PrivateKey loadPrivateKey(final Reader reader) throws IOException
}
@CheckForNull
- private static PrivateKey guessKey(byte[] encodedKey) throws NoSuchAlgorithmException {
+ public static PrivateKey guessKey(byte[] encodedKey) throws NoSuchAlgorithmException {
//no way to know, so iterate
for (String guessFactory : new String[]{"RSA", "ECDSA"}) {
try {
@@ -157,7 +157,7 @@ private static PrivateKey guessKey(byte[] encodedKey) throws NoSuchAlgorithmExce
* Return KeyPair from "key.pem"
*/
@CheckForNull
- private static PrivateKey loadPrivateKey(final String keypem) throws IOException, NoSuchAlgorithmException,
+ public static PrivateKey loadPrivateKey(final String keypem) throws IOException, NoSuchAlgorithmException,
InvalidKeySpecException {
try (StringReader certReader = new StringReader(keypem);
BufferedReader reader = new BufferedReader(certReader)) {
From 203fa3903b76c0e539cb7de702dded78039853d9 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 20:51:40 +0300
Subject: [PATCH 108/736] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 64bea7c57..1011a4815 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@ Change Log
===
## Next
+## 3.0.4
+ * Make cert util methods public.
+
## 3.0.3
* [JERSEY] Don't send body for start container request.
From d2b511f45e14791887e1861044ca6d3cc4b44ff4 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 20:57:23 +0300
Subject: [PATCH 109/736] [maven-release-plugin] prepare release 3.0.4
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index a14a31e5f..854782b2c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.4-SNAPSHOT
+ 3.0.4docker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ 3.0.4
From f751dc25cc9fc38c9e643a068e793d32f54c1664 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 15 Aug 2016 20:57:31 +0300
Subject: [PATCH 110/736] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 854782b2c..6d1ccca18 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.4
+ 3.0.5-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- 3.0.4
+ HEAD
From 36d17ca42b9fd706b864ac3d11380bd8c4ccbac6 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Tue, 16 Aug 2016 22:07:15 +0300
Subject: [PATCH 111/736] Update devel.adoc
https://github.com/jenkinsci/credentials-plugin/blob/master/CONTRIBUTING.md
---
docs/devel.adoc | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/devel.adoc b/docs/devel.adoc
index 2305b89d0..1b6295662 100644
--- a/docs/devel.adoc
+++ b/docs/devel.adoc
@@ -13,6 +13,7 @@
** Provide full information on field:
*** For models define API version with `@since {@link RemoteApiVersion#VERSION_1_X}`.
** getters/setters should refernce to field `@see #$field`.
+ * If it is `Serializable` it shall have a `serialVersionUID` field. Unless code has shipped to users, the initial value of the `serialVersionUID` field shall be `1L`.
### Coding style
* TBD, some initial styling already enforced with checkstyle.
From e95f78621d4c3aeb8fad9b79f8b5a1093a8e8547 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 17 Aug 2016 10:39:14 +0300
Subject: [PATCH 112/736] Update Events to 1.24 model (#669)
* added event type in Event class #650
* added missing import for JsonProperty
* added CheckForNull
* Sync event model to 1.24
Signed-off-by: Kanstantsin Shautsou
---
.../github/dockerjava/api/model/Event.java | 184 ++++++++++++++++--
.../dockerjava/api/model/EventActor.java | 77 ++++++++
.../dockerjava/api/model/EventType.java | 55 ++++++
.../dockerjava/api/model/EventsTest.java | 64 ++++++
.../resources/samples/1.24/events/docs1.json | 17 ++
5 files changed, 384 insertions(+), 13 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/api/model/EventActor.java
create mode 100644 src/main/java/com/github/dockerjava/api/model/EventType.java
create mode 100644 src/test/java/com/github/dockerjava/api/model/EventsTest.java
create mode 100644 src/test/resources/samples/1.24/events/docs1.json
diff --git a/src/main/java/com/github/dockerjava/api/model/Event.java b/src/main/java/com/github/dockerjava/api/model/Event.java
index 202f5a350..b8024b5ee 100644
--- a/src/main/java/com/github/dockerjava/api/model/Event.java
+++ b/src/main/java/com/github/dockerjava/api/model/Event.java
@@ -1,10 +1,17 @@
package com.github.dockerjava.api.model;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import javax.annotation.CheckForNull;
+
+import static org.apache.commons.lang.builder.ToStringStyle.SHORT_PREFIX_STYLE;
/**
* Representation of a Docker event.
@@ -12,16 +19,60 @@
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
public class Event {
+
+ /**
+ * @since 1.16
+ */
+ @JsonProperty("status")
private String status;
+ /**
+ * @since 1.16
+ */
+ @JsonProperty("id")
private String id;
+ /**
+ * @since 1.16
+ */
+ @JsonProperty("from")
private String from;
+ /**
+ * ??
+ */
+ @JsonProperty("node")
+ private Node node;
+
+ /*
+ * @since 1.
+ */
+ @JsonProperty("Type")
+ private EventType type;
+
+ /**
+ * @since 1.22
+ */
+ @JsonProperty("Action")
+ private String action;
+
+ /**
+ * @since 1.22
+ */
+ @JsonProperty("Actor")
+ private EventActor actor;
+
+ /**
+ * @since 1.16
+ */
+ @JsonProperty("time")
private Long time;
- @JsonIgnoreProperties
- private Node node;
+ /**
+ * @since 1.21
+ */
+ @JsonProperty("timeNano")
+ private Long timeNano;
/**
* Default constructor for the deserialization.
@@ -32,16 +83,12 @@ public Event() {
/**
* Constructor.
*
- * @param id
- * Container ID
- * @param status
- * Status string. List of statuses is available in Docker API v.1.16
- * @param from
- * Image, from which the container has been created
- * @param time
- * Event time The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT
- * @since TODO
+ * @param id Container ID
+ * @param status Status string. List of statuses is available in Docker API v.1.16
+ * @param from Image, from which the container has been created
+ * @param time Event time The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT
+ * @since 1.16
*/
public Event(String status, String id, String from, Long time) {
this.status = status;
@@ -60,6 +107,14 @@ public String getStatus() {
return status;
}
+ /**
+ * @see #status
+ */
+ public Event withStatus(String status) {
+ this.status = status;
+ return this;
+ }
+
/**
* Get ID of docker container.
*
@@ -69,6 +124,14 @@ public String getId() {
return id;
}
+ /**
+ * @see #id
+ */
+ public Event withId(String id) {
+ this.id = id;
+ return this;
+ }
+
/**
* Get source image of the container.
*
@@ -78,6 +141,14 @@ public String getFrom() {
return from;
}
+ /**
+ * @see #from
+ */
+ public Event withFrom(String from) {
+ this.from = from;
+ return this;
+ }
+
/**
* Get the event time. The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT
*
@@ -87,6 +158,30 @@ public Long getTime() {
return time;
}
+ /**
+ * @see #time
+ */
+ public Event withTime(Long time) {
+ this.time = time;
+ return this;
+ }
+
+ /**
+ * @see #timeNano
+ */
+ @CheckForNull
+ public Long getTimeNano() {
+ return timeNano;
+ }
+
+ /**
+ * @see #timeNano
+ */
+ public Event withTimenano(Long timenano) {
+ this.timeNano = timenano;
+ return this;
+ }
+
/**
* Returns the node when working against docker swarm
*/
@@ -94,8 +189,71 @@ public Node getNode() {
return node;
}
+ /**
+ * @see #node
+ */
+ public Event withNode(Node node) {
+ this.node = node;
+ return this;
+ }
+
+ @CheckForNull
+ public EventType getType() {
+ return type;
+ }
+
+ /**
+ * @see #type
+ */
+ public Event withType(EventType type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * @see #action
+ */
+ @CheckForNull
+ public String getAction() {
+ return action;
+ }
+
+ /**
+ * @see #action
+ */
+ public Event withAction(String action) {
+ this.action = action;
+ return this;
+ }
+
+ /**
+ * @see #actor
+ */
+ @CheckForNull
+ public EventActor getActor() {
+ return actor;
+ }
+
+ /**
+ * @see #actor
+ */
+ public Event withEventActor(EventActor actor) {
+ this.actor = actor;
+ return this;
+ }
+
@Override
public String toString() {
- return ToStringBuilder.reflectionToString(this);
+ return ToStringBuilder.reflectionToString(this, SHORT_PREFIX_STYLE);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return EqualsBuilder.reflectionEquals(this, o);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
}
}
diff --git a/src/main/java/com/github/dockerjava/api/model/EventActor.java b/src/main/java/com/github/dockerjava/api/model/EventActor.java
new file mode 100644
index 000000000..f7b0abbf3
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/EventActor.java
@@ -0,0 +1,77 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import javax.annotation.CheckForNull;
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * @author Kanstantsin Shautsou
+ * @since 1.22
+ */
+public class EventActor implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @since 1.22
+ */
+ @JsonProperty("ID")
+ private String id;
+
+ /**
+ * @since 1.22
+ */
+ @JsonProperty("Attributes")
+ private Map attributes;
+
+ /**
+ * @see #id
+ */
+ @CheckForNull
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @see #id
+ */
+ public EventActor withId(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * @see #attributes
+ */
+ @CheckForNull
+ public Map getAttributes() {
+ return attributes;
+ }
+
+ /**
+ * @see #attributes
+ */
+ public EventActor withAttributes(Map attributes) {
+ this.attributes = attributes;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return EqualsBuilder.reflectionEquals(this, o);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/EventType.java b/src/main/java/com/github/dockerjava/api/model/EventType.java
new file mode 100644
index 000000000..697c1e429
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/EventType.java
@@ -0,0 +1,55 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+import javax.annotation.Nonnull;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @since 1.24
+ */
+public enum EventType {
+ /**
+ * @since 1.24
+ */
+ CONTAINER("container"),
+
+ /**
+ * @since 1.24
+ */
+ DAEMON("daemon"),
+
+ /**
+ * @since 1.24
+ */
+ IMAGE("image"),
+ NETWORK("network"),
+ PLUGIN("plugin"),
+ VOLUME("volume");
+
+ private static final Map EVENT_TYPES = new HashMap<>();
+
+ static {
+ for (EventType t : values()) {
+ EVENT_TYPES.put(t.name().toLowerCase(), t);
+ }
+ }
+
+ private String value;
+
+ EventType(@Nonnull String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @JsonCreator
+ public static EventType forValue(String s) {
+ return EVENT_TYPES.get(s);
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/api/model/EventsTest.java b/src/test/java/com/github/dockerjava/api/model/EventsTest.java
new file mode 100644
index 000000000..ce62c7d5f
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/api/model/EventsTest.java
@@ -0,0 +1,64 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.dockerjava.core.RemoteApiVersion;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import static com.github.dockerjava.api.model.EventType.CONTAINER;
+import static com.github.dockerjava.test.serdes.JSONSamples.testRoundTrip;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * @author Kanstantsin Shautsou
+ */
+public class EventsTest {
+
+ @Test
+ public void serderDocs1() throws IOException {
+ final ObjectMapper mapper = new ObjectMapper();
+ final JavaType type = mapper.getTypeFactory().uncheckedSimpleType(Event.class);
+
+ final Event event = testRoundTrip(RemoteApiVersion.VERSION_1_24,
+ "/events/docs1.json",
+ type
+ );
+
+ assertThat(event, notNullValue());
+ assertThat(event.getType(), is(CONTAINER));
+ assertThat(event.getAction(), is("create"));
+ assertThat(event.getId(), is("ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743"));
+ assertThat(event.getFrom(), is("alpine"));
+ assertThat(event.getTime(), is(1461943101L));
+ assertThat(event.getNode(), nullValue());
+ assertThat(event.getTimeNano(), is(1461943101381709551L));
+
+ final HashMap attributes = new HashMap<>();
+ attributes.put("com.example.some-label", "some-label-value");
+ attributes.put("image", "alpine");
+ attributes.put("name", "my-container");
+
+ final EventActor actor = new EventActor()
+ .withId("ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743")
+ .withAttributes(attributes);
+
+ final Event event1 = new Event()
+ .withType(CONTAINER)
+ .withStatus("create")
+ .withId("ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743")
+ .withFrom("alpine")
+ .withTime(1461943101L)
+ .withTimenano(1461943101381709551L)
+ .withAction("create")
+ .withEventActor(actor);
+
+ assertThat(event1, equalTo(event));
+ }
+}
diff --git a/src/test/resources/samples/1.24/events/docs1.json b/src/test/resources/samples/1.24/events/docs1.json
new file mode 100644
index 000000000..f62f2284e
--- /dev/null
+++ b/src/test/resources/samples/1.24/events/docs1.json
@@ -0,0 +1,17 @@
+{
+ "status": "create",
+ "id": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
+ "from": "alpine",
+ "Type": "container",
+ "Action": "create",
+ "Actor": {
+ "ID": "ede54ee1afda366ab42f824e8a5ffd195155d853ceaec74a927f249ea270c743",
+ "Attributes": {
+ "com.example.some-label": "some-label-value",
+ "image": "alpine",
+ "name": "my-container"
+ }
+ },
+ "time": 1461943101,
+ "timeNano": 1461943101381709551
+}
From bb83b03207cd6a641616f1112a5a5f32d40f2467 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 17 Aug 2016 12:02:14 +0300
Subject: [PATCH 113/736] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1011a4815..bd6c2d278 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@ Change Log
===
## Next
+## 3.0.5
+ * Events updated to 1.24 API model.
+
## 3.0.4
* Make cert util methods public.
From af8374f622d442a81ae558fa757c03d879fa2848 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 17 Aug 2016 13:37:57 +0300
Subject: [PATCH 114/736] [maven-release-plugin] prepare release 3.0.5
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 6d1ccca18..00a4561b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.5-SNAPSHOT
+ 3.0.5docker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ 3.0.5
From 8c456c2334c656a6ca20cc502440fdf01175f577 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 17 Aug 2016 13:38:04 +0300
Subject: [PATCH 115/736] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 00a4561b5..b1b6d96a9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.5
+ 3.0.6-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- 3.0.5
+ HEAD
From 96d7ddbea9a442875b33406d81b9ea678c1fb5b1 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 17 Aug 2016 00:16:21 +0300
Subject: [PATCH 116/736] Make all models serializable
---
.../dockerjava/api/model/AuthConfig.java | 4 +-
.../api/model/AuthConfigurations.java | 4 +-
.../dockerjava/api/model/AuthResponse.java | 6 +-
.../com/github/dockerjava/api/model/Bind.java | 5 +-
.../github/dockerjava/api/model/Binds.java | 4 +-
.../api/model/BuildResponseItem.java | 1 -
.../dockerjava/api/model/ChangeLog.java | 5 +-
.../dockerjava/api/model/Container.java | 4 +-
.../dockerjava/api/model/ContainerConfig.java | 4 +-
.../api/model/ContainerHostConfig.java | 6 +-
.../api/model/ContainerNetwork.java | 5 +-
.../api/model/ContainerNetworkSettings.java | 5 +-
.../dockerjava/api/model/ContainerPort.java | 4 +-
.../github/dockerjava/api/model/Device.java | 4 +-
.../dockerjava/api/model/DriverStatus.java | 7 ++-
.../dockerjava/api/model/ErrorDetail.java | 6 +-
.../dockerjava/api/model/ErrorResponse.java | 6 +-
.../github/dockerjava/api/model/Event.java | 5 +-
.../dockerjava/api/model/ExposedPort.java | 4 +-
.../dockerjava/api/model/ExposedPorts.java | 4 +-
.../github/dockerjava/api/model/Frame.java | 5 +-
.../dockerjava/api/model/HostConfig.java | 4 +-
.../dockerjava/api/model/Identifier.java | 8 ++-
.../github/dockerjava/api/model/Image.java | 5 +-
.../com/github/dockerjava/api/model/Info.java | 4 +-
.../api/model/InfoRegistryConfig.java | 5 +-
.../com/github/dockerjava/api/model/Link.java | 5 +-
.../github/dockerjava/api/model/Links.java | 4 +-
.../dockerjava/api/model/LogConfig.java | 4 +-
.../github/dockerjava/api/model/LxcConf.java | 6 +-
.../github/dockerjava/api/model/Network.java | 4 +-
.../dockerjava/api/model/NetworkSettings.java | 4 +-
.../com/github/dockerjava/api/model/Node.java | 5 +-
.../dockerjava/api/model/PortBinding.java | 6 +-
.../github/dockerjava/api/model/Ports.java | 4 +-
.../dockerjava/api/model/Repository.java | 5 +-
.../dockerjava/api/model/ResponseItem.java | 1 -
.../dockerjava/api/model/RestartPolicy.java | 5 +-
.../dockerjava/api/model/SearchItem.java | 5 +-
.../dockerjava/api/model/Statistics.java | 4 +-
.../github/dockerjava/api/model/Ulimit.java | 5 +-
.../github/dockerjava/api/model/Version.java | 4 +-
.../github/dockerjava/api/model/Volume.java | 5 +-
.../dockerjava/api/model/VolumeBind.java | 6 +-
.../dockerjava/api/model/VolumeBinds.java | 5 +-
.../github/dockerjava/api/model/VolumeRW.java | 4 +-
.../github/dockerjava/api/model/Volumes.java | 4 +-
.../dockerjava/api/model/VolumesFrom.java | 4 +-
.../dockerjava/api/model/VolumesRW.java | 5 +-
.../dockerjava/api/model/WaitResponse.java | 5 +-
.../api/ModelsSerializableTest.java | 63 +++++++++++++++++++
51 files changed, 244 insertions(+), 52 deletions(-)
create mode 100644 src/test/java/com/github/dockerjava/api/ModelsSerializableTest.java
diff --git a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java
index 849f26a21..074c6db61 100644
--- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java
@@ -8,9 +8,11 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.annotation.CheckForNull;
+import java.io.Serializable;
@JsonInclude(Include.NON_NULL)
-public class AuthConfig {
+public class AuthConfig implements Serializable {
+ private static final long serialVersionUID = 1L;
/**
* For backwards compatibility. Make sure you update the properties if you change this.
diff --git a/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java
index e8edbc950..baa8fc0b4 100644
--- a/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java
+++ b/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java
@@ -1,11 +1,13 @@
package com.github.dockerjava.api.model;
+import java.io.Serializable;
import java.util.Map;
import java.util.TreeMap;
import com.fasterxml.jackson.annotation.JsonProperty;
-public class AuthConfigurations {
+public class AuthConfigurations implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("configs")
private Map configs = new TreeMap<>();
diff --git a/src/main/java/com/github/dockerjava/api/model/AuthResponse.java b/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
index cb5d9df80..cd6908185 100644
--- a/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
+++ b/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
@@ -2,7 +2,11 @@
import com.fasterxml.jackson.annotation.JsonProperty;
-public class AuthResponse {
+import java.io.Serializable;
+
+public class AuthResponse implements Serializable {
+ private static final long serialVersionUID = 1L;
+
@JsonProperty("Status")
private String status;
diff --git a/src/main/java/com/github/dockerjava/api/model/Bind.java b/src/main/java/com/github/dockerjava/api/model/Bind.java
index bf02bbad2..0995c87ac 100644
--- a/src/main/java/com/github/dockerjava/api/model/Bind.java
+++ b/src/main/java/com/github/dockerjava/api/model/Bind.java
@@ -3,11 +3,14 @@
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
+import java.io.Serializable;
+
/**
* Represents a host path being bind mounted as a {@link Volume} in a Docker container.
* The Bind can be in read only or read write access mode.
*/
-public class Bind {
+public class Bind implements Serializable {
+ private static final long serialVersionUID = 1L;
private String path;
diff --git a/src/main/java/com/github/dockerjava/api/model/Binds.java b/src/main/java/com/github/dockerjava/api/model/Binds.java
index 917cfdcbd..b24c3208d 100644
--- a/src/main/java/com/github/dockerjava/api/model/Binds.java
+++ b/src/main/java/com/github/dockerjava/api/model/Binds.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -19,7 +20,8 @@
@JsonSerialize(using = Binds.Serializer.class)
@JsonDeserialize(using = Binds.Deserializer.class)
-public class Binds {
+public class Binds implements Serializable {
+ private static final long serialVersionUID = 1L;
private Bind[] binds;
diff --git a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java
index a53a1df9a..7236be23d 100644
--- a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java
+++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java
@@ -8,7 +8,6 @@
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class BuildResponseItem extends ResponseItem {
-
private static final long serialVersionUID = -1252904184236343612L;
private static final String BUILD_SUCCESS = "Successfully built";
diff --git a/src/main/java/com/github/dockerjava/api/model/ChangeLog.java b/src/main/java/com/github/dockerjava/api/model/ChangeLog.java
index 36804362c..04b36f5ce 100644
--- a/src/main/java/com/github/dockerjava/api/model/ChangeLog.java
+++ b/src/main/java/com/github/dockerjava/api/model/ChangeLog.java
@@ -5,13 +5,16 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
/**
*
* @author Konstantin Pelykh (kpelykh@gmail.com)
*
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public class ChangeLog {
+public class ChangeLog implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("Path")
private String path;
diff --git a/src/main/java/com/github/dockerjava/api/model/Container.java b/src/main/java/com/github/dockerjava/api/model/Container.java
index 47492920d..9e04362ce 100644
--- a/src/main/java/com/github/dockerjava/api/model/Container.java
+++ b/src/main/java/com/github/dockerjava/api/model/Container.java
@@ -11,6 +11,7 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.io.Serializable;
import java.util.Map;
/**
@@ -20,7 +21,8 @@
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
-public class Container {
+public class Container implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("Command")
private String command;
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
index 224da3272..191126798 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
@@ -10,6 +10,7 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.io.Serializable;
import java.util.Map;
/**
@@ -19,7 +20,8 @@
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
-public class ContainerConfig {
+public class ContainerConfig implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("AttachStderr")
private Boolean attachStderr;
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerHostConfig.java b/src/main/java/com/github/dockerjava/api/model/ContainerHostConfig.java
index 43a5a94b1..8d0c3fe37 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerHostConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/ContainerHostConfig.java
@@ -6,6 +6,8 @@
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
+import java.io.Serializable;
+
/**
* Used in {@link Container}
*
@@ -13,7 +15,9 @@
* @author Kanstantsin Shautsou
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public class ContainerHostConfig {
+public class ContainerHostConfig implements Serializable {
+ private static final long serialVersionUID = 1L;
+
@JsonProperty("NetworkMode")
private String networkMode;
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java b/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
index 9b2160e98..bc7e12d33 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
+++ b/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
@@ -9,6 +9,7 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
@@ -21,7 +22,9 @@
* @author Kanstantsin Shautsou
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public class ContainerNetwork {
+public class ContainerNetwork implements Serializable {
+ private static final long serialVersionUID = 1L;
+
/**
* FIXME verify
*/
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerNetworkSettings.java b/src/main/java/com/github/dockerjava/api/model/ContainerNetworkSettings.java
index 7f4b17be5..bc6165874 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerNetworkSettings.java
+++ b/src/main/java/com/github/dockerjava/api/model/ContainerNetworkSettings.java
@@ -7,6 +7,7 @@
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
+import java.io.Serializable;
import java.util.Map;
/**
@@ -16,7 +17,9 @@
* @since {@link RemoteApiVersion#VERSION_1_22}
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public class ContainerNetworkSettings {
+public class ContainerNetworkSettings implements Serializable {
+ private static final long serialVersionUID = 1L;
+
/**
* @since {@link RemoteApiVersion#VERSION_1_22}
*/
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerPort.java b/src/main/java/com/github/dockerjava/api/model/ContainerPort.java
index 09f718ef6..5924e53df 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerPort.java
+++ b/src/main/java/com/github/dockerjava/api/model/ContainerPort.java
@@ -7,13 +7,15 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.io.Serializable;
/**
* @author Kanstantsin Shautsou
* @see Container
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public class ContainerPort {
+public class ContainerPort implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("IP")
private String ip;
diff --git a/src/main/java/com/github/dockerjava/api/model/Device.java b/src/main/java/com/github/dockerjava/api/model/Device.java
index f2b75e3f5..7d73710fd 100644
--- a/src/main/java/com/github/dockerjava/api/model/Device.java
+++ b/src/main/java/com/github/dockerjava/api/model/Device.java
@@ -12,12 +12,14 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.annotation.Nonnull;
+import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
@JsonInclude(Include.NON_NULL)
-public class Device {
+public class Device implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("CgroupPermissions")
private String cGroupPermissions = "";
diff --git a/src/main/java/com/github/dockerjava/api/model/DriverStatus.java b/src/main/java/com/github/dockerjava/api/model/DriverStatus.java
index 3e2b5037a..7c1374aae 100644
--- a/src/main/java/com/github/dockerjava/api/model/DriverStatus.java
+++ b/src/main/java/com/github/dockerjava/api/model/DriverStatus.java
@@ -7,12 +7,15 @@
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
/**
- * Created by ben on 12/12/13.
+ * @author ben
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
-public class DriverStatus {
+public class DriverStatus implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("Root Dir")
private String rootDir;
diff --git a/src/main/java/com/github/dockerjava/api/model/ErrorDetail.java b/src/main/java/com/github/dockerjava/api/model/ErrorDetail.java
index 62018a4e0..92e869d2a 100644
--- a/src/main/java/com/github/dockerjava/api/model/ErrorDetail.java
+++ b/src/main/java/com/github/dockerjava/api/model/ErrorDetail.java
@@ -4,8 +4,12 @@
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
@JsonInclude(Include.NON_NULL)
-public class ErrorDetail {
+public class ErrorDetail implements Serializable {
+ private static final long serialVersionUID = 1L;
+
@JsonProperty
private String message;
diff --git a/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java b/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java
index 172bd5c79..f6abfc3eb 100644
--- a/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java
+++ b/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java
@@ -4,8 +4,12 @@
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
@JsonInclude(Include.NON_NULL)
-public class ErrorResponse {
+public class ErrorResponse implements Serializable {
+ private static final long serialVersionUID = 1L;
+
@JsonProperty
private ErrorDetail errorDetail;
diff --git a/src/main/java/com/github/dockerjava/api/model/Event.java b/src/main/java/com/github/dockerjava/api/model/Event.java
index b8024b5ee..6e4b6f3c2 100644
--- a/src/main/java/com/github/dockerjava/api/model/Event.java
+++ b/src/main/java/com/github/dockerjava/api/model/Event.java
@@ -13,12 +13,15 @@
import static org.apache.commons.lang.builder.ToStringStyle.SHORT_PREFIX_STYLE;
+import java.io.Serializable;
+
/**
* Representation of a Docker event.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
-public class Event {
+public class Event implements Serializable {
+ private static final long serialVersionUID = 1L;
/**
* @since 1.16
diff --git a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java
index ec95f6273..26d727ff4 100644
--- a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java
+++ b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java
@@ -4,6 +4,7 @@
import static com.github.dockerjava.api.model.InternetProtocol.UDP;
import java.io.IOException;
+import java.io.Serializable;
import java.util.Map.Entry;
import org.apache.commons.lang.builder.EqualsBuilder;
@@ -30,7 +31,8 @@
*/
@JsonDeserialize(using = ExposedPort.Deserializer.class)
@JsonSerialize(using = ExposedPort.Serializer.class)
-public class ExposedPort {
+public class ExposedPort implements Serializable {
+ private static final long serialVersionUID = 1L;
private final InternetProtocol protocol;
diff --git a/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java
index 0ecb879b6..7670212e1 100644
--- a/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java
+++ b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -21,7 +22,8 @@
@JsonSerialize(using = ExposedPorts.Serializer.class)
@JsonDeserialize(using = ExposedPorts.Deserializer.class)
-public class ExposedPorts {
+public class ExposedPorts implements Serializable {
+ private static final long serialVersionUID = 1L;
private ExposedPort[] exposedPorts;
diff --git a/src/main/java/com/github/dockerjava/api/model/Frame.java b/src/main/java/com/github/dockerjava/api/model/Frame.java
index 0ad16e8c6..9b1376f82 100644
--- a/src/main/java/com/github/dockerjava/api/model/Frame.java
+++ b/src/main/java/com/github/dockerjava/api/model/Frame.java
@@ -1,11 +1,14 @@
package com.github.dockerjava.api.model;
+import java.io.Serializable;
import java.util.Arrays;
/**
* Represents a logging frame.
*/
-public class Frame {
+public class Frame implements Serializable {
+ private static final long serialVersionUID = 1L;
+
private final StreamType streamType;
private final byte[] payload;
diff --git a/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
index 5dada65cc..062082a03 100644
--- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java
@@ -11,6 +11,7 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
@@ -20,7 +21,8 @@
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
-public class HostConfig {
+public class HostConfig implements Serializable {
+ private static final long serialVersionUID = 1L;
private static final List PREDEFINED_NETWORKS = Arrays.asList("bridge", "host", "none");
diff --git a/src/main/java/com/github/dockerjava/api/model/Identifier.java b/src/main/java/com/github/dockerjava/api/model/Identifier.java
index 1051d857f..8f1c871a7 100644
--- a/src/main/java/com/github/dockerjava/api/model/Identifier.java
+++ b/src/main/java/com/github/dockerjava/api/model/Identifier.java
@@ -3,10 +3,14 @@
import com.google.common.base.Objects;
import com.google.common.base.Optional;
+import java.io.Serializable;
+
/**
- * Created by magnayn on 22/07/2014.
+ * @author magnayn
*/
-public class Identifier {
+public class Identifier implements Serializable {
+ private static final long serialVersionUID = 1L;
+
public final Repository repository;
public final Optional tag;
diff --git a/src/main/java/com/github/dockerjava/api/model/Image.java b/src/main/java/com/github/dockerjava/api/model/Image.java
index 496db275e..78fee9f79 100644
--- a/src/main/java/com/github/dockerjava/api/model/Image.java
+++ b/src/main/java/com/github/dockerjava/api/model/Image.java
@@ -7,6 +7,8 @@
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
/**
*
* @author Konstantin Pelykh (kpelykh@gmail.com)
@@ -14,7 +16,8 @@
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
-public class Image {
+public class Image implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("Created")
private Long created;
diff --git a/src/main/java/com/github/dockerjava/api/model/Info.java b/src/main/java/com/github/dockerjava/api/model/Info.java
index 7270eceb8..51abe5dac 100644
--- a/src/main/java/com/github/dockerjava/api/model/Info.java
+++ b/src/main/java/com/github/dockerjava/api/model/Info.java
@@ -9,6 +9,7 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.io.Serializable;
import java.util.List;
import java.util.Map;
@@ -19,7 +20,8 @@
*/
@JsonInclude(Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
-public class Info {
+public class Info implements Serializable {
+ private static final long serialVersionUID = 1L;
/**
* @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22}
diff --git a/src/main/java/com/github/dockerjava/api/model/InfoRegistryConfig.java b/src/main/java/com/github/dockerjava/api/model/InfoRegistryConfig.java
index 956aaebe3..2c2be5cfd 100644
--- a/src/main/java/com/github/dockerjava/api/model/InfoRegistryConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/InfoRegistryConfig.java
@@ -7,6 +7,7 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.io.Serializable;
import java.util.List;
import java.util.Map;
@@ -14,7 +15,9 @@
* @since ~{@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_20}
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public final class InfoRegistryConfig {
+public final class InfoRegistryConfig implements Serializable {
+ private static final long serialVersionUID = 1L;
+
@JsonProperty("IndexConfigs")
private Map indexConfigs;
diff --git a/src/main/java/com/github/dockerjava/api/model/Link.java b/src/main/java/com/github/dockerjava/api/model/Link.java
index 89647306c..346aedcb0 100644
--- a/src/main/java/com/github/dockerjava/api/model/Link.java
+++ b/src/main/java/com/github/dockerjava/api/model/Link.java
@@ -3,12 +3,15 @@
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
+import java.io.Serializable;
+
/**
* Represents a network link between two Docker containers. The container with the name {@link #getName()} is made available in the target
* container with the aliased name {@link #getAlias()}. This involves creating an entry in /etc/hosts and some environment
* variables in the target container as well as creating a network bridge between both containers.
*/
-public class Link {
+public class Link implements Serializable {
+ private static final long serialVersionUID = 1L;
private final String name;
diff --git a/src/main/java/com/github/dockerjava/api/model/Links.java b/src/main/java/com/github/dockerjava/api/model/Links.java
index 2d678b3a3..1eb66ae42 100644
--- a/src/main/java/com/github/dockerjava/api/model/Links.java
+++ b/src/main/java/com/github/dockerjava/api/model/Links.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -20,7 +21,8 @@
@JsonSerialize(using = Links.Serializer.class)
@JsonDeserialize(using = Links.Deserializer.class)
-public class Links {
+public class Links implements Serializable {
+ private static final long serialVersionUID = 1L;
private final Link[] links;
diff --git a/src/main/java/com/github/dockerjava/api/model/LogConfig.java b/src/main/java/com/github/dockerjava/api/model/LogConfig.java
index f4fd0e958..e2a066101 100644
--- a/src/main/java/com/github/dockerjava/api/model/LogConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/LogConfig.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import java.io.IOException;
+import java.io.Serializable;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -26,7 +27,8 @@
* docker will ignore them. In most cases setting the config option to null will suffice. Consult the docker remote API for a more detailed
* and up-to-date explanation of the available types and their options.
*/
-public class LogConfig {
+public class LogConfig implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("Type")
public LoggingType type = null;
diff --git a/src/main/java/com/github/dockerjava/api/model/LxcConf.java b/src/main/java/com/github/dockerjava/api/model/LxcConf.java
index aeb854285..0a60086fb 100644
--- a/src/main/java/com/github/dockerjava/api/model/LxcConf.java
+++ b/src/main/java/com/github/dockerjava/api/model/LxcConf.java
@@ -4,8 +4,12 @@
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
@JsonInclude(Include.NON_NULL)
-public class LxcConf {
+public class LxcConf implements Serializable {
+ private static final long serialVersionUID = 1L;
+
@JsonProperty("Key")
public String key;
diff --git a/src/main/java/com/github/dockerjava/api/model/Network.java b/src/main/java/com/github/dockerjava/api/model/Network.java
index 6f4114914..c0f9f36eb 100644
--- a/src/main/java/com/github/dockerjava/api/model/Network.java
+++ b/src/main/java/com/github/dockerjava/api/model/Network.java
@@ -5,6 +5,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.commons.lang.builder.ToStringBuilder;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -12,7 +13,8 @@
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
-public class Network {
+public class Network implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("Id")
private String id;
diff --git a/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java
index 1d523bf4b..8fcd8fb9b 100644
--- a/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java
+++ b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java
@@ -8,6 +8,7 @@
import com.github.dockerjava.core.RemoteApiVersion;
import org.apache.commons.lang.builder.ToStringBuilder;
+import java.io.Serializable;
import java.util.Map;
/**
@@ -16,7 +17,8 @@
*
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public class NetworkSettings {
+public class NetworkSettings implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("Bridge")
private String bridge;
diff --git a/src/main/java/com/github/dockerjava/api/model/Node.java b/src/main/java/com/github/dockerjava/api/model/Node.java
index 9e8580e0a..89b391c0a 100644
--- a/src/main/java/com/github/dockerjava/api/model/Node.java
+++ b/src/main/java/com/github/dockerjava/api/model/Node.java
@@ -4,11 +4,14 @@
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
/**
* A node as returned by the /events API, for instance, when Swarm is used.
*/
@JsonInclude(Include.NON_NULL)
-public class Node {
+public class Node implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("Name")
private String name;
diff --git a/src/main/java/com/github/dockerjava/api/model/PortBinding.java b/src/main/java/com/github/dockerjava/api/model/PortBinding.java
index e163272d7..9a30b6cd2 100644
--- a/src/main/java/com/github/dockerjava/api/model/PortBinding.java
+++ b/src/main/java/com/github/dockerjava/api/model/PortBinding.java
@@ -6,6 +6,8 @@
import com.github.dockerjava.api.model.Ports.Binding;
+import java.io.Serializable;
+
/**
* In a {@link PortBinding}, a network socket on the Docker host, expressed as a {@link Binding}, is bound to an {@link ExposedPort} of a
* container. A {@link PortBinding} corresponds to the --publish (-p) option of the docker run (and
@@ -15,7 +17,9 @@
* existing port bindings from a container configuration in {@link NetworkSettings#getPorts()} and {@link HostConfig#getPortBindings()}. In
* that context, a Map<ExposedPort, Binding[]> is used.
*/
-public class PortBinding {
+public class PortBinding implements Serializable {
+ private static final long serialVersionUID = 1L;
+
private final Binding binding;
private final ExposedPort exposedPort;
diff --git a/src/main/java/com/github/dockerjava/api/model/Ports.java b/src/main/java/com/github/dockerjava/api/model/Ports.java
index 904a31c4e..673852d9e 100644
--- a/src/main/java/com/github/dockerjava/api/model/Ports.java
+++ b/src/main/java/com/github/dockerjava/api/model/Ports.java
@@ -16,6 +16,7 @@
import org.apache.commons.lang.builder.EqualsBuilder;
import java.io.IOException;
+import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -35,7 +36,8 @@
@SuppressWarnings(value = "checkstyle:equalshashcode")
@JsonDeserialize(using = Ports.Deserializer.class)
@JsonSerialize(using = Ports.Serializer.class)
-public class Ports {
+public class Ports implements Serializable {
+ private static final long serialVersionUID = 1L;
private final Map ports = new HashMap();
diff --git a/src/main/java/com/github/dockerjava/api/model/Repository.java b/src/main/java/com/github/dockerjava/api/model/Repository.java
index 1e814a1b5..f4e4b9ab8 100644
--- a/src/main/java/com/github/dockerjava/api/model/Repository.java
+++ b/src/main/java/com/github/dockerjava/api/model/Repository.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.api.model;
+import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
@@ -8,7 +9,9 @@
/**
* A repository or image name.
*/
-public class Repository {
+public class Repository implements Serializable {
+ private static final long serialVersionUID = 1L;
+
public final String name;
/**
diff --git a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java
index 12a090db8..6663b4bf0 100644
--- a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java
+++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java
@@ -15,7 +15,6 @@
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResponseItem implements Serializable {
-
private static final long serialVersionUID = -5187169652557467828L;
@JsonProperty("stream")
diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java
index ac6c4a318..1f77b8b9d 100644
--- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java
+++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java
@@ -7,6 +7,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
/**
* Container restart policy
*
@@ -26,7 +28,8 @@
* @author Marcus Linke
*
*/
-public class RestartPolicy {
+public class RestartPolicy implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("MaximumRetryCount")
private Integer maximumRetryCount = 0;
diff --git a/src/main/java/com/github/dockerjava/api/model/SearchItem.java b/src/main/java/com/github/dockerjava/api/model/SearchItem.java
index 0a5843838..4e1663655 100644
--- a/src/main/java/com/github/dockerjava/api/model/SearchItem.java
+++ b/src/main/java/com/github/dockerjava/api/model/SearchItem.java
@@ -5,13 +5,16 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
/**
*
* @author Konstantin Pelykh (kpelykh@gmail.com)
*
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public class SearchItem {
+public class SearchItem implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("star_count")
private Integer starCount;
diff --git a/src/main/java/com/github/dockerjava/api/model/Statistics.java b/src/main/java/com/github/dockerjava/api/model/Statistics.java
index 21b9ca923..cf8c1b77e 100644
--- a/src/main/java/com/github/dockerjava/api/model/Statistics.java
+++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.api.model;
+import java.io.Serializable;
import java.util.Map;
import javax.annotation.CheckForNull;
@@ -16,7 +17,8 @@
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
-public class Statistics {
+public class Statistics implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("read")
private String read;
diff --git a/src/main/java/com/github/dockerjava/api/model/Ulimit.java b/src/main/java/com/github/dockerjava/api/model/Ulimit.java
index 7427fb0cc..abcf298bd 100644
--- a/src/main/java/com/github/dockerjava/api/model/Ulimit.java
+++ b/src/main/java/com/github/dockerjava/api/model/Ulimit.java
@@ -7,10 +7,13 @@
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
/**
* @author Vangie Du (duwan@live.com)
*/
-public class Ulimit {
+public class Ulimit implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("Name")
private String name;
diff --git a/src/main/java/com/github/dockerjava/api/model/Version.java b/src/main/java/com/github/dockerjava/api/model/Version.java
index 004c85f22..f08c411e2 100644
--- a/src/main/java/com/github/dockerjava/api/model/Version.java
+++ b/src/main/java/com/github/dockerjava/api/model/Version.java
@@ -8,6 +8,7 @@
import org.apache.commons.lang.builder.ToStringBuilder;
import javax.annotation.CheckForNull;
+import java.io.Serializable;
/**
* Used for `/version`
@@ -16,7 +17,8 @@
* @see VersionCmd
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public class Version {
+public class Version implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("ApiVersion")
private String apiVersion;
diff --git a/src/main/java/com/github/dockerjava/api/model/Volume.java b/src/main/java/com/github/dockerjava/api/model/Volume.java
index 655a8dbfc..46989f79c 100644
--- a/src/main/java/com/github/dockerjava/api/model/Volume.java
+++ b/src/main/java/com/github/dockerjava/api/model/Volume.java
@@ -3,12 +3,15 @@
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
+import java.io.Serializable;
+
/**
* Represents a bind mounted volume in a Docker container.
*
* @see Bind
*/
-public class Volume {
+public class Volume implements Serializable {
+ private static final long serialVersionUID = 1L;
private String path;
diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java
index cf9c077ab..f78fc587e 100644
--- a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java
+++ b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java
@@ -1,6 +1,10 @@
package com.github.dockerjava.api.model;
-public class VolumeBind {
+import java.io.Serializable;
+
+public class VolumeBind implements Serializable {
+ private static final long serialVersionUID = 1L;
+
private final String hostPath;
private final String containerPath;
diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java
index d8303ec84..aeef19e9f 100644
--- a/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java
+++ b/src/main/java/com/github/dockerjava/api/model/VolumeBinds.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -22,7 +23,9 @@
// This is not going to be serialized
@JsonDeserialize(using = VolumeBinds.Deserializer.class)
@JsonSerialize(using = VolumeBinds.Serializer.class)
-public class VolumeBinds {
+public class VolumeBinds implements Serializable {
+ private static final long serialVersionUID = 1L;
+
private final VolumeBind[] binds;
public VolumeBinds(VolumeBind... binds) {
diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java
index 7c4bdfb26..229cee3ed 100644
--- a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java
+++ b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import java.io.IOException;
+import java.io.Serializable;
import java.util.Map.Entry;
import org.apache.commons.lang.builder.EqualsBuilder;
@@ -29,7 +30,8 @@
@JsonDeserialize(using = VolumeRW.Deserializer.class)
@JsonSerialize(using = VolumeRW.Serializer.class)
@Deprecated
-public class VolumeRW {
+public class VolumeRW implements Serializable {
+ private static final long serialVersionUID = 1L;
private Volume volume;
diff --git a/src/main/java/com/github/dockerjava/api/model/Volumes.java b/src/main/java/com/github/dockerjava/api/model/Volumes.java
index 46175548d..3246b0e8e 100644
--- a/src/main/java/com/github/dockerjava/api/model/Volumes.java
+++ b/src/main/java/com/github/dockerjava/api/model/Volumes.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -21,7 +22,8 @@
@JsonSerialize(using = Volumes.Serializer.class)
@JsonDeserialize(using = Volumes.Deserializer.class)
-public class Volumes {
+public class Volumes implements Serializable {
+ private static final long serialVersionUID = 1L;
private Volume[] volumes;
diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java
index f027b6d71..fb52ff3f7 100644
--- a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java
+++ b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import java.io.IOException;
+import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
@@ -19,7 +20,8 @@
@JsonSerialize(using = VolumesFrom.Serializer.class)
@JsonDeserialize(using = VolumesFrom.Deserializer.class)
-public class VolumesFrom {
+public class VolumesFrom implements Serializable {
+ private static final long serialVersionUID = 1L;
private String container;
diff --git a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java
index f54f8242c..1b12bd13d 100644
--- a/src/main/java/com/github/dockerjava/api/model/VolumesRW.java
+++ b/src/main/java/com/github/dockerjava/api/model/VolumesRW.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.api.model;
import java.io.IOException;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -22,7 +23,9 @@
// This is not going to be serialized
@JsonSerialize(using = VolumesRW.Serializer.class)
@JsonDeserialize(using = VolumesRW.Deserializer.class)
-public class VolumesRW {
+public class VolumesRW implements Serializable {
+ private static final long serialVersionUID = 1L;
+
private final VolumeRW[] volumesRW;
public VolumesRW(VolumeRW... binds) {
diff --git a/src/main/java/com/github/dockerjava/api/model/WaitResponse.java b/src/main/java/com/github/dockerjava/api/model/WaitResponse.java
index a2ab16f6f..0cab338b2 100644
--- a/src/main/java/com/github/dockerjava/api/model/WaitResponse.java
+++ b/src/main/java/com/github/dockerjava/api/model/WaitResponse.java
@@ -3,11 +3,14 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
/**
* Represents a wait container command response
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-public class WaitResponse {
+public class WaitResponse implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("StatusCode")
private Integer statusCode;
diff --git a/src/test/java/com/github/dockerjava/api/ModelsSerializableTest.java b/src/test/java/com/github/dockerjava/api/ModelsSerializableTest.java
new file mode 100644
index 000000000..770b136c9
--- /dev/null
+++ b/src/test/java/com/github/dockerjava/api/ModelsSerializableTest.java
@@ -0,0 +1,63 @@
+package com.github.dockerjava.api;
+
+import com.github.dockerjava.api.model.Binds;
+import com.github.dockerjava.api.model.BuildResponseItem;
+import com.github.dockerjava.api.model.PullResponseItem;
+import com.github.dockerjava.api.model.PushResponseItem;
+import com.github.dockerjava.api.model.ResponseItem;
+import com.google.common.reflect.ClassPath.ClassInfo;
+import org.apache.commons.lang.reflect.FieldUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+
+import static com.google.common.reflect.ClassPath.from;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.object.IsCompatibleType.typeCompatibleWith;
+import static org.junit.Assert.assertThat;
+
+/**
+ * @author Kanstantsin Shautsou
+ */
+public class ModelsSerializableTest {
+ private static final Logger LOG = LoggerFactory.getLogger(ModelsSerializableTest.class);
+
+ private List excludeClasses = Arrays.asList(
+ Binds.class.getName(),
+ BuildResponseItem.class.getName(),
+ PullResponseItem.class.getName(),
+ PushResponseItem.class.getName(),
+ ResponseItem.class.getName()
+ );
+
+ @Test
+ public void allModelsSerializable() throws IOException, NoSuchFieldException, IllegalAccessException {
+ final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ for (ClassInfo classInfo : from(contextClassLoader).getTopLevelClasses("com.github.dockerjava.api.model")) {
+ if (classInfo.getName().endsWith("Test")) {
+ continue;
+ }
+
+ final Class> aClass = classInfo.load();
+ if (aClass.getProtectionDomain().getCodeSource().getLocation().getPath().endsWith("test-classes/")
+ || aClass.isEnum()) {
+ continue;
+ }
+
+ LOG.debug("aClass: {}", aClass);
+ assertThat(aClass, typeCompatibleWith(Serializable.class));
+
+ final Object serialVersionUID = FieldUtils.readDeclaredStaticField(aClass, "serialVersionUID", true);
+ if (!excludeClasses.contains(aClass.getName())) {
+ assertThat(serialVersionUID, instanceOf(Long.class));
+ assertThat("Follow devel docs", (Long) serialVersionUID, is(1L));
+ }
+ }
+ }
+}
From 0183bd6271d09be07c38bfdda27d473f44f34225 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 19 Aug 2016 00:46:48 +0300
Subject: [PATCH 117/736] Update CHANGELOG.md
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bd6c2d278..e2361ea85 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@ Change Log
===
## Next
+## 3.0.7
+ * Make all models Serializable
+
## 3.0.5
* Events updated to 1.24 API model.
From e7c5f278fcf783023a6a94c422da50aa85c84437 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 19 Aug 2016 00:47:09 +0300
Subject: [PATCH 118/736] Typo
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e2361ea85..8582d4eef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@ Change Log
===
## Next
-## 3.0.7
+## 3.0.6
* Make all models Serializable
## 3.0.5
From 75309ffdeed2dcca8e679e6580a308f2e61527aa Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 19 Aug 2016 02:13:36 +0300
Subject: [PATCH 119/736] Add maven-central link
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index e65215648..039657807 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[]()
+[](https://mvnrepository.com/artifact/com.github.docker-java/docker-java)
[](https://bintray.com/kostyasha/maven/com.github.docker-java%3Adocker-java/_latestVersion)
[](https://www.versioneye.com/java/com.github.docker-java:docker-java/references)
[](https://travis-ci.org/docker-java/docker-java)
From c8ab23f0609cb2323114f5ce41cdce87627f956e Mon Sep 17 00:00:00 2001
From: tejksat
Date: Sun, 28 Aug 2016 18:00:03 +0300
Subject: [PATCH 120/736] Fix for #670 (#680)
JSON decoding disabled on /images/load command execution.
---
.../dockerjava/netty/InvocationBuilder.java | 31 +++++++++++++++++++
.../netty/exec/LoadImageCmdExec.java | 7 ++---
2 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java
index 9669d6818..d76918bcb 100644
--- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java
+++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java
@@ -69,6 +69,12 @@ public void onNext(T object) {
}
}
+ public class SkipResultCallback extends ResultCallbackTemplate, Void> {
+ @Override
+ public void onNext(Void object) {
+ }
+ }
+
private ChannelProvider channelProvider;
private String resource;
@@ -401,6 +407,31 @@ public void post(TypeReference typeReference, ResultCallback resultCal
channel.pipeline().addLast(new JsonObjectDecoder());
channel.pipeline().addLast(jsonResponseHandler);
+ postChunkedStreamRequest(requestProvider, channel, body);
+ }
+
+ public void postStream(InputStream body) {
+ SkipResultCallback resultCallback = new SkipResultCallback();
+
+ HttpRequestProvider requestProvider = httpPostRequestProvider(null);
+
+ Channel channel = getChannel();
+
+ HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback);
+
+ channel.pipeline().addLast(new ChunkedWriteHandler());
+ channel.pipeline().addLast(responseHandler);
+
+ postChunkedStreamRequest(requestProvider, channel, body);
+
+ try {
+ resultCallback.awaitCompletion();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void postChunkedStreamRequest(HttpRequestProvider requestProvider, Channel channel, InputStream body) {
HttpRequest request = requestProvider.getHttpRequest(resource);
// don't accept FullHttpRequest here
diff --git a/src/main/java/com/github/dockerjava/netty/exec/LoadImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/LoadImageCmdExec.java
index 23581119f..30ee716a5 100644
--- a/src/main/java/com/github/dockerjava/netty/exec/LoadImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/netty/exec/LoadImageCmdExec.java
@@ -3,7 +3,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.fasterxml.jackson.core.type.TypeReference;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.netty.WebTarget;
@@ -22,8 +21,8 @@ protected Void execute(LoadImageCmd command) {
WebTarget webResource = getBaseResource().path("/images/load");
LOGGER.trace("POST: {}", webResource);
- return webResource.request()
- .post(new TypeReference() {
- }, command.getImageStream());
+ webResource.request().postStream(command.getImageStream());
+
+ return null;
}
}
From f44616f0808e1caede610594a769327a38158687 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jakub=20Kubry=C5=84ski?=
Date: Sun, 28 Aug 2016 17:43:31 +0200
Subject: [PATCH 121/736] Fix #682 - Add LogPath to docker inspect response
(#683)
* Fix #682 - Add LogPath to docker inspect response
* Fix #682 - Add LogPath to docker inspect response - fixes after code review
* Fix #682 - Add LogPath to docker inspect response - add javadoc
* Fix #682 - Add LogPath to docker inspect response - clean test assertion
---
.../api/command/InspectContainerResponse.java | 11 +++++++++++
.../api/command/InspectContainerResponseTest.java | 2 ++
2 files changed, 13 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
index 59a267e9d..c8027b0ed 100644
--- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
+++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
@@ -53,6 +53,12 @@ public class InspectContainerResponse {
@JsonProperty("HostsPath")
private String hostsPath;
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_17}
+ */
+ @JsonProperty("LogPath")
+ private String logPath;
+
@JsonProperty("Id")
private String id;
@@ -168,6 +174,11 @@ public String getHostsPath() {
return hostsPath;
}
+ @CheckForNull
+ public String getLogPath() {
+ return logPath;
+ }
+
public String getName() {
return name;
}
diff --git a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java
index f64cf4ead..cd4562b4a 100644
--- a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java
+++ b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java
@@ -22,6 +22,7 @@
import static com.github.dockerjava.test.serdes.JSONTestHelper.testRoundTrip;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.IsNot.not;
@@ -51,6 +52,7 @@ public void roundTrip_full() throws IOException {
assertEquals(response.getVolumesRW()[1].getVolume().getPath(), "/bar/foo/myvol2");
assertFalse(response.getVolumesRW()[1].getAccessMode().toBoolean());
assertTrue(response.getVolumesRW()[0].getAccessMode().toBoolean());
+ assertThat(response.getLogPath(), is("/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1-json.log"));
}
@Test
From bcb2ab947ff1020dfd89838a29d540bf802e2e31 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sun, 28 Aug 2016 18:45:25 +0300
Subject: [PATCH 122/736] Update CHANGELOG.md
---
CHANGELOG.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8582d4eef..735283ae8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,9 @@ Change Log
## Next
## 3.0.6
- * Make all models Serializable
+ * Make all models Serializable.
+ * [NETTY] Fix loadImage responce on 1.24 API.
+ * LogPath field for inspect container.
## 3.0.5
* Events updated to 1.24 API model.
From d9f6969e0c8bb7756c0d4301b23688477e3da2d5 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Sun, 28 Aug 2016 21:10:49 +0300
Subject: [PATCH 123/736] Wait more for this test
---
.../dockerjava/netty/exec/AttachContainerCmdExecTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
index d3e8094cf..8b5759c69 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
@@ -115,7 +115,7 @@ public void onNext(Frame frame) {
.withFollowStream(true)
.withStdIn(stdin)
.exec(callback)
- .awaitCompletion(15, SECONDS);
+ .awaitCompletion(30, SECONDS);
callback.close();
assertThat(callback.toString(), containsString(snippet));
From 615c89f30ee301ba47bd5ef82a7549b251a7be5f Mon Sep 17 00:00:00 2001
From: tejksat
Date: Wed, 31 Aug 2016 01:05:13 +0300
Subject: [PATCH 124/736] Fix for #687
---
.../exec/AttachContainerCmdExecTest.java | 20 ++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
index 8b5759c69..66219dc72 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java
@@ -6,11 +6,10 @@
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
-import java.io.ByteArrayInputStream;
import java.io.File;
-import java.io.InputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
import java.lang.reflect.Method;
-import java.util.concurrent.TimeUnit;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
@@ -93,8 +92,6 @@ public void attachContainerWithStdin() throws Exception {
dockerClient.startContainerCmd(container.getId()).exec();
- Thread.sleep(SECONDS.toMillis(10)); //wait bash initialisation
-
InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
assertTrue(inspectContainerResponse.getState().getRunning());
@@ -107,15 +104,20 @@ public void onNext(Frame frame) {
}
};
- InputStream stdin = new ByteArrayInputStream((snippet + "\n").getBytes());
+ PipedOutputStream out = new PipedOutputStream();
+ PipedInputStream in = new PipedInputStream(out);
dockerClient.attachContainerCmd(container.getId())
.withStdErr(true)
.withStdOut(true)
.withFollowStream(true)
- .withStdIn(stdin)
- .exec(callback)
- .awaitCompletion(30, SECONDS);
+ .withStdIn(in)
+ .exec(callback);
+
+ out.write((snippet + "\n").getBytes());
+ out.flush();
+
+ callback.awaitCompletion(15, SECONDS);
callback.close();
assertThat(callback.toString(), containsString(snippet));
From 74d506dca45c0cc64f567311227c7108ca0101c6 Mon Sep 17 00:00:00 2001
From: tejksat
Date: Mon, 5 Sep 2016 08:42:35 +0300
Subject: [PATCH 125/736] Fix http response input stream resource leak (#633)
there are several problems in the original code:
- not releasing `ByteBuf` queued;
- queuing `ByteBuf` until all data is read what effectively leads to `OutOfDirectMemoryError` if the data read is too big. This happens if you try to copy too big file or folder from a container. To fix this `ResponseCallback` (which in `awaitResult()` waits in fact for `readComplete()` channel method invocation) replaced with `AsyncResultCallback`;
- actually queuing `ByteBuf` anyway leads to `OutOfDirectMemoryError` if data consumption is slower (the next point) than obtaining it;
- poor performance because of the byte-by-byte reads.
---
.../dockerjava/netty/InvocationBuilder.java | 56 ++++++-
.../handler/HttpResponseStreamHandler.java | 137 ++++++++++++++----
.../netty/exec/SaveImageCmdExecTest.java | 5 +-
.../HttpResponseStreamHandlerTest.java | 90 +++++++++++-
4 files changed, 249 insertions(+), 39 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java
index d76918bcb..26b950e4e 100644
--- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java
+++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java
@@ -27,6 +27,7 @@
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.CountDownLatch;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -75,6 +76,57 @@ public void onNext(Void object) {
}
}
+ /**
+ * Implementation of {@link ResultCallback} with the single result event expected.
+ */
+ public static class AsyncResultCallback
+ extends ResultCallbackTemplate, A_RES_T> {
+
+ private A_RES_T result = null;
+
+ private final CountDownLatch resultReady = new CountDownLatch(1);
+
+ @Override
+ public void onNext(A_RES_T object) {
+ onResult(object);
+ }
+
+ private void onResult(A_RES_T object) {
+ if (resultReady.getCount() == 0) {
+ throw new IllegalStateException("Result has already been set");
+ }
+
+ try {
+ result = object;
+ } finally {
+ resultReady.countDown();
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ try {
+ super.close();
+ } finally {
+ resultReady.countDown();
+ }
+ }
+
+ /**
+ * Blocks until {@link ResultCallback#onNext(Object)} was called for the first time
+ */
+ @SuppressWarnings("unchecked")
+ public A_RES_T awaitResult() {
+ try {
+ resultReady.await();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ getFirstError();
+ return result;
+ }
+ }
+
private ChannelProvider channelProvider;
private String resource;
@@ -203,7 +255,7 @@ public InputStream post(final Object entity) {
Channel channel = getChannel();
- ResponseCallback callback = new ResponseCallback();
+ AsyncResultCallback callback = new AsyncResultCallback<>();
HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, callback);
HttpResponseStreamHandler streamHandler = new HttpResponseStreamHandler(callback);
@@ -454,7 +506,7 @@ public InputStream get() {
Channel channel = getChannel();
- ResponseCallback resultCallback = new ResponseCallback();
+ AsyncResultCallback resultCallback = new AsyncResultCallback<>();
HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback);
diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java
index 706228d04..596334640 100644
--- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java
+++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java
@@ -6,9 +6,6 @@
import java.io.IOException;
import java.io.InputStream;
-import java.util.concurrent.LinkedTransferQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
import com.github.dockerjava.api.async.ResultCallback;
@@ -19,45 +16,87 @@
*/
public class HttpResponseStreamHandler extends SimpleChannelInboundHandler {
- private HttpResponseInputStream stream = new HttpResponseInputStream();
+ private ResultCallback resultCallback;
+
+ private final HttpResponseInputStream stream = new HttpResponseInputStream();
public HttpResponseStreamHandler(ResultCallback resultCallback) {
- resultCallback.onNext(stream);
+ this.resultCallback = resultCallback;
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
+ invokeCallbackOnFirstRead();
+
stream.write(msg.copy());
}
+ private void invokeCallbackOnFirstRead() {
+ if (resultCallback != null) {
+ resultCallback.onNext(stream);
+ resultCallback = null;
+ }
+ }
+
@Override
- public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
- stream.close();
- super.channelReadComplete(ctx);
+ public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+ stream.writeComplete();
+
+ super.channelInactive(ctx);
}
public static class HttpResponseInputStream extends InputStream {
- private AtomicBoolean closed = new AtomicBoolean(false);
+ private boolean writeCompleted = false;
- private LinkedTransferQueue queue = new LinkedTransferQueue();
+ private boolean closed = false;
private ByteBuf current = null;
- public void write(ByteBuf byteBuf) {
- queue.put(byteBuf);
+ private final Object lock = new Object();
+
+ public void write(ByteBuf byteBuf) throws InterruptedException {
+ synchronized (lock) {
+ if (closed) {
+ return;
+ }
+ while (current != null) {
+ lock.wait();
+
+ if (closed) {
+ return;
+ }
+ }
+ current = byteBuf;
+
+ lock.notifyAll();
+ }
+ }
+
+ public void writeComplete() {
+ synchronized (lock) {
+ writeCompleted = true;
+
+ lock.notifyAll();
+ }
}
@Override
public void close() throws IOException {
- closed.set(true);
- super.close();
+ synchronized (lock) {
+ closed = true;
+ releaseCurrent();
+
+ lock.notifyAll();
+ }
}
@Override
public int available() throws IOException {
- poll();
- return readableBytes();
+ synchronized (lock) {
+ poll(0);
+ return readableBytes();
+ }
}
private int readableBytes() {
@@ -66,34 +105,72 @@ private int readableBytes() {
} else {
return 0;
}
-
}
@Override
public int read() throws IOException {
+ byte[] b = new byte[1];
+ int n = read(b, 0, 1);
+ return n != -1 ? b[0] : -1;
+ }
- poll();
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ synchronized (lock) {
+ off = poll(off);
- if (readableBytes() == 0) {
- if (closed.get()) {
+ if (current == null) {
return -1;
+ } else {
+ int availableBytes = Math.min(len, current.readableBytes() - off);
+ current.readBytes(b, off, availableBytes);
+ return availableBytes;
}
}
+ }
- if (current != null && current.readableBytes() > 0) {
- return current.readByte() & 0xff;
- } else {
- return read();
+ private int poll(int off) throws IOException {
+ synchronized (lock) {
+ while (readableBytes() <= off) {
+ try {
+ if (closed) {
+ throw new IOException("Stream closed");
+ }
+
+ off -= releaseCurrent();
+ if (writeCompleted) {
+ return off;
+ }
+ while (current == null) {
+ lock.wait();
+
+ if (closed) {
+ throw new IOException("Stream closed");
+ }
+ if (writeCompleted && current == null) {
+ return off;
+ }
+ }
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return off;
}
}
- private void poll() {
- if (readableBytes() == 0) {
- try {
- current = queue.poll(50, TimeUnit.MILLISECONDS);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
+ private int releaseCurrent() {
+ synchronized (lock) {
+ if (current != null) {
+ int n = current.readableBytes();
+ current.release();
+ current = null;
+
+ lock.notifyAll();
+
+ return n;
}
+ return 0;
}
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/SaveImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/SaveImageCmdExecTest.java
index 0527b793f..a2fab38a7 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/SaveImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/SaveImageCmdExecTest.java
@@ -47,8 +47,9 @@ public void afterMethod(ITestResult result) {
@Test
public void saveImage() throws Exception {
- InputStream image = IOUtils.toBufferedInputStream(dockerClient.saveImageCmd("busybox").exec());
- assertThat(image.available(), greaterThan(0));
+ try (InputStream image = dockerClient.saveImageCmd("busybox").exec()) {
+ assertThat(image.available(), greaterThan(0));
+ }
}
diff --git a/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java b/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java
index 6652f3eba..eea9ddc0f 100644
--- a/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java
+++ b/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java
@@ -1,13 +1,21 @@
package com.github.dockerjava.netty.handler;
+import static com.github.dockerjava.netty.handler.HttpResponseStreamHandler.HttpResponseInputStream;
+import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
-import java.io.InputStream;
-
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
import org.apache.commons.io.IOUtils;
import org.mockito.Mockito;
import org.testng.annotations.Test;
@@ -25,9 +33,81 @@ public void testNoBytesSkipped() throws Exception {
ChannelHandlerContext ctx = Mockito.mock(ChannelHandlerContext.class);
ByteBuf buffer = generateByteBuf();
streamHandler.channelRead0(ctx, buffer);
- streamHandler.channelReadComplete(ctx);
+ streamHandler.channelInactive(ctx);
+
+ try (InputStream inputStream = callback.getInputStream()) {
+ assertTrue(IOUtils.contentEquals(inputStream, new ByteBufInputStream(buffer)));
+ }
+ }
+
+ @Test
+ public void testReadByteByByte() throws Exception {
+ ResultCallbackTest callback = new ResultCallbackTest();
+ HttpResponseStreamHandler streamHandler = new HttpResponseStreamHandler(callback);
+ ChannelHandlerContext ctx = Mockito.mock(ChannelHandlerContext.class);
+ ByteBuf buffer = generateByteBuf();
+ streamHandler.channelRead0(ctx, buffer);
+ streamHandler.channelInactive(ctx);
+
+ try (InputStream inputStream = callback.getInputStream()) {
+ for (int i = 0; i < buffer.readableBytes(); i++) {
+ int b = inputStream.read();
+ assertEquals(b, buffer.getByte(i));
+ }
+ assertTrue(inputStream.read() == -1);
+ }
+ }
+
+ @Test
+ public void testCloseResponseStreamBeforeWrite() throws Exception {
+ HttpResponseInputStream inputStream = new HttpResponseInputStream();
+ ByteBuf buffer = generateByteBuf();
+
+ inputStream.write(buffer);
+ inputStream.close();
+ inputStream.write(buffer);
+ }
+
+ @Test
+ public void testCloseResponseStreamOnWrite() throws Exception {
+ final HttpResponseInputStream inputStream = new HttpResponseInputStream();
+
+ final ByteBuf buffer = generateByteBuf();
+
+ final CountDownLatch firstWrite = new CountDownLatch(1);
+
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ Future> submit = executor.submit(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ inputStream.write(buffer);
+ firstWrite.countDown();
+ inputStream.write(buffer);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+
+ firstWrite.await();
+ assertTrue(inputStream.available() > 0);
+
+ // second write should have started
+ Thread.sleep(500L);
+ inputStream.close();
+
+ submit.get();
+ }
+
+ @Test(expectedExceptions = IOException.class)
+ public void testReadClosedResponseStream() throws Exception {
+ HttpResponseInputStream inputStream = new HttpResponseInputStream();
+ ByteBuf buffer = generateByteBuf();
- assertTrue(IOUtils.contentEquals(callback.getInputStream(), new ByteBufInputStream(buffer)));
+ inputStream.write(buffer);
+ inputStream.close();
+ inputStream.read();
}
private ByteBuf generateByteBuf() {
@@ -46,7 +126,7 @@ public void onNext(InputStream stream) {
this.stream = stream;
}
- public InputStream getInputStream() {
+ private InputStream getInputStream() {
return stream;
}
}
From d07e2f6be5ee4f87dd97ce725e0b9fe22c66cd8b Mon Sep 17 00:00:00 2001
From: Jiapeng Yang
Date: Sat, 10 Sep 2016 01:26:56 +0800
Subject: [PATCH 126/736] =?UTF-8?q?Bugfix:donot=20throw=20RuntimeException?=
=?UTF-8?q?=20when=20a=20error=20occured=20in=20awaitComp=E2=80=A6=20(#700?=
=?UTF-8?q?)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Bugfix:donot throw RuntimeException when a error occured in awaitCompletion(long,TimeUnit)
* Fix indentation
* fix format error,use docker-java-formatter.xml
---
.../github/dockerjava/core/async/ResultCallbackTemplate.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java
index f120012af..2437fc878 100644
--- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java
+++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java
@@ -99,7 +99,9 @@ public RC_T awaitCompletion() throws InterruptedException {
* before {@link ResultCallback#onComplete()} was called.
*/
public boolean awaitCompletion(long timeout, TimeUnit timeUnit) throws InterruptedException {
- return completed.await(timeout, timeUnit);
+ boolean result = completed.await(timeout, timeUnit);
+ getFirstError();
+ return result;
}
/**
From 95e5075874a355bb90a365de52082932278ed9a3 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 9 Sep 2016 20:27:56 +0300
Subject: [PATCH 127/736] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 735283ae8..f8b6dcd86 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@ Change Log
* Make all models Serializable.
* [NETTY] Fix loadImage responce on 1.24 API.
* LogPath field for inspect container.
+ * [#700] (https://github.com/docker-java/docker-java/pull/700) Bugfix:donot throw RuntimeException when a error occured in awaitCompletion(long,TimeUnit)
## 3.0.5
* Events updated to 1.24 API model.
From d39d7f210ab6c9190b21b70f3ec6117e5d4f9864 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Sat, 10 Sep 2016 18:54:03 +0200
Subject: [PATCH 128/736] Fix issue with jersey and unix domain sockets (#697)
---
.gitignore | 3 +-
pom.xml | 29 +-
.../core/async/ResultCallbackTemplate.java | 10 +-
.../util/WrappedResponseInputStream.java | 5 +-
.../http/impl/io/ChunkedInputStream.java | 337 ++++++++++++++
.../newsclub/net/unix/AFUNIXSocketImpl.java | 415 ++++++++++++++++++
.../core/command/EventsCmdImplTest.java | 120 ++---
.../command/StopContainerCmdImplTest.java | 8 +-
.../command/UpdateContainerCmdImplTest.java | 4 +-
.../netty/exec/EventsCmdExecTest.java | 116 ++---
.../netty/exec/StopContainerCmdExecTest.java | 12 +-
.../exec/UpdateContainerCmdExecTest.java | 4 +-
12 files changed, 914 insertions(+), 149 deletions(-)
create mode 100644 src/main/java/org/apache/http/impl/io/ChunkedInputStream.java
create mode 100644 src/main/java/org/newsclub/net/unix/AFUNIXSocketImpl.java
diff --git a/.gitignore b/.gitignore
index 8f1fdc779..a705c1129 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,4 +21,5 @@ target
*.log
#Ignore Test Output
-test-output
\ No newline at end of file
+test-output
+/.checkstyle
diff --git a/pom.xml b/pom.xml
index b1b6d96a9..5cc227ee3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,4 +1,5 @@
-
+4.0.0
@@ -67,7 +68,7 @@
1.7.211.54
- 2015-01-27T15-02-14
+ 2.0.419.0
@@ -115,11 +116,15 @@
${jersey.version}
- de.gesellix
- unix-socket-factory
- ${unix-socket-factory.version}
+ com.kohlschutter.junixsocket
+ junixsocket-common
+ ${junixsocket.version}
+
+
+ com.kohlschutter.junixsocket
+ junixsocket-native-common
+ ${junixsocket.version}
-
org.apache.commonscommons-compress
@@ -266,13 +271,6 @@
-
-
-
-
-
-
-
@@ -419,7 +417,7 @@
true1integration
- integration-auth
+ integration-auth**/*Test.java
@@ -483,7 +481,8 @@
truetruefalse
-
+
src/test/resources/checkstyle/checkstyle-config.xml
diff --git a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java
index 2437fc878..2238dfcea 100644
--- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java
+++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java
@@ -75,11 +75,13 @@ public void onComplete() {
@Override
public void close() throws IOException {
- closed = true;
- if (stream != null) {
- stream.close();
+ if (!closed) {
+ closed = true;
+ if (stream != null) {
+ stream.close();
+ }
+ completed.countDown();
}
- completed.countDown();
}
/**
diff --git a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java
index afe0dce92..4ec74ddcc 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java
@@ -53,9 +53,12 @@ public int available() throws IOException {
}
public void close() throws IOException {
+ if (closed) {
+ return;
+ }
closed = true;
- response.close();
delegate.close();
+ response.close();
}
public void mark(int readlimit) {
diff --git a/src/main/java/org/apache/http/impl/io/ChunkedInputStream.java b/src/main/java/org/apache/http/impl/io/ChunkedInputStream.java
new file mode 100644
index 000000000..17c339e3e
--- /dev/null
+++ b/src/main/java/org/apache/http/impl/io/ChunkedInputStream.java
@@ -0,0 +1,337 @@
+// Modified version (see https://github.com/docker-java/docker-java/pull/697)
+/*
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ *
+ */
+
+package org.apache.http.impl.io;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.http.ConnectionClosedException;
+import org.apache.http.Header;
+import org.apache.http.HttpException;
+import org.apache.http.MalformedChunkCodingException;
+import org.apache.http.TruncatedChunkException;
+import org.apache.http.config.MessageConstraints;
+import org.apache.http.io.BufferInfo;
+import org.apache.http.io.SessionInputBuffer;
+import org.apache.http.util.Args;
+import org.apache.http.util.CharArrayBuffer;
+
+/**
+ * Implements chunked transfer coding. The content is received in small chunks.
+ * Entities transferred using this input stream can be of unlimited length.
+ * After the stream is read to the end, it provides access to the trailers,
+ * if any.
+ *
+ * Note that this class NEVER closes the underlying stream, even when close
+ * gets called. Instead, it will read until the "end" of its chunking on
+ * close, which allows for the seamless execution of subsequent HTTP 1.1
+ * requests, while not requiring the client to remember to read the entire
+ * contents of the response.
+ *
+ *
+ * @since 4.0
+ *
+ */
+public class ChunkedInputStream extends InputStream {
+
+ private static final int CHUNK_LEN = 1;
+ private static final int CHUNK_DATA = 2;
+ private static final int CHUNK_CRLF = 3;
+ private static final int CHUNK_INVALID = Integer.MAX_VALUE;
+
+ private static final int BUFFER_SIZE = 2048;
+
+ /** The session input buffer */
+ private final SessionInputBuffer in;
+ private final CharArrayBuffer buffer;
+ private final MessageConstraints constraints;
+
+ private int state;
+
+ /** The chunk size */
+ private long chunkSize;
+
+ /** The current position within the current chunk */
+ private long pos;
+
+ /** True if we've reached the end of stream */
+ private boolean eof = false;
+
+ /** True if this stream is closed */
+ private boolean closed = false;
+
+ private Header[] footers = new Header[] {};
+
+ /**
+ * Wraps session input stream and reads chunk coded input.
+ *
+ * @param in The session input buffer
+ * @param constraints Message constraints. If {@code null}
+ * {@link MessageConstraints#DEFAULT} will be used.
+ *
+ * @since 4.4
+ */
+ public ChunkedInputStream(final SessionInputBuffer in, final MessageConstraints constraints) {
+ super();
+ this.in = Args.notNull(in, "Session input buffer");
+ this.pos = 0L;
+ this.buffer = new CharArrayBuffer(16);
+ this.constraints = constraints != null ? constraints : MessageConstraints.DEFAULT;
+ this.state = CHUNK_LEN;
+ }
+
+ /**
+ * Wraps session input stream and reads chunk coded input.
+ *
+ * @param in The session input buffer
+ */
+ public ChunkedInputStream(final SessionInputBuffer in) {
+ this(in, null);
+ }
+
+ @Override
+ public int available() throws IOException {
+ if (this.in instanceof BufferInfo) {
+ final int len = ((BufferInfo) this.in).length();
+ return (int) Math.min(len, this.chunkSize - this.pos);
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ *
Returns all the data in a chunked stream in coalesced form. A chunk
+ * is followed by a CRLF. The method returns -1 as soon as a chunksize of 0
+ * is detected.
+ *
+ *
Trailer headers are read automatically at the end of the stream and
+ * can be obtained with the getResponseFooters() method.
+ *
+ * @return -1 of the end of the stream has been reached or the next data
+ * byte
+ * @throws IOException in case of an I/O error
+ */
+ @Override
+ public int read() throws IOException {
+ if (this.closed) {
+ throw new IOException("Attempted read from closed stream.");
+ }
+ if (this.eof) {
+ return -1;
+ }
+ if (state != CHUNK_DATA) {
+ nextChunk();
+ if (this.eof) {
+ return -1;
+ }
+ }
+ final int b = in.read();
+ if (b != -1) {
+ pos++;
+ if (pos >= chunkSize) {
+ state = CHUNK_CRLF;
+ }
+ }
+ return b;
+ }
+
+ /**
+ * Read some bytes from the stream.
+ * @param b The byte array that will hold the contents from the stream.
+ * @param off The offset into the byte array at which bytes will start to be
+ * placed.
+ * @param len the maximum number of bytes that can be returned.
+ * @return The number of bytes returned or -1 if the end of stream has been
+ * reached.
+ * @throws IOException in case of an I/O error
+ */
+ @Override
+ public int read(final byte[] b, final int off, final int len) throws IOException {
+
+ if (closed) {
+ throw new IOException("Attempted read from closed stream.");
+ }
+
+ if (eof) {
+ return -1;
+ }
+ if (state != CHUNK_DATA) {
+ nextChunk();
+ if (eof) {
+ return -1;
+ }
+ }
+ final int bytesRead = in.read(b, off, (int) Math.min(len, chunkSize - pos));
+ if (bytesRead != -1) {
+ pos += bytesRead;
+ if (pos >= chunkSize) {
+ state = CHUNK_CRLF;
+ }
+ return bytesRead;
+ } else {
+ eof = true;
+ throw new TruncatedChunkException("Truncated chunk "
+ + "( expected size: " + chunkSize
+ + "; actual size: " + pos + ")");
+ }
+ }
+
+ /**
+ * Read some bytes from the stream.
+ * @param b The byte array that will hold the contents from the stream.
+ * @return The number of bytes returned or -1 if the end of stream has been
+ * reached.
+ * @throws IOException in case of an I/O error
+ */
+ @Override
+ public int read(final byte[] b) throws IOException {
+ return read(b, 0, b.length);
+ }
+
+ /**
+ * Read the next chunk.
+ * @throws IOException in case of an I/O error
+ */
+ private void nextChunk() throws IOException {
+ if (state == CHUNK_INVALID) {
+ throw new MalformedChunkCodingException("Corrupt data stream");
+ }
+ try {
+ chunkSize = getChunkSize();
+ if (chunkSize < 0L) {
+ throw new MalformedChunkCodingException("Negative chunk size");
+ }
+ state = CHUNK_DATA;
+ pos = 0L;
+ if (chunkSize == 0L) {
+ eof = true;
+ parseTrailerHeaders();
+ }
+ } catch (MalformedChunkCodingException ex) {
+ state = CHUNK_INVALID;
+ throw ex;
+ }
+ }
+
+ /**
+ * Expects the stream to start with a chunksize in hex with optional
+ * comments after a semicolon. The line must end with a CRLF: "a3; some
+ * comment\r\n" Positions the stream at the start of the next line.
+ */
+ private long getChunkSize() throws IOException {
+ final int st = this.state;
+ switch (st) {
+ case CHUNK_CRLF:
+ this.buffer.clear();
+ final int bytesRead1 = this.in.readLine(this.buffer);
+ if (bytesRead1 == -1) {
+ throw new MalformedChunkCodingException(
+ "CRLF expected at end of chunk");
+ }
+ if (!this.buffer.isEmpty()) {
+ throw new MalformedChunkCodingException(
+ "Unexpected content at the end of chunk");
+ }
+ state = CHUNK_LEN;
+ //$FALL-THROUGH$
+ case CHUNK_LEN:
+ this.buffer.clear();
+ final int bytesRead2 = this.in.readLine(this.buffer);
+ if (bytesRead2 == -1) {
+ throw new ConnectionClosedException("Premature end of chunk coded message body: " +
+ "closing chunk expected");
+ }
+ int separator = this.buffer.indexOf(';');
+ if (separator < 0) {
+ separator = this.buffer.length();
+ }
+ final String s = this.buffer.substringTrimmed(0, separator);
+ try {
+ return Long.parseLong(s, 16);
+ } catch (final NumberFormatException e) {
+ throw new MalformedChunkCodingException("Bad chunk header: " + s);
+ }
+ default:
+ throw new IllegalStateException("Inconsistent codec state");
+ }
+ }
+
+ /**
+ * Reads and stores the Trailer headers.
+ * @throws IOException in case of an I/O error
+ */
+ private void parseTrailerHeaders() throws IOException {
+ try {
+ this.footers = AbstractMessageParser.parseHeaders(in,
+ constraints.getMaxHeaderCount(),
+ constraints.getMaxLineLength(),
+ null);
+ } catch (final HttpException ex) {
+ final IOException ioe = new MalformedChunkCodingException("Invalid footer: "
+ + ex.getMessage());
+ ioe.initCause(ex);
+ throw ioe;
+ }
+ }
+
+ /**
+ * Upon close, this reads the remainder of the chunked message,
+ * leaving the underlying socket at a position to start reading the
+ * next response without scanning.
+ * @throws IOException in case of an I/O error
+ */
+ @Override
+ public void close() throws IOException {
+ if (!closed) {
+ try {
+ if (!eof && state != CHUNK_INVALID) {
+ // read and discard the remainder of the message
+ final byte[] buff = new byte[BUFFER_SIZE];
+ try {
+ while (read(buff) >= 0) {
+ continue;
+ }
+ } catch (ConnectionClosedException e) {
+ // just ignore
+ } catch (TruncatedChunkException e) {
+ // just ignore
+ }
+ }
+ } finally {
+ eof = true;
+ closed = true;
+ }
+ }
+ }
+
+ public Header[] getFooters() {
+ return this.footers.clone();
+ }
+
+}
diff --git a/src/main/java/org/newsclub/net/unix/AFUNIXSocketImpl.java b/src/main/java/org/newsclub/net/unix/AFUNIXSocketImpl.java
new file mode 100644
index 000000000..869d987f2
--- /dev/null
+++ b/src/main/java/org/newsclub/net/unix/AFUNIXSocketImpl.java
@@ -0,0 +1,415 @@
+// Modified version (see https://github.com/docker-java/docker-java/pull/697)
+/**
+ * junixsocket
+ *
+ * Copyright (c) 2009,2014 Christian Kohlschütter
+ *
+ * The author 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.newsclub.net.unix;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.net.SocketImpl;
+import java.net.SocketOptions;
+
+/**
+ * The Java-part of the {@link AFUNIXSocket} implementation.
+ *
+ * @author Christian Kohlschütter
+ */
+class AFUNIXSocketImpl extends SocketImpl {
+ private static final int SHUT_RD = 0;
+ private static final int SHUT_WR = 1;
+ private static final int SHUT_RD_WR = 2;
+
+ private String socketFile;
+ private boolean closed = false;
+ private boolean bound = false;
+ private boolean connected = false;
+
+ private boolean closedInputStream = false;
+ private boolean closedOutputStream = false;
+
+ private final AFUNIXInputStream in = new AFUNIXInputStream();
+ private final AFUNIXOutputStream out = new AFUNIXOutputStream();
+
+ AFUNIXSocketImpl() {
+ super();
+ this.fd = new FileDescriptor();
+ }
+
+ FileDescriptor getFD() {
+ return fd;
+ }
+
+ @Override
+ protected void accept(SocketImpl socket) throws IOException {
+ final AFUNIXSocketImpl si = (AFUNIXSocketImpl) socket;
+ NativeUnixSocket.accept(socketFile, fd, si.fd);
+ si.socketFile = socketFile;
+ si.connected = true;
+ }
+
+ @Override
+ protected int available() throws IOException {
+ return NativeUnixSocket.available(fd);
+ }
+
+ protected void bind(SocketAddress addr) throws IOException {
+ bind(0, addr);
+ }
+
+ protected void bind(int backlog, SocketAddress addr) throws IOException {
+ if (!(addr instanceof AFUNIXSocketAddress)) {
+ throw new SocketException("Cannot bind to this type of address: " + addr.getClass());
+ }
+ final AFUNIXSocketAddress socketAddress = (AFUNIXSocketAddress) addr;
+ socketFile = socketAddress.getSocketFile();
+ NativeUnixSocket.bind(socketFile, fd, backlog);
+ bound = true;
+ this.localport = socketAddress.getPort();
+ }
+
+ @Override
+ @SuppressWarnings("hiding")
+ protected void bind(InetAddress host, int port) throws IOException {
+ throw new SocketException("Cannot bind to this type of address: " + InetAddress.class);
+ }
+
+ private void checkClose() throws IOException {
+ //if (closedInputStream && closedOutputStream) {
+ // close();
+ //}
+ }
+
+ @Override
+ protected synchronized void close() throws IOException {
+ if (closed) {
+ return;
+ }
+ closed = true;
+ if (fd.valid()) {
+ NativeUnixSocket.shutdown(fd, SHUT_RD_WR);
+ NativeUnixSocket.close(fd);
+ }
+ if (bound) {
+ NativeUnixSocket.unlink(socketFile);
+ }
+ connected = false;
+ }
+
+ @Override
+ @SuppressWarnings("hiding")
+ protected void connect(String host, int port) throws IOException {
+ throw new SocketException("Cannot bind to this type of address: " + InetAddress.class);
+ }
+
+ @Override
+ @SuppressWarnings("hiding")
+ protected void connect(InetAddress address, int port) throws IOException {
+ throw new SocketException("Cannot bind to this type of address: " + InetAddress.class);
+ }
+
+ @Override
+ protected void connect(SocketAddress addr, int timeout) throws IOException {
+ if (!(addr instanceof AFUNIXSocketAddress)) {
+ throw new SocketException("Cannot bind to this type of address: " + addr.getClass());
+ }
+ final AFUNIXSocketAddress socketAddress = (AFUNIXSocketAddress) addr;
+ socketFile = socketAddress.getSocketFile();
+ NativeUnixSocket.connect(socketFile, fd);
+ this.address = socketAddress.getAddress();
+ this.port = socketAddress.getPort();
+ this.localport = 0;
+ this.connected = true;
+ }
+
+ @Override
+ protected void create(boolean stream) throws IOException {
+ }
+
+ @Override
+ protected InputStream getInputStream() throws IOException {
+ if (!connected && !bound) {
+ throw new IOException("Not connected/not bound");
+ }
+ return in;
+ }
+
+ @Override
+ protected OutputStream getOutputStream() throws IOException {
+ if (!connected && !bound) {
+ throw new IOException("Not connected/not bound");
+ }
+ return out;
+ }
+
+ @Override
+ protected void listen(int backlog) throws IOException {
+ NativeUnixSocket.listen(fd, backlog);
+ }
+
+ @Override
+ protected void sendUrgentData(int data) throws IOException {
+ NativeUnixSocket.write(fd, new byte[] {(byte) (data & 0xFF)}, 0, 1);
+ }
+
+ private final class AFUNIXInputStream extends InputStream {
+ private boolean streamClosed = false;
+
+ @Override
+ public int read(byte[] buf, int off, int len) throws IOException {
+ if (streamClosed) {
+ throw new IOException("This InputStream has already been closed.");
+ }
+ if (len == 0) {
+ return 0;
+ }
+ if (closed) {
+ return -1;
+ }
+ int maxRead = buf.length - off;
+ if (len > maxRead) {
+ len = maxRead;
+ }
+ try {
+ return NativeUnixSocket.read(fd, buf, off, len);
+ } catch (final IOException e) {
+ throw (IOException) new IOException(e.getMessage() + " at "
+ + AFUNIXSocketImpl.this.toString()).initCause(e);
+ }
+ }
+
+ @Override
+ public int read() throws IOException {
+ final byte[] buf1 = new byte[1];
+ final int numRead = read(buf1, 0, 1);
+ if (numRead <= 0) {
+ return -1;
+ } else {
+ return buf1[0] & 0xFF;
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (streamClosed) {
+ return;
+ }
+ streamClosed = true;
+ if (fd.valid()) {
+ NativeUnixSocket.shutdown(fd, SHUT_RD);
+ }
+
+ closedInputStream = true;
+ checkClose();
+ }
+
+ @Override
+ public int available() throws IOException {
+ final int av = NativeUnixSocket.available(fd);
+ return av;
+ }
+ }
+
+ private final class AFUNIXOutputStream extends OutputStream {
+ private boolean streamClosed = false;
+
+ @Override
+ public void write(int oneByte) throws IOException {
+ final byte[] buf1 = new byte[] {(byte) oneByte};
+ write(buf1, 0, 1);
+ }
+
+ @Override
+ public void write(byte[] buf, int off, int len) throws IOException {
+ if (streamClosed) {
+ throw new AFUNIXSocketException("This OutputStream has already been closed.");
+ }
+ if (len > buf.length - off) {
+ throw new IndexOutOfBoundsException();
+ }
+ try {
+ while (len > 0 && !Thread.interrupted()) {
+ final int written = NativeUnixSocket.write(fd, buf, off, len);
+ if (written == -1) {
+ throw new IOException("Unspecific error while writing");
+ }
+ len -= written;
+ off += written;
+ }
+ } catch (final IOException e) {
+ throw (IOException) new IOException(e.getMessage() + " at "
+ + AFUNIXSocketImpl.this.toString()).initCause(e);
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (streamClosed) {
+ return;
+ }
+ streamClosed = true;
+ if (fd.valid()) {
+ NativeUnixSocket.shutdown(fd, SHUT_WR);
+ }
+ closedOutputStream = true;
+ checkClose();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + "[fd=" + fd + "; file=" + this.socketFile + "; connected="
+ + connected + "; bound=" + bound + "]";
+ }
+
+ private static int expectInteger(Object value) throws SocketException {
+ try {
+ return (Integer) value;
+ } catch (final ClassCastException e) {
+ throw new AFUNIXSocketException("Unsupported value: " + value, e);
+ } catch (final NullPointerException e) {
+ throw new AFUNIXSocketException("Value must not be null", e);
+ }
+ }
+
+ private static int expectBoolean(Object value) throws SocketException {
+ try {
+ return ((Boolean) value).booleanValue() ? 1 : 0;
+ } catch (final ClassCastException e) {
+ throw new AFUNIXSocketException("Unsupported value: " + value, e);
+ } catch (final NullPointerException e) {
+ throw new AFUNIXSocketException("Value must not be null", e);
+ }
+ }
+
+ @Override
+ public Object getOption(int optID) throws SocketException {
+ try {
+ switch (optID) {
+ case SocketOptions.SO_KEEPALIVE:
+ case SocketOptions.TCP_NODELAY:
+ return NativeUnixSocket.getSocketOptionInt(fd, optID) != 0 ? true : false;
+ case SocketOptions.SO_LINGER:
+ case SocketOptions.SO_TIMEOUT:
+ case SocketOptions.SO_RCVBUF:
+ case SocketOptions.SO_SNDBUF:
+ return NativeUnixSocket.getSocketOptionInt(fd, optID);
+ default:
+ throw new AFUNIXSocketException("Unsupported option: " + optID);
+ }
+ } catch (final AFUNIXSocketException e) {
+ throw e;
+ } catch (final Exception e) {
+ throw new AFUNIXSocketException("Error while getting option", e);
+ }
+ }
+
+ @Override
+ public void setOption(int optID, Object value) throws SocketException {
+ try {
+ switch (optID) {
+ case SocketOptions.SO_LINGER:
+
+ if (value instanceof Boolean) {
+ final boolean b = (Boolean) value;
+ if (b) {
+ throw new SocketException("Only accepting Boolean.FALSE here");
+ }
+ NativeUnixSocket.setSocketOptionInt(fd, optID, -1);
+ return;
+ }
+ NativeUnixSocket.setSocketOptionInt(fd, optID, expectInteger(value));
+ return;
+ case SocketOptions.SO_RCVBUF:
+ case SocketOptions.SO_SNDBUF:
+ case SocketOptions.SO_TIMEOUT:
+ NativeUnixSocket.setSocketOptionInt(fd, optID, expectInteger(value));
+ return;
+ case SocketOptions.SO_KEEPALIVE:
+ case SocketOptions.TCP_NODELAY:
+ NativeUnixSocket.setSocketOptionInt(fd, optID, expectBoolean(value));
+ return;
+ default:
+ throw new AFUNIXSocketException("Unsupported option: " + optID);
+ }
+ } catch (final AFUNIXSocketException e) {
+ throw e;
+ } catch (final Exception e) {
+ throw new AFUNIXSocketException("Error while setting option", e);
+ }
+ }
+
+ @Override
+ protected void shutdownInput() throws IOException {
+ if (!closed && fd.valid()) {
+ NativeUnixSocket.shutdown(fd, SHUT_RD);
+ }
+ }
+
+ @Override
+ protected void shutdownOutput() throws IOException {
+ if (!closed && fd.valid()) {
+ NativeUnixSocket.shutdown(fd, SHUT_WR);
+ }
+ }
+
+ /**
+ * Changes the behavior to be somewhat lenient with respect to the specification.
+ *
+ * In particular, we ignore calls to {@link Socket#getTcpNoDelay()} and
+ * {@link Socket#setTcpNoDelay(boolean)}.
+ */
+ static class Lenient extends AFUNIXSocketImpl {
+ Lenient() {
+ super();
+ }
+
+ @Override
+ public void setOption(int optID, Object value) throws SocketException {
+ try {
+ super.setOption(optID, value);
+ } catch (SocketException e) {
+ switch (optID) {
+ case SocketOptions.TCP_NODELAY:
+ return;
+ default:
+ throw e;
+ }
+ }
+ }
+
+ @Override
+ public Object getOption(int optID) throws SocketException {
+ try {
+ return super.getOption(optID);
+ } catch (SocketException e) {
+ switch (optID) {
+ case SocketOptions.TCP_NODELAY:
+ case SocketOptions.SO_KEEPALIVE:
+ return false;
+ default:
+ throw e;
+ }
+ }
+ }
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
index 939f95087..d05327a06 100644
--- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java
@@ -17,11 +17,14 @@
import com.github.dockerjava.api.model.Event;
import com.github.dockerjava.client.AbstractDockerClientTest;
+/*
+ * NOTE: These tests may fail if there is a difference between local and daemon time
+ * (this is especially a problem when using boot2docker as time may not in sync
+ * with the virtualbox host system)
+ */
@Test(groups = "integration")
public class EventsCmdImplTest extends AbstractDockerClientTest {
- private static int KNOWN_NUM_EVENTS = 4;
-
private static String getEpochTime() {
return String.valueOf(System.currentTimeMillis() / 1000);
}
@@ -46,9 +49,6 @@ public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
- /*
- * This specific test may fail with boot2docker as time may not in sync with host system
- */
@Test
public void testEventStreamTimeBound() throws Exception {
// Don't include other tests events
@@ -58,82 +58,84 @@ public void testEventStreamTimeBound() throws Exception {
int expectedEvents = generateEvents();
String endTime = getEpochTime();
- CountDownLatch countDownLatch = new CountDownLatch(expectedEvents);
- EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch);
-
- dockerClient.eventsCmd().withSince(startTime).withUntil(endTime).exec(eventCallback);
+ EventsTestCallback eventCallback = new EventsTestCallback(expectedEvents);
- Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
+ dockerClient.eventsCmd()
+ .withSince(startTime)
+ .withUntil(endTime)
+ .exec(eventCallback);
- eventCallback.close();
+ List events = eventCallback.awaitExpectedEvents(3, TimeUnit.MINUTES);
- assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
+ // we may receive more events as expected
+ assertTrue(events.size() >= expectedEvents, "Received events: " + events);
}
@Test
- public void testEventStreaming1() throws Exception {
- // Don't include other tests events
- TimeUnit.SECONDS.sleep(1);
-
- CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS);
- EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch);
-
- dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback);
-
- generateEvents();
-
- Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
-
- eventCallback.close();
- assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
- }
-
- @Test
- public void testEventStreaming2() throws Exception {
+ public void testEventStreaming() throws Exception {
// Don't include other tests events
TimeUnit.SECONDS.sleep(1);
+
+ String startTime = getEpochTime();
+ int expectedEvents = generateEvents();
- CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS);
- EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch);
+ EventsTestCallback eventCallback = new EventsTestCallback(expectedEvents);
- dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback);
+ dockerClient.eventsCmd()
+ .withSince(startTime)
+ .exec(eventCallback);
generateEvents();
- Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
-
- eventCallback.close();
- assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
+ List events = eventCallback.awaitExpectedEvents(3, TimeUnit.MINUTES);
+
+ // we may receive more events as expected
+ assertTrue(events.size() >= expectedEvents, "Received events: " + events);
}
+
public void testEventStreamingWithFilter() throws Exception {
// Don't include other tests events
TimeUnit.SECONDS.sleep(1);
+
+ String startTime = getEpochTime();
+ int expectedEvents = 1;
- CountDownLatch countDownLatch = new CountDownLatch(1);
- EventsTestCallback eventCallback = dockerClient.eventsCmd().withEventFilter("start")
- .exec(new EventsTestCallback(countDownLatch));
+ EventsTestCallback eventCallback = new EventsTestCallback(expectedEvents);
+
+ dockerClient.eventsCmd()
+ .withSince(startTime)
+ .withEventFilter("start")
+ .exec(eventCallback);
generateEvents();
- Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
-
- eventCallback.close();
- assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
+ List events = eventCallback.awaitExpectedEvents(3, TimeUnit.MINUTES);
+
+ // we should get exactly one "start" event here
+ assertEquals(events.size(), expectedEvents, "Received events: " + events);
}
/**
- * This method generates {#link KNOWN_NUM_EVENTS} events
+ * This method generates some events and returns the number of events being generated
*/
private int generateEvents() throws Exception {
- String testImage = "busybox";
+ String testImage = "busybox:latest";
dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess();
-
CreateContainerResponse container = dockerClient.createContainerCmd(testImage).withCmd("sleep", "9999").exec();
dockerClient.startContainerCmd(container.getId()).exec();
- dockerClient.stopContainerCmd(container.getId()).exec();
- return KNOWN_NUM_EVENTS;
+ dockerClient.stopContainerCmd(container.getId()).withTimeout(1).exec();
+
+ // generates 5 events with remote api 1.24:
+
+ // Event[status=pull,id=busybox:latest,from=,node=,type=IMAGE,action=pull,actor=com.github.dockerjava.api.model.EventActor@417db6d7[id=busybox:latest,attributes={name=busybox}],time=1473455186,timeNano=1473455186436681587]
+ // Event[status=create,id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,from=busybox:latest,node=,type=CONTAINER,action=create,actor=com.github.dockerjava.api.model.EventActor@40bcec[id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,attributes={image=busybox:latest, name=sick_lamport}],time=1473455186,timeNano=1473455186470713257]
+ // Event[status=,id=,from=,node=,type=NETWORK,action=connect,actor=com.github.dockerjava.api.model.EventActor@318a1b01[id=10870ceb13abb7cf841ea68868472da881b33c8ed08d2cde7dbb39d7c24d1d27,attributes={container=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c, name=bridge, type=bridge}],time=1473455186,timeNano=1473455186544318466]
+ // Event[status=start,id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,from=busybox:latest,node=,type=CONTAINER,action=start,actor=com.github.dockerjava.api.model.EventActor@606f43a3[id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,attributes={image=busybox:latest, name=sick_lamport}],time=1473455186,timeNano=1473455186786163819]
+ // Event[status=kill,id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,from=busybox:latest,node=,type=CONTAINER,action=kill,actor=com.github.dockerjava.api.model.EventActor@72a9ffcf[id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,attributes={image=busybox:latest, name=sick_lamport, signal=15}],time=1473455186,timeNano=1473455186792963392]
+
+ return 5;
}
private class EventsTestCallback extends EventsResultCallback {
@@ -142,18 +144,24 @@ private class EventsTestCallback extends EventsResultCallback {
private final List events = new ArrayList();
- public EventsTestCallback(CountDownLatch countDownLatch) {
- this.countDownLatch = countDownLatch;
+ public EventsTestCallback(int expextedEvents) {
+ this.countDownLatch = new CountDownLatch(expextedEvents);
}
public void onNext(Event event) {
LOG.info("Received event #{}: {}", countDownLatch.getCount(), event);
- countDownLatch.countDown();
events.add(event);
+ countDownLatch.countDown();
}
-
- public List getEvents() {
- return new ArrayList(events);
+
+ public List awaitExpectedEvents(long timeout, TimeUnit unit ) {
+ try {
+ countDownLatch.await(timeout, unit);
+ close();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ return new ArrayList(events);
}
}
}
diff --git a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java
index 382e5b29c..7ae6a09cc 100644
--- a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java
@@ -69,11 +69,9 @@ public void testStopContainer() throws DockerException {
assertThat(inspectContainerResponse.getState().getRunning(), is(equalTo(false)));
final Integer exitCode = inspectContainerResponse.getState().getExitCode();
- if (apiVersion.equals(VERSION_1_22)) {
- assertThat(exitCode, is(0));
- } else {
- assertThat(exitCode, not(0));
- }
+
+ assertThat(exitCode, is(137));
+
}
@Test(expectedExceptions = NotFoundException.class)
diff --git a/src/test/java/com/github/dockerjava/core/command/UpdateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/UpdateContainerCmdImplTest.java
index 3c7a9fd47..df53d671b 100644
--- a/src/test/java/com/github/dockerjava/core/command/UpdateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/UpdateContainerCmdImplTest.java
@@ -79,7 +79,7 @@ public void updateContainer() throws DockerException, IOException {
// .withCpusetCpus("0") // depends on env
.withCpusetMems("0")
.withMemory(314572800L)
- .withMemorySwap(514288000L)
+// .withMemorySwap(514288000L) Your kernel does not support swap limit capabilities, memory limited without swap.
.withMemoryReservation(209715200L)
// .withKernelMemory(52428800) Can not update kernel memory to a running container, please stop it first.
.exec();
@@ -102,7 +102,7 @@ public void updateContainer() throws DockerException, IOException {
assertThat(afterHostConfig.getCpusetMems(), is("0"));
assertThat(afterHostConfig.getMemoryReservation(), is(209715200L));
- assertThat(afterHostConfig.getMemorySwap(), is(514288000L));
+// assertThat(afterHostConfig.getMemorySwap(), is(514288000L));
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java
index a634e2562..2a446569d 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java
@@ -22,8 +22,6 @@
@Test(groups = "integration")
public class EventsCmdExecTest extends AbstractNettyDockerClientTest {
- private static int KNOWN_NUM_EVENTS = 4;
-
private static String getEpochTime() {
return String.valueOf(System.currentTimeMillis() / 1000);
}
@@ -48,9 +46,6 @@ public void afterMethod(ITestResult result) {
super.afterMethod(result);
}
- /*
- * This specific test may fail with boot2docker as time may not in sync with host system
- */
@Test
public void testEventStreamTimeBound() throws Exception {
// Don't include other tests events
@@ -60,82 +55,84 @@ public void testEventStreamTimeBound() throws Exception {
int expectedEvents = generateEvents();
String endTime = getEpochTime();
- CountDownLatch countDownLatch = new CountDownLatch(expectedEvents);
- EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch);
-
- dockerClient.eventsCmd().withSince(startTime).withUntil(endTime).exec(eventCallback);
-
- Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
-
- eventCallback.close();
-
- assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
- }
-
- @Test
- public void testEventStreaming1() throws Exception {
- // Don't include other tests events
- TimeUnit.SECONDS.sleep(1);
-
- CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS);
- EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch);
+ EventsTestCallback eventCallback = new EventsTestCallback(expectedEvents);
- dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback);
+ dockerClient.eventsCmd()
+ .withSince(startTime)
+ .withUntil(endTime)
+ .exec(eventCallback);
- generateEvents();
-
- Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
+ List events = eventCallback.awaitExpectedEvents(3, TimeUnit.MINUTES);
- eventCallback.close();
- assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
+ // we may receive more events as expected
+ assertTrue(events.size() >= expectedEvents, "Received events: " + events);
}
@Test
- public void testEventStreaming2() throws Exception {
+ public void testEventStreaming() throws Exception {
// Don't include other tests events
TimeUnit.SECONDS.sleep(1);
+
+ String startTime = getEpochTime();
+ int expectedEvents = generateEvents();
- CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS);
- EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch);
+ EventsTestCallback eventCallback = new EventsTestCallback(expectedEvents);
- dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback);
+ dockerClient.eventsCmd()
+ .withSince(startTime)
+ .exec(eventCallback);
generateEvents();
- Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
-
- eventCallback.close();
- assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
+ List events = eventCallback.awaitExpectedEvents(3, TimeUnit.MINUTES);
+
+ // we may receive more events as expected
+ assertTrue(events.size() >= expectedEvents, "Received events: " + events);
}
+
public void testEventStreamingWithFilter() throws Exception {
// Don't include other tests events
TimeUnit.SECONDS.sleep(1);
+
+ String startTime = getEpochTime();
+ int expectedEvents = 1;
- CountDownLatch countDownLatch = new CountDownLatch(1);
- EventsTestCallback eventCallback = dockerClient.eventsCmd().withEventFilter("start")
- .exec(new EventsTestCallback(countDownLatch));
+ EventsTestCallback eventCallback = new EventsTestCallback(expectedEvents);
+
+ dockerClient.eventsCmd()
+ .withSince(startTime)
+ .withEventFilter("start")
+ .exec(eventCallback);
generateEvents();
- Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS);
-
- eventCallback.close();
- assertTrue(zeroCount, "Received only: " + eventCallback.getEvents());
+ List events = eventCallback.awaitExpectedEvents(3, TimeUnit.MINUTES);
+
+ // we should get exactly one "start" event here
+ assertEquals(events.size(), expectedEvents, "Received events: " + events);
}
/**
- * This method generates {#link KNOWN_NUM_EVENTS} events
+ * This method generates some events and returns the number of events being generated
*/
private int generateEvents() throws Exception {
- String testImage = "busybox";
+ String testImage = "busybox:latest";
dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess();
-
CreateContainerResponse container = dockerClient.createContainerCmd(testImage).withCmd("sleep", "9999").exec();
dockerClient.startContainerCmd(container.getId()).exec();
- dockerClient.stopContainerCmd(container.getId()).exec();
- return KNOWN_NUM_EVENTS;
+ dockerClient.stopContainerCmd(container.getId()).withTimeout(1).exec();
+
+ // generates 5 events with remote api 1.24:
+
+ // Event[status=pull,id=busybox:latest,from=,node=,type=IMAGE,action=pull,actor=com.github.dockerjava.api.model.EventActor@417db6d7[id=busybox:latest,attributes={name=busybox}],time=1473455186,timeNano=1473455186436681587]
+ // Event[status=create,id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,from=busybox:latest,node=,type=CONTAINER,action=create,actor=com.github.dockerjava.api.model.EventActor@40bcec[id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,attributes={image=busybox:latest, name=sick_lamport}],time=1473455186,timeNano=1473455186470713257]
+ // Event[status=,id=,from=,node=,type=NETWORK,action=connect,actor=com.github.dockerjava.api.model.EventActor@318a1b01[id=10870ceb13abb7cf841ea68868472da881b33c8ed08d2cde7dbb39d7c24d1d27,attributes={container=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c, name=bridge, type=bridge}],time=1473455186,timeNano=1473455186544318466]
+ // Event[status=start,id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,from=busybox:latest,node=,type=CONTAINER,action=start,actor=com.github.dockerjava.api.model.EventActor@606f43a3[id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,attributes={image=busybox:latest, name=sick_lamport}],time=1473455186,timeNano=1473455186786163819]
+ // Event[status=kill,id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,from=busybox:latest,node=,type=CONTAINER,action=kill,actor=com.github.dockerjava.api.model.EventActor@72a9ffcf[id=6ec10182cde227040bfead8547b63105e6bbc4e94b99f6098bfad6e158ce0d3c,attributes={image=busybox:latest, name=sick_lamport, signal=15}],time=1473455186,timeNano=1473455186792963392]
+
+ return 5;
}
private class EventsTestCallback extends EventsResultCallback {
@@ -144,18 +141,25 @@ private class EventsTestCallback extends EventsResultCallback {
private final List events = new ArrayList();
- public EventsTestCallback(CountDownLatch countDownLatch) {
- this.countDownLatch = countDownLatch;
+ public EventsTestCallback(int expextedEvents) {
+ this.countDownLatch = new CountDownLatch(expextedEvents);
}
public void onNext(Event event) {
LOG.info("Received event #{}: {}", countDownLatch.getCount(), event);
- countDownLatch.countDown();
events.add(event);
+ countDownLatch.countDown();
}
-
- public List getEvents() {
- return new ArrayList(events);
+
+ public List awaitExpectedEvents(long timeout, TimeUnit unit ) {
+ try {
+ countDownLatch.await(timeout, unit);
+ close();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ return new ArrayList(events);
}
}
}
+
diff --git a/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java
index 1dca12890..063bcee30 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java
@@ -61,7 +61,7 @@ public void testStopContainer() throws DockerException {
dockerClient.startContainerCmd(container.getId()).exec();
LOG.info("Stopping container: {}", container.getId());
- dockerClient.stopContainerCmd(container.getId()).withTimeout(2).exec();
+ dockerClient.stopContainerCmd(container.getId()).withTimeout(10).exec();
InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec();
LOG.info("Container Inspect: {}", inspectContainerResponse.toString());
@@ -69,17 +69,15 @@ public void testStopContainer() throws DockerException {
assertThat(inspectContainerResponse.getState().getRunning(), is(equalTo(false)));
final Integer exitCode = inspectContainerResponse.getState().getExitCode();
- if (apiVersion.equals(VERSION_1_22)) {
- assertThat(exitCode, is(0));
- } else {
- assertThat(exitCode, not(0));
- }
+
+ assertThat(exitCode, is(137));
+
}
@Test(expectedExceptions = NotFoundException.class)
public void testStopNonExistingContainer() throws DockerException {
- dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec();
+ dockerClient.stopContainerCmd("non-existing").withTimeout(10).exec();
}
}
diff --git a/src/test/java/com/github/dockerjava/netty/exec/UpdateContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/UpdateContainerCmdExecTest.java
index 1134afd6d..681839c17 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/UpdateContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/UpdateContainerCmdExecTest.java
@@ -78,7 +78,7 @@ public void updateContainer() throws DockerException, IOException {
// .withCpusetCpus("0") // depends on env
.withCpusetMems("0")
.withMemory(314572800L)
- .withMemorySwap(514288000L)
+// .withMemorySwap(514288000L) Your kernel does not support swap limit capabilities, memory limited without swap.
.withMemoryReservation(209715200L)
// .withKernelMemory(52428800) Can not update kernel memory to a running container, please stop it first.
.exec();
@@ -101,7 +101,7 @@ public void updateContainer() throws DockerException, IOException {
assertThat(afterHostConfig.getCpusetMems(), is("0"));
assertThat(afterHostConfig.getMemoryReservation(), is(209715200L));
- assertThat(afterHostConfig.getMemorySwap(), is(514288000L));
+// assertThat(afterHostConfig.getMemorySwap(), is(514288000L));
}
}
From 1bfe308c5321fb3e136fd5c5add09e424f3fec86 Mon Sep 17 00:00:00 2001
From: Martin Caslavsky
Date: Mon, 12 Sep 2016 18:53:50 +0200
Subject: [PATCH 129/736] Allow to configure connection pool timeout (#703)
The default connection pool timeout of Apache HTTP Client is -1 (unlimited)
---
.../jaxrs/JerseyDockerCmdExecFactory.java | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
index 3339a2696..73bab979e 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
@@ -20,6 +20,7 @@
import com.github.dockerjava.api.command.UpdateContainerCmd;
import com.github.dockerjava.core.SSLConfig;
+import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
@@ -110,6 +111,8 @@ public class JerseyDockerCmdExecFactory implements DockerCmdExecFactory {
private Integer maxPerRouteConnections = null;
+ private Integer connectionRequestTimeout = null;
+
private ClientRequestFilter[] clientRequestFilters = null;
private ClientResponseFilter[] clientResponseFilters = null;
@@ -216,9 +219,10 @@ public void shutdown() {
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager);
// Configure connection pool timeout
- // clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, RequestConfig.custom()
- // .setConnectionRequestTimeout(1000).build());
-
+ if (connectionRequestTimeout != null) {
+ clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, RequestConfig.custom()
+ .setConnectionRequestTimeout(connectionRequestTimeout).build());
+ }
ClientBuilder clientBuilder = ClientBuilder.newBuilder().withConfig(clientConfig);
if (sslContext != null) {
@@ -570,6 +574,11 @@ public JerseyDockerCmdExecFactory withMaxPerRouteConnections(Integer maxPerRoute
return this;
}
+ public JerseyDockerCmdExecFactory withConnectionRequestTimeout(Integer connectionRequestTimeout) {
+ this.connectionRequestTimeout = connectionRequestTimeout;
+ return this;
+ }
+
public JerseyDockerCmdExecFactory withClientResponseFilters(ClientResponseFilter... clientResponseFilter) {
this.clientResponseFilters = clientResponseFilter;
return this;
From c31716377f29bb2ece8f83bfaefc8368c3c72abb Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 14 Sep 2016 01:15:42 +0300
Subject: [PATCH 130/736] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f8b6dcd86..908c2d906 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,8 @@ Change Log
## Next
## 3.0.6
+ * Fixed issue with jersey and unix domain sockets.
+ * [#703](https://github.com/docker-java/docker-java/pull/703) Allow to configure connection pool timeout.
* Make all models Serializable.
* [NETTY] Fix loadImage responce on 1.24 API.
* LogPath field for inspect container.
From 03181feda5bbaced61edb715fec600a5236775e3 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 14 Sep 2016 01:21:10 +0300
Subject: [PATCH 131/736] [maven-release-plugin] prepare release 3.0.6
---
pom.xml | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/pom.xml b/pom.xml
index 5cc227ee3..3727ac2e9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,4 @@
-
+4.0.0
@@ -11,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.6-SNAPSHOT
+ 3.0.6docker-javahttps://github.com/docker-java/docker-java
@@ -29,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ 3.0.6
From c3e03be12299c34988980ade3dc7d7a6d3956b12 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 14 Sep 2016 01:21:17 +0300
Subject: [PATCH 132/736] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 3727ac2e9..216c48631 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.6
+ 3.0.7-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- 3.0.6
+ HEAD
From 450a51670e5667e0789127f2a2d7e1a4d0fcbcb5 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 14 Sep 2016 01:33:47 +0300
Subject: [PATCH 133/736] Update .travis.yml
---
.travis.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index ba8c62ad0..d055f76e0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,8 +21,8 @@ env:
- COVERITY_SCAN_NOTIFICATION_EMAIL="kanstantsin.sha@gmail.com"
matrix:
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.12.0-0~trusty" CODECOV=true
- - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.12.0-0~trusty" CODECOV=true
+ - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.12.1-0~trusty" CODECOV=true
+ - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.12.1-0~trusty" CODECOV=true
- repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty" DEPLOY=true COVERITY=true CODECOV=true
- repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty" CODECOV=true
- repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.10.3-0~trusty" CODECOV=true
From 305b73a9763f8d47bdc9698ecfaa9c844a6e087f Mon Sep 17 00:00:00 2001
From: Corey Beres
Date: Wed, 28 Sep 2016 20:34:55 -0400
Subject: [PATCH 134/736] Label image during build #681 (#684)
* Ability to set labels on image build (#681)
* Check API version in new tests (#681)
* remove unnecessary this (#681)
* change withLabel to withLabels (#681)
---
.../dockerjava/api/command/BuildImageCmd.java | 11 ++++++++
.../core/command/BuildImageCmdImpl.java | 16 ++++++++++++
.../dockerjava/jaxrs/BuildImageCmdExec.java | 25 +++++++++++++------
.../netty/exec/BuildImageCmdExec.java | 23 +++++++++++------
.../core/command/BuildImageCmdImplTest.java | 24 ++++++++++++++++++
.../netty/exec/BuildImageCmdExecTest.java | 24 ++++++++++++++++++
.../resources/buildTests/labels/Dockerfile | 3 +++
7 files changed, 111 insertions(+), 15 deletions(-)
create mode 100644 src/test/resources/buildTests/labels/Dockerfile
diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
index 20b23e903..ac98db2f9 100644
--- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
@@ -101,6 +101,12 @@ public interface BuildImageCmd extends AsyncDockerCmd getLabels();
+
// setters
BuildImageCmd withTag(String tag);
@@ -145,6 +151,11 @@ public interface BuildImageCmd extends AsyncDockerCmd labels);
+
interface Exec extends DockerCmdAsyncExec {
}
diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
index 487f0b264..c34b05155 100644
--- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
@@ -56,6 +56,8 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd buildArgs;
+ private Map labels;
+
public BuildImageCmdImpl(BuildImageCmd.Exec exec) {
super(exec);
}
@@ -149,6 +151,11 @@ public Map getBuildArgs() {
return buildArgs;
}
+ @Override
+ public Map getLabels() {
+ return labels;
+ }
+
// getter lib specific
@Override
@@ -303,6 +310,15 @@ public BuildImageCmd withShmsize(Long shmsize) {
return this;
}
+ /**
+ * @see #labels
+ */
+ @Override
+ public BuildImageCmd withLabels(Map labels) {
+ this.labels = labels;
+ return this;
+ }
+
@Override
public void close() {
super.close();
diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
index 43e7687eb..2a7aea40e 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
@@ -24,6 +24,7 @@
import java.io.IOException;
import java.net.URLEncoder;
+import java.util.Map;
public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements
BuildImageCmd.Exec {
@@ -99,19 +100,14 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag
webTarget = webTarget.queryParam("rm", "false");
}
- if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) {
- try {
- webTarget = webTarget.queryParam("buildargs",
- URLEncoder.encode(MAPPER.writeValueAsString(command.getBuildArgs()), "UTF-8"));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
+ webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs());
if (command.getShmsize() != null) {
webTarget = webTarget.queryParam("shmsize", command.getShmsize());
}
+ webTarget = writeMap(webTarget, "labels", command.getLabels());
+
webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED);
webTarget.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024);
@@ -123,4 +119,17 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag
entity(command.getTarInputStream(), "application/tar")
);
}
+
+ private WebTarget writeMap(WebTarget webTarget, String name, Map value) {
+ if (value != null && !value.isEmpty()) {
+ try {
+ return webTarget.queryParam(name,
+ URLEncoder.encode(MAPPER.writeValueAsString(value), "UTF-8"));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ return webTarget;
+ }
+ }
}
diff --git a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
index f4ff04576..43152570e 100644
--- a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
@@ -15,6 +15,7 @@
import com.github.dockerjava.netty.WebTarget;
import java.io.IOException;
+import java.util.Map;
public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements
BuildImageCmd.Exec {
@@ -85,18 +86,14 @@ protected Void execute0(BuildImageCmd command, ResultCallback
webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus());
}
- if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) {
- try {
- webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs()));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
+ webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs());
if (command.getShmsize() != null) {
webTarget = webTarget.queryParam("shmsize", command.getShmsize());
}
+ webTarget = writeMap(webTarget, "labels", command.getLabels());
+
LOGGER.trace("POST: {}", webTarget);
InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request())
@@ -109,4 +106,16 @@ protected Void execute0(BuildImageCmd command, ResultCallback
return null;
}
+
+ private WebTarget writeMap(WebTarget webTarget, String name, Map value) {
+ if (value != null && !value.isEmpty()) {
+ try {
+ return webTarget.queryParam(name, MAPPER.writeValueAsString(value));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ return webTarget;
+ }
+ }
}
diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
index 31f3c3045..cb4c1b2a8 100644
--- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.core.command;
+import static com.github.dockerjava.utils.TestUtils.getVersion;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
@@ -12,11 +13,13 @@
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Collection;
+import java.util.Collections;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.testng.ITestResult;
+import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
@@ -33,6 +36,7 @@
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.Ports.Binding;
import com.github.dockerjava.client.AbstractDockerClientTest;
+import com.github.dockerjava.core.RemoteApiVersion;
import com.github.dockerjava.core.util.CompressArchiveUtil;
@Test(groups = "integration")
@@ -250,6 +254,26 @@ public void buildArgs() throws Exception {
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
}
+ @Test
+ public void labels() throws Exception {
+ if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_23)) {
+ throw new SkipException("API version should be >= 1.23");
+ }
+
+ File baseDir = fileFromBuildTestResource("labels");
+
+ String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true)
+ .withLabels(Collections.singletonMap("test", "abc"))
+ .exec(new BuildImageResultCallback())
+ .awaitImageId();
+
+ InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
+ assertThat(inspectImageResponse, not(nullValue()));
+ LOG.info("Image Inspect: {}", inspectImageResponse.toString());
+
+ assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
+ }
+
public void dockerfileNotInBaseDirectory() throws Exception {
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
index 1474ef25f..f567dcfc8 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.netty.exec;
+import static com.github.dockerjava.utils.TestUtils.getVersion;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
@@ -12,11 +13,13 @@
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Collection;
+import java.util.Collections;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.testng.ITestResult;
+import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
@@ -34,6 +37,7 @@
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.Ports;
import com.github.dockerjava.api.model.Ports.Binding;
+import com.github.dockerjava.core.RemoteApiVersion;
import com.github.dockerjava.core.command.BuildImageResultCallback;
import com.github.dockerjava.core.command.PushImageResultCallback;
import com.github.dockerjava.core.command.WaitContainerResultCallback;
@@ -255,6 +259,26 @@ public void buildArgs() throws Exception {
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
}
+ @Test
+ public void labels() throws Exception {
+ if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_23)) {
+ throw new SkipException("API version should be >= 1.23");
+ }
+
+ File baseDir = fileFromBuildTestResource("labels");
+
+ String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true)
+ .withLabels(Collections.singletonMap("test", "abc"))
+ .exec(new BuildImageResultCallback())
+ .awaitImageId();
+
+ InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
+ assertThat(inspectImageResponse, not(nullValue()));
+ LOG.info("Image Inspect: {}", inspectImageResponse.toString());
+
+ assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
+ }
+
public void dockerfileNotInBaseDirectory() throws Exception {
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
diff --git a/src/test/resources/buildTests/labels/Dockerfile b/src/test/resources/buildTests/labels/Dockerfile
new file mode 100644
index 000000000..6a8106b86
--- /dev/null
+++ b/src/test/resources/buildTests/labels/Dockerfile
@@ -0,0 +1,3 @@
+FROM ubuntu:latest
+
+CMD ["echo", "Success"]
From 1ec83d60ea4a30a6e22aa5620fa4ca01f8d23e21 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 29 Sep 2016 03:35:36 +0300
Subject: [PATCH 135/736] Update CHANGELOG.md
---
CHANGELOG.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 908c2d906..efbed07d8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
Change Log
===
-## Next
+## Next 3.0.7
+ * Label image during build
## 3.0.6
* Fixed issue with jersey and unix domain sockets.
From 069987852c842e3bba85ed3325a8877c36f9e87f Mon Sep 17 00:00:00 2001
From: Christopher Dancy
Date: Fri, 30 Sep 2016 13:39:51 -0400
Subject: [PATCH 136/736] Expose 'User' property on ExecCreateCmd (#707) (#708)
* Expose 'User' property on ExecCreateCmd (#707)
---
.../dockerjava/api/command/ExecCreateCmd.java | 5 +++
.../core/command/ExecCreateCmdImpl.java | 17 +++++++++
.../core/command/ExecCreateCmdImplTest.java | 2 +-
.../core/command/ExecStartCmdImplTest.java | 37 ++++++++++++++-----
4 files changed, 50 insertions(+), 11 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java
index fe2329290..829ebf8ee 100644
--- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java
@@ -20,6 +20,9 @@ public interface ExecCreateCmd extends SyncDockerCmd {
@CheckForNull
Boolean hasTtyEnabled();
+ @CheckForNull
+ String getUser();
+
ExecCreateCmd withAttachStderr(Boolean attachStderr);
ExecCreateCmd withAttachStdin(Boolean attachStdin);
@@ -32,6 +35,8 @@ public interface ExecCreateCmd extends SyncDockerCmd {
ExecCreateCmd withTty(Boolean tty);
+ ExecCreateCmd withUser(String user);
+
interface Exec extends DockerCmdSyncExec {
}
diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java
index 14da4626a..fc8bf1c0b 100644
--- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java
@@ -26,6 +26,12 @@ public class ExecCreateCmdImpl extends AbstrDockerCmd 0);
}
+
+ @Test(groups = "ignoreInCircleCi", expectedExceptions = NotFoundException.class)
+ public void execStartWithNonExistentUser() throws Exception {
+ String containerName = "generated_" + new SecureRandom().nextInt();
+
+ CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName(containerName).exec();
+ LOG.info("Created container {}", container.toString());
+ assertThat(container.getId(), not(isEmptyString()));
+
+ dockerClient.startContainerCmd(container.getId()).exec();
+
+ ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId())
+ .withAttachStdout(true).withCmd("touch", "/execStartTest.log").withUser("NonExistentUser").exec();
+ dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true)
+ .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion();
+
+ dockerClient.copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec();
+ }
}
From b3be4fb1b9cdf3c1cd6a7d30ac91fff2d2e31264 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 30 Sep 2016 21:32:07 +0300
Subject: [PATCH 137/736] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index efbed07d8..8f41b2938 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@ Change Log
===
## Next 3.0.7
* Label image during build
+ * Expose 'User' property on ExecCreateCmd #707 #708
## 3.0.6
* Fixed issue with jersey and unix domain sockets.
From 5736b4bb235afab960866b0d0f18bb7aa7a3e527 Mon Sep 17 00:00:00 2001
From: Hendrik-H
Date: Fri, 7 Oct 2016 22:33:51 +0200
Subject: [PATCH 138/736] Support volumes propagation flags (Issue 554) (#705)
* Support nocopy option in volume binds (#688)
* support volumes propagation flags, fixes #554
* renamed values to match java convention
---
.../com/github/dockerjava/api/model/Bind.java | 54 ++++++++++++-
.../dockerjava/api/model/PropagationMode.java | 50 ++++++++++++
.../github/dockerjava/api/model/BindTest.java | 79 +++++++++++++++++++
.../exec/CreateContainerCmdExecTest.java | 37 +++++++++
4 files changed, 217 insertions(+), 3 deletions(-)
create mode 100644 src/main/java/com/github/dockerjava/api/model/PropagationMode.java
diff --git a/src/main/java/com/github/dockerjava/api/model/Bind.java b/src/main/java/com/github/dockerjava/api/model/Bind.java
index 0995c87ac..9a7ebf18d 100644
--- a/src/main/java/com/github/dockerjava/api/model/Bind.java
+++ b/src/main/java/com/github/dockerjava/api/model/Bind.java
@@ -18,24 +18,48 @@ public class Bind implements Serializable {
private AccessMode accessMode;
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_23}
+ */
+ private Boolean noCopy;
+
/**
* @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_17}
*/
private SELContext secMode;
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22}
+ */
+ private PropagationMode propagationMode;
+
public Bind(String path, Volume volume) {
this(path, volume, AccessMode.DEFAULT, SELContext.DEFAULT);
}
+ public Bind(String path, Volume volume, Boolean noCopy) {
+ this(path, volume, AccessMode.DEFAULT, SELContext.DEFAULT, noCopy);
+ }
+
public Bind(String path, Volume volume, AccessMode accessMode) {
this(path, volume, accessMode, SELContext.DEFAULT);
}
public Bind(String path, Volume volume, AccessMode accessMode, SELContext secMode) {
+ this(path, volume, accessMode, secMode, null);
+ }
+
+ public Bind(String path, Volume volume, AccessMode accessMode, SELContext secMode, Boolean noCopy) {
+ this(path, volume, accessMode, secMode, noCopy, PropagationMode.DEFAULT_MODE);
+ }
+
+ public Bind(String path, Volume volume, AccessMode accessMode, SELContext secMode, Boolean noCopy, PropagationMode propagationMode) {
this.path = path;
this.volume = volume;
this.accessMode = accessMode;
this.secMode = secMode;
+ this.noCopy = noCopy;
+ this.propagationMode = propagationMode;
}
public String getPath() {
@@ -54,6 +78,14 @@ public SELContext getSecMode() {
return secMode;
}
+ public Boolean getNoCopy() {
+ return noCopy;
+ }
+
+ public PropagationMode getPropagationMode() {
+ return propagationMode;
+ }
+
/**
* Parses a bind mount specification to a {@link Bind}.
*
@@ -74,15 +106,25 @@ public static Bind parse(String serialized) {
String[] flags = parts[2].split(",");
AccessMode accessMode = AccessMode.DEFAULT;
SELContext seMode = SELContext.DEFAULT;
+ Boolean nocopy = null;
+ PropagationMode propagationMode = PropagationMode.DEFAULT_MODE;
for (String p : flags) {
if (p.length() == 2) {
accessMode = AccessMode.valueOf(p.toLowerCase());
+ } else if ("nocopy".equals(p)) {
+ nocopy = true;
+ } else if (PropagationMode.SHARED.toString().equals(p)) {
+ propagationMode = PropagationMode.SHARED;
+ } else if (PropagationMode.SLAVE.toString().equals(p)) {
+ propagationMode = PropagationMode.SLAVE;
+ } else if (PropagationMode.PRIVATE.toString().equals(p)) {
+ propagationMode = PropagationMode.PRIVATE;
} else {
seMode = SELContext.fromString(p);
}
}
- return new Bind(parts[0], new Volume(parts[1]), accessMode, seMode);
+ return new Bind(parts[0], new Volume(parts[1]), accessMode, seMode, nocopy, propagationMode);
}
default: {
throw new IllegalArgumentException();
@@ -102,6 +144,8 @@ public boolean equals(Object obj) {
.append(volume, other.getVolume())
.append(accessMode, other.getAccessMode())
.append(secMode, other.getSecMode())
+ .append(noCopy, other.getNoCopy())
+ .append(propagationMode, other.getPropagationMode())
.isEquals();
} else {
return super.equals(obj);
@@ -115,6 +159,8 @@ public int hashCode() {
.append(volume)
.append(accessMode)
.append(secMode)
+ .append(noCopy)
+ .append(propagationMode)
.toHashCode();
}
@@ -127,10 +173,12 @@ public int hashCode() {
*/
@Override
public String toString() {
- return String.format("%s:%s:%s%s",
+ return String.format("%s:%s:%s%s%s%s",
path,
volume.getPath(),
accessMode.toString(),
- secMode != SELContext.none ? "," + secMode.toString() : "");
+ secMode != SELContext.none ? "," + secMode.toString() : "",
+ noCopy != null ? ",nocopy" : "",
+ propagationMode != PropagationMode.DEFAULT_MODE ? "," + propagationMode.toString() : "");
}
}
diff --git a/src/main/java/com/github/dockerjava/api/model/PropagationMode.java b/src/main/java/com/github/dockerjava/api/model/PropagationMode.java
new file mode 100644
index 000000000..9be7d6e43
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/PropagationMode.java
@@ -0,0 +1,50 @@
+package com.github.dockerjava.api.model;
+
+/**
+ * The propagation mode of a file system or file: shared, slave or private.
+ *
+ * @see https://github.com/docker/docker/pull/17034
+ * @since 1.22
+ */
+public enum PropagationMode {
+ /** default */
+ DEFAULT(""),
+
+ /** shared */
+ SHARED("shared"),
+
+ /** slave */
+ SLAVE("slave"),
+
+ /** private */
+ PRIVATE("private");
+
+ /**
+ * The default {@link PropagationMode}: {@link #DEFAULT}
+ */
+ public static final PropagationMode DEFAULT_MODE = DEFAULT;
+
+ private String value;
+
+ PropagationMode(String v) {
+ value = v;
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ public static PropagationMode fromString(String v) {
+ switch (v) {
+ case "shared":
+ return SHARED;
+ case "slave":
+ return SLAVE;
+ case "private":
+ return PRIVATE;
+ default:
+ return DEFAULT;
+ }
+ }
+}
diff --git a/src/test/java/com/github/dockerjava/api/model/BindTest.java b/src/test/java/com/github/dockerjava/api/model/BindTest.java
index 3204ee716..2e6fd8353 100644
--- a/src/test/java/com/github/dockerjava/api/model/BindTest.java
+++ b/src/test/java/com/github/dockerjava/api/model/BindTest.java
@@ -3,6 +3,7 @@
import static com.github.dockerjava.api.model.AccessMode.ro;
import static com.github.dockerjava.api.model.AccessMode.rw;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.Is.is;
import org.testng.annotations.Test;
@@ -16,6 +17,8 @@ public void parseUsingDefaultAccessMode() {
assertThat(bind.getVolume().getPath(), is("/container"));
assertThat(bind.getAccessMode(), is(AccessMode.DEFAULT));
assertThat(bind.getSecMode(), is(SELContext.none));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE));
}
@Test
@@ -25,6 +28,52 @@ public void parseReadWrite() {
assertThat(bind.getVolume().getPath(), is("/container"));
assertThat(bind.getAccessMode(), is(rw));
assertThat(bind.getSecMode(), is(SELContext.none));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE));
+ }
+
+ @Test
+ public void parseReadWriteNoCopy() {
+ Bind bind = Bind.parse("/host:/container:rw,nocopy");
+ assertThat(bind.getPath(), is("/host"));
+ assertThat(bind.getVolume().getPath(), is("/container"));
+ assertThat(bind.getAccessMode(), is(rw));
+ assertThat(bind.getSecMode(), is(SELContext.none));
+ assertThat(bind.getNoCopy(), is(true));
+ assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE));
+ }
+
+ @Test
+ public void parseReadWriteShared() {
+ Bind bind = Bind.parse("/host:/container:rw,shared");
+ assertThat(bind.getPath(), is("/host"));
+ assertThat(bind.getVolume().getPath(), is("/container"));
+ assertThat(bind.getAccessMode(), is(rw));
+ assertThat(bind.getSecMode(), is(SELContext.none));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.SHARED));
+ }
+
+ @Test
+ public void parseReadWriteSlave() {
+ Bind bind = Bind.parse("/host:/container:rw,slave");
+ assertThat(bind.getPath(), is("/host"));
+ assertThat(bind.getVolume().getPath(), is("/container"));
+ assertThat(bind.getAccessMode(), is(rw));
+ assertThat(bind.getSecMode(), is(SELContext.none));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.SLAVE));
+ }
+
+ @Test
+ public void parseReadWritePrivate() {
+ Bind bind = Bind.parse("/host:/container:rw,private");
+ assertThat(bind.getPath(), is("/host"));
+ assertThat(bind.getVolume().getPath(), is("/container"));
+ assertThat(bind.getAccessMode(), is(rw));
+ assertThat(bind.getSecMode(), is(SELContext.none));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.PRIVATE));
}
@Test
@@ -34,6 +83,8 @@ public void parseReadOnly() {
assertThat(bind.getVolume().getPath(), is("/container"));
assertThat(bind.getAccessMode(), is(ro));
assertThat(bind.getSecMode(), is(SELContext.none));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE));
}
@Test
@@ -43,12 +94,16 @@ public void parseSELOnly() {
assertThat(bind.getVolume().getPath(), is("/container"));
assertThat(bind.getAccessMode(), is(AccessMode.DEFAULT));
assertThat(bind.getSecMode(), is(SELContext.single));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE));
bind = Bind.parse("/host:/container:z");
assertThat(bind.getPath(), is("/host"));
assertThat(bind.getVolume().getPath(), is("/container"));
assertThat(bind.getAccessMode(), is(AccessMode.DEFAULT));
assertThat(bind.getSecMode(), is(SELContext.shared));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE));
}
@Test
@@ -58,6 +113,8 @@ public void parseReadWriteSEL() {
assertThat(bind.getVolume().getPath(), is("/container"));
assertThat(bind.getAccessMode(), is(rw));
assertThat(bind.getSecMode(), is(SELContext.single));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE));
}
@Test
@@ -67,6 +124,8 @@ public void parseReadOnlySEL() {
assertThat(bind.getVolume().getPath(), is("/container"));
assertThat(bind.getAccessMode(), is(ro));
assertThat(bind.getSecMode(), is(SELContext.shared));
+ assertThat(bind.getNoCopy(), nullValue());
+ assertThat(bind.getPropagationMode(), is(PropagationMode.DEFAULT_MODE));
}
@Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Bind.*")
@@ -94,6 +153,26 @@ public void toStringReadWrite() {
assertThat(Bind.parse("/host:/container:rw").toString(), is("/host:/container:rw"));
}
+ @Test
+ public void toStringReadWriteNoCopy() {
+ assertThat(Bind.parse("/host:/container:rw,nocopy").toString(), is("/host:/container:rw,nocopy"));
+ }
+
+ @Test
+ public void toStringReadWriteShared() {
+ assertThat(Bind.parse("/host:/container:rw,shared").toString(), is("/host:/container:rw,shared"));
+ }
+
+ @Test
+ public void toStringReadWriteSlave() {
+ assertThat(Bind.parse("/host:/container:rw,slave").toString(), is("/host:/container:rw,slave"));
+ }
+
+ @Test
+ public void toStringReadWritePrivate() {
+ assertThat(Bind.parse("/host:/container:rw,private").toString(), is("/host:/container:rw,private"));
+ }
+
@Test
public void toStringDefaultAccessMode() {
assertThat(Bind.parse("/host:/container").toString(), is("/host:/container:rw"));
diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java
index 3694ca7fb..aa97b8839 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java
@@ -2,6 +2,7 @@
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.CreateNetworkResponse;
+import com.github.dockerjava.api.command.CreateVolumeResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.exception.ConflictException;
import com.github.dockerjava.api.exception.DockerException;
@@ -15,6 +16,7 @@
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.api.model.Ports;
import com.github.dockerjava.api.model.Ports.Binding;
+import com.github.dockerjava.core.RemoteApiVersion;
import com.github.dockerjava.api.model.RestartPolicy;
import com.github.dockerjava.api.model.Ulimit;
import com.github.dockerjava.api.model.Volume;
@@ -23,6 +25,7 @@
import org.apache.commons.io.FileUtils;
import org.testng.ITestResult;
+import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
@@ -40,6 +43,7 @@
import static com.github.dockerjava.api.model.Capability.MKNOD;
import static com.github.dockerjava.api.model.Capability.NET_ADMIN;
+import static com.github.dockerjava.utils.TestUtils.getVersion;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
@@ -138,6 +142,39 @@ public void createContainerWithReadOnlyVolume() throws DockerException {
// assertFalse(inspectContainerResponse.getMounts().get(0).getRW());
}
+ @Test
+ public void createContainerWithNoCopyVolumes() throws DockerException {
+ final RemoteApiVersion apiVersion = getVersion(dockerClient);
+
+ if (!apiVersion.isGreaterOrEqual(RemoteApiVersion.VERSION_1_23)) {
+ throw new SkipException("API version should be >= 1.23");
+ }
+
+ Volume volume1 = new Volume("/opt/webapp1");
+ String container1Name = UUID.randomUUID().toString();
+
+ CreateVolumeResponse volumeResponse = dockerClient.createVolumeCmd().withName("webapp1").exec();
+ assertThat(volumeResponse.getName(), equalTo("webapp1"));
+ assertThat(volumeResponse.getDriver(), equalTo("local"));
+ assertThat(volumeResponse.getMountpoint(), containsString("/webapp1/"));
+
+ Bind bind1 = new Bind("webapp1", volume1, true);
+
+ CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999")
+ .withName(container1Name)
+ .withBinds(bind1).exec();
+ LOG.info("Created container1 {}", container1.toString());
+
+ InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()).exec();
+
+ assertThat(Arrays.asList(inspectContainerResponse1.getHostConfig().getBinds()), contains(bind1));
+ assertThat(inspectContainerResponse1, mountedVolumes(contains(volume1)));
+
+ assertThat(inspectContainerResponse1.getMounts().get(0).getDestination(), equalTo(volume1));
+ assertThat(inspectContainerResponse1.getMounts().get(0).getMode(), equalTo("rw,nocopy"));
+ assertThat(inspectContainerResponse1.getMounts().get(0).getRW(), equalTo(true));
+ }
+
@Test
public void createContainerWithVolumesFrom() throws DockerException {
From 6c748c61330cc996c78d5c294e40d98c8294e37e Mon Sep 17 00:00:00 2001
From: valerijf
Date: Tue, 11 Oct 2016 13:23:26 +0200
Subject: [PATCH 139/736] Added getter for previous cpu stats
---
.../github/dockerjava/api/model/Statistics.java | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/model/Statistics.java b/src/main/java/com/github/dockerjava/api/model/Statistics.java
index cf8c1b77e..6827be4e8 100644
--- a/src/main/java/com/github/dockerjava/api/model/Statistics.java
+++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java
@@ -46,6 +46,12 @@ public class Statistics implements Serializable {
@JsonProperty("cpu_stats")
private Map cpuStats;
+ /**
+ * @since Docker Remote API 1.19
+ */
+ @JsonProperty("precpu_stats")
+ private Map precpuStats;
+
/**
* @since Docker Remote API 1.21
*/
@@ -66,6 +72,14 @@ public Map getCpuStats() {
return cpuStats;
}
+ /**
+ * The cpu statistic of last read, which is used for calculating the cpu usage percent.
+ * It is not the exact copy of the {@link #getCpuStats()}.
+ */
+ public Map getPreviousCpuStats() {
+ return precpuStats;
+ }
+
public Map getMemoryStats() {
return memoryStats;
}
From 9d2c93e5eacf4807f5368d28c3277d85aa6bd546 Mon Sep 17 00:00:00 2001
From: valerijf
Date: Fri, 14 Oct 2016 09:49:01 +0200
Subject: [PATCH 140/736] Renamed getter as field
---
src/main/java/com/github/dockerjava/api/model/Statistics.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/api/model/Statistics.java b/src/main/java/com/github/dockerjava/api/model/Statistics.java
index 6827be4e8..9307da6b3 100644
--- a/src/main/java/com/github/dockerjava/api/model/Statistics.java
+++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java
@@ -76,7 +76,7 @@ public Map getCpuStats() {
* The cpu statistic of last read, which is used for calculating the cpu usage percent.
* It is not the exact copy of the {@link #getCpuStats()}.
*/
- public Map getPreviousCpuStats() {
+ public Map getPrecpuStats() {
return precpuStats;
}
From 75e9a2cd3d1bf1489f7a94fd9dc8d624359fa430 Mon Sep 17 00:00:00 2001
From: marcuslinke
Date: Thu, 27 Oct 2016 20:09:07 +0200
Subject: [PATCH 141/736] Expose netty connect timeout (#725)
---
.../netty/NettyDockerCmdExecFactory.java | 42 ++++++++++++++++++-
1 file changed, 40 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java
index cead92e92..c91d4af21 100644
--- a/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java
@@ -108,6 +108,9 @@
import com.github.dockerjava.netty.exec.RenameContainerCmdExec;
import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelConfig;
+import io.netty.channel.ChannelFactory;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.epoll.EpollDomainSocketChannel;
@@ -178,6 +181,8 @@ public DuplexChannel getChannel() {
}
};
+ private Integer connectTimeout = null;
+
@Override
public void init(DockerClientConfig dockerClientConfig) {
checkNotNull(dockerClientConfig, "config was not specified");
@@ -218,7 +223,15 @@ private class UnixDomainSocketInitializer implements NettyInitializer {
@Override
public EventLoopGroup init(Bootstrap bootstrap, DockerClientConfig dockerClientConfig) {
EventLoopGroup epollEventLoopGroup = new EpollEventLoopGroup(0, new DefaultThreadFactory(threadPrefix));
- bootstrap.group(epollEventLoopGroup).channel(EpollDomainSocketChannel.class)
+
+ ChannelFactory factory = new ChannelFactory() {
+ @Override
+ public EpollDomainSocketChannel newChannel() {
+ return configure(new EpollDomainSocketChannel());
+ }
+ };
+
+ bootstrap.group(epollEventLoopGroup).channelFactory(factory)
.handler(new ChannelInitializer() {
@Override
protected void initChannel(final UnixChannel channel) throws Exception {
@@ -245,7 +258,14 @@ public EventLoopGroup init(Bootstrap bootstrap, final DockerClientConfig dockerC
Security.addProvider(new BouncyCastleProvider());
- bootstrap.group(nioEventLoopGroup).channel(NioSocketChannel.class)
+ ChannelFactory factory = new ChannelFactory() {
+ @Override
+ public NioSocketChannel newChannel() {
+ return configure(new NioSocketChannel());
+ }
+ };
+
+ bootstrap.group(nioEventLoopGroup).channelFactory(factory)
.handler(new ChannelInitializer() {
@Override
protected void initChannel(final SocketChannel channel) throws Exception {
@@ -580,6 +600,24 @@ public void close() throws IOException {
eventLoopGroup.shutdownGracefully();
}
+ /**
+ * Configure connection timeout in milliseconds
+ */
+ public NettyDockerCmdExecFactory withConnectTimeout(Integer connectTimeout) {
+ this.connectTimeout = connectTimeout;
+ return this;
+ }
+
+ private T configure(T channel) {
+ ChannelConfig channelConfig = channel.config();
+
+ if (connectTimeout != null) {
+ channelConfig.setConnectTimeoutMillis(connectTimeout);
+ }
+
+ return channel;
+ }
+
private WebTarget getBaseResource() {
return new WebTarget(channelProvider);
}
From 39ef5d14bb7a6b217bba97525585fac08be39d00 Mon Sep 17 00:00:00 2001
From: Matt Fulgo
Date: Wed, 2 Nov 2016 09:55:49 -0400
Subject: [PATCH 142/736] Fixes broken Docker documentation link
The official Docker documentation has moved around a bit and the link for how to configure the Docker Engine needed to be updated. The previous link pointed to a page that no longer exists.
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 039657807..c2fa5d854 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@ client also uses UNIX domain sockets to connect to the docker daemon by default.
DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"
-More details about setting up Docker server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/
+More details about setting up Docker Engine can be found in the official documentation: https://docs.docker.com/engine/admin/
To force docker-java to use TCP (http) configure the following (see [Configuration](https://github.com/docker-java/docker-java#configuration) for details):
From 49b94f6fd6fd6f59c45138698051047e82719dd8 Mon Sep 17 00:00:00 2001
From: ooxi
Date: Fri, 25 Nov 2016 08:32:41 +0100
Subject: [PATCH 143/736] Add javadoc for `saveImageCmd'
Maybe we can automatically copy the documentation from `SaveImageCmd.withName`, but I don't know how.
---
src/main/java/com/github/dockerjava/api/DockerClient.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java
index 832890e87..8f35fac12 100644
--- a/src/main/java/com/github/dockerjava/api/DockerClient.java
+++ b/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -111,6 +111,10 @@ public interface DockerClient extends Closeable {
InspectImageCmd inspectImageCmd(@Nonnull String imageId);
+ /**
+ * @param name
+ * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.
+ */
SaveImageCmd saveImageCmd(@Nonnull String name);
/**
From 3c04924a2deb4419bf6d987ed615bec88e7ed4f4 Mon Sep 17 00:00:00 2001
From: ooxi
Date: Fri, 25 Nov 2016 08:36:37 +0100
Subject: [PATCH 144/736] Fixed Docker Remote API link (#747)
File was moved in docker repository.
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 039657807..79bad7fa9 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ For secure tls (https) communication:
DOCKER_CERT_PATH=/Users/marcus/.docker/machine/machines/docker-1.11.2
### Latest release version
-Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.23.md), Docker Server version 1.11.x
+Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/api/v1.23.md), Docker Server version 1.11.x
com.github.docker-java
@@ -60,7 +60,7 @@ Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/doc
### Latest development version
-Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.23.md), Docker Server version 1.11.x
+Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/api/v1.23.md), Docker Server version 1.11.x
You can find the latest development version including javadoc and source files on [Sonatypes OSS repository](https://oss.sonatype.org/content/groups/public/com/github/docker-java/docker-java/).
From 15aa30eaa6ed5c40dbbe1ef4dc3e4a4caeb867ec Mon Sep 17 00:00:00 2001
From: ooxi
Date: Fri, 25 Nov 2016 08:37:28 +0100
Subject: [PATCH 145/736] Fix Maven package version (#748)
Version `3.0.6` was released, current snapshot is `3.0.7-SNAPSHOT`
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 79bad7fa9..d5052e6b9 100644
--- a/README.md
+++ b/README.md
@@ -56,7 +56,7 @@ Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/doc
com.github.docker-javadocker-java
- 3.0.3
+ 3.0.6
### Latest development version
@@ -67,7 +67,7 @@ You can find the latest development version including javadoc and source files o
com.github.docker-javadocker-java
- 3.0.4-SNAPSHOT
+ 3.0.7-SNAPSHOT
From 259b7d638e20781c3085e679176f34b1c5d92c89 Mon Sep 17 00:00:00 2001
From: Raffael Stein
Date: Wed, 4 Jan 2017 10:22:03 +0100
Subject: [PATCH 146/736] Clone system properties on access in default config
---
.../com/github/dockerjava/core/DefaultDockerClientConfig.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
index a9a15bb36..9d13ec71e 100644
--- a/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
+++ b/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
@@ -188,7 +188,7 @@ private static Properties overrideDockerPropertiesWithSystemProperties(Propertie
}
public static Builder createDefaultConfigBuilder() {
- return createDefaultConfigBuilder(System.getenv(), System.getProperties());
+ return createDefaultConfigBuilder(System.getenv(), (Properties) System.getProperties().clone());
}
/**
From 5ba770cf010271632980029f73856081f45b7ef0 Mon Sep 17 00:00:00 2001
From: Aboubacar Toure
Date: Thu, 12 Jan 2017 02:15:33 -0500
Subject: [PATCH 147/736] Add support for private docker registry version 2
(#756)
Private docker registry version 1 expects the authentication credentials
in $DOCKER_HOME/.dockercfg while version 2 expects them
in $DOCKER_HOME/config.json. Support for both paths should be added to
make docker-java more portable.
This pull request has the following modifications:
* When resolving the path of the authentication configuration file,
$DOCKER_HOME/config.json (v2) is tried before
$DOCKER_HOME/.dockercfg (v1)
* When parsing the content of the authentication configuration file,
the format of config.json (v2) is tried before .dockercfg (v1)
* Test for both config.json (v2) and dockercfg (v1) have been added
---
.../dockerjava/core/AuthConfigFile.java | 30 ++++++++++++---
.../core/DefaultDockerClientConfig.java | 30 ++++++++++++---
.../core/DefaultDockerClientConfigTest.java | 37 +++++++++++++++++++
.../registry.v1/.dockercfg | 5 +++
.../registry.v2/config.json | 7 ++++
5 files changed, 99 insertions(+), 10 deletions(-)
create mode 100644 src/test/resources/com.github.dockerjava.core/registry.v1/.dockercfg
create mode 100644 src/test/resources/com.github.dockerjava.core/registry.v2/config.json
diff --git a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java
index f796fd7c9..539ac7f75 100644
--- a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java
+++ b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java
@@ -19,8 +19,13 @@
public class AuthConfigFile {
private static final ObjectMapper MAPPER = new ObjectMapper();
- private static final TypeReferenceorg.glassfish.jersey.core
From f9fdc392bc676fa667f34e4e94b851919040ff7d Mon Sep 17 00:00:00 2001
From: orzeh
Date: Tue, 28 Mar 2017 23:53:12 +0200
Subject: [PATCH 169/736] Generate OSGi compliant manifest (#797)
* Generate OSGi compliant manifest
Manifest is generated by the Bundlor plugin according to the template defined in template.mf file. Import package versions are mainly derived from properties defined in pom.xml.
Imports of Netty packages are marked as optional.
* Export com.github.dockerjava.core package and subpackages
---
pom.xml | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
template.mf | 31 +++++++++++++++++++++++++++++++
2 files changed, 82 insertions(+)
create mode 100644 template.mf
diff --git a/pom.xml b/pom.xml
index acc3a160c..154153fe5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -86,6 +86,8 @@
2.19.12.19.11.8
+ 1.1.2.RELEASE
+ 3.0.0
@@ -275,6 +277,19 @@
+
+
+ eclipse.virgo.build.bundles.release
+ Eclipse Virgo Build
+ http://build.eclipse.org/rt/virgo/maven/bundles/release
+
+
+ com.springsource.repository.bundles.external
+ SpringSource Enterprise Bundle Repository - External Bundle Releases
+ http://repository.springsource.com/maven/bundles/external
+
+
+
@@ -301,6 +316,11 @@
org.apache.maven.pluginsmaven-jar-plugin${maven-jar-plugin.version}
+
+
+ target/classes/META-INF/MANIFEST.MF
+
+
@@ -436,6 +456,37 @@
org.apache.maven.pluginsmaven-source-plugin
+
+
+ org.eclipse.virgo.bundlor
+ org.eclipse.virgo.bundlor.maven
+ ${maven-bundlor-plugin.version}
+
+
+ bundlor
+
+ bundlor
+
+
+ true
+
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ ${maven-build-helper-plugin.version}
+
+
+ parse-version
+
+ parse-version
+
+
+
+
diff --git a/template.mf b/template.mf
new file mode 100644
index 000000000..35d278889
--- /dev/null
+++ b/template.mf
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: com.github.docker-java
+Bundle-Version: ${parsedVersion.osgiVersion}
+Bundle-Name: ${project.name}
+Version-Patterns:
+ default;pattern="[=.=.=, =.+1.0)",
+ short;pattern="[=.=,+1.0)"
+Import-Template:
+ com.fasterxml.jackson.*;version="${jackson-jaxrs.version}",
+ com.google.common.*;version="${guava.version:short}",
+ io.netty.*;version="${netty.version:default}";resolution:=optional,
+ javax.ws.rs.*;version="[2.0.0, 2.1.0)",
+ org.apache.commons.codec.*;version="${commons-codec.version:short}",
+ org.apache.commons.compress.*;version="${commons-compress.version:short}",
+ org.apache.commons.io.*;version="${commons-io.version:short}",
+ org.apache.commons.lang.*;version="${commons-lang.version:short}",
+ org.apache.http.*;version="[4.4.0, 4.6.0)",
+ org.bouncycastle.*;version="${bouncycastle.version:short}",
+ org.glassfish.jersey.*;version="${jersey.version:default}",
+ org.slf4j.*;version="[1.7.0, 1.8.0)",
+ org.newsclub.net.unix;version="${junixsocket.version:default}";resolution:=optional
+Excluded-Exports:
+ org.apache.http.impl.io,
+ org.newsclub.net.unix,
+ com.github.dockerjava.jaxrs.*,
+ com.github.dockerjava.netty.*
+Excluded-Imports:
+ javax.annotation,
+ javax.net.ssl,
+ edu.umd.cs.findbugs.annotations
From 7016a6364e6638b126baa684209246068d57c773 Mon Sep 17 00:00:00 2001
From: nimantha siriwardana
Date: Wed, 29 Mar 2017 09:40:50 +0100
Subject: [PATCH 170/736] adding support for unless-stopped restart policy
---
.../github/dockerjava/api/model/RestartPolicy.java | 11 +++++++++++
.../api/model/RestartPolicy_ParsingTest.java | 5 +++++
.../api/model/RestartPolicy_SerializingTest.java | 7 +++++++
.../api/model/RestartPolicy_toStringTest.java | 2 +-
4 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java
index 1f77b8b9d..98e181a1b 100644
--- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java
+++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java
@@ -70,6 +70,13 @@ public static RestartPolicy onFailureRestart(int maximumRetryCount) {
return new RestartPolicy(maximumRetryCount, "on-failure");
}
+ /**
+ * Restart the container unless it has been stopped
+ */
+ public static RestartPolicy unlessStoppedRestart() {
+ return new RestartPolicy(0, "unless-stopped");
+ }
+
public Integer getMaximumRetryCount() {
return maximumRetryCount;
}
@@ -99,6 +106,10 @@ public static RestartPolicy parse(String serialized) throws IllegalArgumentExcep
return alwaysRestart();
}
+ if ("unless-stopped".equals(name)) {
+ return unlessStoppedRestart();
+ }
+
if ("on-failure".equals(name)) {
int count = 0;
if (parts.length == 2) {
diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java
index 3bc22c00e..85740be61 100644
--- a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java
+++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java
@@ -16,6 +16,11 @@ public void alwaysRestart() throws Exception {
assertEquals(RestartPolicy.parse("always"), RestartPolicy.alwaysRestart());
}
+ @Test
+ public void unlessStoppedRestart() throws Exception {
+ assertEquals(RestartPolicy.parse("unless-stopped"), RestartPolicy.unlessStoppedRestart());
+ }
+
@Test
public void onFailureRestart() throws Exception {
assertEquals(RestartPolicy.parse("on-failure"), RestartPolicy.onFailureRestart(0));
diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java
index 74c97fcf6..06debb34f 100644
--- a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java
+++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java
@@ -27,6 +27,13 @@ public void alwaysRestart() throws Exception {
assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"always\"}");
}
+ @Test
+ // --restart unless-stopped
+ public void unlessStoppedRestart() throws Exception {
+ String json = objectMapper.writeValueAsString(RestartPolicy.unlessStoppedRestart());
+ assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"unless-stopped\"}");
+ }
+
@Test
// --restart on-failure
public void onFailureRestart() throws Exception {
diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java
index 69e1e88a2..611343736 100644
--- a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java
+++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java
@@ -9,7 +9,7 @@ public class RestartPolicy_toStringTest {
@DataProvider(name = "input")
public Object[][] restartPolicies() {
- return new Object[][] { {"no"}, {"always"}, {"on-failure"}, {"on-failure:2"}};
+ return new Object[][] { {"no"}, {"always"}, {"unless-stopped"}, {"on-failure"}, {"on-failure:2"}};
}
@Test(dataProvider = "input")
From 2d053870d546b43b8f5d18f53e5085702ace097d Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 13 Apr 2017 22:59:40 +0300
Subject: [PATCH 171/736] Responce may contains token.
---
.../dockerjava/api/model/AuthResponse.java | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/model/AuthResponse.java b/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
index 590fb7fb3..821d4c4ac 100644
--- a/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
+++ b/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
@@ -3,16 +3,39 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
import java.io.Serializable;
@JsonIgnoreProperties(ignoreUnknown = true)
public class AuthResponse implements Serializable {
private static final long serialVersionUID = 1L;
+ /**
+ * @since 1.23
+ */
@JsonProperty("Status")
private String status;
+ /**
+ * @since 1.23
+ */
+ @JsonProperty("IdentityToken")
+ private String identityToken;
+
+ /**
+ * @see #status
+ */
+ @Nonnull
public String getStatus() {
return status;
}
+
+ /**
+ * @see #identityToken
+ */
+ @CheckForNull
+ public String getIdentityToken() {
+ return identityToken;
+ }
}
From f01072d81b5d06b79ad4425a568e19c89c06a1cf Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 13 Apr 2017 23:03:33 +0300
Subject: [PATCH 172/736] Update CHANGELOG.md
---
CHANGELOG.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 114c66147..b0c7f2237 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,12 @@ Change Log
===
## (dev) 3.1.0 (reserverd for swarm features)
+## 3.0.9
+- NettyDockerCmdExecFactory ignores API version
+- exclude commons-logging from httpclient since docker-java uses slf4j/logback
+- Generate OSGi compliant manifest
+- AuthResponse may contains token.
+
## 3.0.8
- Use TLSv1.2 by default
- Health api
From 250a02baa7ae3549f4d4ebc9cd6efdd88d14bfab Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 13 Apr 2017 23:14:27 +0300
Subject: [PATCH 173/736] Fix test.
---
.../netty/NettyDockerCmdExecFactoryConfigTest.java | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java b/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java
index d0ddccca8..e36ee6b8b 100644
--- a/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java
+++ b/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java
@@ -42,7 +42,8 @@ public void testNettyDockerCmdExecFactoryConfigWithApiVersion() throws Exception
int dockerPort = getFreePort();
NettyDockerCmdExecFactory factory = new NettyDockerCmdExecFactory();
- Builder configBuilder = DefaultDockerClientConfig.createDefaultConfigBuilder()
+ Builder configBuilder = new DefaultDockerClientConfig.Builder()
+ .withDockerTlsVerify(false)
.withDockerHost("tcp://localhost:" + dockerPort)
.withApiVersion("1.23");
@@ -69,7 +70,9 @@ public void testNettyDockerCmdExecFactoryConfigWithoutApiVersion() throws Except
int dockerPort = getFreePort();
NettyDockerCmdExecFactory factory = new NettyDockerCmdExecFactory();
- Builder configBuilder = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost("tcp://localhost:" + dockerPort);
+ Builder configBuilder = new DefaultDockerClientConfig.Builder()
+ .withDockerTlsVerify(false)
+ .withDockerHost("tcp://localhost:" + dockerPort);
DockerClient client = DockerClientBuilder.getInstance(configBuilder)
.withDockerCmdExecFactory(factory)
From d705bfba9aea65b3556fe057e1f7fedf8622da90 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 13 Apr 2017 23:18:52 +0300
Subject: [PATCH 174/736] [maven-release-plugin] prepare release 3.0.9
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 154153fe5..fd58ad39c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.9-SNAPSHOT
+ 3.0.9docker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ 3.0.9
From 53ee7e172f85ee994bc70ab5af3719cf1ab992d8 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Thu, 13 Apr 2017 23:19:03 +0300
Subject: [PATCH 175/736] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index fd58ad39c..8933bad62 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.9
+ 3.0.10-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- 3.0.9
+ HEAD
From dc87e0c592c133acc8ccac87a4cb0941eccdbb0e Mon Sep 17 00:00:00 2001
From: Dmitry Gusev
Date: Mon, 24 Apr 2017 01:01:36 +0300
Subject: [PATCH 176/736] Proposed fix for #830 (#832)
* Proposed fix for #830
* Simplify the fix for #830
---
.../command/BuildImageResultCallback.java | 26 +++++++++++--------
1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java
index 1ca276434..e622c4725 100644
--- a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java
+++ b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java
@@ -5,8 +5,6 @@
import java.util.concurrent.TimeUnit;
-import javax.annotation.CheckForNull;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,12 +21,17 @@ public class BuildImageResultCallback extends ResultCallbackTemplate
Date: Sun, 23 Apr 2017 23:03:39 +0100
Subject: [PATCH 177/736] Allow an explicit Dockerfile location string to be
specified to the build command (#825)
* When supplying a TAR stream to the build command, API consumers just want to pass a String location of the Dockerfile within the TAR stream they are supplying
* Add netty test for building with an explicitly specified Dockerfile location within a tar
---
.../dockerjava/api/command/BuildImageCmd.java | 2 ++
.../dockerjava/core/command/BuildImageCmdImpl.java | 13 ++++++++++++-
.../core/command/BuildImageCmdImplTest.java | 14 ++++++++++++++
.../netty/exec/BuildImageCmdExecTest.java | 14 ++++++++++++++
4 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
index ac98db2f9..0c9b7f5a4 100644
--- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
@@ -117,6 +117,8 @@ public interface BuildImageCmd extends AsyncDockerCmd files = FileUtils.listFiles(baseDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
+ File tarFile = CompressArchiveUtil.archiveTARFiles(baseDir, files, UUID.randomUUID().toString());
+ String response = dockerfileBuild(new FileInputStream(tarFile), "dockerfileFolder/Dockerfile");
+ assertThat(response, containsString("Successfully executed testrun.sh"));
+ }
+
@Test
public void onBuild() throws Exception {
File baseDir = fileFromBuildTestResource("ONBUILD/parent");
@@ -123,6 +132,11 @@ public void addFolder() throws Exception {
assertThat(response, containsString("Successfully executed testAddFolder.sh"));
}
+ private String dockerfileBuild(InputStream tarInputStream, String dockerFilePath) throws Exception {
+
+ return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream).withDockerfilePath(dockerFilePath));
+ }
+
private String dockerfileBuild(InputStream tarInputStream) throws Exception {
return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream));
diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
index f567dcfc8..63fcf7ea1 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
@@ -88,6 +88,15 @@ public void buildImageFromTar() throws Exception {
assertThat(response, containsString("Successfully executed testrun.sh"));
}
+ @Test
+ public void buildImageFromTarWithDockerfileNotInBaseDirectory() throws Exception {
+ File baseDir = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
+ Collection files = FileUtils.listFiles(baseDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
+ File tarFile = CompressArchiveUtil.archiveTARFiles(baseDir, files, UUID.randomUUID().toString());
+ String response = dockerfileBuild(new FileInputStream(tarFile), "dockerfileFolder/Dockerfile");
+ assertThat(response, containsString("Successfully executed testrun.sh"));
+ }
+
@Test
public void onBuild() throws Exception {
File baseDir = fileFromBuildTestResource("ONBUILD/parent");
@@ -128,6 +137,11 @@ public void addFolder() throws Exception {
assertThat(response, containsString("Successfully executed testAddFolder.sh"));
}
+ private String dockerfileBuild(InputStream tarInputStream, String dockerFilePath) throws Exception {
+
+ return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream).withDockerfilePath(dockerFilePath));
+ }
+
private String dockerfileBuild(InputStream tarInputStream) throws Exception {
return execBuild(dockerClient.buildImageCmd().withTarInputStream(tarInputStream));
From e81067367657c6dac686cd0e613f849685a5c3c3 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Mon, 24 Apr 2017 01:51:56 +0300
Subject: [PATCH 178/736] Add some coding styles.
TODO sync and share eclipse files?
---
.gitignore | 3 ++-
.idea/codeStyleSettings.xml | 12 ++++++++++++
.idea/encodings.xml | 7 +++++++
3 files changed, 21 insertions(+), 1 deletion(-)
create mode 100644 .idea/codeStyleSettings.xml
create mode 100644 .idea/encodings.xml
diff --git a/.gitignore b/.gitignore
index a705c1129..5399371c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,7 +12,8 @@ target
# Ignore InteliJ Idea project files
.idea
-.idea/*
+!.idea/codeStyleSettings.xml
+!.idea/encodings.xml
*.iml
*.iws
*.ipr
diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
new file mode 100644
index 000000000..6f3c789b4
--- /dev/null
+++ b/.idea/codeStyleSettings.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 000000000..c0bce7084
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
From 3ad99322f80ecd502cbe2fc68f7185c9d2807a3e Mon Sep 17 00:00:00 2001
From: Jonas Trollvik
Date: Thu, 27 Apr 2017 17:22:24 +0200
Subject: [PATCH 179/736] Add db LoggingType
Synology uses it's own logging type called db
---
src/main/java/com/github/dockerjava/api/model/LogConfig.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/com/github/dockerjava/api/model/LogConfig.java b/src/main/java/com/github/dockerjava/api/model/LogConfig.java
index e2a066101..2a3301287 100644
--- a/src/main/java/com/github/dockerjava/api/model/LogConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/LogConfig.java
@@ -79,6 +79,7 @@ public enum LoggingType {
GELF("gelf"),
FLUENTD("fluentd"),
AWSLOGS("awslogs"),
+ DB("db"), // Synology specific driver
SPLUNK("splunk");
private String type;
From 460406705daf705ae46467f2ffa6f371aafeed12 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Fri, 5 May 2017 05:12:40 +0300
Subject: [PATCH 180/736] Update CHANGELOG.md
---
CHANGELOG.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b0c7f2237..84f2b27d9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,12 @@ Change Log
===
## (dev) 3.1.0 (reserverd for swarm features)
+
+## 3.0.10
+- Custom `db` logging type
+- Allow an explicit Dockerfile location string to be specified to theuild command
+- Fix image build for docker 17 with 'tagged' word.
+
## 3.0.9
- NettyDockerCmdExecFactory ignores API version
- exclude commons-logging from httpclient since docker-java uses slf4j/logback
From c82b92d38374e242e8130af7282f8cf59c91297d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Warcha=C5=82?=
Date: Tue, 15 Nov 2016 13:48:57 +0100
Subject: [PATCH 181/736] Allow multiple tags in build image command
Several tags for image can be defined by calling multiple time withTag() method of BuildImageCmd.
In Netty implementation, the WebTarget class is modified to support several query parameteres with the same name.
Fix #720
---
.../dockerjava/api/command/BuildImageCmd.java | 19 +++++
.../core/command/BuildImageCmdImpl.java | 24 +++++-
.../dockerjava/jaxrs/BuildImageCmdExec.java | 9 +-
.../github/dockerjava/netty/WebTarget.java | 85 +++++++++++++++++--
.../netty/exec/BuildImageCmdExec.java | 34 +++-----
.../core/command/BuildImageCmdImplTest.java | 25 ++++++
.../netty/exec/BuildImageCmdExecTest.java | 25 ++++++
7 files changed, 189 insertions(+), 32 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
index ac98db2f9..a36b1b17e 100644
--- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
@@ -4,6 +4,7 @@
import java.io.InputStream;
import java.net.URI;
import java.util.Map;
+import java.util.Set;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
@@ -34,10 +35,21 @@ public interface BuildImageCmd extends AsyncDockerCmd getTags();
+
/**
* "remote" in API
*/
@@ -109,8 +121,15 @@ public interface BuildImageCmd extends AsyncDockerCmd)}
+ */
+ @Deprecated
BuildImageCmd withTag(String tag);
+ BuildImageCmd withTags(Set tags);
+
BuildImageCmd withRemote(URI remote);
BuildImageCmd withBaseDirectory(File baseDirectory);
diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
index c34b05155..97629568c 100644
--- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
@@ -8,6 +8,7 @@
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
+import java.util.Set;
import com.github.dockerjava.api.command.BuildImageCmd;
import com.github.dockerjava.api.model.AuthConfigurations;
@@ -15,17 +16,20 @@
import com.github.dockerjava.core.dockerfile.Dockerfile;
import com.github.dockerjava.core.util.FilePathUtil;
+import javax.annotation.CheckForNull;
+
/**
- *
* Build an image from Dockerfile.
- *
*/
public class BuildImageCmdImpl extends AbstrAsyncDockerCmd implements BuildImageCmd {
private InputStream tarInputStream;
+ @Deprecated
private String tag;
+ private Set tags;
+
private Boolean noCache;
private Boolean remove = true;
@@ -82,11 +86,17 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) {
// getters API
+ @Deprecated
@Override
public String getTag() {
return tag;
}
+ @CheckForNull
+ public Set getTags() {
+ return tags;
+ }
+
@Override
public URI getRemote() {
return remote;
@@ -178,6 +188,10 @@ public Long getShmsize() {
// setters
+ /**
+ * @deprecated use #withTags()
+ */
+ @Deprecated
@Override
public BuildImageCmdImpl withTag(String tag) {
checkNotNull(tag, "Tag is null");
@@ -185,6 +199,12 @@ public BuildImageCmdImpl withTag(String tag) {
return this;
}
+ @Override
+ public BuildImageCmd withTags(Set tags) {
+ this.tags = tags;
+ return this;
+ }
+
@Override
public BuildImageCmd withRemote(URI remote) {
this.remote = remote;
diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
index 2a7aea40e..ae2302b0d 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
@@ -1,6 +1,7 @@
package com.github.dockerjava.jaxrs;
import static javax.ws.rs.client.Entity.entity;
+import static org.apache.commons.lang.StringUtils.isNotBlank;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
@@ -65,9 +66,15 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag
if (dockerFilePath != null && command.getRemote() == null && !"Dockerfile".equals(dockerFilePath)) {
webTarget = webTarget.queryParam("dockerfile", dockerFilePath);
}
- if (command.getTag() != null) {
+
+ if (command.getTags() != null && !command.getTags().isEmpty()) {
+ for (String t : command.getTags()) {
+ webTarget = webTarget.queryParam("t", t);
+ }
+ } else if (isNotBlank(command.getTag())) {
webTarget = webTarget.queryParam("t", command.getTag());
}
+
if (command.getRemote() != null) {
webTarget = webTarget.queryParam("remote", command.getRemote().toString());
}
diff --git a/src/main/java/com/github/dockerjava/netty/WebTarget.java b/src/main/java/com/github/dockerjava/netty/WebTarget.java
index ef1510f5c..96fb42bec 100644
--- a/src/main/java/com/github/dockerjava/netty/WebTarget.java
+++ b/src/main/java/com/github/dockerjava/netty/WebTarget.java
@@ -1,22 +1,32 @@
package com.github.dockerjava.netty;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableSet;
+import io.netty.handler.codec.http.HttpConstants;
import org.apache.commons.lang.StringUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
/**
- * This class is basically a replacement of javax.ws.rs.client.WebTarget to allow simpler migration of JAX-RS code to a netty based
+ * This class is basically a replacement of {@link javax.ws.rs.client.WebTarget} to allow simpler migration of JAX-RS code to a netty based
* implementation.
*
* @author Marcus Linke
*/
public class WebTarget {
+ private static final ObjectMapper MAPPER = new ObjectMapper();
private final ChannelProvider channelProvider;
@@ -24,18 +34,26 @@ public class WebTarget {
private final ImmutableMap queryParams;
+ /**
+ * Multiple values for the same name param.
+ */
+ private final ImmutableMap> queryParamsSet;
+
private static final String PATH_SEPARATOR = "/";
public WebTarget(ChannelProvider channelProvider) {
- this(channelProvider, ImmutableList.of(), ImmutableMap.of());
+ this(channelProvider, ImmutableList.of(), ImmutableMap.of(),
+ ImmutableMap.>of());
}
private WebTarget(ChannelProvider channelProvider,
ImmutableList path,
- ImmutableMap queryParams) {
+ ImmutableMap queryParams,
+ ImmutableMap> queryParamsSet) {
this.channelProvider = channelProvider;
this.path = path;
this.queryParams = queryParams;
+ this.queryParamsSet = queryParamsSet;
}
public WebTarget path(String... components) {
@@ -45,7 +63,7 @@ public WebTarget path(String... components) {
newPath.addAll(Arrays.asList(StringUtils.split(component, PATH_SEPARATOR)));
}
- return new WebTarget(channelProvider, newPath.build(), queryParams);
+ return new WebTarget(channelProvider, newPath.build(), queryParams, queryParamsSet);
}
public InvocationBuilder request() {
@@ -53,7 +71,13 @@ public InvocationBuilder request() {
List params = new ArrayList<>();
for (Map.Entry entry : queryParams.entrySet()) {
- params.add(entry.getKey() + "=" + entry.getValue());
+ params.add(entry.getKey() + "=" + encodeComponent(entry.getValue(), HttpConstants.DEFAULT_CHARSET));
+ }
+
+ for (Map.Entry> entry : queryParamsSet.entrySet()) {
+ for (String entryValueValue : entry.getValue()) {
+ params.add(entry.getKey() + "=" + encodeComponent(entryValueValue, HttpConstants.DEFAULT_CHARSET));
+ }
}
if (!params.isEmpty()) {
@@ -63,13 +87,25 @@ public InvocationBuilder request() {
return new InvocationBuilder(channelProvider, resource);
}
+ /**
+ * @see io.netty.handler.codec.http.QueryStringEncoder
+ */
+ private static String encodeComponent(String s, Charset charset) {
+ // TODO: Optimize me.
+ try {
+ return URLEncoder.encode(s, charset.name()).replace("+", "%20");
+ } catch (UnsupportedEncodingException ignored) {
+ throw new UnsupportedCharsetException(charset.name());
+ }
+ }
+
public WebTarget resolveTemplate(String name, Object value) {
ImmutableList.Builder newPath = ImmutableList.builder();
for (String component : path) {
component = component.replaceAll("\\{" + name + "\\}", value.toString());
newPath.add(component);
}
- return new WebTarget(channelProvider, newPath.build(), queryParams);
+ return new WebTarget(channelProvider, newPath.build(), queryParams, queryParamsSet);
}
public WebTarget queryParam(String name, Object value) {
@@ -77,7 +113,32 @@ public WebTarget queryParam(String name, Object value) {
if (value != null) {
builder.put(name, value.toString());
}
- return new WebTarget(channelProvider, path, builder.build());
+ return new WebTarget(channelProvider, path, builder.build(), queryParamsSet);
+ }
+
+ public WebTarget queryParamsSet(String name, Set> values) {
+ ImmutableMap.Builder> builder = ImmutableMap.>builder().putAll(queryParamsSet);
+ if (values != null) {
+ ImmutableSet.Builder valueBuilder = ImmutableSet.builder();
+ for (Object value : values) {
+ valueBuilder.add(value.toString());
+ }
+ builder.put(name, valueBuilder.build());
+ }
+ return new WebTarget(channelProvider, path, queryParams, builder.build());
+ }
+
+ public WebTarget queryParamsJsonMap(String name, Map values) {
+ if (values != null && !values.isEmpty()) {
+ try {
+ // when param value is JSON string
+ return queryParam(name, MAPPER.writeValueAsString(values));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ return this;
+ }
}
@Override
@@ -97,7 +158,14 @@ public boolean equals(Object o) {
if (path != null ? !path.equals(webTarget.path) : webTarget.path != null) {
return false;
}
- return queryParams != null ? queryParams.equals(webTarget.queryParams) : webTarget.queryParams == null;
+ if (queryParams != null ? !queryParams.equals(webTarget.queryParams) : webTarget.queryParams != null) {
+ return false;
+ }
+ if (queryParamsSet != null ? !queryParamsSet.equals(webTarget.queryParamsSet) : webTarget.queryParamsSet != null) {
+ return false;
+ }
+
+ return true;
}
@Override
@@ -105,6 +173,7 @@ public int hashCode() {
int result = channelProvider != null ? channelProvider.hashCode() : 0;
result = 31 * result + (path != null ? path.hashCode() : 0);
result = 31 * result + (queryParams != null ? queryParams.hashCode() : 0);
+ result = 31 * result + (queryParamsSet != null ? queryParamsSet.hashCode() : 0);
return result;
}
}
diff --git a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
index 43152570e..bbca686e0 100644
--- a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
@@ -1,6 +1,5 @@
package com.github.dockerjava.netty.exec;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -14,15 +13,12 @@
import com.github.dockerjava.netty.MediaType;
import com.github.dockerjava.netty.WebTarget;
-import java.io.IOException;
-import java.util.Map;
+import static org.apache.commons.lang.StringUtils.isNotBlank;
public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements
BuildImageCmd.Exec {
private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class);
- private static final ObjectMapper MAPPER = new ObjectMapper();
-
public BuildImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
super(baseResource, dockerClientConfig);
}
@@ -55,9 +51,13 @@ protected Void execute0(BuildImageCmd command, ResultCallback
if (dockerFilePath != null && command.getRemote() == null && !"Dockerfile".equals(dockerFilePath)) {
webTarget = webTarget.queryParam("dockerfile", dockerFilePath);
}
- if (command.getTag() != null) {
- webTarget = webTarget.queryParam("t", command.getTag());
+
+ if (command.getTags() != null && !command.getTags().isEmpty()) {
+ webTarget = webTarget.queryParamsSet("t", command.getTags());
+ } else if (isNotBlank(command.getTag())) {
+ webTarget = webTarget.queryParam("t", command.getTags());
}
+
if (command.getRemote() != null) {
webTarget = webTarget.queryParam("remote", command.getRemote().toString());
}
@@ -86,13 +86,17 @@ protected Void execute0(BuildImageCmd command, ResultCallback
webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus());
}
- webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs());
+ if (command.getBuildArgs() != null) {
+ webTarget = webTarget.queryParamsJsonMap("buildargs", command.getBuildArgs());
+ }
if (command.getShmsize() != null) {
webTarget = webTarget.queryParam("shmsize", command.getShmsize());
}
- webTarget = writeMap(webTarget, "labels", command.getLabels());
+ if (command.getLabels() != null) {
+ webTarget = webTarget.queryParamsJsonMap("labels", command.getLabels());
+ }
LOGGER.trace("POST: {}", webTarget);
@@ -106,16 +110,4 @@ protected Void execute0(BuildImageCmd command, ResultCallback
return null;
}
-
- private WebTarget writeMap(WebTarget webTarget, String name, Map value) {
- if (value != null && !value.isEmpty()) {
- try {
- return webTarget.queryParam(name, MAPPER.writeValueAsString(value));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- } else {
- return webTarget;
- }
- }
}
diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
index cb4c1b2a8..9ba283732 100644
--- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
@@ -7,13 +7,16 @@
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
+import static org.hamcrest.Matchers.containsInAnyOrder;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
@@ -274,6 +277,28 @@ public void labels() throws Exception {
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
}
+ @Test
+ public void multipleTags() throws Exception {
+ if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_21)) {
+ throw new SkipException("API version should be >= 1.21");
+ }
+
+ File baseDir = fileFromBuildTestResource("labels");
+
+ String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true)
+ .withTag("fallback-when-withTags-not-called")
+ .withTags(new HashSet<>(Arrays.asList("docker-java-test:tag1", "docker-java-test:tag2")))
+ .exec(new BuildImageResultCallback())
+ .awaitImageId();
+
+ InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
+ assertThat(inspectImageResponse, not(nullValue()));
+ LOG.info("Image Inspect: {}", inspectImageResponse.toString());
+
+ assertThat(inspectImageResponse.getRepoTags().size(), equalTo(2));
+ assertThat(inspectImageResponse.getRepoTags(), containsInAnyOrder("docker-java-test:tag1", "docker-java-test:tag2"));
+ }
+
public void dockerfileNotInBaseDirectory() throws Exception {
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
index f567dcfc8..55dcf353b 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
@@ -7,13 +7,16 @@
import static org.hamcrest.Matchers.isEmptyString;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
+import static org.hamcrest.Matchers.containsInAnyOrder;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
@@ -279,6 +282,28 @@ public void labels() throws Exception {
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
}
+ @Test
+ public void multipleTags() throws Exception {
+ if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_21)) {
+ throw new SkipException("API version should be >= 1.21");
+ }
+
+ File baseDir = fileFromBuildTestResource("labels");
+
+ String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true)
+ .withTag("fallback-when-withTags-not-called")
+ .withTags(new HashSet<>(Arrays.asList("docker-java-test:tag1", "docker-java-test:tag2")))
+ .exec(new BuildImageResultCallback())
+ .awaitImageId();
+
+ InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
+ assertThat(inspectImageResponse, not(nullValue()));
+ LOG.info("Image Inspect: {}", inspectImageResponse.toString());
+
+ assertThat(inspectImageResponse.getRepoTags().size(), equalTo(2));
+ assertThat(inspectImageResponse.getRepoTags(), containsInAnyOrder("docker-java-test:tag1", "docker-java-test:tag2"));
+ }
+
public void dockerfileNotInBaseDirectory() throws Exception {
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
From e5e674a73199633ed05817d4283ec9e160c8ec0d Mon Sep 17 00:00:00 2001
From: kannan-ca
Date: Thu, 11 May 2017 17:05:01 -0400
Subject: [PATCH 182/736] Docker API update to 1.25 and support for cache-from
command as part of the docker build
---
.../dockerjava/api/command/BuildImageCmd.java | 11 +++++++++
.../dockerjava/core/RemoteApiVersion.java | 6 +++++
.../core/command/BuildImageCmdImpl.java | 13 ++++++++++
.../dockerjava/jaxrs/BuildImageCmdExec.java | 6 +++++
.../netty/exec/BuildImageCmdExec.java | 8 ++++++-
.../core/command/BuildImageCmdImplTest.java | 24 +++++++++++++++++++
.../netty/exec/BuildImageCmdExecTest.java | 23 ++++++++++++++++++
7 files changed, 90 insertions(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
index 2a08f4cf5..59a0d2077 100644
--- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
@@ -50,6 +50,12 @@ public interface BuildImageCmd extends AsyncDockerCmd getTags();
+ /**
+ * "Cache-from" in API
+ */
+ @CheckForNull
+ Set getCacheFrom();
+
/**
* "remote" in API
*/
@@ -130,6 +136,11 @@ public interface BuildImageCmd extends AsyncDockerCmd tags);
+ /*
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ BuildImageCmd withCacheFrom(Set cacheFrom);
+
BuildImageCmd withRemote(URI remote);
BuildImageCmd withBaseDirectory(File baseDirectory);
diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
index f40b5b4d5..44c4f0237 100644
--- a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
+++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
@@ -72,6 +72,12 @@ public class RemoteApiVersion implements Serializable {
*/
public static final RemoteApiVersion VERSION_1_24 = RemoteApiVersion.create(1, 24);
+ /*
+ * @see Docker API 1.25
+ */
+ public static final RemoteApiVersion VERSION_1_25 = RemoteApiVersion.create(1, 25);
+
+
/**
* Unknown, docker doesn't reflect reality. I.e. we implemented method, but for javadoc it not clear when it was added.
*/
diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
index fedd8bf98..cb9e81a39 100644
--- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java
@@ -30,6 +30,8 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd tags;
+ private Set cacheFrom;
+
private Boolean noCache;
private Boolean remove = true;
@@ -99,6 +101,11 @@ public Set getTags() {
return tags;
}
+ @CheckForNull
+ public Set getCacheFrom() {
+ return cacheFrom;
+ }
+
@Override
public URI getRemote() {
return remote;
@@ -209,6 +216,12 @@ public BuildImageCmd withTags(Set tags) {
return this;
}
+ @Override
+ public BuildImageCmd withCacheFrom(Set cacheFrom) {
+ this.cacheFrom = cacheFrom;
+ return this;
+ }
+
@Override
public BuildImageCmd withRemote(URI remote) {
this.remote = remote;
diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
index ae2302b0d..7ce132963 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java
@@ -75,6 +75,12 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag
webTarget = webTarget.queryParam("t", command.getTag());
}
+ if (command.getCacheFrom() != null) {
+ for (String c: command.getCacheFrom()) {
+ webTarget = webTarget.queryParam("cachefrom", c);
+ }
+ }
+
if (command.getRemote() != null) {
webTarget = webTarget.queryParam("remote", command.getRemote().toString());
}
diff --git a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
index bbca686e0..321ae63c1 100644
--- a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
@@ -55,7 +55,13 @@ protected Void execute0(BuildImageCmd command, ResultCallback
if (command.getTags() != null && !command.getTags().isEmpty()) {
webTarget = webTarget.queryParamsSet("t", command.getTags());
} else if (isNotBlank(command.getTag())) {
- webTarget = webTarget.queryParam("t", command.getTags());
+ webTarget = webTarget.queryParam("t", command.getTag());
+ }
+
+ if (command.getCacheFrom() != null) {
+ for (String c: command.getCacheFrom()) {
+ webTarget = webTarget.queryParam("cachefrom", c);
+ }
}
if (command.getRemote() != null) {
diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
index a655af126..20ac2b62d 100644
--- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java
@@ -312,6 +312,30 @@ public void multipleTags() throws Exception {
assertThat(inspectImageResponse.getRepoTags().size(), equalTo(2));
assertThat(inspectImageResponse.getRepoTags(), containsInAnyOrder("docker-java-test:tag1", "docker-java-test:tag2"));
}
+
+ @Test
+ public void cacheFrom() throws Exception {
+ if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_25)) {
+ throw new SkipException("API version should be >= 1.25");
+ }
+ File baseDir1 = fileFromBuildTestResource("CacheFrom/test1");
+ String imageId1 = dockerClient.buildImageCmd(baseDir1)
+ .exec(new BuildImageResultCallback())
+ .awaitImageId();
+ InspectImageResponse inspectImageResponse1 = dockerClient.inspectImageCmd(imageId1).exec();
+ assertThat(inspectImageResponse1, not(nullValue()));
+
+ File baseDir2 = fileFromBuildTestResource("CacheFrom/test2");
+ String imageId2 = dockerClient.buildImageCmd(baseDir2).withCacheFrom(new HashSet<>(Arrays.asList(imageId1)))
+ .exec(new BuildImageResultCallback())
+ .awaitImageId();
+ InspectImageResponse inspectImageResponse2 = dockerClient.inspectImageCmd(imageId2).exec();
+ assertThat(inspectImageResponse2, not(nullValue()));
+
+ // Compare whether the image2's parent layer is from image1 so that cache is used
+ assertThat(inspectImageResponse2.getParent(), equalTo(inspectImageResponse1.getId()));
+
+ }
public void dockerfileNotInBaseDirectory() throws Exception {
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
index b5df27d37..54ede31dd 100644
--- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
+++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java
@@ -318,6 +318,29 @@ public void multipleTags() throws Exception {
assertThat(inspectImageResponse.getRepoTags(), containsInAnyOrder("docker-java-test:tag1", "docker-java-test:tag2"));
}
+ @Test
+ public void cacheFrom() throws Exception {
+ if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_25)) {
+ throw new SkipException("API version should be >= 1.25");
+ }
+ File baseDir1 = fileFromBuildTestResource("CacheFrom/test1");
+ String imageId1 = dockerClient.buildImageCmd(baseDir1)
+ .exec(new BuildImageResultCallback())
+ .awaitImageId();
+ InspectImageResponse inspectImageResponse1 = dockerClient.inspectImageCmd(imageId1).exec();
+ assertThat(inspectImageResponse1, not(nullValue()));
+
+ File baseDir2 = fileFromBuildTestResource("CacheFrom/test2");
+ String imageId2 = dockerClient.buildImageCmd(baseDir2).withCacheFrom(new HashSet<>(Arrays.asList(imageId1)))
+ .exec(new BuildImageResultCallback())
+ .awaitImageId();
+ InspectImageResponse inspectImageResponse2 = dockerClient.inspectImageCmd(imageId2).exec();
+ assertThat(inspectImageResponse2, not(nullValue()));
+
+ // Compare whether the image2's parent layer is from image1 so that cache is used
+ assertThat(inspectImageResponse2.getParent(), equalTo(inspectImageResponse1.getId()));
+ }
+
public void dockerfileNotInBaseDirectory() throws Exception {
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
From 05a9a74d55fd321ac2285170a56e330306c3c207 Mon Sep 17 00:00:00 2001
From: kannan-ca
Date: Wed, 17 May 2017 10:05:05 -0400
Subject: [PATCH 183/736] Used existing queryParamSet method
---
.../com/github/dockerjava/netty/exec/BuildImageCmdExec.java | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
index 321ae63c1..a99dac833 100644
--- a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
+++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java
@@ -58,10 +58,8 @@ protected Void execute0(BuildImageCmd command, ResultCallback
webTarget = webTarget.queryParam("t", command.getTag());
}
- if (command.getCacheFrom() != null) {
- for (String c: command.getCacheFrom()) {
- webTarget = webTarget.queryParam("cachefrom", c);
- }
+ if (command.getCacheFrom() != null && !command.getCacheFrom().isEmpty()) {
+ webTarget = webTarget.queryParamsSet("cachefrom", command.getCacheFrom());
}
if (command.getRemote() != null) {
From 5444f05f88b97c4a2963964eb400678910e92e89 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 17 May 2017 19:30:07 +0300
Subject: [PATCH 184/736] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 84f2b27d9..d2da1378a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,8 @@ Change Log
## 3.0.10
+- Support for cache-from in build image command
+- Allow multiple tags in build image command
- Custom `db` logging type
- Allow an explicit Dockerfile location string to be specified to theuild command
- Fix image build for docker 17 with 'tagged' word.
From b014f26dce76e67e6c133c36079154a710e3c838 Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 17 May 2017 20:01:38 +0300
Subject: [PATCH 185/736] [maven-release-plugin] prepare release 3.0.10
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 8933bad62..0ba096dc5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.10-SNAPSHOT
+ 3.0.10docker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- HEAD
+ 3.0.10
From a14ace4f972a3de4cac3ddc3cb0f7006f629cfdf Mon Sep 17 00:00:00 2001
From: Kanstantsin Shautsou
Date: Wed, 17 May 2017 20:01:49 +0300
Subject: [PATCH 186/736] [maven-release-plugin] prepare for next development
iteration
---
pom.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 0ba096dc5..10fad3860 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
com.github.docker-javadocker-javajar
- 3.0.10
+ 3.0.11-SNAPSHOTdocker-javahttps://github.com/docker-java/docker-java
@@ -28,7 +28,7 @@
scm:git:git@github.com:docker-java/docker-java.gitgit@github.com:docker-java/docker-java.gitscm:git:git@github.com:docker-java/docker-java.git
- 3.0.10
+ HEAD
From 342feb6f9cd2d3a7d17cf56b36aff6ad6fa02ad3 Mon Sep 17 00:00:00 2001
From: Ted Xiao
Date: Tue, 23 May 2017 14:51:22 +0800
Subject: [PATCH 187/736] ignore application/x-tar
---
.../github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java
index 2251d8fad..36256fca0 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java
@@ -24,6 +24,7 @@ public class SelectiveLoggingFilter extends LoggingFilter {
Set s = new HashSet();
s.add(MediaType.APPLICATION_OCTET_STREAM);
s.add("application/tar");
+ s.add("application/x-tar");
SKIPPED_CONTENT = Collections.unmodifiableSet(s);
}
From c44eba80e7742195e78351ed1bf35452066ff4f1 Mon Sep 17 00:00:00 2001
From: Ted Xiao
Date: Tue, 23 May 2017 21:40:06 +0800
Subject: [PATCH 188/736] allow user to call connectionManager's
closeIdleConnections
---
.../jaxrs/JerseyDockerCmdExecFactory.java | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
index 4b7f2f67e..1d9d65f0a 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
@@ -9,6 +9,7 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.ws.rs.client.Client;
@@ -266,7 +267,7 @@ private void configureProxy(ClientConfig clientConfig, URI originalUri, String p
}
private org.apache.http.config.Registry getSchemeRegistry(final URI originalUri,
- SSLContext sslContext) {
+ SSLContext sslContext) {
RegistryBuilder registryBuilder = RegistryBuilder.create();
registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory());
if (sslContext != null) {
@@ -589,4 +590,14 @@ public JerseyDockerCmdExecFactory withClientRequestFilters(ClientRequestFilter..
return this;
}
+
+ /**
+ * release connections from the pool
+ *
+ * @param idleSeconds idle seconds, longer than the configured value will be evicted
+ */
+ public void releaseConnection(long idleSeconds) {
+ this.connManager.closeExpiredConnections();
+ this.connManager.closeIdleConnections(idleSeconds, TimeUnit.SECONDS);
+ }
}
From d700d721c13de2fd5b60c4e8db107652aa614843 Mon Sep 17 00:00:00 2001
From: Ted Xiao
Date: Thu, 18 May 2017 19:16:16 +0800
Subject: [PATCH 189/736] add labels and attachable properties to network
---
.../api/command/CreateNetworkCmd.java | 20 ++++++++++
.../github/dockerjava/api/model/Network.java | 25 +++++++++++++
.../core/command/CreateNetworkCmdImpl.java | 37 +++++++++++++++++++
.../command/CreateContainerCmdImplTest.java | 24 ++++++++++++
.../command/CreateNetworkCmdImplTest.java | 34 +++++++++++++++++
5 files changed, 140 insertions(+)
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
index 39989bd13..298e05aca 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
@@ -36,6 +36,12 @@ public interface CreateNetworkCmd extends SyncDockerCmd {
@CheckForNull
Boolean getEnableIPv6();
+ @CheckForNull
+ Boolean getAttachable();
+
+ @CheckForNull
+ Map getLabels();
+
/** The new network's name. Required. */
CreateNetworkCmd withName(@Nonnull String name);
@@ -54,6 +60,20 @@ public interface CreateNetworkCmd extends SyncDockerCmd {
CreateNetworkCmd withEnableIpv6(boolean enableIpv6);
+ /**
+ * If enabled, and the network is in the global scope, non-service containers on worker nodes will be able to connect to the network.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_21}
+ */
+ CreateNetworkCmd withAttachable(Boolean attachable);
+
+ /**
+ * Add label for network
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ CreateNetworkCmd withLabels(Map labels);
+
interface Exec extends DockerCmdSyncExec {
}
}
diff --git a/src/main/java/com/github/dockerjava/api/model/Network.java b/src/main/java/com/github/dockerjava/api/model/Network.java
index c0f9f36eb..2a532f88c 100644
--- a/src/main/java/com/github/dockerjava/api/model/Network.java
+++ b/src/main/java/com/github/dockerjava/api/model/Network.java
@@ -37,6 +37,12 @@ public class Network implements Serializable {
@JsonProperty("Options")
private Map options;
+ @JsonProperty("Attachable")
+ private Boolean attachable;
+
+ @JsonProperty("Labels")
+ public Map labels;
+
public String getId() {
return id;
}
@@ -65,6 +71,14 @@ public Map getOptions() {
return options;
}
+ public Boolean isAttachable() {
+ return attachable;
+ }
+
+ public Map getLabels() {
+ return labels;
+ }
+
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
@@ -158,6 +172,9 @@ public static class Config {
@JsonProperty("Gateway")
private String gateway;
+ @JsonProperty("NetworkID")
+ private String networkID;
+
public String getSubnet() {
return subnet;
}
@@ -184,6 +201,14 @@ public Config withGateway(String gateway) {
this.gateway = gateway;
return this;
}
+
+ public String getNetworkID() {
+ return networkID;
+ }
+
+ public void setNetworkID(String networkID) {
+ this.networkID = networkID;
+ }
}
}
}
diff --git a/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java
index 834aa6905..e6cff4c09 100644
--- a/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java
+++ b/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java
@@ -10,6 +10,8 @@
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.api.model.Network.Ipam;
+import static com.google.common.base.Preconditions.checkNotNull;
+
public class CreateNetworkCmdImpl extends AbstrDockerCmd
implements CreateNetworkCmd {
@@ -34,6 +36,12 @@ public class CreateNetworkCmdImpl extends AbstrDockerCmd labels;
+
public CreateNetworkCmdImpl(DockerCmdSyncExec execution) {
super(execution);
}
@@ -114,4 +122,33 @@ public CreateNetworkCmd withEnableIpv6(boolean enableIpv6) {
this.enableIpv6 = enableIpv6;
return this;
}
+
+ @Override
+ public Boolean getAttachable() {
+ return this.attachable;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public CreateNetworkCmd withAttachable(Boolean attachable) {
+ this.attachable = attachable;
+ return this;
+ }
+
+ @Override
+ public Map getLabels() {
+ return labels;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public CreateNetworkCmd withLabels(Map labels) {
+ checkNotNull(labels, "labels was not specified");
+ this.labels = labels;
+ return this;
+ }
}
diff --git a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
index 7c625ea94..53c9d9ad0 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java
@@ -777,4 +777,28 @@ public void createContainerWithShmPidsLimit() throws DockerException {
assertThat(inspectContainerResponse.getHostConfig().getPidsLimit(), is(hostConfig.getPidsLimit()));
}
+
+ @Test
+ public void createContainerWithNetworkID() {
+ final RemoteApiVersion apiVersion = getVersion(dockerClient);
+ if (!apiVersion.isGreaterOrEqual(RemoteApiVersion.VERSION_1_24)) {
+ throw new SkipException("API version should be >= 1.24");
+ }
+ String networkName = "net-" + UUID.randomUUID().toString();
+ Map labels=new HashMap<>();
+ labels.put("com.example.label","test");
+ CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd().withName(networkName)
+ .withLabels(labels).withAttachable(true).exec();
+ String networkId = createNetworkResponse.getId();
+ CreateContainerResponse createContainerResponse = dockerClient.createContainerCmd(BUSYBOX_IMAGE).withLabels(labels).withCmd("true").exec();
+ String containerId = createContainerResponse.getId();
+ dockerClient.connectToNetworkCmd().withContainerId(containerId).withNetworkId(networkId).exec();
+ InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(containerId).exec();
+ ContainerNetwork containerNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get(networkName);
+ if(containerNetwork==null){
+ // swarm node used network id
+ containerNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get(networkId);
+ }
+ assertThat(containerNetwork, notNullValue());
+ }
}
diff --git a/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java
index cc70331f2..7dae2e1d6 100644
--- a/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java
+++ b/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java
@@ -4,7 +4,9 @@
import com.github.dockerjava.api.exception.DockerException;
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.client.AbstractDockerClientTest;
+import com.github.dockerjava.core.RemoteApiVersion;
import org.testng.ITestResult;
+import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
@@ -12,6 +14,10 @@
import org.testng.annotations.Test;
import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.github.dockerjava.utils.TestUtils.getVersion;
@Test(groups = "integration")
public class CreateNetworkCmdImplTest extends AbstractDockerClientTest {
@@ -64,4 +70,32 @@ public void createNetworkWithIpamConfig() throws DockerException {
assertEquals(network.getDriver(), "bridge");
assertEquals("10.67.79.0/24", network.getIpam().getConfig().iterator().next().getSubnet());
}
+
+ @Test
+ public void createAttachableNetwork() throws DockerException {
+ final RemoteApiVersion apiVersion = getVersion(dockerClient);
+ if (!apiVersion.isGreaterOrEqual(RemoteApiVersion.VERSION_1_24)) {
+ throw new SkipException("API version should be >= 1.24");
+ }
+ String networkName = "createAttachableNetwork";
+ CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd().withName(networkName).withAttachable(true).exec();
+ assertNotNull(createNetworkResponse.getId());
+ Network network = dockerClient.inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec();
+ assertTrue(network.isAttachable());
+ }
+
+ @Test
+ public void createNetworkWithLabel() throws DockerException {
+ final RemoteApiVersion apiVersion = getVersion(dockerClient);
+ if (!apiVersion.isGreaterOrEqual(RemoteApiVersion.VERSION_1_21)) {
+ throw new SkipException("API version should be >= 1.21");
+ }
+ String networkName = "createNetworkWithLabel";
+ Map labels=new HashMap<>();
+ labels.put("com.example.usage","test");
+ CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd().withName(networkName).withLabels(labels).exec();
+ assertNotNull(createNetworkResponse.getId());
+ Network network = dockerClient.inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec();
+ assertEquals(network.getLabels(), labels);
+ }
}
From a9b78cc4f5ec45c0bdeec2e68136f8a59b96b1c3 Mon Sep 17 00:00:00 2001
From: Ted Xiao
Date: Tue, 23 May 2017 18:14:36 +0800
Subject: [PATCH 190/736] clean tmp file after upload
---
.idea/codeStyleSettings.xml | 1 +
.../CopyArchiveToContainerCmdImpl.java | 30 ++++++++++++-------
2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
index 6f3c789b4..9e5672189 100644
--- a/.idea/codeStyleSettings.xml
+++ b/.idea/codeStyleSettings.xml
@@ -5,6 +5,7 @@