diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 000000000..378ed51b9
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,13 @@
+pipeline {
+ agent any
+ tools {
+ maven 'maven'
+ }
+ stages {
+ stage('Build') {
+ steps {
+ sh 'mvn -DskipTests -Dmaven.test.skip=true clean test package install'
+ }
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
index 10fad3860..a17e33740 100644
--- a/pom.xml
+++ b/pom.xml
@@ -265,343 +265,17 @@
test
-
-
-
- ossrh
- https://oss.sonatype.org/content/repositories/snapshots
-
-
- ossrh
- https://oss.sonatype.org/service/local/staging/deploy/maven2/
-
-
-
-
-
- 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
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-release-plugin
- ${maven-release-plugin.version}
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${jdk.source}
- ${jdk.target}
- ${jdk.debug}
- ${jdk.optimize}
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- ${maven-jar-plugin.version}
-
-
- target/classes/META-INF/MANIFEST.MF
-
-
-
-
-
- test-jar
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-antrun-plugin
- ${maven-antrun-plugin.version}
-
-
- validate
-
- run
-
-
-
- *******************************************************************
- *******************************************************************
- [project.name] : ${project.name}
- [project.basedir] : ${project.basedir}
- [project.version] : ${project.version}
- [project.artifactId] ${project.artifactId}
- [project.build.directory] ${project.build.directory}
- [jdk.source] : ${jdk.source}
- [jdk.target] : ${jdk.target}
- [jdk.debug] : ${jdk.debug}
- [jdk.optimize] : ${jdk.optimize}
- [source encoding]: ${project.build.sourceEncoding}
- [LocalRepository] : ${settings.localRepository}
- *******************************************************************
- *******************************************************************
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
- 3.0.1
-
-
- attach-sources
-
- jar-no-fork
-
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 2.10.4
-
-
- attach-javadocs
-
- jar
-
-
- -Xdoclint:none
-
-
-
-
-
-
-
- org.sonatype.plugins
- nexus-staging-maven-plugin
- 1.6.7
- true
-
- ossrh
- https://oss.sonatype.org/
- true
-
-
-
-
- org.apache.maven.plugins
- maven-release-plugin
- ${maven-release-plugin.version}
-
- true
- false
- release
- deploy nexus-staging:release
-
-
-
org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
+ maven-compiler-plugin
+ 3.6.1
- 3
- integration,integration-auth
+ 1.8
+ 1.8
-
-
- org.apache.maven.plugins
- maven-failsafe-plugin
- ${maven-failsafe-plugin.version}
-
-
-
- integration-test
- verify
-
-
- 3
- true
- true
- 1
- integration
- integration-auth
-
- **/*Test.java
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-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
-
-
-
-
-
-
-
- release
-
-
-
- org.apache.maven.plugins
- maven-gpg-plugin
-
-
- sign-artifacts
- verify
-
- sign
-
-
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
-
-
-
-
-
- docker-java-analyses
-
- true
-
-
-
-
- maven-checkstyle-plugin
- 2.17
-
-
- checkstyle
- validate
-
- check
-
-
-
-
- UTF-8
- true
- true
- false
-
-
- src/test/resources/checkstyle/checkstyle-config.xml
-
-
-
-
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.3
-
- Max
- Low
- true
-
- false
-
-
-
-
- check
-
-
-
-
-
- org.jacoco
- jacoco-maven-plugin
- 0.7.7.201606060606
-
-
-
- prepare-agent
-
-
-
-
- post-unit-test
- test
-
- report
-
-
-
-
- pre-integration-test
- pre-integration-test
-
- prepare-agent-integration
-
-
-
- report-integration
-
- report-integration
-
-
-
-
-
-
-
-
-
diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java
index 8f35fac12..1c1e70dbf 100644
--- a/src/main/java/com/github/dockerjava/api/DockerClient.java
+++ b/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -32,6 +32,7 @@
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.ListImageHistoryCmd;
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
@@ -45,6 +46,7 @@
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.RenameContainerCmd;
import com.github.dockerjava.api.command.RestartContainerCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.command.SearchImagesCmd;
@@ -57,7 +59,6 @@
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.api.exception.DockerException;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.Identifier;
@@ -255,6 +256,8 @@ public interface DockerClient extends Closeable {
DisconnectFromNetworkCmd disconnectFromNetworkCmd();
+ ListImageHistoryCmd listImageHistoryCmd(@Nonnull String imageId);
+
@Override
void close() throws IOException;
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 671c0d535..c398c2cea 100644
--- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
@@ -117,6 +117,8 @@ public interface DockerCmdExecFactory extends Closeable {
DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec();
+ ListImageHistoryCmd.Exec createListImageHistoryCmdExec();
+
@Override
void close() throws IOException;
diff --git a/src/main/java/com/github/dockerjava/api/command/LayerHistory.java b/src/main/java/com/github/dockerjava/api/command/LayerHistory.java
new file mode 100644
index 000000000..56336cc71
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/LayerHistory.java
@@ -0,0 +1,149 @@
+package com.github.dockerjava.api.command;
+
+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.JsonProperty;
+
+import javax.annotation.CheckForNull;
+import java.util.List;
+
+/**
+ *
+ * @author mramach
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class LayerHistory {
+
+ @JsonProperty("Comment")
+ private String comment;
+
+ @JsonProperty("Created")
+ private String created;
+
+ @JsonProperty("CreatedBy")
+ private String createdBy;
+
+ @JsonProperty("Id")
+ private String id;
+
+ @JsonProperty("Size")
+ private Long size;
+
+ @JsonProperty("Tags")
+ private List tags;
+
+ /**
+ * @see #comment
+ */
+ @CheckForNull
+ public String getComment() {
+ return comment;
+ }
+
+ /**
+ * @see #comment
+ */
+ public LayerHistory withComment(String comment) {
+ this.comment = comment;
+ return this;
+ }
+
+ /**
+ * @see #created
+ */
+ @CheckForNull
+ public String getCreated() {
+ return created;
+ }
+
+ /**
+ * @see #created
+ */
+ public LayerHistory withCreated(String created) {
+ this.created = created;
+ return this;
+ }
+
+ /**
+ * @see #createdBy
+ */
+ @CheckForNull
+ public String getCreatedBy() {
+ return createdBy;
+ }
+
+ /**
+ * @see #createdBy
+ */
+ public LayerHistory withCreatedBy(String createdBy) {
+ this.createdBy = createdBy;
+ return this;
+ }
+
+ /**
+ * @see #id
+ */
+ @CheckForNull
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @see #id
+ */
+ public LayerHistory withId(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * @see #repoTags
+ */
+ @CheckForNull
+ public List getTags() {
+ return tags;
+ }
+
+ /**
+ * @see #repoTags
+ */
+ public LayerHistory withTags(List tags) {
+ this.tags = tags;
+ return this;
+ }
+
+ /**
+ * @see #size
+ */
+ @CheckForNull
+ public Long getSize() {
+ return size;
+ }
+
+ /**
+ * @see #size
+ */
+ public LayerHistory withSize(Long size) {
+ this.size = size;
+ 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/command/ListImageHistoryCmd.java b/src/main/java/com/github/dockerjava/api/command/ListImageHistoryCmd.java
new file mode 100644
index 000000000..b9da80f29
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/ListImageHistoryCmd.java
@@ -0,0 +1,30 @@
+package com.github.dockerjava.api.command;
+
+import java.util.List;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+
+/**
+ * Inspect the details of an image.
+ */
+public interface ListImageHistoryCmd extends SyncDockerCmd> {
+
+ @CheckForNull
+ String getImageId();
+
+ ListImageHistoryCmd withImageId(@Nonnull String imageId);
+
+ /**
+ * @throws NotFoundException
+ * No such image
+ */
+ @Override
+ List exec() throws NotFoundException;
+
+ 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 2d0b5caab..c7cf64aa2 100644
--- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
+++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java
@@ -7,6 +7,8 @@
import java.io.IOException;
import java.io.InputStream;
+import javax.annotation.Nonnull;
+
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.AttachContainerCmd;
import com.github.dockerjava.api.command.AuthCmd;
@@ -34,6 +36,7 @@
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.ListImageHistoryCmd;
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
@@ -47,6 +50,7 @@
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.RenameContainerCmd;
import com.github.dockerjava.api.command.RestartContainerCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.command.SearchImagesCmd;
@@ -59,7 +63,6 @@
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.api.model.AuthConfig;
import com.github.dockerjava.api.model.Identifier;
import com.github.dockerjava.core.command.AttachContainerCmdImpl;
@@ -87,6 +90,7 @@
import com.github.dockerjava.core.command.InspectVolumeCmdImpl;
import com.github.dockerjava.core.command.KillContainerCmdImpl;
import com.github.dockerjava.core.command.ListContainersCmdImpl;
+import com.github.dockerjava.core.command.ListImageHistoryCmdImpl;
import com.github.dockerjava.core.command.ListImagesCmdImpl;
import com.github.dockerjava.core.command.ListNetworksCmdImpl;
import com.github.dockerjava.core.command.ListVolumesCmdImpl;
@@ -100,6 +104,7 @@
import com.github.dockerjava.core.command.RemoveImageCmdImpl;
import com.github.dockerjava.core.command.RemoveNetworkCmdImpl;
import com.github.dockerjava.core.command.RemoveVolumeCmdImpl;
+import com.github.dockerjava.core.command.RenameContainerCmdImpl;
import com.github.dockerjava.core.command.RestartContainerCmdImpl;
import com.github.dockerjava.core.command.SaveImageCmdImpl;
import com.github.dockerjava.core.command.SearchImagesCmdImpl;
@@ -112,9 +117,6 @@
import com.github.dockerjava.core.command.UpdateContainerCmdImpl;
import com.github.dockerjava.core.command.VersionCmdImpl;
import com.github.dockerjava.core.command.WaitContainerCmdImpl;
-import com.github.dockerjava.core.command.RenameContainerCmdImpl;
-
-import javax.annotation.Nonnull;
/**
* @author Konstantin Pelykh (kpelykh@gmail.com)
@@ -483,6 +485,11 @@ public DisconnectFromNetworkCmd disconnectFromNetworkCmd() {
return new DisconnectFromNetworkCmdImpl(getDockerCmdExecFactory().createDisconnectFromNetworkCmdExec());
}
+ @Override
+ public ListImageHistoryCmd listImageHistoryCmd(String imageId) {
+ return new ListImageHistoryCmdImpl(getDockerCmdExecFactory().createListImageHistoryCmdExec(), imageId);
+ }
+
@Override
public void close() throws IOException {
getDockerCmdExecFactory().close();
diff --git a/src/main/java/com/github/dockerjava/core/command/ListImageHistoryCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImageHistoryCmdImpl.java
new file mode 100644
index 000000000..25d68eacd
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/core/command/ListImageHistoryCmdImpl.java
@@ -0,0 +1,44 @@
+package com.github.dockerjava.core.command;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import com.github.dockerjava.api.command.ListImageHistoryCmd;
+import com.github.dockerjava.api.command.LayerHistory;
+import com.github.dockerjava.api.exception.NotFoundException;
+
+/**
+ * Inspect the details of an image.
+ */
+public class ListImageHistoryCmdImpl extends AbstrDockerCmd> implements
+ ListImageHistoryCmd {
+
+ private String imageId;
+
+ public ListImageHistoryCmdImpl(ListImageHistoryCmd.Exec exec, String imageId) {
+ super(exec);
+ withImageId(imageId);
+ }
+
+ @Override
+ public String getImageId() {
+ return imageId;
+ }
+
+ @Override
+ public ListImageHistoryCmd withImageId(String imageId) {
+ checkNotNull(imageId, "imageId was not specified");
+ this.imageId = imageId;
+ return this;
+ }
+
+ /**
+ * @throws NotFoundException
+ * No such image
+ */
+ @Override
+ public List exec() throws NotFoundException {
+ return super.exec();
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
index 1ec3fbca0..f1a420098 100644
--- a/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerCmdExecFactory.java
@@ -18,9 +18,6 @@
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.client.config.RequestConfig;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
@@ -62,6 +59,7 @@
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.ListImageHistoryCmd;
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
@@ -75,6 +73,7 @@
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.RenameContainerCmd;
import com.github.dockerjava.api.command.RestartContainerCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.command.SearchImagesCmd;
@@ -84,11 +83,12 @@
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.api.exception.DockerClientException;
import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.core.SSLConfig;
import com.github.dockerjava.jaxrs.filter.JsonClientFilter;
import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter;
import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter;
@@ -550,6 +550,11 @@ public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() {
return new DisconnectFromNetworkCmdExec(getBaseResource(), getDockerClientConfig());
}
+ @Override
+ public ListImageHistoryCmd.Exec createListImageHistoryCmdExec() {
+ return new ListImageHistoryCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
@Override
public void close() throws IOException {
checkNotNull(client, "Factory not initialized. You probably forgot to call init()!");
diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImageHistoryCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImageHistoryCmdExec.java
new file mode 100644
index 000000000..8469b2b98
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/jaxrs/ListImageHistoryCmdExec.java
@@ -0,0 +1,33 @@
+package com.github.dockerjava.jaxrs;
+
+import java.util.List;
+
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.github.dockerjava.api.command.ListImageHistoryCmd;
+import com.github.dockerjava.api.command.LayerHistory;
+import com.github.dockerjava.core.DockerClientConfig;
+
+public class ListImageHistoryCmdExec extends AbstrSyncDockerCmdExec> implements
+ ListImageHistoryCmd.Exec {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ListImageHistoryCmdExec.class);
+
+ public ListImageHistoryCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
+ super(baseResource, dockerClientConfig);
+ }
+
+ @Override
+ protected List execute(ListImageHistoryCmd command) {
+ WebTarget webResource = getBaseResource().path("/images/{id}/history").resolveTemplate("id", command.getImageId());
+
+ LOGGER.trace("GET: {}", webResource);
+ return webResource.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { });
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java
index 2c8a83b0e..9e2167840 100644
--- a/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java
+++ b/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java
@@ -1,5 +1,36 @@
package com.github.dockerjava.netty;
+import static com.google.common.base.Preconditions.checkNotNull;
+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;
+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 java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.security.Security;
+
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLParameters;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
import com.github.dockerjava.api.command.AttachContainerCmd;
import com.github.dockerjava.api.command.AuthCmd;
import com.github.dockerjava.api.command.BuildImageCmd;
@@ -26,6 +57,7 @@
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.ListImageHistoryCmd;
import com.github.dockerjava.api.command.ListImagesCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
@@ -39,6 +71,7 @@
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.RenameContainerCmd;
import com.github.dockerjava.api.command.RestartContainerCmd;
import com.github.dockerjava.api.command.SaveImageCmd;
import com.github.dockerjava.api.command.SearchImagesCmd;
@@ -51,7 +84,6 @@
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;
@@ -80,6 +112,7 @@
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.ListImageHistoryCmdExec;
import com.github.dockerjava.netty.exec.ListImagesCmdExec;
import com.github.dockerjava.netty.exec.ListNetworksCmdExec;
import com.github.dockerjava.netty.exec.ListVolumesCmdExec;
@@ -93,6 +126,7 @@
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.RenameContainerCmdExec;
import com.github.dockerjava.netty.exec.RestartContainerCmdExec;
import com.github.dockerjava.netty.exec.SaveImageCmdExec;
import com.github.dockerjava.netty.exec.SearchImagesCmdExec;
@@ -105,39 +139,6 @@
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.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;
-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
@@ -597,6 +598,11 @@ public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() {
return new DisconnectFromNetworkCmdExec(getBaseResource(), getDockerClientConfig());
}
+ @Override
+ public ListImageHistoryCmd.Exec createListImageHistoryCmdExec() {
+ return new ListImageHistoryCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
@Override
public void close() throws IOException {
checkNotNull(eventLoopGroup, "Factory not initialized. You probably forgot to call init()!");
diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListImageHistoryCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListImageHistoryCmdExec.java
new file mode 100644
index 000000000..96c760eef
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/netty/exec/ListImageHistoryCmdExec.java
@@ -0,0 +1,33 @@
+package com.github.dockerjava.netty.exec;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.github.dockerjava.api.command.ListImageHistoryCmd;
+import com.github.dockerjava.api.command.LayerHistory;
+import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.netty.MediaType;
+import com.github.dockerjava.netty.WebTarget;
+
+public class ListImageHistoryCmdExec extends AbstrSyncDockerCmdExec> implements
+ ListImageHistoryCmd.Exec {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ListImageHistoryCmdExec.class);
+
+ public ListImageHistoryCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
+ super(baseResource, dockerClientConfig);
+ }
+
+ @Override
+ protected List execute(ListImageHistoryCmd command) {
+ WebTarget webResource = getBaseResource().path("/images/{id}/history").resolveTemplate("id", command.getImageId());
+
+ LOGGER.trace("GET: {}", webResource);
+
+ return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference>() { });
+ }
+
+}
diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java
index 46d6d4dcc..0341f71ec 100644
--- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java
+++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java
@@ -1,5 +1,10 @@
package com.github.dockerjava.core;
+import java.io.IOException;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.List;
+
import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.AttachContainerCmd;
import com.github.dockerjava.api.command.AuthCmd.Exec;
@@ -59,11 +64,6 @@
import com.github.dockerjava.api.command.WaitContainerCmd;
import com.github.dockerjava.api.model.BuildResponseItem;
-import java.io.IOException;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution for the purpose of
* automatically cleanup.
@@ -349,6 +349,11 @@ public StatsCmd.Exec createStatsCmdExec() {
}
@Override
+ public com.github.dockerjava.api.command.ListImageHistoryCmd.Exec createListImageHistoryCmdExec() {
+ return delegate.createListImageHistoryCmdExec();
+ }
+
+ @Override
public CreateVolumeCmd.Exec createCreateVolumeCmdExec() {
return new CreateVolumeCmd.Exec() {
@Override