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