From cea03a6c6c013d90f71694c6f49f01ca65ab4b7b Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 26 Aug 2015 23:49:41 +0200 Subject: [PATCH 0001/1032] Fix issue #246 --- CHANGELOG.md | 2 + .../dockerjava/api/async/ResultCallback.java | 2 +- .../api/command/AttachContainerCmd.java | 22 +- .../dockerjava/api/command/BuildImageCmd.java | 22 +- .../dockerjava/api/command/CommitCmd.java | 24 +- .../api/command/CreateContainerCmd.java | 52 +-- .../dockerjava/api/command/ExecCreateCmd.java | 16 +- .../dockerjava/api/command/ExecStartCmd.java | 8 +- .../api/command/InspectContainerResponse.java | 20 +- .../api/command/InspectExecResponse.java | 28 +- .../api/command/InspectImageResponse.java | 4 +- .../api/command/ListContainersCmd.java | 12 +- .../dockerjava/api/command/ListImagesCmd.java | 4 +- .../api/command/LogContainerCmd.java | 22 +- .../api/command/RemoveContainerCmd.java | 8 +- .../api/command/RemoveImageCmd.java | 8 +- .../api/command/RestartContainerCmd.java | 4 +- .../api/command/StopContainerCmd.java | 4 +- .../dockerjava/api/command/TagImageCmd.java | 4 +- .../dockerjava/api/model/AccessMode.java | 4 +- .../dockerjava/api/model/AuthConfig.java | 9 +- .../com/github/dockerjava/api/model/Bind.java | 4 +- .../api/model/BuildResponseItem.java | 2 +- .../dockerjava/api/model/ChangeLog.java | 4 +- .../dockerjava/api/model/Container.java | 7 +- .../dockerjava/api/model/ContainerConfig.java | 31 +- .../github/dockerjava/api/model/Device.java | 3 + .../dockerjava/api/model/DriverStatus.java | 7 +- .../dockerjava/api/model/ErrorDetail.java | 3 + .../dockerjava/api/model/ErrorResponse.java | 3 + .../github/dockerjava/api/model/Event.java | 9 +- .../dockerjava/api/model/ExposedPort.java | 10 +- .../dockerjava/api/model/HostConfig.java | 324 +++++++++++------- .../github/dockerjava/api/model/Image.java | 15 +- .../com/github/dockerjava/api/model/Info.java | 46 ++- .../com/github/dockerjava/api/model/Link.java | 6 +- .../github/dockerjava/api/model/LxcConf.java | 3 + .../com/github/dockerjava/api/model/Node.java | 3 + .../github/dockerjava/api/model/Ports.java | 14 +- .../api/model/PullResponseItem.java | 2 +- .../api/model/PushResponseItem.java | 2 +- .../dockerjava/api/model/ResponseItem.java | 4 +- .../dockerjava/api/model/RestartPolicy.java | 16 +- .../dockerjava/api/model/SearchItem.java | 12 +- .../dockerjava/api/model/Statistics.java | 3 + .../github/dockerjava/api/model/Ulimit.java | 8 +- .../github/dockerjava/api/model/Volume.java | 2 +- .../github/dockerjava/api/model/VolumeRW.java | 4 +- .../dockerjava/api/model/VolumesFrom.java | 4 +- .../dockerjava/core/CertificateUtils.java | 4 +- .../dockerjava/core/GoLangFileMatch.java | 20 +- .../core/LocalDirectorySSLConfig.java | 4 +- .../core/async/JsonStreamProcessor.java | 2 +- .../core/async/ResultCallbackTemplate.java | 2 +- .../core/command/AbstrDockerCmd.java | 7 + .../core/command/AttachContainerCmdImpl.java | 22 +- .../dockerjava/core/command/AuthCmdImpl.java | 9 +- .../core/command/BuildImageCmdImpl.java | 41 +-- .../core/command/CommitCmdImpl.java | 49 ++- .../core/command/ContainerDiffCmdImpl.java | 5 - .../command/CopyFileFromContainerCmdImpl.java | 7 - .../core/command/CreateContainerCmdImpl.java | 167 ++++----- .../core/command/CreateImageCmdImpl.java | 8 - .../core/command/EventsCmdImpl.java | 6 - .../core/command/ExecCreateCmdImpl.java | 27 +- .../core/command/ExecStartCmdImpl.java | 10 +- .../dockerjava/core/command/FrameReader.java | 2 +- .../dockerjava/core/command/InfoCmdImpl.java | 4 - .../core/command/InspectContainerCmdImpl.java | 5 - .../core/command/InspectExecCmdImpl.java | 5 - .../core/command/InspectImageCmdImpl.java | 5 - .../core/command/KillContainerCmdImpl.java | 5 - .../core/command/ListContainersCmdImpl.java | 24 +- .../core/command/ListImagesCmdImpl.java | 11 +- .../core/command/LogContainerCmdImpl.java | 30 +- .../core/command/PauseContainerCmdImpl.java | 5 - .../core/command/PullImageCmdImpl.java | 4 - .../core/command/PullImageResultCallback.java | 3 +- .../core/command/PushImageCmdImpl.java | 5 - .../core/command/RemoveContainerCmdImpl.java | 21 +- .../core/command/RemoveImageCmdImpl.java | 19 +- .../core/command/RestartContainerCmdImpl.java | 12 +- .../core/command/SaveImageCmdImpl.java | 5 - .../core/command/SearchImagesCmdImpl.java | 4 - .../core/command/StartContainerCmdImpl.java | 5 - .../dockerjava/core/command/StatsCmdImpl.java | 4 - .../core/command/StopContainerCmdImpl.java | 15 +- .../core/command/TagImageCmdImpl.java | 17 +- .../core/command/TopContainerCmdImpl.java | 8 +- .../core/command/UnpauseContainerCmdImpl.java | 5 - .../core/command/VersionCmdImpl.java | 5 - .../core/command/WaitContainerCmdImpl.java | 6 +- .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 12 + .../jaxrs/AttachContainerCmdExec.java | 13 +- .../dockerjava/jaxrs/BuildImageCmdExec.java | 23 +- .../dockerjava/jaxrs/CommitCmdExec.java | 11 +- .../jaxrs/ListContainersCmdExec.java | 21 +- .../dockerjava/jaxrs/ListImagesCmdExec.java | 11 +- .../dockerjava/jaxrs/LogContainerCmdExec.java | 16 +- .../jaxrs/RemoveContainerCmdExec.java | 11 +- .../dockerjava/jaxrs/RemoveImageCmdExec.java | 11 +- .../jaxrs/RestartContainerCmdExec.java | 6 +- .../jaxrs/StopContainerCmdExec.java | 6 +- .../dockerjava/jaxrs/TagImageCmdExec.java | 11 +- .../jaxrs/filter/LoggingFilter.java | 6 +- .../jaxrs/filter/SelectiveLoggingFilter.java | 2 +- .../client/AbstractDockerClientTest.java | 2 +- .../dockerjava/core/GoLangFileMatchTest.java | 8 +- .../CopyFileFromContainerCmdImplTest.java | 2 +- .../command/CreateContainerCmdImplTest.java | 2 +- .../core/command/EventsCmdImplTest.java | 8 +- .../core/command/ExecStartCmdImplTest.java | 4 +- .../core/command/ListImagesCmdImplTest.java | 4 +- .../core/command/StatsCmdImplTest.java | 6 +- 114 files changed, 827 insertions(+), 823 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84733d058..270f12d37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ Latest SNAPSHOT * [#306] (https://github.com/docker-java/docker-java/pull/306) fix(core): fix NPE if latestItem is null in result callback * [#305] (https://github.com/docker-java/docker-java/pull/305) chore(core): do not expect default DockerCmdExecFactory service * [#304] (https://github.com/docker-java/docker-java/pull/304) Throw original exception when command.close() throws Exception too +* [#299] (https://github.com/docker-java/docker-java/pull/299) BuildImage sync to 1.20 API +* [#291] (https://github.com/docker-java/docker-java/pull/291) Moved "Memory", "MemorySwap" and "CpuShares" mappings from ContainerConfig to HostConfig v2.0.1 --- diff --git a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java index 1eb7ebce1..8525f2478 100644 --- a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java +++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java @@ -1,6 +1,7 @@ package com.github.dockerjava.api.async; import java.io.Closeable; +import java.io.IOException; /** * Result callback @@ -20,5 +21,4 @@ public interface ResultCallback extends Closeable { /** Called when processing was finished either by reaching the end or by aborting it */ void onComplete(); - } diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java index f837c89c5..0924fb008 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -24,20 +24,20 @@ public interface AttachContainerCmd extends AsyncDockerCmd { public String getAuthor(); - public boolean hasPauseEnabled(); + public Boolean hasPauseEnabled(); - public CommitCmd withAttachStderr(boolean attachStderr); + public CommitCmd withAttachStderr(Boolean attachStderr); public CommitCmd withAttachStderr(); - public CommitCmd withAttachStdin(boolean attachStdin); + public CommitCmd withAttachStdin(Boolean attachStdin); public CommitCmd withAttachStdin(); - public CommitCmd withAttachStdout(boolean attachStdout); + public CommitCmd withAttachStdout(Boolean attachStdout); public CommitCmd withAttachStdout(); public CommitCmd withCmd(String... cmd); - public CommitCmd withDisableNetwork(boolean disableNetwork); + public CommitCmd withDisableNetwork(Boolean disableNetwork); public CommitCmd withAuthor(String author); @@ -49,7 +49,7 @@ public interface CommitCmd extends SyncDockerCmd { public CommitCmd withRepository(String repository); - public CommitCmd withPause(boolean pause); + public CommitCmd withPause(Boolean pause); public String[] getEnv(); @@ -71,23 +71,23 @@ public interface CommitCmd extends SyncDockerCmd { public CommitCmd withMemorySwap(Integer memorySwap); - public boolean isOpenStdin(); + public Boolean isOpenStdin(); - public CommitCmd withOpenStdin(boolean openStdin); + public CommitCmd withOpenStdin(Boolean openStdin); public String[] getPortSpecs(); public CommitCmd withPortSpecs(String... portSpecs); - public boolean isStdinOnce(); + public Boolean isStdinOnce(); - public CommitCmd withStdinOnce(boolean stdinOnce); + public CommitCmd withStdinOnce(Boolean stdinOnce); public CommitCmd withStdinOnce(); - public boolean isTty(); + public Boolean isTty(); - public CommitCmd withTty(boolean tty); + public CommitCmd withTty(Boolean tty); public CommitCmd withTty(); 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 638331240..c0a695426 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -40,9 +40,9 @@ public static interface Exec extends DockerCmdSyncExec { public ExecCreateCmd withCmd(String... cmd); - public ExecCreateCmd withAttachStdin(boolean attachStdin); + public ExecCreateCmd withAttachStdin(Boolean attachStdin); public ExecCreateCmd withAttachStdin(); - public boolean hasAttachStdinEnabled(); + public Boolean hasAttachStdinEnabled(); - public ExecCreateCmd withAttachStdout(boolean attachStdout); + public ExecCreateCmd withAttachStdout(Boolean attachStdout); public ExecCreateCmd withAttachStdout(); - public boolean hasAttachStdoutEnabled(); + public Boolean hasAttachStdoutEnabled(); - public ExecCreateCmd withAttachStderr(boolean attachStderr); + public ExecCreateCmd withAttachStderr(Boolean attachStderr); public ExecCreateCmd withAttachStderr(); - public boolean hasAttachStderrEnabled(); + public Boolean hasAttachStderrEnabled(); - public ExecCreateCmd withTty(boolean tty); + public ExecCreateCmd withTty(Boolean tty); public ExecCreateCmd withTty(); - public boolean hasTtyEnabled(); + public Boolean hasTtyEnabled(); public static interface Exec extends DockerCmdSyncExec { } diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java index f769fb193..0d4ffa44a 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -10,15 +10,15 @@ public interface ExecStartCmd extends SyncDockerCmd { public ExecStartCmd withExecId(String execId); - public boolean hasDetachEnabled(); + public Boolean hasDetachEnabled(); - public ExecStartCmd withDetach(boolean detach); + public ExecStartCmd withDetach(Boolean detach); public ExecStartCmd withDetach(); - public boolean hasTtyEnabled(); + public Boolean hasTtyEnabled(); - public ExecStartCmd withTty(boolean tty); + public ExecStartCmd withTty(Boolean tty); public ExecStartCmd withTty(); 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 3f2fedd77..e37e28471 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -178,7 +178,7 @@ public class NetworkSettings { private String ipAddress; @JsonProperty("IPPrefixLen") - private int ipPrefixLen; + private Integer ipPrefixLen; @JsonProperty("Gateway") private String gateway; @@ -196,7 +196,7 @@ public String getIpAddress() { return ipAddress; } - public int getIpPrefixLen() { + public Integer getIpPrefixLen() { return ipPrefixLen; } @@ -226,16 +226,16 @@ public String toString() { public class ContainerState { @JsonProperty("Running") - private boolean running; + private Boolean running; @JsonProperty("Paused") - private boolean paused; + private Boolean paused; @JsonProperty("Pid") - private int pid; + private Integer pid; @JsonProperty("ExitCode") - private int exitCode; + private Integer exitCode; @JsonProperty("StartedAt") private String startedAt; @@ -243,19 +243,19 @@ public class ContainerState { @JsonProperty("FinishedAt") private String finishedAt; - public boolean isRunning() { + public Boolean isRunning() { return running; } - public boolean isPaused() { + public Boolean isPaused() { return paused; } - public int getPid() { + public Integer getPid() { return pid; } - public int getExitCode() { + public Integer getExitCode() { return exitCode; } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java index 8a9a24a1b..b1cb09b20 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java @@ -13,41 +13,41 @@ public class InspectExecResponse { private String id; @JsonProperty("OpenStdin") - private boolean openStdin; + private Boolean openStdin; @JsonProperty("OpenStderr") - private boolean openStderr; + private Boolean openStderr; @JsonProperty("OpenStdout") - private boolean openStdout; + private Boolean openStdout; @JsonProperty("Running") - private boolean running; + private Boolean running; @JsonProperty("ExitCode") - private int exitCode; + private Integer exitCode; public String getId() { return id; } - public boolean isOpenStdin() { + public Boolean isOpenStdin() { return openStdin; } - public boolean isOpenStderr() { + public Boolean isOpenStderr() { return openStderr; } - public boolean isOpenStdout() { + public Boolean isOpenStdout() { return openStdout; } - public boolean isRunning() { + public Boolean isRunning() { return running; } - public int getExitCode() { + public Integer getExitCode() { return exitCode; } @@ -65,10 +65,10 @@ public class ProcessConfig { private String entryPoint; @JsonProperty("privileged") - private boolean privileged; + private Boolean privileged; @JsonProperty("tty") - private boolean tty; + private Boolean tty; @JsonProperty("user") private String user; @@ -81,11 +81,11 @@ public String getEntryPoint() { return entryPoint; } - public boolean isPrivileged() { + public Boolean isPrivileged() { return privileged; } - public boolean isTty() { + public Boolean isTty() { return tty; } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java index 5c1a0185e..db9184c6d 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java @@ -48,7 +48,7 @@ public class InspectImageResponse { private String parent; @JsonProperty("Size") - private long size; + private Long size; public String getId() { return id; @@ -70,7 +70,7 @@ public ContainerConfig getContainerConfig() { return containerConfig; } - public long getSize() { + public Long getSize() { return size; } diff --git a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java index 5cba11755..2994fd9d6 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -22,11 +22,11 @@ */ public interface ListContainersCmd extends SyncDockerCmd> { - public int getLimit(); + public Integer getLimit(); - public boolean hasShowSizeEnabled(); + public Boolean hasShowSizeEnabled(); - public boolean hasShowAllEnabled(); + public Boolean hasShowAllEnabled(); public String getSinceId(); @@ -34,11 +34,11 @@ public interface ListContainersCmd extends SyncDockerCmd> { public Filters getFilters(); - public ListContainersCmd withShowAll(boolean showAll); + public ListContainersCmd withShowAll(Boolean showAll); - public ListContainersCmd withShowSize(boolean showSize); + public ListContainersCmd withShowSize(Boolean showSize); - public ListContainersCmd withLimit(int limit); + public ListContainersCmd withLimit(Integer limit); public ListContainersCmd withSince(String since); diff --git a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index 170ed8102..a9aa5b9d2 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -16,9 +16,9 @@ public interface ListImagesCmd extends SyncDockerCmd> { public String getFilters(); - public boolean hasShowAllEnabled(); + public Boolean hasShowAllEnabled(); - public ListImagesCmd withShowAll(boolean showAll); + public ListImagesCmd withShowAll(Boolean showAll); public ListImagesCmd withFilters(String filters); diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index a97393aa5..bf46a7624 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -23,20 +23,20 @@ public interface LogContainerCmd extends AsyncDockerCmd public String getContainerId(); - public int getTail(); + public Integer getTail(); - public boolean hasFollowStreamEnabled(); + public Boolean hasFollowStreamEnabled(); - public boolean hasTimestampsEnabled(); + public Boolean hasTimestampsEnabled(); - public boolean hasStdoutEnabled(); + public Boolean hasStdoutEnabled(); - public boolean hasStderrEnabled(); + public Boolean hasStderrEnabled(); public LogContainerCmd withContainerId(String containerId); /** - * See {@link #withFollowStream(boolean)} + * See {@link #withFollowStream(Boolean)} */ public LogContainerCmd withFollowStream(); @@ -45,23 +45,23 @@ public interface LogContainerCmd extends AsyncDockerCmd * {@link InputStream#read()} MAY BLOCK FOREVER as long as no data is streamed from the docker host to * {@link DockerClient}! */ - public LogContainerCmd withFollowStream(boolean followStream); + public LogContainerCmd withFollowStream(Boolean followStream); public LogContainerCmd withTimestamps(); - public LogContainerCmd withTimestamps(boolean timestamps); + public LogContainerCmd withTimestamps(Boolean timestamps); public LogContainerCmd withStdOut(); - public LogContainerCmd withStdOut(boolean stdout); + public LogContainerCmd withStdOut(Boolean stdout); public LogContainerCmd withStdErr(); - public LogContainerCmd withStdErr(boolean stderr); + public LogContainerCmd withStdErr(Boolean stderr); public LogContainerCmd withTailAll(); - public LogContainerCmd withTail(int tail); + public LogContainerCmd withTail(Integer tail); public static interface Exec extends DockerCmdAsyncExec { } diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java index fe5378dc2..08aced4ea 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java @@ -14,17 +14,17 @@ public interface RemoveContainerCmd extends SyncDockerCmd { public String getContainerId(); - public boolean hasRemoveVolumesEnabled(); + public Boolean hasRemoveVolumesEnabled(); - public boolean hasForceEnabled(); + public Boolean hasForceEnabled(); public RemoveContainerCmd withContainerId(String containerId); - public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes); + public RemoveContainerCmd withRemoveVolumes(Boolean removeVolumes); public RemoveContainerCmd withForce(); - public RemoveContainerCmd withForce(boolean force); + public RemoveContainerCmd withForce(Boolean force); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java index 99f2835f8..8b56d5ae6 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -11,9 +11,9 @@ public interface RemoveImageCmd extends SyncDockerCmd { public String getImageId(); - public boolean hasForceEnabled(); + public Boolean hasForceEnabled(); - public boolean hasNoPruneEnabled(); + public Boolean hasNoPruneEnabled(); public RemoveImageCmd withImageId(String imageId); @@ -25,7 +25,7 @@ public interface RemoveImageCmd extends SyncDockerCmd { /** * force parameter to force delete of an image, even if it's tagged in multiple repositories */ - public RemoveImageCmd withForce(boolean force); + public RemoveImageCmd withForce(Boolean force); /** * prevent the deletion of parent images @@ -36,7 +36,7 @@ public interface RemoveImageCmd extends SyncDockerCmd { * noprune parameter to prevent the deletion of parent images * */ - public RemoveImageCmd withNoPrune(boolean noPrune); + public RemoveImageCmd withNoPrune(Boolean noPrune); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index c2a5219a8..f146269f3 100644 --- a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -13,11 +13,11 @@ public interface RestartContainerCmd extends SyncDockerCmd { public String getContainerId(); - public int getTimeout(); + public Integer getTimeout(); public RestartContainerCmd withContainerId(String containerId); - public RestartContainerCmd withtTimeout(int timeout); + public RestartContainerCmd withtTimeout(Integer timeout); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java index dc620b699..a9f52d62d 100644 --- a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -16,11 +16,11 @@ public interface StopContainerCmd extends SyncDockerCmd { public String getContainerId(); - public int getTimeout(); + public Integer getTimeout(); public StopContainerCmd withContainerId(String containerId); - public StopContainerCmd withTimeout(int timeout); + public StopContainerCmd withTimeout(Integer timeout); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java index 21895e358..569fddd5e 100644 --- a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java @@ -19,7 +19,7 @@ public interface TagImageCmd extends SyncDockerCmd { public String getTag(); - public boolean hasForceEnabled(); + public Boolean hasForceEnabled(); public TagImageCmd withImageId(String imageId); @@ -29,7 +29,7 @@ public interface TagImageCmd extends SyncDockerCmd { public TagImageCmd withForce(); - public TagImageCmd withForce(boolean force); + public TagImageCmd withForce(Boolean force); public static interface Exec extends DockerCmdSyncExec { } diff --git a/src/main/java/com/github/dockerjava/api/model/AccessMode.java b/src/main/java/com/github/dockerjava/api/model/AccessMode.java index e87494215..07098cbf2 100644 --- a/src/main/java/com/github/dockerjava/api/model/AccessMode.java +++ b/src/main/java/com/github/dockerjava/api/model/AccessMode.java @@ -15,11 +15,11 @@ public enum AccessMode { */ public static final AccessMode DEFAULT = rw; - public static final AccessMode fromBoolean(boolean accessMode) { + public static final AccessMode fromBoolean(Boolean accessMode) { return accessMode ? rw : ro; } - public final boolean toBoolean() { + public final Boolean toBoolean() { return this.equals(AccessMode.rw) ? true : false; } 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 c7ee0af7f..45dabf894 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -1,8 +1,14 @@ package com.github.dockerjava.api.model; +import org.apache.commons.lang.builder.ReflectionToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; + import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +@JsonInclude(Include.NON_NULL) public class AuthConfig { /** @@ -70,8 +76,7 @@ public void setAuth(String auth) { @Override public String toString() { - return "AuthConfig{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email - + '\'' + ", serverAddress='" + serverAddress + '\'' + '}'; + return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE); } @Override 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 60c64d096..f7f6954f5 100644 --- a/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -39,7 +39,7 @@ public AccessMode getAccessMode() { /** * Parses a bind mount specification to a {@link Bind}. - * + * * @param serialized * the specification, e.g. /host:/container:ro * @return a {@link Bind} matching the specification @@ -85,7 +85,7 @@ public int hashCode() { * Returns a string representation of this {@link Bind} suitable for inclusion in a JSON message. The format is * <host path>:<container path>:<access mode>, like the argument in * {@link #parse(String)}. - * + * * @return a string representation of this {@link Bind} */ @Override 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 37fae34e7..47e231164 100644 --- a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -25,7 +25,7 @@ public String getStream() { * Returns whether the stream field indicates a successful build operation */ @JsonIgnore - public boolean isBuildSuccessIndicated() { + public Boolean isBuildSuccessIndicated() { if (getStream() == null) return false; 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 f565cfaa7..36804362c 100644 --- a/src/main/java/com/github/dockerjava/api/model/ChangeLog.java +++ b/src/main/java/com/github/dockerjava/api/model/ChangeLog.java @@ -17,13 +17,13 @@ public class ChangeLog { private String path; @JsonProperty("Kind") - private int kind; + private Integer kind; public String getPath() { return path; } - public int getKind() { + public Integer getKind() { return kind; } 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 8152974e3..f6a7dbfd2 100644 --- a/src/main/java/com/github/dockerjava/api/model/Container.java +++ b/src/main/java/com/github/dockerjava/api/model/Container.java @@ -5,7 +5,9 @@ import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; /** * @@ -13,13 +15,14 @@ * */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(Include.NON_NULL) public class Container { @JsonProperty("Command") private String command; @JsonProperty("Created") - private long created; + private Long created; @JsonProperty("Id") private String id; @@ -51,7 +54,7 @@ public String getImage() { return image; } - public long getCreated() { + public Long getCreated() { return created; } 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 34cb71d4d..f119888f8 100644 --- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java @@ -6,7 +6,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; /** * @@ -14,16 +16,17 @@ * */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(Include.NON_NULL) public class ContainerConfig { @JsonProperty("AttachStderr") - private boolean attachStderr = false; + private Boolean attachStderr = false; @JsonProperty("AttachStdin") - private boolean attachStdin = false; + private Boolean attachStdin = false; @JsonProperty("AttachStdout") - private boolean attachStdout = false; + private Boolean attachStdout = false; @JsonProperty("Cmd") private String[] cmd; @@ -53,22 +56,22 @@ public class ContainerConfig { private String macAddress; @JsonProperty("NetworkDisabled") - private boolean networkDisabled = false; + private Boolean networkDisabled = false; @JsonProperty("OnBuild") private String[] onBuild; @JsonProperty("OpenStdin") - private boolean stdinOpen = false; + private Boolean stdinOpen = false; @JsonProperty("PortSpecs") private String[] portSpecs; @JsonProperty("StdinOnce") - private boolean stdInOnce = false; + private Boolean stdInOnce = false; @JsonProperty("Tty") - private boolean tty = false; + private Boolean tty = false; @JsonProperty("User") private String user = ""; @@ -84,7 +87,7 @@ public ExposedPort[] getExposedPorts() { return exposedPorts.getExposedPorts(); } - public boolean isNetworkDisabled() { + public Boolean isNetworkDisabled() { return networkDisabled; } @@ -108,15 +111,15 @@ public String getUser() { return user; } - public boolean isTty() { + public Boolean isTty() { return tty; } - public boolean isStdinOpen() { + public Boolean isStdinOpen() { return stdinOpen; } - public boolean isStdInOnce() { + public Boolean isStdInOnce() { return stdInOnce; } @@ -124,15 +127,15 @@ public String getMacAddress() { return macAddress; } - public boolean isAttachStdin() { + public Boolean isAttachStdin() { return attachStdin; } - public boolean isAttachStdout() { + public Boolean isAttachStdout() { return attachStdout; } - public boolean isAttachStderr() { + public Boolean isAttachStderr() { return attachStderr; } 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 713c0d61a..71402dd68 100644 --- a/src/main/java/com/github/dockerjava/api/model/Device.java +++ b/src/main/java/com/github/dockerjava/api/model/Device.java @@ -5,8 +5,11 @@ import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +@JsonInclude(Include.NON_NULL) public class Device { @JsonProperty("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 303e820ba..0bef3c28d 100644 --- a/src/main/java/com/github/dockerjava/api/model/DriverStatus.java +++ b/src/main/java/com/github/dockerjava/api/model/DriverStatus.java @@ -3,25 +3,28 @@ import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; /** * Created by ben on 12/12/13. */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(Include.NON_NULL) public class DriverStatus { @JsonProperty("Root Dir") private String rootDir; @JsonProperty("Dirs") - private int dirs; + private Integer dirs; public String getRootDir() { return rootDir; } - public int getDirs() { + public Integer getDirs() { return dirs; } 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 8abffe6c4..5f8c01670 100644 --- a/src/main/java/com/github/dockerjava/api/model/ErrorDetail.java +++ b/src/main/java/com/github/dockerjava/api/model/ErrorDetail.java @@ -1,7 +1,10 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +@JsonInclude(Include.NON_NULL) public class ErrorDetail { @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 d589a31d1..6723cd070 100644 --- a/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java +++ b/src/main/java/com/github/dockerjava/api/model/ErrorResponse.java @@ -1,7 +1,10 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +@JsonInclude(Include.NON_NULL) public class ErrorResponse { @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 8d3877ff2..1ec0f433d 100644 --- a/src/main/java/com/github/dockerjava/api/model/Event.java +++ b/src/main/java/com/github/dockerjava/api/model/Event.java @@ -3,11 +3,14 @@ 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; /** * Representation of a Docker event. */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(Include.NON_NULL) public class Event { private String status; @@ -15,7 +18,7 @@ public class Event { private String from; - private long time; + private Long time; @JsonIgnoreProperties private Node node; @@ -41,7 +44,7 @@ public Event() { * Event time The time is specified in milliseconds since January 1, 1970, 00:00:00 GMT * @since TODO */ - public Event(String status, String id, String from, long time) { + public Event(String status, String id, String from, Long time) { this.status = status; this.id = id; this.from = from; @@ -82,7 +85,7 @@ public String getFrom() { * * @return Event time in the specified format. */ - public long getTime() { + public Long getTime() { return time; } 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 23510e50a..4dbdbe19b 100644 --- a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java +++ b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java @@ -38,7 +38,7 @@ public class ExposedPort { /** * Creates an {@link ExposedPort} for the given parameters. - * + * * @param port * the {@link #getPort() port number} * @param protocol @@ -51,7 +51,7 @@ public ExposedPort(int port, InternetProtocol protocol) { /** * Creates an {@link ExposedPort} for the given {@link #getPort() port number} and {@link InternetProtocol#DEFAULT}. - * + * * @param port * the {@link #getPort() port number} */ @@ -61,7 +61,7 @@ public ExposedPort(int port) { /** * Creates an {@link ExposedPort} for the given parameters. - * + * * @param scheme * the {@link #getScheme() scheme}, tcp or udp * @param port @@ -112,7 +112,7 @@ public static ExposedPort udp(int port) { /** * Parses a textual port specification (as used by the Docker CLI) to an {@link ExposedPort}. - * + * * @param serialized * the specification, e.g. 80/tcp * @return an {@link ExposedPort} matching the specification @@ -138,7 +138,7 @@ public static ExposedPort parse(String serialized) throws IllegalArgumentExcepti /** * Returns a string representation of this {@link ExposedPort} suitable for inclusion in a JSON message. The format * is port/protocol, like the argument in {@link #parse(String)}. - * + * * @return a string representation of this {@link ExposedPort} */ @Override 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 9b31e05a9..36e9ee93d 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -4,34 +4,43 @@ import com.fasterxml.jackson.annotation.JsonIgnore; 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; @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(Include.NON_NULL) public class HostConfig { @JsonProperty("Binds") private Binds binds; - @JsonProperty("Links") - private Links links; + @JsonProperty("BlkioWeight") + private Integer blkioWeight; - @JsonProperty("LxcConf") - private LxcConf[] lxcConf; + @JsonProperty("CapAdd") + private Capability[] capAdd; - @JsonProperty("LogConfig") - private LogConfig logConfig; + @JsonProperty("CapDrop") + private Capability[] capDrop; - @JsonProperty("PortBindings") - private Ports portBindings; + @JsonProperty("ContainerIDFile") + private String containerIDFile; - @JsonProperty("PublishAllPorts") - private boolean publishAllPorts; + @JsonProperty("CpuPeriod") + private Integer cpuPeriod; - @JsonProperty("Privileged") - private boolean privileged; + @JsonProperty("CpuShares") + private Integer cpuShares; - @JsonProperty("ReadonlyRootfs") - private boolean readonlyRootfs; + @JsonProperty("CpusetCpus") + private String cpusetCpus; + + @JsonProperty("CpusetMems") + private String cpusetMems; + + @JsonProperty("Devices") + private Device[] devices; @JsonProperty("Dns") private String[] dns; @@ -39,159 +48,188 @@ public class HostConfig { @JsonProperty("DnsSearch") private String[] dnsSearch; - @JsonProperty("VolumesFrom") - private VolumesFrom[] volumesFrom; + @JsonProperty("ExtraHosts") + private String[] extraHosts; - @JsonProperty("ContainerIDFile") - private String containerIDFile; + @JsonProperty("Links") + private Links links; - @JsonProperty("CapAdd") - private Capability[] capAdd; + @JsonProperty("LogConfig") + private LogConfig logConfig; - @JsonProperty("CapDrop") - private Capability[] capDrop; + @JsonProperty("LxcConf") + private LxcConf[] lxcConf; - @JsonProperty("RestartPolicy") - private RestartPolicy restartPolicy; + @JsonProperty("Memory") + private Long memory; + + @JsonProperty("MemorySwap") + private Long memorySwap; @JsonProperty("NetworkMode") private String networkMode; - @JsonProperty("Devices") - private Device[] devices; + @JsonProperty("OomKillDisable") + private Boolean oomKillDisable; - @JsonProperty("ExtraHosts") - private String[] extraHosts; + @JsonProperty("PortBindings") + private Ports portBindings; - @JsonProperty("Ulimits") - private Ulimit[] ulimits; + @JsonProperty("Privileged") + private Boolean privileged; - @JsonProperty("Memory") - private long memoryLimit = 0; + @JsonProperty("PublishAllPorts") + private Boolean publishAllPorts; - @JsonProperty("MemorySwap") - private long memorySwap = 0; + @JsonProperty("ReadonlyRootfs") + private Boolean readonlyRootfs; - @JsonProperty("CpuShares") - private int cpuShares = 0; + @JsonProperty("RestartPolicy") + private RestartPolicy restartPolicy; + + @JsonProperty("Ulimits") + private Ulimit[] ulimits; + + @JsonProperty("VolumesFrom") + private VolumesFrom[] volumesFrom; public HostConfig() { } - public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, LogConfig logConfig, Ports portBindings, - boolean publishAllPorts, boolean privileged, boolean readonlyRootfs, String[] dns, String[] dnsSearch, - VolumesFrom[] volumesFrom, String containerIDFile, Capability[] capAdd, Capability[] capDrop, - RestartPolicy restartPolicy, String networkMode, Device[] devices, String[] extraHosts, Ulimit[] ulimits) { - this.binds = new Binds(binds); - this.links = new Links(links); - this.lxcConf = lxcConf; - this.logConfig = logConfig; - this.portBindings = portBindings; - this.publishAllPorts = publishAllPorts; - this.privileged = privileged; - this.readonlyRootfs = readonlyRootfs; - this.dns = dns; - this.dnsSearch = dnsSearch; - this.volumesFrom = volumesFrom; - this.containerIDFile = containerIDFile; - this.capAdd = capAdd; - this.capDrop = capDrop; - this.restartPolicy = restartPolicy; - this.networkMode = networkMode; - this.devices = devices; - this.extraHosts = extraHosts; - this.ulimits = ulimits; - } + // public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, LogConfig logConfig, Ports portBindings, + // Boolean publishAllPorts, Boolean privileged, Boolean readonlyRootfs, String[] dns, String[] dnsSearch, + // VolumesFrom[] volumesFrom, String containerIDFile, Capability[] capAdd, Capability[] capDrop, + // RestartPolicy restartPolicy, String networkMode, Device[] devices, String[] extraHosts, Ulimit[] ulimits) { + // this.binds = new Binds(binds); + // this.links = new Links(links); + // this.lxcConf = lxcConf; + // this.logConfig = logConfig; + // this.portBindings = portBindings; + // this.publishAllPorts = publishAllPorts; + // this.privileged = privileged; + // this.readonlyRootfs = readonlyRootfs; + // this.dns = dns; + // this.dnsSearch = dnsSearch; + // this.volumesFrom = volumesFrom; + // this.containerIDFile = containerIDFile; + // this.capAdd = capAdd; + // this.capDrop = capDrop; + // this.restartPolicy = restartPolicy; + // this.networkMode = networkMode; + // this.devices = devices; + // this.extraHosts = extraHosts; + // this.ulimits = ulimits; + // } @JsonIgnore public Bind[] getBinds() { return (binds == null) ? new Bind[0] : binds.getBinds(); } - public LxcConf[] getLxcConf() { - return lxcConf; + public Integer getBlkioWeight() { + return blkioWeight; } - @JsonIgnore - public LogConfig getLogConfig() { - return (logConfig == null) ? new LogConfig() : logConfig; + public Capability[] getCapAdd() { + return capAdd; } - public Ports getPortBindings() { - return portBindings; + public Capability[] getCapDrop() { + return capDrop; } - public boolean isPublishAllPorts() { - return publishAllPorts; + public String getContainerIDFile() { + return containerIDFile; } - public boolean isPrivileged() { - return privileged; + public Integer getCpuPeriod() { + return cpuPeriod; } - public boolean isReadonlyRootfs() { - return readonlyRootfs; + public Integer getCpuShares() { + return cpuShares; } - public String[] getDns() { - return dns; + public String getCpusetCpus() { + return cpusetCpus; } - public VolumesFrom[] getVolumesFrom() { - return volumesFrom; + public String getCpusetMems() { + return cpusetMems; } - public String getContainerIDFile() { - return containerIDFile; + public Device[] getDevices() { + return devices; + } + + public String[] getDns() { + return dns; } public String[] getDnsSearch() { return dnsSearch; } + public String[] getExtraHosts() { + return extraHosts; + } + @JsonIgnore public Link[] getLinks() { return (links == null) ? new Link[0] : links.getLinks(); } - public String getNetworkMode() { - return networkMode; + @JsonIgnore + public LogConfig getLogConfig() { + return (logConfig == null) ? new LogConfig() : logConfig; } - public Device[] getDevices() { - return devices; + public LxcConf[] getLxcConf() { + return lxcConf; } - public String[] getExtraHosts() { - return extraHosts; + public Long getMemory() { + return memory; } - public RestartPolicy getRestartPolicy() { - return restartPolicy; + public Long getMemorySwap() { + return memorySwap; } - public Capability[] getCapAdd() { - return capAdd; + public String getNetworkMode() { + return networkMode; } - public Capability[] getCapDrop() { - return capDrop; + public Ports getPortBindings() { + return portBindings; + } + + public RestartPolicy getRestartPolicy() { + return restartPolicy; } public Ulimit[] getUlimits() { return ulimits; } - public long getMemoryLimit() { - return memoryLimit; + public VolumesFrom[] getVolumesFrom() { + return volumesFrom; } - public long getMemorySwap() { - return memorySwap; + public Boolean isOomKillDisable() { + return oomKillDisable; } - public int getCpuShares() { - return cpuShares; + public Boolean isPrivileged() { + return privileged; + } + + public Boolean isPublishAllPorts() { + return publishAllPorts; + } + + public Boolean isReadonlyRootfs() { + return readonlyRootfs; } @JsonIgnore @@ -199,34 +237,40 @@ public void setBinds(Bind... binds) { this.binds = new Binds(binds); } - @JsonIgnore - public void setLinks(Link... links) { - this.links = new Links(links); + public void setBlkioWeight(Integer blkioWeight) { + this.blkioWeight = blkioWeight; } - public void setLxcConf(LxcConf[] lxcConf) { - this.lxcConf = lxcConf; + public void setCpuPeriod(Integer cpuPeriod) { + this.cpuPeriod = cpuPeriod; } - @JsonIgnore - public void setLogConfig(LogConfig logConfig) { - this.logConfig = logConfig; + public void setCpuShares(Integer cpuShares) { + this.cpuShares = cpuShares; } - public void setPortBindings(Ports portBindings) { - this.portBindings = portBindings; + public void setCpusetCpus(String cpusetCpus) { + this.cpusetCpus = cpusetCpus; } - public void setPublishAllPorts(boolean publishAllPorts) { - this.publishAllPorts = publishAllPorts; + public void setCpusetMems(String cpusetMems) { + this.cpusetMems = cpusetMems; } - public void setPrivileged(boolean privileged) { - this.privileged = privileged; + public void setCapAdd(Capability[] capAdd) { + this.capAdd = capAdd; } - public void setReadonlyRootfs(boolean readonlyRootfs) { - this.readonlyRootfs = readonlyRootfs; + public void setCapDrop(Capability[] capDrop) { + this.capDrop = capDrop; + } + + public void setContainerIDFile(String containerIDFile) { + this.containerIDFile = containerIDFile; + } + + public void setDevices(Device[] devices) { + this.devices = devices; } public void setDns(String[] dns) { @@ -237,42 +281,68 @@ public void setDnsSearch(String[] dnsSearch) { this.dnsSearch = dnsSearch; } - public void setVolumesFrom(VolumesFrom[] volumesFrom) { - this.volumesFrom = volumesFrom; + public void setExtraHosts(String[] extraHosts) { + this.extraHosts = extraHosts; } - public void setContainerIDFile(String containerIDFile) { - this.containerIDFile = containerIDFile; + @JsonIgnore + public void setLinks(Link... links) { + this.links = new Links(links); } - public void setCapAdd(Capability[] capAdd) { - this.capAdd = capAdd; + @JsonIgnore + public void setLogConfig(LogConfig logConfig) { + this.logConfig = logConfig; } - public void setCapDrop(Capability[] capDrop) { - this.capDrop = capDrop; + public void setLxcConf(LxcConf[] lxcConf) { + this.lxcConf = lxcConf; } - public void setRestartPolicy(RestartPolicy restartPolicy) { - this.restartPolicy = restartPolicy; + public void setMemory(Long memory) { + this.memory = memory; + } + + public void setMemorySwap(Long memorySwap) { + this.memorySwap = memorySwap; } public void setNetworkMode(String networkMode) { this.networkMode = networkMode; } - public void setDevices(Device[] devices) { - this.devices = devices; + public void setOomKillDisable(Boolean oomKillDisable) { + this.oomKillDisable = oomKillDisable; } - public void setExtraHosts(String[] extraHosts) { - this.extraHosts = extraHosts; + public void setPortBindings(Ports portBindings) { + this.portBindings = portBindings; + } + + public void setPrivileged(Boolean privileged) { + this.privileged = privileged; + } + + public void setPublishAllPorts(Boolean publishAllPorts) { + this.publishAllPorts = publishAllPorts; + } + + public void setReadonlyRootfs(Boolean readonlyRootfs) { + this.readonlyRootfs = readonlyRootfs; + } + + public void setRestartPolicy(RestartPolicy restartPolicy) { + this.restartPolicy = restartPolicy; } public void setUlimits(Ulimit[] ulimits) { this.ulimits = ulimits; } + public void setVolumesFrom(VolumesFrom[] volumesFrom) { + this.volumesFrom = volumesFrom; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); 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 9df8aacef..3c84c9584 100644 --- a/src/main/java/com/github/dockerjava/api/model/Image.java +++ b/src/main/java/com/github/dockerjava/api/model/Image.java @@ -3,7 +3,9 @@ import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; /** * @@ -11,10 +13,11 @@ * */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(Include.NON_NULL) public class Image { @JsonProperty("Created") - private long created; + private Long created; @JsonProperty("Id") private String id; @@ -26,10 +29,10 @@ public class Image { private String[] repoTags; @JsonProperty("Size") - private long size; + private Long size; @JsonProperty("VirtualSize") - private long virtualSize; + private Long virtualSize; public String getId() { return id; @@ -43,15 +46,15 @@ public String getParentId() { return parentId; } - public long getCreated() { + public Long getCreated() { return created; } - public long getSize() { + public Long getSize() { return size; } - public long getVirtualSize() { + public Long getVirtualSize() { return virtualSize; } 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 5ff53a597..d038df878 100644 --- a/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/src/main/java/com/github/dockerjava/api/model/Info.java @@ -8,23 +8,21 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * * @author Konstantin Pelykh (kpelykh@gmail.com) * */ -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) @JsonInclude(Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public class Info { @JsonProperty("Containers") - private int containers; + private Integer containers; @JsonProperty("Debug") - private boolean debug; + private Boolean debug; @JsonProperty("DockerRootDir") private String DockerRootDir; @@ -42,10 +40,10 @@ public class Info { private String ID; @JsonProperty("IPv4Forwarding") - private boolean IPv4Forwarding; + private Boolean IPv4Forwarding; @JsonProperty("Images") - private int images; + private Integer images; @JsonProperty("IndexServerAddress") private String IndexServerAddress; @@ -63,25 +61,25 @@ public class Info { private String[] Labels; @JsonProperty("MemoryLimit") - private boolean memoryLimit; + private Boolean memoryLimit; @JsonProperty("MemTotal") - private long memTotal; + private Long memTotal; @JsonProperty("Name") private String name; @JsonProperty("NCPU") - private int NCPU; + private Integer NCPU; @JsonProperty("NEventsListener") - private long nEventListener; + private Long nEventListener; @JsonProperty("NFd") - private int NFd; + private Integer NFd; @JsonProperty("NGoroutines") - private int NGoroutines; + private Integer NGoroutines; @JsonProperty("OperatingSystem") private String OperatingSystem; @@ -90,13 +88,13 @@ public class Info { private String[] sockets; @JsonProperty("SwapLimit") - private boolean swapLimit; + private Boolean swapLimit; - public boolean isDebug() { + public Boolean isDebug() { return debug; } - public int getContainers() { + public Integer getContainers() { return containers; } @@ -112,7 +110,7 @@ public List getDriverStatuses() { return driverStatuses; } - public int getImages() { + public Integer getImages() { return images; } @@ -120,7 +118,7 @@ public String getID() { return ID; } - public boolean getIPv4Forwarding() { + public Boolean getIPv4Forwarding() { return IPv4Forwarding; } @@ -148,15 +146,15 @@ public String[] getSockets() { return sockets; } - public boolean isMemoryLimit() { + public Boolean isMemoryLimit() { return memoryLimit; } - public long getnEventListener() { + public Long getnEventListener() { return nEventListener; } - public long getMemTotal() { + public Long getMemTotal() { return memTotal; } @@ -164,15 +162,15 @@ public String getName() { return name; } - public int getNCPU() { + public Integer getNCPU() { return NCPU; } - public int getNFd() { + public Integer getNFd() { return NFd; } - public int getNGoroutines() { + public Integer getNGoroutines() { return NGoroutines; } @@ -180,7 +178,7 @@ public String getOperatingSystem() { return OperatingSystem; } - public boolean getSwapLimit() { + public Boolean getSwapLimit() { return swapLimit; } 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 0b2c828f3..43f9de65b 100644 --- a/src/main/java/com/github/dockerjava/api/model/Link.java +++ b/src/main/java/com/github/dockerjava/api/model/Link.java @@ -17,7 +17,7 @@ public class Link { /** * Creates a {@link Link} for the container with the given name and an aliased name for use in the target container. - * + * * @param name * the name of the container that you want to link into the target container * @param alias @@ -44,7 +44,7 @@ public String getAlias() { /** * Parses a textual link specification (as used by the Docker CLI) to a {@link Link}. - * + * * @param serialized * the specification, e.g. name:alias or /name1:/name2/alias * @return a {@link Link} matching the specification @@ -86,7 +86,7 @@ public int hashCode() { /** * Returns a string representation of this {@link Link} suitable for inclusion in a JSON message. The format is * name:alias, like the argument in {@link #parse(String)}. - * + * * @return a string representation of this {@link Link} */ @Override 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 f97588308..779aa4c78 100644 --- a/src/main/java/com/github/dockerjava/api/model/LxcConf.java +++ b/src/main/java/com/github/dockerjava/api/model/LxcConf.java @@ -1,7 +1,10 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +@JsonInclude(Include.NON_NULL) public class LxcConf { @JsonProperty("Key") public String key; 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 4bbeeec38..902f805b8 100644 --- a/src/main/java/com/github/dockerjava/api/model/Node.java +++ b/src/main/java/com/github/dockerjava/api/model/Node.java @@ -1,10 +1,13 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; /** * A node as returned by the /events API, for instance, when Swarm is used. */ +@JsonInclude(Include.NON_NULL) public class Node { @JsonProperty("Name") 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 54aa8b226..a5f13977b 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -30,7 +30,7 @@ *

* Note: This is an abstraction used for querying existing port bindings from a container configuration. It is not to * be confused with the {@link PortBinding} abstraction used for adding new port bindings to a container. - * + * * @see HostConfig#getPortBindings() * @see NetworkSettings#getPorts() */ @@ -93,7 +93,7 @@ public String toString() { /** * Returns the port bindings in the format used by the Docker remote API, i.e. the {@link Binding}s grouped by * {@link ExposedPort}. - * + * * @return the port bindings as a {@link Map} that contains one or more {@link Binding}s per {@link ExposedPort}. */ public Map getBindings() { @@ -128,7 +128,7 @@ public static Binding Binding(Integer hostPort) { * A {@link Binding} represents a socket on the Docker host that is used in a {@link PortBinding}. It is * characterized by an {@link #getHostIp() IP address} and a {@link #getHostPort() port number}. Both properties may * be null in order to let Docker assign them dynamically/using defaults. - * + * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort */ @@ -141,7 +141,7 @@ public static class Binding { /** * Creates a {@link Binding} for the given {@link #getHostIp() IP address} and {@link #getHostPort() port * number}. - * + * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort */ @@ -153,7 +153,7 @@ public Binding(String hostIp, Integer hostPort) { /** * Creates a {@link Binding} for the given {@link #getHostPort() port number}, leaving the {@link #getHostIp() * IP address} undefined. - * + * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort */ @@ -197,7 +197,7 @@ public Integer getHostPort() { * Parses a textual host and port specification (as used by the Docker CLI) to a {@link Binding}. *

* Legal syntax: IP|IP:port|port - * + * * @param serialized * serialized the specification, e.g. 127.0.0.1:80 * @return a {@link Binding} matching the specification @@ -230,7 +230,7 @@ public static Binding parse(String serialized) throws IllegalArgumentException { /** * Returns a string representation of this {@link Binding} suitable for inclusion in a JSON message. The format * is [IP:]Port, like the argument in {@link #parse(String)}. - * + * * @return a string representation of this {@link Binding} */ @Override diff --git a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java index b2bedca60..6da3f8e91 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -17,7 +17,7 @@ public class PullResponseItem extends ResponseItem { * @returns true: status indicates that pull was successful, false: status doesn't indicate a successful pull */ @JsonIgnore - public boolean isPullSuccessIndicated() { + public Boolean isPullSuccessIndicated() { if (getStatus() == null) return false; diff --git a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java index 2555271fd..f53c90842 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java @@ -17,7 +17,7 @@ public class PushResponseItem extends ResponseItem { * @returns true: the error field indicates an error, false: the error field doesn't indicate an error */ @JsonIgnore - public boolean isErrorIndicated() { + public Boolean isErrorIndicated() { if (getError() == null) return false; 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 3ea625164..272defd52 100644 --- a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java @@ -63,10 +63,10 @@ public static class ProgressDetail implements Serializable { private static final long serialVersionUID = -1954994695645715264L; @JsonProperty("current") - int current; + Integer current; @JsonProperty("total") - int total; + Integer total; @Override public String toString() { 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 e96821cf1..cd437667f 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -9,16 +9,16 @@ /** * Container restart policy - * + * *

*
no
*
Do not restart the container if it dies. (default)
- * + * *
on-failure
*
Restart the container if it exits with a non-zero exit code. Can also accept an optional maximum restart count * (e.g. on-failure:5). *
- * + * *
always
*
Always restart the container no matter what exit code is returned. *
@@ -30,7 +30,7 @@ public class RestartPolicy { @JsonProperty("MaximumRetryCount") - private int maximumRetryCount = 0; + private Integer maximumRetryCount = 0; @JsonProperty("Name") private String name = ""; @@ -60,7 +60,7 @@ public static RestartPolicy alwaysRestart() { /** * Restart the container if it exits with a non-zero exit code. - * + * * @param maximumRetryCount * the maximum number of restarts. Set to 0 for unlimited retries. */ @@ -68,7 +68,7 @@ public static RestartPolicy onFailureRestart(int maximumRetryCount) { return new RestartPolicy(maximumRetryCount, "on-failure"); } - public int getMaximumRetryCount() { + public Integer getMaximumRetryCount() { return maximumRetryCount; } @@ -78,7 +78,7 @@ public String getName() { /** * Parses a textual restart polixy specification (as used by the Docker CLI) to a {@link RestartPolicy}. - * + * * @param serialized * the specification, e.g. on-failure:2 * @return a {@link RestartPolicy} matching the specification @@ -109,7 +109,7 @@ public static RestartPolicy parse(String serialized) throws IllegalArgumentExcep /** * Returns a string representation of this {@link RestartPolicy}. The format is name[:count], like the * argument in {@link #parse(String)}. - * + * * @return a string representation of this {@link RestartPolicy} */ @Override 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 5c5206616..0a5843838 100644 --- a/src/main/java/com/github/dockerjava/api/model/SearchItem.java +++ b/src/main/java/com/github/dockerjava/api/model/SearchItem.java @@ -14,13 +14,13 @@ public class SearchItem { @JsonProperty("star_count") - private int starCount; + private Integer starCount; @JsonProperty("is_official") - private boolean isOfficial; + private Boolean isOfficial; @JsonProperty("is_trusted") - private boolean isTrusted; + private Boolean isTrusted; @JsonProperty("name") private String name; @@ -28,15 +28,15 @@ public class SearchItem { @JsonProperty("description") private String description; - public int getStarCount() { + public Integer getStarCount() { return starCount; } - public boolean isOfficial() { + public Boolean isOfficial() { return isOfficial; } - public boolean isTrusted() { + public Boolean isTrusted() { return isTrusted; } 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 f6acf16ee..13747339b 100644 --- a/src/main/java/com/github/dockerjava/api/model/Statistics.java +++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java @@ -5,12 +5,15 @@ import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; /** * Representation of a Docker statistics. */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(Include.NON_NULL) public class Statistics { @JsonProperty("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 d385adbe2..209eb22fe 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ulimit.java +++ b/src/main/java/com/github/dockerjava/api/model/Ulimit.java @@ -16,10 +16,10 @@ public class Ulimit { private String name; @JsonProperty("Soft") - private int soft; + private Integer soft; @JsonProperty("Hard") - private int hard; + private Integer hard; public Ulimit() { @@ -37,11 +37,11 @@ public String getName() { return name; } - public int getSoft() { + public Integer getSoft() { return soft; } - public int getHard() { + public Integer getHard() { return hard; } 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 f7ff8e288..93f7e4e4f 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volume.java +++ b/src/main/java/com/github/dockerjava/api/model/Volume.java @@ -5,7 +5,7 @@ /** * Represents a bind mounted volume in a Docker container. - * + * * @see Bind */ public class Volume { 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 09a2d8d6a..46d4539b4 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java @@ -21,7 +21,7 @@ /** * Represents a bind mounted volume in a Docker container. - * + * * @see Bind */ @JsonDeserialize(using = VolumeRW.Deserializer.class) @@ -52,7 +52,7 @@ public AccessMode getAccessMode() { /** * Returns a string representation of this {@link VolumeRW} suitable for inclusion in a JSON message. The returned * String is simply the container path, {@link #getPath()}. - * + * * @return a string representation of this {@link VolumeRW} */ @Override 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 c884a633e..01f80aba9 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java @@ -44,7 +44,7 @@ public AccessMode getAccessMode() { /** * Parses a volume from specification to a {@link VolumesFrom}. - * + * * @param serialized * the specification, e.g. container:ro * @return a {@link VolumesFrom} matching the specification @@ -89,7 +89,7 @@ public int hashCode() { /** * Returns a string representation of this {@link VolumesFrom} suitable for inclusion in a JSON message. The format * is <container>:<access mode>, like the argument in {@link #parse(String)}. - * + * * @return a string representation of this {@link VolumesFrom} */ @Override diff --git a/src/main/java/com/github/dockerjava/core/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/CertificateUtils.java index 465b06460..56a818f72 100644 --- a/src/main/java/com/github/dockerjava/core/CertificateUtils.java +++ b/src/main/java/com/github/dockerjava/core/CertificateUtils.java @@ -27,11 +27,11 @@ public class CertificateUtils { - public static boolean verifyCertificatesExist(String dockerCertPath) { + public static Boolean verifyCertificatesExist(String dockerCertPath) { String[] files = { "ca.pem", "cert.pem", "key.pem" }; for (String file : files) { File path = new File(dockerCertPath, file); - boolean exists = path.exists(); + Boolean exists = path.exists(); if (!exists) { return false; } diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index afe4b9843..c9067b431 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -43,13 +43,13 @@ */ public class GoLangFileMatch { - public static final boolean IS_WINDOWS = File.separatorChar == '\\'; + public static final Boolean IS_WINDOWS = File.separatorChar == '\\'; - public static boolean match(List patterns, File file) { + public static Boolean match(List patterns, File file) { return !match(patterns, file.getPath()).isEmpty(); } - public static boolean match(String pattern, File file) { + public static Boolean match(String pattern, File file) { return match(pattern, file.getPath()); } @@ -66,7 +66,7 @@ public static List match(List patterns, String name) { return matches; } - public static boolean match(String pattern, String name) { + public static Boolean match(String pattern, String name) { Pattern: while (!pattern.isEmpty()) { ScanResult scanResult = scanChunk(pattern); pattern = scanResult.pattern; @@ -103,12 +103,12 @@ public static boolean match(String pattern, String name) { } static ScanResult scanChunk(String pattern) { - boolean star = false; + Boolean star = false; if (!pattern.isEmpty() && pattern.charAt(0) == '*') { pattern = pattern.substring(1); star = true; } - boolean inRange = false; + Boolean inRange = false; int i; Scan: for (i = 0; i < pattern.length(); i++) { switch (pattern.charAt(i)) { @@ -157,12 +157,12 @@ static String matchChunk(String chunk, String s) { throw new GoLangFileMatchException(); } // possibly negated - boolean negated = chunk.charAt(chunkOffset) == '^'; + Boolean negated = chunk.charAt(chunkOffset) == '^'; if (negated) { chunkOffset++; } // parse all ranges - boolean match = false; + Boolean match = false; int nrange = 0; while (true) { if (chunkOffset < chunkLength && chunk.charAt(chunkOffset) == ']' && nrange > 0) { @@ -238,13 +238,13 @@ static GetEscResult getEsc(String chunk, int chunkOffset, int chunkLength) { } private static final class ScanResult { - public boolean star; + public Boolean star; public String chunk; public String pattern; - public ScanResult(boolean star, String chunk, String pattern) { + public ScanResult(Boolean star, String chunk, String pattern) { this.star = star; this.chunk = chunk; this.pattern = pattern; diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index 44310e9ce..1c85ee3f4 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -17,6 +17,8 @@ */ public class LocalDirectorySSLConfig implements SSLConfig, Serializable { + private static final long serialVersionUID = -4736328026418377358L; + private final String dockerCertPath; public LocalDirectorySSLConfig(String dockerCertPath) { @@ -31,7 +33,7 @@ public String getDockerCertPath() { @Override public SSLContext getSSLContext() { - boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); + Boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); if (certificatesExist) { diff --git a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java index 4e1ce6765..522d5b189 100644 --- a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java @@ -37,7 +37,7 @@ public void processResponseStream(InputStream response, ResultCallback result try { JsonParser jp = JSON_FACTORY.createParser(response); - boolean closed = jp.isClosed(); + Boolean closed = jp.isClosed(); JsonToken nextToken = jp.nextToken(); while (!closed && nextToken != null && nextToken != JsonToken.END_OBJECT) { try { 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 b5387ede0..b57108ea5 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -28,7 +28,7 @@ public abstract class ResultCallbackTemplate implements AuthCmd { @@ -21,9 +21,4 @@ public AuthCmdImpl(AuthCmd.Exec exec, AuthConfig authConfig) { public AuthResponse exec() throws UnauthorizedException { return super.exec(); } - - @Override - public String toString() { - return "authenticate using " + this.getAuthConfig(); - } } 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 4be5a4ede..6971982b3 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -7,15 +7,13 @@ import java.io.InputStream; import java.net.URI; +import javax.annotation.CheckForNull; + import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.core.FilePathUtil; import com.github.dockerjava.core.dockerfile.Dockerfile; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; - -import javax.annotation.CheckForNull; /** * @@ -30,13 +28,13 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd implements private String containerId, repository, tag, message, author; - private boolean pause = true; + private Boolean pause = true; @JsonProperty("AttachStdin") - private boolean attachStdin; + private Boolean attachStdin; @JsonProperty("AttachStdout") - private boolean attachStdout; + private Boolean attachStdout; @JsonProperty("AttachStderr") - private boolean attachStderr; + private Boolean attachStderr; @JsonProperty("Cmd") private String[] cmd; @JsonProperty("DisableNetwork") - private boolean disableNetwork; + private Boolean disableNetwork; @JsonProperty("Env") private String[] env; @@ -52,16 +50,16 @@ public class CommitCmdImpl extends AbstrDockerCmd implements private Integer memorySwap; @JsonProperty("OpenStdin") - private boolean openStdin; + private Boolean openStdin; @JsonProperty("PortSpecs") private String[] portSpecs; @JsonProperty("StdinOnce") - private boolean stdinOnce; + private Boolean stdinOnce; @JsonProperty("Tty") - private boolean tty; + private Boolean tty; @JsonProperty("User") private String user; @@ -110,12 +108,12 @@ public String getAuthor() { } @Override - public boolean hasPauseEnabled() { + public Boolean hasPauseEnabled() { return pause; } @Override - public CommitCmdImpl withAttachStderr(boolean attachStderr) { + public CommitCmdImpl withAttachStderr(Boolean attachStderr) { this.attachStderr = attachStderr; return this; } @@ -126,7 +124,7 @@ public CommitCmdImpl withAttachStderr() { } @Override - public CommitCmdImpl withAttachStdin(boolean attachStdin) { + public CommitCmdImpl withAttachStdin(Boolean attachStdin) { this.attachStdin = attachStdin; return this; } @@ -137,7 +135,7 @@ public CommitCmdImpl withAttachStdin() { } @Override - public CommitCmdImpl withAttachStdout(boolean attachStdout) { + public CommitCmdImpl withAttachStdout(Boolean attachStdout) { this.attachStdout = attachStdout; return this; } @@ -155,7 +153,7 @@ public CommitCmdImpl withCmd(String... cmd) { } @Override - public CommitCmdImpl withDisableNetwork(boolean disableNetwork) { + public CommitCmdImpl withDisableNetwork(Boolean disableNetwork) { this.disableNetwork = disableNetwork; return this; } @@ -189,7 +187,7 @@ public CommitCmdImpl withRepository(String repository) { } @Override - public CommitCmdImpl withPause(boolean pause) { + public CommitCmdImpl withPause(Boolean pause) { this.pause = pause; return this; } @@ -255,12 +253,12 @@ public CommitCmdImpl withMemorySwap(Integer memorySwap) { } @Override - public boolean isOpenStdin() { + public Boolean isOpenStdin() { return openStdin; } @Override - public CommitCmdImpl withOpenStdin(boolean openStdin) { + public CommitCmdImpl withOpenStdin(Boolean openStdin) { checkNotNull(openStdin, "openStdin was not specified"); this.openStdin = openStdin; return this; @@ -279,12 +277,12 @@ public CommitCmdImpl withPortSpecs(String... portSpecs) { } @Override - public boolean isStdinOnce() { + public Boolean isStdinOnce() { return stdinOnce; } @Override - public CommitCmdImpl withStdinOnce(boolean stdinOnce) { + public CommitCmdImpl withStdinOnce(Boolean stdinOnce) { this.stdinOnce = stdinOnce; return this; } @@ -295,12 +293,12 @@ public CommitCmdImpl withStdinOnce() { } @Override - public boolean isTty() { + public Boolean isTty() { return tty; } @Override - public CommitCmdImpl withTty(boolean tty) { + public CommitCmdImpl withTty(Boolean tty) { this.tty = tty; return this; } @@ -346,13 +344,6 @@ public CommitCmdImpl withWorkingDir(String workingDir) { return this; } - @Override - public String toString() { - return new ToStringBuilder(this).append("commit ").append(author != null ? "--author " + author + " " : "") - .append(message != null ? "--message " + message + " " : "").append(containerId) - .append(repository != null ? " " + repository + ":" : " ").append(tag != null ? tag : "").toString(); - } - /** * @throws NotFoundException * No such container diff --git a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java index a394c535c..2651ddb77 100644 --- a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java @@ -38,11 +38,6 @@ public ContainerDiffCmdImpl withContainerId(String containerId) { return this; } - @Override - public String toString() { - return new StringBuilder("diff ").append(containerId).toString(); - } - /** * @throws NotFoundException * No such container diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index ef5f86a7a..6258fc4ed 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -4,8 +4,6 @@ import java.io.InputStream; -import org.apache.commons.lang.builder.ToStringBuilder; - import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; @@ -68,11 +66,6 @@ public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { return this; } - @Override - public String toString() { - return new ToStringBuilder(this).append("cp ").append(containerId).append(":").append(resource).toString(); - } - /** * @throws NotFoundException * No such container 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 f29c5c05f..1ca9d483a 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -7,6 +7,8 @@ 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; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.ConflictException; import com.github.dockerjava.api.NotFoundException; @@ -34,55 +36,41 @@ * Creates a new container. * */ +@JsonInclude(Include.NON_NULL) public class CreateContainerCmdImpl extends AbstrDockerCmd implements CreateContainerCmd { private String name; @JsonProperty("Hostname") - private String hostName = ""; + private String hostName; @JsonProperty("Domainname") - private String domainName = ""; + private String domainName; @JsonProperty("User") - private String user = ""; - - @JsonProperty("Memory") - private long memoryLimit = 0; - - @JsonProperty("MemorySwap") - private long memorySwap = 0; - - @JsonProperty("CpuShares") - private int cpuShares = 0; - - @JsonProperty("CpuPeriod") - private Integer cpuPeriod; - - @JsonProperty("Cpuset") - private String cpuset; + private String user; @JsonProperty("AttachStdin") - private boolean attachStdin = false; + private Boolean attachStdin; @JsonProperty("AttachStdout") - private boolean attachStdout = false; + private Boolean attachStdout; @JsonProperty("AttachStderr") - private boolean attachStderr = false; + private Boolean attachStderr; @JsonProperty("PortSpecs") private String[] portSpecs; @JsonProperty("Tty") - private boolean tty = false; + private Boolean tty; @JsonProperty("OpenStdin") - private boolean stdinOpen = false; + private Boolean stdinOpen; @JsonProperty("StdinOnce") - private boolean stdInOnce = false; + private Boolean stdInOnce; @JsonProperty("Env") private String[] env; @@ -100,13 +88,13 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd labels; - @JsonProperty("CpusetMems") - private String cpusetMems; - - @JsonProperty("BlkioWeight") - private Integer blkioWeight; - - @JsonProperty("OomKillDisable") - private Boolean oomKillDisable; public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) { super(exec); @@ -150,16 +130,19 @@ public Bind[] getBinds() { } @Override + @JsonIgnore public Integer getBlkioWeight() { - return blkioWeight; + return hostConfig.getBlkioWeight(); } @Override + @JsonIgnore public Capability[] getCapAdd() { return hostConfig.getCapAdd(); } @Override + @JsonIgnore public Capability[] getCapDrop() { return hostConfig.getCapDrop(); } @@ -169,28 +152,28 @@ public String[] getCmd() { return cmd; } - public String getContainerIDFile() { - return hostConfig.getContainerIDFile(); - } - @Override + @JsonIgnore public Integer getCpuPeriod() { - return cpuPeriod; + return hostConfig.getCpuPeriod(); } @Override - public String getCpuset() { - return cpuset; + @JsonIgnore + public String getCpusetCpus() { + return hostConfig.getCpusetCpus(); } @Override + @JsonIgnore public String getCpusetMems() { - return cpusetMems; + return hostConfig.getCpusetMems(); } @Override - public int getCpuShares() { - return cpuShares; + @JsonIgnore + public Integer getCpuShares() { + return hostConfig.getCpuShares(); } @Override @@ -272,18 +255,21 @@ public LogConfig getLogConfig() { return hostConfig.getLogConfig(); } + @Override public String getMacAddress() { return macAddress; } @Override - public long getMemoryLimit() { - return memoryLimit; + @JsonIgnore + public Long getMemory() { + return hostConfig.getMemory(); } @Override - public long getMemorySwap() { - return memorySwap; + @JsonIgnore + public Long getMemorySwap() { + return hostConfig.getMemorySwap(); } @Override @@ -315,6 +301,7 @@ public RestartPolicy getRestartPolicy() { } @Override + @JsonIgnore public Ulimit[] getUlimits() { return hostConfig.getUlimits(); } @@ -342,28 +329,29 @@ public String getWorkingDir() { } @Override - public boolean isAttachStderr() { + public Boolean isAttachStderr() { return attachStderr; } @Override - public boolean isAttachStdin() { + public Boolean isAttachStdin() { return attachStdin; } @Override - public boolean isAttachStdout() { + public Boolean isAttachStdout() { return attachStdout; } @Override - public boolean isNetworkDisabled() { + public Boolean isNetworkDisabled() { return networkDisabled; } @Override + @JsonIgnore public Boolean isOomKillDisable() { - return oomKillDisable; + return hostConfig.isOomKillDisable(); } @Override @@ -378,22 +366,24 @@ public Boolean isPublishAllPorts() { return hostConfig.isPublishAllPorts(); } - public boolean isReadonlyRootfs() { + @Override + @JsonIgnore + public Boolean isReadonlyRootfs() { return hostConfig.isReadonlyRootfs(); } @Override - public boolean isStdInOnce() { + public Boolean isStdInOnce() { return stdInOnce; } @Override - public boolean isStdinOpen() { + public Boolean isStdinOpen() { return stdinOpen; } @Override - public boolean isTty() { + public Boolean isTty() { return tty; } @@ -404,19 +394,22 @@ public String toString() { } @Override - public CreateContainerCmdImpl withAttachStderr(boolean attachStderr) { + public CreateContainerCmdImpl withAttachStderr(Boolean attachStderr) { + checkNotNull(attachStderr, "attachStderr was not specified"); this.attachStderr = attachStderr; return this; } @Override - public CreateContainerCmdImpl withAttachStdin(boolean attachStdin) { + public CreateContainerCmdImpl withAttachStdin(Boolean attachStdin) { + checkNotNull(attachStdin, "attachStdin was not specified"); this.attachStdin = attachStdin; return this; } @Override - public CreateContainerCmdImpl withAttachStdout(boolean attachStdout) { + public CreateContainerCmdImpl withAttachStdout(Boolean attachStdout) { + checkNotNull(attachStdout, "attachStdout was not specified"); this.attachStdout = attachStdout; return this; } @@ -431,8 +424,8 @@ public CreateContainerCmd withBinds(Bind... binds) { @Override public CreateContainerCmd withBlkioWeight(Integer blkioWeight) { checkNotNull(blkioWeight, "blkioWeight was not specified"); - this.blkioWeight = blkioWeight; - return null; + hostConfig.setBlkioWeight(blkioWeight); + return this; } @Override @@ -466,27 +459,28 @@ public CreateContainerCmd withContainerIDFile(String containerIDFile) { @Override public CreateContainerCmd withCpuPeriod(Integer cpuPeriod) { checkNotNull(cpuPeriod, "cpuPeriod was not specified"); - this.cpuPeriod = cpuPeriod; + hostConfig.setCpuPeriod(cpuPeriod); return this; } @Override - public CreateContainerCmdImpl withCpuset(String cpuset) { - checkNotNull(cpuset, "cpuset was not specified"); - this.cpuset = cpuset; + public CreateContainerCmdImpl withCpusetCpus(String cpusetCpus) { + checkNotNull(cpusetCpus, "cpusetCpus was not specified"); + hostConfig.setCpusetCpus(cpusetCpus); return this; } @Override public CreateContainerCmd withCpusetMems(String cpusetMems) { checkNotNull(cpusetMems, "cpusetMems was not specified"); - this.cpusetMems = cpusetMems; + hostConfig.setCpusetMems(cpusetMems); return null; } @Override - public CreateContainerCmdImpl withCpuShares(int cpuShares) { - this.cpuShares = cpuShares; + public CreateContainerCmdImpl withCpuShares(Integer cpuShares) { + checkNotNull(cpuShares, "cpuShares was not specified"); + hostConfig.setCpuShares(cpuShares); return this; } @@ -596,14 +590,16 @@ public CreateContainerCmdImpl withMacAddress(String macAddress) { } @Override - public CreateContainerCmdImpl withMemoryLimit(long memoryLimit) { - this.memoryLimit = memoryLimit; + public CreateContainerCmdImpl withMemory(Long memory) { + checkNotNull(memory, "memory was not specified"); + hostConfig.setMemory(memory); return this; } @Override - public CreateContainerCmdImpl withMemorySwap(long memorySwap) { - this.memorySwap = memorySwap; + public CreateContainerCmdImpl withMemorySwap(Long memorySwap) { + checkNotNull(memorySwap, "memorySwap was not specified"); + hostConfig.setMemorySwap(memorySwap); return this; } @@ -615,7 +611,8 @@ public CreateContainerCmdImpl withName(String name) { } @Override - public CreateContainerCmdImpl withNetworkDisabled(boolean disableNetwork) { + public CreateContainerCmdImpl withNetworkDisabled(Boolean disableNetwork) { + checkNotNull(disableNetwork, "disableNetwork was not specified"); this.networkDisabled = disableNetwork; return this; } @@ -630,7 +627,7 @@ public CreateContainerCmd withNetworkMode(String networkMode) { @Override public CreateContainerCmd withOomKillDisable(Boolean oomKillDisable) { checkNotNull(oomKillDisable, "oomKillDisable was not specified"); - this.oomKillDisable = oomKillDisable; + hostConfig.setOomKillDisable(oomKillDisable); return this; } @@ -656,19 +653,22 @@ public CreateContainerCmdImpl withPortSpecs(String... portSpecs) { } @Override - public CreateContainerCmd withPrivileged(boolean privileged) { + public CreateContainerCmd withPrivileged(Boolean privileged) { + checkNotNull(privileged, "no privileged was specified"); this.hostConfig.setPrivileged(privileged); return this; } @Override - public CreateContainerCmd withPublishAllPorts(boolean publishAllPorts) { + public CreateContainerCmd withPublishAllPorts(Boolean publishAllPorts) { + checkNotNull(publishAllPorts, "no publishAllPorts was specified"); this.hostConfig.setPublishAllPorts(publishAllPorts); return this; } @Override - public CreateContainerCmd withReadonlyRootfs(boolean readonlyRootfs) { + public CreateContainerCmd withReadonlyRootfs(Boolean readonlyRootfs) { + checkNotNull(readonlyRootfs, "no readonlyRootfs was specified"); hostConfig.setReadonlyRootfs(readonlyRootfs); return this; } @@ -681,19 +681,22 @@ public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { } @Override - public CreateContainerCmdImpl withStdInOnce(boolean stdInOnce) { + public CreateContainerCmdImpl withStdInOnce(Boolean stdInOnce) { + checkNotNull(stdInOnce, "no stdInOnce was specified"); this.stdInOnce = stdInOnce; return this; } @Override - public CreateContainerCmdImpl withStdinOpen(boolean stdinOpen) { + public CreateContainerCmdImpl withStdinOpen(Boolean stdinOpen) { + checkNotNull(stdinOpen, "no stdinOpen was specified"); this.stdinOpen = stdinOpen; return this; } @Override - public CreateContainerCmdImpl withTty(boolean tty) { + public CreateContainerCmdImpl withTty(Boolean tty) { + checkNotNull(tty, "no tty was specified"); this.tty = tty; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java index 3ed2f912e..57ddc2908 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java @@ -4,8 +4,6 @@ import java.io.InputStream; -import org.apache.commons.lang.builder.ToStringBuilder; - import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.CreateImageResponse; @@ -77,10 +75,4 @@ public CreateImageCmdImpl withTag(String tag) { this.tag = tag; return this; } - - @Override - public String toString() { - return new ToStringBuilder(this).append("import - ").append(repository != null ? repository + ":" : "") - .append(tag != null ? tag : "").toString(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index 5cb801db7..9bd34e57d 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -55,10 +55,4 @@ public Filters getFilters() { return filters; } - @Override - public String toString() { - return new StringBuilder("events").append(since != null ? " --since=" + since : "") - .append(until != null ? " --until=" + until : "") - .append(filters != null ? " --filters=" + filters : "").toString(); - } } 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 3b00d22c5..55a080ebf 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -2,26 +2,29 @@ import static com.google.common.base.Preconditions.checkNotNull; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecCreateCmdResponse; +@JsonInclude(Include.NON_NULL) public class ExecCreateCmdImpl extends AbstrDockerCmd implements ExecCreateCmd { private String containerId; @JsonProperty("AttachStdin") - private boolean attachStdin; + private Boolean attachStdin; @JsonProperty("AttachStdout") - private boolean attachStdout; + private Boolean attachStdout; @JsonProperty("AttachStderr") - private boolean attachStderr; + private Boolean attachStderr; @JsonProperty("Tty") - private boolean tty; + private Boolean tty; @JsonProperty("Cmd") private String[] cmd; @@ -39,7 +42,7 @@ public ExecCreateCmd withContainerId(String containerId) { } @Override - public ExecCreateCmd withAttachStdin(boolean attachStdin) { + public ExecCreateCmd withAttachStdin(Boolean attachStdin) { this.attachStdin = attachStdin; return this; } @@ -50,7 +53,7 @@ public ExecCreateCmd withAttachStdin() { } @Override - public ExecCreateCmd withAttachStdout(boolean attachStdout) { + public ExecCreateCmd withAttachStdout(Boolean attachStdout) { this.attachStdout = attachStdout; return this; } @@ -61,7 +64,7 @@ public ExecCreateCmd withAttachStdout() { } @Override - public ExecCreateCmd withAttachStderr(boolean attachStderr) { + public ExecCreateCmd withAttachStderr(Boolean attachStderr) { this.attachStderr = attachStderr; return this; } @@ -72,7 +75,7 @@ public ExecCreateCmd withAttachStderr() { } @Override - public ExecCreateCmd withTty(boolean tty) { + public ExecCreateCmd withTty(Boolean tty) { this.tty = tty; return this; } @@ -94,22 +97,22 @@ public String getContainerId() { } @Override - public boolean hasAttachStdinEnabled() { + public Boolean hasAttachStdinEnabled() { return attachStdin; } @Override - public boolean hasAttachStdoutEnabled() { + public Boolean hasAttachStdoutEnabled() { return attachStdout; } @Override - public boolean hasAttachStderrEnabled() { + public Boolean hasAttachStderrEnabled() { return attachStderr; } @Override - public boolean hasTtyEnabled() { + public Boolean hasTtyEnabled() { return tty; } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index a479a91f2..3c2e00198 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -11,7 +11,7 @@ public class ExecStartCmdImpl extends AbstrDockerCmd private String execId; - private boolean detach, tty; + private Boolean detach, tty; public ExecStartCmdImpl(ExecStartCmd.Exec exec, String execId) { super(exec); @@ -31,23 +31,23 @@ public ExecStartCmd withExecId(String execId) { } @Override - public boolean hasDetachEnabled() { + public Boolean hasDetachEnabled() { return detach; } @Override - public boolean hasTtyEnabled() { + public Boolean hasTtyEnabled() { return tty; } @Override - public ExecStartCmd withDetach(boolean detach) { + public ExecStartCmd withDetach(Boolean detach) { this.detach = detach; return this; } @Override - public ExecStartCmd withTty(boolean tty) { + public ExecStartCmd withTty(Boolean tty) { this.tty = tty; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index bb5a5d17a..78db8359f 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -18,7 +18,7 @@ public class FrameReader implements AutoCloseable { private final InputStream inputStream; - private boolean rawStreamDetected = false; + private Boolean rawStreamDetected = false; private final byte[] rawBuffer = new byte[1000]; diff --git a/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java index f2dd3ca82..ea27537c7 100644 --- a/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InfoCmdImpl.java @@ -12,8 +12,4 @@ public InfoCmdImpl(InfoCmd.Exec exec) { super(exec); } - @Override - public String toString() { - return "info"; - } } diff --git a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java index c3fe5f6d5..5b4090a4e 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java @@ -31,11 +31,6 @@ public InspectContainerCmd withContainerId(String containerId) { return this; } - @Override - public String toString() { - return "inspect " + containerId; - } - /** * @throws NotFoundException * No such container diff --git a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java index 8ee8f79c3..0d93afc4e 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java @@ -25,11 +25,6 @@ public InspectExecCmd withExecId(String execId) { return this; } - @Override - public String toString() { - return "inspect " + execId; - } - /** * @throws NotFoundException * No such exec diff --git a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java index 3e28bd488..93043f8e6 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java @@ -31,11 +31,6 @@ public InspectImageCmd withImageId(String imageId) { return this; } - @Override - public String toString() { - return "inspect " + imageId; - } - /** * @throws NotFoundException * No such image diff --git a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java index 05e709f37..45c5e38ba 100644 --- a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java @@ -41,11 +41,6 @@ public KillContainerCmd withSignal(String signal) { return this; } - @Override - public String toString() { - return "kill " + containerId; - } - /** * @throws NotFoundException * No such container diff --git a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index 5759cfc53..b7a70603d 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -27,9 +27,9 @@ public class ListContainersCmdImpl extends AbstrDockerCmd> implements ListContainersCmd { - private int limit = -1; + private Integer limit = -1; - private boolean showSize, showAll = false; + private Boolean showSize, showAll = false; private String sinceId, beforeId; @@ -40,17 +40,17 @@ public ListContainersCmdImpl(ListContainersCmd.Exec exec) { } @Override - public int getLimit() { + public Integer getLimit() { return limit; } @Override - public boolean hasShowSizeEnabled() { + public Boolean hasShowSizeEnabled() { return showSize; } @Override - public boolean hasShowAllEnabled() { + public Boolean hasShowAllEnabled() { return showAll; } @@ -70,19 +70,20 @@ public Filters getFilters() { } @Override - public ListContainersCmd withShowAll(boolean showAll) { + public ListContainersCmd withShowAll(Boolean showAll) { this.showAll = showAll; return this; } @Override - public ListContainersCmd withShowSize(boolean showSize) { + public ListContainersCmd withShowSize(Boolean showSize) { this.showSize = showSize; return this; } @Override - public ListContainersCmd withLimit(int limit) { + public ListContainersCmd withLimit(Integer limit) { + checkNotNull(limit, "limit was not specified"); checkArgument(limit > 0, "limit must be greater 0"); this.limit = limit; return this; @@ -109,11 +110,4 @@ public ListContainersCmd withFilters(Filters filters) { return this; } - @Override - public String toString() { - return new StringBuilder("ps ").append(showAll ? "--all=true" : "").append(showSize ? "--size=true" : "") - .append(sinceId != null ? " --since " + sinceId : "") - .append(beforeId != null ? " --before " + beforeId : "").append(limit != -1 ? "-n " + limit : "") - .append(filters != null ? " --filters " + filters : "").toString(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index ddd4dc79f..69879b673 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -19,7 +19,7 @@ public class ListImagesCmdImpl extends AbstrDockerCmd private String filters; - private boolean showAll = false; + private Boolean showAll = false; public ListImagesCmdImpl(ListImagesCmd.Exec exec) { super(exec); @@ -31,12 +31,12 @@ public String getFilters() { } @Override - public boolean hasShowAllEnabled() { + public Boolean hasShowAllEnabled() { return showAll; } @Override - public ListImagesCmd withShowAll(boolean showAll) { + public ListImagesCmd withShowAll(Boolean showAll) { this.showAll = showAll; return this; } @@ -48,9 +48,4 @@ public ListImagesCmd withFilters(String filter) { return this; } - @Override - public String toString() { - return new StringBuilder("images ").append(showAll ? "--all=true" : "") - .append(filters != null ? "--filter " + filters : "").toString(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index a9d923635..3acb33450 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -23,9 +23,9 @@ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd imp private String imageId; - private boolean force, noPrune; + private Boolean force, noPrune; public RemoveImageCmdImpl(RemoveImageCmd.Exec exec, String imageId) { super(exec); @@ -27,12 +30,12 @@ public String getImageId() { } @Override - public boolean hasForceEnabled() { + public Boolean hasForceEnabled() { return force; } @Override - public boolean hasNoPruneEnabled() { + public Boolean hasNoPruneEnabled() { return noPrune; } @@ -49,7 +52,7 @@ public RemoveImageCmd withForce() { } @Override - public RemoveImageCmd withForce(boolean force) { + public RemoveImageCmd withForce(Boolean force) { this.force = force; return this; } @@ -60,17 +63,11 @@ public RemoveImageCmd withNoPrune() { } @Override - public RemoveImageCmd withNoPrune(boolean noPrune) { + public RemoveImageCmd withNoPrune(Boolean noPrune) { this.noPrune = noPrune; return this; } - @Override - public String toString() { - return new StringBuilder("rmi ").append(noPrune ? "--no-prune=true" : "").append(force ? "--force=true" : "") - .append(imageId).toString(); - } - /** * @throws NotFoundException * No such image diff --git a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index 4766dfdb4..fe99477fa 100644 --- a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -17,7 +17,7 @@ public class RestartContainerCmdImpl extends AbstrDockerCmd= 0, "timeout must be greater or equal 0"); this.timeout = timeout; return this; } - @Override - public String toString() { - return new StringBuilder("restart ").append("--time=" + timeout + " ").append(containerId).toString(); - } - /** * @throws NotFoundException * No such container diff --git a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java index 676b151af..12dafb7d9 100644 --- a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java @@ -49,11 +49,6 @@ public SaveImageCmd withTag(String tag) { return this; } - @Override - public String toString() { - return new StringBuilder("get ").append(name).toString(); - } - /** * @throws com.github.dockerjava.api.NotFoundException * No such image diff --git a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java index 6630377c8..342a7fbd2 100644 --- a/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java @@ -35,8 +35,4 @@ public SearchImagesCmd withTerm(String term) { return this; } - @Override - public String toString() { - return new StringBuilder("search ").append(term).toString(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java index 6fe60734d..9d432b7f3 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -37,11 +37,6 @@ public String getContainerId() { return containerId; } - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this).toString(); - } - /** * @throws NotFoundException * No such container diff --git a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java index 9f0e3a00a..bcd187d6a 100644 --- a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java @@ -28,8 +28,4 @@ public String getContainerId() { return containerId; } - @Override - public String toString() { - return new StringBuilder("stats").append(containerId != null ? " --id=" + containerId : "").toString(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index 28373e2ce..bb3ff28e6 100644 --- a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -3,6 +3,9 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import org.apache.commons.lang.builder.ReflectionToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.NotModifiedException; import com.github.dockerjava.api.command.StopContainerCmd; @@ -20,7 +23,7 @@ public class StopContainerCmdImpl extends AbstrDockerCmd private String containerId; - private int timeout = 10; + private Integer timeout = 10; public StopContainerCmdImpl(StopContainerCmd.Exec exec, String containerId) { super(exec); @@ -33,7 +36,7 @@ public String getContainerId() { } @Override - public int getTimeout() { + public Integer getTimeout() { return timeout; } @@ -45,17 +48,13 @@ public StopContainerCmd withContainerId(String containerId) { } @Override - public StopContainerCmd withTimeout(int timeout) { + public StopContainerCmd withTimeout(Integer timeout) { + checkNotNull(timeout, "timeout was not specified"); checkArgument(timeout >= 0, "timeout must be greater or equal 0"); this.timeout = timeout; return this; } - @Override - public String toString() { - return new StringBuilder("stop ").append("--time=" + timeout + " ").append(containerId).toString(); - } - /** * @throws NotFoundException * No such container diff --git a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java index e31151147..afa3c3e52 100644 --- a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java @@ -2,6 +2,9 @@ import static com.google.common.base.Preconditions.checkNotNull; +import org.apache.commons.lang.builder.ReflectionToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; + import com.github.dockerjava.api.command.TagImageCmd; /** @@ -13,13 +16,13 @@ * The repository to tag in * @param force * (not documented) - * + * */ public class TagImageCmdImpl extends AbstrDockerCmd implements TagImageCmd { private String imageId, repository, tag; - private boolean force; + private Boolean force; public TagImageCmdImpl(TagImageCmd.Exec exec, String imageId, String repository, String tag) { super(exec); @@ -44,7 +47,7 @@ public String getTag() { } @Override - public boolean hasForceEnabled() { + public Boolean hasForceEnabled() { return force; } @@ -75,15 +78,9 @@ public TagImageCmd withForce() { } @Override - public TagImageCmd withForce(boolean force) { + public TagImageCmd withForce(Boolean force) { this.force = force; return this; } - @Override - public String toString() { - return new StringBuilder("tag ").append(force ? "--force=true " : "") - .append(repository != null ? repository + "/" : "").append(imageId) - .append(tag != null ? ":" + tag : "").toString(); - } } diff --git a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index b4414f29e..44fc97be2 100644 --- a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -2,6 +2,9 @@ import static com.google.common.base.Preconditions.checkNotNull; +import org.apache.commons.lang.builder.ReflectionToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.TopContainerCmd; import com.github.dockerjava.api.command.TopContainerResponse; @@ -45,11 +48,6 @@ public TopContainerCmd withPsArgs(String psArgs) { return this; } - @Override - public String toString() { - return new StringBuilder("top ").append(containerId).append(psArgs != null ? " " + psArgs : "").toString(); - } - /** * @throws NotFoundException * No such container diff --git a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java index 583d519c8..949a7bb6f 100644 --- a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java @@ -33,11 +33,6 @@ public UnpauseContainerCmd withContainerId(String containerId) { return this; } - @Override - public String toString() { - return new StringBuilder("pause ").append(containerId).toString(); - } - /** * @throws NotFoundException * No such container diff --git a/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java index 67f46ce3a..3f27eacf1 100644 --- a/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/VersionCmdImpl.java @@ -8,11 +8,6 @@ */ public class VersionCmdImpl extends AbstrDockerCmd implements VersionCmd { - @Override - public String toString() { - return "version"; - } - public VersionCmdImpl(VersionCmd.Exec exec) { super(exec); } diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index 702eebd33..bdafdc688 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -6,7 +6,7 @@ /** * Wait a container - * + * * Block until container stops, then returns its exit code */ public class WaitContainerCmdImpl extends AbstrDockerCmd implements WaitContainerCmd { @@ -30,8 +30,4 @@ public WaitContainerCmd withContainerId(String containerId) { return this; } - @Override - public String toString() { - return "wait " + containerId; - } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 4c0d36eaa..c203941d6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -42,4 +42,16 @@ protected String registryConfigs(AuthConfigurations authConfigs) { } } + protected boolean bool(Boolean bool) { + return bool != null && bool; + } + + protected WebTarget booleanQueryParam(WebTarget webTarget, String name, Boolean value) { + if(bool(value)) { + webTarget = webTarget.queryParam(name, bool(value) + ""); + } + + return webTarget; + } + } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index 67da89284..e006e0434 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -26,12 +26,13 @@ protected AbstractCallbackNotifier callbackNotifier(AttachContainerCmd co ResultCallback resultCallback) { WebTarget webTarget = getBaseResource().path("/containers/{id}/attach") - .resolveTemplate("id", command.getContainerId()) - .queryParam("logs", command.hasLogsEnabled() ? "1" : "0") - // .queryParam("stdin", command.hasStdinEnabled() ? "1" : "0") - .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") - .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") - .queryParam("stream", command.hasFollowStreamEnabled() ? "1" : "0"); + .resolveTemplate("id", command.getContainerId()); + + webTarget = booleanQueryParam(webTarget, "logs", command.hasLogsEnabled()); + webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); + //webTarget = booleanQueryParam(webTarget, "stdin", command.hasStdinEnabled()); + webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); + webTarget = booleanQueryParam(webTarget, "stream", command.hasFollowStreamEnabled()); LOGGER.trace("POST: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 8da1884b8..a7e842aa5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -51,21 +51,18 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag if (command.getRemote() != null) { webTarget = webTarget.queryParam("remote", command.getRemote().toString()); } - if (command.isQuiet()) { - webTarget = webTarget.queryParam("q", "true"); - } - if (command.hasNoCacheEnabled()) { - webTarget = webTarget.queryParam("nocache", "true"); - } - if (command.hasPullEnabled()) { - webTarget = webTarget.queryParam("pull", "true"); - } - if (!command.hasRemoveEnabled()) { + + webTarget = booleanQueryParam(webTarget, "q", command.isQuiet()); + webTarget = booleanQueryParam(webTarget, "nocache", command.hasNoCacheEnabled()); + webTarget = booleanQueryParam(webTarget, "pull", command.hasPullEnabled()); + webTarget = booleanQueryParam(webTarget, "rm", command.hasRemoveEnabled()); + webTarget = booleanQueryParam(webTarget, "forcerm", command.isForcerm()); + + // this has to be handled differently as it should switch to 'false' + if (command.hasRemoveEnabled() == null || !command.hasRemoveEnabled()) { webTarget = webTarget.queryParam("rm", "false"); } - if (command.isForcerm()) { - webTarget = webTarget.queryParam("forcerm", "true"); - } + if (command.getMemory() != null) { webTarget = webTarget.queryParam("memory", command.getMemory()); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java index fec4da6ac..5116e7a83 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java @@ -21,13 +21,14 @@ public CommitCmdExec(WebTarget baseResource) { @Override protected String execute(CommitCmd command) { - WebTarget webResource = getBaseResource().path("/commit").queryParam("container", command.getContainerId()) + WebTarget webTarget = getBaseResource().path("/commit").queryParam("container", command.getContainerId()) .queryParam("repo", command.getRepository()).queryParam("tag", command.getTag()) - .queryParam("m", command.getMessage()).queryParam("author", command.getAuthor()) - .queryParam("pause", command.hasPauseEnabled() ? "1" : "0"); + .queryParam("m", command.getMessage()).queryParam("author", command.getAuthor()); - LOGGER.trace("POST: {}", webResource); - ObjectNode objectNode = webResource.request().accept("application/vnd.docker.raw-stream") + webTarget = booleanQueryParam(webTarget, "pause", command.hasPauseEnabled()); + + LOGGER.trace("POST: {}", webTarget); + ObjectNode objectNode = webTarget.request().accept("application/vnd.docker.raw-stream") .post(entity(command, MediaType.APPLICATION_JSON), ObjectNode.class); return objectNode.get("Id").asText(); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java index e1e74eec9..22dc4a7d0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java @@ -25,22 +25,23 @@ public ListContainersCmdExec(WebTarget baseResource) { @Override protected List execute(ListContainersCmd command) { - WebTarget webResource = getBaseResource().path("/containers/json") - .queryParam("all", command.hasShowAllEnabled() ? "1" : "0").queryParam("since", command.getSinceId()) - .queryParam("before", command.getBeforeId()) - .queryParam("size", command.hasShowSizeEnabled() ? "1" : "0"); + WebTarget webTarget = getBaseResource().path("/containers/json").queryParam("since", command.getSinceId()) + .queryParam("before", command.getBeforeId()); - if (command.getLimit() >= 0) { - webResource = webResource.queryParam("limit", String.valueOf(command.getLimit())); + webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); + webTarget = booleanQueryParam(webTarget, "size", command.hasShowSizeEnabled()); + + if (command.getLimit() != null && command.getLimit() >= 0) { + webTarget = webTarget.queryParam("limit", String.valueOf(command.getLimit())); } if (command.getFilters() != null) { - webResource = webResource.queryParam("filters", - urlPathSegmentEscaper().escape(command.getFilters().toString())); + webTarget = webTarget + .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); } - LOGGER.trace("GET: {}", webResource); - List containers = webResource.request().accept(MediaType.APPLICATION_JSON) + LOGGER.trace("GET: {}", webTarget); + List containers = webTarget.request().accept(MediaType.APPLICATION_JSON) .get(new GenericType>() { }); LOGGER.trace("Response: {}", containers); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index fa8409cb8..c7f3f85c2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -24,15 +24,16 @@ public ListImagesCmdExec(WebTarget baseResource) { @Override protected List execute(ListImagesCmd command) { - WebTarget webResource = getBaseResource().path("/images/json").queryParam("all", - command.hasShowAllEnabled() ? "1" : "0"); + WebTarget webTarget = getBaseResource().path("/images/json"); + + webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); if (command.getFilters() != null) - webResource = webResource.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); - LOGGER.trace("GET: {}", webResource); + LOGGER.trace("GET: {}", webTarget); - List images = webResource.request().accept(MediaType.APPLICATION_JSON) + List images = webTarget.request().accept(MediaType.APPLICATION_JSON) .get(new GenericType>() { }); LOGGER.trace("Response: {}", images); diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index 0ab3da7a5..9cbeb08cc 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -26,12 +26,16 @@ protected AbstractCallbackNotifier callbackNotifier(LogContainerCmd comma ResultCallback resultCallback) { WebTarget webTarget = getBaseResource().path("/containers/{id}/logs") - .resolveTemplate("id", command.getContainerId()) - .queryParam("timestamps", command.hasTimestampsEnabled() ? "1" : "0") - .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") - .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") - .queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0") - .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); + .resolveTemplate("id", command.getContainerId()); + + if(command.getTail() != null) { + webTarget = webTarget.queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); + } + + webTarget = booleanQueryParam(webTarget, "timestamps", command.hasTimestampsEnabled()); + webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); + webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); + webTarget = booleanQueryParam(webTarget, "follow", command.hasFollowStreamEnabled()); LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java index 2e72c37bc..b66cf5ea9 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java @@ -19,12 +19,13 @@ public RemoveContainerCmdExec(WebTarget baseResource) { @Override protected Void execute(RemoveContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/" + command.getContainerId()) - .queryParam("v", command.hasRemoveVolumesEnabled() ? "1" : "0") - .queryParam("force", command.hasForceEnabled() ? "1" : "0"); + WebTarget webTarget = getBaseResource().path("/containers/" + command.getContainerId()); - LOGGER.trace("DELETE: {}", webResource); - webResource.request().accept(MediaType.APPLICATION_JSON).delete().close(); + webTarget = booleanQueryParam(webTarget, "v", command.hasRemoveVolumesEnabled()); + webTarget = booleanQueryParam(webTarget, "force", command.hasForceEnabled()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete().close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java index 18d477c51..21d2eb263 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java @@ -17,12 +17,13 @@ public RemoveImageCmdExec(WebTarget baseResource) { @Override protected Void execute(RemoveImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getImageId()) - .queryParam("force", command.hasForceEnabled() ? "1" : "0") - .queryParam("noprune", command.hasNoPruneEnabled() ? "1" : "0"); + WebTarget webTarget = getBaseResource().path("/images/" + command.getImageId()); - LOGGER.trace("DELETE: {}", webResource); - webResource.request().delete().close(); + webTarget = booleanQueryParam(webTarget, "force", command.hasForceEnabled()); + webTarget = booleanQueryParam(webTarget, "noprune", command.hasNoPruneEnabled()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().delete().close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java index 0a4fced89..4f5498180 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java @@ -20,7 +20,11 @@ public RestartContainerCmdExec(WebTarget baseResource) { @Override protected Void execute(RestartContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/restart") - .resolveTemplate("id", command.getContainerId()).queryParam("t", String.valueOf(command.getTimeout())); + .resolveTemplate("id", command.getContainerId()); + + if(command.getTimeout() != null) { + webResource = webResource.queryParam("t", String.valueOf(command.getTimeout())); + } LOGGER.trace("POST: {}", webResource); webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java index ca6ad3537..3ba2403aa 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java @@ -20,7 +20,11 @@ public StopContainerCmdExec(WebTarget baseResource) { @Override protected Void execute(StopContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/stop") - .resolveTemplate("id", command.getContainerId()).queryParam("t", String.valueOf(command.getTimeout())); + .resolveTemplate("id", command.getContainerId()); + + if(command.getTimeout() != null) { + webResource = webResource.queryParam("t", String.valueOf(command.getTimeout())); + } LOGGER.trace("POST: {}", webResource); webResource.request().accept(MediaType.APPLICATION_JSON).post(null).close(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java index f697b22b2..a114d2239 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java @@ -17,12 +17,13 @@ public TagImageCmdExec(WebTarget baseResource) { @Override protected Void execute(TagImageCmd command) { - WebTarget webResource = getBaseResource().path("/images/" + command.getImageId() + "/tag") - .queryParam("repo", command.getRepository()).queryParam("tag", command.getTag()) - .queryParam("force", command.hasForceEnabled() ? "1" : "0"); + WebTarget webTarget = getBaseResource().path("/images/" + command.getImageId() + "/tag") + .queryParam("repo", command.getRepository()).queryParam("tag", command.getTag()); - LOGGER.trace("POST: {}", webResource); - webResource.request().post(null).close(); + webTarget = booleanQueryParam(webTarget, "force", command.hasForceEnabled()); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(null).close(); return null; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java index 0ba33ec82..69fdf8c92 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java @@ -111,7 +111,7 @@ public int compare(final Map.Entry> o1, final Map.Entry 60000) { throw new IllegalArgumentException("Invalid start port: " + port); } diff --git a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java index cf5b03188..990548442 100644 --- a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java +++ b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java @@ -26,7 +26,7 @@ public void testMatch(MatchTestCase testCase) throws IOException { s = FilenameUtils.normalize(s); } try { - boolean matched = GoLangFileMatch.match(pattern, s); + Boolean matched = GoLangFileMatch.match(pattern, s); if (testCase.expectException) { Assert.fail("Expected GoFileMatchException"); } @@ -101,11 +101,11 @@ private final class MatchTestCase { private final String s; - private final boolean matches; + private final Boolean matches; - private final boolean expectException; + private final Boolean expectException; - public MatchTestCase(String pattern, String s, boolean matches, boolean expectException) { + public MatchTestCase(String pattern, String s, Boolean matches, Boolean expectException) { super(); this.pattern = pattern; this.s = s; 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 b00034ad0..96bae1d8a 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java @@ -53,7 +53,7 @@ public void copyFromContainer() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/copyFromContainer").exec(); - boolean bytesAvailable = response.available() > 0; + Boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied from the container."); // read the stream fully. Otherwise, the underlying stream will not be closed. 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 1aeeb5479..27318f39a 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -512,7 +512,7 @@ public void createContainerWithLabels() throws DockerException { Map labels = new HashMap(); labels.put("com.github.dockerjava.null", null); - labels.put("com.github.dockerjava.boolean", "true"); + labels.put("com.github.dockerjava.Boolean", "true"); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") .withLabels(labels).exec(); 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 2d1be184a..ead529107 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -64,7 +64,7 @@ public void testEventStreamTimeBound() throws Exception { dockerClient.eventsCmd().withSince(startTime).withUntil(endTime).exec(eventCallback); - boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); eventCallback.close(); @@ -83,7 +83,7 @@ public void testEventStreaming1() throws Exception { generateEvents(); - boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); eventCallback.close(); assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); @@ -101,7 +101,7 @@ public void testEventStreaming2() throws Exception { generateEvents(); - boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); eventCallback.close(); assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); @@ -117,7 +117,7 @@ public void testEventStreamingWithFilter() throws Exception { generateEvents(); - boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); eventCallback.close(); assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); diff --git a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java index 94934296b..43aa49f0e 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -57,7 +57,7 @@ public void execStart() throws Exception { dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); - boolean bytesAvailable = response.available() > 0; + Boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied from the container."); // read the stream fully. Otherwise, the underlying stream will not be closed. @@ -82,7 +82,7 @@ public void execStartAttached() throws Exception { dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true).exec(); InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); - boolean bytesAvailable = response.available() > 0; + Boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied from the container."); // read the stream fully. Otherwise, the underlying stream will not be closed. diff --git a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java index 221d36f36..d508df235 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java @@ -72,11 +72,11 @@ public void listDanglingImages() throws DockerException { assertThat(images, notNullValue()); LOG.info("Images List: {}", images); assertThat(images.size(), is(greaterThan(0))); - boolean imageInFilteredList = isImageInFilteredList(images, imageId); + Boolean imageInFilteredList = isImageInFilteredList(images, imageId); assertTrue(imageInFilteredList); } - private boolean isImageInFilteredList(List images, String expectedImageId) { + private Boolean isImageInFilteredList(List images, String expectedImageId) { for (Image image : images) { if (expectedImageId.equals(image.getId())) { return true; diff --git a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java index 299c694d4..611225d4c 100644 --- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java @@ -66,7 +66,7 @@ public void testStatsStreaming() throws InterruptedException, IOException { .exec(new StatsCallbackTest(countDownLatch)); countDownLatch.await(3, TimeUnit.SECONDS); - boolean gotStats = statsCallback.gotStats(); + Boolean gotStats = statsCallback.gotStats(); LOG.info("Stop stats collection"); @@ -84,7 +84,7 @@ public void testStatsStreaming() throws InterruptedException, IOException { private class StatsCallbackTest extends ResultCallbackTemplate { private final CountDownLatch countDownLatch; - private boolean gotStats = false; + private Boolean gotStats = false; public StatsCallbackTest(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; @@ -99,7 +99,7 @@ public void onNext(Statistics stats) { countDownLatch.countDown(); } - public boolean gotStats() { + public Boolean gotStats() { return gotStats; } } From ae29bf7fe7db0907b95da7c7f9db7bead3b25836 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 18 Sep 2015 07:15:58 +0200 Subject: [PATCH 0002/1032] WIP --- .../dockerjava/api/command/BuildImageCmd.java | 2 +- .../dockerjava/api/model/AccessMode.java | 4 +-- .../dockerjava/api/model/AuthConfig.java | 2 +- .../dockerjava/api/model/ContainerConfig.java | 24 ++++++++-------- .../dockerjava/api/model/HostConfig.java | 28 ------------------- .../github/dockerjava/api/model/Volumes.java | 1 - .../dockerjava/core/CertificateUtils.java | 7 ++--- .../dockerjava/core/GoLangFileMatch.java | 26 ++++++++--------- .../core/LocalDirectorySSLConfig.java | 2 +- .../core/command/BuildImageCmdImpl.java | 2 +- .../core/command/LogContainerCmdImpl.java | 11 ++++---- .../dockerjava/jaxrs/LogContainerCmdExec.java | 2 +- .../dockerjava/api/model/AuthConfigTest.java | 6 ---- 13 files changed, 39 insertions(+), 78 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 903273872..e9778fa3c 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -51,7 +51,7 @@ public interface BuildImageCmd extends AsyncDockerCmd volumes; @JsonProperty("WorkingDir") - private String workingDir = ""; + private String workingDir; @JsonIgnore public ExposedPort[] getExposedPorts() { 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 36e9ee93d..1c64c2b27 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -93,34 +93,6 @@ public class HostConfig { @JsonProperty("VolumesFrom") private VolumesFrom[] volumesFrom; - public HostConfig() { - } - - // public HostConfig(Bind[] binds, Link[] links, LxcConf[] lxcConf, LogConfig logConfig, Ports portBindings, - // Boolean publishAllPorts, Boolean privileged, Boolean readonlyRootfs, String[] dns, String[] dnsSearch, - // VolumesFrom[] volumesFrom, String containerIDFile, Capability[] capAdd, Capability[] capDrop, - // RestartPolicy restartPolicy, String networkMode, Device[] devices, String[] extraHosts, Ulimit[] ulimits) { - // this.binds = new Binds(binds); - // this.links = new Links(links); - // this.lxcConf = lxcConf; - // this.logConfig = logConfig; - // this.portBindings = portBindings; - // this.publishAllPorts = publishAllPorts; - // this.privileged = privileged; - // this.readonlyRootfs = readonlyRootfs; - // this.dns = dns; - // this.dnsSearch = dnsSearch; - // this.volumesFrom = volumesFrom; - // this.containerIDFile = containerIDFile; - // this.capAdd = capAdd; - // this.capDrop = capDrop; - // this.restartPolicy = restartPolicy; - // this.networkMode = networkMode; - // this.devices = devices; - // this.extraHosts = extraHosts; - // this.ulimits = ulimits; - // } - @JsonIgnore public Bind[] getBinds() { return (binds == null) ? new Bind[0] : binds.getBinds(); 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 434a0edad..46175548d 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volumes.java +++ b/src/main/java/com/github/dockerjava/api/model/Volumes.java @@ -48,7 +48,6 @@ public void serialize(Volumes volumes, JsonGenerator jsonGen, SerializerProvider jsonGen.writeFieldName(volume.getPath()); jsonGen.writeStartObject(); jsonGen.writeEndObject(); - // jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false)); } jsonGen.writeEndObject(); } diff --git a/src/main/java/com/github/dockerjava/core/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/CertificateUtils.java index 56a818f72..cae59836f 100644 --- a/src/main/java/com/github/dockerjava/core/CertificateUtils.java +++ b/src/main/java/com/github/dockerjava/core/CertificateUtils.java @@ -27,14 +27,11 @@ public class CertificateUtils { - public static Boolean verifyCertificatesExist(String dockerCertPath) { + public static boolean verifyCertificatesExist(String dockerCertPath) { String[] files = { "ca.pem", "cert.pem", "key.pem" }; for (String file : files) { File path = new File(dockerCertPath, file); - Boolean exists = path.exists(); - if (!exists) { - return false; - } + return path.exists(); } return true; diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index c9067b431..3e2d57485 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -24,16 +24,16 @@ * character class (must be non-empty) * c matches character c (c != '*', '?', '\\', '[') * '\\' c matches character c - * + * * character-range: * c matches character c (c != '\\', '-', ']') * '\\' c matches character c * lo '-' hi matches character c for lo <= c <= hi - * + * * Match requires pattern to match all of name, not just a substring. * The only possible returned error is ErrBadPattern, when pattern * is malformed. - * + * * On Windows, escaping is disabled. Instead, '\\' is treated as * path separator. * @@ -43,13 +43,13 @@ */ public class GoLangFileMatch { - public static final Boolean IS_WINDOWS = File.separatorChar == '\\'; + public static final boolean IS_WINDOWS = File.separatorChar == '\\'; - public static Boolean match(List patterns, File file) { + public static boolean match(List patterns, File file) { return !match(patterns, file.getPath()).isEmpty(); } - public static Boolean match(String pattern, File file) { + public static boolean match(String pattern, File file) { return match(pattern, file.getPath()); } @@ -66,7 +66,7 @@ public static List match(List patterns, String name) { return matches; } - public static Boolean match(String pattern, String name) { + public static boolean match(String pattern, String name) { Pattern: while (!pattern.isEmpty()) { ScanResult scanResult = scanChunk(pattern); pattern = scanResult.pattern; @@ -103,12 +103,12 @@ public static Boolean match(String pattern, String name) { } static ScanResult scanChunk(String pattern) { - Boolean star = false; + boolean star = false; if (!pattern.isEmpty() && pattern.charAt(0) == '*') { pattern = pattern.substring(1); star = true; } - Boolean inRange = false; + boolean inRange = false; int i; Scan: for (i = 0; i < pattern.length(); i++) { switch (pattern.charAt(i)) { @@ -157,12 +157,12 @@ static String matchChunk(String chunk, String s) { throw new GoLangFileMatchException(); } // possibly negated - Boolean negated = chunk.charAt(chunkOffset) == '^'; + boolean negated = chunk.charAt(chunkOffset) == '^'; if (negated) { chunkOffset++; } // parse all ranges - Boolean match = false; + boolean match = false; int nrange = 0; while (true) { if (chunkOffset < chunkLength && chunk.charAt(chunkOffset) == ']' && nrange > 0) { @@ -238,13 +238,13 @@ static GetEscResult getEsc(String chunk, int chunkOffset, int chunkLength) { } private static final class ScanResult { - public Boolean star; + public boolean star; public String chunk; public String pattern; - public ScanResult(Boolean star, String chunk, String pattern) { + public ScanResult(boolean star, String chunk, String pattern) { this.star = star; this.chunk = chunk; this.pattern = pattern; diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index 1c85ee3f4..c667d49e6 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -33,7 +33,7 @@ public String getDockerCertPath() { @Override public SSLContext getSSLContext() { - Boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); + boolean certificatesExist = CertificateUtils.verifyCertificatesExist(dockerCertPath); if (certificatesExist) { 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 6971982b3..60d11b9d1 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -108,7 +108,7 @@ public Boolean hasRemoveEnabled() { } @Override - public Boolean isForcerm() { + public boolean isForcerm() { return forcerm != null && forcerm; } diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index 965b69b35..2876b9536 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -2,6 +2,9 @@ import static com.google.common.base.Preconditions.checkNotNull; +import org.apache.commons.lang.builder.ReflectionToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; + import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.model.Frame; @@ -26,11 +29,9 @@ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd 0 ? "--since=" + since : "") - .append(containerId).toString(); + return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index bc31cd491..af330c4d6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -29,7 +29,7 @@ protected AbstractCallbackNotifier callbackNotifier(LogContainerCmd comma .resolveTemplate("id", command.getContainerId()); if(command.getTail() != null) { - webTarget = webTarget.queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); + webTarget = webTarget.queryParam("tail", command.getTail()); } if(command.getSince() != null) { diff --git a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java index 8aa132935..f718b1bdb 100644 --- a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java +++ b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java @@ -18,12 +18,6 @@ public void setUp() throws Exception { authConfig.setUsername("qux"); } - @Test - public void string() throws Exception { - assertEquals(authConfig.toString(), - "AuthConfig{username='qux', password='bar', email='foo', serverAddress='baz'}"); - } - @Test public void defaultServerAddress() throws Exception { assertEquals(new AuthConfig().getServerAddress(), "https://index.docker.io/v1/"); From 561f9d06f1f840861857f735cb567da8aad29bd7 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 24 Sep 2015 22:03:05 +0200 Subject: [PATCH 0003/1032] Added null check annotations and removed withX() methods --- .../api/command/AttachContainerCmd.java | 22 ++- .../dockerjava/api/command/AuthCmd.java | 6 +- .../dockerjava/api/command/BuildImageCmd.java | 24 ++- .../dockerjava/api/command/CommitCmd.java | 94 ++++++----- .../api/command/ContainerDiffCmd.java | 6 +- .../api/command/CopyFileFromContainerCmd.java | 17 +- .../api/command/CreateContainerCmd.java | 157 +++++++++++------- .../api/command/CreateImageCmd.java | 9 +- .../dockerjava/api/command/EventsCmd.java | 15 +- .../dockerjava/api/command/ExecCreateCmd.java | 33 ++-- .../dockerjava/api/command/ExecStartCmd.java | 17 +- .../api/command/InspectContainerCmd.java | 7 +- .../api/command/InspectExecCmd.java | 7 +- .../api/command/InspectImageCmd.java | 6 +- .../api/command/KillContainerCmd.java | 7 +- .../api/command/ListContainersCmd.java | 28 ++-- .../dockerjava/api/command/ListImagesCmd.java | 4 + .../api/command/LogContainerCmd.java | 23 ++- .../api/command/PauseContainerCmd.java | 6 +- .../dockerjava/api/command/PullImageCmd.java | 8 +- .../dockerjava/api/command/PushImageCmd.java | 12 +- .../api/command/RemoveContainerCmd.java | 10 +- .../api/command/RemoveImageCmd.java | 18 +- .../api/command/RestartContainerCmd.java | 7 +- .../dockerjava/api/command/SaveImageCmd.java | 7 +- .../api/command/SearchImagesCmd.java | 6 +- .../api/command/StartContainerCmd.java | 12 +- .../dockerjava/api/command/StatsCmd.java | 7 +- .../api/command/StopContainerCmd.java | 7 +- .../dockerjava/api/command/TagImageCmd.java | 9 +- .../api/command/TopContainerCmd.java | 7 +- .../api/command/UnpauseContainerCmd.java | 6 +- .../api/command/WaitContainerCmd.java | 6 +- .../core/command/AttachContainerCmdImpl.java | 20 --- .../core/command/BuildImageCmdImpl.java | 45 +---- .../core/command/CommitCmdImpl.java | 25 --- .../core/command/ExecCreateCmdImpl.java | 20 --- .../core/command/ExecStartCmdImpl.java | 10 -- .../core/command/LogContainerCmdImpl.java | 20 --- .../core/command/RemoveContainerCmdImpl.java | 5 - .../core/command/RemoveImageCmdImpl.java | 10 -- .../client/AbstractDockerClientTest.java | 8 +- .../command/AttachContainerCmdImplTest.java | 4 +- .../core/command/BuildImageCmdImplTest.java | 16 +- .../core/command/DockerfileFixture.java | 6 +- .../core/command/FrameReaderITest.java | 2 +- .../core/command/InspectExecCmdImplTest.java | 4 +- .../core/command/ListImagesCmdImplTest.java | 2 +- .../core/command/LogContainerCmdImplTest.java | 12 +- .../core/command/PullImageCmdImplTest.java | 2 +- 50 files changed, 418 insertions(+), 403 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java index 0924fb008..13979fb8b 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -2,6 +2,9 @@ import java.io.InputStream; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Frame; @@ -22,24 +25,25 @@ */ public interface AttachContainerCmd extends AsyncDockerCmd { + @CheckForNull public String getContainerId(); + @CheckForNull public Boolean hasLogsEnabled(); + @CheckForNull public Boolean hasFollowStreamEnabled(); + @CheckForNull public Boolean hasTimestampsEnabled(); + @CheckForNull public Boolean hasStdoutEnabled(); + @CheckForNull public Boolean hasStderrEnabled(); - public AttachContainerCmd withContainerId(String containerId); - - /** - * See {@link #withFollowStream(Boolean)} - */ - public AttachContainerCmd withFollowStream(); + public AttachContainerCmd withContainerId(@Nonnull String containerId); /** * Following the stream means the resulting {@link InputStream} returned by {@link #exec()} reads infinitely. So a @@ -50,18 +54,12 @@ public interface AttachContainerCmd extends AsyncDockerCmd { } diff --git a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java index 26e05c1e6..da7d47a7a 100644 --- a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.UnauthorizedException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthResponse; @@ -11,9 +14,10 @@ */ public interface AuthCmd extends SyncDockerCmd { + @CheckForNull public AuthConfig getAuthConfig(); - public AuthCmd withAuthConfig(AuthConfig authConfig); + public AuthCmd withAuthConfig(@Nonnull AuthConfig authConfig); /** * @return The status. Based on it's value you may mean you need to authorise your account, e.g.: 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 e9778fa3c..99a065629 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,8 @@ import com.github.dockerjava.api.model.BuildResponseItem; import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import java.io.File; import java.io.InputStream; import java.net.URI; @@ -20,8 +22,10 @@ public interface BuildImageCmd extends AsyncDockerCmd { } diff --git a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java index a932a3f70..77e19363c 100644 --- a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.Volumes; @@ -11,96 +14,104 @@ */ public interface CommitCmd extends SyncDockerCmd { + @CheckForNull + public String getAuthor(); + + @CheckForNull public String getContainerId(); - public CommitCmd withContainerId(String containerId); + @CheckForNull + public String[] getEnv(); - public String getRepository(); + @CheckForNull + public ExposedPorts getExposedPorts(); - public String getTag(); + @CheckForNull + public String getHostname(); + @CheckForNull + public Integer getMemory(); + + @CheckForNull + public Integer getMemorySwap(); + + @CheckForNull public String getMessage(); - public String getAuthor(); + @CheckForNull + public String[] getPortSpecs(); - public Boolean hasPauseEnabled(); + @CheckForNull + public String getRepository(); - public CommitCmd withAttachStderr(Boolean attachStderr); + @CheckForNull + public String getTag(); - public CommitCmd withAttachStderr(); + @CheckForNull + public String getUser(); - public CommitCmd withAttachStdin(Boolean attachStdin); + @CheckForNull + public Volumes getVolumes(); - public CommitCmd withAttachStdin(); + @CheckForNull + public String getWorkingDir(); - public CommitCmd withAttachStdout(Boolean attachStdout); + @CheckForNull + public Boolean hasPauseEnabled(); - public CommitCmd withAttachStdout(); + @CheckForNull + public Boolean isOpenStdin(); - public CommitCmd withCmd(String... cmd); + @CheckForNull + public Boolean isStdinOnce(); - public CommitCmd withDisableNetwork(Boolean disableNetwork); + @CheckForNull + public Boolean isTty(); - public CommitCmd withAuthor(String author); + public CommitCmd withAttachStderr(Boolean attachStderr); - public CommitCmd withMessage(String message); + public CommitCmd withAttachStdin(Boolean attachStdin); - public CommitCmd withTag(String tag); + public CommitCmd withAttachStdout(Boolean attachStdout); - public CommitCmd withRepository(String repository); + public CommitCmd withAuthor(String author); - public CommitCmd withPause(Boolean pause); + public CommitCmd withCmd(String... cmd); - public String[] getEnv(); + public CommitCmd withContainerId(@Nonnull String containerId); - public CommitCmd withEnv(String... env); + public CommitCmd withDisableNetwork(Boolean disableNetwork); - public ExposedPorts getExposedPorts(); + public CommitCmd withEnv(String... env); public CommitCmd withExposedPorts(ExposedPorts exposedPorts); - public String getHostname(); - public CommitCmd withHostname(String hostname); - public Integer getMemory(); - public CommitCmd withMemory(Integer memory); - public Integer getMemorySwap(); - public CommitCmd withMemorySwap(Integer memorySwap); - public Boolean isOpenStdin(); + public CommitCmd withMessage(String message); public CommitCmd withOpenStdin(Boolean openStdin); - public String[] getPortSpecs(); + public CommitCmd withPause(Boolean pause); public CommitCmd withPortSpecs(String... portSpecs); - public Boolean isStdinOnce(); + public CommitCmd withRepository(String repository); public CommitCmd withStdinOnce(Boolean stdinOnce); - public CommitCmd withStdinOnce(); - - public Boolean isTty(); + public CommitCmd withTag(String tag); public CommitCmd withTty(Boolean tty); - public CommitCmd withTty(); - - public String getUser(); - public CommitCmd withUser(String user); - public Volumes getVolumes(); - public CommitCmd withVolumes(Volumes volumes); - public String getWorkingDir(); - public CommitCmd withWorkingDir(String workingDir); /** @@ -112,5 +123,4 @@ public interface CommitCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } - } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java index 968fb5c7c..42ae5e9dd 100644 --- a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java @@ -2,6 +2,9 @@ import java.util.List; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.InternalServerErrorException; import com.github.dockerjava.api.NotFoundException; @@ -9,9 +12,10 @@ public interface ContainerDiffCmd extends SyncDockerCmd> { + @CheckForNull public String getContainerId(); - public ContainerDiffCmd withContainerId(String containerId); + public ContainerDiffCmd withContainerId(@Nonnull String containerId); @Override public String toString(); diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java index 1bc3ca909..e51b8ac46 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -2,22 +2,28 @@ import java.io.InputStream; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; public interface CopyFileFromContainerCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); - public String getResource(); - - public CopyFileFromContainerCmd withContainerId(String containerId); + @CheckForNull + public String getHostPath(); - public CopyFileFromContainerCmd withResource(String resource); + @CheckForNull + public String getResource(); - public String getHostPath(); + public CopyFileFromContainerCmd withContainerId(@Nonnull String containerId); public CopyFileFromContainerCmd withHostPath(String hostPath); + public CopyFileFromContainerCmd withResource(@Nonnull String resource); + /** * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. * @@ -29,5 +35,4 @@ public interface CopyFileFromContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } - } \ No newline at end of file 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 c0a695426..2301cd841 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -2,6 +2,8 @@ import java.util.Map; +import javax.annotation.CheckForNull; + import com.github.dockerjava.api.ConflictException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.Bind; @@ -20,120 +22,157 @@ public interface CreateContainerCmd extends SyncDockerCmd { - public static interface Exec extends DockerCmdSyncExec { - } + @CheckForNull + public Bind[] getBinds(); /** - * @throws NotFoundException - * No such container - * @throws ConflictException - * Named container already exists + * @since 1.19 */ - @Override - public CreateContainerResponse exec() throws NotFoundException, ConflictException; - - public Bind[] getBinds(); + @CheckForNull + public Integer getBlkioWeight(); + @CheckForNull public Capability[] getCapAdd(); + @CheckForNull public Capability[] getCapDrop(); + @CheckForNull public String[] getCmd(); - public String getCpusetCpus(); - - public Integer getCpuShares(); - /** * @since 1.19 */ + @CheckForNull public Integer getCpuPeriod(); - /** - * @since 1.19 - */ - public String getCpusetMems(); + @CheckForNull + public String getCpusetCpus(); /** * @since 1.19 */ - public Integer getBlkioWeight(); + @CheckForNull + public String getCpusetMems(); - /** - * @since 1.19 - */ - public Boolean isOomKillDisable(); + @CheckForNull + public Integer getCpuShares(); + @CheckForNull public Device[] getDevices(); + @CheckForNull public String[] getDns(); + @CheckForNull public String[] getDnsSearch(); + @CheckForNull + public String getDomainName(); + + @CheckForNull public String[] getEntrypoint(); + @CheckForNull public String[] getEnv(); + @CheckForNull public ExposedPort[] getExposedPorts(); + @CheckForNull public String[] getExtraHosts(); + @CheckForNull public String getHostName(); - public String getDomainName(); - + @CheckForNull public String getImage(); - public Link[] getLinks(); + @CheckForNull + Map getLabels(); - public LxcConf[] getLxcConf(); + @CheckForNull + public Link[] getLinks(); + @CheckForNull public LogConfig getLogConfig(); + @CheckForNull + public LxcConf[] getLxcConf(); + + @CheckForNull public String getMacAddress(); + @CheckForNull public Long getMemory(); + @CheckForNull public Long getMemorySwap(); + @CheckForNull public String getName(); + @CheckForNull public String getNetworkMode(); + @CheckForNull public Ports getPortBindings(); + @CheckForNull public String[] getPortSpecs(); + @CheckForNull public RestartPolicy getRestartPolicy(); + @CheckForNull + public Ulimit[] getUlimits(); + + @CheckForNull public String getUser(); + @CheckForNull public Volume[] getVolumes(); + @CheckForNull public VolumesFrom[] getVolumesFrom(); + @CheckForNull public String getWorkingDir(); - public Ulimit[] getUlimits(); - + @CheckForNull public Boolean isAttachStderr(); + @CheckForNull public Boolean isAttachStdin(); + @CheckForNull public Boolean isAttachStdout(); + @CheckForNull public Boolean isNetworkDisabled(); + /** + * @since 1.19 + */ + @CheckForNull + public Boolean isOomKillDisable(); + + @CheckForNull public Boolean isPrivileged(); + @CheckForNull public Boolean isPublishAllPorts(); + @CheckForNull public Boolean isReadonlyRootfs(); + @CheckForNull public Boolean isStdInOnce(); + @CheckForNull public Boolean isStdinOpen(); + @CheckForNull public Boolean isTty(); public CreateContainerCmd withAttachStderr(Boolean attachStderr); @@ -144,6 +183,11 @@ public static interface Exec extends DockerCmdSyncExeckernel capability to the * container. For example: adding {@link Capability#MKNOD} allows the container to create special files using the @@ -160,37 +204,27 @@ public static interface Exec extends DockerCmdSyncExec labels); @@ -225,9 +259,11 @@ public static interface Exec extends DockerCmdSyncExec @@ -247,6 +285,11 @@ public static interface Exec extends DockerCmdSyncExec--publish (-p) option of * the docker run CLI command. @@ -266,6 +309,8 @@ public static interface Exec extends DockerCmdSyncExec getLabels(); + @Override + public CreateContainerResponse exec() throws NotFoundException, ConflictException; + public static interface Exec extends DockerCmdSyncExec { + } } diff --git a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java index 93b00efac..66df49c98 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java @@ -2,20 +2,25 @@ import java.io.InputStream; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + public interface CreateImageCmd extends SyncDockerCmd { + @CheckForNull public String getRepository(); - // TODO remove method + @CheckForNull public String getTag(); + @CheckForNull public InputStream getImageStream(); /** * @param repository * the repository to import to */ - public CreateImageCmd withRepository(String repository); + public CreateImageCmd withRepository(@Nonnull String repository); /** * @param imageStream diff --git a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java index e1e57c534..4020a8e72 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -1,5 +1,7 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; + import com.github.dockerjava.api.model.Event; import com.github.dockerjava.api.model.Filters; @@ -12,19 +14,22 @@ * - Stream events until this timestamp */ public interface EventsCmd extends AsyncDockerCmd { - public EventsCmd withSince(String since); - public EventsCmd withUntil(String until); + @CheckForNull + public Filters getFilters(); + @CheckForNull public String getSince(); + @CheckForNull public String getUntil(); - public Filters getFilters(); - public EventsCmd withFilters(Filters filters); - public static interface Exec extends DockerCmdAsyncExec { + public EventsCmd withSince(String since); + public EventsCmd withUntil(String until); + + public static interface Exec extends DockerCmdAsyncExec { } } 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 6ff1b738e..67ffe5818 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -1,37 +1,38 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + public interface ExecCreateCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); - public ExecCreateCmd withContainerId(String containerId); - - public ExecCreateCmd withCmd(String... cmd); - - public ExecCreateCmd withAttachStdin(Boolean attachStdin); - - public ExecCreateCmd withAttachStdin(); + @CheckForNull + public Boolean hasAttachStderrEnabled(); + @CheckForNull public Boolean hasAttachStdinEnabled(); - public ExecCreateCmd withAttachStdout(Boolean attachStdout); - - public ExecCreateCmd withAttachStdout(); - + @CheckForNull public Boolean hasAttachStdoutEnabled(); + @CheckForNull + public Boolean hasTtyEnabled(); + public ExecCreateCmd withAttachStderr(Boolean attachStderr); - public ExecCreateCmd withAttachStderr(); + public ExecCreateCmd withAttachStdin(Boolean attachStdin); - public Boolean hasAttachStderrEnabled(); + public ExecCreateCmd withAttachStdout(Boolean attachStdout); - public ExecCreateCmd withTty(Boolean tty); + public ExecCreateCmd withCmd(String... cmd); - public ExecCreateCmd withTty(); + public ExecCreateCmd withContainerId(@Nonnull String containerId); - public Boolean hasTtyEnabled(); + public ExecCreateCmd withTty(Boolean tty); public static interface Exec extends DockerCmdSyncExec { } + } diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java index 0d4ffa44a..c9e0d3f00 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -2,26 +2,28 @@ import java.io.InputStream; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; public interface ExecStartCmd extends SyncDockerCmd { + @CheckForNull public String getExecId(); - public ExecStartCmd withExecId(String execId); - + @CheckForNull public Boolean hasDetachEnabled(); - public ExecStartCmd withDetach(Boolean detach); + @CheckForNull + public Boolean hasTtyEnabled(); - public ExecStartCmd withDetach(); + public ExecStartCmd withDetach(Boolean detach); - public Boolean hasTtyEnabled(); + public ExecStartCmd withExecId(@Nonnull String execId); public ExecStartCmd withTty(Boolean tty); - public ExecStartCmd withTty(); - /** * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. * @@ -33,4 +35,5 @@ public interface ExecStartCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } + } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java index d9988085f..875ed7c32 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java @@ -1,12 +1,16 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; public interface InspectContainerCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); - public InspectContainerCmd withContainerId(String containerId); + public InspectContainerCmd withContainerId(@Nonnull String containerId); /** * @throws NotFoundException @@ -17,5 +21,4 @@ public interface InspectContainerCmd extends SyncDockerCmd { } - } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java index 36ce45fc5..4abc73e79 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java @@ -1,11 +1,16 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; public interface InspectExecCmd extends SyncDockerCmd { + + @CheckForNull public String getExecId(); - public InspectExecCmd withExecId(String execId); + public InspectExecCmd withExecId(@Nonnull String execId); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java index 6eaea9075..54ae3c228 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; /** @@ -7,9 +10,10 @@ */ public interface InspectImageCmd extends SyncDockerCmd { + @CheckForNull public String getImageId(); - public InspectImageCmd withImageId(String imageId); + public InspectImageCmd withImageId(@Nonnull String imageId); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java index 513bf09c5..c751506a5 100644 --- a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; /** @@ -7,11 +10,13 @@ */ public interface KillContainerCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); + @CheckForNull public String getSignal(); - public KillContainerCmd withContainerId(String containerId); + public KillContainerCmd withContainerId(@Nonnull String containerId); public KillContainerCmd withSignal(String signal); diff --git a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java index 2994fd9d6..cec5f66c2 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -2,6 +2,8 @@ import java.util.List; +import javax.annotation.CheckForNull; + import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.Filters; @@ -22,29 +24,35 @@ */ public interface ListContainersCmd extends SyncDockerCmd> { - public Integer getLimit(); + @CheckForNull + public String getBeforeId(); - public Boolean hasShowSizeEnabled(); + @CheckForNull + public Filters getFilters(); - public Boolean hasShowAllEnabled(); + @CheckForNull + public Integer getLimit(); + @CheckForNull public String getSinceId(); - public String getBeforeId(); + @CheckForNull + public Boolean hasShowAllEnabled(); - public Filters getFilters(); + @CheckForNull + public Boolean hasShowSizeEnabled(); - public ListContainersCmd withShowAll(Boolean showAll); + public ListContainersCmd withBefore(String before); - public ListContainersCmd withShowSize(Boolean showSize); + public ListContainersCmd withFilters(Filters filters); public ListContainersCmd withLimit(Integer limit); - public ListContainersCmd withSince(String since); + public ListContainersCmd withShowAll(Boolean showAll); - public ListContainersCmd withBefore(String before); + public ListContainersCmd withShowSize(Boolean showSize); - public ListContainersCmd withFilters(Filters filters); + public ListContainersCmd withSince(String since); public static interface Exec extends DockerCmdSyncExec> { } diff --git a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index a9aa5b9d2..481bf7e49 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -2,6 +2,8 @@ import java.util.List; +import javax.annotation.CheckForNull; + import com.github.dockerjava.api.model.Image; /** @@ -14,8 +16,10 @@ */ public interface ListImagesCmd extends SyncDockerCmd> { + @CheckForNull public String getFilters(); + @CheckForNull public Boolean hasShowAllEnabled(); public ListImagesCmd withShowAll(Boolean showAll); diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index 11c1db31b..f06a715cb 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -2,6 +2,9 @@ import java.io.InputStream; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Frame; @@ -24,26 +27,28 @@ */ public interface LogContainerCmd extends AsyncDockerCmd { + @CheckForNull public String getContainerId(); + @CheckForNull public Integer getTail(); + @CheckForNull public Boolean hasFollowStreamEnabled(); + @CheckForNull public Boolean hasTimestampsEnabled(); + @CheckForNull public Boolean hasStdoutEnabled(); + @CheckForNull public Boolean hasStderrEnabled(); + @CheckForNull public Integer getSince(); - public LogContainerCmd withContainerId(String containerId); - - /** - * See {@link #withFollowStream(Boolean)} - */ - public LogContainerCmd withFollowStream(); + public LogContainerCmd withContainerId(@Nonnull String containerId); /** * Following the stream means the resulting {@link InputStream} returned by {@link #exec()} reads infinitely. So a @@ -52,16 +57,10 @@ public interface LogContainerCmd extends AsyncDockerCmd */ public LogContainerCmd withFollowStream(Boolean followStream); - public LogContainerCmd withTimestamps(); - public LogContainerCmd withTimestamps(Boolean timestamps); - public LogContainerCmd withStdOut(); - public LogContainerCmd withStdOut(Boolean stdout); - public LogContainerCmd withStdErr(); - public LogContainerCmd withStdErr(Boolean stderr); public LogContainerCmd withTailAll(); diff --git a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java index 21039bb42..be179a5c4 100644 --- a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; /** @@ -11,9 +14,10 @@ */ public interface PauseContainerCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); - public PauseContainerCmd withContainerId(String containerId); + public PauseContainerCmd withContainerId(@Nonnull String containerId); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java index 53edbe9a4..641258fd1 100644 --- a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.PullResponseItem; @@ -10,15 +13,18 @@ */ public interface PullImageCmd extends AsyncDockerCmd { + @CheckForNull public String getRepository(); + @CheckForNull public String getTag(); + @CheckForNull public String getRegistry(); public AuthConfig getAuthConfig(); - public PullImageCmd withRepository(String repository); + public PullImageCmd withRepository(@Nonnull String repository); public PullImageCmd withTag(String tag); diff --git a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java index 9b8c55918..3fddd0dba 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.AuthConfig; @@ -13,15 +16,20 @@ */ public interface PushImageCmd extends AsyncDockerCmd { + @CheckForNull + public AuthConfig getAuthConfig(); + + @CheckForNull public String getName(); + @CheckForNull public String getTag(); /** * @param name * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ - public PushImageCmd withName(String name); + public PushImageCmd withName(@Nonnull String name); /** * @param tag @@ -29,8 +37,6 @@ public interface PushImageCmd extends AsyncDockerCmd { + @CheckForNull public String getContainerId(); + @CheckForNull public Boolean hasRemoveVolumesEnabled(); + @CheckForNull public Boolean hasForceEnabled(); - public RemoveContainerCmd withContainerId(String containerId); + public RemoveContainerCmd withContainerId(@Nonnull String containerId); public RemoveContainerCmd withRemoveVolumes(Boolean removeVolumes); - public RemoveContainerCmd withForce(); - public RemoveContainerCmd withForce(Boolean force); /** diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java index 8b56d5ae6..e2cb9ca22 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; /** @@ -9,29 +12,22 @@ */ public interface RemoveImageCmd extends SyncDockerCmd { + @CheckForNull public String getImageId(); + @CheckForNull public Boolean hasForceEnabled(); + @CheckForNull public Boolean hasNoPruneEnabled(); - public RemoveImageCmd withImageId(String imageId); - - /** - * force delete of an image, even if it's tagged in multiple repositories - */ - public RemoveImageCmd withForce(); + public RemoveImageCmd withImageId(@Nonnull String imageId); /** * force parameter to force delete of an image, even if it's tagged in multiple repositories */ public RemoveImageCmd withForce(Boolean force); - /** - * prevent the deletion of parent images - */ - public RemoveImageCmd withNoPrune(); - /** * noprune parameter to prevent the deletion of parent images * diff --git a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index f146269f3..07e8776e3 100644 --- a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; /** @@ -11,11 +14,13 @@ */ public interface RestartContainerCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); + @CheckForNull public Integer getTimeout(); - public RestartContainerCmd withContainerId(String containerId); + public RestartContainerCmd withContainerId(@Nonnull String containerId); public RestartContainerCmd withtTimeout(Integer timeout); diff --git a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java index 459beb047..1469eabba 100644 --- a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -2,19 +2,24 @@ import java.io.InputStream; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; public interface SaveImageCmd extends SyncDockerCmd { + @CheckForNull public String getName(); + @CheckForNull public String getTag(); /** * @param name * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. */ - public SaveImageCmd withName(String name); + public SaveImageCmd withName(@Nonnull String name); /** * @param tag diff --git a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java index a1229da9c..897623517 100644 --- a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java @@ -2,6 +2,9 @@ import java.util.List; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.model.SearchItem; /** @@ -13,9 +16,10 @@ */ public interface SearchImagesCmd extends SyncDockerCmd> { + @CheckForNull public String getTerm(); - public SearchImagesCmd withTerm(String term); + public SearchImagesCmd withTerm(@Nonnull String term); public static interface Exec extends DockerCmdSyncExec> { } diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java index 0cfb3ea8e..6c64a4d29 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.NotModifiedException; @@ -9,12 +12,10 @@ */ public interface StartContainerCmd extends SyncDockerCmd { - public static interface Exec extends DockerCmdSyncExec { - } - + @CheckForNull String getContainerId(); - StartContainerCmd withContainerId(String containerId); + StartContainerCmd withContainerId(@Nonnull String containerId); /** * @throws NotFoundException @@ -24,4 +25,7 @@ public static interface Exec extends DockerCmdSyncExec */ @Override public Void exec() throws NotFoundException, NotModifiedException; + + public static interface Exec extends DockerCmdSyncExec { + } } diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java index 64b38d472..653cd3bb2 100644 --- a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.model.Statistics; /** @@ -7,10 +10,12 @@ * block when a container is stopped until the container is up again. */ public interface StatsCmd extends AsyncDockerCmd { - public StatsCmd withContainerId(String containerId); + @CheckForNull public String getContainerId(); + public StatsCmd withContainerId(@Nonnull String containerId); + public static interface Exec extends DockerCmdAsyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java index a9f52d62d..af63c5c92 100644 --- a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.NotModifiedException; @@ -14,11 +17,13 @@ */ public interface StopContainerCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); + @CheckForNull public Integer getTimeout(); - public StopContainerCmd withContainerId(String containerId); + public StopContainerCmd withContainerId(@Nonnull String containerId); public StopContainerCmd withTimeout(Integer timeout); diff --git a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java index 569fddd5e..8ceab3656 100644 --- a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + /** * Tag an image into a repository * @@ -13,15 +16,19 @@ */ public interface TagImageCmd extends SyncDockerCmd { + @CheckForNull public String getImageId(); + @CheckForNull public String getRepository(); + @CheckForNull public String getTag(); + @CheckForNull public Boolean hasForceEnabled(); - public TagImageCmd withImageId(String imageId); + public TagImageCmd withImageId(@Nonnull String imageId); public TagImageCmd withRepository(String repository); diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java index 3e1762f1d..d3eb69c17 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; /** @@ -7,11 +10,13 @@ */ public interface TopContainerCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); + @CheckForNull public String getPsArgs(); - public TopContainerCmd withContainerId(String containerId); + public TopContainerCmd withContainerId(@Nonnull String containerId); public TopContainerCmd withPsArgs(String psArgs); diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java index 44f5658e2..0d7892468 100644 --- a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; /** @@ -11,9 +14,10 @@ */ public interface UnpauseContainerCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); - public UnpauseContainerCmd withContainerId(String containerId); + public UnpauseContainerCmd withContainerId(@Nonnull String containerId); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java index 2accc3af9..347c515a2 100644 --- a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.NotFoundException; /** @@ -9,9 +12,10 @@ */ public interface WaitContainerCmd extends SyncDockerCmd { + @CheckForNull public String getContainerId(); - public WaitContainerCmd withContainerId(String containerId); + public WaitContainerCmd withContainerId(@Nonnull String containerId); /** * @throws NotFoundException diff --git a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java index d393586e4..629990ff1 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -69,11 +69,6 @@ public AttachContainerCmd withContainerId(String containerId) { return this; } - @Override - public AttachContainerCmd withFollowStream() { - return withFollowStream(true); - } - @Override public AttachContainerCmd withFollowStream(Boolean followStream) { this.followStream = followStream; @@ -86,22 +81,12 @@ public AttachContainerCmd withTimestamps(Boolean timestamps) { return this; } - @Override - public AttachContainerCmd withStdOut() { - return withStdOut(true); - } - @Override public AttachContainerCmd withStdOut(Boolean stdout) { this.stdout = stdout; return this; } - @Override - public AttachContainerCmd withStdErr() { - return withStdErr(true); - } - @Override public AttachContainerCmd withStdErr(Boolean stderr) { this.stderr = stderr; @@ -113,9 +98,4 @@ public AttachContainerCmd withLogs(Boolean logs) { this.logs = logs; return this; } - - @Override - public AttachContainerCmd withLogs() { - return withLogs(true); - } } 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 60d11b9d1..16bdbbaf2 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -7,8 +7,6 @@ import java.io.InputStream; import java.net.URI; -import javax.annotation.CheckForNull; - import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.BuildResponseItem; @@ -22,10 +20,8 @@ */ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd implements BuildImageCmd { - @CheckForNull private InputStream tarInputStream; - @CheckForNull private String tag; private Boolean noCache; @@ -36,31 +32,22 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd getLoggingFrames() throws Exception { FrameReaderITestCallback collectFramesCallback = new FrameReaderITestCallback(); - dockerClient.logContainerCmd(dockerfileFixture.getContainerId()).withStdOut().withStdErr().withTailAll() + dockerClient.logContainerCmd(dockerfileFixture.getContainerId()).withStdOut(true).withStdErr(true).withTailAll() // we can't follow stream here as it blocks reading from resulting InputStream infinitely // .withFollowStream() .exec(collectFramesCallback).awaitCompletion(); diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java index 62f530bf2..744bbe82c 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -58,11 +58,11 @@ public void inspectExecTest() throws IOException { dockerClient.startContainerCmd(container.getId()).exec(); ExecCreateCmdResponse touchFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout().withAttachStderr().withCmd("touch", "/marker").exec(); + .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").exec(); LOG.info("Created exec {}", touchFileCmdCreateResponse.toString()); assertThat(touchFileCmdCreateResponse.getId(), not(isEmptyString())); ExecCreateCmdResponse checkFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout().withAttachStderr().withCmd("test", "-e", "/marker").exec(); + .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); LOG.info("Created exec {}", checkFileCmdCreateResponse.toString()); assertThat(checkFileCmdCreateResponse.getId(), not(isEmptyString())); diff --git a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java index d508df235..3c1fe738d 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java @@ -76,7 +76,7 @@ public void listDanglingImages() throws DockerException { assertTrue(imageInFilteredList); } - private Boolean isImageInFilteredList(List images, String expectedImageId) { + private boolean isImageInFilteredList(List images, String expectedImageId) { for (Image image : images) { if (expectedImageId.equals(image.getId())) { return true; 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 c3f6ab01c..1ad4795de 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -63,7 +63,7 @@ public void asyncLogContainer() throws Exception { LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); // this essentially test the since=0 case - dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); + dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback); loggingCallback.awaitCompletion(); @@ -95,7 +95,7 @@ public void onComplete() { }; }; - dockerClient.logContainerCmd("non-existing").withStdErr().withStdOut().exec(loggingCallback).awaitCompletion(); + dockerClient.logContainerCmd("non-existing").withStdErr(true).withStdOut(true).exec(loggingCallback).awaitCompletion(); } @Test @@ -117,19 +117,19 @@ public void asyncMultipleLogContainer() throws Exception { LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); - dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); + dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback); loggingCallback.close(); loggingCallback = new LogContainerTestCallback(); - dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); + dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback); loggingCallback.close(); loggingCallback = new LogContainerTestCallback(); - dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); + dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback); loggingCallback.awaitCompletion(); @@ -156,7 +156,7 @@ public void asyncLogContainerWithSince() throws Exception { LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); - dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().withSince(timestamp) + dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withSince(timestamp) .exec(loggingCallback); loggingCallback.awaitCompletion(); diff --git a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java index 10e31e171..0d7b112f6 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -81,7 +81,7 @@ public void testPullImage() throws Exception { LOG.info("Removing image: {}", testImage); try { - dockerClient.removeImageCmd(testImage).withForce().exec(); + dockerClient.removeImageCmd(testImage).withForce(true).exec(); } catch (NotFoundException e) { // just ignore if not exist } From 9f32269298921a9fc5fe149971a3abae87ebcec4 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 24 Sep 2015 22:46:13 +0200 Subject: [PATCH 0004/1032] Added additional withX(List x) methods --- .../api/command/CreateContainerCmd.java | 50 +++++- .../core/command/CreateContainerCmdImpl.java | 143 ++++++++++++++---- 2 files changed, 163 insertions(+), 30 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 2301cd841..b7c7e8e87 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.command; +import java.util.List; import java.util.Map; import javax.annotation.CheckForNull; @@ -225,29 +226,55 @@ public interface CreateContainerCmd extends SyncDockerCmd devices); + /** * Set custom DNS servers */ public CreateContainerCmd withDns(String... dns); + /** + * Set custom DNS servers + */ + public CreateContainerCmd withDns(List dns); + /** * Set custom DNS search domains */ public CreateContainerCmd withDnsSearch(String... dnsSearch); + /** + * Set custom DNS search domains + */ + public CreateContainerCmd withDnsSearch(List dnsSearch); + public CreateContainerCmd withDomainName(String domainName); public CreateContainerCmd withEntrypoint(String... entrypoint); + public CreateContainerCmd withEntrypoint(List entrypoint); + public CreateContainerCmd withEnv(String... env); + public CreateContainerCmd withEnv(List env); + public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts); + public CreateContainerCmd withExposedPorts(List exposedPorts); + /** * Add hostnames to /etc/hosts in the container */ public CreateContainerCmd withExtraHosts(String... extraHosts); + /** + * Add hostnames to /etc/hosts in the container + */ + public CreateContainerCmd withExtraHosts(List extraHosts); + public CreateContainerCmd withHostName(String hostName); public CreateContainerCmd withImage(String image); @@ -259,10 +286,17 @@ public interface CreateContainerCmd extends SyncDockerCmd links); + public CreateContainerCmd withLogConfig(LogConfig logConfig); public CreateContainerCmd withLxcConf(LxcConf... lxcConf); + public CreateContainerCmd withLxcConf(List lxcConf); + public CreateContainerCmd withMacAddress(String macAddress); public CreateContainerCmd withMemory(Long memory); @@ -296,6 +330,12 @@ public interface CreateContainerCmd extends SyncDockerCmd--publish (-p) option of + * the docker run CLI command. + */ + public CreateContainerCmd withPortBindings(List portBindings); + /** * Add the port bindings that are contained in the given {@link Ports} object. * @@ -305,6 +345,8 @@ public interface CreateContainerCmd extends SyncDockerCmd portSpecs); + public CreateContainerCmd withPrivileged(Boolean privileged); public CreateContainerCmd withPublishAllPorts(Boolean publishAllPorts); @@ -322,14 +364,20 @@ public interface CreateContainerCmd extends SyncDockerCmd ulimits); public CreateContainerCmd withUser(String user); public CreateContainerCmd withVolumes(Volume... volumes); + public CreateContainerCmd withVolumes(List volumes); + public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom); + public CreateContainerCmd withVolumesFrom(List volumesFrom); + public CreateContainerCmd withWorkingDir(String workingDir); /** 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 1ca9d483a..e02f30f94 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -2,6 +2,7 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.List; import java.util.Map; import org.apache.commons.lang.builder.ToStringBuilder; @@ -394,21 +395,21 @@ public String toString() { } @Override - public CreateContainerCmdImpl withAttachStderr(Boolean attachStderr) { + public CreateContainerCmd withAttachStderr(Boolean attachStderr) { checkNotNull(attachStderr, "attachStderr was not specified"); this.attachStderr = attachStderr; return this; } @Override - public CreateContainerCmdImpl withAttachStdin(Boolean attachStdin) { + public CreateContainerCmd withAttachStdin(Boolean attachStdin) { checkNotNull(attachStdin, "attachStdin was not specified"); this.attachStdin = attachStdin; return this; } @Override - public CreateContainerCmdImpl withAttachStdout(Boolean attachStdout) { + public CreateContainerCmd withAttachStdout(Boolean attachStdout) { checkNotNull(attachStdout, "attachStdout was not specified"); this.attachStdout = attachStdout; return this; @@ -443,7 +444,7 @@ public CreateContainerCmd withCapDrop(Capability... capDrop) { } @Override - public CreateContainerCmdImpl withCmd(String... cmd) { + public CreateContainerCmd withCmd(String... cmd) { checkNotNull(cmd, "cmd was not specified"); this.cmd = cmd; return this; @@ -464,7 +465,7 @@ public CreateContainerCmd withCpuPeriod(Integer cpuPeriod) { } @Override - public CreateContainerCmdImpl withCpusetCpus(String cpusetCpus) { + public CreateContainerCmd withCpusetCpus(String cpusetCpus) { checkNotNull(cpusetCpus, "cpusetCpus was not specified"); hostConfig.setCpusetCpus(cpusetCpus); return this; @@ -478,7 +479,7 @@ public CreateContainerCmd withCpusetMems(String cpusetMems) { } @Override - public CreateContainerCmdImpl withCpuShares(Integer cpuShares) { + public CreateContainerCmd withCpuShares(Integer cpuShares) { checkNotNull(cpuShares, "cpuShares was not specified"); hostConfig.setCpuShares(cpuShares); return this; @@ -492,12 +493,24 @@ public CreateContainerCmd withDevices(Device... devices) { } @Override - public CreateContainerCmdImpl withDns(String... dns) { + public CreateContainerCmd withDevices(List devices) { + checkNotNull(devices, "devices was not specified"); + return withDevices(devices.toArray(new Device[0])); + } + + @Override + public CreateContainerCmd withDns(String... dns) { checkNotNull(dns, "dns was not specified"); this.hostConfig.setDns(dns); return this; } + @Override + public CreateContainerCmd withDns(List dns) { + checkNotNull(dns, "dns was not specified"); + return withDns(dns.toArray(new String[0])); + } + @Override public CreateContainerCmd withDnsSearch(String... dnsSearch) { checkNotNull(dnsSearch, "dnsSearch was not specified"); @@ -506,33 +519,57 @@ public CreateContainerCmd withDnsSearch(String... dnsSearch) { } @Override - public CreateContainerCmdImpl withDomainName(String domainName) { + public CreateContainerCmd withDnsSearch(List dnsSearch) { + checkNotNull(dnsSearch, "dnsSearch was not specified"); + return withDnsSearch(dnsSearch.toArray(new String[0])); + } + + @Override + public CreateContainerCmd withDomainName(String domainName) { checkNotNull(domainName, "no domainName was specified"); this.domainName = domainName; return this; } @Override - public CreateContainerCmdImpl withEntrypoint(String... entrypoint) { + public CreateContainerCmd withEntrypoint(String... entrypoint) { checkNotNull(entrypoint, "entrypoint was not specified"); this.entrypoint = entrypoint; return this; } @Override - public CreateContainerCmdImpl withEnv(String... env) { + public CreateContainerCmd withEntrypoint(List entrypoint) { + checkNotNull(entrypoint, "entrypoint was not specified"); + return withEntrypoint(entrypoint.toArray(new String[0])); + } + + @Override + public CreateContainerCmd withEnv(String... env) { checkNotNull(env, "env was not specified"); this.env = env; return this; } @Override - public CreateContainerCmdImpl withExposedPorts(ExposedPort... exposedPorts) { + public CreateContainerCmd withEnv(List env) { + checkNotNull(env, "env was not specified"); + return withEnv(env.toArray(new String[0])); + } + + @Override + public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts) { checkNotNull(exposedPorts, "exposedPorts was not specified"); this.exposedPorts = new ExposedPorts(exposedPorts); return this; } + @Override + public CreateContainerCmd withExposedPorts(List exposedPorts) { + checkNotNull(exposedPorts, "exposedPorts was not specified"); + return withExposedPorts(exposedPorts.toArray(new ExposedPort[0])); + } + @Override public CreateContainerCmd withExtraHosts(String... extraHosts) { checkNotNull(extraHosts, "extraHosts was not specified"); @@ -541,33 +578,45 @@ public CreateContainerCmd withExtraHosts(String... extraHosts) { } @Override - public CreateContainerCmdImpl withHostName(String hostName) { + public CreateContainerCmd withExtraHosts(List extraHosts) { + checkNotNull(extraHosts, "extraHosts was not specified"); + return withExtraHosts(extraHosts.toArray(new String[0])); + } + + @Override + public CreateContainerCmd withHostName(String hostName) { checkNotNull(hostConfig, "no hostName was specified"); this.hostName = hostName; return this; } @Override - public CreateContainerCmdImpl withImage(String image) { + public CreateContainerCmd withImage(String image) { checkNotNull(image, "no image was specified"); this.image = image; return this; } @Override - public CreateContainerCmdImpl withLabels(Map labels) { + public CreateContainerCmd withLabels(Map labels) { checkNotNull(labels, "labels was not specified"); this.labels = labels; return this; } @Override - public CreateContainerCmdImpl withLinks(Link... links) { + public CreateContainerCmd withLinks(Link... links) { checkNotNull(links, "links was not specified"); this.hostConfig.setLinks(links); return this; } + @Override + public CreateContainerCmd withLinks(List links) { + checkNotNull(links, "links was not specified"); + return withLinks(links.toArray(new Link[0])); + } + @Override public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { checkNotNull(lxcConf, "lxcConf was not specified"); @@ -575,6 +624,12 @@ public CreateContainerCmd withLxcConf(LxcConf... lxcConf) { return this; } + @Override + public CreateContainerCmd withLxcConf(List lxcConf) { + checkNotNull(lxcConf, "lxcConf was not specified"); + return withLxcConf(lxcConf.toArray(new LxcConf[0])); + } + @Override public CreateContainerCmd withLogConfig(LogConfig logConfig) { checkNotNull(logConfig, "logConfig was not specified"); @@ -583,35 +638,35 @@ public CreateContainerCmd withLogConfig(LogConfig logConfig) { } @Override - public CreateContainerCmdImpl withMacAddress(String macAddress) { + public CreateContainerCmd withMacAddress(String macAddress) { checkNotNull(macAddress, "macAddress was not specified"); this.macAddress = macAddress; return this; } @Override - public CreateContainerCmdImpl withMemory(Long memory) { + public CreateContainerCmd withMemory(Long memory) { checkNotNull(memory, "memory was not specified"); hostConfig.setMemory(memory); return this; } @Override - public CreateContainerCmdImpl withMemorySwap(Long memorySwap) { + public CreateContainerCmd withMemorySwap(Long memorySwap) { checkNotNull(memorySwap, "memorySwap was not specified"); hostConfig.setMemorySwap(memorySwap); return this; } @Override - public CreateContainerCmdImpl withName(String name) { + public CreateContainerCmd withName(String name) { checkNotNull(name, "name was not specified"); this.name = name; return this; } @Override - public CreateContainerCmdImpl withNetworkDisabled(Boolean disableNetwork) { + public CreateContainerCmd withNetworkDisabled(Boolean disableNetwork) { checkNotNull(disableNetwork, "disableNetwork was not specified"); this.networkDisabled = disableNetwork; return this; @@ -638,6 +693,12 @@ public CreateContainerCmd withPortBindings(PortBinding... portBindings) { return this; } + @Override + public CreateContainerCmd withPortBindings(List portBindings) { + checkNotNull(portBindings, "portBindings was not specified"); + return withPortBindings(portBindings.toArray(new PortBinding[0])); + } + @Override public CreateContainerCmd withPortBindings(Ports portBindings) { checkNotNull(portBindings, "portBindings was not specified"); @@ -646,12 +707,18 @@ public CreateContainerCmd withPortBindings(Ports portBindings) { } @Override - public CreateContainerCmdImpl withPortSpecs(String... portSpecs) { + public CreateContainerCmd withPortSpecs(String... portSpecs) { checkNotNull(portSpecs, "portSpecs was not specified"); this.portSpecs = portSpecs; return this; } + @Override + public CreateContainerCmd withPortSpecs(List portSpecs) { + checkNotNull(portSpecs, "portSpecs was not specified"); + return withPortSpecs(portSpecs.toArray(new String[0])); + } + @Override public CreateContainerCmd withPrivileged(Boolean privileged) { checkNotNull(privileged, "no privileged was specified"); @@ -681,56 +748,74 @@ public CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { } @Override - public CreateContainerCmdImpl withStdInOnce(Boolean stdInOnce) { + public CreateContainerCmd withStdInOnce(Boolean stdInOnce) { checkNotNull(stdInOnce, "no stdInOnce was specified"); this.stdInOnce = stdInOnce; return this; } @Override - public CreateContainerCmdImpl withStdinOpen(Boolean stdinOpen) { + public CreateContainerCmd withStdinOpen(Boolean stdinOpen) { checkNotNull(stdinOpen, "no stdinOpen was specified"); this.stdinOpen = stdinOpen; return this; } @Override - public CreateContainerCmdImpl withTty(Boolean tty) { + public CreateContainerCmd withTty(Boolean tty) { checkNotNull(tty, "no tty was specified"); this.tty = tty; return this; } @Override - public CreateContainerCmd withUlimits(Ulimit[] ulimits) { + public CreateContainerCmd withUlimits(Ulimit... ulimits) { checkNotNull(ulimits, "no ulimits was specified"); hostConfig.setUlimits(ulimits); return this; } @Override - public CreateContainerCmdImpl withUser(String user) { + public CreateContainerCmd withUlimits(List ulimits) { + checkNotNull(ulimits, "no ulimits was specified"); + return withUlimits(ulimits.toArray(new Ulimit[0])); + } + + @Override + public CreateContainerCmd withUser(String user) { checkNotNull(user, "user was not specified"); this.user = user; return this; } @Override - public CreateContainerCmdImpl withVolumes(Volume... volumes) { + public CreateContainerCmd withVolumes(Volume... volumes) { checkNotNull(volumes, "volumes was not specified"); this.volumes = new Volumes(volumes); return this; } @Override - public CreateContainerCmdImpl withVolumesFrom(VolumesFrom... volumesFrom) { + public CreateContainerCmd withVolumes(List volumes) { + checkNotNull(volumes, "volumes was not specified"); + return withVolumes(volumes.toArray(new Volume[0])); + } + + @Override + public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom) { checkNotNull(volumesFrom, "volumesFrom was not specified"); this.hostConfig.setVolumesFrom(volumesFrom); return this; } @Override - public CreateContainerCmdImpl withWorkingDir(String workingDir) { + public CreateContainerCmd withVolumesFrom(List volumesFrom) { + checkNotNull(volumesFrom, "volumesFrom was not specified"); + return withVolumesFrom(volumesFrom.toArray(new VolumesFrom[0])); + } + + @Override + public CreateContainerCmd withWorkingDir(String workingDir) { checkNotNull(workingDir, "workingDir was not specified"); this.workingDir = workingDir; return this; From 38d268f362dfec0000a0fa08ae45261a8e8c6ec4 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 24 Sep 2015 22:51:20 +0200 Subject: [PATCH 0005/1032] Removed import --- .../java/com/github/dockerjava/api/async/ResultCallback.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java index 8525f2478..2016e1980 100644 --- a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java +++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java @@ -1,7 +1,6 @@ package com.github.dockerjava.api.async; import java.io.Closeable; -import java.io.IOException; /** * Result callback From 1e13c8985cd6c1fdaa25ee595b11048a53b3b79a Mon Sep 17 00:00:00 2001 From: Marcus Thiesen Date: Sun, 4 Oct 2015 21:06:34 +0200 Subject: [PATCH 0006/1032] Add API versioning support An issue with docker-java currently is that API < 1.19 has a different authentication scheme than newer API versions. This leads to major problems in environments with different docker installations (see alexec/docker-java-orchestration#49) docker-java Issue #288 fixed the issue for API >= 1.19, but let older servers out of the consideration. This patch distributes the client config through the executors and thus allows the execution to vary depending on those options. --- .../dockerjava/core/DockerClientConfig.java | 20 +-- .../dockerjava/core/DockerClientImpl.java | 34 ++--- .../dockerjava/core/RemoteApiVersion.java | 111 ++++++++++++++ .../jaxrs/AbstrAsyncDockerCmdExec.java | 14 +- .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 35 +++-- .../jaxrs/AbstrSyncDockerCmdExec.java | 13 +- .../jaxrs/AttachContainerCmdExec.java | 14 +- .../github/dockerjava/jaxrs/AuthCmdExec.java | 18 +-- .../dockerjava/jaxrs/BuildImageCmdExec.java | 38 +++-- .../dockerjava/jaxrs/CommitCmdExec.java | 16 +- .../jaxrs/ContainerDiffCmdExec.java | 17 +-- .../jaxrs/CopyFileFromContainerCmdExec.java | 19 ++- .../jaxrs/CreateContainerCmdExec.java | 16 +- .../dockerjava/jaxrs/CreateImageCmdExec.java | 16 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 142 +++++++++--------- .../dockerjava/jaxrs/EventsCmdExec.java | 14 +- .../dockerjava/jaxrs/ExecCreateCmdExec.java | 16 +- .../dockerjava/jaxrs/ExecStartCmdExec.java | 19 ++- .../github/dockerjava/jaxrs/InfoCmdExec.java | 14 +- .../jaxrs/InspectContainerCmdExec.java | 14 +- .../dockerjava/jaxrs/InspectExecCmdExec.java | 14 +- .../dockerjava/jaxrs/InspectImageCmdExec.java | 14 +- .../jaxrs/KillContainerCmdExec.java | 12 +- .../jaxrs/ListContainersCmdExec.java | 19 ++- .../dockerjava/jaxrs/ListImagesCmdExec.java | 19 ++- .../dockerjava/jaxrs/LogContainerCmdExec.java | 14 +- .../jaxrs/PauseContainerCmdExec.java | 12 +- .../github/dockerjava/jaxrs/PingCmdExec.java | 10 +- .../dockerjava/jaxrs/PullImageCmdExec.java | 24 +-- .../dockerjava/jaxrs/PushImageCmdExec.java | 22 +-- .../jaxrs/RemoveContainerCmdExec.java | 12 +- .../dockerjava/jaxrs/RemoveImageCmdExec.java | 10 +- .../jaxrs/RestartContainerCmdExec.java | 12 +- .../dockerjava/jaxrs/SaveImageCmdExec.java | 17 +-- .../dockerjava/jaxrs/SearchImagesCmdExec.java | 17 +-- .../jaxrs/StartContainerCmdExec.java | 14 +- .../github/dockerjava/jaxrs/StatsCmdExec.java | 14 +- .../jaxrs/StopContainerCmdExec.java | 12 +- .../dockerjava/jaxrs/TagImageCmdExec.java | 10 +- .../dockerjava/jaxrs/TopContainerCmdExec.java | 14 +- .../jaxrs/UnpauseContainerCmdExec.java | 12 +- .../dockerjava/jaxrs/VersionCmdExec.java | 14 +- .../jaxrs/WaitContainerCmdExec.java | 14 +- .../core/DockerClientConfigTest.java | 13 +- 44 files changed, 533 insertions(+), 412 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/core/RemoteApiVersion.java diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index ae8156748..6e16c6557 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -1,6 +1,10 @@ package com.github.dockerjava.core; -import static com.google.common.base.Preconditions.checkNotNull; +import com.github.dockerjava.api.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; import java.io.File; import java.io.FileInputStream; @@ -12,11 +16,7 @@ import java.util.Map; import java.util.Properties; -import com.github.dockerjava.api.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; +import static com.google.common.base.Preconditions.checkNotNull; public class DockerClientConfig implements Serializable { @@ -66,14 +66,16 @@ public class DockerClientConfig implements Serializable { private URI uri; - private final String version, username, password, email, serverAddress, dockerCfgPath; + private final String username, password, email, serverAddress, dockerCfgPath; + + private final RemoteApiVersion version; private final SSLConfig sslConfig; DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, String dockerCfgPath, SSLConfig sslConfig) { this.uri = uri; - this.version = version; + this.version = RemoteApiVersion.parseConfigWithDefault(version); this.username = username; this.password = password; this.email = email; @@ -209,7 +211,7 @@ public void setUri(URI uri) { this.uri = uri; } - public String getVersion() { + public RemoteApiVersion getVersion() { return version; } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 206ce26fd..2e22791cd 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -1,12 +1,5 @@ package com.github.dockerjava.core; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.AuthCmd; @@ -46,7 +39,6 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.AuthConfig; -import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.Identifier; import com.github.dockerjava.core.command.AttachContainerCmdImpl; import com.github.dockerjava.core.command.AuthCmdImpl; @@ -85,6 +77,13 @@ import com.github.dockerjava.core.command.VersionCmdImpl; import com.github.dockerjava.core.command.WaitContainerCmdImpl; +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import static com.google.common.base.Preconditions.checkNotNull; + /** * @author Konstantin Pelykh (kpelykh@gmail.com) * @@ -332,28 +331,19 @@ public CommitCmd commitCmd(String containerId) { @Override public BuildImageCmd buildImageCmd() { - return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec())); + return new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec()); } @Override public BuildImageCmd buildImageCmd(File dockerFileOrFolder) { - return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(), - dockerFileOrFolder)); + return new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(), + dockerFileOrFolder); } @Override public BuildImageCmd buildImageCmd(InputStream tarInputStream) { - return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(), - tarInputStream)); - } - - private BuildImageCmd augmentBuildImageCmd(BuildImageCmd buildImageCmd) { - final AuthConfigurations authConfigurations = dockerClientConfig.getAuthConfigurations(); - if (!authConfigurations.getConfigs().isEmpty()) { - buildImageCmd.withBuildAuthConfigs(authConfigurations); - } - - return buildImageCmd; + return new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(), + tarInputStream); } @Override diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java new file mode 100644 index 000000000..7c0092971 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -0,0 +1,111 @@ +package com.github.dockerjava.core; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Objects; +import com.google.common.base.Preconditions; +import com.google.common.base.Strings; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Bean to encapsulate the version of the Docker Remote API (REST API) + *

+ * Contains the minor and major version of the API as well as operations to compare API versions. + * + * @author Marcus Thiesen + */ +public class RemoteApiVersion { + + public static final RemoteApiVersion VERSION_1_19 = RemoteApiVersion.create(1, 19); + private static final Pattern VERSION_REGEX = Pattern.compile("v?(\\d+)\\.(\\d+)"); + private static final RemoteApiVersion UNKNOWN_VERSION = new RemoteApiVersion(0, 0) { + + @Override + public boolean isGreaterOrEqual(final RemoteApiVersion other) { + return false; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this).addValue("UNKNOWN_VERSION").toString(); + } + + @Override + public String asWebPathPart() { + return ""; + } + }; + private final int major; + private final int minor; + private RemoteApiVersion(final int major, final int minor) { + this.major = major; + this.minor = minor; + } + + public static RemoteApiVersion create(final int major, final int minor) { + Preconditions.checkArgument(major > 0, "Major version must be bigger than 0 but is " + major); + Preconditions.checkArgument(minor > 0, "Minor version must be bigger than 0 but is " + minor); + return new RemoteApiVersion(major, minor); + } + + public static RemoteApiVersion unknown() { + return UNKNOWN_VERSION; + } + + public static RemoteApiVersion parseConfig(final String version) { + Preconditions.checkArgument(version != null, "Version must not be null"); + final Matcher matcher = VERSION_REGEX.matcher(version); + if (matcher.matches()) { + return create(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2))); + } + throw new IllegalArgumentException(version + " can not be parsed"); + } + + public static RemoteApiVersion parseConfigWithDefault(final String version) { + if (Strings.isNullOrEmpty(version)) { + return UNKNOWN_VERSION; + } + + try { + return parseConfig(version); + } catch (IllegalArgumentException e) { + return UNKNOWN_VERSION; + } + } + + public boolean isGreaterOrEqual(final RemoteApiVersion other) { + if (major >= other.major) { + if (minor >= other.minor) { + return true; + } + } + return false; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final RemoteApiVersion that = (RemoteApiVersion) o; + return Objects.equal(major, that.major) && + Objects.equal(minor, that.minor); + } + + @Override + public int hashCode() { + return Objects.hashCode(major, minor); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("major", major) + .add("minor", minor) + .toString(); + } + + public String asWebPathPart() { + return "v" + major + "." + minor; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java index c8cc954f3..c2f1a3def 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import java.io.Closeable; -import java.io.IOException; - -import javax.ws.rs.client.WebTarget; - import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.AsyncDockerCmd; import com.github.dockerjava.api.command.DockerCmdAsyncExec; +import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import javax.ws.rs.client.WebTarget; +import java.io.Closeable; +import java.io.IOException; + public abstract class AbstrAsyncDockerCmdExec, A_RES_T> extends AbstrDockerCmdExec implements DockerCmdAsyncExec { - public AbstrAsyncDockerCmdExec(WebTarget baseResource) { - super(baseResource); + public AbstrAsyncDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 4c0d36eaa..e20f480b6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -1,30 +1,37 @@ package com.github.dockerjava.jaxrs; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.IOException; - -import javax.ws.rs.client.WebTarget; - -import org.apache.commons.codec.binary.Base64; - import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.RemoteApiVersion; +import org.apache.commons.codec.binary.Base64; + +import javax.ws.rs.client.WebTarget; +import java.io.IOException; + +import static com.google.common.base.Preconditions.checkNotNull; public abstract class AbstrDockerCmdExec { - private WebTarget baseResource; + private final DockerClientConfig dockerClientConfig; + private final WebTarget baseResource; - public AbstrDockerCmdExec(WebTarget baseResource) { + public AbstrDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { checkNotNull(baseResource, "baseResource was not specified"); + checkNotNull(dockerClientConfig, "dockerClientConfig was not specified"); this.baseResource = baseResource; + this.dockerClientConfig = dockerClientConfig; } protected WebTarget getBaseResource() { return baseResource; } + protected AuthConfigurations getBuildAuthConfigs() { + return dockerClientConfig.getAuthConfigurations(); + } + protected String registryAuth(AuthConfig authConfig) { try { return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); @@ -35,7 +42,13 @@ protected String registryAuth(AuthConfig authConfig) { protected String registryConfigs(AuthConfigurations authConfigs) { try { - String json = new ObjectMapper().writeValueAsString(authConfigs.getConfigs()); + final String json; + if (dockerClientConfig.getVersion().isGreaterOrEqual(RemoteApiVersion.VERSION_1_19)) { + json = new ObjectMapper().writeValueAsString(authConfigs.getConfigs()); + } else { + json = new ObjectMapper().writeValueAsString(authConfigs); + } + return Base64.encodeBase64String(json.getBytes()); } catch (IOException e) { throw new RuntimeException(e); diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java index 016184053..ed1ec6233 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java @@ -1,19 +1,18 @@ package com.github.dockerjava.jaxrs; -import java.io.IOException; - -import javax.ws.rs.ProcessingException; -import javax.ws.rs.client.WebTarget; - import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.core.DockerClientConfig; + +import javax.ws.rs.ProcessingException; +import javax.ws.rs.client.WebTarget; public abstract class AbstrSyncDockerCmdExec, RES_T> extends AbstrDockerCmdExec implements DockerCmdSyncExec { - public AbstrSyncDockerCmdExec(WebTarget baseResource) { - super(baseResource); + public AbstrSyncDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index 67da89284..37f13edc6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -1,24 +1,24 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.async.FrameStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; public class AttachContainerCmdExec extends AbstrAsyncDockerCmdExec implements AttachContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(AttachContainerCmdExec.class); - public AttachContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public AttachContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java index cd346fc78..9c59a8c02 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java @@ -1,24 +1,24 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; +import com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.model.AuthResponse; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.dockerjava.api.UnauthorizedException; -import com.github.dockerjava.api.command.AuthCmd; -import com.github.dockerjava.api.model.AuthResponse; +import static javax.ws.rs.client.Entity.entity; public class AuthCmdExec extends AbstrSyncDockerCmdExec implements AuthCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(AuthCmdExec.class); - public AuthCmdExec(WebTarget baseResource) { - super(baseResource); + public AuthCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 8da1884b8..fa04875f1 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -1,40 +1,50 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - -import javax.ws.rs.client.Invocation; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - -import org.glassfish.jersey.client.ClientProperties; -import org.glassfish.jersey.client.RequestEntityProcessing; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.async.JsonStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; +import org.glassfish.jersey.client.ClientProperties; +import org.glassfish.jersey.client.RequestEntityProcessing; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements BuildImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); - public BuildImageCmdExec(WebTarget baseResource) { - super(baseResource); + public BuildImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } private Invocation.Builder resourceWithOptionalAuthConfig(BuildImageCmd command, Invocation.Builder request) { - AuthConfigurations authConfigs = command.getBuildAuthConfigs(); + final AuthConfigurations authConfigs = firstNonNull(command.getBuildAuthConfigs(), getBuildAuthConfigs()); if (authConfigs != null) { request = request.header("X-Registry-Config", registryConfigs(authConfigs)); } return request; } + private static AuthConfigurations firstNonNull(final AuthConfigurations fromCommand, final AuthConfigurations fromConfig) { + if (fromCommand != null) { + return fromCommand; + } + if (fromConfig != null) { + return fromConfig; + } + return null; + } + @Override protected AbstractCallbackNotifier callbackNotifier(BuildImageCmd command, ResultCallback resultCallback) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java index fec4da6ac..ba4d78945 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CommitCmdExec.java @@ -1,22 +1,22 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.github.dockerjava.api.command.CommitCmd; +import static javax.ws.rs.client.Entity.entity; public class CommitCmdExec extends AbstrSyncDockerCmdExec implements CommitCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(CommitCmdExec.class); - public CommitCmdExec(WebTarget baseResource) { - super(baseResource); + public CommitCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java index aa7878a65..12ceb2cd0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ContainerDiffCmdExec.java @@ -1,24 +1,23 @@ package com.github.dockerjava.jaxrs; -import java.util.List; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.model.ChangeLog; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; 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.ContainerDiffCmd; -import com.github.dockerjava.api.model.ChangeLog; +import java.util.List; public class ContainerDiffCmdExec extends AbstrSyncDockerCmdExec> implements ContainerDiffCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ContainerDiffCmdExec.class); - public ContainerDiffCmdExec(WebTarget baseResource) { - super(baseResource); + public ContainerDiffCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java index cb31cb2f5..15185a8d8 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -1,26 +1,25 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - -import java.io.InputStream; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import java.io.InputStream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import static javax.ws.rs.client.Entity.entity; public class CopyFileFromContainerCmdExec extends AbstrSyncDockerCmdExec implements CopyFileFromContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class); - public CopyFileFromContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public CopyFileFromContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java index ef42c43ff..bb923289d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateContainerCmdExec.java @@ -1,23 +1,23 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; 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.CreateContainerCmd; -import com.github.dockerjava.api.command.CreateContainerResponse; +import static javax.ws.rs.client.Entity.entity; public class CreateContainerCmdExec extends AbstrSyncDockerCmdExec implements CreateContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(CreateContainerCmdExec.class); - public CreateContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public CreateContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java index baba39829..3656d9463 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateImageCmdExec.java @@ -1,23 +1,23 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateImageResponse; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; 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.CreateImageCmd; -import com.github.dockerjava.api.command.CreateImageResponse; +import static javax.ws.rs.client.Entity.entity; public class CreateImageCmdExec extends AbstrSyncDockerCmdExec implements CreateImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(CreateImageCmdExec.class); - public CreateImageCmdExec(WebTarget baseResource) { - super(baseResource); + public CreateImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index ef8d4e4fb..11381a494 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -1,29 +1,5 @@ package com.github.dockerjava.jaxrs; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.IOException; -import java.net.URI; - -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 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.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.DockerClientException; import com.github.dockerjava.api.command.AttachContainerCmd; @@ -64,13 +40,36 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; -//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; -// see https://github.com/docker-java/docker-java/issues/196 +import com.github.dockerjava.core.RemoteApiVersion; import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; -import com.github.dockerjava.jaxrs.filter.FollowRedirectsFilter; import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter; +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.client.ClientConfig; +import org.glassfish.jersey.client.ClientProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +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 java.io.IOException; +import java.net.URI; + +import static com.google.common.base.Preconditions.checkNotNull; + +//import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; +// see https://github.com/docker-java/docker-java/issues/196 public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @@ -92,6 +91,8 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private ClientResponseFilter[] clientResponseFilters = null; + private DockerClientConfig dockerClientConfig; + @Override public void init(DockerClientConfig dockerClientConfig) { checkNotNull(dockerClientConfig, "config was not specified"); @@ -168,11 +169,9 @@ public void init(DockerClientConfig dockerClientConfig) { } WebTarget webResource = client.target(dockerClientConfig.getUri()); - if (dockerClientConfig.getVersion() == null || dockerClientConfig.getVersion().isEmpty()) { - baseResource = webResource; - } else { - baseResource = webResource.path("v" + dockerClientConfig.getVersion()); - } + baseResource = webResource.path(dockerClientConfig.getVersion().asWebPathPart()); + + this.dockerClientConfig = dockerClientConfig; } private org.apache.http.config.Registry getSchemeRegistry(final URI originalUri, @@ -187,188 +186,193 @@ private org.apache.http.config.Registry getSchemeRegist } protected WebTarget getBaseResource() { - checkNotNull(baseResource, "Factory not initialized. You probably forgot to call init()!"); + 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()); + return new AuthCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public InfoCmd.Exec createInfoCmdExec() { - return new InfoCmdExec(getBaseResource()); + return new InfoCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public PingCmd.Exec createPingCmdExec() { - return new PingCmdExec(getBaseResource()); + return new PingCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public VersionCmd.Exec createVersionCmdExec() { - return new VersionCmdExec(getBaseResource()); + return new VersionCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public PullImageCmd.Exec createPullImageCmdExec() { - return new PullImageCmdExec(getBaseResource()); + return new PullImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public PushImageCmd.Exec createPushImageCmdExec() { - return new PushImageCmdExec(getBaseResource()); + return new PushImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public SaveImageCmd.Exec createSaveImageCmdExec() { - return new SaveImageCmdExec(getBaseResource()); + return new SaveImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public CreateImageCmd.Exec createCreateImageCmdExec() { - return new CreateImageCmdExec(getBaseResource()); + return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public SearchImagesCmd.Exec createSearchImagesCmdExec() { - return new SearchImagesCmdExec(getBaseResource()); + return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return new RemoveImageCmdExec(getBaseResource()); + return new RemoveImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public ListImagesCmd.Exec createListImagesCmdExec() { - return new ListImagesCmdExec(getBaseResource()); + return new ListImagesCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public InspectImageCmd.Exec createInspectImageCmdExec() { - return new InspectImageCmdExec(getBaseResource()); + return new InspectImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public ListContainersCmd.Exec createListContainersCmdExec() { - return new ListContainersCmdExec(getBaseResource()); + return new ListContainersCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return new CreateContainerCmdExec(getBaseResource()); + return new CreateContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public StartContainerCmd.Exec createStartContainerCmdExec() { - return new StartContainerCmdExec(getBaseResource()); + return new StartContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public InspectContainerCmd.Exec createInspectContainerCmdExec() { - return new InspectContainerCmdExec(getBaseResource()); + return new InspectContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public ExecCreateCmd.Exec createExecCmdExec() { - return new ExecCreateCmdExec(getBaseResource()); + return new ExecCreateCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return new RemoveContainerCmdExec(getBaseResource()); + return new RemoveContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public WaitContainerCmd.Exec createWaitContainerCmdExec() { - return new WaitContainerCmdExec(getBaseResource()); + return new WaitContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public AttachContainerCmd.Exec createAttachContainerCmdExec() { - return new AttachContainerCmdExec(getBaseResource()); + return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public ExecStartCmd.Exec createExecStartCmdExec() { - return new ExecStartCmdExec(getBaseResource()); + return new ExecStartCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public InspectExecCmd.Exec createInspectExecCmdExec() { - return new InspectExecCmdExec(getBaseResource()); + return new InspectExecCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public LogContainerCmd.Exec createLogContainerCmdExec() { - return new LogContainerCmdExec(getBaseResource()); + return new LogContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return new CopyFileFromContainerCmdExec(getBaseResource()); + return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public StopContainerCmd.Exec createStopContainerCmdExec() { - return new StopContainerCmdExec(getBaseResource()); + return new StopContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public ContainerDiffCmd.Exec createContainerDiffCmdExec() { - return new ContainerDiffCmdExec(getBaseResource()); + return new ContainerDiffCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public KillContainerCmd.Exec createKillContainerCmdExec() { - return new KillContainerCmdExec(getBaseResource()); + return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public RestartContainerCmd.Exec createRestartContainerCmdExec() { - return new RestartContainerCmdExec(getBaseResource()); + return new RestartContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public CommitCmd.Exec createCommitCmdExec() { - return new CommitCmdExec(getBaseResource()); + return new CommitCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public BuildImageCmd.Exec createBuildImageCmdExec() { - return new BuildImageCmdExec(getBaseResource()); + return new BuildImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public TopContainerCmd.Exec createTopContainerCmdExec() { - return new TopContainerCmdExec(getBaseResource()); + return new TopContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public TagImageCmd.Exec createTagImageCmdExec() { - return new TagImageCmdExec(getBaseResource()); + return new TagImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public PauseContainerCmd.Exec createPauseContainerCmdExec() { - return new PauseContainerCmdExec(getBaseResource()); + return new PauseContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { - return new UnpauseContainerCmdExec(baseResource); + return new UnpauseContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public EventsCmd.Exec createEventsCmdExec() { - return new EventsCmdExec(getBaseResource()); + return new EventsCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public StatsCmd.Exec createStatsCmdExec() { - return new StatsCmdExec(getBaseResource()); + return new StatsCmdExec(getBaseResource(), getDockerClientConfig()); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 7936ef15f..2b73f2658 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -1,16 +1,16 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.async.JsonStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; @@ -18,8 +18,8 @@ public class EventsCmdExec extends AbstrAsyncDockerCmdExec imp private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); - public EventsCmdExec(WebTarget baseResource) { - super(baseResource); + public EventsCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java index 17b1d2c64..79fa04bed 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java @@ -1,23 +1,23 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; 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.ExecCreateCmd; -import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import static javax.ws.rs.client.Entity.entity; public class ExecCreateCmdExec extends AbstrSyncDockerCmdExec implements ExecCreateCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(VersionCmdExec.class); - public ExecCreateCmdExec(WebTarget baseResource) { - super(baseResource); + public ExecCreateCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index fcae733e6..cf850d10c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -1,25 +1,24 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - -import java.io.InputStream; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import java.io.InputStream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.dockerjava.api.command.ExecStartCmd; -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import static javax.ws.rs.client.Entity.entity; public class ExecStartCmdExec extends AbstrSyncDockerCmdExec implements ExecStartCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); - public ExecStartCmdExec(WebTarget baseResource) { - super(baseResource); + public ExecStartCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java index 141d7d1dd..d1dda0148 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InfoCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.model.Info; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.InfoCmd; -import com.github.dockerjava.api.model.Info; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class InfoCmdExec extends AbstrSyncDockerCmdExec implements InfoCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InfoCmdExec.class); - public InfoCmdExec(WebTarget baseResource) { - super(baseResource); + public InfoCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java index 9c6e34a92..68790cb69 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectContainerCmdExec.java @@ -1,21 +1,21 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.InspectContainerCmd; -import com.github.dockerjava.api.command.InspectContainerResponse; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class InspectContainerCmdExec extends AbstrSyncDockerCmdExec implements InspectContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InspectContainerCmdExec.class); - public InspectContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public InspectContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java index d8310bd3a..c5127a962 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectExecCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectExecResponse; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.InspectExecCmd; -import com.github.dockerjava.api.command.InspectExecResponse; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class InspectExecCmdExec extends AbstrSyncDockerCmdExec implements InspectExecCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InspectExecCmdExec.class); - public InspectExecCmdExec(WebTarget baseResource) { - super(baseResource); + public InspectExecCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java index 9148887ef..71944e12f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectImageCmdExec.java @@ -1,21 +1,21 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.InspectImageResponse; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.InspectImageCmd; -import com.github.dockerjava.api.command.InspectImageResponse; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class InspectImageCmdExec extends AbstrSyncDockerCmdExec implements InspectImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InspectImageCmdExec.class); - public InspectImageCmdExec(WebTarget baseResource) { - super(baseResource); + public InspectImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java index f4d2680b9..0c62aee1c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/KillContainerCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.KillContainerCmd; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class KillContainerCmdExec extends AbstrSyncDockerCmdExec implements KillContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(KillContainerCmdExec.class); - public KillContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public KillContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java index e1e74eec9..01afaa6c5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java @@ -1,26 +1,25 @@ package com.github.dockerjava.jaxrs; -import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; - -import java.util.List; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; +import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.dockerjava.api.command.ListContainersCmd; -import com.github.dockerjava.api.model.Container; +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; public class ListContainersCmdExec extends AbstrSyncDockerCmdExec> implements ListContainersCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ListContainersCmdExec.class); - public ListContainersCmdExec(WebTarget baseResource) { - super(baseResource); + public ListContainersCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index fa8409cb8..06e7b782b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -1,25 +1,24 @@ package com.github.dockerjava.jaxrs; -import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; - -import java.util.List; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.model.Image; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; +import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.dockerjava.api.command.ListImagesCmd; -import com.github.dockerjava.api.model.Image; +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; public class ListImagesCmdExec extends AbstrSyncDockerCmdExec> implements ListImagesCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ListImagesCmdExec.class); - public ListImagesCmdExec(WebTarget baseResource) { - super(baseResource); + public ListImagesCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index b2c1691b6..7bce2964d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -1,24 +1,24 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.async.FrameStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; public class LogContainerCmdExec extends AbstrAsyncDockerCmdExec implements LogContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class); - public LogContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public LogContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java index 04bb68a6f..8ba4e6b5d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PauseContainerCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.PauseContainerCmd; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class PauseContainerCmdExec extends AbstrSyncDockerCmdExec implements PauseContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(PauseContainerCmdExec.class); - public PauseContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public PauseContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java index 875155c96..974ec427c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PingCmdExec.java @@ -1,18 +1,18 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; - +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.PingCmd; +import javax.ws.rs.client.WebTarget; public class PingCmdExec extends AbstrSyncDockerCmdExec implements PingCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(PingCmdExec.class); - public PingCmdExec(WebTarget baseResource) { - super(baseResource); + public PingCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java index dfba3c1c6..b68edeb0c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PullImageCmdExec.java @@ -1,30 +1,30 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - -import javax.ws.rs.client.Invocation; -import javax.ws.rs.client.Invocation.Builder; -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.async.ResultCallback; import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.PullResponseItem; +import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.async.JsonStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.Invocation.Builder; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; public class PullImageCmdExec extends AbstrAsyncDockerCmdExec implements PullImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(PullImageCmdExec.class); - public PullImageCmdExec(WebTarget baseResource) { - super(baseResource); + public PullImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } private Invocation.Builder resourceWithOptionalAuthConfig(PullImageCmd command, Invocation.Builder request) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 2095fd3e2..3278289a5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -1,29 +1,29 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; - -import javax.ws.rs.client.Invocation.Builder; -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.async.ResultCallback; import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.PushResponseItem; +import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.async.JsonStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.Invocation.Builder; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; public class PushImageCmdExec extends AbstrAsyncDockerCmdExec implements PushImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(PushImageCmdExec.class); - public PushImageCmdExec(WebTarget baseResource) { - super(baseResource); + public PushImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } private String name(PushImageCmd command) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java index 2e72c37bc..b11d7d457 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveContainerCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.RemoveContainerCmd; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class RemoveContainerCmdExec extends AbstrSyncDockerCmdExec implements RemoveContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(RemoveContainerCmdExec.class); - public RemoveContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public RemoveContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java index 18d477c51..7ef7058e5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveImageCmdExec.java @@ -1,18 +1,18 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; - +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.RemoveImageCmd; +import javax.ws.rs.client.WebTarget; public class RemoveImageCmdExec extends AbstrSyncDockerCmdExec implements RemoveImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(RemoveImageCmdExec.class); - public RemoveImageCmdExec(WebTarget baseResource) { - super(baseResource); + public RemoveImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java index 0a4fced89..918dfa361 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.RestartContainerCmd; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class RestartContainerCmdExec extends AbstrSyncDockerCmdExec implements RestartContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(RestartContainerCmdExec.class); - public RestartContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public RestartContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java index 39a06f15a..77604cf74 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SaveImageCmdExec.java @@ -1,22 +1,21 @@ package com.github.dockerjava.jaxrs; -import java.io.InputStream; +import com.github.dockerjava.api.command.SaveImageCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.dockerjava.api.command.SaveImageCmd; -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import java.io.InputStream; public class SaveImageCmdExec extends AbstrSyncDockerCmdExec implements SaveImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(SaveImageCmdExec.class); - public SaveImageCmdExec(WebTarget baseResource) { - super(baseResource); + public SaveImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java index 1de9943d9..ded7fc8c3 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/SearchImagesCmdExec.java @@ -1,24 +1,23 @@ package com.github.dockerjava.jaxrs; -import java.util.List; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.model.SearchItem; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; 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.SearchImagesCmd; -import com.github.dockerjava.api.model.SearchItem; +import java.util.List; public class SearchImagesCmdExec extends AbstrSyncDockerCmdExec> implements SearchImagesCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(SearchImagesCmdExec.class); - public SearchImagesCmdExec(WebTarget baseResource) { - super(baseResource); + public SearchImagesCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java index 8b41f2cd9..4d0c60111 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java @@ -1,22 +1,22 @@ package com.github.dockerjava.jaxrs; -import static javax.ws.rs.client.Entity.entity; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; 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.StartContainerCmd; +import static javax.ws.rs.client.Entity.entity; public class StartContainerCmdExec extends AbstrSyncDockerCmdExec implements StartContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(StartContainerCmdExec.class); - public StartContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public StartContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java index 10fbd1ca6..f934b895d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StatsCmdExec.java @@ -1,22 +1,22 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.StatsCmd; import com.github.dockerjava.api.model.Statistics; +import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.async.JsonStreamProcessor; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; public class StatsCmdExec extends AbstrAsyncDockerCmdExec implements StatsCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(StatsCmdExec.class); - public StatsCmdExec(WebTarget baseResource) { - super(baseResource); + public StatsCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java index ca6ad3537..8805be6d0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.StopContainerCmd; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class StopContainerCmdExec extends AbstrSyncDockerCmdExec implements StopContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(StopContainerCmdExec.class); - public StopContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public StopContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java index f697b22b2..ca9249eb3 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TagImageCmdExec.java @@ -1,18 +1,18 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; - +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.TagImageCmd; +import javax.ws.rs.client.WebTarget; public class TagImageCmdExec extends AbstrSyncDockerCmdExec implements TagImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(TagImageCmdExec.class); - public TagImageCmdExec(WebTarget baseResource) { - super(baseResource); + public TagImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java index 32c9cbc63..46a139e39 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java @@ -1,22 +1,22 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.TopContainerResponse; +import com.github.dockerjava.core.DockerClientConfig; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.TopContainerCmd; -import com.github.dockerjava.api.command.TopContainerResponse; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class TopContainerCmdExec extends AbstrSyncDockerCmdExec implements TopContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(TopContainerCmdExec.class); - public TopContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public TopContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java index 3005f6630..375ff875f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/UnpauseContainerCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.UnpauseContainerCmd; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class UnpauseContainerCmdExec extends AbstrSyncDockerCmdExec implements UnpauseContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(UnpauseContainerCmdExec.class); - public UnpauseContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public UnpauseContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java index 0c1611bc4..3965e04d6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/VersionCmdExec.java @@ -1,20 +1,20 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.model.Version; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.command.VersionCmd; -import com.github.dockerjava.api.model.Version; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class VersionCmdExec extends AbstrSyncDockerCmdExec implements VersionCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(VersionCmdExec.class); - public VersionCmdExec(WebTarget baseResource) { - super(baseResource); + public VersionCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java index a916e1b5b..16dab933d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java @@ -1,21 +1,21 @@ package com.github.dockerjava.jaxrs; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; - +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.github.dockerjava.api.command.WaitContainerCmd; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; public class WaitContainerCmdExec extends AbstrSyncDockerCmdExec implements WaitContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(WaitContainerCmdExec.class); - public WaitContainerCmdExec(WebTarget baseResource) { - super(baseResource); + public WaitContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); } @Override diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index 9597b97d7..e66cfa57d 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -1,6 +1,7 @@ package com.github.dockerjava.core; -import static org.testng.Assert.assertEquals; +import com.github.dockerjava.api.model.AuthConfig; +import org.testng.annotations.Test; import java.net.URI; import java.util.Collections; @@ -8,9 +9,7 @@ import java.util.Map; import java.util.Properties; -import org.testng.annotations.Test; - -import com.github.dockerjava.api.model.AuthConfig; +import static org.testng.Assert.assertEquals; public class DockerClientConfigTest { @@ -25,7 +24,7 @@ private static DockerClientConfig newExampleConfig() { public void string() throws Exception { assertEquals( EXAMPLE_CONFIG.toString(), - "DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}'}"); + "DockerClientConfig{uri=http://foo, version='{UNKNOWN_VERSION}', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}'}"); } @Test @@ -159,7 +158,7 @@ public void defaults() throws Exception { assertEquals(config.getUri(), URI.create("https://localhost:2376")); assertEquals(config.getUsername(), "someUserName"); assertEquals(config.getServerAddress(), AuthConfig.DEFAULT_SERVER_ADDRESS); - assertEquals(config.getVersion(), null); + assertEquals(config.getVersion(), RemoteApiVersion.unknown()); assertEquals(config.getDockerCfgPath(), "someHomeDir/.dockercfg"); assertEquals(((LocalDirectorySSLConfig) config.getSslConfig()).getDockerCertPath(), "someHomeDir/.docker"); } @@ -185,4 +184,4 @@ public void systemProperties() throws Exception { assertEquals(config, EXAMPLE_CONFIG); } -} \ No newline at end of file +} From e1a16509ed942afdf143ef3e6ffec49bd10acf67 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 7 Oct 2015 22:50:06 +0200 Subject: [PATCH 0007/1032] Remove deprecated config option --- src/main/resources/docker.io.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/docker.io.properties b/src/main/resources/docker.io.properties index 6f0bfc86c..30ba2b62a 100644 --- a/src/main/resources/docker.io.properties +++ b/src/main/resources/docker.io.properties @@ -1,5 +1,4 @@ docker.io.url=https://localhost:2376 -docker.io.enableLoggingFilter=true docker.io.dockerCertPath=${user.home}/.docker docker.io.dockerCfgPath=${user.home}/.dockercfg docker.io.username=${user.name} From ffe7cc4fc0e4e2eb555715e15a910dc3442162f7 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 7 Oct 2015 22:51:11 +0200 Subject: [PATCH 0008/1032] pin API version for integration tests --- .../github/dockerjava/client/AbstractDockerClientTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index e8dfa9bd7..e8c98d902 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -38,6 +38,8 @@ public abstract class AbstractDockerClientTest extends Assert { public static final Logger LOG = LoggerFactory.getLogger(AbstractDockerClientTest.class); + private String apiVersion = "1.19"; + protected DockerClient dockerClient; protected TestDockerCmdExecFactory dockerCmdExecFactory = new TestDockerCmdExecFactory( @@ -68,7 +70,8 @@ protected DockerClientConfig config(String password) { if (password != null) { builder = builder.withPassword(password); } - return builder.build(); + + return builder.withVersion(apiVersion).build(); } public void afterTest() { From 9d20d12533336de944b9311b80c754f47b2e7985 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 7 Oct 2015 22:52:15 +0200 Subject: [PATCH 0009/1032] Format sources --- .../api/command/CreateContainerCmd.java | 3 +-- .../dockerjava/core/DockerClientImpl.java | 6 ++---- .../dockerjava/core/RemoteApiVersion.java | 19 +++++++++++-------- .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 1 + .../dockerjava/jaxrs/BuildImageCmdExec.java | 3 ++- .../jaxrs/DockerCmdExecFactoryImpl.java | 8 ++++---- 6 files changed, 21 insertions(+), 19 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 e3ffa4996..4dba937fe 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -297,8 +297,7 @@ public static interface Exec extends DockerCmdSyncExec Date: Wed, 7 Oct 2015 23:01:34 +0200 Subject: [PATCH 0010/1032] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7738add8c..01bb822bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT version --- +* [#335] (https://github.com/docker-java/docker-java/pull/335) Improve backward-compatibility support for older API versions * [#333] (https://github.com/docker-java/docker-java/pull/333) Adding support for withPidMode v2.1.1 From 0084979e367e64848a25b3015d7202eac5beef9d Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 10 Oct 2015 17:10:58 +0300 Subject: [PATCH 0011/1032] Add findbugs maven plugin --- pom.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pom.xml b/pom.xml index d30c04212..4d9aa45b8 100644 --- a/pom.xml +++ b/pom.xml @@ -373,6 +373,25 @@ org.apache.maven.plugins maven-source-plugin + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.2 + + Max + Low + true + + false + + + + + check + + + + From 7452d6d1afa2d2ba8bb8f8f4e198f1e46f111f53 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 10 Oct 2015 17:12:39 +0300 Subject: [PATCH 0012/1032] =?UTF-8?q?PMD:=C2=A0Consider=20simply=20returni?= =?UTF-8?q?ng=20the=20value=20vs=20storing=20it=20in=20local=20variable=20?= =?UTF-8?q?'message'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java index fc01327c2..3d581a0b0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java @@ -83,8 +83,7 @@ private String getBodyAsMessage(ClientResponseContext responseContext) throws IO if (charset == null) { charset = Charset.defaultCharset(); } - String message = new String(buffer, charset); - return message; + return new String(buffer, charset); } } return null; From 39339b9ca64ffad7a76f05f500fef0c03ed664a8 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 10 Oct 2015 17:13:24 +0300 Subject: [PATCH 0013/1032] Add checkfornull annotation --- .../dockerjava/core/command/BuildImageResultCallback.java | 3 +++ .../dockerjava/core/command/PullImageResultCallback.java | 3 +++ .../dockerjava/core/command/PushImageResultCallback.java | 3 +++ 3 files changed, 9 insertions(+) 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 ae36a63d7..9f501c8c6 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java @@ -12,6 +12,8 @@ import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.core.async.ResultCallbackTemplate; +import javax.annotation.CheckForNull; + /** * * @author marcus @@ -21,6 +23,7 @@ public class BuildImageResultCallback extends ResultCallbackTemplate Date: Sat, 10 Oct 2015 17:19:02 +0300 Subject: [PATCH 0014/1032] Close streams --- .../java/com/github/dockerjava/core/DockerClientConfig.java | 5 +++-- .../java/com/github/dockerjava/core/KeystoreSSLConfig.java | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 6e16c6557..6187be49c 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -9,6 +9,7 @@ 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.Collections; @@ -85,9 +86,9 @@ public class DockerClientConfig implements Serializable { } private static Properties loadIncludedDockerProperties(Properties systemProperties) { - try { + try (InputStream is = DockerClientConfig.class.getResourceAsStream("/" + DOCKER_IO_PROPERTIES_PROPERTY)) { Properties p = new Properties(); - p.load(DockerClientConfig.class.getResourceAsStream("/" + DOCKER_IO_PROPERTIES_PROPERTY)); + p.load(is); replaceProperties(p, systemProperties); return p; } catch (IOException e) { diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index d7a17cfab..dc9defbfb 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -57,7 +57,9 @@ public KeystoreSSLConfig(File pfxFile, String password) throws KeyStoreException checkNotNull(pfxFile); checkNotNull(password); keystore = KeyStore.getInstance("pkcs12"); - keystore.load(new FileInputStream(pfxFile), password.toCharArray()); + try (FileInputStream fs = new FileInputStream(pfxFile)) { + keystore.load(fs, password.toCharArray()); + } keystorePassword = password; } From 92ac07d74ed121d8fcac7d3a8dd83e81cf928e4d Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 10 Oct 2015 17:20:31 +0300 Subject: [PATCH 0015/1032] PMD: merge nested ifs --- .../github/dockerjava/core/CompressArchiveUtil.java | 6 ++---- .../com/github/dockerjava/core/GoLangFileMatch.java | 7 ++----- .../com/github/dockerjava/core/RemoteApiVersion.java | 6 ++---- .../dockerjava/jaxrs/connector/ApacheConnector.java | 10 ++++------ 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index 59dec59ef..c64d07b7d 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -25,10 +25,8 @@ public static File archiveTARFiles(File base, Iterable files, String archi TarArchiveEntry tarEntry = new TarArchiveEntry(file); tarEntry.setName(relativize(base, file)); - if (!file.isDirectory()) { - if (file.canExecute()) { - tarEntry.setMode(tarEntry.getMode() | 0755); - } + if (!file.isDirectory() && file.canExecute()) { + tarEntry.setMode(tarEntry.getMode() | 0755); } tos.putArchiveEntry(tarEntry); diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index afe4b9843..6ebdd604b 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -113,11 +113,8 @@ static ScanResult scanChunk(String pattern) { Scan: for (i = 0; i < pattern.length(); i++) { switch (pattern.charAt(i)) { case '\\': { - if (!IS_WINDOWS) { - // error check handled in matchChunk: bad pattern. - if (i + 1 < pattern.length()) { - i++; - } + if (!IS_WINDOWS && i + 1 < pattern.length()) { + i++; } break; } diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index e6b2cf6e8..81db242cd 100644 --- a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -80,10 +80,8 @@ public static RemoteApiVersion parseConfigWithDefault(final String version) { } public boolean isGreaterOrEqual(final RemoteApiVersion other) { - if (major >= other.major) { - if (minor >= other.minor) { - return true; - } + if (major >= other.major && minor >= other.minor) { + return true; } return false; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java index f989133f7..f7c830902 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java @@ -213,12 +213,10 @@ class ApacheConnector implements Connector { if (config != null) { final Object connectionManager = config.getProperties().get(ApacheClientProperties.CONNECTION_MANAGER); - if (connectionManager != null) { - if (!(connectionManager instanceof HttpClientConnectionManager)) { - LOGGER.log(Level.WARNING, LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( - ApacheClientProperties.CONNECTION_MANAGER, connectionManager.getClass().getName(), - HttpClientConnectionManager.class.getName())); - } + if (connectionManager != null && !(connectionManager instanceof HttpClientConnectionManager)) { + LOGGER.log(Level.WARNING, LocalizationMessages.IGNORING_VALUE_OF_PROPERTY( + ApacheClientProperties.CONNECTION_MANAGER, connectionManager.getClass().getName(), + HttpClientConnectionManager.class.getName())); } reqConfig = config.getProperties().get(ApacheClientProperties.REQUEST_CONFIG); From 51c580ed0ec8b3007bf2c60d8649b1594dfa40c5 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Tue, 13 Oct 2015 11:20:11 +0200 Subject: [PATCH 0016/1032] Implement equals/hashCode for Filters --- .../github/dockerjava/api/model/Filters.java | 17 ++++++++ .../dockerjava/api/model/FiltersTest.java | 43 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/test/java/com/github/dockerjava/api/model/FiltersTest.java diff --git a/src/main/java/com/github/dockerjava/api/model/Filters.java b/src/main/java/com/github/dockerjava/api/model/Filters.java index b912b541a..227545e22 100644 --- a/src/main/java/com/github/dockerjava/api/model/Filters.java +++ b/src/main/java/com/github/dockerjava/api/model/Filters.java @@ -92,6 +92,22 @@ private static List labelsMapToList(Map labels) { return result; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Filters filters1 = (Filters) o; + + return filters.equals(filters1.filters); + + } + + @Override + public int hashCode() { + return filters.hashCode(); + } + @Override public String toString() { try { @@ -100,4 +116,5 @@ public String toString() { throw new RuntimeException(e); } } + } diff --git a/src/test/java/com/github/dockerjava/api/model/FiltersTest.java b/src/test/java/com/github/dockerjava/api/model/FiltersTest.java new file mode 100644 index 000000000..1572553e6 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/FiltersTest.java @@ -0,0 +1,43 @@ +package com.github.dockerjava.api.model; + +import com.google.common.collect.Maps; +import org.testng.annotations.Test; + +import java.util.Map; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotSame; + +/** + * @author Vincent Latombe + */ +public class FiltersTest { + + @Test + public void newFiltersShouldBeEquals() { + assertEquals(new Filters(), new Filters()); + } + + @Test + public void filtersWithEqualContentShouldBeEquals() { + assertEquals(new Filters().withContainers("foo"), new Filters().withContainers("foo")); + assertEquals(new Filters().withLabels("alpha=val"), new Filters().withLabels("alpha=val")); + } + + @Test + public void withLabelsMapShouldBeEquivalentToVarargs() { + Map map = Maps.newHashMap(); + map.put("alpha", "val"); + assertEquals(new Filters().withLabels("alpha=val"), new Filters().withLabels(map)); + + map = Maps.newHashMap(); + map.put("alpha", "val"); + map.put("beta", "val1"); + assertEquals(new Filters().withLabels("alpha=val", "beta=val1"), new Filters().withLabels(map)); + } + + @Test + public void filtersWithDifferentContentShouldntBeEquals() { + assertNotSame(new Filters().withContainers("foo"), new Filters().withContainers("bar")); + } +} From 4bd788f90814e1000a30a0619253647c8f8a4be3 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 16 Oct 2015 22:01:56 +0200 Subject: [PATCH 0017/1032] use latest testng version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d30c04212..280138916 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 1.1.0 - 5.12.1 + 6.1.1 1.3 1.6 2.3.3 From 546e6424c5c9b9fa6b64db25ffbc9afb7783b8cf Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 16 Oct 2015 22:02:22 +0200 Subject: [PATCH 0018/1032] format sources --- src/main/java/com/github/dockerjava/api/model/Filters.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/Filters.java b/src/main/java/com/github/dockerjava/api/model/Filters.java index 227545e22..b24dd69db 100644 --- a/src/main/java/com/github/dockerjava/api/model/Filters.java +++ b/src/main/java/com/github/dockerjava/api/model/Filters.java @@ -94,8 +94,10 @@ private static List labelsMapToList(Map labels) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; Filters filters1 = (Filters) o; From 95796f692f7967de9a1c81101949790fdb1b1cce Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 16 Oct 2015 22:02:45 +0200 Subject: [PATCH 0019/1032] Add missing hashcode tests --- .../dockerjava/api/model/FiltersTest.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/github/dockerjava/api/model/FiltersTest.java b/src/test/java/com/github/dockerjava/api/model/FiltersTest.java index 1572553e6..8016ec49f 100644 --- a/src/test/java/com/github/dockerjava/api/model/FiltersTest.java +++ b/src/test/java/com/github/dockerjava/api/model/FiltersTest.java @@ -5,8 +5,7 @@ import java.util.Map; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotSame; +import static org.testng.Assert.*; /** * @author Vincent Latombe @@ -18,6 +17,11 @@ public void newFiltersShouldBeEquals() { assertEquals(new Filters(), new Filters()); } + @Test + public void newFiltersShouldHaveEqualHashcode() { + assertEquals(new Filters().hashCode(), new Filters().hashCode()); + } + @Test public void filtersWithEqualContentShouldBeEquals() { assertEquals(new Filters().withContainers("foo"), new Filters().withContainers("foo")); @@ -25,7 +29,13 @@ public void filtersWithEqualContentShouldBeEquals() { } @Test - public void withLabelsMapShouldBeEquivalentToVarargs() { + public void filtersWithEqualContentShouldHaveEqualHashcode() { + assertEquals(new Filters().withContainers("foo").hashCode(), new Filters().withContainers("foo").hashCode()); + assertEquals(new Filters().withLabels("alpha=val").hashCode(), new Filters().withLabels("alpha=val").hashCode()); + } + + @Test + public void withLabelsMapShouldBeEqualsToVarargs() { Map map = Maps.newHashMap(); map.put("alpha", "val"); assertEquals(new Filters().withLabels("alpha=val"), new Filters().withLabels(map)); @@ -38,6 +48,11 @@ public void withLabelsMapShouldBeEquivalentToVarargs() { @Test public void filtersWithDifferentContentShouldntBeEquals() { - assertNotSame(new Filters().withContainers("foo"), new Filters().withContainers("bar")); + assertNotEquals(new Filters().withContainers("foo"), new Filters().withContainers("bar")); + } + + @Test + public void filtersWithDifferentContentShouldntHaveEqualHashcode() { + assertNotEquals(new Filters().withContainers("foo").hashCode(), new Filters().withContainers("bar").hashCode()); } } From 520ed0f966400db1df881b85f497e99fc6bda74e Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 16 Oct 2015 22:26:50 +0200 Subject: [PATCH 0020/1032] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01bb822bb..969f6583c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT version --- +* [#344] (https://github.com/docker-java/docker-java/pull/344) Implement equals/hashCode for Filters * [#335] (https://github.com/docker-java/docker-java/pull/335) Improve backward-compatibility support for older API versions * [#333] (https://github.com/docker-java/docker-java/pull/333) Adding support for withPidMode From cae292401b3fc227c66e23a51de4d048e6e6dee6 Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Sat, 17 Oct 2015 18:47:32 +0200 Subject: [PATCH 0021/1032] Implementations of Copy file to container command Modification of Copy file from container command to follow 1.20 API --- .../github/dockerjava/api/DockerClient.java | 3 + .../api/command/DockerCmdExecFactory.java | 4 +- .../dockerjava/core/CompressArchiveUtil.java | 59 +++++++++++ .../dockerjava/core/DockerClientImpl.java | 23 +++-- .../github/dockerjava/core/FilePathUtil.java | 26 ++++- .../github/dockerjava/core/TarDirWalker.java | 46 +++++++++ .../command/CopyFileFromContainerCmdImpl.java | 10 +- .../core/command/CopyFileToContainerCmd.java | 62 ++++++++++++ .../command/CopyFileToContainerCmdImpl.java | 97 +++++++++++++++++++ .../jaxrs/CopyFileFromContainerCmdExec.java | 22 ++--- .../jaxrs/CopyFileToContainerCmdExec.java | 57 +++++++++++ .../jaxrs/DockerCmdExecFactoryImpl.java | 6 ++ .../client/AbstractDockerClientTest.java | 2 +- .../core/TestDockerCmdExecFactory.java | 7 +- .../CopyFileToContainerCmdImplTest.java | 70 +++++++++++++ 15 files changed, 458 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/core/TarDirWalker.java create mode 100644 src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmd.java create mode 100644 src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java create mode 100644 src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 8b578f08e..79bd8dac0 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -43,6 +43,7 @@ import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.Identifier; +import com.github.dockerjava.core.command.CopyFileToContainerCmd; // https://godoc.org/github.com/fsouza/go-dockerclient public interface DockerClient extends Closeable { @@ -120,6 +121,8 @@ public interface DockerClient extends Closeable { public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource); + public CopyFileToContainerCmd copyFileToContainerCmd(String containerId, String hostResource); + public ContainerDiffCmd containerDiffCmd(String containerId); public StopContainerCmd stopContainerCmd(String containerId); 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 fc750a743..33581c0e7 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -4,6 +4,7 @@ import java.io.IOException; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.command.CopyFileToContainerCmd; public interface DockerCmdExecFactory extends Closeable { @@ -57,6 +58,8 @@ public interface DockerCmdExecFactory extends Closeable { public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); + public CopyFileToContainerCmd.Exec createCopyFileToContainerCmdExec(); + public StopContainerCmd.Exec createStopContainerCmdExec(); public ContainerDiffCmd.Exec createContainerDiffCmdExec(); @@ -83,5 +86,4 @@ public interface DockerCmdExecFactory extends Closeable { @Override public void close() throws IOException; - } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index c64d07b7d..de86ecc5c 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -2,18 +2,77 @@ import static com.github.dockerjava.core.FilePathUtil.relativize; +import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.zip.GZIPOutputStream; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream; import org.apache.commons.io.FileUtils; +import com.google.common.io.ByteStreams; +import com.google.common.io.Closeables; + public class CompressArchiveUtil { + static void putTarEntry(TarArchiveOutputStream tarOutputStream, TarArchiveEntry tarEntry, Path file) throws IOException { + tarEntry.setSize(Files.size(file)); + tarOutputStream.putArchiveEntry(tarEntry); + InputStream input = new BufferedInputStream(Files.newInputStream(file)); + try { + ByteStreams.copy(input, tarOutputStream); + tarOutputStream.closeArchiveEntry(); + } finally { + input.close(); + } + } + + /** + * Recursively tar file + * + * @param inputPath file path can be directory + * @param outputPath where to put the archived file + * @param childrenOnly if inputPath is directory and if childrenOnly is true, the archive will contain all of its children, else the archive contains unique + * entry which is the inputPath itself + * @param gZipped compress with gzip algorithm + */ + public static void tar(Path inputPath, Path outputPath, boolean gZipped, boolean childrenOnly) throws IOException { + if (!Files.exists(inputPath)) { + throw new FileNotFoundException("File not found " + inputPath); + } + FileUtils.touch(outputPath.toFile()); + OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(outputPath)); + if (gZipped) { + outputStream = new GzipCompressorOutputStream(outputStream); + } + TarArchiveOutputStream tarArchiveOutputStream = new TarArchiveOutputStream(outputStream); + tarArchiveOutputStream.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); + try { + if (!Files.isDirectory(inputPath)) { + putTarEntry(tarArchiveOutputStream, new TarArchiveEntry(inputPath.getFileName().toString()), inputPath); + } else { + Path sourcePath = inputPath; + if (!childrenOnly) { + // In order to have the dossier as the root entry + sourcePath = inputPath.getParent(); + } + Files.walkFileTree(inputPath, new TarDirWalker(sourcePath, tarArchiveOutputStream)); + } + tarArchiveOutputStream.flush(); + } finally { + Closeables.close(tarArchiveOutputStream, true); + } + } + public static File archiveTARFiles(File base, Iterable files, String archiveNameWithOutExtension) throws IOException { File tarFile = new File(FileUtils.getTempDirectoryPath(), archiveNameWithOutExtension + ".tar"); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index b00a7a7f9..9725116f6 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -1,5 +1,12 @@ package com.github.dockerjava.core; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.AuthCmd; @@ -46,6 +53,8 @@ import com.github.dockerjava.core.command.CommitCmdImpl; import com.github.dockerjava.core.command.ContainerDiffCmdImpl; import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; +import com.github.dockerjava.core.command.CopyFileToContainerCmd; +import com.github.dockerjava.core.command.CopyFileToContainerCmdImpl; import com.github.dockerjava.core.command.CreateContainerCmdImpl; import com.github.dockerjava.core.command.CreateImageCmdImpl; import com.github.dockerjava.core.command.EventsCmdImpl; @@ -77,16 +86,8 @@ import com.github.dockerjava.core.command.VersionCmdImpl; import com.github.dockerjava.core.command.WaitContainerCmdImpl; -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - -import static com.google.common.base.Preconditions.checkNotNull; - /** * @author Konstantin Pelykh (kpelykh@gmail.com) - * * @see "https://github.com/docker/docker/blob/master/api/client/commands.go" */ public class DockerClientImpl implements Closeable, DockerClient { @@ -304,6 +305,12 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, Str containerId, resource); } + @Override + public CopyFileToContainerCmd copyFileToContainerCmd(String containerId, String hostResource) { + return new CopyFileToContainerCmdImpl(getDockerCmdExecFactory().createCopyFileToContainerCmdExec(), + containerId, hostResource); + } + @Override public ContainerDiffCmd containerDiffCmd(String containerId) { return new ContainerDiffCmdImpl(getDockerCmdExecFactory().createContainerDiffCmdExec(), containerId); diff --git a/src/main/java/com/github/dockerjava/core/FilePathUtil.java b/src/main/java/com/github/dockerjava/core/FilePathUtil.java index b02821bde..94e7fd9be 100644 --- a/src/main/java/com/github/dockerjava/core/FilePathUtil.java +++ b/src/main/java/com/github/dockerjava/core/FilePathUtil.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Path; import com.github.dockerjava.api.DockerClientException; @@ -9,11 +10,9 @@ public class FilePathUtil { /** * Return the relative path. Path elements are separated with / char. - * - * @param baseDir - * a parent directory of {@code file} - * @param file - * the file to get the relative path + * + * @param baseDir a parent directory of {@code file} + * @param file the file to get the relative path * @return the relative path */ public static String relativize(File baseDir, File file) { @@ -26,4 +25,21 @@ public static String relativize(File baseDir, File file) { throw new DockerClientException(e.getMessage(), e); } } + + /** + * Return the relative path. Path elements are separated with / char. + * + * @param baseDir a parent directory of {@code file} + * @param file the file to get the relative path + * @return the relative path + */ + public static String relativize(Path baseDir, Path file) { + String path = baseDir.toUri().relativize(file.toUri()).getPath(); + if (!"/".equals(baseDir.getFileSystem().getSeparator())) { + // For windows + return path.replace(baseDir.getFileSystem().getSeparator(), "/"); + } else { + return path; + } + } } diff --git a/src/main/java/com/github/dockerjava/core/TarDirWalker.java b/src/main/java/com/github/dockerjava/core/TarDirWalker.java new file mode 100644 index 000000000..091d9d3a6 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/TarDirWalker.java @@ -0,0 +1,46 @@ +package com.github.dockerjava.core; + +import static com.github.dockerjava.core.FilePathUtil.relativize; + +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; + +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; + +import com.google.common.io.Closeables; + +public class TarDirWalker extends SimpleFileVisitor { + + private Path basePath; + + private TarArchiveOutputStream tarArchiveOutputStream; + + public TarDirWalker(Path basePath, TarArchiveOutputStream tarArchiveOutputStream) { + this.basePath = basePath; + this.tarArchiveOutputStream = tarArchiveOutputStream; + } + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + if (!dir.equals(basePath)) { + tarArchiveOutputStream.putArchiveEntry(new TarArchiveEntry(relativize(basePath, dir))); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + CompressArchiveUtil.putTarEntry(tarArchiveOutputStream, new TarArchiveEntry(relativize(basePath, file)), file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + Closeables.close(tarArchiveOutputStream, true); + throw exc; + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index ef5f86a7a..e8e2503e1 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -6,24 +6,19 @@ import org.apache.commons.lang.builder.ToStringBuilder; -import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; /** - * * Copy files or folders from a container. - * */ public class CopyFileFromContainerCmdImpl extends AbstrDockerCmd implements CopyFileFromContainerCmd { private String containerId; - @JsonProperty("HostPath") private String hostPath = "."; - @JsonProperty("Resource") private String resource; public CopyFileFromContainerCmdImpl(CopyFileFromContainerCmd.Exec exec, String containerId, String resource) { @@ -70,12 +65,11 @@ public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { @Override public String toString() { - return new ToStringBuilder(this).append("cp ").append(containerId).append(":").append(resource).toString(); + return new ToStringBuilder(this).append("cp ").append(hostPath).append(" ").append(containerId).append(":").append(resource).toString(); } /** - * @throws NotFoundException - * No such container + * @throws NotFoundException No such container */ @Override public InputStream exec() throws NotFoundException { diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmd.java b/src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmd.java new file mode 100644 index 000000000..1c66be241 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmd.java @@ -0,0 +1,62 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.api.command.SyncDockerCmd; + +public interface CopyFileToContainerCmd extends SyncDockerCmd { + + public String getContainerId(); + + public String getHostResource(); + + public boolean isNoOverwriteDirNonDir(); + + public boolean isDirChildrenOnly(); + + /** + * Set container's id + * + * @param containerId id of the container to copy file to + * @return this + */ + public CopyFileToContainerCmd withContainerId(String containerId); + + /** + * Set path to the resource on the host machine + * + * @param resource path to the resource on the host machine + * @return this + */ + public CopyFileToContainerCmd withHostResource(String resource); + + /** + * If set to true then it will be an error if unpacking the given content would cause an existing directory to be replaced with a non-directory and vice versa + * + * @param noOverwriteDirNonDir flag to know if non directory can be overwritten + * @return this + */ + public CopyFileToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir); + + /** + * If this flag is set to true, all children of the local directory will be copied to the remote without the root directory. + * For ex: if I have root/titi and root/tata and the remote path is /var/data. + * dirChildrenOnly = true will create /var/data/titi and /var/data/tata + * dirChildrenOnly = false will create /var/data/root/titi and /var/data/root/tata + * + * @param dirChildrenOnly if root directory is ignored + * @return this + */ + public CopyFileToContainerCmd withDirChildrenOnly(boolean dirChildrenOnly); + + public String getRemotePath(); + + public CopyFileToContainerCmd withRemotePath(String remotePath); + + @Override + public Void exec() throws NotFoundException; + + public static interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImpl.java new file mode 100644 index 000000000..81d464b9b --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImpl.java @@ -0,0 +1,97 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.github.dockerjava.api.NotFoundException; + +public class CopyFileToContainerCmdImpl extends AbstrDockerCmd implements CopyFileToContainerCmd { + + private String containerId; + + private String remotePath = "."; + + private String hostResource; + + private boolean noOverwriteDirNonDir = false; + + private boolean dirChildrenOnly = false; + + public CopyFileToContainerCmdImpl(CopyFileToContainerCmd.Exec exec, String containerId, String hostResource) { + super(exec); + withContainerId(containerId); + withHostResource(hostResource); + } + + @Override + public CopyFileToContainerCmd withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public CopyFileToContainerCmd withHostResource(String hostResource) { + checkNotNull(hostResource, "hostResource was not specified"); + this.hostResource = hostResource; + return this; + } + + @Override + public String getContainerId() { + return this.containerId; + } + + @Override + public String getHostResource() { + return this.hostResource; + } + + @Override + public boolean isNoOverwriteDirNonDir() { + return this.noOverwriteDirNonDir; + } + + @Override + public CopyFileToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir) { + this.noOverwriteDirNonDir = noOverwriteDirNonDir; + return this; + } + + @Override + public CopyFileToContainerCmd withRemotePath(String remotePath) { + checkNotNull(remotePath, "remotePath was not specified"); + this.remotePath = remotePath; + return this; + } + + @Override + public String getRemotePath() { + return this.remotePath; + } + + @Override + public boolean isDirChildrenOnly() { + return this.dirChildrenOnly; + } + + @Override + public CopyFileToContainerCmd withDirChildrenOnly(boolean dirChildrenOnly) { + this.dirChildrenOnly = dirChildrenOnly; + return this; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("cp ").append(hostResource).append(" ").append(containerId).append(":").append(remotePath).toString(); + } + + /** + * @throws NotFoundException No such container + */ + @Override + public Void exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java index 15185a8d8..4dec7556e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -1,17 +1,16 @@ package com.github.dockerjava.jaxrs; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; -import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.InputStream; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.io.InputStream; -import static javax.ws.rs.client.Entity.entity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; public class CopyFileFromContainerCmdExec extends AbstrSyncDockerCmdExec implements CopyFileFromContainerCmd.Exec { @@ -24,13 +23,12 @@ public CopyFileFromContainerCmdExec(WebTarget baseResource, DockerClientConfig d @Override protected InputStream execute(CopyFileFromContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/copy").resolveTemplate("id", + WebTarget webResource = getBaseResource().path("/containers/{id}/archive").resolveTemplate("id", command.getContainerId()); - LOGGER.trace("POST: " + webResource.toString()); + LOGGER.trace("Get: " + webResource.toString()); - Response response = webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) - .post(entity(command, MediaType.APPLICATION_JSON)); + Response response = webResource.queryParam("path", command.getResource()).request().accept("application/x-tar").get(); return new WrappedResponseInputStream(response); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java new file mode 100644 index 000000000..db44a7551 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.jaxrs; + +import static javax.ws.rs.client.Entity.entity; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import javax.ws.rs.client.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.core.CompressArchiveUtil; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.command.CopyFileToContainerCmd; +import com.google.common.io.Closeables; + +public class CopyFileToContainerCmdExec extends AbstrSyncDockerCmdExec implements CopyFileToContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class); + + public CopyFileToContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(CopyFileToContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/archive").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("PUT: " + webResource.toString()); + InputStream streamToUpload = null; + try { + Path toUpload = Files.createTempFile("docker-java", "tar.gz"); + CompressArchiveUtil.tar(Paths.get(command.getHostResource()), toUpload, true, command.isDirChildrenOnly()); + streamToUpload = Files.newInputStream(toUpload); + webResource + .queryParam("path", command.getRemotePath()) + .queryParam("noOverwriteDirNonDir", command.isNoOverwriteDirNonDir()) + .request() + .put(entity(streamToUpload, "application/x-tar")) + .close(); + return null; + } catch (IOException e) { + throw new DockerClientException("Error occurred while preparing uploading host resource <" + command.getHostResource() + ">", e); + } finally { + if (streamToUpload != null) { + Closeables.closeQuietly(streamToUpload); + } + } + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index c331f461c..24a70be4a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -41,6 +41,7 @@ import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.RemoteApiVersion; +import com.github.dockerjava.core.command.CopyFileToContainerCmd; import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; @@ -315,6 +316,11 @@ public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public CopyFileToContainerCmd.Exec createCopyFileToContainerCmdExec() { + return new CopyFileToContainerCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public StopContainerCmd.Exec createStopContainerCmdExec() { return new StopContainerCmdExec(getBaseResource(), getDockerClientConfig()); diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index e8c98d902..bba339991 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -38,7 +38,7 @@ public abstract class AbstractDockerClientTest extends Assert { public static final Logger LOG = LoggerFactory.getLogger(AbstractDockerClientTest.class); - private String apiVersion = "1.19"; + private String apiVersion = "1.20"; protected DockerClient dockerClient; diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index fdc582083..5e9f18f06 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -46,13 +46,13 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.core.command.CopyFileToContainerCmd; /** * Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution * for the purpose of automatically cleanup. * * @author marcus - * */ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { @@ -242,6 +242,11 @@ public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { return delegate.createCopyFileFromContainerCmdExec(); } + @Override + public CopyFileToContainerCmd.Exec createCopyFileToContainerCmdExec() { + return delegate.createCopyFileToContainerCmdExec(); + } + @Override public StopContainerCmd.Exec createStopContainerCmdExec() { return delegate.createStopContainerCmdExec(); diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java new file mode 100644 index 000000000..445fc5696 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java @@ -0,0 +1,70 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.not; + +import java.io.InputStream; +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; +import com.google.common.io.Closeables; + +public class CopyFileToContainerCmdImplTest extends AbstractDockerClientTest { + @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 copyToContainer() throws Exception { + // TODO extract this into a shared method + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withName("docker-java-itest-copyFromContainer").withCmd("touch", "/copyFromContainer").exec(); + + LOG.info("Created container: {}", container); + assertThat(container.getId(), not(isEmptyOrNullString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + dockerClient.copyFileToContainerCmd(container.getId(), "src/test/resources/testReadFile").exec(); + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "testReadFile").exec(); + boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied to the container."); + Closeables.closeQuietly(response); + } + + @Test + public void copyToNonExistingContainer() throws Exception { + try { + dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException ignored) { + } + } + +} From 89bb406bfa52d45c6ebcb73f687d25016e7ff22c Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Mon, 19 Oct 2015 22:11:15 +0200 Subject: [PATCH 0022/1032] Use new try syntax for Java to free resources --- .../dockerjava/core/CompressArchiveUtil.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index de86ecc5c..97b05213e 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -20,22 +20,28 @@ import org.apache.commons.io.FileUtils; import com.google.common.io.ByteStreams; -import com.google.common.io.Closeables; public class CompressArchiveUtil { static void putTarEntry(TarArchiveOutputStream tarOutputStream, TarArchiveEntry tarEntry, Path file) throws IOException { tarEntry.setSize(Files.size(file)); tarOutputStream.putArchiveEntry(tarEntry); - InputStream input = new BufferedInputStream(Files.newInputStream(file)); - try { + try (InputStream input = new BufferedInputStream(Files.newInputStream(file))) { ByteStreams.copy(input, tarOutputStream); tarOutputStream.closeArchiveEntry(); - } finally { - input.close(); } } + private static TarArchiveOutputStream buildTarStream(Path outputPath, boolean gZipped) throws IOException { + OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(outputPath)); + if (gZipped) { + outputStream = new GzipCompressorOutputStream(outputStream); + } + TarArchiveOutputStream tarArchiveOutputStream = new TarArchiveOutputStream(outputStream); + tarArchiveOutputStream.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); + return tarArchiveOutputStream; + } + /** * Recursively tar file * @@ -50,13 +56,8 @@ public static void tar(Path inputPath, Path outputPath, boolean gZipped, boolean throw new FileNotFoundException("File not found " + inputPath); } FileUtils.touch(outputPath.toFile()); - OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(outputPath)); - if (gZipped) { - outputStream = new GzipCompressorOutputStream(outputStream); - } - TarArchiveOutputStream tarArchiveOutputStream = new TarArchiveOutputStream(outputStream); - tarArchiveOutputStream.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); - try { + + try (TarArchiveOutputStream tarArchiveOutputStream = buildTarStream(outputPath, gZipped)) { if (!Files.isDirectory(inputPath)) { putTarEntry(tarArchiveOutputStream, new TarArchiveEntry(inputPath.getFileName().toString()), inputPath); } else { @@ -68,8 +69,6 @@ public static void tar(Path inputPath, Path outputPath, boolean gZipped, boolean Files.walkFileTree(inputPath, new TarDirWalker(sourcePath, tarArchiveOutputStream)); } tarArchiveOutputStream.flush(); - } finally { - Closeables.close(tarArchiveOutputStream, true); } } From 187d88967e0d72ee314d89fe72002e8867e5f427 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Wed, 21 Oct 2015 13:21:30 +0200 Subject: [PATCH 0023/1032] issue #349 Remove the ServiceLoader logic, as there will be only one implementation of DockerCmdExecFactory --- .../dockerjava/core/DockerClientBuilder.java | 32 ++----------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java index 28c84cab5..6aed6c358 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java @@ -1,26 +1,12 @@ package com.github.dockerjava.core; -import java.util.Iterator; -import java.util.ServiceLoader; - import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.core.DockerClientConfig.DockerClientConfigBuilder; +import com.github.dockerjava.jaxrs.DockerCmdExecFactoryImpl; public class DockerClientBuilder { - private static Class factoryClass; - - private static ServiceLoader serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class); - - static { - serviceLoader.reload(); - Iterator iterator = serviceLoader.iterator(); - if (iterator.hasNext()) { - factoryClass = iterator.next().getClass(); - } - } - private DockerClientImpl dockerClient = null; private DockerCmdExecFactory dockerCmdExecFactory = null; @@ -46,16 +32,7 @@ public static DockerClientBuilder getInstance(String serverUrl) { } public static DockerCmdExecFactory getDefaultDockerCmdExecFactory() { - if (factoryClass == null) { - throw new RuntimeException("Fatal: Can't find any implementation of '" - + DockerCmdExecFactory.class.getName() + "' in the current classpath."); - } - - try { - return factoryClass.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new RuntimeException("Fatal: Can't create new instance of '" + factoryClass.getName() + "'"); - } + return new DockerCmdExecFactoryImpl(); } public DockerClientBuilder withDockerCmdExecFactory(DockerCmdExecFactory dockerCmdExecFactory) { @@ -63,11 +40,6 @@ public DockerClientBuilder withDockerCmdExecFactory(DockerCmdExecFactory dockerC return this; } - public DockerClientBuilder withServiceLoaderClassLoader(ClassLoader classLoader) { - serviceLoader = ServiceLoader.load(DockerCmdExecFactory.class, classLoader); - return this; - } - public DockerClient build() { if (dockerCmdExecFactory != null) { dockerClient.withDockerCmdExecFactory(dockerCmdExecFactory); From c58d24a39e546832acd58b1a40ed1d6ab3f240a3 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 21 Oct 2015 21:23:40 +0200 Subject: [PATCH 0024/1032] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 969f6583c..d881294ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Change Log === Latest SNAPSHOT version --- +* [#350] (https://github.com/docker-java/docker-java/pull/350) Remove ServiceLoader logic * [#344] (https://github.com/docker-java/docker-java/pull/344) Implement equals/hashCode for Filters * [#335] (https://github.com/docker-java/docker-java/pull/335) Improve backward-compatibility support for older API versions * [#333] (https://github.com/docker-java/docker-java/pull/333) Adding support for withPidMode From 90f4aba1d107ee9d721f643a0ce1cc7ef6c0570d Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Fri, 30 Oct 2015 18:12:32 +0100 Subject: [PATCH 0025/1032] Use java 7 to close stream --- .../jaxrs/CopyFileToContainerCmdExec.java | 18 +++++++----------- .../CopyFileToContainerCmdImplTest.java | 9 ++++----- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java index db44a7551..ca7c3d9b8 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java @@ -17,7 +17,6 @@ import com.github.dockerjava.core.CompressArchiveUtil; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.command.CopyFileToContainerCmd; -import com.google.common.io.Closeables; public class CopyFileToContainerCmdExec extends AbstrSyncDockerCmdExec implements CopyFileToContainerCmd.Exec { @@ -27,17 +26,19 @@ public CopyFileToContainerCmdExec(WebTarget baseResource, DockerClientConfig doc super(baseResource, dockerClientConfig); } + private InputStream buildUploadStream(CopyFileToContainerCmd command) throws IOException { + Path toUpload = Files.createTempFile("docker-java", ".tar.gz"); + CompressArchiveUtil.tar(Paths.get(command.getHostResource()), toUpload, true, command.isDirChildrenOnly()); + return Files.newInputStream(toUpload); + } + @Override protected Void execute(CopyFileToContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/archive").resolveTemplate("id", command.getContainerId()); LOGGER.trace("PUT: " + webResource.toString()); - InputStream streamToUpload = null; - try { - Path toUpload = Files.createTempFile("docker-java", "tar.gz"); - CompressArchiveUtil.tar(Paths.get(command.getHostResource()), toUpload, true, command.isDirChildrenOnly()); - streamToUpload = Files.newInputStream(toUpload); + try (InputStream streamToUpload = buildUploadStream(command)) { webResource .queryParam("path", command.getRemotePath()) .queryParam("noOverwriteDirNonDir", command.isNoOverwriteDirNonDir()) @@ -47,11 +48,6 @@ protected Void execute(CopyFileToContainerCmd command) { return null; } catch (IOException e) { throw new DockerClientException("Error occurred while preparing uploading host resource <" + command.getHostResource() + ">", e); - } finally { - if (streamToUpload != null) { - Closeables.closeQuietly(streamToUpload); - } } } - } diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java index 445fc5696..7bee960b4 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java @@ -17,7 +17,6 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; -import com.google.common.io.Closeables; public class CopyFileToContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest @@ -52,10 +51,10 @@ public void copyToContainer() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); dockerClient.copyFileToContainerCmd(container.getId(), "src/test/resources/testReadFile").exec(); - InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "testReadFile").exec(); - boolean bytesAvailable = response.available() > 0; - assertTrue(bytesAvailable, "The file was not copied to the container."); - Closeables.closeQuietly(response); + try (InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "testReadFile").exec()) { + boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied to the container."); + } } @Test From 05524c0dd097979060bc5d937ecd0732ae02fc19 Mon Sep 17 00:00:00 2001 From: gandrianakis Date: Mon, 2 Nov 2015 18:44:24 +0200 Subject: [PATCH 0026/1032] Small doc fixes --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fc86bd39c..591161862 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,11 @@ listening on TCP port. To allow Docker server to use TCP add the following line 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 url: +However you can force docker-java to use UNIX socket communication by configuring the following url: unix:///var/run/docker.sock -More details setting up Docker server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/ +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: From 7a15817834662213b59f9c45c2b1618ea0fdb184 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 4 Nov 2015 12:22:59 +0100 Subject: [PATCH 0027/1032] Fix issue #348 --- .../api/command/WaitContainerCmd.java | 9 ++- .../dockerjava/api/model/WaitResponse.java | 19 +++++ .../core/async/ResultCallbackTemplate.java | 19 ++++- .../core/command/WaitContainerCmdImpl.java | 5 +- .../command/WaitContainerResultCallback.java | 75 +++++++++++++++++++ .../jaxrs/WaitContainerCmdExec.java | 27 ++++--- .../dockerjava/client/DockerClientTest.java | 3 +- .../core/command/BuildImageCmdImplTest.java | 2 +- .../command/ContainerDiffCmdImplTest.java | 2 +- .../core/command/FrameReaderITest.java | 3 +- .../core/command/LogContainerCmdImplTest.java | 12 +-- .../command/RemoveContainerCmdImplTest.java | 2 +- .../command/StartContainerCmdImplTest.java | 2 +- .../command/WaitContainerCmdImplTest.java | 43 +++++++++-- 14 files changed, 190 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/model/WaitResponse.java create mode 100644 src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java diff --git a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java index 2accc3af9..f92ca655a 100644 --- a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java @@ -1,13 +1,16 @@ package com.github.dockerjava.api.command; import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.api.model.WaitResponse; /** * Wait a container * * Block until container stops, then returns its exit code */ -public interface WaitContainerCmd extends SyncDockerCmd { +public interface WaitContainerCmd extends AsyncDockerCmd { public String getContainerId(); @@ -18,9 +21,9 @@ public interface WaitContainerCmd extends SyncDockerCmd { * container not found */ @Override - public Integer exec() throws NotFoundException; + public > T exec(T resultCallback); - public static interface Exec extends DockerCmdSyncExec { + public static interface Exec extends DockerCmdAsyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/api/model/WaitResponse.java b/src/main/java/com/github/dockerjava/api/model/WaitResponse.java new file mode 100644 index 000000000..578e44f1e --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/WaitResponse.java @@ -0,0 +1,19 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + + +/** + * Represents a wait container command response + */ +@JsonIgnoreProperties(ignoreUnknown = false) +public class WaitResponse { + + @JsonProperty("StatusCode") + private Integer statusCode; + + public Integer getStatusCode() { + return statusCode; + } +} 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 b5387ede0..5ca32c3b7 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import com.github.dockerjava.api.async.ResultCallback; +import com.google.common.base.Throwables; /** * Abstract template implementation of {@link ResultCallback} @@ -30,6 +31,8 @@ public abstract class ResultCallbackTemplate implements WaitContainerCmd { +public class WaitContainerCmdImpl extends AbstrAsyncDockerCmd implements WaitContainerCmd { private String containerId; diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java new file mode 100644 index 000000000..48f2749dc --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java @@ -0,0 +1,75 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import java.util.concurrent.TimeUnit; + +import javax.annotation.CheckForNull; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.WaitResponse; +import com.github.dockerjava.core.async.ResultCallbackTemplate; +import com.google.common.base.Throwables; + +/** + * + * @author marcus + * + */ +public class WaitContainerResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(WaitContainerResultCallback.class); + + @CheckForNull + private WaitResponse waitResponse = null; + + @Override + public void onNext(WaitResponse waitResponse) { + this.waitResponse = waitResponse; + LOGGER.debug(waitResponse.toString()); + } + + /** + * Awaits the status code from the container. + * + * @throws DockerClientException + * if the wait operation fails. + */ + public Integer awaitStatusCode() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + return getStatusCode(); + } + + /** + * Awaits the status code from the container. + * + * @throws DockerClientException + * if the wait operation fails. + */ + public Integer awaitStatusCode(long timeout, TimeUnit timeUnit) { + try { + awaitCompletion(timeout, timeUnit); + } catch (InterruptedException e) { + throw new DockerClientException("Awaiting status code interrupted: ", e); + } + + return getStatusCode(); + } + + private Integer getStatusCode() { + if (waitResponse == null) { + throw new DockerClientException("Error while wait container"); + } else { + return waitResponse.getStatusCode(); + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java index 16dab933d..7a91a8b4f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java @@ -1,15 +1,22 @@ package com.github.dockerjava.jaxrs; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.github.dockerjava.api.command.WaitContainerCmd; -import com.github.dockerjava.core.DockerClientConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static javax.ws.rs.client.Entity.entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -public class WaitContainerCmdExec extends AbstrSyncDockerCmdExec implements +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.api.model.WaitResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; + +public class WaitContainerCmdExec extends AbstrAsyncDockerCmdExec implements WaitContainerCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(WaitContainerCmdExec.class); @@ -19,14 +26,16 @@ public WaitContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerCli } @Override - protected Integer execute(WaitContainerCmd command) { + protected AbstractCallbackNotifier callbackNotifier(WaitContainerCmd command, + ResultCallback resultCallback) { + WebTarget webResource = getBaseResource().path("/containers/{id}/wait").resolveTemplate("id", command.getContainerId()); LOGGER.trace("POST: {}", webResource); - ObjectNode ObjectNode = webResource.request().accept(MediaType.APPLICATION_JSON).post(null, ObjectNode.class); - return ObjectNode.get("StatusCode").asInt(); + return new POSTCallbackNotifier(new JsonStreamProcessor( + WaitResponse.class), resultCallback, webResource.request().accept(MediaType.APPLICATION_JSON), entity(null, MediaType.APPLICATION_JSON)); } } diff --git a/src/test/java/com/github/dockerjava/client/DockerClientTest.java b/src/test/java/com/github/dockerjava/client/DockerClientTest.java index 0141e01ac..73cf49571 100644 --- a/src/test/java/com/github/dockerjava/client/DockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/DockerClientTest.java @@ -16,6 +16,7 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.core.command.WaitContainerResultCallback; /** * Unit test for DockerClient. @@ -61,7 +62,7 @@ public void testRunShlex() throws DockerException { CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(commands).exec(); dockerClient.startContainerCmd(container.getId()); - int exitcode = dockerClient.waitContainerCmd(container.getId()).exec(); + int exitcode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); assertThat(exitcode, equalTo(0)); } } 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 22030cc9f..6f4f0e3f4 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -158,7 +158,7 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception { assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.waitContainerCmd(container.getId()).exec(); + dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); return containerLog(container.getId()); } 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 3db2b7282..f7602ff5a 100644 --- a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java @@ -53,7 +53,7 @@ public void testContainerDiff() throws DockerException { assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()).exec(); - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); assertThat(exitCode, equalTo(0)); List filesystemDiff = dockerClient.containerDiffCmd(container.getId()).exec(); diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index 5b1df2241..4ca4f7b5b 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -41,7 +41,8 @@ public void deleteDockerContainerImage() throws Exception { public void canCloseFrameReaderAndReadExpectedLines() throws Exception { // wait for the container to be successfully executed - int exitCode = dockerClient.waitContainerCmd(dockerfileFixture.getContainerId()).exec(); + int exitCode = dockerClient.waitContainerCmd(dockerfileFixture.getContainerId()) + .exec(new WaitContainerResultCallback()).awaitStatusCode(); assertEquals(0, exitCode); Iterator response = getLoggingFrames().iterator(); 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 c3f6ab01c..638cbdc4c 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -17,7 +17,6 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -56,7 +55,8 @@ public void asyncLogContainer() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()) + .awaitStatusCode(); assertThat(exitCode, equalTo(0)); @@ -80,7 +80,7 @@ public void onError(Throwable throwable) { assertEquals(throwable.getClass().getName(), NotFoundException.class.getName()); try { - // close the callback to prevent the call to onFinish + // close the callback to prevent the call to onComplete close(); } catch (IOException e) { throw new RuntimeException(); @@ -111,7 +111,8 @@ public void asyncMultipleLogContainer() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()) + .awaitStatusCode(); assertThat(exitCode, equalTo(0)); @@ -150,7 +151,8 @@ public void asyncLogContainerWithSince() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()) + .awaitStatusCode(); assertThat(exitCode, equalTo(0)); 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 3241f0739..1b39e5ac0 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java @@ -56,7 +56,7 @@ public void removeContainer() throws DockerException { CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.waitContainerCmd(container.getId()).exec(); + dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); LOG.info("Removing container: {}", container.getId()); dockerClient.removeContainerCmd(container.getId()).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 ae323c4c0..560d8cbca 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -87,7 +87,7 @@ public void startContainerWithVolumes() throws DockerException { dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.waitContainerCmd(container.getId()).exec(); + dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); diff --git a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java index 3b5172b9e..d3b38c4e1 100644 --- a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java @@ -19,6 +19,7 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.WaitResponse; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -54,7 +55,8 @@ public void testWaitContainer() throws DockerException { dockerClient.startContainerCmd(container.getId()).exec(); - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()) + .awaitStatusCode(); LOG.info("Container exit code: {}", exitCode); assertThat(exitCode, equalTo(0)); @@ -66,12 +68,39 @@ public void testWaitContainer() throws DockerException { assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(exitCode))); } - @Test + @Test(expectedExceptions = NotFoundException.class) public void testWaitNonExistingContainer() throws DockerException { - try { - dockerClient.waitContainerCmd("non-existing").exec(); - fail("expected NotFoundException"); - } catch (NotFoundException e) { - } + + WaitContainerResultCallback callback = new WaitContainerResultCallback() { + public void onNext(WaitResponse waitResponse) { + fail("expected NotFoundException"); + }; + }; + + dockerClient.waitContainerCmd("non-existing").exec(callback).awaitStatusCode(); + } + + @Test + public void testWaitContainerAbort() throws Exception { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + WaitContainerResultCallback callback = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()); + + Thread.sleep(5000); + + callback.close(); + + dockerClient.killContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); } } From 7ec816d4c560d3dffb5c58e218e61c26c9e1cd54 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 4 Nov 2015 12:30:49 +0100 Subject: [PATCH 0028/1032] [maven-release-plugin] prepare release docker-java-2.1.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index af8e20bf0..a9742ce9d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.1.2-SNAPSHOT + 2.1.2 docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - HEAD + docker-java-2.1.2 From b06e71f218b31b2b513708695bfbeca6922d61e0 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 4 Nov 2015 12:30:53 +0100 Subject: [PATCH 0029/1032] [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 a9742ce9d..debfb672e 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.1.2 + 2.1.3-SNAPSHOT docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - docker-java-2.1.2 + HEAD From 3ceef6ce2dcdb301e05b6293d042874a026eebb5 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 4 Nov 2015 12:33:40 +0100 Subject: [PATCH 0030/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d881294ff..50f95f871 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ Change Log === -Latest SNAPSHOT version +v2.1.2 --- * [#350] (https://github.com/docker-java/docker-java/pull/350) Remove ServiceLoader logic * [#344] (https://github.com/docker-java/docker-java/pull/344) Implement equals/hashCode for Filters From 2a4bf8abb631b4ad26a5c9d837516e9af963ebb7 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 4 Nov 2015 12:34:07 +0100 Subject: [PATCH 0031/1032] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 591161862..54ebe56ac 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Run build without integration tests: com.github.docker-java docker-java - 2.1.1 + 2.1.2 ### Latest SNAPSHOT version @@ -74,7 +74,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [ com.github.docker-java docker-java - 2.1.2-SNAPSHOT + 2.1.3-SNAPSHOT ## Documentation From d25eea146681314d7178567a5777167335c9dd31 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 4 Nov 2015 14:27:51 +0100 Subject: [PATCH 0032/1032] Added @CheckForNull annotation --- .../github/dockerjava/core/async/ResultCallbackTemplate.java | 3 +++ 1 file changed, 3 insertions(+) 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 5ca32c3b7..44af625af 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -8,6 +8,8 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import javax.annotation.CheckForNull; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,6 +98,7 @@ public RC_T awaitCompletion(long timeout, TimeUnit timeUnit) throws InterruptedE return (RC_T) this; } + @CheckForNull protected RuntimeException getFirstError() { if (firstError != null) { // this call throws a RuntimeException From 1584e0db7509f4f079526d7c5e5f3c0bba8bbd0e Mon Sep 17 00:00:00 2001 From: Simon Webb Date: Thu, 5 Nov 2015 11:24:41 +0000 Subject: [PATCH 0033/1032] Added override for bulk-read variant of InputStream.read() in anonymous inner class created by Dockerfile.ScannedResult.buildDockerFolderTar(). This fixes an IO performance issue that occurs when only the single-byte variant of the read() method on InputStream is overriden. --- .../com/github/dockerjava/core/dockerfile/Dockerfile.java | 5 +++++ 1 file changed, 5 insertions(+) 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 9c8ef428d..38f40fc7a 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -142,6 +142,11 @@ public int read() throws IOException { return tarInputStream.read(); } + @Override + public int read(byte [] buff, int offset, int len) throws IOException { + return tarInputStream.read(buff, offset, len); + } + @Override public void close() throws IOException { IOUtils.closeQuietly(tarInputStream); From 9a172ad5fbb90bb763b646397dbd3f469f4616eb Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 5 Nov 2015 15:34:25 +0100 Subject: [PATCH 0034/1032] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50f95f871..d5674c7fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ Change Log === +Latest SNAPSHOT +--- +* [#357] (https://github.com/docker-java/docker-java/pull/357) Wait container command needs possibility to abort operation + v2.1.2 --- * [#350] (https://github.com/docker-java/docker-java/pull/350) Remove ServiceLoader logic From cc5b11a7407d5ab89d5e1564b6ea86f7bad63adf Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 5 Nov 2015 15:47:18 +0100 Subject: [PATCH 0035/1032] Bump to version 3.0.0-SNAPSHOT according to semver --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index debfb672e..dfee63050 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.1.3-SNAPSHOT + 3.0.0-SNAPSHOT docker-java https://github.com/docker-java/docker-java From 901654b77e7fc64d2d8630ef214c6c52927878c8 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 5 Nov 2015 15:47:31 +0100 Subject: [PATCH 0036/1032] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 54ebe56ac..26ec653ac 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ You can find the latest SNAPSHOT version including javadoc and source files on [ com.github.docker-java docker-java - 2.1.3-SNAPSHOT + 3.0.0-SNAPSHOT ## Documentation From df8c13f5271ef3cc97c65bd42854c5a0e8920931 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 5 Nov 2015 16:40:02 +0100 Subject: [PATCH 0037/1032] Added missing withXXX(List list) methods --- .../api/command/CreateContainerCmd.java | 20 +++++++- .../core/command/CreateContainerCmdImpl.java | 49 ++++++++++++++----- 2 files changed, 54 insertions(+), 15 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 accaf801b..0a070acfa 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -21,8 +21,6 @@ import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumesFrom; -import javax.annotation.CheckForNull; - public interface CreateContainerCmd extends SyncDockerCmd { @CheckForNull @@ -189,6 +187,8 @@ public interface CreateContainerCmd extends SyncDockerCmd binds); + /** * @since 1.19 */ @@ -201,6 +201,13 @@ public interface CreateContainerCmd extends SyncDockerCmdkernel capability to the + * container. For example: adding {@link Capability#MKNOD} allows the container to create special files using the + * 'mknod' command. + */ + public CreateContainerCmd withCapAdd(List capAdd); + /** * Drop linux kernel capability from the * container. For example: dropping {@link Capability#CHOWN} prevents the container from changing the owner of any @@ -208,8 +215,17 @@ public interface CreateContainerCmd extends SyncDockerCmdkernel capability from the + * container. For example: dropping {@link Capability#CHOWN} prevents the container from changing the owner of any + * files. + */ + public CreateContainerCmd withCapDrop(List capDrop); + public CreateContainerCmd withCmd(String... cmd); + public CreateContainerCmd withCmd(List cmd); + public CreateContainerCmd withContainerIDFile(String containerIDFile); /** 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 84d544a3c..41f31dee4 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -106,7 +106,6 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd labels; - public CreateContainerCmdImpl(CreateContainerCmd.Exec exec, String image) { super(exec); checkNotNull(image, "image was not specified"); @@ -428,6 +427,12 @@ public CreateContainerCmd withBinds(Bind... binds) { return this; } + @Override + public CreateContainerCmd withBinds(List binds) { + checkNotNull(binds, "binds was not specified"); + return withBinds(binds.toArray(new Bind[binds.size()])); + } + @Override public CreateContainerCmd withBlkioWeight(Integer blkioWeight) { checkNotNull(blkioWeight, "blkioWeight was not specified"); @@ -442,6 +447,12 @@ public CreateContainerCmd withCapAdd(Capability... capAdd) { return this; } + @Override + public CreateContainerCmd withCapAdd(List capAdd) { + checkNotNull(capAdd, "capAdd was not specified"); + return withCapAdd(capAdd.toArray(new Capability[capAdd.size()])); + } + @Override public CreateContainerCmd withCapDrop(Capability... capDrop) { checkNotNull(capDrop, "capDrop was not specified"); @@ -449,6 +460,12 @@ public CreateContainerCmd withCapDrop(Capability... capDrop) { return this; } + @Override + public CreateContainerCmd withCapDrop(List capDrop) { + checkNotNull(capDrop, "capDrop was not specified"); + return withCapDrop(capDrop.toArray(new Capability[capDrop.size()])); + } + @Override public CreateContainerCmd withCmd(String... cmd) { checkNotNull(cmd, "cmd was not specified"); @@ -456,6 +473,12 @@ public CreateContainerCmd withCmd(String... cmd) { return this; } + @Override + public CreateContainerCmd withCmd(List cmd) { + checkNotNull(cmd, "cmd was not specified"); + return withCmd(cmd.toArray(new String[cmd.size()])); + } + @Override public CreateContainerCmd withContainerIDFile(String containerIDFile) { checkNotNull(containerIDFile, "no containerIDFile was specified"); @@ -481,7 +504,7 @@ public CreateContainerCmd withCpusetCpus(String cpusetCpus) { public CreateContainerCmd withCpusetMems(String cpusetMems) { checkNotNull(cpusetMems, "cpusetMems was not specified"); hostConfig.setCpusetMems(cpusetMems); - return null; + return this; } @Override @@ -501,7 +524,7 @@ public CreateContainerCmd withDevices(Device... devices) { @Override public CreateContainerCmd withDevices(List devices) { checkNotNull(devices, "devices was not specified"); - return withDevices(devices.toArray(new Device[0])); + return withDevices(devices.toArray(new Device[devices.size()])); } @Override @@ -514,7 +537,7 @@ public CreateContainerCmd withDns(String... dns) { @Override public CreateContainerCmd withDns(List dns) { checkNotNull(dns, "dns was not specified"); - return withDns(dns.toArray(new String[0])); + return withDns(dns.toArray(new String[dns.size()])); } @Override @@ -547,7 +570,7 @@ public CreateContainerCmd withEntrypoint(String... entrypoint) { @Override public CreateContainerCmd withEntrypoint(List entrypoint) { checkNotNull(entrypoint, "entrypoint was not specified"); - return withEntrypoint(entrypoint.toArray(new String[0])); + return withEntrypoint(entrypoint.toArray(new String[entrypoint.size()])); } @Override @@ -560,7 +583,7 @@ public CreateContainerCmd withEnv(String... env) { @Override public CreateContainerCmd withEnv(List env) { checkNotNull(env, "env was not specified"); - return withEnv(env.toArray(new String[0])); + return withEnv(env.toArray(new String[env.size()])); } @Override @@ -573,7 +596,7 @@ public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts) { @Override public CreateContainerCmd withExposedPorts(List exposedPorts) { checkNotNull(exposedPorts, "exposedPorts was not specified"); - return withExposedPorts(exposedPorts.toArray(new ExposedPort[0])); + return withExposedPorts(exposedPorts.toArray(new ExposedPort[exposedPorts.size()])); } @Override @@ -586,7 +609,7 @@ public CreateContainerCmd withExtraHosts(String... extraHosts) { @Override public CreateContainerCmd withExtraHosts(List extraHosts) { checkNotNull(extraHosts, "extraHosts was not specified"); - return withExtraHosts(extraHosts.toArray(new String[0])); + return withExtraHosts(extraHosts.toArray(new String[extraHosts.size()])); } @Override @@ -620,7 +643,7 @@ public CreateContainerCmd withLinks(Link... links) { @Override public CreateContainerCmd withLinks(List links) { checkNotNull(links, "links was not specified"); - return withLinks(links.toArray(new Link[0])); + return withLinks(links.toArray(new Link[links.size()])); } @Override @@ -722,7 +745,7 @@ public CreateContainerCmd withPortSpecs(String... portSpecs) { @Override public CreateContainerCmd withPortSpecs(List portSpecs) { checkNotNull(portSpecs, "portSpecs was not specified"); - return withPortSpecs(portSpecs.toArray(new String[0])); + return withPortSpecs(portSpecs.toArray(new String[portSpecs.size()])); } @Override @@ -784,7 +807,7 @@ public CreateContainerCmd withUlimits(Ulimit... ulimits) { @Override public CreateContainerCmd withUlimits(List ulimits) { checkNotNull(ulimits, "no ulimits was specified"); - return withUlimits(ulimits.toArray(new Ulimit[0])); + return withUlimits(ulimits.toArray(new Ulimit[ulimits.size()])); } @Override @@ -804,7 +827,7 @@ public CreateContainerCmd withVolumes(Volume... volumes) { @Override public CreateContainerCmd withVolumes(List volumes) { checkNotNull(volumes, "volumes was not specified"); - return withVolumes(volumes.toArray(new Volume[0])); + return withVolumes(volumes.toArray(new Volume[volumes.size()])); } @Override @@ -817,7 +840,7 @@ public CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom) { @Override public CreateContainerCmd withVolumesFrom(List volumesFrom) { checkNotNull(volumesFrom, "volumesFrom was not specified"); - return withVolumesFrom(volumesFrom.toArray(new VolumesFrom[0])); + return withVolumesFrom(volumesFrom.toArray(new VolumesFrom[volumesFrom.size()])); } @Override From 37bcad634f9ebc689e119466b5c0c659a3e6330e Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 5 Nov 2015 16:46:00 +0100 Subject: [PATCH 0038/1032] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5674c7fe..33bb5b902 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ Change Log === Latest SNAPSHOT --- -* [#357] (https://github.com/docker-java/docker-java/pull/357) Wait container command needs possibility to abort operation +* [#357] (https://github.com/docker-java/docker-java/pull/357) Wait container command needs possibility to abort operation +* [#313] (https://github.com/docker-java/docker-java/pull/313) Refactor primitive type fields to be of object type in JSON objects v2.1.2 --- From e728c42cfca8b3747f2c2dbdccf74afcc0cd4840 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 6 Nov 2015 08:50:04 +0100 Subject: [PATCH 0039/1032] Update CHANGELOG.md --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33bb5b902..6be59e110 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,13 @@ Change Log === -Latest SNAPSHOT +Latest SNAPSHOT (3.0.0-SNAPSHOT) --- +Notes + +* The upcoming release will contain multiple API breaking changes therefore the major version switch + +All changes + * [#357] (https://github.com/docker-java/docker-java/pull/357) Wait container command needs possibility to abort operation * [#313] (https://github.com/docker-java/docker-java/pull/313) Refactor primitive type fields to be of object type in JSON objects From cc23307c2fbc89130c28bf7891bfdf52ebb42ca3 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 6 Nov 2015 09:06:46 +0100 Subject: [PATCH 0040/1032] Format sources --- .../com/github/dockerjava/api/model/WaitResponse.java | 3 +-- .../java/com/github/dockerjava/core/GoLangFileMatch.java | 6 +++--- .../dockerjava/core/command/WaitContainerCmdImpl.java | 3 ++- .../com/github/dockerjava/core/dockerfile/Dockerfile.java | 2 +- .../com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java | 2 +- .../github/dockerjava/jaxrs/AttachContainerCmdExec.java | 6 +++--- .../com/github/dockerjava/jaxrs/ListImagesCmdExec.java | 5 ++--- .../com/github/dockerjava/jaxrs/LogContainerCmdExec.java | 8 ++++---- .../github/dockerjava/jaxrs/RestartContainerCmdExec.java | 6 +++--- .../com/github/dockerjava/jaxrs/StopContainerCmdExec.java | 6 +++--- .../com/github/dockerjava/jaxrs/WaitContainerCmdExec.java | 5 +++-- .../dockerjava/client/AbstractDockerClientTest.java | 3 ++- .../com/github/dockerjava/client/DockerClientTest.java | 3 ++- .../core/command/AttachContainerCmdImplTest.java | 8 ++++---- .../dockerjava/core/command/ContainerDiffCmdImplTest.java | 3 ++- .../github/dockerjava/core/command/FrameReaderITest.java | 7 ++++--- .../dockerjava/core/command/LogContainerCmdImplTest.java | 3 ++- .../dockerjava/core/command/WaitContainerCmdImplTest.java | 3 ++- 18 files changed, 44 insertions(+), 38 deletions(-) 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 578e44f1e..ca6d61eb9 100644 --- a/src/main/java/com/github/dockerjava/api/model/WaitResponse.java +++ b/src/main/java/com/github/dockerjava/api/model/WaitResponse.java @@ -3,12 +3,11 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; - /** * Represents a wait container command response */ @JsonIgnoreProperties(ignoreUnknown = false) -public class WaitResponse { +public class WaitResponse { @JsonProperty("StatusCode") private Integer statusCode; diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index 85267e698..6ebdd604b 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -24,16 +24,16 @@ * character class (must be non-empty) * c matches character c (c != '*', '?', '\\', '[') * '\\' c matches character c - * + * * character-range: * c matches character c (c != '\\', '-', ']') * '\\' c matches character c * lo '-' hi matches character c for lo <= c <= hi - * + * * Match requires pattern to match all of name, not just a substring. * The only possible returned error is ErrBadPattern, when pattern * is malformed. - * + * * On Windows, escaping is disabled. Instead, '\\' is treated as * path separator. * diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index af18a5895..eeb05ff60 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -10,7 +10,8 @@ * * Block until container stops, then returns its exit code */ -public class WaitContainerCmdImpl extends AbstrAsyncDockerCmd implements WaitContainerCmd { +public class WaitContainerCmdImpl extends AbstrAsyncDockerCmd implements + WaitContainerCmd { private String containerId; 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 38f40fc7a..c9bd37d1e 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -143,7 +143,7 @@ public int read() throws IOException { } @Override - public int read(byte [] buff, int offset, int len) throws IOException { + public int read(byte[] buff, int offset, int len) throws IOException { return tarInputStream.read(buff, offset, len); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index 10ee7896d..b2c61c13e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -61,7 +61,7 @@ protected boolean bool(Boolean bool) { } protected WebTarget booleanQueryParam(WebTarget webTarget, String name, Boolean value) { - if(bool(value)) { + if (bool(value)) { webTarget = webTarget.queryParam(name, bool(value) + ""); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index d0a5ae8f3..b272adc78 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -25,12 +25,12 @@ public AttachContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerC protected AbstractCallbackNotifier callbackNotifier(AttachContainerCmd command, ResultCallback resultCallback) { - WebTarget webTarget = getBaseResource().path("/containers/{id}/attach") - .resolveTemplate("id", command.getContainerId()); + WebTarget webTarget = getBaseResource().path("/containers/{id}/attach").resolveTemplate("id", + command.getContainerId()); webTarget = booleanQueryParam(webTarget, "logs", command.hasLogsEnabled()); webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); - //webTarget = booleanQueryParam(webTarget, "stdin", command.hasStdinEnabled()); + // webTarget = booleanQueryParam(webTarget, "stdin", command.hasStdinEnabled()); webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); webTarget = booleanQueryParam(webTarget, "stream", command.hasFollowStreamEnabled()); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 7bfecd1f2..c6422aa52 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -32,9 +32,8 @@ protected List execute(ListImagesCmd command) { LOGGER.trace("GET: {}", webTarget); - List images = webTarget.request().accept(MediaType.APPLICATION_JSON) - .get(new GenericType>() { - }); + List images = webTarget.request().accept(MediaType.APPLICATION_JSON).get(new GenericType>() { + }); LOGGER.trace("Response: {}", images); return images; diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index 086e98a87..349d2e240 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -25,14 +25,14 @@ public LogContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClie protected AbstractCallbackNotifier callbackNotifier(LogContainerCmd command, ResultCallback resultCallback) { - WebTarget webTarget = getBaseResource().path("/containers/{id}/logs") - .resolveTemplate("id", command.getContainerId()); + WebTarget webTarget = getBaseResource().path("/containers/{id}/logs").resolveTemplate("id", + command.getContainerId()); - if(command.getTail() != null) { + if (command.getTail() != null) { webTarget = webTarget.queryParam("tail", command.getTail()); } - if(command.getSince() != null) { + if (command.getSince() != null) { webTarget = webTarget.queryParam("since", command.getSince()); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java index bfc65ae27..496fa450c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RestartContainerCmdExec.java @@ -19,10 +19,10 @@ public RestartContainerCmdExec(WebTarget baseResource, DockerClientConfig docker @Override protected Void execute(RestartContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/restart") - .resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/containers/{id}/restart").resolveTemplate("id", + command.getContainerId()); - if(command.getTimeout() != null) { + if (command.getTimeout() != null) { webResource = webResource.queryParam("t", String.valueOf(command.getTimeout())); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java index ae9834750..eda4e3e30 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StopContainerCmdExec.java @@ -19,10 +19,10 @@ public StopContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerCli @Override protected Void execute(StopContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/stop") - .resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/containers/{id}/stop").resolveTemplate("id", + command.getContainerId()); - if(command.getTimeout() != null) { + if (command.getTimeout() != null) { webResource = webResource.queryParam("t", String.valueOf(command.getTimeout())); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java index 7a91a8b4f..06bd40edc 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/WaitContainerCmdExec.java @@ -34,8 +34,9 @@ protected AbstractCallbackNotifier callbackNotifier(WaitContainerC LOGGER.trace("POST: {}", webResource); - return new POSTCallbackNotifier(new JsonStreamProcessor( - WaitResponse.class), resultCallback, webResource.request().accept(MediaType.APPLICATION_JSON), entity(null, MediaType.APPLICATION_JSON)); + return new POSTCallbackNotifier(new JsonStreamProcessor(WaitResponse.class), + resultCallback, webResource.request().accept(MediaType.APPLICATION_JSON), entity(null, + MediaType.APPLICATION_JSON)); } } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 3c901f29c..ec4aa82be 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -210,7 +210,8 @@ public String toString() { protected String buildImage(File baseDir) throws Exception { - return dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId(); + return dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()) + .awaitImageId(); } } diff --git a/src/test/java/com/github/dockerjava/client/DockerClientTest.java b/src/test/java/com/github/dockerjava/client/DockerClientTest.java index 73cf49571..d3bd75cf5 100644 --- a/src/test/java/com/github/dockerjava/client/DockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/DockerClientTest.java @@ -62,7 +62,8 @@ public void testRunShlex() throws DockerException { CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(commands).exec(); dockerClient.startContainerCmd(container.getId()); - int exitcode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); + int exitcode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()) + .awaitStatusCode(); assertThat(exitcode, equalTo(0)); } } 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 8ba419824..ead8ad39e 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -65,8 +65,8 @@ public void onNext(Frame frame) { }; }; - dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true).withLogs(true) - .exec(callback).awaitCompletion(30, TimeUnit.SECONDS).close(); + dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true) + .withLogs(true).exec(callback).awaitCompletion(30, TimeUnit.SECONDS).close(); assertThat(callback.toString(), containsString(snippet)); } @@ -94,8 +94,8 @@ public void onNext(Frame frame) { }; }; - dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true).exec(callback) - .awaitCompletion(15, TimeUnit.SECONDS).close(); + dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true) + .exec(callback).awaitCompletion(15, TimeUnit.SECONDS).close(); System.out.println("log: " + callback.toString()); 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 f7602ff5a..aa692d2c5 100644 --- a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java @@ -53,7 +53,8 @@ public void testContainerDiff() throws DockerException { assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()).exec(); - int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()) + .awaitStatusCode(); assertThat(exitCode, equalTo(0)); List filesystemDiff = dockerClient.containerDiffCmd(container.getId()).exec(); diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java index cdd2771e9..df616ddba 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -57,9 +57,10 @@ private List getLoggingFrames() throws Exception { FrameReaderITestCallback collectFramesCallback = new FrameReaderITestCallback(); - dockerClient.logContainerCmd(dockerfileFixture.getContainerId()).withStdOut(true).withStdErr(true).withTailAll() - // we can't follow stream here as it blocks reading from resulting InputStream infinitely - // .withFollowStream() + dockerClient.logContainerCmd(dockerfileFixture.getContainerId()).withStdOut(true).withStdErr(true) + .withTailAll() + // we can't follow stream here as it blocks reading from resulting InputStream infinitely + // .withFollowStream() .exec(collectFramesCallback).awaitCompletion(); return collectFramesCallback.frames; 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 0b0f9d031..beb38d885 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -95,7 +95,8 @@ public void onComplete() { }; }; - dockerClient.logContainerCmd("non-existing").withStdErr(true).withStdOut(true).exec(loggingCallback).awaitCompletion(); + dockerClient.logContainerCmd("non-existing").withStdErr(true).withStdOut(true).exec(loggingCallback) + .awaitCompletion(); } @Test diff --git a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java index d3b38c4e1..68d638807 100644 --- a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java @@ -90,7 +90,8 @@ public void testWaitContainerAbort() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - WaitContainerResultCallback callback = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()); + WaitContainerResultCallback callback = dockerClient.waitContainerCmd(container.getId()).exec( + new WaitContainerResultCallback()); Thread.sleep(5000); From be5c1c3a45afb0f76bb981ccafc236fd08e05a72 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 6 Nov 2015 09:10:05 +0100 Subject: [PATCH 0041/1032] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6be59e110..35849bbbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Notes All changes +* [#359] (https://github.com/docker-java/docker-java/pull/359) Fix performance issue of build command by adding bulk-read variant of InputStream.read() * [#357] (https://github.com/docker-java/docker-java/pull/357) Wait container command needs possibility to abort operation * [#313] (https://github.com/docker-java/docker-java/pull/313) Refactor primitive type fields to be of object type in JSON objects From 2d828ad527e41cbfd04b1e9777b0e3a92ea1baee Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 6 Nov 2015 19:06:59 +0100 Subject: [PATCH 0042/1032] Added AHC dependency --- pom.xml | 9 +- .../ahc/AttachContainerCmdExec.java | 101 ++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/github/dockerjava/ahc/AttachContainerCmdExec.java diff --git a/pom.xml b/pom.xml index dfee63050..60fac661f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 @@ -201,6 +202,12 @@ 3.0.0 provided + + + org.asynchttpclient + async-http-client + 2.0.0-alpha22 + diff --git a/src/main/java/com/github/dockerjava/ahc/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/ahc/AttachContainerCmdExec.java new file mode 100644 index 000000000..99be7d507 --- /dev/null +++ b/src/main/java/com/github/dockerjava/ahc/AttachContainerCmdExec.java @@ -0,0 +1,101 @@ +package com.github.dockerjava.ahc; + +import java.io.ByteArrayOutputStream; +import java.net.URL; +import java.util.concurrent.Future; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.async.FrameStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; + +import org.asynchttpclient.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; + +public class AttachContainerCmdExec implements AttachContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(AttachContainerCmdExec.class); + + private URL baseResource; + + private DockerClientConfig dockerClientConfig; + + public AttachContainerCmdExec(URL baseResource, DockerClientConfig dockerClientConfig) { + this.baseResource = baseResource; + this.dockerClientConfig = dockerClientConfig; + } + + // @Override + // protected AbstractCallbackNotifier callbackNotifier(AttachContainerCmd command, + // ResultCallback resultCallback) { + // + // WebTarget webTarget = getBaseResource().path("/containers/{id}/attach").resolveTemplate("id", + // command.getContainerId()); + // + // webTarget = booleanQueryParam(webTarget, "logs", command.hasLogsEnabled()); + // webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); + // // webTarget = booleanQueryParam(webTarget, "stdin", command.hasStdinEnabled()); + // webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); + // webTarget = booleanQueryParam(webTarget, "stream", command.hasFollowStreamEnabled()); + // + // LOGGER.trace("POST: {}", webTarget); + // + // return new POSTCallbackNotifier(new FrameStreamProcessor(), resultCallback, webTarget.request(), null); + // } + + @Override + public Void exec(AttachContainerCmd command, ResultCallback resultCallback) { + AsyncHttpClientConfig config = new DefaultAsyncHttpClientConfig.Builder().build(); + + AsyncHttpClient c = new DefaultAsyncHttpClient(config); + c.prepareGet("http://www.ning.com/").execute(new AsyncHandler() { + private ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + + @Override + public State onStatusReceived(HttpResponseStatus status) throws Exception { + int statusCode = status.getStatusCode(); + // The Status have been read + // If you don't want to read the headers,body or stop processing the response + if (statusCode >= 500) { + return State.ABORT; + } + + return State.CONTINUE; + } + + @Override + public State onHeadersReceived(HttpResponseHeaders h) throws Exception { + + // The headers have been read + // If you don't want to read the body, or stop processing the response + return State.CONTINUE; + } + + @Override + public State onBodyPartReceived(HttpResponseBodyPart bodyPart) throws Exception { + bytes.write(bodyPart.getBodyPartBytes()); + return State.CONTINUE; + } + + @Override + public String onCompleted() throws Exception { + // Will be invoked once the response has been fully read or a ResponseComplete exception + // has been thrown. + // NOTE: should probably use Content-Encoding from headers + return bytes.toString("UTF-8"); + } + + @Override + public void onThrowable(Throwable t) { + } + }); + + return null; + } +} From f8a5fb47fc6e7c724dca8b5d29b9a7cce557bb8e Mon Sep 17 00:00:00 2001 From: Boni Garcia Date: Tue, 10 Nov 2015 17:42:08 +0100 Subject: [PATCH 0043/1032] Deprecate "network" and enable "networks" stats (remote Docker API 1.21) --- .../com/github/dockerjava/api/model/Statistics.java | 11 +++++++++++ 1 file changed, 11 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 f6acf16ee..4e2692014 100644 --- a/src/main/java/com/github/dockerjava/api/model/Statistics.java +++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java @@ -16,6 +16,13 @@ public class Statistics { @JsonProperty("read") private String read; + @JsonProperty("networks") + private Map networksStats; + + /** + * Deprecated as of Docker Remote API 1.21 + */ + @Deprecated @JsonProperty("network") private Map networkStats; @@ -28,6 +35,10 @@ public class Statistics { @JsonProperty("cpu_stats") private Map cpuStats; + public Map getNetworksStats() { + return networksStats; + } + public Map getNetworkStats() { return networkStats; } From ef030277b81e42336747be435c2ee9050550a3ac Mon Sep 17 00:00:00 2001 From: Boni Garcia Date: Tue, 10 Nov 2015 18:01:35 +0100 Subject: [PATCH 0044/1032] Improve JavaDoc and include @CheckForNull Conflicts: src/main/java/com/github/dockerjava/api/model/Statistics.java --- .../github/dockerjava/api/model/Statistics.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 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 4e2692014..ec837a0ac 100644 --- a/src/main/java/com/github/dockerjava/api/model/Statistics.java +++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java @@ -2,6 +2,8 @@ import java.util.Map; +import javax.annotation.CheckForNull; + import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -16,11 +18,15 @@ public class Statistics { @JsonProperty("read") private String read; + /** + * @since Docker Remote API 1.21 + */ + @CheckForNull @JsonProperty("networks") private Map networksStats; /** - * Deprecated as of Docker Remote API 1.21 + * @deprecated as of Docker Remote API 1.21, replaced by {@link #networksStats} */ @Deprecated @JsonProperty("network") @@ -35,10 +41,18 @@ public class Statistics { @JsonProperty("cpu_stats") private Map cpuStats; + /** + * @since Docker Remote API 1.21 + */ + @CheckForNull public Map getNetworksStats() { return networksStats; } + /** + * @deprecated as of Docker Remote API 1.21, replaced by {@link #getNetworksStats()} + */ + @Deprecated public Map getNetworkStats() { return networkStats; } From ee1b8cf6beb7f49b7e246109b1bf6de8ea272fcf Mon Sep 17 00:00:00 2001 From: Boni Garcia Date: Wed, 11 Nov 2015 13:36:55 +0100 Subject: [PATCH 0045/1032] Remove "Stats" from "networks" field in statistics --- .../com/github/dockerjava/api/model/Statistics.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 ec837a0ac..c4daf0573 100644 --- a/src/main/java/com/github/dockerjava/api/model/Statistics.java +++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java @@ -23,10 +23,10 @@ public class Statistics { */ @CheckForNull @JsonProperty("networks") - private Map networksStats; + private Map networks; /** - * @deprecated as of Docker Remote API 1.21, replaced by {@link #networksStats} + * @deprecated as of Docker Remote API 1.21, replaced by {@link #networks} */ @Deprecated @JsonProperty("network") @@ -45,12 +45,12 @@ public class Statistics { * @since Docker Remote API 1.21 */ @CheckForNull - public Map getNetworksStats() { - return networksStats; + public Map getNetworks() { + return networks; } /** - * @deprecated as of Docker Remote API 1.21, replaced by {@link #getNetworksStats()} + * @deprecated as of Docker Remote API 1.21, replaced by {@link #getNetworks()} */ @Deprecated public Map getNetworkStats() { From bc05ff913b6826a39fbe32eec4ca5a6a58e5f6f8 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 13 Nov 2015 21:53:14 +0100 Subject: [PATCH 0046/1032] start netty implementation (proof of concept) --- pom.xml | 29 +- .../ahc/AttachContainerCmdExec.java | 101 ---- .../api/command/ExecCreateCmdResponse.java | 8 + .../dockerjava/core/command/FrameReader.java | 9 +- .../dockerjava/netty/AbstrDockerCmdExec.java | 70 +++ .../netty/AbstrSyncDockerCmdExec.java | 33 ++ .../dockerjava/netty/ChannelProvider.java | 7 + .../netty/DockerCmdExecFactoryImpl.java | 484 ++++++++++++++++++ .../dockerjava/netty/ExecCreateCmdExec.java | 30 ++ .../dockerjava/netty/ExecStartCmdExec.java | 29 ++ .../github/dockerjava/netty/InfoCmdExec.java | 42 ++ .../dockerjava/netty/InvocationBuilder.java | 313 +++++++++++ .../github/dockerjava/netty/MediaType.java | 16 + .../github/dockerjava/netty/WebTarget.java | 69 +++ .../handler/AwaitObjectInboundHandler.java | 39 ++ .../DeserializeJsonInboundHandler.java | 31 ++ .../netty/handler/DockerRawStreamHandler.java | 124 +++++ .../handler/HijackHttpConnectionHandler.java | 57 +++ .../netty/handler/HttpRequestProvider.java | 9 + .../handler/HttpResponseInboundHandler.java | 128 +++++ .../HttpResponseStreamInboundHandler.java | 93 ++++ .../handler/SerializeJsonOutboundHandler.java | 19 + 22 files changed, 1635 insertions(+), 105 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/ahc/AttachContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/AbstrDockerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/AbstrSyncDockerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/ChannelProvider.java create mode 100644 src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java create mode 100644 src/main/java/com/github/dockerjava/netty/ExecCreateCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/ExecStartCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/InfoCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/InvocationBuilder.java create mode 100644 src/main/java/com/github/dockerjava/netty/MediaType.java create mode 100644 src/main/java/com/github/dockerjava/netty/WebTarget.java create mode 100644 src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java create mode 100644 src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java create mode 100644 src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java create mode 100644 src/main/java/com/github/dockerjava/netty/handler/HijackHttpConnectionHandler.java create mode 100644 src/main/java/com/github/dockerjava/netty/handler/HttpRequestProvider.java create mode 100644 src/main/java/com/github/dockerjava/netty/handler/HttpResponseInboundHandler.java create mode 100644 src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java create mode 100644 src/main/java/com/github/dockerjava/netty/handler/SerializeJsonOutboundHandler.java diff --git a/pom.xml b/pom.xml index 60fac661f..27326fd6b 100644 --- a/pom.xml +++ b/pom.xml @@ -204,9 +204,25 @@ - org.asynchttpclient - async-http-client - 2.0.0-alpha22 + io.netty + netty-codec-http + 4.1.0.Beta7 + + + io.netty + netty-handler + 4.1.0.Beta7 + + + io.netty + netty-handler-proxy + 4.1.0.Beta7 + + + io.netty + netty-transport-native-epoll + 4.1.0.Beta7 + linux-x86_64 @@ -222,6 +238,13 @@ + + + kr.motd.maven + os-maven-plugin + 1.2.3.Final + + diff --git a/src/main/java/com/github/dockerjava/ahc/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/ahc/AttachContainerCmdExec.java deleted file mode 100644 index 99be7d507..000000000 --- a/src/main/java/com/github/dockerjava/ahc/AttachContainerCmdExec.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.github.dockerjava.ahc; - -import java.io.ByteArrayOutputStream; -import java.net.URL; -import java.util.concurrent.Future; - -import com.github.dockerjava.api.async.ResultCallback; -import com.github.dockerjava.api.command.AttachContainerCmd; -import com.github.dockerjava.api.model.Frame; -import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.async.FrameStreamProcessor; -import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; -import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; - -import org.asynchttpclient.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.ws.rs.client.WebTarget; - -public class AttachContainerCmdExec implements AttachContainerCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(AttachContainerCmdExec.class); - - private URL baseResource; - - private DockerClientConfig dockerClientConfig; - - public AttachContainerCmdExec(URL baseResource, DockerClientConfig dockerClientConfig) { - this.baseResource = baseResource; - this.dockerClientConfig = dockerClientConfig; - } - - // @Override - // protected AbstractCallbackNotifier callbackNotifier(AttachContainerCmd command, - // ResultCallback resultCallback) { - // - // WebTarget webTarget = getBaseResource().path("/containers/{id}/attach").resolveTemplate("id", - // command.getContainerId()); - // - // webTarget = booleanQueryParam(webTarget, "logs", command.hasLogsEnabled()); - // webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); - // // webTarget = booleanQueryParam(webTarget, "stdin", command.hasStdinEnabled()); - // webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); - // webTarget = booleanQueryParam(webTarget, "stream", command.hasFollowStreamEnabled()); - // - // LOGGER.trace("POST: {}", webTarget); - // - // return new POSTCallbackNotifier(new FrameStreamProcessor(), resultCallback, webTarget.request(), null); - // } - - @Override - public Void exec(AttachContainerCmd command, ResultCallback resultCallback) { - AsyncHttpClientConfig config = new DefaultAsyncHttpClientConfig.Builder().build(); - - AsyncHttpClient c = new DefaultAsyncHttpClient(config); - c.prepareGet("http://www.ning.com/").execute(new AsyncHandler() { - private ByteArrayOutputStream bytes = new ByteArrayOutputStream(); - - @Override - public State onStatusReceived(HttpResponseStatus status) throws Exception { - int statusCode = status.getStatusCode(); - // The Status have been read - // If you don't want to read the headers,body or stop processing the response - if (statusCode >= 500) { - return State.ABORT; - } - - return State.CONTINUE; - } - - @Override - public State onHeadersReceived(HttpResponseHeaders h) throws Exception { - - // The headers have been read - // If you don't want to read the body, or stop processing the response - return State.CONTINUE; - } - - @Override - public State onBodyPartReceived(HttpResponseBodyPart bodyPart) throws Exception { - bytes.write(bodyPart.getBodyPartBytes()); - return State.CONTINUE; - } - - @Override - public String onCompleted() throws Exception { - // Will be invoked once the response has been fully read or a ResponseComplete exception - // has been thrown. - // NOTE: should probably use Content-Encoding from headers - return bytes.toString("UTF-8"); - } - - @Override - public void onThrowable(Throwable t) { - } - }); - - return null; - } -} diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java index 391625cfa..08751f3e2 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java @@ -1,5 +1,8 @@ package com.github.dockerjava.api.command; +import org.apache.commons.lang.builder.ReflectionToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -12,4 +15,9 @@ public class ExecCreateCmdResponse { public String getId() { return id; } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index 78db8359f..e7e4a4031 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -4,6 +4,8 @@ import java.io.InputStream; import java.util.Arrays; +import org.apache.commons.io.HexDump; + import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.StreamType; @@ -16,11 +18,12 @@ public class FrameReader implements AutoCloseable { private static final int HEADER_SIZE = 8; + private final byte[] rawBuffer = new byte[1000]; + private final InputStream inputStream; private Boolean rawStreamDetected = false; - private final byte[] rawBuffer = new byte[1000]; public FrameReader(InputStream inputStream) { this.inputStream = inputStream; @@ -65,6 +68,8 @@ public Frame readFrame() throws IOException { actualHeaderSize += headerCount; } while (actualHeaderSize < HEADER_SIZE); + // HexDump.dump(header, 0, System.err, 0); + StreamType streamType = streamType(header[0]); if (streamType.equals(StreamType.RAW)) { @@ -74,6 +79,8 @@ public Frame readFrame() throws IOException { int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff); + + //System.out.println("payload size: " + payloadSize); byte[] payload = new byte[payloadSize]; int actualPayloadSize = 0; diff --git a/src/main/java/com/github/dockerjava/netty/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/netty/AbstrDockerCmdExec.java new file mode 100644 index 000000000..3d0308d57 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/AbstrDockerCmdExec.java @@ -0,0 +1,70 @@ +package com.github.dockerjava.netty; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.RemoteApiVersion; +import org.apache.commons.codec.binary.Base64; + +import java.io.IOException; + +import static com.google.common.base.Preconditions.checkNotNull; + +public abstract class AbstrDockerCmdExec { + + private final DockerClientConfig dockerClientConfig; + + private final WebTarget baseResource; + + public AbstrDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + checkNotNull(baseResource, "baseResource was not specified"); + checkNotNull(dockerClientConfig, "dockerClientConfig was not specified"); + this.baseResource = baseResource; + this.dockerClientConfig = dockerClientConfig; + } + + protected WebTarget getBaseResource() { + return baseResource; + } + + protected AuthConfigurations getBuildAuthConfigs() { + return dockerClientConfig.getAuthConfigurations(); + } + + protected String registryAuth(AuthConfig authConfig) { + try { + return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected String registryConfigs(AuthConfigurations authConfigs) { + try { + final String json; + if (dockerClientConfig.getVersion().isGreaterOrEqual(RemoteApiVersion.VERSION_1_19)) { + json = new ObjectMapper().writeValueAsString(authConfigs.getConfigs()); + } else { + json = new ObjectMapper().writeValueAsString(authConfigs); + } + + return Base64.encodeBase64String(json.getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected boolean bool(Boolean bool) { + return bool != null && bool; + } + + protected WebTarget booleanQueryParam(WebTarget webTarget, String name, Boolean value) { + if (bool(value)) { + webTarget = webTarget.queryParam(name, bool(value) + ""); + } + + return webTarget; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/AbstrSyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/netty/AbstrSyncDockerCmdExec.java new file mode 100644 index 000000000..43854dbd1 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/AbstrSyncDockerCmdExec.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.netty; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.DockerCmd; +import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.core.DockerClientConfig; + + +public abstract class AbstrSyncDockerCmdExec, RES_T> extends AbstrDockerCmdExec + implements DockerCmdSyncExec { + + public AbstrSyncDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + public RES_T exec(CMD_T command) { + // this hack works because of ResponseStatusExceptionFilter + try (CMD_T cmd = command) { + try { + return execute(cmd); + } catch (RuntimeException e) { + if (e.getCause() instanceof DockerException) { + throw (DockerException) e.getCause(); + } else { + throw e; + } + } + } + } + + protected abstract RES_T execute(CMD_T command); +} diff --git a/src/main/java/com/github/dockerjava/netty/ChannelProvider.java b/src/main/java/com/github/dockerjava/netty/ChannelProvider.java new file mode 100644 index 000000000..a868f1cd1 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/ChannelProvider.java @@ -0,0 +1,7 @@ +package com.github.dockerjava.netty; + +import io.netty.channel.Channel; + +public interface ChannelProvider { + Channel getChannel(); +} diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java new file mode 100644 index 000000000..3627038cd --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -0,0 +1,484 @@ +package com.github.dockerjava.netty; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.UnknownHostException; + +import javax.net.ssl.SSLException; + +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +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.ContainerDiffCmd; +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.DockerCmdExecFactory; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +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.KillContainerCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +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.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.model.Frame; +import com.github.dockerjava.api.model.Info; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.DockerClientConfig.DockerClientConfigBuilder; +import com.github.dockerjava.core.command.ExecCreateCmdImpl; +import com.github.dockerjava.core.command.ExecStartCmdImpl; +import com.github.dockerjava.core.command.FrameReader; +import com.github.dockerjava.core.command.InfoCmdImpl; +import com.github.dockerjava.netty.handler.HijackHttpConnectionHandler; +import com.github.dockerjava.netty.handler.HttpResponseInboundHandler; + +import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.channel.epoll.EpollDomainSocketChannel; +import io.netty.channel.epoll.EpollEventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +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.codec.http.HttpContent; +import io.netty.handler.codec.http.HttpObject; +import io.netty.handler.codec.http.HttpResponse; +import io.netty.handler.codec.http.LastHttpContent; +import io.netty.handler.codec.json.JsonObjectDecoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.proxy.HttpProxyHandler; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; + +/** + * 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 + * + * @author marcus + * + */ +public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { + + private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); + + private DockerClientConfig dockerClientConfig; + + private Bootstrap bootstrap; + + private EventLoopGroup eventLoopGroup; + + private ChannelProvider channelProvider = new ChannelProvider() { + @Override + public Channel getChannel() { + return connect(); + } + }; + + @Override + public void init(DockerClientConfig dockerClientConfig) { + checkNotNull(dockerClientConfig, "config was not specified"); + this.dockerClientConfig = dockerClientConfig; + + bootstrap = new Bootstrap(); + + String scheme = dockerClientConfig.getUri().getScheme(); + + if ("unix".equals(scheme)) { + eventLoopGroup = new EpollEventLoopGroup(); + bootstrap.group(eventLoopGroup).channel(EpollDomainSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(final UnixChannel channel) throws Exception { + channel.pipeline().addLast(new HttpClientCodec()); + } + }); + + } else if ("http".equals(scheme)) { + eventLoopGroup = new NioEventLoopGroup(); + + try { + final SslContext sslCtx = SslContextBuilder.forClient() + .trustManager(InsecureTrustManagerFactory.INSTANCE).build(); + + InetAddress addr = InetAddress.getLoopbackAddress(); + + final SocketAddress proxyAddress = new InetSocketAddress(addr, 8008); + + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(final SocketChannel channel) throws Exception { + // channel.pipeline().addLast(new + // HttpProxyHandler(proxyAddress)); + + // channel.pipeline().addLast(sslCtx.newHandler(channel.alloc())); + HttpClientCodec httpClientCodec = new HttpClientCodec(); + + channel.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); + channel.pipeline().addLast(httpClientCodec); + + } + }); + + } catch (SSLException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + } + + } + + private Channel connect() { + try { + return connect(bootstrap); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + private Channel connect(final Bootstrap bootstrap) throws InterruptedException { + + String scheme = dockerClientConfig.getUri().getScheme(); + + if ("unix".equals(scheme)) { + return bootstrap.connect(new DomainSocketAddress("/var/run/docker.sock")).sync().channel(); + } else if ("http".equals(scheme)) { + String host = dockerClientConfig.getUri().getHost(); + int port = dockerClientConfig.getUri().getPort(); + + if (port == -1) { + throw new RuntimeException("no port configured for " + host); + } + + return bootstrap.connect(host, port).sync().channel(); + } else { + throw new RuntimeException("unsupported protocol scheme: " + scheme); + } + + } + + 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 null; // new AuthCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return new InfoCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return null; // new PingCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return null; // new VersionCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return null; // new PullImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return null; // new PushImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return null; // new SaveImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return null; // new CreateImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return null; // new SearchImagesCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return null; // new RemoveImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return null; // new ListImagesCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return null; // new InspectImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return null; // new ListContainersCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return null; // new CreateContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return null; // new StartContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return null; // new InspectContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return new ExecCreateCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return null; // new RemoveContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return null; // new WaitContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return null; // new AttachContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + + return new ExecStartCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); + } + + @Override + public InspectExecCmd.Exec createInspectExecCmdExec() { + return null; // new InspectExecCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return null; // new LogContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return null; // new CopyFileFromContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return null; // new StopContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return null; // new ContainerDiffCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return null; // new KillContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return null; // new RestartContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return null; // new CommitCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return null; // new BuildImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return null; // new TopContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return null; // new TagImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return null; // new PauseContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return null; // new UnpauseContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return null; // new EventsCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public StatsCmd.Exec createStatsCmdExec() { + return null; // new StatsCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public void close() throws IOException { + // checkNotNull(client, "Factory not initialized. You probably forgot to + // call init()!"); + // client.close(); + + eventLoopGroup.shutdownGracefully(); + } + + public static void main(String[] args) throws IOException { + DockerCmdExecFactory execFactory = new DockerCmdExecFactoryImpl(); + // execFactory.init(new + // DockerClientConfigBuilder().withUri("unix:///var/run/docker.sock").build()); + execFactory.init(new DockerClientConfigBuilder().withUri("http://localhost:2375").build()); + + // InfoCmd.Exec exec = execFactory.createInfoCmdExec(); + // + // InfoCmd infoCmd = new InfoCmdImpl(exec); + // + // Info info = infoCmd.exec(); + // + // System.out.println("result: " + info); + // + // infoCmd.close(); + + ExecCreateCmd.Exec execCreate = execFactory.createExecCmdExec(); + + ExecCreateCmd execCreateCmd = new ExecCreateCmdImpl(execCreate, "test").withCmd("/bin/bash") + .withAttachStdout(true).withAttachStderr(true).withAttachStdin(true); + + ExecCreateCmdResponse execCreateCmdResponse = execCreate.exec(execCreateCmd); + + System.out.println("result: " + execCreateCmdResponse); + + ExecStartCmd.Exec execStart = execFactory.createExecStartCmdExec(); + + ExecStartCmd execStartCmd = new ExecStartCmdImpl(execStart, execCreateCmdResponse.getId()).withDetach(false) + .withTty(true); + + InputStream response = execStart.exec(execStartCmd); + +// FrameReader frameReader = new FrameReader(response); +// +// System.out.println("read frame"); +// Frame frame = frameReader.readFrame(); +// +// while(frame != null) { +// System.out.println("frame: " + frame); +// frame = frameReader.readFrame(); +// } +// System.out.println("all frames read"); +// +// System.out.flush(); + + // System.out.println("response: " + IOUtils.toString(response, + // "UTF-8")); + + //execFactory.close(); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/netty/ExecCreateCmdExec.java new file mode 100644 index 000000000..10e5ad9d8 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/ExecCreateCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.netty; + +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.AbstrSyncDockerCmdExec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ExecCreateCmdExec extends AbstrSyncDockerCmdExec + implements ExecCreateCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExecCreateCmdExec.class); + + public ExecCreateCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected ExecCreateCmdResponse execute(ExecCreateCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: {}", webResource); + + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(command, ExecCreateCmdResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/netty/ExecStartCmdExec.java new file mode 100644 index 000000000..b158bf4e2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/ExecStartCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty; + +import java.io.InputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.core.DockerClientConfig; + +public class ExecStartCmdExec extends AbstrSyncDockerCmdExec implements ExecStartCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); + + public ExecStartCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InputStream execute(ExecStartCmd command) { + WebTarget webResource = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getExecId()); + + LOGGER.trace("POST: {}", webResource); + + webResource.request().accept(MediaType.APPLICATION_JSON).post(command, System.out, null, System.in); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/InfoCmdExec.java b/src/main/java/com/github/dockerjava/netty/InfoCmdExec.java new file mode 100644 index 000000000..04abf103f --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/InfoCmdExec.java @@ -0,0 +1,42 @@ +package com.github.dockerjava.netty; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.model.Info; +import com.github.dockerjava.core.DockerClientConfig; + +/** + * 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 + * + * @author marcus + * + */ +public class InfoCmdExec implements InfoCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InfoCmdExec.class); + + private WebTarget webResource; + + private DockerClientConfig dockerClientConfig; + + public InfoCmdExec(WebTarget webResource, DockerClientConfig dockerClientConfig) { + this.webResource = webResource; + this.dockerClientConfig = dockerClientConfig; + } + + + @Override + public Info exec(InfoCmd command) { + return webResource.path("info").request().get(Info.class); + } + + + + + +} diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java new file mode 100644 index 000000000..a257f8837 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -0,0 +1,313 @@ +package com.github.dockerjava.netty; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.io.HexDump; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.netty.handler.AwaitObjectInboundHandler; +import com.github.dockerjava.netty.handler.DeserializeJsonInboundHandler; +import com.github.dockerjava.netty.handler.DockerRawStreamHandler; +import com.github.dockerjava.netty.handler.HijackHttpConnectionHandler; +import com.github.dockerjava.netty.handler.HttpRequestProvider; +import com.github.dockerjava.netty.handler.HttpResponseInboundHandler; +import com.github.dockerjava.netty.handler.HttpResponseStreamInboundHandler; +import com.github.dockerjava.netty.handler.SerializeJsonOutboundHandler; + +import io.netty.buffer.Unpooled; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandler; +import io.netty.handler.codec.http.DefaultFullHttpRequest; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpClientUpgradeHandler; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpHeaderValues; +import io.netty.handler.codec.http.HttpMethod; +import io.netty.handler.codec.http.HttpRequest; +import io.netty.handler.codec.http.HttpVersion; +import io.netty.handler.codec.http.multipart.HttpPostRequestEncoder; +import io.netty.handler.codec.http.multipart.InterfaceHttpData; +import io.netty.handler.codec.json.JsonObjectDecoder; + +public class InvocationBuilder { + + private ChannelProvider channelProvider; + private String resource; + private Map headers = new HashMap(); + + public InvocationBuilder(ChannelProvider channelProvider, String resource) { + this.channelProvider = channelProvider; + this.resource = resource; + } + + public InvocationBuilder accept(MediaType mediaType) { + headers.put(HttpHeaderNames.ACCEPT.toString(), mediaType.getMediaType()); + return this; + } + + public T get(Class resultType) { + FullHttpRequest request = prepareGetRequest(resource); + + Channel channel = channelProvider.getChannel(); + + AwaitObjectInboundHandler awaitObject = new AwaitObjectInboundHandler(resultType); + + channel.pipeline().addLast(new HttpResponseInboundHandler(new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return prepareGetRequest(uri); + } + })); + channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(new DeserializeJsonInboundHandler(resultType)); + channel.pipeline().addLast(awaitObject); + + System.out.println("resource: " + resource); + + channel.writeAndFlush(request); + + // Wait for the server to close the connection. + try { + // channel.closeFuture().sync(); + T response = awaitObject.await(); + + // channel.disconnect(); + + return response; + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + private FullHttpRequest prepareGetRequest(String uri) { + // Prepare the HTTP request. + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri); + + setDefaultHeaders(request); + return request; + } + + private void setDefaultHeaders(HttpRequest request) { + request.headers().set(HttpHeaderNames.HOST, ""); + request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); + request.headers().set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP); + + for (Map.Entry entry : headers.entrySet()) { + request.headers().set((CharSequence) entry.getKey(), entry.getValue()); + } + } + + public T post(final Object entity, Class resultType) { + + HttpRequest request = preparePostRequest(resource, entity); + + AwaitObjectInboundHandler awaitObject = new AwaitObjectInboundHandler(resultType); + + Channel channel = channelProvider.getChannel(); + + channel.pipeline().addLast(new HttpResponseInboundHandler(new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return preparePostRequest(uri, entity); + } + })); + channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(new DeserializeJsonInboundHandler(resultType)); + channel.pipeline().addLast(awaitObject); + + System.out.println("resource: " + resource); + System.out.println(channel.isActive()); + + channel.writeAndFlush(request); + + // Wait for the server to close the connection. + try { + // channel.closeFuture().sync(); + T response = awaitObject.await(); + + return response; + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + } + + public InputStream post(final Object entity, final InputStream stdin) { + + HttpRequest request = preparePostRequest(resource, entity); + + HttpResponseStreamInboundHandler streamHandler = new HttpResponseStreamInboundHandler(); + + final Channel channel = channelProvider.getChannel(); + + HijackHttpConnectionHandler hijackHandler = new HijackHttpConnectionHandler(); + channel.pipeline() + .addLast(new HttpClientUpgradeHandler(new HttpClientCodec(), hijackHandler, Integer.MAX_VALUE)); + channel.pipeline().addLast(new HttpResponseInboundHandler(new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return preparePostRequest(uri, entity); + } + })); + + channel.pipeline().addLast(streamHandler); + + System.out.println("resource: " + resource); + System.out.println(channel.isActive()); + + channel.writeAndFlush(request); + + // wait for successful http upgrade procedure + hijackHandler.await(); + +// Iterator> iterator = channel.pipeline().iterator(); +// +// while (iterator.hasNext()) { +// Entry next = iterator.next(); +// System.out.println(next.getValue()); +// } + + // start a new thread that reads from stdin and writes to the channel + new Thread(new Runnable() { + + @Override + public void run() { + + BufferedReader reader = new BufferedReader(new InputStreamReader(stdin)); + + int read = -1; + while((read = read(reader)) != -1) { + byte[] bytes = ByteBuffer.allocate(4).putInt(read).array(); + channel.writeAndFlush(Unpooled.copiedBuffer(bytes)); + } + } + + private int read(BufferedReader reader) { + try { + return reader.read(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }).start(); + + return streamHandler.getInputStream(); + } + + public void post(final Object entity, final OutputStream stdout, final OutputStream stderr, final InputStream stdin) { + + HttpRequest request = preparePostRequest(resource, entity); + + DockerRawStreamHandler streamHandler = new DockerRawStreamHandler(stdout, stderr); + + final Channel channel = channelProvider.getChannel(); + + HijackHttpConnectionHandler hijackHandler = new HijackHttpConnectionHandler(); + channel.pipeline() + .addLast(new HttpClientUpgradeHandler(new HttpClientCodec(), hijackHandler, Integer.MAX_VALUE)); + channel.pipeline().addLast(new HttpResponseInboundHandler(new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return preparePostRequest(uri, entity); + } + })); + + channel.pipeline().addLast(streamHandler); + + System.out.println("resource: " + resource); + System.out.println(channel.isActive()); + + channel.writeAndFlush(request); + + // wait for successful http upgrade procedure + hijackHandler.await(); + +// Iterator> iterator = channel.pipeline().iterator(); +// +// while (iterator.hasNext()) { +// Entry next = iterator.next(); +// System.out.println(next.getValue()); +// } + + // start a new thread that reads from stdin and writes to the channel + new Thread(new Runnable() { + + @Override + public void run() { + + BufferedReader reader = new BufferedReader(new InputStreamReader(stdin, Charset.forName("UTF-8"))); + + int read = -1; + while((read = read(reader)) != -1) { + byte[] bytes = ByteBuffer.allocate(4).putInt(read).array(); + try { + bytes = new String(bytes).getBytes("US-ASCII"); + + HexDump.dump(bytes, 0, System.err, 0); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } catch (ArrayIndexOutOfBoundsException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + channel.writeAndFlush(Unpooled.copiedBuffer(bytes)); + } + } + + private int read(BufferedReader reader) { + try { + return reader.read(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }).start(); + + + } + + + private HttpRequest preparePostRequest(String uri, Object entity) { + // Prepare the HTTP request. + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, uri); + + setDefaultHeaders(request); + + byte[] bytes; + try { + bytes = new ObjectMapper().writeValueAsBytes(entity); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + request.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json"); + request.content().clear().writeBytes(Unpooled.copiedBuffer(bytes)); + request.headers().set(HttpHeaderNames.CONTENT_LENGTH, bytes.length); + + return request; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/MediaType.java b/src/main/java/com/github/dockerjava/netty/MediaType.java new file mode 100644 index 000000000..347b9de72 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/MediaType.java @@ -0,0 +1,16 @@ +package com.github.dockerjava.netty; + +public enum MediaType { + + APPLICATION_JSON("application/json"); + + private String mediaType; + + private MediaType(String mediaType) { + this.mediaType = mediaType; + } + + public String getMediaType() { + return mediaType; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/WebTarget.java b/src/main/java/com/github/dockerjava/netty/WebTarget.java new file mode 100644 index 000000000..7c8970d33 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/WebTarget.java @@ -0,0 +1,69 @@ +package com.github.dockerjava.netty; + +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 io.netty.channel.Channel; + +public class WebTarget { + + private ChannelProvider channelProvider; + + private List path = new ArrayList(); + + private Map queryParams = new HashMap(); + + private static String PATH_SEPARATOR = "/"; + + public WebTarget(ChannelProvider channelProvider) { + this.channelProvider = channelProvider; + } + + public WebTarget path(String... components) { + + for(String component : components) { + + path.addAll(Arrays.asList(StringUtils.split(component, PATH_SEPARATOR))); + } + + return this; + } + + public InvocationBuilder request() { + String resource = PATH_SEPARATOR + StringUtils.join(path, PATH_SEPARATOR); + + List params = new ArrayList(); + for(Map.Entry entry : queryParams.entrySet()) { + params.add(entry.getKey() + "=" + entry.getValue()); + } + + if(!params.isEmpty()) { + resource = resource + "?" + StringUtils.join(params, "&"); + } + + return new InvocationBuilder(channelProvider, resource); + } + + public WebTarget resolveTemplate(String name, Object value) { + List newPath = new ArrayList(); + for(String component : path) { + component = component.replaceAll("\\{" + name + "\\}", value.toString()); + newPath.add(component); + } + path = newPath; + return this; + } + + public WebTarget queryParam(String name, Object value) { + queryParams.put(name, value.toString()); + return this; + } + + + +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java new file mode 100644 index 000000000..806e76d31 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java @@ -0,0 +1,39 @@ +package com.github.dockerjava.netty.handler; + +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.FutureTask; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class AwaitObjectInboundHandler extends SimpleChannelInboundHandler { + + public AwaitObjectInboundHandler(Class clazz) { + super(clazz); + } + + private CountDownLatch countDownLatch = new CountDownLatch(1); + + private T object; + + @Override + protected void channelRead0(ChannelHandlerContext ctx, T msg) throws Exception { + object = msg; + countDownLatch.countDown(); + } + + public T await() throws InterruptedException { + countDownLatch.await(); + return object; + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java new file mode 100644 index 000000000..d2a23988d --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.netty.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class DeserializeJsonInboundHandler extends SimpleChannelInboundHandler{ + + private Class clazz; + + public DeserializeJsonInboundHandler(Class clazz) { + this.clazz = clazz; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + byte[] buffer = new byte[msg.readableBytes()]; + msg.readBytes(buffer); + + T object = null; + try { + object = new ObjectMapper().readValue(buffer, clazz); + } catch (Exception e) { + throw new RuntimeException(e); + } + + ctx.fireChannelRead(object); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java new file mode 100644 index 000000000..7d2e501f5 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java @@ -0,0 +1,124 @@ +package com.github.dockerjava.netty.handler; + +import java.io.OutputStream; + +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.StreamType; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class DockerRawStreamHandler extends SimpleChannelInboundHandler { + + private static final int HEADER_SIZE = 8; + + private final ByteBuf rawBuffer = Unpooled.buffer(1000); + + private OutputStream stdout, stderr; + + private byte[] header = new byte[HEADER_SIZE]; + + private int headerCnt = 0; + + private int payloadCnt = 0; + + public DockerRawStreamHandler(OutputStream stdout, OutputStream stderr) { + this.stdout = stdout; + this.stderr = stderr; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + + // System.out.println("msg: " + msg.readableBytes()); + rawBuffer.writeBytes(msg.copy()); + // System.out.println("readableBytes: " + rawBuffer.readableBytes()); + + Frame frame = null; + + do { + if (frame != null) { + switch (frame.getStreamType()) { + case STDOUT: + if (stdout != null) { + stdout.write(frame.getPayload()); + stdout.flush(); + } + break; + case STDERR: + if (stderr != null) { + stderr.write(frame.getPayload()); + stderr.flush(); + } + break; + } + headerCnt = 0; + payloadCnt = 0; + } + } while ((frame = decode()) != null); + + } + + private int read(byte[] buf, int offset, int length) { + length = Math.min(rawBuffer.readableBytes(), length); + rawBuffer.readBytes(buf, offset, length); + return length; + } + + private Frame decode() { + if (headerCnt < HEADER_SIZE) { + + int headerCount = read(header, headerCnt, HEADER_SIZE - headerCnt); + + if (headerCount == 0) { + return null; + } + headerCnt += headerCount; + + if (headerCnt < HEADER_SIZE) + return null; + } + + StreamType streamType = streamType(header[0]); + + int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + + (header[7] & 0xff); + + byte[] payload = new byte[payloadSize]; + + int count = read(payload, payloadCnt, payloadSize - payloadCnt); + + if (count == 0) + return null; + + payloadCnt += count; + + if (payloadCnt < payloadSize) + return null; + + return new Frame(streamType, payload); + + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + + private static StreamType streamType(byte streamType) { + switch (streamType) { + case 0: + return StreamType.STDIN; + case 1: + return StreamType.STDOUT; + case 2: + return StreamType.STDERR; + default: + return StreamType.RAW; + } + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/HijackHttpConnectionHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HijackHttpConnectionHandler.java new file mode 100644 index 000000000..1a4a6673b --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/HijackHttpConnectionHandler.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.netty.handler; + +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.Map.Entry; +import java.util.concurrent.CountDownLatch; + +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpClientUpgradeHandler; +import io.netty.handler.codec.http.HttpRequest; + +public class HijackHttpConnectionHandler implements HttpClientUpgradeHandler.UpgradeCodec { + + private CountDownLatch latch = new CountDownLatch(1); + + @Override + public void upgradeTo(ChannelHandlerContext ctx, FullHttpResponse upgradeResponse) + throws Exception { + System.out.println("UPGRADED"); + latch.countDown(); +// ChannelHandler removed = ctx.pipeline().remove(HttpClientCodec.class); +// +// System.out.println("removed: " + removed); + + + + + + } + + @Override + public Collection setUpgradeHeaders(ChannelHandlerContext ctx, + HttpRequest upgradeRequest) { + return Collections.emptyList(); + } + + @Override + public CharSequence protocol() { + return "tcp"; + } + + public void await() { + try { + latch.await(); + System.out.println("upgrade awaited"); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + + +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpRequestProvider.java b/src/main/java/com/github/dockerjava/netty/handler/HttpRequestProvider.java new file mode 100644 index 000000000..9777a1098 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpRequestProvider.java @@ -0,0 +1,9 @@ +package com.github.dockerjava.netty.handler; + +import io.netty.handler.codec.http.HttpRequest; + +public interface HttpRequestProvider { + + HttpRequest getHttpRequest(String uri); + +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseInboundHandler.java new file mode 100644 index 000000000..143e5dcf5 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseInboundHandler.java @@ -0,0 +1,128 @@ +package com.github.dockerjava.netty.handler; + +import java.nio.charset.Charset; + +import com.github.dockerjava.api.BadRequestException; +import com.github.dockerjava.api.ConflictException; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.InternalServerErrorException; +import com.github.dockerjava.api.NotAcceptableException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.NotModifiedException; +import com.github.dockerjava.api.UnauthorizedException; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.HttpContent; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpObject; +import io.netty.handler.codec.http.HttpRequest; +import io.netty.handler.codec.http.HttpResponse; +import io.netty.handler.codec.http.LastHttpContent; + +public class HttpResponseInboundHandler extends SimpleChannelInboundHandler { + + private HttpRequestProvider requestProvider; + + private HttpResponse response; + + private ByteBuf body = Unpooled.buffer(); + + public HttpResponseInboundHandler(HttpRequestProvider requestProvider) { + super(false); + this.requestProvider = requestProvider; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception { + if (msg instanceof HttpResponse) { + HttpResponse response = (HttpResponse) msg; + + System.err.println("STATUS: " + response.status()); + System.err.println("VERSION: " + response.protocolVersion()); + System.err.println(); + + this.response = response; + + if (!response.headers().isEmpty()) { + for (CharSequence name : response.headers().names()) { + for (CharSequence value : response.headers().getAll(name)) { + System.err.println("HEADER: " + name + " = " + value); + } + } + System.err.println(); + } + + } else if (msg instanceof HttpContent) { + //System.err.println("Got http content"); + + HttpContent content = (HttpContent) msg; + + ByteBuf byteBuf = content.content(); + + switch (response.status().code()) { + case 200: + case 201: + case 204: + ctx.fireChannelRead(byteBuf); + break; + default: + body.writeBytes(byteBuf); + } + + if (content instanceof LastHttpContent) { + + try { + switch (response.status().code()) { + case 200: + case 201: + case 204: + + break; + case 301: + case 302: + if (response.headers().contains(HttpHeaderNames.LOCATION)) { + String location = response.headers().get(HttpHeaderNames.LOCATION); + System.out.println("redirected to :" + location); + HttpRequest redirected = requestProvider.getHttpRequest(location); + + ctx.channel().writeAndFlush(redirected); + } else { + ctx.fireExceptionCaught(new RuntimeException("missing 'location' header for redirect")); + } + break; + case 304: + throw new NotModifiedException(getBodyAsMessage(body)); + case 400: + throw new BadRequestException(getBodyAsMessage(body)); + case 401: + throw new UnauthorizedException(getBodyAsMessage(body)); + case 404: + throw new NotFoundException(getBodyAsMessage(body)); + case 406: + throw new NotAcceptableException(getBodyAsMessage(body)); + case 409: + throw new ConflictException(getBodyAsMessage(body)); + case 500: + throw new InternalServerErrorException(getBodyAsMessage(body)); + default: + throw new DockerException(getBodyAsMessage(body), response.status().code()); + } + } finally { + //ctx.close(); + } + + } + } else { + System.err.println("UNKNOWN"); + } + + } + + private String getBodyAsMessage(ByteBuf body) { + return body.readBytes(body.readableBytes()).toString(Charset.forName("UTF-8")); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java new file mode 100644 index 000000000..854cb7b2a --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java @@ -0,0 +1,93 @@ +package com.github.dockerjava.netty.handler; + +import java.io.IOException; +import java.io.InputStream; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.LinkedTransferQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.commons.io.HexDump; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +public class HttpResponseStreamInboundHandler extends SimpleChannelInboundHandler { + + private CountDownLatch latch = new CountDownLatch(1); + private HttpResponseInputStream stream = new HttpResponseInputStream(); + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + + latch.countDown(); + stream.write(msg.copy()); + + //System.out.println("got data: " + msg.readableBytes()); + + if (msg.readableBytes() == 0) { + stream.close(); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + + public InputStream getInputStream() { + try { + latch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return stream; + } + + public static class HttpResponseInputStream extends InputStream { + + private AtomicBoolean closed = new AtomicBoolean(false); + + private LinkedTransferQueue queue = new LinkedTransferQueue(); + + private ByteBuf current = null; + + public void write(ByteBuf byteBuf) { + queue.put(byteBuf); + } + + @Override + public void close() throws IOException { + closed.set(true); + super.close(); + } + + @Override + public int read() throws IOException { + if (closed.get()) + return -1; + + if (current == null || current.readableBytes() == 0) { + try { + current = queue.poll(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + if(current != null && current.readableBytes() > 0) { + return current.readByte(); + } else { + return read(); + } + + + + + } + + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/SerializeJsonOutboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/SerializeJsonOutboundHandler.java new file mode 100644 index 000000000..4505c02a9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/SerializeJsonOutboundHandler.java @@ -0,0 +1,19 @@ +package com.github.dockerjava.netty.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +public class SerializeJsonOutboundHandler extends MessageToByteEncoder{ + + private ObjectMapper mapper = new ObjectMapper(); + + @Override + protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { + byte[] serialized = mapper.writeValueAsBytes(msg); + System.out.println("serialized: " + new String(serialized)); + out.writeBytes(serialized); + } +} From 4a81097e4875c995b1922484f0eb39c77acd7b31 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sat, 14 Nov 2015 16:35:08 +0100 Subject: [PATCH 0047/1032] Removed some debug output --- .../dockerjava/netty/InvocationBuilder.java | 75 ++++--------------- 1 file changed, 16 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index a257f8837..b4f0fb1ee 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -7,15 +7,9 @@ import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; -import java.nio.CharBuffer; import java.nio.charset.Charset; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.io.HexDump; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -26,12 +20,9 @@ import com.github.dockerjava.netty.handler.HttpRequestProvider; import com.github.dockerjava.netty.handler.HttpResponseInboundHandler; import com.github.dockerjava.netty.handler.HttpResponseStreamInboundHandler; -import com.github.dockerjava.netty.handler.SerializeJsonOutboundHandler; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelHandler; import io.netty.handler.codec.http.DefaultFullHttpRequest; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpClientCodec; @@ -41,8 +32,6 @@ import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpVersion; -import io.netty.handler.codec.http.multipart.HttpPostRequestEncoder; -import io.netty.handler.codec.http.multipart.InterfaceHttpData; import io.netty.handler.codec.json.JsonObjectDecoder; public class InvocationBuilder { @@ -155,7 +144,7 @@ public InputStream post(final Object entity, final InputStream stdin) { HttpResponseStreamInboundHandler streamHandler = new HttpResponseStreamInboundHandler(); final Channel channel = channelProvider.getChannel(); - + HijackHttpConnectionHandler hijackHandler = new HijackHttpConnectionHandler(); channel.pipeline() .addLast(new HttpClientUpgradeHandler(new HttpClientCodec(), hijackHandler, Integer.MAX_VALUE)); @@ -168,31 +157,21 @@ public HttpRequest getHttpRequest(String uri) { channel.pipeline().addLast(streamHandler); - System.out.println("resource: " + resource); - System.out.println(channel.isActive()); - channel.writeAndFlush(request); // wait for successful http upgrade procedure hijackHandler.await(); -// Iterator> iterator = channel.pipeline().iterator(); -// -// while (iterator.hasNext()) { -// Entry next = iterator.next(); -// System.out.println(next.getValue()); -// } - // start a new thread that reads from stdin and writes to the channel new Thread(new Runnable() { - + @Override public void run() { - + BufferedReader reader = new BufferedReader(new InputStreamReader(stdin)); - + int read = -1; - while((read = read(reader)) != -1) { + while ((read = read(reader)) != -1) { byte[] bytes = ByteBuffer.allocate(4).putInt(read).array(); channel.writeAndFlush(Unpooled.copiedBuffer(bytes)); } @@ -206,18 +185,19 @@ private int read(BufferedReader reader) { } } }).start(); - + return streamHandler.getInputStream(); } - - public void post(final Object entity, final OutputStream stdout, final OutputStream stderr, final InputStream stdin) { + + public void post(final Object entity, final OutputStream stdout, final OutputStream stderr, + final InputStream stdin) { HttpRequest request = preparePostRequest(resource, entity); DockerRawStreamHandler streamHandler = new DockerRawStreamHandler(stdout, stderr); final Channel channel = channelProvider.getChannel(); - + HijackHttpConnectionHandler hijackHandler = new HijackHttpConnectionHandler(); channel.pipeline() .addLast(new HttpClientUpgradeHandler(new HttpClientCodec(), hijackHandler, Integer.MAX_VALUE)); @@ -230,49 +210,28 @@ public HttpRequest getHttpRequest(String uri) { channel.pipeline().addLast(streamHandler); - System.out.println("resource: " + resource); - System.out.println(channel.isActive()); - channel.writeAndFlush(request); // wait for successful http upgrade procedure hijackHandler.await(); -// Iterator> iterator = channel.pipeline().iterator(); -// -// while (iterator.hasNext()) { -// Entry next = iterator.next(); -// System.out.println(next.getValue()); -// } - // start a new thread that reads from stdin and writes to the channel new Thread(new Runnable() { - + @Override public void run() { - + BufferedReader reader = new BufferedReader(new InputStreamReader(stdin, Charset.forName("UTF-8"))); - + int read = -1; - while((read = read(reader)) != -1) { + while ((read = read(reader)) != -1) { byte[] bytes = ByteBuffer.allocate(4).putInt(read).array(); try { bytes = new String(bytes).getBytes("US-ASCII"); - - HexDump.dump(bytes, 0, System.err, 0); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); - } catch (ArrayIndexOutOfBoundsException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); } - + channel.writeAndFlush(Unpooled.copiedBuffer(bytes)); } } @@ -285,10 +244,8 @@ private int read(BufferedReader reader) { } } }).start(); - - - } + } private HttpRequest preparePostRequest(String uri, Object entity) { // Prepare the HTTP request. From e7f1724e8b0d069a1ce17531cf1bb92c751e986c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sat, 14 Nov 2015 16:36:55 +0100 Subject: [PATCH 0048/1032] Fix regression in decode algorithm for docker stream --- .../netty/handler/DockerRawStreamHandler.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java index 7d2e501f5..e7f7e3377 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java @@ -21,6 +21,8 @@ public class DockerRawStreamHandler extends SimpleChannelInboundHandler private byte[] header = new byte[HEADER_SIZE]; private int headerCnt = 0; + + private byte[] payload = new byte[0]; private int payloadCnt = 0; @@ -32,13 +34,13 @@ public DockerRawStreamHandler(OutputStream stdout, OutputStream stderr) { @Override protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { - // System.out.println("msg: " + msg.readableBytes()); - rawBuffer.writeBytes(msg.copy()); - // System.out.println("readableBytes: " + rawBuffer.readableBytes()); + rawBuffer.writeBytes(msg.copy(), 0, msg.readableBytes()); Frame frame = null; do { + frame = decode(); + if (frame != null) { switch (frame.getStreamType()) { case STDOUT: @@ -53,11 +55,15 @@ protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Excep stderr.flush(); } break; + default: + System.err.println("unknown stream type"); } + headerCnt = 0; payloadCnt = 0; - } - } while ((frame = decode()) != null); + } + + } while (frame != null); } @@ -86,7 +92,8 @@ private Frame decode() { int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff); - byte[] payload = new byte[payloadSize]; + if(payloadCnt == 0) + payload = new byte[payloadSize]; int count = read(payload, payloadCnt, payloadSize - payloadCnt); From 1f59e5a8eaeffefd34a44c7000d8877a8d9c6986 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 14 Nov 2015 20:12:28 +0300 Subject: [PATCH 0049/1032] Move exceptions into separate package --- .../com/github/dockerjava/api/DockerClient.java | 1 + .../github/dockerjava/api/command/AuthCmd.java | 2 +- .../github/dockerjava/api/command/CommitCmd.java | 2 +- .../dockerjava/api/command/ContainerDiffCmd.java | 6 +++--- .../api/command/CopyFileFromContainerCmd.java | 2 +- .../api/command/CreateContainerCmd.java | 4 ++-- .../dockerjava/api/command/ExecStartCmd.java | 4 ++-- .../api/command/InspectContainerCmd.java | 2 +- .../dockerjava/api/command/InspectExecCmd.java | 2 +- .../dockerjava/api/command/InspectImageCmd.java | 2 +- .../dockerjava/api/command/KillContainerCmd.java | 2 +- .../api/command/PauseContainerCmd.java | 2 +- .../dockerjava/api/command/PushImageCmd.java | 2 +- .../api/command/RemoveContainerCmd.java | 2 +- .../dockerjava/api/command/RemoveImageCmd.java | 2 +- .../api/command/RestartContainerCmd.java | 2 +- .../dockerjava/api/command/SaveImageCmd.java | 4 ++-- .../api/command/StartContainerCmd.java | 4 ++-- .../dockerjava/api/command/StopContainerCmd.java | 4 ++-- .../dockerjava/api/command/TopContainerCmd.java | 2 +- .../api/command/UnpauseContainerCmd.java | 2 +- .../dockerjava/api/command/WaitContainerCmd.java | 2 +- .../api/{ => exception}/BadRequestException.java | 2 +- .../api/{ => exception}/ConflictException.java | 2 +- .../{ => exception}/DockerClientException.java | 2 +- .../api/{ => exception}/DockerException.java | 2 +- .../InternalServerErrorException.java | 2 +- .../{ => exception}/NotAcceptableException.java | 2 +- .../api/{ => exception}/NotFoundException.java | 2 +- .../{ => exception}/NotModifiedException.java | 2 +- .../{ => exception}/UnauthorizedException.java | 2 +- .../dockerjava/core/DockerClientConfig.java | 2 +- .../com/github/dockerjava/core/FilePathUtil.java | 2 +- .../github/dockerjava/core/GoLangFileMatch.java | 1 + .../dockerjava/core/LocalDirectorySSLConfig.java | 2 +- .../com/github/dockerjava/core/NameParser.java | 1 + .../dockerjava/core/command/AbstrDockerCmd.java | 2 +- .../dockerjava/core/command/AuthCmdImpl.java | 2 +- .../core/command/BuildImageResultCallback.java | 2 +- .../dockerjava/core/command/CommitCmdImpl.java | 2 +- .../core/command/ContainerDiffCmdImpl.java | 6 +++--- .../command/CopyFileFromContainerCmdImpl.java | 2 +- .../core/command/CreateContainerCmdImpl.java | 4 ++-- .../core/command/ExecCreateCmdImpl.java | 2 +- .../core/command/ExecStartCmdImpl.java | 4 ++-- .../core/command/InspectContainerCmdImpl.java | 2 +- .../core/command/InspectExecCmdImpl.java | 2 +- .../core/command/InspectImageCmdImpl.java | 2 +- .../core/command/KillContainerCmdImpl.java | 2 +- .../core/command/PauseContainerCmdImpl.java | 2 +- .../core/command/PullImageResultCallback.java | 2 +- .../core/command/PushImageResultCallback.java | 2 +- .../core/command/RemoveContainerCmdImpl.java | 2 +- .../core/command/RemoveImageCmdImpl.java | 2 +- .../core/command/RestartContainerCmdImpl.java | 2 +- .../core/command/SaveImageCmdImpl.java | 4 ++-- .../core/command/StartContainerCmdImpl.java | 4 ++-- .../core/command/StopContainerCmdImpl.java | 4 ++-- .../core/command/TopContainerCmdImpl.java | 2 +- .../core/command/UnpauseContainerCmdImpl.java | 2 +- .../command/WaitContainerResultCallback.java | 2 +- .../dockerjava/core/dockerfile/Dockerfile.java | 4 ++-- .../core/dockerfile/DockerfileStatement.java | 2 +- .../GoLangFileMatchException.java | 2 +- .../InvalidRepositoryNameException.java | 2 +- .../dockerjava/jaxrs/AbstrSyncDockerCmdExec.java | 2 +- .../com/github/dockerjava/jaxrs/AuthCmdExec.java | 2 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 2 +- .../filter/ResponseStatusExceptionFilter.java | 16 ++++++++-------- .../client/AbstractDockerClientTest.java | 2 +- .../dockerjava/client/DockerClientTest.java | 2 +- .../dockerjava/core/GoLangFileMatchTest.java | 1 + .../github/dockerjava/core/NameParserTest.java | 1 + .../dockerjava/core/command/AuthCmdImplTest.java | 2 +- .../core/command/BuildImageCmdImplTest.java | 2 +- .../core/command/CommitCmdImplTest.java | 4 ++-- .../core/command/ContainerDiffCmdImplTest.java | 4 ++-- .../CopyFileFromContainerCmdImplTest.java | 2 +- .../core/command/CreateContainerCmdImplTest.java | 4 ++-- .../core/command/DockerfileFixture.java | 4 ++-- .../dockerjava/core/command/InfoCmdImplTest.java | 2 +- .../core/command/KillContainerCmdImplTest.java | 4 ++-- .../core/command/ListImagesCmdImplTest.java | 2 +- .../core/command/LogContainerCmdImplTest.java | 2 +- .../core/command/PullImageCmdImplTest.java | 2 +- .../core/command/PushImageCmdImplTest.java | 2 +- .../core/command/RemoveContainerCmdImplTest.java | 4 ++-- .../core/command/RemoveImageCmdImplTest.java | 4 ++-- .../command/RestartContainerCmdImplTest.java | 4 ++-- .../core/command/SearchImagesCmdImplTest.java | 2 +- .../core/command/StartContainerCmdImplTest.java | 6 +++--- .../core/command/StopContainerCmdImplTest.java | 4 ++-- .../core/command/TagImageCmdImplTest.java | 2 +- .../core/command/VersionCmdImplTest.java | 2 +- .../core/command/WaitContainerCmdImplTest.java | 4 ++-- .../dockerfile/DockerfileStatementAddTest.java | 2 +- 96 files changed, 130 insertions(+), 125 deletions(-) rename src/main/java/com/github/dockerjava/api/{ => exception}/BadRequestException.java (90%) rename src/main/java/com/github/dockerjava/api/{ => exception}/ConflictException.java (90%) rename src/main/java/com/github/dockerjava/api/{ => exception}/DockerClientException.java (88%) rename src/main/java/com/github/dockerjava/api/{ => exception}/DockerException.java (92%) rename src/main/java/com/github/dockerjava/api/{ => exception}/InternalServerErrorException.java (91%) rename src/main/java/com/github/dockerjava/api/{ => exception}/NotAcceptableException.java (90%) rename src/main/java/com/github/dockerjava/api/{ => exception}/NotFoundException.java (92%) rename src/main/java/com/github/dockerjava/api/{ => exception}/NotModifiedException.java (90%) rename src/main/java/com/github/dockerjava/api/{ => exception}/UnauthorizedException.java (90%) rename src/main/java/com/github/dockerjava/core/{ => exception}/GoLangFileMatchException.java (81%) rename src/main/java/com/github/dockerjava/core/{ => exception}/InvalidRepositoryNameException.java (86%) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 8b578f08e..bb0c67549 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -41,6 +41,7 @@ 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.exception.DockerException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.Identifier; diff --git a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java index da7d47a7a..168927959 100644 --- a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.exception.UnauthorizedException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthResponse; diff --git a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java index 77e19363c..c948ed7d3 100644 --- a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.Volumes; diff --git a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java index 42ae5e9dd..204e35fce 100644 --- a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java @@ -5,9 +5,9 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.InternalServerErrorException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.InternalServerErrorException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.ChangeLog; public interface ContainerDiffCmd extends SyncDockerCmd> { diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java index e51b8ac46..5ae9f6276 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -5,7 +5,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; public interface CopyFileFromContainerCmd extends SyncDockerCmd { 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 0a070acfa..f1c7fdd9c 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -5,8 +5,8 @@ import javax.annotation.CheckForNull; -import com.github.dockerjava.api.ConflictException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.ConflictException; +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.Device; diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java index c9e0d3f00..83aedc27a 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -5,7 +5,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; public interface ExecStartCmd extends SyncDockerCmd { @@ -27,7 +27,7 @@ public interface ExecStartCmd extends SyncDockerCmd { /** * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. * - * @throws com.github.dockerjava.api.NotFoundException + * @throws NotFoundException * No such exec instance */ @Override diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java index 875ed7c32..b6fde3fdc 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; public interface InspectContainerCmd extends SyncDockerCmd { diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java index 4abc73e79..d1c6b48f1 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; public interface InspectExecCmd extends SyncDockerCmd { diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java index 54ae3c228..2d3163533 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; /** * Inspect the details of an image. diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java index c751506a5..1e8da1a18 100644 --- a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; /** * Kill a running container. diff --git a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java index be179a5c4..4ca00a90d 100644 --- a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; /** * Pause a container. diff --git a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java index 3fddd0dba..9b0799553 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.PushResponseItem; diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java index 2214d4ae2..5cbb21171 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; /** * Remove a container. diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java index e2cb9ca22..987d29410 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; /** * diff --git a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index 07e8776e3..688141a20 100644 --- a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; /** * Restart a running container. diff --git a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java index 1469eabba..272a2d564 100644 --- a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -5,7 +5,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; public interface SaveImageCmd extends SyncDockerCmd { @@ -30,7 +30,7 @@ public interface SaveImageCmd extends SyncDockerCmd { /** * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. * - * @throws com.github.dockerjava.api.NotFoundException + * @throws NotFoundException * No such image */ public InputStream exec() throws NotFoundException; diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java index 6c64a4d29..4be500b4f 100644 --- a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -3,8 +3,8 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.NotModifiedException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.exception.NotModifiedException; /** * Start a container. diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java index af63c5c92..cf7cb53c8 100644 --- a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -3,8 +3,8 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.NotModifiedException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.exception.NotModifiedException; /** * Stop a running container. diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java index d3eb69c17..5c6381a71 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; /** * List processes running inside a container diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java index 0d7892468..5e620a079 100644 --- a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; /** * Unpause a container. diff --git a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java index 3192a8bf1..529f86bc3 100644 --- a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java @@ -3,7 +3,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.api.model.WaitResponse; diff --git a/src/main/java/com/github/dockerjava/api/BadRequestException.java b/src/main/java/com/github/dockerjava/api/exception/BadRequestException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/BadRequestException.java rename to src/main/java/com/github/dockerjava/api/exception/BadRequestException.java index 2696c5bc1..0934281a3 100644 --- a/src/main/java/com/github/dockerjava/api/BadRequestException.java +++ b/src/main/java/com/github/dockerjava/api/exception/BadRequestException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/ConflictException.java b/src/main/java/com/github/dockerjava/api/exception/ConflictException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/ConflictException.java rename to src/main/java/com/github/dockerjava/api/exception/ConflictException.java index 6a84fdee3..da223a79e 100644 --- a/src/main/java/com/github/dockerjava/api/ConflictException.java +++ b/src/main/java/com/github/dockerjava/api/exception/ConflictException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/DockerClientException.java b/src/main/java/com/github/dockerjava/api/exception/DockerClientException.java similarity index 88% rename from src/main/java/com/github/dockerjava/api/DockerClientException.java rename to src/main/java/com/github/dockerjava/api/exception/DockerClientException.java index 538698bb6..24139c0e1 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClientException.java +++ b/src/main/java/com/github/dockerjava/api/exception/DockerClientException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/DockerException.java b/src/main/java/com/github/dockerjava/api/exception/DockerException.java similarity index 92% rename from src/main/java/com/github/dockerjava/api/DockerException.java rename to src/main/java/com/github/dockerjava/api/exception/DockerException.java index 48bb2dd90..5b511ff96 100644 --- a/src/main/java/com/github/dockerjava/api/DockerException.java +++ b/src/main/java/com/github/dockerjava/api/exception/DockerException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java b/src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java similarity index 91% rename from src/main/java/com/github/dockerjava/api/InternalServerErrorException.java rename to src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java index cda5602ed..451a31bac 100644 --- a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java +++ b/src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java b/src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/NotAcceptableException.java rename to src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java index 78345a68b..45a2e97fc 100644 --- a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java +++ b/src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/NotFoundException.java b/src/main/java/com/github/dockerjava/api/exception/NotFoundException.java similarity index 92% rename from src/main/java/com/github/dockerjava/api/NotFoundException.java rename to src/main/java/com/github/dockerjava/api/exception/NotFoundException.java index 67e6f18bf..fb1d2369f 100644 --- a/src/main/java/com/github/dockerjava/api/NotFoundException.java +++ b/src/main/java/com/github/dockerjava/api/exception/NotFoundException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * Indicates that the given entity does not exist. diff --git a/src/main/java/com/github/dockerjava/api/NotModifiedException.java b/src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/NotModifiedException.java rename to src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java index fa0aa459f..3e2820365 100644 --- a/src/main/java/com/github/dockerjava/api/NotModifiedException.java +++ b/src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java b/src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/UnauthorizedException.java rename to src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java index b097d6523..2dcf8764e 100644 --- a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java +++ b/src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 6187be49c..6439680b9 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import com.github.dockerjava.api.DockerClientException; +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; diff --git a/src/main/java/com/github/dockerjava/core/FilePathUtil.java b/src/main/java/com/github/dockerjava/core/FilePathUtil.java index b02821bde..a5d926a53 100644 --- a/src/main/java/com/github/dockerjava/core/FilePathUtil.java +++ b/src/main/java/com/github/dockerjava/core/FilePathUtil.java @@ -3,7 +3,7 @@ import java.io.File; import java.io.IOException; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; public class FilePathUtil { diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index 6ebdd604b..8ce237c72 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; +import com.github.dockerjava.core.exception.GoLangFileMatchException; import org.apache.commons.lang.StringUtils; /** diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index c667d49e6..21719c591 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -10,7 +10,7 @@ import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.glassfish.jersey.SslConfigurator; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; /** * SSL Config from local files. diff --git a/src/main/java/com/github/dockerjava/core/NameParser.java b/src/main/java/com/github/dockerjava/core/NameParser.java index 49a550b1d..10ad10bd8 100644 --- a/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/src/main/java/com/github/dockerjava/core/NameParser.java @@ -5,6 +5,7 @@ import java.util.regex.Pattern; +import com.github.dockerjava.core.exception.InvalidRepositoryNameException; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 868bf3e97..15e92d474 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdSyncExec; import com.github.dockerjava.api.command.SyncDockerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java index bb112b884..16ebe03f8 100644 --- a/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AuthCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.exception.UnauthorizedException; import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthResponse; 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 9f501c8c6..2536b891b 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java @@ -8,7 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.core.async.ResultCallbackTemplate; diff --git a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java index dbd437470..b619dee78 100644 --- a/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java @@ -3,7 +3,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.fasterxml.jackson.annotation.JsonProperty; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.Volumes; diff --git a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java index 2651ddb77..3d788ac7b 100644 --- a/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java @@ -4,9 +4,9 @@ import java.util.List; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.InternalServerErrorException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.InternalServerErrorException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.model.ChangeLog; diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index 6258fc4ed..93c7e807c 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -5,7 +5,7 @@ import java.io.InputStream; import com.fasterxml.jackson.annotation.JsonProperty; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; /** 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 41f31dee4..555569f16 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -9,8 +9,8 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; -import com.github.dockerjava.api.ConflictException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Bind; 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 5df38860c..2c946f1cb 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecCreateCmdResponse; diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 72efd3052..a8e1742a0 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -4,7 +4,7 @@ import java.io.InputStream; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.ExecStartCmd; public class ExecStartCmdImpl extends AbstrDockerCmd implements ExecStartCmd { @@ -53,7 +53,7 @@ public ExecStartCmd withTty(Boolean tty) { } /** - * @throws com.github.dockerjava.api.NotFoundException + * @throws NotFoundException * No such exec instance */ @Override diff --git a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java index 5b4090a4e..f090d3a76 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java @@ -2,7 +2,7 @@ import static com.google.common.base.Preconditions.checkNotNull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; diff --git a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java index 0d93afc4e..d1c0d7140 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectExecResponse; import com.google.common.base.Preconditions; diff --git a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java index 93043f8e6..1f9735db8 100644 --- a/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java @@ -2,7 +2,7 @@ import static com.google.common.base.Preconditions.checkNotNull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; diff --git a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java index 45c5e38ba..3b51bd346 100644 --- a/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java @@ -2,7 +2,7 @@ import static com.google.common.base.Preconditions.checkNotNull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.KillContainerCmd; /** diff --git a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java index 1102b0893..0e35f0472 100644 --- a/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PauseContainerCmdImpl.java @@ -2,7 +2,7 @@ import static com.google.common.base.Preconditions.checkNotNull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.PauseContainerCmd; /** diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java index c0eaa5d3d..1beb9e3b3 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java @@ -6,7 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.PullResponseItem; import com.github.dockerjava.core.async.ResultCallbackTemplate; diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java index b13b444ca..9bc3b15d7 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java @@ -6,7 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.PushResponseItem; import com.github.dockerjava.core.async.ResultCallbackTemplate; diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java index d23323d2f..ac4181ff6 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java @@ -5,7 +5,7 @@ import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.RemoveContainerCmd; /** diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java index bca8d37b1..4badee130 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java @@ -5,7 +5,7 @@ import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.RemoveImageCmd; /** diff --git a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index fe99477fa..a521fe468 100644 --- a/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -3,7 +3,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.RestartContainerCmd; /** diff --git a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java index 12dafb7d9..64480758c 100644 --- a/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java @@ -4,7 +4,7 @@ import java.io.InputStream; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.SaveImageCmd; public class SaveImageCmdImpl extends AbstrDockerCmd implements SaveImageCmd { @@ -50,7 +50,7 @@ public SaveImageCmd withTag(String tag) { } /** - * @throws com.github.dockerjava.api.NotFoundException + * @throws NotFoundException * No such image */ @Override diff --git a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java index 9d432b7f3..679c93750 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -7,8 +7,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.NotModifiedException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.exception.NotModifiedException; import com.github.dockerjava.api.command.StartContainerCmd; /** diff --git a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index bb3ff28e6..0d745bcdd 100644 --- a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -6,8 +6,8 @@ import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.NotModifiedException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.exception.NotModifiedException; import com.github.dockerjava.api.command.StopContainerCmd; /** diff --git a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index 44fc97be2..fabdbe3ae 100644 --- a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -5,7 +5,7 @@ import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.TopContainerCmd; import com.github.dockerjava.api.command.TopContainerResponse; diff --git a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java index 949a7bb6f..2b9b19de3 100644 --- a/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java @@ -2,7 +2,7 @@ import static com.google.common.base.Preconditions.checkNotNull; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.UnpauseContainerCmd; /** diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java index 48f2749dc..cc255fcea 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java @@ -10,7 +10,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.WaitResponse; import com.github.dockerjava.core.async.ResultCallbackTemplate; import com.google.common.base.Throwables; 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 c9bd37d1e..2084b2cce 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.dockerfile; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.core.CompressArchiveUtil; import com.github.dockerjava.core.FilePathUtil; import com.github.dockerjava.core.GoLangFileMatch; -import com.github.dockerjava.core.GoLangFileMatchException; +import com.github.dockerjava.core.exception.GoLangFileMatchException; import com.github.dockerjava.core.GoLangMatchFileFilter; import com.google.common.base.Function; import com.google.common.base.Objects; diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java index 2c06312a1..91ff755db 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -8,7 +8,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.base.Optional; diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatchException.java b/src/main/java/com/github/dockerjava/core/exception/GoLangFileMatchException.java similarity index 81% rename from src/main/java/com/github/dockerjava/core/GoLangFileMatchException.java rename to src/main/java/com/github/dockerjava/core/exception/GoLangFileMatchException.java index d1f353938..3bbdc2a72 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatchException.java +++ b/src/main/java/com/github/dockerjava/core/exception/GoLangFileMatchException.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2014 SignalFuse, Inc. */ -package com.github.dockerjava.core; +package com.github.dockerjava.core.exception; public class GoLangFileMatchException extends IllegalArgumentException { diff --git a/src/main/java/com/github/dockerjava/core/InvalidRepositoryNameException.java b/src/main/java/com/github/dockerjava/core/exception/InvalidRepositoryNameException.java similarity index 86% rename from src/main/java/com/github/dockerjava/core/InvalidRepositoryNameException.java rename to src/main/java/com/github/dockerjava/core/exception/InvalidRepositoryNameException.java index 8885fc756..6b2341e31 100644 --- a/src/main/java/com/github/dockerjava/core/InvalidRepositoryNameException.java +++ b/src/main/java/com/github/dockerjava/core/exception/InvalidRepositoryNameException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.core; +package com.github.dockerjava.core.exception; public class InvalidRepositoryNameException extends IllegalArgumentException { diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java index ed1ec6233..4e44d42cd 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdSyncExec; import com.github.dockerjava.core.DockerClientConfig; diff --git a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java index 9c59a8c02..247a6a387 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AuthCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.jaxrs; -import com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.exception.UnauthorizedException; import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.model.AuthResponse; import com.github.dockerjava.core.DockerClientConfig; diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index c331f461c..745cd67c0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -1,7 +1,7 @@ package com.github.dockerjava.jaxrs; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.command.BuildImageCmd; diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java index 3d581a0b0..e597b594b 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java @@ -12,14 +12,14 @@ import org.apache.commons.io.IOUtils; -import com.github.dockerjava.api.BadRequestException; -import com.github.dockerjava.api.ConflictException; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.InternalServerErrorException; -import com.github.dockerjava.api.NotAcceptableException; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.NotModifiedException; -import com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.exception.BadRequestException; +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.InternalServerErrorException; +import com.github.dockerjava.api.exception.NotAcceptableException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.exception.NotModifiedException; +import com.github.dockerjava.api.exception.UnauthorizedException; /** * This {@link ClientResponseFilter} implementation detects http status codes and throws {@link DockerException}s diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index ec4aa82be..76409ebbc 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -21,7 +21,7 @@ import org.testng.ITestResult; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Volume; diff --git a/src/test/java/com/github/dockerjava/client/DockerClientTest.java b/src/test/java/com/github/dockerjava/client/DockerClientTest.java index d3bd75cf5..8a7d6f6a4 100644 --- a/src/test/java/com/github/dockerjava/client/DockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/DockerClientTest.java @@ -14,7 +14,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.core.command.WaitContainerResultCallback; diff --git a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java index 990548442..342c740ed 100644 --- a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java +++ b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java @@ -5,6 +5,7 @@ import java.io.IOException; +import com.github.dockerjava.core.exception.GoLangFileMatchException; import junit.framework.Assert; import org.apache.commons.io.FilenameUtils; diff --git a/src/test/java/com/github/dockerjava/core/NameParserTest.java b/src/test/java/com/github/dockerjava/core/NameParserTest.java index 6b694753a..afae80ebb 100644 --- a/src/test/java/com/github/dockerjava/core/NameParserTest.java +++ b/src/test/java/com/github/dockerjava/core/NameParserTest.java @@ -3,6 +3,7 @@ */ package com.github.dockerjava.core; +import com.github.dockerjava.core.exception.InvalidRepositoryNameException; import org.apache.commons.lang.StringUtils; import org.testng.annotations.Test; 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 36211b205..c01c8b8cd 100644 --- a/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AuthCmdImplTest.java @@ -9,7 +9,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.exception.UnauthorizedException; import com.github.dockerjava.api.model.AuthResponse; import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.DockerClientBuilder; 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 206fcacf1..89d15ecac 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -24,7 +24,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; 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 657edf8d7..b8758d332 100644 --- a/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CommitCmdImplTest.java @@ -16,8 +16,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectImageResponse; import com.github.dockerjava.client.AbstractDockerClientTest; 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 aa692d2c5..62c7b2ec0 100644 --- a/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ContainerDiffCmdImplTest.java @@ -17,8 +17,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.ChangeLog; import com.github.dockerjava.client.AbstractDockerClientTest; 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 96bae1d8a..3e4e88612 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java @@ -14,7 +14,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; 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 a383782e6..d2b2985ac 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -1,7 +1,7 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.ConflictException; -import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.AccessMode; diff --git a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java index 569f44d57..acb8b8a5d 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -6,8 +6,8 @@ import org.slf4j.LoggerFactory; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.InternalServerErrorException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.InternalServerErrorException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Image; /** diff --git a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java index f6551d573..d234efe4c 100644 --- a/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InfoCmdImplTest.java @@ -13,7 +13,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Info; import com.github.dockerjava.client.AbstractDockerClientTest; 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 6346ce165..1a4e65ccd 100644 --- a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java @@ -17,8 +17,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; diff --git a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java index 3c1fe738d..6f1ae7a68 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java @@ -19,7 +19,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.api.model.Info; 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 beb38d885..0a9a39718 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -15,7 +15,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; diff --git a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java index 0d7b112f6..d5e6d2c48 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -13,7 +13,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.InspectImageResponse; import com.github.dockerjava.api.command.PullImageCmd; 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 2f7e1c391..e89a071b8 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -15,7 +15,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; 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 1b39e5ac0..87ace71df 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveContainerCmdImplTest.java @@ -19,8 +19,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Container; import com.github.dockerjava.client.AbstractDockerClientTest; 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 75f58828b..a4d670e31 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java @@ -20,8 +20,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Container; import com.github.dockerjava.client.AbstractDockerClientTest; 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 1258cd7df..31b81726f 100644 --- a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java @@ -15,8 +15,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; diff --git a/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java index 6b3d2adb9..78e018427 100644 --- a/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/SearchImagesCmdImplTest.java @@ -18,7 +18,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.SearchItem; import com.github.dockerjava.client.AbstractDockerClientTest; 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 560d8cbca..042497672 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -24,9 +24,9 @@ import org.testng.annotations.Test; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.InternalServerErrorException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.InternalServerErrorException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.StartContainerCmd; 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 1342471ca..12213b802 100644 --- a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java @@ -17,8 +17,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; 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 116d2b68d..94d4291d0 100644 --- a/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/TagImageCmdImplTest.java @@ -12,7 +12,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") diff --git a/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java index 7bac10c6e..d8bfb3f23 100644 --- a/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/VersionCmdImplTest.java @@ -10,7 +10,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.Version; import com.github.dockerjava.client.AbstractDockerClientTest; diff --git a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java index 68d638807..02ddaf32a 100644 --- a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java @@ -15,8 +15,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.WaitResponse; diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java index 133ed2eae..b121900b4 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.dockerfile; -import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.exception.DockerClientException; import com.google.common.base.Optional; import junit.framework.TestCase; import org.hamcrest.Matcher; From 3302c540ae411d497fb1677e1d5e1a83582989c7 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 14 Nov 2015 20:18:08 +0300 Subject: [PATCH 0050/1032] Make util contstructors private --- .../java/com/github/dockerjava/core/CertificateUtils.java | 3 +++ .../java/com/github/dockerjava/core/CompressArchiveUtil.java | 5 ++++- src/main/java/com/github/dockerjava/core/FilePathUtil.java | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/CertificateUtils.java index cae59836f..88ff42f26 100644 --- a/src/main/java/com/github/dockerjava/core/CertificateUtils.java +++ b/src/main/java/com/github/dockerjava/core/CertificateUtils.java @@ -26,6 +26,9 @@ import java.util.List; public class CertificateUtils { + private CertificateUtils() { + // utility class + } public static boolean verifyCertificatesExist(String dockerCertPath) { String[] files = { "ca.pem", "cert.pem", "key.pem" }; diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index c64d07b7d..356c0c88d 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import static com.github.dockerjava.core.FilePathUtil.relativize; +import static com.github.dockerjava.core.util.FilePathUtil.relativize; import java.io.BufferedOutputStream; import java.io.File; @@ -13,6 +13,9 @@ import org.apache.commons.io.FileUtils; public class CompressArchiveUtil { + private CompressArchiveUtil() { + // utility class + } public static File archiveTARFiles(File base, Iterable files, String archiveNameWithOutExtension) throws IOException { diff --git a/src/main/java/com/github/dockerjava/core/FilePathUtil.java b/src/main/java/com/github/dockerjava/core/FilePathUtil.java index a5d926a53..94393f1b8 100644 --- a/src/main/java/com/github/dockerjava/core/FilePathUtil.java +++ b/src/main/java/com/github/dockerjava/core/FilePathUtil.java @@ -6,6 +6,9 @@ import com.github.dockerjava.api.exception.DockerClientException; public class FilePathUtil { + private FilePathUtil() { + // utility class + } /** * Return the relative path. Path elements are separated with / char. From 291326475cc498d2c1ca43fdc3b3c4e01db94ab4 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 14 Nov 2015 20:18:23 +0300 Subject: [PATCH 0051/1032] Remove unused imports --- .../com/github/dockerjava/api/command/WaitContainerCmd.java | 1 - .../com/github/dockerjava/api/model/BuildResponseItem.java | 1 - .../java/com/github/dockerjava/api/model/PushResponseItem.java | 1 - .../github/dockerjava/core/command/AbstrAsyncDockerCmd.java | 2 -- .../github/dockerjava/core/command/RemoveContainerCmdImpl.java | 3 --- .../com/github/dockerjava/core/command/RemoveImageCmdImpl.java | 3 --- .../github/dockerjava/core/command/StartContainerCmdImpl.java | 2 -- .../github/dockerjava/core/command/StopContainerCmdImpl.java | 3 --- .../com/github/dockerjava/core/command/TagImageCmdImpl.java | 3 --- .../github/dockerjava/core/command/TopContainerCmdImpl.java | 3 --- .../dockerjava/core/command/WaitContainerResultCallback.java | 1 - .../com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 1 - .../dockerjava/core/command/CreateContainerCmdImplTest.java | 2 -- 13 files changed, 26 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java index 529f86bc3..09f480021 100644 --- a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java @@ -5,7 +5,6 @@ import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.async.ResultCallback; -import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.api.model.WaitResponse; /** 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 348a4c8f5..264988910 100644 --- a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; /** * Represents a build response stream item diff --git a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java index 31a2329d8..059398d4e 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java @@ -1,6 +1,5 @@ package com.github.dockerjava.api.model; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java index c49c0404c..5849fc3fb 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java @@ -2,8 +2,6 @@ import static com.google.common.base.Preconditions.checkNotNull; -import java.io.IOException; - import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.AsyncDockerCmd; import com.github.dockerjava.api.command.DockerCmdAsyncExec; diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java index ac4181ff6..980088c74 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java @@ -2,9 +2,6 @@ import static com.google.common.base.Preconditions.checkNotNull; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; - import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.RemoveContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java index 4badee130..d8b8f1181 100644 --- a/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java @@ -2,9 +2,6 @@ import static com.google.common.base.Preconditions.checkNotNull; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; - import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.RemoveImageCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java index 679c93750..740032815 100644 --- a/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -3,8 +3,6 @@ import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; import static com.google.common.base.Preconditions.checkNotNull; -import org.apache.commons.lang.builder.ToStringBuilder; - import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.github.dockerjava.api.exception.NotFoundException; diff --git a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index 0d745bcdd..5c0634c71 100644 --- a/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -3,9 +3,6 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; - import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.exception.NotModifiedException; import com.github.dockerjava.api.command.StopContainerCmd; diff --git a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java index afa3c3e52..c1337112d 100644 --- a/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java @@ -2,9 +2,6 @@ import static com.google.common.base.Preconditions.checkNotNull; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; - import com.github.dockerjava.api.command.TagImageCmd; /** diff --git a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index fabdbe3ae..77adf1916 100644 --- a/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -2,9 +2,6 @@ import static com.google.common.base.Preconditions.checkNotNull; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; - import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.TopContainerCmd; import com.github.dockerjava.api.command.TopContainerResponse; diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java index cc255fcea..5af956cf2 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java @@ -13,7 +13,6 @@ import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.WaitResponse; import com.github.dockerjava.core.async.ResultCallbackTemplate; -import com.google.common.base.Throwables; /** * diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 745cd67c0..e3d57442a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -40,7 +40,6 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.RemoteApiVersion; import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; 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 d2b2985ac..a445c6ceb 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -45,8 +45,6 @@ import java.util.Map; import java.util.UUID; -import static com.github.dockerjava.api.model.Capability.MKNOD; -import static com.github.dockerjava.api.model.Capability.NET_ADMIN; import static org.hamcrest.MatcherAssert.assertThat; @Test(groups = "integration") From f9c597218263a987f247da7d1f92e3ffe10bb2a9 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 15 Nov 2015 22:39:17 +0100 Subject: [PATCH 0052/1032] Added basic SSL support --- .../dockerjava/core/DockerClientConfig.java | 15 +- .../netty/DockerCmdExecFactoryImpl.java | 848 +++++++++--------- .../core/DockerClientConfigTest.java | 2 +- .../dockerjava/core/DockerClientImplTest.java | 2 +- 4 files changed, 453 insertions(+), 414 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 6187be49c..3e7e20f79 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -73,16 +73,20 @@ public class DockerClientConfig implements Serializable { private final SSLConfig sslConfig; + private final String dockerCertPath; + DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, - String dockerCfgPath, SSLConfig sslConfig) { + String dockerCfgPath, String dockerCertPath, SSLConfig sslConfig) { this.uri = uri; this.version = RemoteApiVersion.parseConfigWithDefault(version); this.username = username; this.password = password; this.email = email; this.serverAddress = serverAddress; + this.dockerCfgPath = dockerCfgPath; this.sslConfig = sslConfig; + this.dockerCertPath = dockerCertPath; } private static Properties loadIncludedDockerProperties(Properties systemProperties) { @@ -240,6 +244,10 @@ public String getDockerCfgPath() { return dockerCfgPath; } + public String getDockerCertPath() { + return dockerCertPath; + } + private AuthConfig getAuthConfig() { AuthConfig authConfig = null; if (getUsername() != null && getPassword() != null && getEmail() != null && getServerAddress() != null) { @@ -346,7 +354,7 @@ public String toString() { public static class DockerClientConfigBuilder { private URI uri; - private String version, username, password, email, serverAddress, dockerCfgPath; + private String version, username, password, email, serverAddress, dockerCfgPath, dockerCertPath; private SSLConfig sslConfig; @@ -401,6 +409,7 @@ public DockerClientConfigBuilder withServerAddress(String serverAddress) { public final DockerClientConfigBuilder withDockerCertPath(String dockerCertPath) { if (dockerCertPath != null) { this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); + this.dockerCertPath = dockerCertPath; } return this; } @@ -416,7 +425,7 @@ public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { } public DockerClientConfig build() { - return new DockerClientConfig(uri, version, username, password, email, serverAddress, dockerCfgPath, + return new DockerClientConfig(uri, version, username, password, email, serverAddress, dockerCfgPath, dockerCertPath, sslConfig); } } diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java index 3627038cd..fcbbe17b6 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -1,17 +1,33 @@ 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.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.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.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.SslProvider; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.net.UnknownHostException; +import java.security.Security; -import javax.net.ssl.SSLException; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.TrustManagerFactory; -import org.apache.commons.io.IOUtils; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,432 +69,446 @@ 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.model.Frame; -import com.github.dockerjava.api.model.Info; +import com.github.dockerjava.core.CertificateUtils; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.DockerClientConfig.DockerClientConfigBuilder; import com.github.dockerjava.core.command.ExecCreateCmdImpl; import com.github.dockerjava.core.command.ExecStartCmdImpl; -import com.github.dockerjava.core.command.FrameReader; -import com.github.dockerjava.core.command.InfoCmdImpl; -import com.github.dockerjava.netty.handler.HijackHttpConnectionHandler; -import com.github.dockerjava.netty.handler.HttpResponseInboundHandler; - -import io.netty.bootstrap.Bootstrap; -import io.netty.buffer.ByteBuf; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.channel.epoll.EpollDomainSocketChannel; -import io.netty.channel.epoll.EpollEventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -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.codec.http.HttpContent; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.LastHttpContent; -import io.netty.handler.codec.json.JsonObjectDecoder; -import io.netty.handler.logging.LogLevel; -import io.netty.handler.logging.LoggingHandler; -import io.netty.handler.proxy.HttpProxyHandler; -import io.netty.handler.ssl.SslContext; -import io.netty.handler.ssl.SslContextBuilder; -import io.netty.handler.ssl.util.InsecureTrustManagerFactory; /** - * 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 - * + * 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 + * * @author marcus * */ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { - private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); + private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); + + private DockerClientConfig dockerClientConfig; + + private Bootstrap bootstrap; + + private EventLoopGroup eventLoopGroup; + + private NettyInitializer nettyInitializer; + + private ChannelProvider channelProvider = new ChannelProvider() { + @Override + public Channel getChannel() { + return connect(); + } + }; + + @Override + public void init(DockerClientConfig dockerClientConfig) { + checkNotNull(dockerClientConfig, "config was not specified"); + this.dockerClientConfig = dockerClientConfig; + + bootstrap = new Bootstrap(); - private DockerClientConfig dockerClientConfig; + String scheme = dockerClientConfig.getUri().getScheme(); - private Bootstrap bootstrap; + if ("unix".equals(scheme)) { + nettyInitializer = new UnixDomainSocketInitializer(); + } else if (scheme.startsWith("http")) { + nettyInitializer = new InetSocketInitializer(); + } - private EventLoopGroup eventLoopGroup; + nettyInitializer.init(bootstrap, dockerClientConfig); + } - private ChannelProvider channelProvider = new ChannelProvider() { - @Override - public Channel getChannel() { - return connect(); - } - }; + private Channel connect() { + try { + return connect(bootstrap); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } - @Override - public void init(DockerClientConfig dockerClientConfig) { - checkNotNull(dockerClientConfig, "config was not specified"); - this.dockerClientConfig = dockerClientConfig; + private Channel connect(final Bootstrap bootstrap) throws InterruptedException { + return nettyInitializer.connect(bootstrap); + } - bootstrap = new Bootstrap(); + private static interface NettyInitializer { + EventLoopGroup init(final Bootstrap bootstrap, DockerClientConfig dockerClientConfig); + Channel connect(final Bootstrap bootstrap) throws InterruptedException; + } - String scheme = dockerClientConfig.getUri().getScheme(); - if ("unix".equals(scheme)) { - eventLoopGroup = new EpollEventLoopGroup(); - bootstrap.group(eventLoopGroup).channel(EpollDomainSocketChannel.class) - .handler(new ChannelInitializer() { - @Override - protected void initChannel(final UnixChannel channel) throws Exception { - channel.pipeline().addLast(new HttpClientCodec()); - } - }); + private class UnixDomainSocketInitializer implements NettyInitializer { + @Override + public EventLoopGroup init(Bootstrap bootstrap, DockerClientConfig dockerClientConfig) { + EventLoopGroup eventLoopGroup = new EpollEventLoopGroup(); + bootstrap.group(eventLoopGroup).channel(EpollDomainSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(final UnixChannel channel) throws Exception { + channel.pipeline().addLast(new HttpClientCodec()); + } + }); + return eventLoopGroup; + } - } else if ("http".equals(scheme)) { - eventLoopGroup = new NioEventLoopGroup(); + @Override + public Channel connect(Bootstrap bootstrap) throws InterruptedException { + return bootstrap.connect(new DomainSocketAddress("/var/run/docker.sock")).sync().channel(); + } + } - try { - final SslContext sslCtx = SslContextBuilder.forClient() - .trustManager(InsecureTrustManagerFactory.INSTANCE).build(); + private class InetSocketInitializer implements NettyInitializer { + @Override + public EventLoopGroup init(Bootstrap bootstrap, DockerClientConfig dockerClientConfig) { + EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); - InetAddress addr = InetAddress.getLoopbackAddress(); - - final SocketAddress proxyAddress = new InetSocketAddress(addr, 8008); - - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) - .handler(new ChannelInitializer() { - @Override - protected void initChannel(final SocketChannel channel) throws Exception { - // channel.pipeline().addLast(new - // HttpProxyHandler(proxyAddress)); - - // channel.pipeline().addLast(sslCtx.newHandler(channel.alloc())); - HttpClientCodec httpClientCodec = new HttpClientCodec(); - - channel.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); - channel.pipeline().addLast(httpClientCodec); - - } - }); - - } catch (SSLException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - - } - - } - - private Channel connect() { - try { - return connect(bootstrap); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - private Channel connect(final Bootstrap bootstrap) throws InterruptedException { - - String scheme = dockerClientConfig.getUri().getScheme(); - - if ("unix".equals(scheme)) { - return bootstrap.connect(new DomainSocketAddress("/var/run/docker.sock")).sync().channel(); - } else if ("http".equals(scheme)) { - String host = dockerClientConfig.getUri().getHost(); - int port = dockerClientConfig.getUri().getPort(); - - if (port == -1) { - throw new RuntimeException("no port configured for " + host); - } - - return bootstrap.connect(host, port).sync().channel(); - } else { - throw new RuntimeException("unsupported protocol scheme: " + scheme); - } - - } - - 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 null; // new AuthCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public InfoCmd.Exec createInfoCmdExec() { - return new InfoCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); - } - - @Override - public PingCmd.Exec createPingCmdExec() { - return null; // new PingCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public VersionCmd.Exec createVersionCmdExec() { - return null; // new VersionCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public PullImageCmd.Exec createPullImageCmdExec() { - return null; // new PullImageCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public PushImageCmd.Exec createPushImageCmdExec() { - return null; // new PushImageCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public SaveImageCmd.Exec createSaveImageCmdExec() { - return null; // new SaveImageCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public CreateImageCmd.Exec createCreateImageCmdExec() { - return null; // new CreateImageCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public SearchImagesCmd.Exec createSearchImagesCmdExec() { - return null; // new SearchImagesCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return null; // new RemoveImageCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public ListImagesCmd.Exec createListImagesCmdExec() { - return null; // new ListImagesCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public InspectImageCmd.Exec createInspectImageCmdExec() { - return null; // new InspectImageCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public ListContainersCmd.Exec createListContainersCmdExec() { - return null; // new ListContainersCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return null; // new CreateContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public StartContainerCmd.Exec createStartContainerCmdExec() { - return null; // new StartContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public InspectContainerCmd.Exec createInspectContainerCmdExec() { - return null; // new InspectContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public ExecCreateCmd.Exec createExecCmdExec() { - return new ExecCreateCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); - } - - @Override - public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return null; // new RemoveContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public WaitContainerCmd.Exec createWaitContainerCmdExec() { - return null; // new WaitContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public AttachContainerCmd.Exec createAttachContainerCmdExec() { - return null; // new AttachContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public ExecStartCmd.Exec createExecStartCmdExec() { - - return new ExecStartCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); - } - - @Override - public InspectExecCmd.Exec createInspectExecCmdExec() { - return null; // new InspectExecCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public LogContainerCmd.Exec createLogContainerCmdExec() { - return null; // new LogContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return null; // new CopyFileFromContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public StopContainerCmd.Exec createStopContainerCmdExec() { - return null; // new StopContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public ContainerDiffCmd.Exec createContainerDiffCmdExec() { - return null; // new ContainerDiffCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public KillContainerCmd.Exec createKillContainerCmdExec() { - return null; // new KillContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public RestartContainerCmd.Exec createRestartContainerCmdExec() { - return null; // new RestartContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public CommitCmd.Exec createCommitCmdExec() { - return null; // new CommitCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public BuildImageCmd.Exec createBuildImageCmdExec() { - return null; // new BuildImageCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public TopContainerCmd.Exec createTopContainerCmdExec() { - return null; // new TopContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public TagImageCmd.Exec createTagImageCmdExec() { - return null; // new TagImageCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public PauseContainerCmd.Exec createPauseContainerCmdExec() { - return null; // new PauseContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { - return null; // new UnpauseContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public EventsCmd.Exec createEventsCmdExec() { - return null; // new EventsCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public StatsCmd.Exec createStatsCmdExec() { - return null; // new StatsCmdExec(getBaseResource(), - // getDockerClientConfig()); - } - - @Override - public void close() throws IOException { - // checkNotNull(client, "Factory not initialized. You probably forgot to - // call init()!"); - // client.close(); - - eventLoopGroup.shutdownGracefully(); - } - - public static void main(String[] args) throws IOException { - DockerCmdExecFactory execFactory = new DockerCmdExecFactoryImpl(); - // execFactory.init(new - // DockerClientConfigBuilder().withUri("unix:///var/run/docker.sock").build()); - execFactory.init(new DockerClientConfigBuilder().withUri("http://localhost:2375").build()); - - // InfoCmd.Exec exec = execFactory.createInfoCmdExec(); - // - // InfoCmd infoCmd = new InfoCmdImpl(exec); - // - // Info info = infoCmd.exec(); - // - // System.out.println("result: " + info); - // - // infoCmd.close(); - - ExecCreateCmd.Exec execCreate = execFactory.createExecCmdExec(); - - ExecCreateCmd execCreateCmd = new ExecCreateCmdImpl(execCreate, "test").withCmd("/bin/bash") - .withAttachStdout(true).withAttachStderr(true).withAttachStdin(true); - - ExecCreateCmdResponse execCreateCmdResponse = execCreate.exec(execCreateCmd); - - System.out.println("result: " + execCreateCmdResponse); - - ExecStartCmd.Exec execStart = execFactory.createExecStartCmdExec(); - - ExecStartCmd execStartCmd = new ExecStartCmdImpl(execStart, execCreateCmdResponse.getId()).withDetach(false) - .withTty(true); - - InputStream response = execStart.exec(execStartCmd); - -// FrameReader frameReader = new FrameReader(response); -// -// System.out.println("read frame"); -// Frame frame = frameReader.readFrame(); -// -// while(frame != null) { -// System.out.println("frame: " + frame); -// frame = frameReader.readFrame(); -// } -// System.out.println("all frames read"); -// -// System.out.flush(); - - // System.out.println("response: " + IOUtils.toString(response, - // "UTF-8")); - - //execFactory.close(); - } + InetAddress addr = InetAddress.getLoopbackAddress(); + + final SocketAddress proxyAddress = new InetSocketAddress(addr, 8008); + + final SslContext sslCtx = initSslContext(dockerClientConfig); + + bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(final SocketChannel channel) throws Exception { + // channel.pipeline().addLast(new + // HttpProxyHandler(proxyAddress)); + + if (sslCtx != null) { + channel.pipeline().addLast(sslCtx.newHandler(channel.alloc())); + } + + channel.pipeline().addLast(new HttpClientCodec()); + } + }); + + return eventLoopGroup; + } + + @Override + public Channel connect(Bootstrap bootstrap) throws InterruptedException { + String host = dockerClientConfig.getUri().getHost(); + int port = dockerClientConfig.getUri().getPort(); + + if (port == -1) { + throw new RuntimeException("no port configured for " + host); + } + + return bootstrap.connect(host, port).sync().channel(); + } + + private SslContext initSslContext(DockerClientConfig dockerClientConfig) { + SslContext sslContext = null; + + String scheme = dockerClientConfig.getUri().getScheme(); + + if ("https".equals(scheme) && dockerClientConfig.getDockerCertPath() != null) { + + String dockerCertPath = dockerClientConfig.getDockerCertPath(); + + Security.addProvider(new BouncyCastleProvider()); + + try { + TrustManagerFactory tmFactory = TrustManagerFactory.getInstance("PKIX"); + tmFactory.init(CertificateUtils.createTrustStore(dockerCertPath)); + + KeyManagerFactory kmFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmFactory.init(CertificateUtils.createKeyStore(dockerCertPath), "docker".toCharArray()); + + sslContext = SslContextBuilder.forClient().sslProvider(SslProvider.JDK).keyManager(kmFactory) + .trustManager(tmFactory).build(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + return sslContext; + } + } + + 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 null; // new AuthCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return new InfoCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return null; // new PingCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return null; // new VersionCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return null; // new PullImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return null; // new PushImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return null; // new SaveImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return null; // new CreateImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return null; // new SearchImagesCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return null; // new RemoveImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return null; // new ListImagesCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return null; // new InspectImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return null; // new ListContainersCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return null; // new CreateContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return null; // new StartContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return null; // new InspectContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return new ExecCreateCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return null; // new RemoveContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return null; // new WaitContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return null; // new AttachContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + + return new ExecStartCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); + } + + @Override + public InspectExecCmd.Exec createInspectExecCmdExec() { + return null; // new InspectExecCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return null; // new LogContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return null; // new CopyFileFromContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return null; // new StopContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return null; // new ContainerDiffCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return null; // new KillContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return null; // new RestartContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return null; // new CommitCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return null; // new BuildImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return null; // new TopContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return null; // new TagImageCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return null; // new PauseContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return null; // new UnpauseContainerCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return null; // new EventsCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public StatsCmd.Exec createStatsCmdExec() { + return null; // new StatsCmdExec(getBaseResource(), + // getDockerClientConfig()); + } + + @Override + public void close() throws IOException { + // checkNotNull(client, "Factory not initialized. You probably forgot to + // call init()!"); + // client.close(); + + eventLoopGroup.shutdownGracefully(); + } + + public static void main(String[] args) throws IOException { + DockerCmdExecFactory execFactory = new DockerCmdExecFactoryImpl(); + // execFactory.init(new + // DockerClientConfigBuilder().withUri("unix:///var/run/docker.sock").build()); + // execFactory.init(new DockerClientConfigBuilder().withUri("http://localhost:2375").build()); + + DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder().withUri("https://192.168.59.103:2376").build(); + + execFactory.init(config); + + // InfoCmd.Exec exec = execFactory.createInfoCmdExec(); + // + // InfoCmd infoCmd = new InfoCmdImpl(exec); + // + // Info info = infoCmd.exec(); + // + // System.out.println("result: " + info); + // + // infoCmd.close(); + + ExecCreateCmd.Exec execCreate = execFactory.createExecCmdExec(); + + ExecCreateCmd execCreateCmd = new ExecCreateCmdImpl(execCreate, "test").withCmd("/bin/bash") + .withAttachStdout(true).withAttachStderr(true).withAttachStdin(true); + + ExecCreateCmdResponse execCreateCmdResponse = execCreate.exec(execCreateCmd); + + System.out.println("result: " + execCreateCmdResponse); + + ExecStartCmd.Exec execStart = execFactory.createExecStartCmdExec(); + + ExecStartCmd execStartCmd = new ExecStartCmdImpl(execStart, execCreateCmdResponse.getId()).withDetach(false) + .withTty(true); + + InputStream response = execStart.exec(execStartCmd); + + // FrameReader frameReader = new FrameReader(response); + // + // System.out.println("read frame"); + // Frame frame = frameReader.readFrame(); + // + // while(frame != null) { + // System.out.println("frame: " + frame); + // frame = frameReader.readFrame(); + // } + // System.out.println("all frames read"); + // + // System.out.flush(); + + // System.out.println("response: " + IOUtils.toString(response, + // "UTF-8")); + + // execFactory.close(); + } } diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index e66cfa57d..cfcf7f381 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -16,7 +16,7 @@ public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", "flum", new LocalDirectorySSLConfig("flim")); } diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index c5a1e841c..5f4ee3e67 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,7 +10,7 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, null); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, null, null); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config From 87e398aa15885b04c75e0532b00ae46ac6e04991 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 20 Nov 2015 08:55:08 +0100 Subject: [PATCH 0053/1032] Migrated more command exec implementations and tests --- .../dockerjava/api/command/ExecStartCmd.java | 9 +- .../api/command/LogContainerCmd.java | 8 + .../dockerjava/core/DockerClientConfig.java | 12 +- .../core/command/ExecStartCmdImpl.java | 12 +- .../core/command/ExecStartResultCallback.java | 63 ++ .../dockerjava/jaxrs/ExecStartCmdExec.java | 22 +- .../netty/DockerCmdExecFactoryImpl.java | 158 ++--- .../dockerjava/netty/ExecStartCmdExec.java | 29 - .../dockerjava/netty/InvocationBuilder.java | 446 ++++++++------ .../github/dockerjava/netty/MediaType.java | 9 +- .../netty/exec/AbstrAsyncDockerCmdExec.java | 67 +++ .../netty/{ => exec}/AbstrDockerCmdExec.java | 4 +- .../{ => exec}/AbstrSyncDockerCmdExec.java | 3 +- .../dockerjava/netty/exec/AuthCmdExec.java | 34 ++ .../exec/CopyFileFromContainerCmdExec.java | 33 ++ .../netty/exec/CreateContainerCmdExec.java | 35 ++ .../netty/{ => exec}/ExecCreateCmdExec.java | 7 +- .../netty/exec/ExecStartCmdExec.java | 29 + .../netty/{ => exec}/InfoCmdExec.java | 11 +- .../netty/exec/InspectContainerCmdExec.java | 31 + .../netty/exec/InspectExecCmdExec.java | 26 + .../netty/exec/InspectImageCmdExec.java | 31 + .../netty/exec/KillContainerCmdExec.java | 35 ++ .../netty/exec/ListContainersCmdExec.java | 53 ++ .../netty/exec/LogContainerCmdExec.java | 48 ++ .../netty/exec/RemoveContainerCmdExec.java | 33 ++ .../netty/exec/StartContainerCmdExec.java | 33 ++ .../netty/exec/StopContainerCmdExec.java | 36 ++ .../netty/exec/WaitContainerCmdExec.java | 36 ++ .../handler/AwaitObjectInboundHandler.java | 62 +- .../DeserializeJsonInboundHandler.java | 7 +- ....java => FramedResponseStreamHandler.java} | 48 +- ....java => HttpConnectionHijackHandler.java} | 28 +- .../netty/handler/HttpResponseHandler.java | 83 +++ .../handler/HttpResponseInboundHandler.java | 128 ---- .../HttpResponseStreamInboundHandler.java | 176 +++--- .../core/DockerClientConfigTest.java | 2 +- .../dockerjava/core/DockerClientImplTest.java | 2 +- .../core/command/ExecStartCmdImplTest.java | 6 +- .../core/command/InspectExecCmdImplTest.java | 16 +- .../netty/AbstractDockerClientTest.java | 217 +++++++ .../netty/exec/AuthCmdExecTest.java | 57 ++ .../exec/CreateContainerCmdExecTest.java | 560 ++++++++++++++++++ .../netty/exec/ExecCreateCmdExecTest.java | 61 ++ .../netty/exec/ExecStartCmdExecTest.java | 97 +++ .../netty/exec/InfoCmdExecTest.java | 71 +++ .../netty/exec/InspectExecCmdExecTest.java | 96 +++ .../netty/exec/KillContainerCmdExecTest.java | 80 +++ .../netty/exec/LogContainerCmdExecTest.java | 171 ++++++ .../netty/exec/StopContainerCmdExecTest.java | 79 +++ .../netty/exec/WaitContainerCmdExecTest.java | 108 ++++ src/test/resources/logback.xml | 1 + 52 files changed, 2882 insertions(+), 627 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java delete mode 100644 src/main/java/com/github/dockerjava/netty/ExecStartCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/AbstrAsyncDockerCmdExec.java rename src/main/java/com/github/dockerjava/netty/{ => exec}/AbstrDockerCmdExec.java (96%) rename src/main/java/com/github/dockerjava/netty/{ => exec}/AbstrSyncDockerCmdExec.java (92%) create mode 100644 src/main/java/com/github/dockerjava/netty/exec/AuthCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java rename src/main/java/com/github/dockerjava/netty/{ => exec}/ExecCreateCmdExec.java (78%) create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ExecStartCmdExec.java rename src/main/java/com/github/dockerjava/netty/{ => exec}/InfoCmdExec.java (91%) create mode 100644 src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/KillContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/StartContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/StopContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java rename src/main/java/com/github/dockerjava/netty/handler/{DockerRawStreamHandler.java => FramedResponseStreamHandler.java} (76%) rename src/main/java/com/github/dockerjava/netty/handler/{HijackHttpConnectionHandler.java => HttpConnectionHijackHandler.java} (76%) create mode 100644 src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java delete mode 100644 src/main/java/com/github/dockerjava/netty/handler/HttpResponseInboundHandler.java create mode 100644 src/test/java/com/github/dockerjava/netty/AbstractDockerClientTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/AuthCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ExecCreateCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/InfoCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/KillContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/WaitContainerCmdExecTest.java diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java index c9e0d3f00..2129bf40c 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -6,8 +6,10 @@ import javax.annotation.Nonnull; import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.Frame; -public interface ExecStartCmd extends SyncDockerCmd { +public interface ExecStartCmd extends AsyncDockerCmd { @CheckForNull public String getExecId(); @@ -25,15 +27,14 @@ public interface ExecStartCmd extends SyncDockerCmd { public ExecStartCmd withTty(Boolean tty); /** - * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. * * @throws com.github.dockerjava.api.NotFoundException * No such exec instance */ @Override - public InputStream exec() throws NotFoundException; + public > T exec(T resultCallback); - public static interface Exec extends DockerCmdSyncExec { + public static interface Exec extends DockerCmdAsyncExec { } } diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index f06a715cb..f4b5076c5 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -6,6 +6,7 @@ import javax.annotation.Nonnull; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.Frame; /** @@ -69,6 +70,13 @@ public interface LogContainerCmd extends AsyncDockerCmd public LogContainerCmd withSince(Integer since); + /** + * @throws com.github.dockerjava.api.NotFoundException + * No such container + */ + @Override + public > T exec(T resultCallback); + public static interface Exec extends DockerCmdAsyncExec { } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 3e7e20f79..c3e12d91b 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -73,20 +73,16 @@ public class DockerClientConfig implements Serializable { private final SSLConfig sslConfig; - private final String dockerCertPath; - DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, - String dockerCfgPath, String dockerCertPath, SSLConfig sslConfig) { + String dockerCfgPath, SSLConfig sslConfig) { this.uri = uri; this.version = RemoteApiVersion.parseConfigWithDefault(version); this.username = username; this.password = password; this.email = email; this.serverAddress = serverAddress; - this.dockerCfgPath = dockerCfgPath; this.sslConfig = sslConfig; - this.dockerCertPath = dockerCertPath; } private static Properties loadIncludedDockerProperties(Properties systemProperties) { @@ -244,10 +240,6 @@ public String getDockerCfgPath() { return dockerCfgPath; } - public String getDockerCertPath() { - return dockerCertPath; - } - private AuthConfig getAuthConfig() { AuthConfig authConfig = null; if (getUsername() != null && getPassword() != null && getEmail() != null && getServerAddress() != null) { @@ -425,7 +417,7 @@ public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { } public DockerClientConfig build() { - return new DockerClientConfig(uri, version, username, password, email, serverAddress, dockerCfgPath, dockerCertPath, + return new DockerClientConfig(uri, version, username, password, email, serverAddress, dockerCfgPath, sslConfig); } } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 72efd3052..0871fddfb 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -2,12 +2,11 @@ import static com.google.common.base.Preconditions.checkNotNull; -import java.io.InputStream; - -import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.model.Frame; -public class ExecStartCmdImpl extends AbstrDockerCmd implements ExecStartCmd { +public class ExecStartCmdImpl extends AbstrAsyncDockerCmd implements ExecStartCmd { private String execId; @@ -57,8 +56,7 @@ public ExecStartCmd withTty(Boolean tty) { * No such exec instance */ @Override - public InputStream exec() throws NotFoundException { - return super.exec(); + public > T exec(T resultCallback) { + return super.exec(resultCallback); } - } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java new file mode 100644 index 000000000..dda336807 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java @@ -0,0 +1,63 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import java.io.IOException; +import java.io.OutputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class ExecStartResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(ExecStartResultCallback.class); + + private OutputStream stdout, stderr; + + public ExecStartResultCallback(OutputStream stdout, OutputStream stderr) { + this.stdout = stdout; + this.stderr = stderr; + } + + public ExecStartResultCallback() { + this(null, null); + } + + + @Override + public void onNext(Frame frame) { + if (frame != null) { + try { + switch (frame.getStreamType()) { + case STDOUT: + if (stdout != null) { + stdout.write(frame.getPayload()); + stdout.flush(); + } + break; + case STDERR: + if (stderr != null) { + stderr.write(frame.getPayload()); + stderr.flush(); + } + break; + default: + LOGGER.error("unknown stream type:" + frame.getStreamType()); + } + } catch (IOException e) { + onError(e); + } + + } + LOGGER.debug(frame.toString()); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index cf850d10c..0b1db4eb0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -1,19 +1,26 @@ package com.github.dockerjava.jaxrs; +import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.async.FrameStreamProcessor; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; + import java.io.InputStream; import static javax.ws.rs.client.Entity.entity; -public class ExecStartCmdExec extends AbstrSyncDockerCmdExec implements ExecStartCmd.Exec { +public class ExecStartCmdExec extends AbstrAsyncDockerCmdExec implements ExecStartCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); @@ -22,14 +29,13 @@ public ExecStartCmdExec(WebTarget baseResource, DockerClientConfig dockerClientC } @Override - protected InputStream execute(ExecStartCmd command) { - WebTarget webResource = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getExecId()); - - LOGGER.trace("POST: {}", webResource); + protected AbstractCallbackNotifier callbackNotifier(ExecStartCmd command, + ResultCallback resultCallback) { + WebTarget webTarget = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getExecId()); - Response response = webResource.request().accept(MediaType.APPLICATION_JSON) - .post(entity(command, MediaType.APPLICATION_JSON), Response.class); + LOGGER.trace("POST: {}", webTarget); - return new WrappedResponseInputStream(response); + return new POSTCallbackNotifier(new FrameStreamProcessor(), resultCallback, webTarget.request().accept( + MediaType.APPLICATION_JSON), null); } } diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java index fcbbe17b6..6c97055fb 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -13,19 +13,18 @@ import io.netty.channel.unix.DomainSocketAddress; import io.netty.channel.unix.UnixChannel; import io.netty.handler.codec.http.HttpClientCodec; -import io.netty.handler.ssl.SslContext; -import io.netty.handler.ssl.SslContextBuilder; -import io.netty.handler.ssl.SslProvider; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.ssl.SslHandler; import java.io.IOException; -import java.io.InputStream; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.security.Security; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLParameters; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.slf4j.Logger; @@ -69,10 +68,25 @@ 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.core.CertificateUtils; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.command.ExecCreateCmdImpl; import com.github.dockerjava.core.command.ExecStartCmdImpl; +import com.github.dockerjava.core.command.ExecStartResultCallback; +import com.github.dockerjava.netty.exec.AuthCmdExec; +import com.github.dockerjava.netty.exec.CopyFileFromContainerCmdExec; +import com.github.dockerjava.netty.exec.CreateContainerCmdExec; +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.KillContainerCmdExec; +import com.github.dockerjava.netty.exec.LogContainerCmdExec; +import com.github.dockerjava.netty.exec.RemoveContainerCmdExec; +import com.github.dockerjava.netty.exec.StartContainerCmdExec; +import com.github.dockerjava.netty.exec.StopContainerCmdExec; +import com.github.dockerjava.netty.exec.WaitContainerCmdExec; /** * http://stackoverflow.com/questions/33296749/netty-connect-to-unix-domain- socket-failed @@ -97,7 +111,9 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private ChannelProvider channelProvider = new ChannelProvider() { @Override public Channel getChannel() { - return connect(); + Channel channel = connect(); + channel.pipeline().addLast(new LoggingHandler(getClass())); + return channel; } }; @@ -128,15 +144,15 @@ private Channel connect() { } private Channel connect(final Bootstrap bootstrap) throws InterruptedException { - return nettyInitializer.connect(bootstrap); + return nettyInitializer.connect(bootstrap); } private static interface NettyInitializer { EventLoopGroup init(final Bootstrap bootstrap, DockerClientConfig dockerClientConfig); + Channel connect(final Bootstrap bootstrap) throws InterruptedException; } - private class UnixDomainSocketInitializer implements NettyInitializer { @Override public EventLoopGroup init(Bootstrap bootstrap, DockerClientConfig dockerClientConfig) { @@ -159,14 +175,14 @@ public Channel connect(Bootstrap bootstrap) throws InterruptedException { private class InetSocketInitializer implements NettyInitializer { @Override - public EventLoopGroup init(Bootstrap bootstrap, DockerClientConfig dockerClientConfig) { + public EventLoopGroup init(Bootstrap bootstrap, final DockerClientConfig dockerClientConfig) { EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); InetAddress addr = InetAddress.getLoopbackAddress(); final SocketAddress proxyAddress = new InetSocketAddress(addr, 8008); - final SslContext sslCtx = initSslContext(dockerClientConfig); + Security.addProvider(new BouncyCastleProvider()); bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) .handler(new ChannelInitializer() { @@ -174,11 +190,6 @@ public EventLoopGroup init(Bootstrap bootstrap, DockerClientConfig dockerClientC protected void initChannel(final SocketChannel channel) throws Exception { // channel.pipeline().addLast(new // HttpProxyHandler(proxyAddress)); - - if (sslCtx != null) { - channel.pipeline().addLast(sslCtx.newHandler(channel.alloc())); - } - channel.pipeline().addLast(new HttpClientCodec()); } }); @@ -195,35 +206,42 @@ public Channel connect(Bootstrap bootstrap) throws InterruptedException { throw new RuntimeException("no port configured for " + host); } - return bootstrap.connect(host, port).sync().channel(); - } + Channel channel = bootstrap.connect(host, port).sync().channel(); + + if ("https".equals(dockerClientConfig.getUri().getScheme())) { + final SslHandler ssl = initSsl(dockerClientConfig); - private SslContext initSslContext(DockerClientConfig dockerClientConfig) { - SslContext sslContext = null; + if (ssl != null) { + channel.pipeline().addFirst(ssl); + } + } - String scheme = dockerClientConfig.getUri().getScheme(); + return channel; + } - if ("https".equals(scheme) && dockerClientConfig.getDockerCertPath() != null) { + private SslHandler initSsl(DockerClientConfig dockerClientConfig) { + SslHandler ssl = null; - String dockerCertPath = dockerClientConfig.getDockerCertPath(); + try { + String host = dockerClientConfig.getUri().getHost(); + int port = dockerClientConfig.getUri().getPort(); - Security.addProvider(new BouncyCastleProvider()); + SSLContext sslContext = dockerClientConfig.getSslConfig().getSSLContext(); - try { - TrustManagerFactory tmFactory = TrustManagerFactory.getInstance("PKIX"); - tmFactory.init(CertificateUtils.createTrustStore(dockerCertPath)); + SSLEngine engine = sslContext.createSSLEngine(host, port); + engine.setUseClientMode(true); + engine.setSSLParameters(enableHostNameVerification(engine.getSSLParameters())); - KeyManagerFactory kmFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - kmFactory.init(CertificateUtils.createKeyStore(dockerCertPath), "docker".toCharArray()); + // 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 - sslContext = SslContextBuilder.forClient().sslProvider(SslProvider.JDK).keyManager(kmFactory) - .trustManager(tmFactory).build(); - } catch (Exception e) { - throw new RuntimeException(e); - } + ssl = new SslHandler(engine); + } catch (Exception e) { + throw new RuntimeException(e); } - return sslContext; + + return ssl; } } @@ -233,15 +251,19 @@ protected DockerClientConfig getDockerClientConfig() { return dockerClientConfig; } + public SSLParameters enableHostNameVerification(SSLParameters sslParameters) { + sslParameters.setEndpointIdentificationAlgorithm("HTTPS"); + return sslParameters; + } + @Override public AuthCmd.Exec createAuthCmdExec() { - return null; // new AuthCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new AuthCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public InfoCmd.Exec createInfoCmdExec() { - return new InfoCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); + return new InfoCmdExec(getBaseResource(), getDockerClientConfig()); } @Override @@ -300,8 +322,7 @@ public ListImagesCmd.Exec createListImagesCmdExec() { @Override public InspectImageCmd.Exec createInspectImageCmdExec() { - return null; // new InspectImageCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new InspectImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override @@ -312,37 +333,32 @@ public ListContainersCmd.Exec createListContainersCmdExec() { @Override public CreateContainerCmd.Exec createCreateContainerCmdExec() { - return null; // new CreateContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new CreateContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public StartContainerCmd.Exec createStartContainerCmdExec() { - return null; // new StartContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new StartContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public InspectContainerCmd.Exec createInspectContainerCmdExec() { - return null; // new InspectContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new InspectContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public ExecCreateCmd.Exec createExecCmdExec() { - return new ExecCreateCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); + return new ExecCreateCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { - return null; // new RemoveContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new RemoveContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public WaitContainerCmd.Exec createWaitContainerCmdExec() { - return null; // new WaitContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new WaitContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override @@ -353,32 +369,27 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { @Override public ExecStartCmd.Exec createExecStartCmdExec() { - - return new ExecStartCmdExec(new WebTarget(channelProvider), getDockerClientConfig()); + return new ExecStartCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public InspectExecCmd.Exec createInspectExecCmdExec() { - return null; // new InspectExecCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new InspectExecCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public LogContainerCmd.Exec createLogContainerCmdExec() { - return null; // new LogContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new LogContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return null; // new CopyFileFromContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public StopContainerCmd.Exec createStopContainerCmdExec() { - return null; // new StopContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new StopContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override @@ -389,8 +400,7 @@ public ContainerDiffCmd.Exec createContainerDiffCmdExec() { @Override public KillContainerCmd.Exec createKillContainerCmdExec() { - return null; // new KillContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override @@ -456,13 +466,18 @@ public void close() throws IOException { eventLoopGroup.shutdownGracefully(); } + private WebTarget getBaseResource() { + return new WebTarget(channelProvider); + } + public static void main(String[] args) throws IOException { DockerCmdExecFactory execFactory = new DockerCmdExecFactoryImpl(); // execFactory.init(new // DockerClientConfigBuilder().withUri("unix:///var/run/docker.sock").build()); // execFactory.init(new DockerClientConfigBuilder().withUri("http://localhost:2375").build()); - DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder().withUri("https://192.168.59.103:2376").build(); + DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder() + .withUri("https://192.168.59.103:2376").build(); execFactory.init(config); @@ -490,7 +505,18 @@ public static void main(String[] args) throws IOException { ExecStartCmd execStartCmd = new ExecStartCmdImpl(execStart, execCreateCmdResponse.getId()).withDetach(false) .withTty(true); - InputStream response = execStart.exec(execStartCmd); + ExecStartResultCallback callback = new ExecStartResultCallback(System.out, System.err); + + execStart.exec(execStartCmd, callback); + + try { + callback.awaitCompletion(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + System.err.println("main finished"); // FrameReader frameReader = new FrameReader(response); // diff --git a/src/main/java/com/github/dockerjava/netty/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/netty/ExecStartCmdExec.java deleted file mode 100644 index b158bf4e2..000000000 --- a/src/main/java/com/github/dockerjava/netty/ExecStartCmdExec.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.dockerjava.netty; - -import java.io.InputStream; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.dockerjava.api.command.ExecStartCmd; -import com.github.dockerjava.core.DockerClientConfig; - -public class ExecStartCmdExec extends AbstrSyncDockerCmdExec implements ExecStartCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); - - public ExecStartCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { - super(baseResource, dockerClientConfig); - } - - @Override - protected InputStream execute(ExecStartCmd command) { - WebTarget webResource = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getExecId()); - - LOGGER.trace("POST: {}", webResource); - - webResource.request().accept(MediaType.APPLICATION_JSON).post(command, System.out, null, System.in); - - return null; - } -} diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index b4f0fb1ee..a2cfeb827 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -1,270 +1,340 @@ package com.github.dockerjava.netty; +import io.netty.buffer.Unpooled; +import io.netty.channel.Channel; +import io.netty.handler.codec.http.DefaultFullHttpRequest; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpClientUpgradeHandler; +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpHeaderValues; +import io.netty.handler.codec.http.HttpMethod; +import io.netty.handler.codec.http.HttpRequest; +import io.netty.handler.codec.http.HttpResponse; +import io.netty.handler.codec.http.HttpVersion; +import io.netty.handler.codec.json.JsonObjectDecoder; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.HashMap; +import java.util.List; import java.util.Map; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.BadRequestException; +import com.github.dockerjava.api.ConflictException; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.InternalServerErrorException; +import com.github.dockerjava.api.NotAcceptableException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.NotModifiedException; +import com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.netty.handler.AwaitObjectInboundHandler; import com.github.dockerjava.netty.handler.DeserializeJsonInboundHandler; -import com.github.dockerjava.netty.handler.DockerRawStreamHandler; -import com.github.dockerjava.netty.handler.HijackHttpConnectionHandler; +import com.github.dockerjava.netty.handler.FramedResponseStreamHandler; +import com.github.dockerjava.netty.handler.HttpConnectionHijackHandler; import com.github.dockerjava.netty.handler.HttpRequestProvider; -import com.github.dockerjava.netty.handler.HttpResponseInboundHandler; +import com.github.dockerjava.netty.handler.HttpResponseHandler; import com.github.dockerjava.netty.handler.HttpResponseStreamInboundHandler; -import io.netty.buffer.Unpooled; -import io.netty.channel.Channel; -import io.netty.handler.codec.http.DefaultFullHttpRequest; -import io.netty.handler.codec.http.FullHttpRequest; -import io.netty.handler.codec.http.HttpClientCodec; -import io.netty.handler.codec.http.HttpClientUpgradeHandler; -import io.netty.handler.codec.http.HttpHeaderNames; -import io.netty.handler.codec.http.HttpHeaderValues; -import io.netty.handler.codec.http.HttpMethod; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpVersion; -import io.netty.handler.codec.json.JsonObjectDecoder; - public class InvocationBuilder { - private ChannelProvider channelProvider; - private String resource; - private Map headers = new HashMap(); + private ChannelProvider channelProvider; + + private String resource; + + private Map headers = new HashMap(); + + public InvocationBuilder(ChannelProvider channelProvider, String resource) { + this.channelProvider = channelProvider; + this.resource = resource; + } + + public InvocationBuilder accept(MediaType mediaType) { + headers.put(HttpHeaderNames.ACCEPT.toString(), mediaType.getMediaType()); + return this; + } + + public T get(Class resultType) { - public InvocationBuilder(ChannelProvider channelProvider, String resource) { - this.channelProvider = channelProvider; - this.resource = resource; - } + HttpRequestProvider requestProvider = httpGetRequestProvider(); - public InvocationBuilder accept(MediaType mediaType) { - headers.put(HttpHeaderNames.ACCEPT.toString(), mediaType.getMediaType()); - return this; - } + Channel channel = channelProvider.getChannel(); - public T get(Class resultType) { - FullHttpRequest request = prepareGetRequest(resource); + AwaitObjectInboundHandler awaitObject = new AwaitObjectInboundHandler(resultType); - Channel channel = channelProvider.getChannel(); + HttpResponseHandler responseHandler = new HttpResponseHandler(); - AwaitObjectInboundHandler awaitObject = new AwaitObjectInboundHandler(resultType); + channel.pipeline().addLast(responseHandler); + channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(new DeserializeJsonInboundHandler(resultType)); + channel.pipeline().addLast(awaitObject); - channel.pipeline().addLast(new HttpResponseInboundHandler(new HttpRequestProvider() { - @Override - public HttpRequest getHttpRequest(String uri) { - return prepareGetRequest(uri); - } - })); - channel.pipeline().addLast(new JsonObjectDecoder()); - channel.pipeline().addLast(new DeserializeJsonInboundHandler(resultType)); - channel.pipeline().addLast(awaitObject); + sendRequestAndHandleResponse(requestProvider, channel, responseHandler); - System.out.println("resource: " + resource); + return awaitObject.await(); - channel.writeAndFlush(request); + } - // Wait for the server to close the connection. - try { - // channel.closeFuture().sync(); - T response = awaitObject.await(); + private void sendRequestAndHandleResponse(HttpRequestProvider requestProvider, Channel channel, + HttpResponseHandler responseHandler) { - // channel.disconnect(); + channel.writeAndFlush(requestProvider.getHttpRequest(resource)); - return response; - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } + handleResponse(channel, responseHandler, requestProvider); + } - private FullHttpRequest prepareGetRequest(String uri) { - // Prepare the HTTP request. - FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri); + private HttpRequestProvider httpGetRequestProvider() { + return new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return prepareGetRequest(uri); + } + }; + } - setDefaultHeaders(request); - return request; - } + public void get(ResultCallback resultCallback) { - private void setDefaultHeaders(HttpRequest request) { - request.headers().set(HttpHeaderNames.HOST, ""); - request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); - request.headers().set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP); + HttpRequestProvider requestProvider = httpGetRequestProvider(); - for (Map.Entry entry : headers.entrySet()) { - request.headers().set((CharSequence) entry.getKey(), entry.getValue()); - } - } + HttpResponseHandler responseHandler = new HttpResponseHandler(); - public T post(final Object entity, Class resultType) { + FramedResponseStreamHandler streamHandler = new FramedResponseStreamHandler(resultCallback); - HttpRequest request = preparePostRequest(resource, entity); + Channel channel = channelProvider.getChannel(); - AwaitObjectInboundHandler awaitObject = new AwaitObjectInboundHandler(resultType); + channel.pipeline().addLast(responseHandler); + channel.pipeline().addLast(streamHandler); - Channel channel = channelProvider.getChannel(); + sendRequestAndHandleResponse(requestProvider, channel, responseHandler); + } - channel.pipeline().addLast(new HttpResponseInboundHandler(new HttpRequestProvider() { - @Override - public HttpRequest getHttpRequest(String uri) { - return preparePostRequest(uri, entity); - } - })); - channel.pipeline().addLast(new JsonObjectDecoder()); - channel.pipeline().addLast(new DeserializeJsonInboundHandler(resultType)); - channel.pipeline().addLast(awaitObject); + private FullHttpRequest prepareGetRequest(String uri) { - System.out.println("resource: " + resource); - System.out.println(channel.isActive()); + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri); - channel.writeAndFlush(request); + setDefaultHeaders(request); - // Wait for the server to close the connection. - try { - // channel.closeFuture().sync(); - T response = awaitObject.await(); + return request; + } - return response; - } catch (InterruptedException e) { - throw new RuntimeException(e); - } + private void setDefaultHeaders(HttpRequest request) { + request.headers().set(HttpHeaderNames.HOST, ""); + request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); + request.headers().set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP); - } + for (Map.Entry entry : headers.entrySet()) { + request.headers().set((CharSequence) entry.getKey(), entry.getValue()); + } + } - public InputStream post(final Object entity, final InputStream stdin) { + public T post(final Object entity, Class resultType) { - HttpRequest request = preparePostRequest(resource, entity); + HttpRequestProvider requestProvider = httpPostRequestProvider(entity); - HttpResponseStreamInboundHandler streamHandler = new HttpResponseStreamInboundHandler(); + AwaitObjectInboundHandler awaitObject = new AwaitObjectInboundHandler(resultType); - final Channel channel = channelProvider.getChannel(); + Channel channel = channelProvider.getChannel(); - HijackHttpConnectionHandler hijackHandler = new HijackHttpConnectionHandler(); - channel.pipeline() - .addLast(new HttpClientUpgradeHandler(new HttpClientCodec(), hijackHandler, Integer.MAX_VALUE)); - channel.pipeline().addLast(new HttpResponseInboundHandler(new HttpRequestProvider() { - @Override - public HttpRequest getHttpRequest(String uri) { - return preparePostRequest(uri, entity); - } - })); + HttpResponseHandler responseHandler = new HttpResponseHandler(); - channel.pipeline().addLast(streamHandler); + channel.pipeline().addLast(responseHandler); + channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(new DeserializeJsonInboundHandler(resultType)); + channel.pipeline().addLast(awaitObject); - channel.writeAndFlush(request); + sendRequestAndHandleResponse(requestProvider, channel, responseHandler); - // wait for successful http upgrade procedure - hijackHandler.await(); + return awaitObject.await(); - // start a new thread that reads from stdin and writes to the channel - new Thread(new Runnable() { + } - @Override - public void run() { + public void post(final Object entity, final InputStream stdin, ResultCallback resultCallback) { - BufferedReader reader = new BufferedReader(new InputStreamReader(stdin)); + HttpRequestProvider requestProvider = httpPostRequestProvider(entity); - int read = -1; - while ((read = read(reader)) != -1) { - byte[] bytes = ByteBuffer.allocate(4).putInt(read).array(); - channel.writeAndFlush(Unpooled.copiedBuffer(bytes)); - } - } + FramedResponseStreamHandler streamHandler = new FramedResponseStreamHandler(resultCallback); - private int read(BufferedReader reader) { - try { - return reader.read(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }).start(); + final Channel channel = channelProvider.getChannel(); - return streamHandler.getInputStream(); - } + HttpResponseHandler responseHandler = new HttpResponseHandler(); - public void post(final Object entity, final OutputStream stdout, final OutputStream stderr, - final InputStream stdin) { + HttpConnectionHijackHandler hijackHandler = new HttpConnectionHijackHandler(responseHandler); - HttpRequest request = preparePostRequest(resource, entity); + channel.pipeline().addLast( + new HttpClientUpgradeHandler(new HttpClientCodec(), hijackHandler, Integer.MAX_VALUE)); + channel.pipeline().addLast(streamHandler); - DockerRawStreamHandler streamHandler = new DockerRawStreamHandler(stdout, stderr); + sendRequestAndHandleResponse(requestProvider, channel, responseHandler); - final Channel channel = channelProvider.getChannel(); + // wait for successful http upgrade procedure + hijackHandler.await(); - HijackHttpConnectionHandler hijackHandler = new HijackHttpConnectionHandler(); - channel.pipeline() - .addLast(new HttpClientUpgradeHandler(new HttpClientCodec(), hijackHandler, Integer.MAX_VALUE)); - channel.pipeline().addLast(new HttpResponseInboundHandler(new HttpRequestProvider() { - @Override - public HttpRequest getHttpRequest(String uri) { - return preparePostRequest(uri, entity); - } - })); + // now we can start a new thread that reads from stdin and writes to the channel + new Thread(new Runnable() { - channel.pipeline().addLast(streamHandler); + @Override + public void run() { - channel.writeAndFlush(request); + BufferedReader reader = new BufferedReader(new InputStreamReader(stdin, Charset.forName("UTF-8"))); - // wait for successful http upgrade procedure - hijackHandler.await(); + int read = -1; + while ((read = read(reader)) != -1) { + byte[] bytes = ByteBuffer.allocate(4).putInt(read).array(); + try { + bytes = new String(bytes).getBytes("US-ASCII"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } - // start a new thread that reads from stdin and writes to the channel - new Thread(new Runnable() { + channel.writeAndFlush(Unpooled.copiedBuffer(bytes)); + } + } - @Override - public void run() { + private int read(BufferedReader reader) { + try { + return reader.read(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }).start(); - BufferedReader reader = new BufferedReader(new InputStreamReader(stdin, Charset.forName("UTF-8"))); + } - int read = -1; - while ((read = read(reader)) != -1) { - byte[] bytes = ByteBuffer.allocate(4).putInt(read).array(); - try { - bytes = new String(bytes).getBytes("US-ASCII"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + private void handleResponse(final Channel channel, HttpResponseHandler responseHandler, + HttpRequestProvider requestProvider) { + HttpResponse response = responseHandler.awaitResponse(); - channel.writeAndFlush(Unpooled.copiedBuffer(bytes)); - } - } + switch (response.status().code()) { + case 101: + case 200: + case 201: + case 204: + break; + case 301: + case 302: + if (response.headers().contains(HttpHeaderNames.LOCATION)) { + String location = response.headers().get(HttpHeaderNames.LOCATION); + System.out.println("redirected to :" + location); + HttpRequest redirected = requestProvider.getHttpRequest(location); - private int read(BufferedReader reader) { - try { - return reader.read(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }).start(); + channel.writeAndFlush(redirected); + } + break; + case 304: + throw new NotModifiedException(responseHandler.awaitErrorBody()); + case 400: + throw new BadRequestException(responseHandler.awaitErrorBody()); + case 401: + throw new UnauthorizedException(responseHandler.awaitErrorBody()); + case 404: + throw new NotFoundException(responseHandler.awaitErrorBody()); + case 406: + throw new NotAcceptableException(responseHandler.awaitErrorBody()); + case 409: + throw new ConflictException(responseHandler.awaitErrorBody()); + case 500: + throw new InternalServerErrorException(responseHandler.awaitErrorBody()); + default: + throw new DockerException(responseHandler.awaitErrorBody(), response.status().code()); + } - } + } - private HttpRequest preparePostRequest(String uri, Object entity) { - // Prepare the HTTP request. - FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, uri); + private HttpRequest preparePostRequest(String uri, Object entity) { - setDefaultHeaders(request); + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, uri); - byte[] bytes; - try { - bytes = new ObjectMapper().writeValueAsBytes(entity); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + setDefaultHeaders(request); - request.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json"); - request.content().clear().writeBytes(Unpooled.copiedBuffer(bytes)); - request.headers().set(HttpHeaderNames.CONTENT_LENGTH, bytes.length); + if (entity != null) { + byte[] bytes; + try { + bytes = new ObjectMapper().writeValueAsBytes(entity); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + request.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json"); + request.content().clear().writeBytes(Unpooled.copiedBuffer(bytes)); + request.headers().set(HttpHeaderNames.CONTENT_LENGTH, bytes.length); + } else { + request.headers().set(HttpHeaderNames.CONTENT_LENGTH, 0); + } + + return request; + } + + private HttpRequest prepareDeleteRequest(String uri) { + + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.DELETE, uri); + + setDefaultHeaders(request); + + return request; + } + + public InputStream post(final Object entity) { + + HttpRequestProvider requestProvider = httpPostRequestProvider(entity); + + Channel channel = channelProvider.getChannel(); + + HttpResponseHandler responseHandler = new HttpResponseHandler(); + HttpResponseStreamInboundHandler streamHandler = new HttpResponseStreamInboundHandler(); + + channel.pipeline().addLast(responseHandler); + channel.pipeline().addLast(streamHandler); + + sendRequestAndHandleResponse(requestProvider, channel, responseHandler); + + return streamHandler.getInputStream(); + } + + private HttpRequestProvider httpPostRequestProvider(final Object entity) { + return new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return preparePostRequest(uri, entity); + } + }; + } + + public void delete() { + + HttpRequestProvider requestProvider = httpDeleteRequestProvider(); + + HttpResponseHandler responseHandler = new HttpResponseHandler(); + + Channel channel = channelProvider.getChannel(); + + channel.pipeline().addLast(responseHandler); + + sendRequestAndHandleResponse(requestProvider, channel, responseHandler); + } - return request; - } + private HttpRequestProvider httpDeleteRequestProvider() { + return new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return prepareDeleteRequest(uri); + } + }; + } + public T get(TypeReference typeReference) { + Class clazz = (Class) typeReference.getType().getClass(); + return null; + } } diff --git a/src/main/java/com/github/dockerjava/netty/MediaType.java b/src/main/java/com/github/dockerjava/netty/MediaType.java index 347b9de72..e3fe18c3f 100644 --- a/src/main/java/com/github/dockerjava/netty/MediaType.java +++ b/src/main/java/com/github/dockerjava/netty/MediaType.java @@ -2,14 +2,15 @@ public enum MediaType { - APPLICATION_JSON("application/json"); - + APPLICATION_JSON("application/json"), + APPLICATION_OCTET_STREAM("application/octet-stream"); + private String mediaType; - + private MediaType(String mediaType) { this.mediaType = mediaType; } - + public String getMediaType() { return mediaType; } diff --git a/src/main/java/com/github/dockerjava/netty/exec/AbstrAsyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/AbstrAsyncDockerCmdExec.java new file mode 100644 index 000000000..cb2b523c4 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/AbstrAsyncDockerCmdExec.java @@ -0,0 +1,67 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.AsyncDockerCmd; +import com.github.dockerjava.api.command.DockerCmdAsyncExec; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; +import com.github.dockerjava.netty.WebTarget; + +import java.io.Closeable; +import java.io.IOException; + +public abstract class AbstrAsyncDockerCmdExec, A_RES_T> extends + AbstrDockerCmdExec implements DockerCmdAsyncExec { + + public AbstrAsyncDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + public Void exec(CMD_T command, ResultCallback resultCallback) { + return execute(command, resultCallback); + } + + protected final Void execute(final CMD_T command, final ResultCallback resultCallback) { + + ResultCallback delegatingResultCallback = new ResultCallback() { + + @Override + public void close() throws IOException { + resultCallback.close(); + command.close(); + } + + @Override + public void onStart(Closeable closeable) { + resultCallback.onStart(closeable); + } + + @Override + public void onNext(A_RES_T object) { + resultCallback.onNext(object); + } + + @Override + public void onError(Throwable throwable) { + resultCallback.onError(throwable); + } + + @Override + public void onComplete() { + resultCallback.onComplete(); + command.close(); + } + }; + + execute0(command, delegatingResultCallback); + + return null; + } + + protected abstract Void execute0(final CMD_T command, final ResultCallback resultCallback); + + + + +} diff --git a/src/main/java/com/github/dockerjava/netty/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/AbstrDockerCmdExec.java similarity index 96% rename from src/main/java/com/github/dockerjava/netty/AbstrDockerCmdExec.java rename to src/main/java/com/github/dockerjava/netty/exec/AbstrDockerCmdExec.java index 3d0308d57..a1d54bd27 100644 --- a/src/main/java/com/github/dockerjava/netty/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/AbstrDockerCmdExec.java @@ -1,10 +1,12 @@ -package com.github.dockerjava.netty; +package com.github.dockerjava.netty.exec; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.RemoteApiVersion; +import com.github.dockerjava.netty.WebTarget; + import org.apache.commons.codec.binary.Base64; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/netty/AbstrSyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/AbstrSyncDockerCmdExec.java similarity index 92% rename from src/main/java/com/github/dockerjava/netty/AbstrSyncDockerCmdExec.java rename to src/main/java/com/github/dockerjava/netty/exec/AbstrSyncDockerCmdExec.java index 43854dbd1..b67eac37a 100644 --- a/src/main/java/com/github/dockerjava/netty/AbstrSyncDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/AbstrSyncDockerCmdExec.java @@ -1,9 +1,10 @@ -package com.github.dockerjava.netty; +package com.github.dockerjava.netty.exec; import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.command.DockerCmd; import com.github.dockerjava.api.command.DockerCmdSyncExec; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; public abstract class AbstrSyncDockerCmdExec, RES_T> extends AbstrDockerCmdExec diff --git a/src/main/java/com/github/dockerjava/netty/exec/AuthCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/AuthCmdExec.java new file mode 100644 index 000000000..ed6c9cb7a --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/AuthCmdExec.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.netty.exec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.model.AuthResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class AuthCmdExec extends AbstrSyncDockerCmdExec implements AuthCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(AuthCmdExec.class); + + public AuthCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected AuthResponse execute(AuthCmd command) { + WebTarget webResource = getBaseResource().path("/auth"); + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(command.getAuthConfig(), AuthResponse.class); + +// if (response.getStatus() == 401) { +// throw new UnauthorizedException("Unauthorized"); +// } +// +// return response.readEntity(AuthResponse.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExec.java new file mode 100644 index 000000000..338b9b973 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExec.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.netty.exec; + +import java.io.InputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class CopyFileFromContainerCmdExec extends AbstrSyncDockerCmdExec + implements CopyFileFromContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class); + + public CopyFileFromContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InputStream execute(CopyFileFromContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/copy").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: " + webResource.toString()); + + return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM) + .post(command); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java new file mode 100644 index 000000000..bf858349b --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.CreateContainerCmd.Exec; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CreateContainerCmdExec extends AbstrSyncDockerCmdExec + implements CreateContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateContainerCmdExec.class); + + public CreateContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateContainerResponse execute(CreateContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/create"); + + if (command.getName() != null) { + webResource = webResource.queryParam("name", command.getName()); + } + + LOGGER.trace("POST: {} ", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(command, CreateContainerResponse.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ExecCreateCmdExec.java similarity index 78% rename from src/main/java/com/github/dockerjava/netty/ExecCreateCmdExec.java rename to src/main/java/com/github/dockerjava/netty/exec/ExecCreateCmdExec.java index 10e5ad9d8..78f788f3f 100644 --- a/src/main/java/com/github/dockerjava/netty/ExecCreateCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ExecCreateCmdExec.java @@ -1,9 +1,12 @@ -package com.github.dockerjava.netty; +package com.github.dockerjava.netty.exec; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.api.command.ExecCreateCmd.Exec; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.netty.AbstrSyncDockerCmdExec; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; +import com.github.dockerjava.netty.exec.AbstrSyncDockerCmdExec; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/github/dockerjava/netty/exec/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ExecStartCmdExec.java new file mode 100644 index 000000000..9d684ca7b --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ExecStartCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class ExecStartCmdExec extends AbstrAsyncDockerCmdExec implements ExecStartCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); + + public ExecStartCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute0(ExecStartCmd command, ResultCallback resultCallback) { + WebTarget webTarget = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getExecId()); + + webTarget.request().accept(MediaType.APPLICATION_JSON).post(command, System.in, resultCallback); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/InfoCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java similarity index 91% rename from src/main/java/com/github/dockerjava/netty/InfoCmdExec.java rename to src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java index 04abf103f..5a41073a4 100644 --- a/src/main/java/com/github/dockerjava/netty/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.netty; +package com.github.dockerjava.netty.exec; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -6,13 +6,14 @@ import com.github.dockerjava.api.command.InfoCmd; import com.github.dockerjava.api.model.Info; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; /** * 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 - * + * * @author marcus * */ @@ -23,7 +24,7 @@ public class InfoCmdExec implements InfoCmd.Exec { private WebTarget webResource; private DockerClientConfig dockerClientConfig; - + public InfoCmdExec(WebTarget webResource, DockerClientConfig dockerClientConfig) { this.webResource = webResource; this.dockerClientConfig = dockerClientConfig; @@ -36,7 +37,7 @@ public Info exec(InfoCmd command) { } - - + + } diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java new file mode 100644 index 000000000..6490ddd7f --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InspectContainerCmdExec extends AbstrSyncDockerCmdExec + implements InspectContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectContainerCmdExec.class); + + public InspectContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InspectContainerResponse execute(InspectContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/json").resolveTemplate("id", + command.getContainerId()); + + LOGGER.debug("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectContainerResponse.class); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java new file mode 100644 index 000000000..470df9c2c --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java @@ -0,0 +1,26 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectExecResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InspectExecCmdExec extends AbstrSyncDockerCmdExec implements + InspectExecCmd.Exec { + private static final Logger LOGGER = LoggerFactory.getLogger(InspectExecCmdExec.class); + + public InspectExecCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InspectExecResponse execute(InspectExecCmd command) { + WebTarget webResource = getBaseResource().path("/exec/{id}/json").resolveTemplate("id", command.getExecId()); + LOGGER.debug("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectExecResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java new file mode 100644 index 000000000..0092b5ff9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.InspectImageResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InspectImageCmdExec extends AbstrSyncDockerCmdExec implements + InspectImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectImageCmdExec.class); + + public InspectImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InspectImageResponse execute(InspectImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/{id}/json").resolveTemplate("id", command.getImageId()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { + }); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/KillContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/KillContainerCmdExec.java new file mode 100644 index 000000000..bc56c51fc --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/KillContainerCmdExec.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class KillContainerCmdExec extends AbstrSyncDockerCmdExec implements + KillContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(KillContainerCmdExec.class); + + public KillContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(KillContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/kill").resolveTemplate("id", + command.getContainerId()); + + if (command.getSignal() != null) { + webResource = webResource.queryParam("signal", command.getSignal()); + } + + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java new file mode 100644 index 000000000..0f35c84e3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java @@ -0,0 +1,53 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +import javax.ws.rs.core.GenericType; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +public class ListContainersCmdExec extends AbstrSyncDockerCmdExec> implements + ListContainersCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListContainersCmdExec.class); + + public ListContainersCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected List execute(ListContainersCmd command) { + WebTarget webTarget = getBaseResource().path("/containers/json").queryParam("since", command.getSinceId()) + .queryParam("before", command.getBeforeId()); + + webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); + webTarget = booleanQueryParam(webTarget, "size", command.hasShowSizeEnabled()); + + if (command.getLimit() != null && command.getLimit() >= 0) { + webTarget = webTarget.queryParam("limit", String.valueOf(command.getLimit())); + } + + if (command.getFilters() != null) { + webTarget = webTarget + .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + } + + LOGGER.trace("GET: {}", webTarget); + List containers = webTarget.request().accept(MediaType.APPLICATION_JSON) + .get(new TypeReference>() {}); + LOGGER.trace("Response: {}", containers); + + return containers; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java new file mode 100644 index 000000000..4135f7308 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java @@ -0,0 +1,48 @@ +package com.github.dockerjava.netty.exec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; + + +public class LogContainerCmdExec extends AbstrAsyncDockerCmdExec implements + LogContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerCmdExec.class); + + public LogContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute0(LogContainerCmd command, ResultCallback resultCallback) { + + WebTarget webTarget = getBaseResource().path("/containers/{id}/logs").resolveTemplate("id", + command.getContainerId()); + + if (command.getTail() != null) { + webTarget = webTarget.queryParam("tail", command.getTail()); + } + + if (command.getSince() != null) { + webTarget = webTarget.queryParam("since", command.getSince()); + } + + webTarget = booleanQueryParam(webTarget, "timestamps", command.hasTimestampsEnabled()); + webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); + webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); + webTarget = booleanQueryParam(webTarget, "follow", command.hasFollowStreamEnabled()); + + LOGGER.trace("GET: {}", webTarget); + + webTarget.request().get(resultCallback); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java new file mode 100644 index 000000000..ff4a2240e --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RemoveContainerCmdExec extends AbstrSyncDockerCmdExec implements + RemoveContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveContainerCmdExec.class); + + public RemoveContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveContainerCmd command) { + WebTarget webTarget = getBaseResource().path("/containers/" + command.getContainerId()); + + webTarget = booleanQueryParam(webTarget, "v", command.hasRemoveVolumesEnabled()); + webTarget = booleanQueryParam(webTarget, "force", command.hasForceEnabled()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete(); + + 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 new file mode 100644 index 000000000..cfa7d28ce --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/StartContainerCmdExec.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StartContainerCmd.Exec; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class StartContainerCmdExec extends AbstrSyncDockerCmdExec implements + StartContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(StartContainerCmdExec.class); + + public StartContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(StartContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/start").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(command); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/StopContainerCmdExec.java new file mode 100644 index 000000000..9e25d1c8d --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/StopContainerCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +public class StopContainerCmdExec extends AbstrSyncDockerCmdExec implements + StopContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(StopContainerCmdExec.class); + + public StopContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(StopContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/stop").resolveTemplate("id", + command.getContainerId()); + + if (command.getTimeout() != null) { + webResource = webResource.queryParam("t", String.valueOf(command.getTimeout())); + } + + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java new file mode 100644 index 000000000..f4f0076f3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.netty.exec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.api.model.WaitResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + + +public class WaitContainerCmdExec extends AbstrAsyncDockerCmdExec implements + WaitContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(WaitContainerCmdExec.class); + + public WaitContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute0(WaitContainerCmd command, ResultCallback resultCallback) { + WebTarget webTarget = getBaseResource().path("/containers/{id}/wait").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: {}", webTarget); + + webTarget.request().accept(MediaType.APPLICATION_JSON).post(null, WaitResponse.class); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java index 806e76d31..543fc095b 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java @@ -1,39 +1,39 @@ package com.github.dockerjava.netty.handler; -import java.util.concurrent.Callable; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.FutureTask; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; - import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; +import java.util.concurrent.CountDownLatch; + public class AwaitObjectInboundHandler extends SimpleChannelInboundHandler { - - public AwaitObjectInboundHandler(Class clazz) { - super(clazz); - } - - private CountDownLatch countDownLatch = new CountDownLatch(1); - - private T object; - - @Override - protected void channelRead0(ChannelHandlerContext ctx, T msg) throws Exception { - object = msg; - countDownLatch.countDown(); - } - - public T await() throws InterruptedException { - countDownLatch.await(); - return object; - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } + + public AwaitObjectInboundHandler(Class clazz) { + super(clazz); + } + + private CountDownLatch countDownLatch = new CountDownLatch(1); + + private T object; + + @Override + protected void channelRead0(ChannelHandlerContext ctx, T msg) throws Exception { + object = msg; + countDownLatch.countDown(); + } + + public T await() { + try { + countDownLatch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return object; + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } } diff --git a/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java index d2a23988d..994169a36 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java @@ -1,5 +1,6 @@ package com.github.dockerjava.netty.handler; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.buffer.ByteBuf; @@ -7,13 +8,13 @@ import io.netty.channel.SimpleChannelInboundHandler; public class DeserializeJsonInboundHandler extends SimpleChannelInboundHandler{ - + private Class clazz; - + public DeserializeJsonInboundHandler(Class clazz) { this.clazz = clazz; } - + @Override protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { byte[] buffer = new byte[msg.readableBytes()]; diff --git a/src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java similarity index 76% rename from src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java rename to src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java index e7f7e3377..7907a62b5 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/DockerRawStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java @@ -1,34 +1,32 @@ package com.github.dockerjava.netty.handler; -import java.io.OutputStream; - -import com.github.dockerjava.api.model.Frame; -import com.github.dockerjava.api.model.StreamType; - import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -public class DockerRawStreamHandler extends SimpleChannelInboundHandler { +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.StreamType; + +public class FramedResponseStreamHandler extends SimpleChannelInboundHandler { private static final int HEADER_SIZE = 8; private final ByteBuf rawBuffer = Unpooled.buffer(1000); - private OutputStream stdout, stderr; - private byte[] header = new byte[HEADER_SIZE]; private int headerCnt = 0; - + private byte[] payload = new byte[0]; private int payloadCnt = 0; - public DockerRawStreamHandler(OutputStream stdout, OutputStream stderr) { - this.stdout = stdout; - this.stderr = stderr; + private ResultCallback resultCallback; + + public FramedResponseStreamHandler(ResultCallback resultCallback) { + this.resultCallback = resultCallback; } @Override @@ -40,29 +38,13 @@ protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Excep do { frame = decode(); - + if (frame != null) { - switch (frame.getStreamType()) { - case STDOUT: - if (stdout != null) { - stdout.write(frame.getPayload()); - stdout.flush(); - } - break; - case STDERR: - if (stderr != null) { - stderr.write(frame.getPayload()); - stderr.flush(); - } - break; - default: - System.err.println("unknown stream type"); - } - + resultCallback.onNext(frame); headerCnt = 0; payloadCnt = 0; - } - + } + } while (frame != null); } @@ -111,7 +93,7 @@ private Frame decode() { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); + resultCallback.onError(cause); ctx.close(); } diff --git a/src/main/java/com/github/dockerjava/netty/handler/HijackHttpConnectionHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java similarity index 76% rename from src/main/java/com/github/dockerjava/netty/handler/HijackHttpConnectionHandler.java rename to src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java index 1a4a6673b..1a59118fb 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HijackHttpConnectionHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java @@ -13,23 +13,23 @@ import io.netty.handler.codec.http.HttpClientUpgradeHandler; import io.netty.handler.codec.http.HttpRequest; -public class HijackHttpConnectionHandler implements HttpClientUpgradeHandler.UpgradeCodec { - +public class HttpConnectionHijackHandler implements HttpClientUpgradeHandler.UpgradeCodec { + private CountDownLatch latch = new CountDownLatch(1); - + + private HttpResponseHandler httpResponseHandler; + + public HttpConnectionHijackHandler(HttpResponseHandler httpResponseHandler) { + this.httpResponseHandler = httpResponseHandler; + } + @Override public void upgradeTo(ChannelHandlerContext ctx, FullHttpResponse upgradeResponse) throws Exception { System.out.println("UPGRADED"); + httpResponseHandler.channelRead(ctx, upgradeResponse); + ctx.pipeline().addLast(httpResponseHandler); latch.countDown(); -// ChannelHandler removed = ctx.pipeline().remove(HttpClientCodec.class); -// -// System.out.println("removed: " + removed); - - - - - } @Override @@ -42,7 +42,7 @@ public Collection setUpgradeHeaders(ChannelHandlerContext ctx, public CharSequence protocol() { return "tcp"; } - + public void await() { try { latch.await(); @@ -51,7 +51,7 @@ public void await() { throw new RuntimeException(e); } } - - + + } diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java new file mode 100644 index 000000000..0b1007869 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java @@ -0,0 +1,83 @@ +package com.github.dockerjava.netty.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.HttpContent; +import io.netty.handler.codec.http.HttpObject; +import io.netty.handler.codec.http.HttpResponse; +import io.netty.handler.codec.http.LastHttpContent; + +import java.nio.charset.Charset; +import java.util.concurrent.CountDownLatch; + +public class HttpResponseHandler extends SimpleChannelInboundHandler { + + private HttpResponse response; + + private ByteBuf errorBody = Unpooled.buffer(); + + private CountDownLatch responseLatch = new CountDownLatch(1); + + private CountDownLatch errorBodyLatch = new CountDownLatch(1); + + public HttpResponseHandler() { + super(false); + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception { + if (msg instanceof HttpResponse) { + + response = (HttpResponse) msg; + responseLatch.countDown(); + + } else if (msg instanceof HttpContent) { + + HttpContent content = (HttpContent) msg; + + ByteBuf byteBuf = content.content(); + + switch (response.status().code()) { + case 200: + case 201: + case 204: + ctx.fireChannelRead(byteBuf); + break; + default: + errorBody.writeBytes(byteBuf); + } + + if (content instanceof LastHttpContent) { + errorBodyLatch.countDown(); + } + } else { + System.err.println("UNKNOWN"); + } + + } + + private String getBodyAsMessage(ByteBuf body) { + return body.readBytes(body.readableBytes()).toString(Charset.forName("UTF-8")); + } + + public HttpResponse awaitResponse() { + try { + responseLatch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return response; + } + + public String awaitErrorBody() { + try { + errorBodyLatch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return getBodyAsMessage(errorBody); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseInboundHandler.java deleted file mode 100644 index 143e5dcf5..000000000 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseInboundHandler.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.github.dockerjava.netty.handler; - -import java.nio.charset.Charset; - -import com.github.dockerjava.api.BadRequestException; -import com.github.dockerjava.api.ConflictException; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.InternalServerErrorException; -import com.github.dockerjava.api.NotAcceptableException; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.NotModifiedException; -import com.github.dockerjava.api.UnauthorizedException; - -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.handler.codec.http.HttpContent; -import io.netty.handler.codec.http.HttpHeaderNames; -import io.netty.handler.codec.http.HttpObject; -import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; -import io.netty.handler.codec.http.LastHttpContent; - -public class HttpResponseInboundHandler extends SimpleChannelInboundHandler { - - private HttpRequestProvider requestProvider; - - private HttpResponse response; - - private ByteBuf body = Unpooled.buffer(); - - public HttpResponseInboundHandler(HttpRequestProvider requestProvider) { - super(false); - this.requestProvider = requestProvider; - } - - @Override - protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception { - if (msg instanceof HttpResponse) { - HttpResponse response = (HttpResponse) msg; - - System.err.println("STATUS: " + response.status()); - System.err.println("VERSION: " + response.protocolVersion()); - System.err.println(); - - this.response = response; - - if (!response.headers().isEmpty()) { - for (CharSequence name : response.headers().names()) { - for (CharSequence value : response.headers().getAll(name)) { - System.err.println("HEADER: " + name + " = " + value); - } - } - System.err.println(); - } - - } else if (msg instanceof HttpContent) { - //System.err.println("Got http content"); - - HttpContent content = (HttpContent) msg; - - ByteBuf byteBuf = content.content(); - - switch (response.status().code()) { - case 200: - case 201: - case 204: - ctx.fireChannelRead(byteBuf); - break; - default: - body.writeBytes(byteBuf); - } - - if (content instanceof LastHttpContent) { - - try { - switch (response.status().code()) { - case 200: - case 201: - case 204: - - break; - case 301: - case 302: - if (response.headers().contains(HttpHeaderNames.LOCATION)) { - String location = response.headers().get(HttpHeaderNames.LOCATION); - System.out.println("redirected to :" + location); - HttpRequest redirected = requestProvider.getHttpRequest(location); - - ctx.channel().writeAndFlush(redirected); - } else { - ctx.fireExceptionCaught(new RuntimeException("missing 'location' header for redirect")); - } - break; - case 304: - throw new NotModifiedException(getBodyAsMessage(body)); - case 400: - throw new BadRequestException(getBodyAsMessage(body)); - case 401: - throw new UnauthorizedException(getBodyAsMessage(body)); - case 404: - throw new NotFoundException(getBodyAsMessage(body)); - case 406: - throw new NotAcceptableException(getBodyAsMessage(body)); - case 409: - throw new ConflictException(getBodyAsMessage(body)); - case 500: - throw new InternalServerErrorException(getBodyAsMessage(body)); - default: - throw new DockerException(getBodyAsMessage(body), response.status().code()); - } - } finally { - //ctx.close(); - } - - } - } else { - System.err.println("UNKNOWN"); - } - - } - - private String getBodyAsMessage(ByteBuf body) { - return body.readBytes(body.readableBytes()).toString(Charset.forName("UTF-8")); - } - -} diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java index 854cb7b2a..2f9974c16 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java @@ -1,5 +1,9 @@ package com.github.dockerjava.netty.handler; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + import java.io.IOException; import java.io.InputStream; import java.util.concurrent.CountDownLatch; @@ -7,87 +11,99 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.commons.io.HexDump; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - public class HttpResponseStreamInboundHandler extends SimpleChannelInboundHandler { - private CountDownLatch latch = new CountDownLatch(1); - private HttpResponseInputStream stream = new HttpResponseInputStream(); - - @Override - protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { - - latch.countDown(); - stream.write(msg.copy()); - - //System.out.println("got data: " + msg.readableBytes()); - - if (msg.readableBytes() == 0) { - stream.close(); - } - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - - public InputStream getInputStream() { - try { - latch.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return stream; - } - - public static class HttpResponseInputStream extends InputStream { - - private AtomicBoolean closed = new AtomicBoolean(false); - - private LinkedTransferQueue queue = new LinkedTransferQueue(); - - private ByteBuf current = null; - - public void write(ByteBuf byteBuf) { - queue.put(byteBuf); - } - - @Override - public void close() throws IOException { - closed.set(true); - super.close(); - } - - @Override - public int read() throws IOException { - if (closed.get()) - return -1; - - if (current == null || current.readableBytes() == 0) { - try { - current = queue.poll(10, TimeUnit.SECONDS); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - if(current != null && current.readableBytes() > 0) { - return current.readByte(); - } else { - return read(); - } - - - - - } - - } + private CountDownLatch latch = new CountDownLatch(1); + + private HttpResponseInputStream stream = new HttpResponseInputStream(); + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + + latch.countDown(); + stream.write(msg.copy()); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + stream.close(); + super.channelReadComplete(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + + public InputStream getInputStream() { + try { + latch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return stream; + } + + public static class HttpResponseInputStream extends InputStream { + + private AtomicBoolean closed = new AtomicBoolean(false); + + private LinkedTransferQueue queue = new LinkedTransferQueue(); + + private ByteBuf current = null; + + public void write(ByteBuf byteBuf) { + queue.put(byteBuf); + } + + @Override + public void close() throws IOException { + closed.set(true); + super.close(); + } + + @Override + public int available() throws IOException { + poll(); + return readableBytes(); + } + + private int readableBytes() { + if (current != null) + return current.readableBytes(); + else + return 0; + } + + @Override + public int read() throws IOException { + + poll(); + + if (readableBytes() == 0) { + if (closed.get()) + return -1; + } + + if (current != null && current.readableBytes() > 0) { + return current.readByte(); + } else { + return read(); + } + + } + + private void poll() { + if (readableBytes() == 0) { + try { + current = queue.poll(50, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + + } } diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index cfcf7f381..e66cfa57d 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -16,7 +16,7 @@ public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", "flum", + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", new LocalDirectorySSLConfig("flim")); } diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index 5f4ee3e67..c5a1e841c 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,7 +10,7 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, null, null); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, null); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config diff --git a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java index 43aa49f0e..4ece3e8ed 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -54,7 +54,8 @@ public void execStart() throws Exception { ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec(); - dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec( + new ExecStartResultCallback(System.out, System.err)); InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); Boolean bytesAvailable = response.available() > 0; @@ -79,7 +80,8 @@ public void execStartAttached() throws Exception { ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec(); - dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true).exec(); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true) + .exec(new ExecStartResultCallback(System.out, System.err)); InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); Boolean bytesAvailable = response.available() > 0; diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java index 744bbe82c..4f88b6317 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -67,25 +67,23 @@ public void inspectExecTest() throws IOException { assertThat(checkFileCmdCreateResponse.getId(), not(isEmptyString())); // Check that file does not exist - InputStream response1 = dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()).exec(); - asString(response1); // consume + dockerClient.execStartCmd(container.getId()) + .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); assertThat(first.getExitCode(), is(1)); // Create the file - InputStream response2 = dockerClient.execStartCmd(container.getId()) - .withExecId(touchFileCmdCreateResponse.getId()).exec(); - asString(response2); + dockerClient.execStartCmd(container.getId()) + .withExecId(touchFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); InspectExecResponse second = dockerClient.inspectExecCmd(touchFileCmdCreateResponse.getId()).exec(); assertThat(second.getExitCode(), is(0)); // Check that file does exist now - InputStream response3 = dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()).exec(); - asString(response3); + dockerClient.execStartCmd(container.getId()) + .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); assertThat(third.getExitCode(), is(0)); diff --git a/src/test/java/com/github/dockerjava/netty/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/netty/AbstractDockerClientTest.java new file mode 100644 index 000000000..b9a914593 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/AbstractDockerClientTest.java @@ -0,0 +1,217 @@ +package com.github.dockerjava.netty; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.lang.reflect.Method; +import java.net.DatagramSocket; +import java.net.ServerSocket; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.LineIterator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.Assert; +import org.testng.ITestResult; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeBind; +import com.github.dockerjava.core.DockerClientBuilder; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.TestDockerCmdExecFactory; +import com.github.dockerjava.core.command.BuildImageResultCallback; +import com.github.dockerjava.core.command.LogContainerResultCallback; +import com.github.dockerjava.core.command.PullImageResultCallback; +import com.google.common.base.Joiner; + +public abstract class AbstractDockerClientTest extends Assert { + + public static final Logger LOG = LoggerFactory.getLogger(AbstractDockerClientTest.class); + + private String apiVersion = "1.19"; + + protected DockerClient dockerClient; + + protected TestDockerCmdExecFactory dockerCmdExecFactory = new TestDockerCmdExecFactory( + new DockerCmdExecFactoryImpl()); + + public void beforeTest() throws Exception { + + LOG.info("======================= BEFORETEST ======================="); + LOG.info("Connecting to Docker server"); + dockerClient = DockerClientBuilder.getInstance(config()).withDockerCmdExecFactory(dockerCmdExecFactory).build(); + +// LOG.info("Pulling image 'busybox'"); +// +// // need to block until image is pulled completely +// dockerClient.pullImageCmd("busybox").withTag("latest").exec(new PullImageResultCallback()).awaitSuccess(); + + assertNotNull(dockerClient); + LOG.info("======================= END OF BEFORETEST =======================\n\n"); + } + + private DockerClientConfig config() { + return config(null); + } + + protected DockerClientConfig config(String password) { + DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder() + .withServerAddress("https://index.docker.io/v1/"); + if (password != null) { + builder = builder.withPassword(password); + } + + return builder.withVersion(apiVersion).build(); + } + + public void afterTest() { + LOG.info("======================= END OF AFTERTEST ======================="); + } + + public void beforeMethod(Method method) { + LOG.info(String.format("################################## STARTING %s ##################################", + method.getName())); + } + + public void afterMethod(ITestResult result) { + + for (String container : dockerCmdExecFactory.getContainerNames()) { + LOG.info("Cleaning up temporary container {}", container); + + try { + dockerClient.removeContainerCmd(container).withForce(true).exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + + for (String image : dockerCmdExecFactory.getImageNames()) { + LOG.info("Cleaning up temporary image with {}", image); + try { + dockerClient.removeImageCmd(image).withForce(true).exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + + LOG.info("################################## END OF {} ##################################\n", result.getName()); + } + + protected String asString(InputStream response) { + return consumeAsString(response); + } + + public static String consumeAsString(InputStream response) { + + StringWriter logwriter = new StringWriter(); + + try { + LineIterator itr = IOUtils.lineIterator(response, "UTF-8"); + + while (itr.hasNext()) { + String line = itr.next(); + logwriter.write(line + (itr.hasNext() ? "\n" : "")); + LOG.info("line: " + line); + } + response.close(); + + return logwriter.toString(); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + IOUtils.closeQuietly(response); + } + } + + // UTIL + + /** + * Checks to see if a specific port is available. + * + * @param port + * the port to check for availability + */ + public static Boolean available(int port) { + if (port < 1100 || port > 60000) { + throw new IllegalArgumentException("Invalid start port: " + port); + } + + ServerSocket ss = null; + DatagramSocket ds = null; + try { + ss = new ServerSocket(port); + ss.setReuseAddress(true); + ds = new DatagramSocket(port); + ds.setReuseAddress(true); + return true; + } catch (IOException ignored) { + } finally { + if (ds != null) { + ds.close(); + } + + if (ss != null) { + try { + ss.close(); + } catch (IOException e) { + /* should not be thrown */ + } + } + } + + return false; + } + + /** + * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) has {@link VolumeBind}s for + * the given {@link Volume}s + */ + public static void assertContainerHasVolumes(InspectContainerResponse inspectContainerResponse, + Volume... expectedVolumes) { + VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); + LOG.info("Inspect .Volumes = [{}]", Joiner.on(", ").join(volumeBinds)); + + List volumes = new ArrayList(); + for (VolumeBind bind : volumeBinds) { + volumes.add(new Volume(bind.getContainerPath())); + } + assertThat(volumes, contains(expectedVolumes)); + } + + protected String containerLog(String containerId) throws Exception { + return dockerClient.logContainerCmd(containerId).withStdOut(true).exec(new LogContainerTestCallback()) + .awaitCompletion().toString(); + } + + public static class LogContainerTestCallback extends LogContainerResultCallback { + protected final StringBuffer log = new StringBuffer(); + + @Override + public void onNext(Frame frame) { + log.append(new String(frame.getPayload())); + super.onNext(frame); + } + + @Override + public String toString() { + return log.toString(); + } + } + + protected String buildImage(File baseDir) throws Exception { + + return dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()) + .awaitImageId(); + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/AuthCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AuthCmdExecTest.java new file mode 100644 index 000000000..3cadd6485 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/AuthCmdExecTest.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.netty.exec; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.model.AuthResponse; +import com.github.dockerjava.core.DockerClientBuilder; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class AuthCmdExecTest extends AbstractDockerClientTest { + + @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 testAuth() throws Exception { + AuthResponse response = dockerClient.authCmd().exec(); + + assertEquals(response.getStatus(), "Login Succeeded"); + } + + @Test() + 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"); + } + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java new file mode 100644 index 000000000..43400edfc --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java @@ -0,0 +1,560 @@ +package com.github.dockerjava.netty.exec; + +import static com.github.dockerjava.api.model.Capability.MKNOD; +import static com.github.dockerjava.api.model.Capability.NET_ADMIN; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItemInArray; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.startsWith; + +import java.lang.reflect.Method; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +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 com.github.dockerjava.api.ConflictException; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.AccessMode; +import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.Device; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.Link; +import com.github.dockerjava.api.model.LogConfig; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.Ulimit; +import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeRW; +import com.github.dockerjava.api.model.VolumesFrom; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class CreateContainerCmdExecTest extends AbstractDockerClientTest { + + @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 createContainerWithExistingName() throws DockerException { + + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("env") + .withName(containerName).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + try { + dockerClient.createContainerCmd("busybox").withCmd("env").withName(containerName).exec(); + fail("expected ConflictException"); + } catch (ConflictException e) { + } + } + + @Test + public void createContainerWithVolume() throws DockerException { + + Volume volume = new Volume("/var/log"); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume) + .withCmd("true").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + LOG.info("Inspect container {}", inspectContainerResponse.getConfig().getVolumes()); + + assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/var/log")); + + assertThat(inspectContainerResponse.getVolumesRW(), hasItemInArray(new VolumeRW(volume, AccessMode.rw))); + } + + @Test + public void createContainerWithReadOnlyVolume() throws DockerException { + + Volume volume = new Volume("/srv/test"); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume) + .withCmd("true").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + LOG.info("Inspect container {}", inspectContainerResponse.getConfig().getVolumes()); + + assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/srv/test")); + + assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), contains(new VolumeRW(volume))); + } + + @Test + public void createContainerWithVolumesFrom() throws DockerException { + + Volume volume1 = new Volume("/opt/webapp1"); + Volume volume2 = new Volume("/opt/webapp2"); + + String container1Name = UUID.randomUUID().toString(); + + // create a running container with bind mounts + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName(container1Name) + .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + LOG.info("Created container1 {}", container1.toString()); + + dockerClient.startContainerCmd(container1.getId()).exec(); + LOG.info("Started container1 {}", container1.toString()); + + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); + + assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); + + // create a second container with volumes from first container + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withVolumesFrom(new VolumesFrom(container1Name)).exec(); + LOG.info("Created container2 {}", container2.toString()); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + + // No volumes are created, the information is just stored in .HostConfig.VolumesFrom + assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom( + container1Name))); + + // To ensure that the information stored in VolumesFrom really is considered + // when starting the container, we start it and verify that it has the same + // bind mounts as the first container. + // This is somehow out of scope here, but it helped me to understand how the + // VolumesFrom feature really works. + dockerClient.startContainerCmd(container2.getId()).exec(); + LOG.info("Started container2 {}", container2.toString()); + + inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()).exec(); + + assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom( + container1Name))); + assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); + } + + @Test + public void createContainerWithEnv() throws Exception { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withEnv("VARIABLE=success") + .withCmd("env").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEnv()), containsInAnyOrder("VARIABLE=success")); + + dockerClient.startContainerCmd(container.getId()).exec(); + + assertThat(containerLog(container.getId()), containsString("VARIABLE=success")); + } + + @Test + public void createContainerWithHostname() throws Exception { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withHostName("docker-java") + .withCmd("env").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getConfig().getHostName(), equalTo("docker-java")); + + dockerClient.startContainerCmd(container.getId()).exec(); + + assertThat(containerLog(container.getId()), containsString("HOSTNAME=docker-java")); + } + + @Test + public void createContainerWithName() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withCmd("env").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getName(), equalTo("/container")); + + try { + dockerClient.createContainerCmd("busybox").withName("container").withCmd("env").exec(); + fail("Expected ConflictException"); + } catch (ConflictException e) { + } + + } + + @Test + public void createContainerWithLink() throws DockerException { + + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); + LOG.info("Created container1 {}", container1.toString()); + 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().isRunning(), is(true)); + + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").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(); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + } + + @Test + public void createContainerWithCapAddAndCapDrop() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCapAdd(NET_ADMIN) + .withCapDrop(MKNOD).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapAdd()), contains(NET_ADMIN)); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapDrop()), contains(MKNOD)); + } + + @Test + public void createContainerWithDns() throws DockerException { + + String aDnsServer = "8.8.8.8"; + String anotherDnsServer = "8.8.4.4"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withDns(aDnsServer, anotherDnsServer).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), + contains(aDnsServer, anotherDnsServer)); + } + + @Test + public void createContainerWithEntrypoint() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withEntrypoint("sleep", "9999").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getEntrypoint()), contains("sleep", "9999")); + + } + + @Test + public void createContainerWithExtraHosts() throws DockerException { + + String[] extraHosts = { "dockerhost:127.0.0.1", "otherhost:10.0.0.1" }; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withExtraHosts(extraHosts).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()), + containsInAnyOrder("dockerhost:127.0.0.1", "otherhost:10.0.0.1")); + } + + @Test + public void createContainerWithDevices() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDevices()), contains(new Device("rwm", + "/dev/nulo", "/dev/zero"))); + } + + @Test + public void createContainerWithPortBindings() throws DockerException { + + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); + + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(11022)); + portBindings.bind(tcp23, Ports.Binding(11023)); + portBindings.bind(tcp23, Ports.Binding(11024)); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0], + is(equalTo(Ports.Binding(11022)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], + is(equalTo(Ports.Binding(11023)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], + is(equalTo(Ports.Binding(11024)))); + + } + + @Test + public void createContainerWithLinking() throws DockerException { + + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); + + LOG.info("Created container1 {}", container1.toString()); + 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.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getId(), startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); + assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getState(), is(notNullValue())); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + + if (!inspectContainerResponse1.getState().isRunning()) { + assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); + } + + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container2").withLinks(new Link("container1", "container1Link")).exec(); + + LOG.info("Created container2 {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); + + assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); + assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); + + } + + @Test + public void createContainerWithRestartPolicy() throws DockerException { + + RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withRestartPolicy(restartPolicy).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), is(equalTo(restartPolicy))); + } + + @Test + public void createContainerWithPidMode() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withPidMode("host").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getPidMode(), is(equalTo("host"))); + } + + /** + * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the + * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for + * this container 'container:': reuses another container network stack 'host': use the host network stack inside the + * container. Note: the host mode gives the container full access to local system services such as D-bus and is + * therefore considered insecure. + */ + @Test + public void createContainerWithNetworkMode() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withNetworkMode("host").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), is(equalTo("host"))); + } + + @Test + public void createContainerWithMacAddress() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withMacAddress("00:80:41:ae:fd:7e").withCmd("true").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertEquals(inspectContainerResponse.getConfig().getMacAddress(), "00:80:41:ae:fd:7e"); + } + + @Test(groups = "ignoreInCircleCi") + public void createContainerWithULimits() throws DockerException { + + Ulimit[] ulimits = { new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096) }; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") + .withUlimits(ulimits).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getUlimits()), + containsInAnyOrder(new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096))); + + } + + @Test(groups = "ignoreInCircleCi") + public void createContainerWithLabels() throws DockerException { + + Map labels = new HashMap(); + labels.put("com.github.dockerjava.null", null); + labels.put("com.github.dockerjava.Boolean", "true"); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withLabels(labels).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + // null becomes empty string + labels.put("com.github.dockerjava.null", ""); + assertThat(inspectContainerResponse.getConfig().getLabels(), is(equalTo(labels))); + } + + @Test(groups = "ignoreInCircleCi") + public void createContainerWithLogConfig() throws DockerException { + + LogConfig logConfig = new LogConfig(LogConfig.LoggingType.NONE, null); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withLogConfig(logConfig).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + // null becomes empty string + assertEquals(inspectContainerResponse.getHostConfig().getLogConfig().type, logConfig.type); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/ExecCreateCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ExecCreateCmdExecTest.java new file mode 100644 index 000000000..9f95751c2 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/ExecCreateCmdExecTest.java @@ -0,0 +1,61 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; +import java.security.SecureRandom; + +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 com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class ExecCreateCmdExecTest extends AbstractDockerClientTest { + @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(groups = "ignoreInCircleCi") + public void execCreateTest() { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") + .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()) + .withCmd("touch", "file.log").exec(); + + assertThat(execCreateCmdResponse.getId(), not(isEmptyString())); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java new file mode 100644 index 000000000..3702a7102 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java @@ -0,0 +1,97 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.security.SecureRandom; + +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 com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.core.command.ExecStartResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class ExecStartCmdExecTest extends AbstractDockerClientTest { + @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(groups = "ignoreInCircleCi") + public void execStart() throws Exception { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") + .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").exec(); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec( + new ExecStartResultCallback(System.out, System.err)); + + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); + + Boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied from the container."); + + // read the stream fully. Otherwise, the underlying stream will not be closed. + String responseAsString = asString(response); + assertNotNull(responseAsString); + assertTrue(responseAsString.length() > 0); + } + + @Test(groups = "ignoreInCircleCi") + public void execStartAttached() 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").exec(); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true) + .exec(new ExecStartResultCallback(System.out, System.err)); + + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); + Boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied from the container."); + + // read the stream fully. Otherwise, the underlying stream will not be closed. + String responseAsString = asString(response); + assertNotNull(responseAsString); + assertTrue(responseAsString.length() > 0); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/InfoCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InfoCmdExecTest.java new file mode 100644 index 000000000..db2e0ba96 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/InfoCmdExecTest.java @@ -0,0 +1,71 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Info; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class InfoCmdExecTest extends AbstractDockerClientTest { + + @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 info() throws DockerException { + // Make sure that there is at least one container for the assertion + // TODO extract this into a shared method + if (dockerClient.listContainersCmd().withShowAll(true).exec().size() == 0) { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withName("docker-java-itest-info").withCmd("touch", "/test").exec(); + + LOG.info("Created container: {}", container); + assertThat(container.getId(), not(isEmptyOrNullString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + } + + Info dockerInfo = dockerClient.infoCmd().exec(); + LOG.info(dockerInfo.toString()); + + assertTrue(dockerInfo.toString().contains("containers")); + assertTrue(dockerInfo.toString().contains("images")); + assertTrue(dockerInfo.toString().contains("debug")); + + assertTrue(dockerInfo.getContainers() > 0); + assertTrue(dockerInfo.getImages() > 0); + assertTrue(dockerInfo.getNFd() > 0); + assertTrue(dockerInfo.getNGoroutines() > 0); + assertTrue(dockerInfo.getNCPU() > 0); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java new file mode 100644 index 000000000..c2fbc84a0 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java @@ -0,0 +1,96 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.security.SecureRandom; + +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 com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.command.InspectExecResponse; +import com.github.dockerjava.core.command.ExecStartResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; +import com.github.dockerjava.test.serdes.JSONTestHelper; + +@Test(groups = "integration") +public class InspectExecCmdExecTest extends AbstractDockerClientTest { + + @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(groups = "ignoreInCircleCi") + public void inspectExecTest() throws IOException { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") + .withName(containerName).exec(); + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + ExecCreateCmdResponse touchFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").exec(); + LOG.info("Created exec {}", touchFileCmdCreateResponse.toString()); + assertThat(touchFileCmdCreateResponse.getId(), not(isEmptyString())); + ExecCreateCmdResponse checkFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); + LOG.info("Created exec {}", checkFileCmdCreateResponse.toString()); + assertThat(checkFileCmdCreateResponse.getId(), not(isEmptyString())); + + // Check that file does not exist + dockerClient.execStartCmd(container.getId()) + .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + + InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); + assertThat(first.getExitCode(), is(1)); + + // Create the file + dockerClient.execStartCmd(container.getId()) + .withExecId(touchFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + + InspectExecResponse second = dockerClient.inspectExecCmd(touchFileCmdCreateResponse.getId()).exec(); + assertThat(second.getExitCode(), is(0)); + + // Check that file does exist now + dockerClient.execStartCmd(container.getId()) + .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + + InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); + assertThat(third.getExitCode(), is(0)); + + // Get container info and check its roundtrip to ensure the consistency + InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(container.getId()).exec(); + assertEquals(containerInfo.getId(), container.getId()); + JSONTestHelper.testRoundTrip(containerInfo); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/KillContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/KillContainerCmdExecTest.java new file mode 100644 index 000000000..9ba2c278b --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/KillContainerCmdExecTest.java @@ -0,0 +1,80 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class KillContainerCmdExecTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(KillContainerCmdExecTest.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(groups = "ignoreInCircleCi") + public void killContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Killing container: {}", container.getId()); + dockerClient.killContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); + + } + + @Test + public void killNonExistingContainer() throws DockerException { + + try { + dockerClient.killContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java new file mode 100644 index 000000000..a9a48dc58 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java @@ -0,0 +1,171 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.io.IOException; +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; +import com.github.dockerjava.core.command.WaitContainerResultCallback; + +@Test(groups = "integration") +public class LogContainerCmdExecTest extends AbstractDockerClientTest { + + @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 asyncLogContainer() throws Exception { + + String snippet = "hello world"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()) + .awaitStatusCode(); + + assertThat(exitCode, equalTo(0)); + + LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); + + // this essentially test the since=0 case + dockerClient.logContainerCmd(container.getId()).withStdErr(true).withStdOut(true).exec(loggingCallback); + + loggingCallback.awaitCompletion(); + + assertTrue(loggingCallback.toString().contains(snippet)); + } + + @Test + public void asyncLogNonExistingContainer() throws Exception { + + LogContainerTestCallback loggingCallback = new LogContainerTestCallback() { + @Override + public void onError(Throwable throwable) { + + assertEquals(throwable.getClass().getName(), NotFoundException.class.getName()); + + try { + // close the callback to prevent the call to onComplete + close(); + } catch (IOException e) { + throw new RuntimeException(); + } + + super.onError(throwable); + } + + public void onComplete() { + super.onComplete(); + fail("expected NotFoundException"); + }; + }; + + dockerClient.logContainerCmd("non-existing").withStdErr(true).withStdOut(true).exec(loggingCallback) + .awaitCompletion(); + } + + @Test + public void asyncMultipleLogContainer() throws Exception { + + String snippet = "hello world"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + 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); + + loggingCallback.close(); + + loggingCallback = new LogContainerTestCallback(); + + 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); + + loggingCallback.awaitCompletion(); + + assertTrue(loggingCallback.toString().contains(snippet)); + } + + @Test + public void asyncLogContainerWithSince() throws Exception { + String snippet = "hello world"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("/bin/echo", snippet) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + int timestamp = (int) (System.currentTimeMillis() / 1000); + + dockerClient.startContainerCmd(container.getId()).exec(); + + 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) + .exec(loggingCallback); + + loggingCallback.awaitCompletion(); + + assertFalse(loggingCallback.toString().contains(snippet)); + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java new file mode 100644 index 000000000..8f01b1957 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/StopContainerCmdExecTest.java @@ -0,0 +1,79 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class StopContainerCmdExecTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(StopContainerCmdExecTest.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(groups = "ignoreInCircleCi") + public void testStopContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Stopping container: {}", container.getId()); + dockerClient.stopContainerCmd(container.getId()).withTimeout(2).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); + } + + @Test + public void testStopNonExistingContainer() throws DockerException { + try { + dockerClient.stopContainerCmd("non-existing").withTimeout(2).exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + + } + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/WaitContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/WaitContainerCmdExecTest.java new file mode 100644 index 000000000..ba1dd518e --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/WaitContainerCmdExecTest.java @@ -0,0 +1,108 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.WaitResponse; +import com.github.dockerjava.core.command.WaitContainerResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class WaitContainerCmdExecTest extends AbstractDockerClientTest { + + @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 testWaitContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()) + .awaitStatusCode(); + LOG.info("Container exit code: {}", exitCode); + + assertThat(exitCode, equalTo(0)); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(exitCode))); + } + + @Test(expectedExceptions = NotFoundException.class) + public void testWaitNonExistingContainer() throws DockerException { + + WaitContainerResultCallback callback = new WaitContainerResultCallback() { + public void onNext(WaitResponse waitResponse) { + fail("expected NotFoundException"); + }; + }; + + dockerClient.waitContainerCmd("non-existing").exec(callback).awaitStatusCode(); + } + + @Test + public void testWaitContainerAbort() throws Exception { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + WaitContainerResultCallback callback = dockerClient.waitContainerCmd(container.getId()).exec( + new WaitContainerResultCallback()); + + Thread.sleep(5000); + + callback.close(); + + dockerClient.killContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + } +} diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml index c2d4557a4..b4309b868 100644 --- a/src/test/resources/logback.xml +++ b/src/test/resources/logback.xml @@ -8,6 +8,7 @@ + From c3e84869c5a2f2194983a257d1880031162bc910 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 14 Nov 2015 20:28:09 +0300 Subject: [PATCH 0054/1032] Move utils into util package --- .../com/github/dockerjava/core/GoLangMatchFileFilter.java | 1 + .../com/github/dockerjava/core/LocalDirectorySSLConfig.java | 1 + .../com/github/dockerjava/core/command/BuildImageCmdImpl.java | 2 +- .../com/github/dockerjava/core/dockerfile/Dockerfile.java | 4 ++-- .../github/dockerjava/core/{ => util}/CertificateUtils.java | 2 +- .../dockerjava/core/{ => util}/CompressArchiveUtil.java | 2 +- .../com/github/dockerjava/core/{ => util}/FilePathUtil.java | 2 +- .../com/github/dockerjava/core/CompressArchiveUtilTest.java | 1 + .../github/dockerjava/core/command/BuildImageCmdImplTest.java | 2 +- 9 files changed, 10 insertions(+), 7 deletions(-) rename src/main/java/com/github/dockerjava/core/{ => util}/CertificateUtils.java (99%) rename src/main/java/com/github/dockerjava/core/{ => util}/CompressArchiveUtil.java (97%) rename src/main/java/com/github/dockerjava/core/{ => util}/FilePathUtil.java (95%) diff --git a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java index 371c30fed..1bdfc1669 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java +++ b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java @@ -6,6 +6,7 @@ import java.io.File; import java.util.List; +import com.github.dockerjava.core.util.FilePathUtil; import org.apache.commons.io.filefilter.AbstractFileFilter; public class GoLangMatchFileFilter extends AbstractFileFilter { diff --git a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index 21719c591..7bc7f5c8b 100644 --- a/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -7,6 +7,7 @@ import javax.net.ssl.SSLContext; +import com.github.dockerjava.core.util.CertificateUtils; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.glassfish.jersey.SslConfigurator; 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 16bdbbaf2..8511a60fe 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -10,7 +10,7 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.BuildResponseItem; -import com.github.dockerjava.core.FilePathUtil; +import com.github.dockerjava.core.util.FilePathUtil; import com.github.dockerjava.core.dockerfile.Dockerfile; /** 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 2084b2cce..2112a794c 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -1,8 +1,8 @@ package com.github.dockerjava.core.dockerfile; import com.github.dockerjava.api.exception.DockerClientException; -import com.github.dockerjava.core.CompressArchiveUtil; -import com.github.dockerjava.core.FilePathUtil; +import com.github.dockerjava.core.util.CompressArchiveUtil; +import com.github.dockerjava.core.util.FilePathUtil; import com.github.dockerjava.core.GoLangFileMatch; import com.github.dockerjava.core.exception.GoLangFileMatchException; import com.github.dockerjava.core.GoLangMatchFileFilter; diff --git a/src/main/java/com/github/dockerjava/core/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java similarity index 99% rename from src/main/java/com/github/dockerjava/core/CertificateUtils.java rename to src/main/java/com/github/dockerjava/core/util/CertificateUtils.java index 88ff42f26..384b4b429 100644 --- a/src/main/java/com/github/dockerjava/core/CertificateUtils.java +++ b/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.core; +package com.github.dockerjava.core.util; import org.apache.commons.io.IOUtils; import org.bouncycastle.cert.X509CertificateHolder; diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java similarity index 97% rename from src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java rename to src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java index 356c0c88d..df141df7b 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.core; +package com.github.dockerjava.core.util; import static com.github.dockerjava.core.util.FilePathUtil.relativize; diff --git a/src/main/java/com/github/dockerjava/core/FilePathUtil.java b/src/main/java/com/github/dockerjava/core/util/FilePathUtil.java similarity index 95% rename from src/main/java/com/github/dockerjava/core/FilePathUtil.java rename to src/main/java/com/github/dockerjava/core/util/FilePathUtil.java index 94393f1b8..9655bc502 100644 --- a/src/main/java/com/github/dockerjava/core/FilePathUtil.java +++ b/src/main/java/com/github/dockerjava/core/util/FilePathUtil.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.core; +package com.github.dockerjava.core.util; import java.io.File; import java.io.IOException; diff --git a/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java b/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java index 90ca91fca..fa4164b94 100644 --- a/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java +++ b/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.util.zip.GZIPInputStream; +import com.github.dockerjava.core.util.CompressArchiveUtil; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.commons.io.FileUtils; 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 89d15ecac..f8dc6a940 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -35,7 +35,7 @@ import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.client.AbstractDockerClientTest; -import com.github.dockerjava.core.CompressArchiveUtil; +import com.github.dockerjava.core.util.CompressArchiveUtil; @Test(groups = "integration") public class BuildImageCmdImplTest extends AbstractDockerClientTest { From ee2c9b47789550a09c46c7acec934badf7f4247f Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 14 Nov 2015 20:26:45 +0300 Subject: [PATCH 0055/1032] Add checkstyle with unused imports check --- pom.xml | 30 +++++++++++++++++++ .../checkstyle/checkstyle-config.xml | 21 +++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/test/resources/checkstyle/checkstyle-config.xml diff --git a/pom.xml b/pom.xml index dfee63050..d3abf129a 100644 --- a/pom.xml +++ b/pom.xml @@ -420,6 +420,36 @@ + + docker-java-analyses + + + + maven-checkstyle-plugin + 2.17 + + + checkstyle + validate + + check + + + + + UTF-8 + true + true + false + + + src/test/resources/checkstyle/checkstyle-config.xml + + + + + + diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml new file mode 100644 index 000000000..b804c7f97 --- /dev/null +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + From e93399c0633e49d214c381c7ce382f01a74bd65e Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 20 Nov 2015 17:13:10 +0300 Subject: [PATCH 0056/1032] Move findbugs into profile. --- pom.xml | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index d3abf129a..31ef5c969 100644 --- a/pom.xml +++ b/pom.xml @@ -373,25 +373,6 @@ org.apache.maven.plugins maven-source-plugin - - org.codehaus.mojo - findbugs-maven-plugin - 3.0.2 - - Max - Low - true - - false - - - - - check - - - - @@ -422,6 +403,9 @@ docker-java-analyses + + true + @@ -447,6 +431,25 @@ + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.2 + + Max + Low + true + + false + + + + + check + + + + From fe8778e5b7f8c0c968ed3905a68ce1eaad547d02 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 20 Nov 2015 18:56:35 +0300 Subject: [PATCH 0057/1032] Fix DockerClientConfig serialization. serialVersionUID extracted with: java version "1.7.0_76" Java(TM) SE Runtime Environment (build 1.7.0_76-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.76-b04, mixed mode) Resolves #376 --- .../dockerjava/core/RemoteApiVersion.java | 4 +++- .../core/DockerClientConfigTest.java | 11 +++++++++ .../dockerjava/core/RemoteApiVersionTest.java | 23 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/github/dockerjava/core/RemoteApiVersionTest.java diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index 81db242cd..aa8411f80 100644 --- a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -5,6 +5,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; +import java.io.Serializable; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -15,7 +16,8 @@ * * @author Marcus Thiesen */ -public class RemoteApiVersion { +public class RemoteApiVersion implements Serializable { + private static final long serialVersionUID = -5382212999262115459L; public static final RemoteApiVersion VERSION_1_19 = RemoteApiVersion.create(1, 19); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index e66cfa57d..8bb1c3e39 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -1,6 +1,7 @@ package com.github.dockerjava.core; import com.github.dockerjava.api.model.AuthConfig; +import org.apache.commons.lang.SerializationUtils; import org.testng.annotations.Test; import java.net.URI; @@ -9,6 +10,8 @@ import java.util.Map; import java.util.Properties; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; import static org.testng.Assert.assertEquals; public class DockerClientConfigTest { @@ -184,4 +187,12 @@ public void systemProperties() throws Exception { assertEquals(config, EXAMPLE_CONFIG); } + + @Test + public void serializableTest() { + final byte[] serialized = SerializationUtils.serialize(EXAMPLE_CONFIG); + final DockerClientConfig deserialized = (DockerClientConfig) SerializationUtils.deserialize(serialized); + + assertThat("Deserialized object mush match source object", deserialized, equalTo(EXAMPLE_CONFIG)); + } } diff --git a/src/test/java/com/github/dockerjava/core/RemoteApiVersionTest.java b/src/test/java/com/github/dockerjava/core/RemoteApiVersionTest.java new file mode 100644 index 000000000..011f909ad --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/RemoteApiVersionTest.java @@ -0,0 +1,23 @@ +package com.github.dockerjava.core; + +import org.apache.commons.lang.SerializationUtils; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +/** + * @author Kanstantsin Shautsou + */ +public class RemoteApiVersionTest { + @Test + public void testSerial() { + SerializationUtils.serialize(RemoteApiVersion.unknown()); + final RemoteApiVersion remoteApiVersion = RemoteApiVersion.create(1, 20); + + final byte[] serialized = SerializationUtils.serialize(remoteApiVersion); + RemoteApiVersion deserialized = (RemoteApiVersion) SerializationUtils.deserialize(serialized); + + assertThat("Deserialized object mush match source object", deserialized, equalTo(remoteApiVersion)); + } +} From e03273068342171377638c7bd143edb757d729ae Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 20 Nov 2015 22:24:50 +0300 Subject: [PATCH 0058/1032] Add docker versions for easier javadoc reference --- .../dockerjava/core/RemoteApiVersion.java | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index aa8411f80..bdc2b5247 100644 --- a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -10,7 +10,8 @@ import java.util.regex.Pattern; /** - * Bean to encapsulate the version of the Docker Remote API (REST API) + * Bean to encapsulate the version of the + * Docker Remote (REST) API *

* Contains the minor and major version of the API as well as operations to compare API versions. * @@ -19,10 +20,49 @@ public class RemoteApiVersion implements Serializable { private static final long serialVersionUID = -5382212999262115459L; + private static final Pattern VERSION_REGEX = Pattern.compile("v?(\\d+)\\.(\\d+)"); + + /** + * @see Docker API 1.16 + */ + public static final RemoteApiVersion VERSION_1_16 = RemoteApiVersion.create(1, 16); + + /** + * @see Docker API 1.17 + */ + public static final RemoteApiVersion VERSION_1_17 = RemoteApiVersion.create(1, 17); + + /** + * @see Docker API 1.18 + */ + public static final RemoteApiVersion VERSION_1_18 = RemoteApiVersion.create(1, 18); + + /** + * @see Docker API 1.19 + */ public static final RemoteApiVersion VERSION_1_19 = RemoteApiVersion.create(1, 19); - private static final Pattern VERSION_REGEX = Pattern.compile("v?(\\d+)\\.(\\d+)"); + /** + * @see Docker API 1.20 + */ + public static final RemoteApiVersion VERSION_1_20 = RemoteApiVersion.create(1, 20); + + + /** + * @see Docker API 1.21 + */ + public static final RemoteApiVersion VERSION_1_21 = RemoteApiVersion.create(1, 21); + + /** + * @see Docker API 1.22 + */ + public static final RemoteApiVersion VERSION_1_22 = RemoteApiVersion.create(1, 22); + + /** + * Unknown, docker doesn't reflect reality. + * I.e. we implemented method, but for javadoc it not clear when it was added. + */ private static final RemoteApiVersion UNKNOWN_VERSION = new RemoteApiVersion(0, 0) { @Override From 7e6173de4dc91136e6799e2c55351953717851ec Mon Sep 17 00:00:00 2001 From: Ritesh Patel Date: Tue, 17 Nov 2015 22:25:18 -0800 Subject: [PATCH 0059/1032] Add missing properties for InspectContainerResponse.Status - add missing fields 1.22 - replace isXX to getXX for objects - annotated everything --- .../api/command/InspectContainerResponse.java | 132 +++++++++++++++++- .../command/CreateContainerCmdImplTest.java | 6 +- .../command/KillContainerCmdImplTest.java | 2 +- .../command/RestartContainerCmdImplTest.java | 2 +- .../command/StartContainerCmdImplTest.java | 24 ++-- .../command/StopContainerCmdImplTest.java | 2 +- .../command/WaitContainerCmdImplTest.java | 4 +- 7 files changed, 150 insertions(+), 22 deletions(-) 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 e37e28471..742319483 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; +import com.github.dockerjava.core.RemoteApiVersion; import org.apache.commons.lang.builder.ToStringBuilder; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -16,6 +17,8 @@ import com.github.dockerjava.api.model.VolumeRW; import com.github.dockerjava.api.model.VolumesRW; +import javax.annotation.CheckForNull; + /** * * @author Konstantin Pelykh (kpelykh@gmail.com) @@ -225,44 +228,169 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) public class ContainerState { + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Status") + private String status; + + /** + * @since < {@link RemoteApiVersion#VERSION_1_16} + */ + @CheckForNull @JsonProperty("Running") private Boolean running; + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull @JsonProperty("Paused") private Boolean paused; + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull + @JsonProperty("Restarting") + private Boolean restarting; + + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull + @JsonProperty("OOMKilled") + private Boolean oomKilled; + + /** + * Unclear + * @since {@link RemoteApiVersion#UNKNOWN_VERSION} + */ + @CheckForNull + @JsonProperty("Dead") + private Boolean dead; + + /** + * @since < {@link RemoteApiVersion#VERSION_1_16} + */ + @CheckForNull @JsonProperty("Pid") private Integer pid; + /** + * @since < {@link RemoteApiVersion#VERSION_1_16} + */ + @CheckForNull @JsonProperty("ExitCode") private Integer exitCode; + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull + @JsonProperty("Error") + private String error; + + /** + * @since < {@link RemoteApiVersion#VERSION_1_16} + */ + @CheckForNull @JsonProperty("StartedAt") private String startedAt; + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull @JsonProperty("FinishedAt") private String finishedAt; - public Boolean isRunning() { + + /** + * See {@link #status} + */ + @CheckForNull + public String getStatus() { + return status; + } + + /** + * See {@link #running} + */ + @CheckForNull + public Boolean getRunning() { return running; } - public Boolean isPaused() { + /** + * See {@link #paused} + */ + @CheckForNull + public Boolean getPaused() { return paused; } + /** + * See {@link #restarting} + */ + @CheckForNull + public Boolean getRestarting() { + return restarting; + } + + /** + * See {@link #oomKilled} + */ + @CheckForNull + public Boolean getOOMKilled() { + return oomKilled; + } + + /** + * See {@link #dead} + */ + @CheckForNull + public Boolean getDead() { + return dead; + } + + /** + * See {@link #pid} + */ + @CheckForNull public Integer getPid() { return pid; } + /** + * See {@link #exitCode} + */ + @CheckForNull public Integer getExitCode() { return exitCode; } + /** + * See {@link #error} + */ + @CheckForNull + public String getError() { + return error; + } + + /** + * See {@link #startedAt} + */ + @CheckForNull public String getStartedAt() { return startedAt; } + /** + * See {@link #finishedAt} + */ + @CheckForNull public String getFinishedAt() { return finishedAt; } 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 a445c6ceb..f741f5245 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -253,7 +253,7 @@ public void createContainerWithLink() throws DockerException { InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) .exec(); LOG.info("Container1 Inspect: {}", inspectContainerResponse1.toString()); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse1.getState().getRunning(), is(true)); CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withName("container2") .withCmd("env").withLinks(new Link("container1", "container1Link")).exec(); @@ -406,9 +406,9 @@ public void createContainerWithLinking() throws DockerException { assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); assertThat(inspectContainerResponse1.getState(), is(notNullValue())); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse1.getState().getRunning(), is(true)); - if (!inspectContainerResponse1.getState().isRunning()) { + if (!inspectContainerResponse1.getState().getRunning()) { assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); } 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 1a4e65ccd..3ba85928e 100644 --- a/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/KillContainerCmdImplTest.java @@ -62,7 +62,7 @@ public void killContainer() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getRunning(), is(equalTo(false))); assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); } 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 31b81726f..4920ac087 100644 --- a/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RestartContainerCmdImplTest.java @@ -66,7 +66,7 @@ public void restartContainer() throws DockerException { assertThat(startTime, not(equalTo(startTime2))); - assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(true))); + assertThat(inspectContainerResponse.getState().getRunning(), is(equalTo(true))); dockerClient.killContainerCmd(container.getId()).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 042497672..db6e28fe0 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -289,9 +289,9 @@ public void startContainerWithLinkingDeprecated() throws DockerException { assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); assertThat(inspectContainerResponse1.getState(), is(notNullValue())); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse1.getState().getRunning(), is(true)); - if (!inspectContainerResponse1.getState().isRunning()) { + if (!inspectContainerResponse1.getState().getRunning()) { assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); } @@ -317,7 +317,7 @@ public void startContainerWithLinkingDeprecated() throws DockerException { assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); assertThat(inspectContainerResponse2.getState(), is(notNullValue())); - assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse2.getState().getRunning(), is(true)); } @@ -342,9 +342,9 @@ public void startContainerWithLinking() throws DockerException { assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); assertThat(inspectContainerResponse1.getState(), is(notNullValue())); - assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse1.getState().getRunning(), is(true)); - if (!inspectContainerResponse1.getState().isRunning()) { + if (!inspectContainerResponse1.getState().getRunning()) { assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); } @@ -370,7 +370,7 @@ public void startContainerWithLinking() throws DockerException { assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); assertThat(inspectContainerResponse2.getState(), is(notNullValue())); - assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse2.getState().getRunning(), is(true)); } @@ -396,9 +396,9 @@ public void startContainer() throws DockerException { assertThat(inspectContainerResponse.getImageId(), not(isEmptyString())); assertThat(inspectContainerResponse.getState(), is(notNullValue())); - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse.getState().getRunning(), is(true)); - if (!inspectContainerResponse.getState().isRunning()) { + if (!inspectContainerResponse.getState().getRunning()) { assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(0))); } } @@ -452,7 +452,7 @@ public void startContainerWithCapAddAndCapDrop() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse.getState().getRunning(), is(true)); assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapAdd()), contains(NET_ADMIN)); @@ -473,7 +473,7 @@ public void startContainerWithDevices() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse.getState().getRunning(), is(true)); assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDevices()), contains(new Device("rwm", "/dev/nulo", "/dev/zero"))); @@ -493,7 +493,7 @@ public void startContainerWithExtraHosts() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse.getState().getRunning(), is(true)); assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()), contains("dockerhost:127.0.0.1")); @@ -515,7 +515,7 @@ public void startContainerWithRestartPolicy() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + assertThat(inspectContainerResponse.getState().getRunning(), is(true)); assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), is(equalTo(restartPolicy))); } 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 12213b802..0718c7700 100644 --- a/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StopContainerCmdImplTest.java @@ -62,7 +62,7 @@ public void testStopContainer() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getRunning(), is(equalTo(false))); assertThat(inspectContainerResponse.getState().getExitCode(), not(equalTo(0))); } diff --git a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java index 02ddaf32a..8de80573c 100644 --- a/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/WaitContainerCmdImplTest.java @@ -64,7 +64,7 @@ public void testWaitContainer() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getRunning(), is(equalTo(false))); assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(exitCode))); } @@ -102,6 +102,6 @@ public void testWaitContainerAbort() throws Exception { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); - assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(false))); + assertThat(inspectContainerResponse.getState().getRunning(), is(equalTo(false))); } } From 0bc6671184c8ac210d7df97510ccf05074565310 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 21 Nov 2015 00:27:59 +0300 Subject: [PATCH 0060/1032] Add test case --- .../api/command/CommandJSONSamples.java | 4 +- .../command/InspectContainerResponseTest.java | 31 +++- .../inspectContainerResponse_full_1_21.json | 143 ++++++++++++++++++ 3 files changed, 171 insertions(+), 7 deletions(-) create mode 100644 src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_21.json diff --git a/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java index 104727896..ee7848391 100644 --- a/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java +++ b/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java @@ -24,7 +24,9 @@ */ public enum CommandJSONSamples implements JSONResourceRef { - inspectContainerResponse_full, inspectContainerResponse_empty; + inspectContainerResponse_full, + inspectContainerResponse_full_1_21, + inspectContainerResponse_empty; @Override public String getFileName() { 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 2345b8825..c9d40b65f 100644 --- a/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java +++ b/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java @@ -15,18 +15,21 @@ */ package com.github.dockerjava.api.command; -import static com.github.dockerjava.test.serdes.JSONTestHelper.testRoundTrip; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; +import org.testng.annotations.Test; import java.io.IOException; -import org.testng.annotations.Test; +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.isEmptyString; +import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.core.IsNot.not; +import static org.testng.Assert.*; /** * Tests for {@link InspectContainerResponse}. - * + * * @author Oleg Nenashev */ public class InspectContainerResponseTest { @@ -48,6 +51,22 @@ public void roundTrip_full() throws IOException { assertTrue(response.getVolumesRW()[0].getAccessMode().toBoolean()); } + @Test + public void roundTrip_1_21_full() throws IOException { + InspectContainerResponse[] responses = testRoundTrip(CommandJSONSamples.inspectContainerResponse_full_1_21, + InspectContainerResponse[].class); + assertEquals(1, responses.length); + final InspectContainerResponse response = responses[0]; + final InspectContainerResponse.ContainerState state = response.getState(); + assertThat(state, not(nullValue())); + + assertFalse(state.getDead()); + assertThat(state.getStatus(), containsString("running")); + assertFalse(state.getRestarting()); + assertFalse(state.getOOMKilled()); + assertThat(state.getError(), isEmptyString()); + } + @Test public void roundTrip_empty() throws IOException { testRoundTrip(CommandJSONSamples.inspectContainerResponse_empty, InspectContainerResponse[].class); diff --git a/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_21.json b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_21.json new file mode 100644 index 000000000..92ee66d54 --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_21.json @@ -0,0 +1,143 @@ +[ + { + "Id": "fc1243c01bbb791d9eca64204d76f72fc47fbebbca892d7dd0a5cd0e4e346045", + "Created": "2015-11-20T21:10:34.775649753Z", + "Path": "cat", + "Args": [], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 10912, + "ExitCode": 0, + "Error": "", + "StartedAt": "2015-11-20T21:10:34.845546358Z", + "FinishedAt": "0001-01-01T00:00:00Z" + }, + "Image": "c51f86c283408d1749d066333f7acd5d33b053b003a61ff6a7b36819ddcbc7b7", + "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/fc1243c01bbb791d9eca64204d76f72fc47fbebbca892d7dd0a5cd0e4e346045/resolv.conf", + "HostnamePath": "/mnt/sda1/var/lib/docker/containers/fc1243c01bbb791d9eca64204d76f72fc47fbebbca892d7dd0a5cd0e4e346045/hostname", + "HostsPath": "/mnt/sda1/var/lib/docker/containers/fc1243c01bbb791d9eca64204d76f72fc47fbebbca892d7dd0a5cd0e4e346045/hosts", + "LogPath": "/mnt/sda1/var/lib/docker/containers/fc1243c01bbb791d9eca64204d76f72fc47fbebbca892d7dd0a5cd0e4e346045/fc1243c01bbb791d9eca64204d76f72fc47fbebbca892d7dd0a5cd0e4e346045-json.log", + "Name": "/small_hodgkin", + "RestartCount": 0, + "Driver": "aufs", + "ExecDriver": "native-0.2", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "ContainerIDFile": "", + "LxcConf": [], + "Memory": 0, + "MemoryReservation": 0, + "MemorySwap": 0, + "KernelMemory": 0, + "CpuShares": 0, + "CpuPeriod": 0, + "CpusetCpus": "", + "CpusetMems": "", + "CpuQuota": 0, + "BlkioWeight": 0, + "OomKillDisable": false, + "MemorySwappiness": -1, + "Privileged": false, + "PortBindings": {}, + "Links": null, + "PublishAllPorts": false, + "Dns": null, + "DnsOptions": null, + "DnsSearch": null, + "ExtraHosts": null, + "VolumesFrom": null, + "Devices": [], + "NetworkMode": "default", + "IpcMode": "", + "PidMode": "", + "UTSMode": "", + "CapAdd": null, + "CapDrop": null, + "GroupAdd": null, + "RestartPolicy": { + "Name": "no", + "MaximumRetryCount": 0 + }, + "SecurityOpt": null, + "ReadonlyRootfs": false, + "Ulimits": null, + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "CgroupParent": "", + "ConsoleSize": [ + 0, + 0 + ], + "VolumeDriver": "" + }, + "GraphDriver": { + "Name": "aufs", + "Data": null + }, + "Mounts": [], + "Config": { + "Hostname": "fc1243c01bbb", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "Tty": false, + "OpenStdin": true, + "StdinOnce": false, + "Env": null, + "Cmd": [ + "cat" + ], + "Image": "busybox", + "Volumes": null, + "WorkingDir": "", + "Entrypoint": null, + "OnBuild": null, + "Labels": {}, + "StopSignal": "SIGTERM" + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "5a6ded01bf23cc180e8ba6a059449ac832f28fa1d8367127e316607f92d3228c", + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "Ports": {}, + "SandboxKey": "/var/run/docker/netns/5a6ded01bf23", + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "6b4bb2aff9981d6e132cf37ebbfd370069061fab848ae56247b154717a99aba7", + "Gateway": "172.17.0.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "MacAddress": "02:42:ac:11:00:02", + "Networks": { + "bridge": { + "EndpointID": "6b4bb2aff9981d6e132cf37ebbfd370069061fab848ae56247b154717a99aba7", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "MacAddress": "02:42:ac:11:00:02" + } + } + } + } +] From ef093ab225dece6a80e4387e4112eb4774f432d8 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 21 Nov 2015 00:40:39 +0300 Subject: [PATCH 0061/1032] Add equals and hashCode for State --- .../api/command/InspectContainerResponse.java | 12 ++++++++++++ 1 file changed, 12 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 742319483..57ebe5cc0 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -4,6 +4,8 @@ import java.util.Map; import com.github.dockerjava.core.RemoteApiVersion; +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; @@ -395,6 +397,16 @@ public String getFinishedAt() { return finishedAt; } + @Override + public boolean equals(Object o) { + return EqualsBuilder.reflectionEquals(this, o); + } + + @Override + public int hashCode() { + return HashCodeBuilder.reflectionHashCode(this); + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); From f44ee8f76237a84bc3a4e57c41e097452c808447 Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Mon, 23 Nov 2015 23:31:25 +0100 Subject: [PATCH 0062/1032] Rename CopyFileFromContainerCmd and CopyFileToContainerCmd to CopyArchiveFromContainerCmd and CopyArchiveToContainerCmd --- .../github/dockerjava/api/DockerClient.java | 8 ++++---- ...d.java => CopyArchiveFromContainerCmd.java} | 10 +++++----- .../command/CopyArchiveToContainerCmd.java} | 18 ++++++++---------- .../api/command/DockerCmdExecFactory.java | 5 ++--- .../dockerjava/core/DockerClientImpl.java | 16 ++++++++-------- ...va => CopyArchiveFromContainerCmdImpl.java} | 14 +++++++------- ...java => CopyArchiveToContainerCmdImpl.java} | 15 ++++++++------- ...va => CopyArchiveFromContainerCmdExec.java} | 12 ++++++------ ...java => CopyArchiveToContainerCmdExec.java} | 16 ++++++++-------- .../jaxrs/DockerCmdExecFactoryImpl.java | 13 ++++++------- .../core/TestDockerCmdExecFactory.java | 12 ++++++------ ...> CopyArchiveFromContainerCmdImplTest.java} | 6 +++--- ... => CopyArchiveToContainerCmdImplTest.java} | 8 ++++---- .../core/command/ExecStartCmdImplTest.java | 4 ++-- 14 files changed, 77 insertions(+), 80 deletions(-) rename src/main/java/com/github/dockerjava/api/command/{CopyFileFromContainerCmd.java => CopyArchiveFromContainerCmd.java} (61%) rename src/main/java/com/github/dockerjava/{core/command/CopyFileToContainerCmd.java => api/command/CopyArchiveToContainerCmd.java} (66%) rename src/main/java/com/github/dockerjava/core/command/{CopyFileFromContainerCmdImpl.java => CopyArchiveFromContainerCmdImpl.java} (69%) rename src/main/java/com/github/dockerjava/core/command/{CopyFileToContainerCmdImpl.java => CopyArchiveToContainerCmdImpl.java} (73%) rename src/main/java/com/github/dockerjava/jaxrs/{CopyFileFromContainerCmdExec.java => CopyArchiveFromContainerCmdExec.java} (64%) rename src/main/java/com/github/dockerjava/jaxrs/{CopyFileToContainerCmdExec.java => CopyArchiveToContainerCmdExec.java} (70%) rename src/test/java/com/github/dockerjava/core/command/{CopyFileFromContainerCmdImplTest.java => CopyArchiveFromContainerCmdImplTest.java} (88%) rename src/test/java/com/github/dockerjava/core/command/{CopyFileToContainerCmdImplTest.java => CopyArchiveToContainerCmdImplTest.java} (82%) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index feebfae45..88c830ea7 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -10,7 +10,7 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.EventsCmd; @@ -44,7 +44,7 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.Identifier; -import com.github.dockerjava.core.command.CopyFileToContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; // https://godoc.org/github.com/fsouza/go-dockerclient public interface DockerClient extends Closeable { @@ -120,9 +120,9 @@ public interface DockerClient extends Closeable { public LogContainerCmd logContainerCmd(String containerId); - public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource); + public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(String containerId, String resource); - public CopyFileToContainerCmd copyFileToContainerCmd(String containerId, String hostResource); + public CopyArchiveToContainerCmd copyArchiveToContainerCmd(String containerId, String hostResource); public ContainerDiffCmd containerDiffCmd(String containerId); diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java similarity index 61% rename from src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java rename to src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java index 5ae9f6276..1bb8cf617 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java @@ -7,7 +7,7 @@ import com.github.dockerjava.api.exception.NotFoundException; -public interface CopyFileFromContainerCmd extends SyncDockerCmd { +public interface CopyArchiveFromContainerCmd extends SyncDockerCmd { @CheckForNull public String getContainerId(); @@ -18,11 +18,11 @@ public interface CopyFileFromContainerCmd extends SyncDockerCmd { @CheckForNull public String getResource(); - public CopyFileFromContainerCmd withContainerId(@Nonnull String containerId); + public CopyArchiveFromContainerCmd withContainerId(@Nonnull String containerId); - public CopyFileFromContainerCmd withHostPath(String hostPath); + public CopyArchiveFromContainerCmd withHostPath(String hostPath); - public CopyFileFromContainerCmd withResource(@Nonnull String resource); + public CopyArchiveFromContainerCmd withResource(@Nonnull String resource); /** * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. @@ -33,6 +33,6 @@ public interface CopyFileFromContainerCmd extends SyncDockerCmd { @Override public InputStream exec() throws NotFoundException; - public static interface Exec extends DockerCmdSyncExec { + public static interface Exec extends DockerCmdSyncExec { } } \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java similarity index 66% rename from src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmd.java rename to src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java index ab168c9c3..6fbad5eff 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileToContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java @@ -1,10 +1,8 @@ -package com.github.dockerjava.core.command; +package com.github.dockerjava.api.command; -import com.github.dockerjava.api.command.DockerCmdSyncExec; -import com.github.dockerjava.api.command.SyncDockerCmd; import com.github.dockerjava.api.exception.NotFoundException; -public interface CopyFileToContainerCmd extends SyncDockerCmd { +public interface CopyArchiveToContainerCmd extends SyncDockerCmd { public String getContainerId(); @@ -20,7 +18,7 @@ public interface CopyFileToContainerCmd extends SyncDockerCmd { * @param containerId id of the container to copy file to * @return this */ - public CopyFileToContainerCmd withContainerId(String containerId); + public CopyArchiveToContainerCmd withContainerId(String containerId); /** * Set path to the resource on the host machine @@ -28,7 +26,7 @@ public interface CopyFileToContainerCmd extends SyncDockerCmd { * @param resource path to the resource on the host machine * @return this */ - public CopyFileToContainerCmd withHostResource(String resource); + public CopyArchiveToContainerCmd withHostResource(String resource); /** * If set to true then it will be an error if unpacking the given content would cause an existing directory to be replaced with a non-directory and vice versa @@ -36,7 +34,7 @@ public interface CopyFileToContainerCmd extends SyncDockerCmd { * @param noOverwriteDirNonDir flag to know if non directory can be overwritten * @return this */ - public CopyFileToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir); + public CopyArchiveToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir); /** * If this flag is set to true, all children of the local directory will be copied to the remote without the root directory. @@ -47,16 +45,16 @@ public interface CopyFileToContainerCmd extends SyncDockerCmd { * @param dirChildrenOnly if root directory is ignored * @return this */ - public CopyFileToContainerCmd withDirChildrenOnly(boolean dirChildrenOnly); + public CopyArchiveToContainerCmd withDirChildrenOnly(boolean dirChildrenOnly); public String getRemotePath(); - public CopyFileToContainerCmd withRemotePath(String remotePath); + public CopyArchiveToContainerCmd withRemotePath(String remotePath); @Override public Void exec() throws NotFoundException; - public static interface Exec extends DockerCmdSyncExec { + public static interface Exec extends DockerCmdSyncExec { } } 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 33581c0e7..a8f63ab52 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -4,7 +4,6 @@ import java.io.IOException; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.command.CopyFileToContainerCmd; public interface DockerCmdExecFactory extends Closeable { @@ -56,9 +55,9 @@ public interface DockerCmdExecFactory extends Closeable { public LogContainerCmd.Exec createLogContainerCmdExec(); - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); + public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec(); - public CopyFileToContainerCmd.Exec createCopyFileToContainerCmdExec(); + public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec(); public StopContainerCmd.Exec createStopContainerCmdExec(); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 9725116f6..572b8e906 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -13,7 +13,7 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; @@ -52,9 +52,9 @@ import com.github.dockerjava.core.command.BuildImageCmdImpl; import com.github.dockerjava.core.command.CommitCmdImpl; import com.github.dockerjava.core.command.ContainerDiffCmdImpl; -import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; -import com.github.dockerjava.core.command.CopyFileToContainerCmd; -import com.github.dockerjava.core.command.CopyFileToContainerCmdImpl; +import com.github.dockerjava.core.command.CopyArchiveFromContainerCmdImpl; +import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; +import com.github.dockerjava.core.command.CopyArchiveToContainerCmdImpl; import com.github.dockerjava.core.command.CreateContainerCmdImpl; import com.github.dockerjava.core.command.CreateImageCmdImpl; import com.github.dockerjava.core.command.EventsCmdImpl; @@ -300,14 +300,14 @@ public LogContainerCmd logContainerCmd(String containerId) { } @Override - public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource) { - return new CopyFileFromContainerCmdImpl(getDockerCmdExecFactory().createCopyFileFromContainerCmdExec(), + public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(String containerId, String resource) { + return new CopyArchiveFromContainerCmdImpl(getDockerCmdExecFactory().createCopyArchiveFromContainerCmdExec(), containerId, resource); } @Override - public CopyFileToContainerCmd copyFileToContainerCmd(String containerId, String hostResource) { - return new CopyFileToContainerCmdImpl(getDockerCmdExecFactory().createCopyFileToContainerCmdExec(), + public CopyArchiveToContainerCmd copyArchiveToContainerCmd(String containerId, String hostResource) { + return new CopyArchiveToContainerCmdImpl(getDockerCmdExecFactory().createCopyArchiveToContainerCmdExec(), containerId, hostResource); } diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImpl.java similarity index 69% rename from src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java rename to src/main/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImpl.java index 5ff671d14..dd03fc435 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImpl.java @@ -4,14 +4,14 @@ import java.io.InputStream; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; /** * Copy files or folders from a container. */ -public class CopyFileFromContainerCmdImpl extends AbstrDockerCmd implements - CopyFileFromContainerCmd { +public class CopyArchiveFromContainerCmdImpl extends AbstrDockerCmd implements + CopyArchiveFromContainerCmd { private String containerId; @@ -19,7 +19,7 @@ public class CopyFileFromContainerCmdImpl extends AbstrDockerCmd implements CopyFileToContainerCmd { +public class CopyArchiveToContainerCmdImpl extends AbstrDockerCmd implements CopyArchiveToContainerCmd { private String containerId; @@ -18,21 +19,21 @@ public class CopyFileToContainerCmdImpl extends AbstrDockerCmd - implements CopyFileFromContainerCmd.Exec { +public class CopyArchiveFromContainerCmdExec extends AbstrSyncDockerCmdExec + implements CopyArchiveFromContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(CopyArchiveFromContainerCmdExec.class); - public CopyFileFromContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + public CopyArchiveFromContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { super(baseResource, dockerClientConfig); } @Override - protected InputStream execute(CopyFileFromContainerCmd command) { + protected InputStream execute(CopyArchiveFromContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/archive").resolveTemplate("id", command.getContainerId()); diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyArchiveToContainerCmdExec.java similarity index 70% rename from src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java rename to src/main/java/com/github/dockerjava/jaxrs/CopyArchiveToContainerCmdExec.java index ca7c3d9b8..1866d196c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileToContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyArchiveToContainerCmdExec.java @@ -13,27 +13,27 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.github.dockerjava.api.DockerClientException; -import com.github.dockerjava.core.CompressArchiveUtil; +import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.command.CopyFileToContainerCmd; +import com.github.dockerjava.core.util.CompressArchiveUtil; -public class CopyFileToContainerCmdExec extends AbstrSyncDockerCmdExec implements CopyFileToContainerCmd.Exec { +public class CopyArchiveToContainerCmdExec extends AbstrSyncDockerCmdExec implements CopyArchiveToContainerCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(CopyArchiveFromContainerCmdExec.class); - public CopyFileToContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + public CopyArchiveToContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { super(baseResource, dockerClientConfig); } - private InputStream buildUploadStream(CopyFileToContainerCmd command) throws IOException { + private InputStream buildUploadStream(CopyArchiveToContainerCmd command) throws IOException { Path toUpload = Files.createTempFile("docker-java", ".tar.gz"); CompressArchiveUtil.tar(Paths.get(command.getHostResource()), toUpload, true, command.isDirChildrenOnly()); return Files.newInputStream(toUpload); } @Override - protected Void execute(CopyFileToContainerCmd command) { + protected Void execute(CopyArchiveToContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/archive").resolveTemplate("id", command.getContainerId()); diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index b373d737a..bcb669f47 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -7,7 +7,7 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; @@ -40,8 +40,7 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.RemoteApiVersion; -import com.github.dockerjava.core.command.CopyFileToContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; @@ -312,13 +311,13 @@ public LogContainerCmd.Exec createLogContainerCmdExec() { } @Override - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return new CopyFileFromContainerCmdExec(getBaseResource(), getDockerClientConfig()); + public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() { + return new CopyArchiveFromContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override - public CopyFileToContainerCmd.Exec createCopyFileToContainerCmdExec() { - return new CopyFileToContainerCmdExec(getBaseResource(), getDockerClientConfig()); + public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() { + return new CopyArchiveToContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 5e9f18f06..528d99cec 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -11,7 +11,7 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.CreateImageCmd; @@ -46,7 +46,7 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.BuildResponseItem; -import com.github.dockerjava.core.command.CopyFileToContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; /** * Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution @@ -238,13 +238,13 @@ public LogContainerCmd.Exec createLogContainerCmdExec() { } @Override - public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { - return delegate.createCopyFileFromContainerCmdExec(); + public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() { + return delegate.createCopyArchiveFromContainerCmdExec(); } @Override - public CopyFileToContainerCmd.Exec createCopyFileToContainerCmdExec() { - return delegate.createCopyFileToContainerCmdExec(); + public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() { + return delegate.createCopyArchiveToContainerCmdExec(); } @Override diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImplTest.java similarity index 88% rename from src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java rename to src/test/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImplTest.java index 3e4e88612..0f9da6058 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImplTest.java @@ -19,7 +19,7 @@ import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") -public class CopyFileFromContainerCmdImplTest extends AbstractDockerClientTest { +public class CopyArchiveFromContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest public void beforeTest() throws Exception { @@ -52,7 +52,7 @@ public void copyFromContainer() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/copyFromContainer").exec(); + InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/copyFromContainer").exec(); Boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied from the container."); @@ -65,7 +65,7 @@ public void copyFromContainer() throws Exception { @Test public void copyFromNonExistingContainer() throws Exception { try { - dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec(); + dockerClient.copyArchiveFromContainerCmd("non-existing", "/test").exec(); fail("expected NotFoundException"); } catch (NotFoundException ignored) { } diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java similarity index 82% rename from src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java rename to src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java index 7bee960b4..77d35970b 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileToContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java @@ -18,7 +18,7 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.client.AbstractDockerClientTest; -public class CopyFileToContainerCmdImplTest extends AbstractDockerClientTest { +public class CopyArchiveToContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest public void beforeTest() throws Exception { super.beforeTest(); @@ -50,8 +50,8 @@ public void copyToContainer() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - dockerClient.copyFileToContainerCmd(container.getId(), "src/test/resources/testReadFile").exec(); - try (InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "testReadFile").exec()) { + dockerClient.copyArchiveToContainerCmd(container.getId(), "src/test/resources/testReadFile").exec(); + try (InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "testReadFile").exec()) { boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied to the container."); } @@ -60,7 +60,7 @@ public void copyToContainer() throws Exception { @Test public void copyToNonExistingContainer() throws Exception { try { - dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec(); + dockerClient.copyArchiveFromContainerCmd("non-existing", "/test").exec(); fail("expected NotFoundException"); } catch (NotFoundException ignored) { } diff --git a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java index 43aa49f0e..5144f2d4f 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -56,7 +56,7 @@ public void execStart() throws Exception { .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec(); dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); - InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); + InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec(); Boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied from the container."); @@ -81,7 +81,7 @@ public void execStartAttached() throws Exception { .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec(); dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true).exec(); - InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); + InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec(); Boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied from the container."); From 6124775f91b2b8c2631ce7a71eead72dc63d6d8c Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Tue, 24 Nov 2015 00:30:25 +0100 Subject: [PATCH 0063/1032] Reset CopyFileFromContainerCmd for compatibility purpose --- .../github/dockerjava/api/DockerClient.java | 5 +- .../api/command/CopyFileFromContainerCmd.java | 38 +++++++++ .../api/command/DockerCmdExecFactory.java | 2 + .../dockerjava/core/DockerClientImpl.java | 8 ++ .../command/CopyFileFromContainerCmdImpl.java | 77 +++++++++++++++++++ .../core/util/CompressArchiveUtil.java | 1 - .../core/{ => util}/TarDirWalker.java | 8 +- .../jaxrs/CopyFileFromContainerCmdExec.java | 38 +++++++++ .../jaxrs/DockerCmdExecFactoryImpl.java | 58 ++++++++------ .../core/TestDockerCmdExecFactory.java | 8 +- .../CopyArchiveToContainerCmdImplTest.java | 2 +- .../CopyFileFromContainerCmdImplTest.java | 73 ++++++++++++++++++ 12 files changed, 284 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java create mode 100644 src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java rename src/main/java/com/github/dockerjava/core/{ => util}/TarDirWalker.java (87%) create mode 100644 src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java create mode 100644 src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 88c830ea7..81bd1957e 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -11,6 +11,8 @@ import com.github.dockerjava.api.command.CommitCmd; 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.EventsCmd; @@ -44,7 +46,6 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.Identifier; -import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; // https://godoc.org/github.com/fsouza/go-dockerclient public interface DockerClient extends Closeable { @@ -122,6 +123,8 @@ public interface DockerClient extends Closeable { public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(String containerId, String resource); + public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource); + public CopyArchiveToContainerCmd copyArchiveToContainerCmd(String containerId, String hostResource); public ContainerDiffCmd containerDiffCmd(String containerId); diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java new file mode 100644 index 000000000..5ae9f6276 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -0,0 +1,38 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +public interface CopyFileFromContainerCmd extends SyncDockerCmd { + + @CheckForNull + public String getContainerId(); + + @CheckForNull + public String getHostPath(); + + @CheckForNull + public String getResource(); + + public CopyFileFromContainerCmd withContainerId(@Nonnull String containerId); + + public CopyFileFromContainerCmd withHostPath(String hostPath); + + public CopyFileFromContainerCmd withResource(@Nonnull String resource); + + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException + * No such container + */ + @Override + public InputStream exec() throws NotFoundException; + + public static interface Exec extends DockerCmdSyncExec { + } +} \ No newline at end of file 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 a8f63ab52..f0b35f58f 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -55,6 +55,8 @@ public interface DockerCmdExecFactory extends Closeable { public LogContainerCmd.Exec createLogContainerCmdExec(); + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); + public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec(); public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec(); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 572b8e906..913cf0a4c 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -14,6 +14,7 @@ import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; +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.DockerCmdExecFactory; @@ -55,6 +56,7 @@ import com.github.dockerjava.core.command.CopyArchiveFromContainerCmdImpl; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.core.command.CopyArchiveToContainerCmdImpl; +import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; import com.github.dockerjava.core.command.CreateContainerCmdImpl; import com.github.dockerjava.core.command.CreateImageCmdImpl; import com.github.dockerjava.core.command.EventsCmdImpl; @@ -299,6 +301,12 @@ public LogContainerCmd logContainerCmd(String containerId) { return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId); } + @Override + public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource) { + return new CopyFileFromContainerCmdImpl(getDockerCmdExecFactory().createCopyFileFromContainerCmdExec(), + containerId, resource); + } + @Override public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(String containerId, String resource) { return new CopyArchiveFromContainerCmdImpl(getDockerCmdExecFactory().createCopyArchiveFromContainerCmdExec(), diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java new file mode 100644 index 000000000..77a219170 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -0,0 +1,77 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.InputStream; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; + +/** + * + * Copy files or folders from a container. + * + */ +public class CopyFileFromContainerCmdImpl extends AbstrDockerCmd implements + CopyFileFromContainerCmd { + + private String containerId; + + @JsonProperty("HostPath") + private String hostPath = "."; + + @JsonProperty("Resource") + private String resource; + + public CopyFileFromContainerCmdImpl(CopyFileFromContainerCmd.Exec exec, String containerId, String resource) { + super(exec); + withContainerId(containerId); + withResource(resource); + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override + public String getResource() { + return resource; + } + + @Override + public CopyFileFromContainerCmdImpl withContainerId(String containerId) { + checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + return this; + } + + @Override + public CopyFileFromContainerCmdImpl withResource(String resource) { + checkNotNull(resource, "resource was not specified"); + this.resource = resource; + return this; + } + + @Override + public String getHostPath() { + return hostPath; + } + + @Override + public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { + checkNotNull(hostPath, "hostPath was not specified"); + this.hostPath = hostPath; + return this; + } + + /** + * @throws NotFoundException + * No such container + */ + @Override + public InputStream exec() throws NotFoundException { + return super.exec(); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java index c5bf9f0be..8506a66e3 100644 --- a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java @@ -19,7 +19,6 @@ import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream; import org.apache.commons.io.FileUtils; -import com.github.dockerjava.core.TarDirWalker; import com.google.common.io.ByteStreams; public class CompressArchiveUtil { diff --git a/src/main/java/com/github/dockerjava/core/TarDirWalker.java b/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java similarity index 87% rename from src/main/java/com/github/dockerjava/core/TarDirWalker.java rename to src/main/java/com/github/dockerjava/core/util/TarDirWalker.java index 091d9d3a6..927736af5 100644 --- a/src/main/java/com/github/dockerjava/core/TarDirWalker.java +++ b/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java @@ -1,6 +1,4 @@ -package com.github.dockerjava.core; - -import static com.github.dockerjava.core.FilePathUtil.relativize; +package com.github.dockerjava.core.util; import java.io.IOException; import java.nio.file.FileVisitResult; @@ -27,14 +25,14 @@ public TarDirWalker(Path basePath, TarArchiveOutputStream tarArchiveOutputStream @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { if (!dir.equals(basePath)) { - tarArchiveOutputStream.putArchiveEntry(new TarArchiveEntry(relativize(basePath, dir))); + tarArchiveOutputStream.putArchiveEntry(new TarArchiveEntry(FilePathUtil.relativize(basePath, dir))); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - CompressArchiveUtil.putTarEntry(tarArchiveOutputStream, new TarArchiveEntry(relativize(basePath, file)), file); + CompressArchiveUtil.putTarEntry(tarArchiveOutputStream, new TarArchiveEntry(FilePathUtil.relativize(basePath, file)), file); return FileVisitResult.CONTINUE; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java new file mode 100644 index 000000000..10a719cbc --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -0,0 +1,38 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.jaxrs.util.WrappedResponseInputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.InputStream; + +import static javax.ws.rs.client.Entity.entity; + +public class CopyFileFromContainerCmdExec extends AbstrSyncDockerCmdExec + implements CopyFileFromContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CopyFileFromContainerCmdExec.class); + + public CopyFileFromContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InputStream execute(CopyFileFromContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/copy").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: " + webResource.toString()); + + Response response = webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM_TYPE) + .post(entity(command, MediaType.APPLICATION_JSON)); + + return new WrappedResponseInputStream(response); + } + +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index bcb669f47..ba076848d 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -1,13 +1,38 @@ package com.github.dockerjava.jaxrs; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.IOException; +import java.net.URI; + +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 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.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.exception.DockerClientException; 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.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.DockerCmdExecFactory; @@ -39,34 +64,12 @@ 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.exception.DockerClientException; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter; -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.client.ClientConfig; -import org.glassfish.jersey.client.ClientProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -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 java.io.IOException; -import java.net.URI; - -import static com.google.common.base.Preconditions.checkNotNull; //import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; // see https://github.com/docker-java/docker-java/issues/196 @@ -174,7 +177,7 @@ public void init(DockerClientConfig dockerClientConfig) { } 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) { @@ -315,6 +318,11 @@ 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()); diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 528d99cec..d1ff920b0 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -12,6 +12,8 @@ import com.github.dockerjava.api.command.CommitCmd; 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.CreateContainerResponse; import com.github.dockerjava.api.command.CreateImageCmd; @@ -46,7 +48,6 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.BuildResponseItem; -import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; /** * Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution @@ -237,6 +238,11 @@ public LogContainerCmd.Exec createLogContainerCmdExec() { return delegate.createLogContainerCmdExec(); } + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return delegate.createCopyFileFromContainerCmdExec(); + } + @Override public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() { return delegate.createCopyArchiveFromContainerCmdExec(); 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 77d35970b..dfc991526 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java @@ -14,8 +14,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.client.AbstractDockerClientTest; public class CopyArchiveToContainerCmdImplTest extends AbstractDockerClientTest { diff --git a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java new file mode 100644 index 000000000..d073daf45 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java @@ -0,0 +1,73 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.not; + +import java.io.InputStream; +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class CopyFileFromContainerCmdImplTest extends AbstractDockerClientTest { + + @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 copyFromContainer() throws Exception { + // TODO extract this into a shared method + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withName("docker-java-itest-copyFromContainer").withCmd("touch", "/copyFromContainer").exec(); + + LOG.info("Created container: {}", container); + assertThat(container.getId(), not(isEmptyOrNullString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/copyFromContainer").exec(); + Boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied from the container."); + + // read the stream fully. Otherwise, the underlying stream will not be closed. + String responseAsString = asString(response); + assertNotNull(responseAsString); + assertTrue(responseAsString.length() > 0); + } + + @Test + public void copyFromNonExistingContainer() throws Exception { + try { + dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException ignored) { + } + } +} \ No newline at end of file From e837b810592b2b39726148a7f0920b06f1b88ba2 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 24 Nov 2015 19:44:30 +0100 Subject: [PATCH 0064/1032] WIP --- .../api/command/InspectContainerResponse.java | 2 +- .../netty/DockerCmdExecFactoryImpl.java | 24 +- .../dockerjava/netty/InvocationBuilder.java | 344 +++++++++--------- .../github/dockerjava/netty/WebTarget.java | 106 +++--- .../dockerjava/netty/exec/AuthCmdExec.java | 10 +- .../netty/exec/CreateContainerCmdExec.java | 4 +- .../netty/exec/ExecCreateCmdExec.java | 32 +- .../dockerjava/netty/exec/InfoCmdExec.java | 36 +- .../netty/exec/InspectContainerCmdExec.java | 10 +- .../netty/exec/InspectExecCmdExec.java | 12 +- .../netty/exec/InspectImageCmdExec.java | 9 +- .../netty/exec/ListContainersCmdExec.java | 21 +- .../netty/exec/RemoveContainerCmdExec.java | 4 +- .../netty/exec/WaitContainerCmdExec.java | 6 +- .../handler/AwaitObjectInboundHandler.java | 39 -- .../DeserializeJsonInboundHandler.java | 32 -- .../handler/FramedResponseStreamHandler.java | 14 + .../netty/handler/HttpResponseHandler.java | 82 +++-- .../HttpResponseStreamInboundHandler.java | 10 - ...ndHandler.java => JsonRequestHandler.java} | 2 +- .../handler/JsonResponseCallbackHandler.java | 47 +++ .../netty/handler/JsonResponseHandler.java | 62 ++++ .../client/AbstractDockerClientTest.java | 3 +- .../netty/AbstractDockerClientTest.java | 8 + .../exec/CreateContainerCmdExecTest.java | 7 - .../exec/InspectContainerCmdExecTest.java | 81 +++++ .../netty/exec/ListContainersCmdExecTest.java | 171 +++++++++ .../netty/exec/LogContainerCmdExecTest.java | 2 +- .../netty/exec/WaitContainerCmdExecTest.java | 2 + 29 files changed, 769 insertions(+), 413 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java delete mode 100644 src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java rename src/main/java/com/github/dockerjava/netty/handler/{SerializeJsonOutboundHandler.java => JsonRequestHandler.java} (87%) create mode 100644 src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java create mode 100644 src/main/java/com/github/dockerjava/netty/handler/JsonResponseHandler.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java 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 e37e28471..cedbc826e 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -126,7 +126,7 @@ public String getResolvConfPath() { @JsonIgnore public VolumeBind[] getVolumes() { - return volumes.getBinds(); + return volumes == null ? new VolumeBind[0]: volumes.getBinds(); } @JsonIgnore diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java index 6c97055fb..37d2534c5 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -68,10 +68,12 @@ 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.model.Info; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.command.ExecCreateCmdImpl; import com.github.dockerjava.core.command.ExecStartCmdImpl; import com.github.dockerjava.core.command.ExecStartResultCallback; +import com.github.dockerjava.core.command.InfoCmdImpl; import com.github.dockerjava.netty.exec.AuthCmdExec; import com.github.dockerjava.netty.exec.CopyFileFromContainerCmdExec; import com.github.dockerjava.netty.exec.CreateContainerCmdExec; @@ -82,6 +84,7 @@ import com.github.dockerjava.netty.exec.InspectExecCmdExec; import com.github.dockerjava.netty.exec.InspectImageCmdExec; import com.github.dockerjava.netty.exec.KillContainerCmdExec; +import com.github.dockerjava.netty.exec.ListContainersCmdExec; import com.github.dockerjava.netty.exec.LogContainerCmdExec; import com.github.dockerjava.netty.exec.RemoveContainerCmdExec; import com.github.dockerjava.netty.exec.StartContainerCmdExec; @@ -327,8 +330,7 @@ public InspectImageCmd.Exec createInspectImageCmdExec() { @Override public ListContainersCmd.Exec createListContainersCmdExec() { - return null; // new ListContainersCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new ListContainersCmdExec(getBaseResource(), getDockerClientConfig()); } @Override @@ -481,15 +483,15 @@ public static void main(String[] args) throws IOException { execFactory.init(config); - // InfoCmd.Exec exec = execFactory.createInfoCmdExec(); - // - // InfoCmd infoCmd = new InfoCmdImpl(exec); - // - // Info info = infoCmd.exec(); - // - // System.out.println("result: " + info); - // - // infoCmd.close(); + InfoCmd.Exec exec = execFactory.createInfoCmdExec(); + + InfoCmd infoCmd = new InfoCmdImpl(exec); + + Info info = infoCmd.exec(); + + System.out.println("result: " + info); + + infoCmd.close(); ExecCreateCmd.Exec execCreate = execFactory.createExecCmdExec(); diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index a2cfeb827..943875270 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -2,6 +2,8 @@ import io.netty.buffer.Unpooled; import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; import io.netty.handler.codec.http.DefaultFullHttpRequest; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpClientCodec; @@ -10,11 +12,11 @@ import io.netty.handler.codec.http.HttpHeaderValues; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpRequest; -import io.netty.handler.codec.http.HttpResponse; import io.netty.handler.codec.http.HttpVersion; import io.netty.handler.codec.json.JsonObjectDecoder; import java.io.BufferedReader; +import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -22,33 +24,42 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.HashMap; -import java.util.List; import java.util.Map; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.BadRequestException; -import com.github.dockerjava.api.ConflictException; -import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.InternalServerErrorException; -import com.github.dockerjava.api.NotAcceptableException; -import com.github.dockerjava.api.NotFoundException; -import com.github.dockerjava.api.NotModifiedException; -import com.github.dockerjava.api.UnauthorizedException; import com.github.dockerjava.api.async.ResultCallback; -import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.Frame; -import com.github.dockerjava.netty.handler.AwaitObjectInboundHandler; -import com.github.dockerjava.netty.handler.DeserializeJsonInboundHandler; +import com.github.dockerjava.core.async.ResultCallbackTemplate; import com.github.dockerjava.netty.handler.FramedResponseStreamHandler; import com.github.dockerjava.netty.handler.HttpConnectionHijackHandler; import com.github.dockerjava.netty.handler.HttpRequestProvider; import com.github.dockerjava.netty.handler.HttpResponseHandler; import com.github.dockerjava.netty.handler.HttpResponseStreamInboundHandler; +import com.github.dockerjava.netty.handler.JsonResponseCallbackHandler; public class InvocationBuilder { + public class ResponseCallback extends ResultCallbackTemplate, T> { + + private T result = null; + + public T awaitResult() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return result; + } + + @Override + public void onNext(T object) { + result = object; + } + } + private ChannelProvider channelProvider; private String resource; @@ -65,98 +76,120 @@ public InvocationBuilder accept(MediaType mediaType) { return this; } - public T get(Class resultType) { + public ResponseCallback delete() { - HttpRequestProvider requestProvider = httpGetRequestProvider(); + HttpRequestProvider requestProvider = httpDeleteRequestProvider(); - Channel channel = channelProvider.getChannel(); + ResponseCallback callback = new ResponseCallback(); - AwaitObjectInboundHandler awaitObject = new AwaitObjectInboundHandler(resultType); + HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, callback); - HttpResponseHandler responseHandler = new HttpResponseHandler(); + Channel channel = getChannel(); channel.pipeline().addLast(responseHandler); - channel.pipeline().addLast(new JsonObjectDecoder()); - channel.pipeline().addLast(new DeserializeJsonInboundHandler(resultType)); - channel.pipeline().addLast(awaitObject); - - sendRequestAndHandleResponse(requestProvider, channel, responseHandler); - return awaitObject.await(); + sendRequestAndHandleResponse(requestProvider, channel); + return callback; } - private void sendRequestAndHandleResponse(HttpRequestProvider requestProvider, Channel channel, - HttpResponseHandler responseHandler) { + public void get(ResultCallback resultCallback) { + + HttpRequestProvider requestProvider = httpGetRequestProvider(); + + HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); + + FramedResponseStreamHandler streamHandler = new FramedResponseStreamHandler(resultCallback); + + Channel channel = getChannel(); - channel.writeAndFlush(requestProvider.getHttpRequest(resource)); + channel.pipeline().addLast(responseHandler); + channel.pipeline().addLast(streamHandler); - handleResponse(channel, responseHandler, requestProvider); + sendRequestAndHandleResponse(requestProvider, channel); } - private HttpRequestProvider httpGetRequestProvider() { - return new HttpRequestProvider() { - @Override - public HttpRequest getHttpRequest(String uri) { - return prepareGetRequest(uri); - } - }; + public ResponseCallback get(TypeReference typeReference) { + + ResponseCallback callback = new ResponseCallback(); + + get(typeReference, callback); + + return callback; } - public void get(ResultCallback resultCallback) { + public void get(TypeReference typeReference, ResultCallback resultCallback) { HttpRequestProvider requestProvider = httpGetRequestProvider(); - HttpResponseHandler responseHandler = new HttpResponseHandler(); + Channel channel = getChannel(); - FramedResponseStreamHandler streamHandler = new FramedResponseStreamHandler(resultCallback); + resultCallbackOnStart(channel, resultCallback); - Channel channel = channelProvider.getChannel(); + JsonResponseCallbackHandler jsonResponseHandler = new JsonResponseCallbackHandler(typeReference, + resultCallback); + + HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); channel.pipeline().addLast(responseHandler); - channel.pipeline().addLast(streamHandler); + channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(jsonResponseHandler); - sendRequestAndHandleResponse(requestProvider, channel, responseHandler); - } + sendRequestAndHandleResponse(requestProvider, channel); - private FullHttpRequest prepareGetRequest(String uri) { + return; + } - FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri); + private Channel getChannel() { + Channel channel = channelProvider.getChannel(); - setDefaultHeaders(request); + return channel; + } - return request; + private HttpRequestProvider httpDeleteRequestProvider() { + return new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return prepareDeleteRequest(uri); + } + }; } - private void setDefaultHeaders(HttpRequest request) { - request.headers().set(HttpHeaderNames.HOST, ""); - request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); - request.headers().set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP); + private HttpRequestProvider httpGetRequestProvider() { + return new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return prepareGetRequest(uri); + } + }; + } - for (Map.Entry entry : headers.entrySet()) { - request.headers().set((CharSequence) entry.getKey(), entry.getValue()); - } + private HttpRequestProvider httpPostRequestProvider(final Object entity) { + return new HttpRequestProvider() { + @Override + public HttpRequest getHttpRequest(String uri) { + return preparePostRequest(uri, entity); + } + }; } - public T post(final Object entity, Class resultType) { + public InputStream post(final Object entity) { HttpRequestProvider requestProvider = httpPostRequestProvider(entity); - AwaitObjectInboundHandler awaitObject = new AwaitObjectInboundHandler(resultType); + Channel channel = getChannel(); - Channel channel = channelProvider.getChannel(); + ResponseCallback callback = new ResponseCallback(); - HttpResponseHandler responseHandler = new HttpResponseHandler(); + HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, callback); + HttpResponseStreamInboundHandler streamHandler = new HttpResponseStreamInboundHandler(); channel.pipeline().addLast(responseHandler); - channel.pipeline().addLast(new JsonObjectDecoder()); - channel.pipeline().addLast(new DeserializeJsonInboundHandler(resultType)); - channel.pipeline().addLast(awaitObject); - - sendRequestAndHandleResponse(requestProvider, channel, responseHandler); + channel.pipeline().addLast(streamHandler); - return awaitObject.await(); + sendRequestAndHandleResponse(requestProvider, channel); + return streamHandler.getInputStream(); } public void post(final Object entity, final InputStream stdin, ResultCallback resultCallback) { @@ -165,9 +198,9 @@ public void post(final Object entity, final InputStream stdin, ResultCallback T post(final Object entity, TypeReference typeReference) { + + ResponseCallback callback = new ResponseCallback(); + + post(entity, typeReference, callback); + + return callback.awaitResult(); + } + + public void post(final Object entity, TypeReference typeReference, final ResultCallback resultCallback) { + + HttpRequestProvider requestProvider = httpPostRequestProvider(entity); + + Channel channel = getChannel(); + + resultCallbackOnStart(channel, resultCallback); + + JsonResponseCallbackHandler jsonResponseHandler = new JsonResponseCallbackHandler(typeReference, + resultCallback); + + HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); + + channel.pipeline().addLast(responseHandler); + channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(jsonResponseHandler); + + sendRequestAndHandleResponse(requestProvider, channel); + + return; + } + + private void resultCallbackOnStart(final Channel channel, final ResultCallback resultCallback) { + Closeable closeable = new Closeable() { + @Override + public void close() throws IOException { try { - return reader.read(); - } catch (IOException e) { - throw new RuntimeException(e); + System.err.println("closing channel"); + channel.close().sync(); + } catch (InterruptedException e) { + resultCallback.onError(e); } } - }).start(); + }; + resultCallback.onStart(closeable); } - private void handleResponse(final Channel channel, HttpResponseHandler responseHandler, - HttpRequestProvider requestProvider) { - HttpResponse response = responseHandler.awaitResponse(); - - switch (response.status().code()) { - case 101: - case 200: - case 201: - case 204: - break; - case 301: - case 302: - if (response.headers().contains(HttpHeaderNames.LOCATION)) { - String location = response.headers().get(HttpHeaderNames.LOCATION); - System.out.println("redirected to :" + location); - HttpRequest redirected = requestProvider.getHttpRequest(location); - - channel.writeAndFlush(redirected); - } - break; - case 304: - throw new NotModifiedException(responseHandler.awaitErrorBody()); - case 400: - throw new BadRequestException(responseHandler.awaitErrorBody()); - case 401: - throw new UnauthorizedException(responseHandler.awaitErrorBody()); - case 404: - throw new NotFoundException(responseHandler.awaitErrorBody()); - case 406: - throw new NotAcceptableException(responseHandler.awaitErrorBody()); - case 409: - throw new ConflictException(responseHandler.awaitErrorBody()); - case 500: - throw new InternalServerErrorException(responseHandler.awaitErrorBody()); - default: - throw new DockerException(responseHandler.awaitErrorBody(), response.status().code()); - } + private HttpRequest prepareDeleteRequest(String uri) { + + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.DELETE, uri); + + setDefaultHeaders(request); + + return request; + } + + private FullHttpRequest prepareGetRequest(String uri) { + + FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri); + + setDefaultHeaders(request); + return request; } private HttpRequest preparePostRequest(String uri, Object entity) { @@ -276,65 +333,28 @@ private HttpRequest preparePostRequest(String uri, Object entity) { return request; } - private HttpRequest prepareDeleteRequest(String uri) { - - FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.DELETE, uri); - - setDefaultHeaders(request); + private void sendRequestAndHandleResponse(HttpRequestProvider requestProvider, Channel channel) { - return request; - } + ChannelFuture channelFuture = channel.writeAndFlush(requestProvider.getHttpRequest(resource)); - public InputStream post(final Object entity) { - - HttpRequestProvider requestProvider = httpPostRequestProvider(entity); - - Channel channel = channelProvider.getChannel(); - - HttpResponseHandler responseHandler = new HttpResponseHandler(); - HttpResponseStreamInboundHandler streamHandler = new HttpResponseStreamInboundHandler(); - - channel.pipeline().addLast(responseHandler); - channel.pipeline().addLast(streamHandler); - - sendRequestAndHandleResponse(requestProvider, channel, responseHandler); - - return streamHandler.getInputStream(); - } - - private HttpRequestProvider httpPostRequestProvider(final Object entity) { - return new HttpRequestProvider() { + channelFuture.addListener(new ChannelFutureListener() { @Override - public HttpRequest getHttpRequest(String uri) { - return preparePostRequest(uri, entity); - } - }; - } - - public void delete() { - - HttpRequestProvider requestProvider = httpDeleteRequestProvider(); - - HttpResponseHandler responseHandler = new HttpResponseHandler(); - - Channel channel = channelProvider.getChannel(); - - channel.pipeline().addLast(responseHandler); - - sendRequestAndHandleResponse(requestProvider, channel, responseHandler); - } + public void operationComplete(ChannelFuture future) throws Exception { + if (future.isSuccess()) { + System.err.println("Request success"); + } - private HttpRequestProvider httpDeleteRequestProvider() { - return new HttpRequestProvider() { - @Override - public HttpRequest getHttpRequest(String uri) { - return prepareDeleteRequest(uri); } - }; + }); } - public T get(TypeReference typeReference) { - Class clazz = (Class) typeReference.getType().getClass(); - return null; - } + private void setDefaultHeaders(HttpRequest request) { + request.headers().set(HttpHeaderNames.HOST, ""); + request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); + request.headers().set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP); + + for (Map.Entry entry : headers.entrySet()) { + request.headers().set((CharSequence) entry.getKey(), entry.getValue()); + } + }; } diff --git a/src/main/java/com/github/dockerjava/netty/WebTarget.java b/src/main/java/com/github/dockerjava/netty/WebTarget.java index 7c8970d33..d4af90786 100644 --- a/src/main/java/com/github/dockerjava/netty/WebTarget.java +++ b/src/main/java/com/github/dockerjava/netty/WebTarget.java @@ -11,59 +11,59 @@ import io.netty.channel.Channel; public class WebTarget { - - private ChannelProvider channelProvider; - - private List path = new ArrayList(); - - private Map queryParams = new HashMap(); - - private static String PATH_SEPARATOR = "/"; - - public WebTarget(ChannelProvider channelProvider) { - this.channelProvider = channelProvider; - } - - public WebTarget path(String... components) { - - for(String component : components) { - - path.addAll(Arrays.asList(StringUtils.split(component, PATH_SEPARATOR))); - } - - return this; - } - - public InvocationBuilder request() { - String resource = PATH_SEPARATOR + StringUtils.join(path, PATH_SEPARATOR); - - List params = new ArrayList(); - for(Map.Entry entry : queryParams.entrySet()) { - params.add(entry.getKey() + "=" + entry.getValue()); - } - - if(!params.isEmpty()) { - resource = resource + "?" + StringUtils.join(params, "&"); - } - - return new InvocationBuilder(channelProvider, resource); - } - - public WebTarget resolveTemplate(String name, Object value) { - List newPath = new ArrayList(); - for(String component : path) { - component = component.replaceAll("\\{" + name + "\\}", value.toString()); - newPath.add(component); - } - path = newPath; - return this; - } - - public WebTarget queryParam(String name, Object value) { - queryParams.put(name, value.toString()); - return this; - } - + private ChannelProvider channelProvider; + + private List path = new ArrayList(); + + private Map queryParams = new HashMap(); + + private static String PATH_SEPARATOR = "/"; + + public WebTarget(ChannelProvider channelProvider) { + this.channelProvider = channelProvider; + } + + public WebTarget path(String... components) { + + for (String component : components) { + + path.addAll(Arrays.asList(StringUtils.split(component, PATH_SEPARATOR))); + } + + return this; + } + + public InvocationBuilder request() { + String resource = PATH_SEPARATOR + StringUtils.join(path, PATH_SEPARATOR); + + List params = new ArrayList(); + for (Map.Entry entry : queryParams.entrySet()) { + params.add(entry.getKey() + "=" + entry.getValue()); + } + + if (!params.isEmpty()) { + resource = resource + "?" + StringUtils.join(params, "&"); + } + + return new InvocationBuilder(channelProvider, resource); + } + + public WebTarget resolveTemplate(String name, Object value) { + List newPath = new ArrayList(); + for (String component : path) { + component = component.replaceAll("\\{" + name + "\\}", value.toString()); + newPath.add(component); + } + path = newPath; + return this; + } + + public WebTarget queryParam(String name, Object value) { + if (value != null) { + queryParams.put(name, value.toString()); + } + return this; + } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/AuthCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/AuthCmdExec.java index ed6c9cb7a..b6f004940 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/AuthCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/AuthCmdExec.java @@ -3,6 +3,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.core.type.TypeReference; import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.model.AuthResponse; import com.github.dockerjava.core.DockerClientConfig; @@ -22,13 +23,8 @@ protected AuthResponse execute(AuthCmd command) { WebTarget webResource = getBaseResource().path("/auth"); LOGGER.trace("POST: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON) - .post(command.getAuthConfig(), AuthResponse.class); - -// if (response.getStatus() == 401) { -// throw new UnauthorizedException("Unauthorized"); -// } -// -// return response.readEntity(AuthResponse.class); + .post(command.getAuthConfig(), new TypeReference() { + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java index bf858349b..3a5e75d60 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java @@ -1,5 +1,6 @@ package com.github.dockerjava.netty.exec; +import com.fasterxml.jackson.core.type.TypeReference; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.CreateContainerCmd.Exec; @@ -29,7 +30,8 @@ protected CreateContainerResponse execute(CreateContainerCmd command) { LOGGER.trace("POST: {} ", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON) - .post(command, CreateContainerResponse.class); + .post(command, new TypeReference() { + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ExecCreateCmdExec.java index 78f788f3f..17af370a9 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ExecCreateCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ExecCreateCmdExec.java @@ -1,5 +1,6 @@ package com.github.dockerjava.netty.exec; +import com.fasterxml.jackson.core.type.TypeReference; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.api.command.ExecCreateCmd.Exec; @@ -11,23 +12,24 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ExecCreateCmdExec extends AbstrSyncDockerCmdExec - implements ExecCreateCmd.Exec { - - private static final Logger LOGGER = LoggerFactory.getLogger(ExecCreateCmdExec.class); +public class ExecCreateCmdExec extends AbstrSyncDockerCmdExec implements + ExecCreateCmd.Exec { - public ExecCreateCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { - super(baseResource, dockerClientConfig); - } + private static final Logger LOGGER = LoggerFactory.getLogger(ExecCreateCmdExec.class); - @Override - protected ExecCreateCmdResponse execute(ExecCreateCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id", - command.getContainerId()); + public ExecCreateCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } - LOGGER.trace("POST: {}", webResource); + @Override + protected ExecCreateCmdResponse execute(ExecCreateCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id", + command.getContainerId()); - return webResource.request().accept(MediaType.APPLICATION_JSON) - .post(command, ExecCreateCmdResponse.class); - } + LOGGER.trace("POST: {}", webResource); + + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(command, new TypeReference() { + }); + } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java index 5a41073a4..1db090ae6 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java @@ -3,41 +3,37 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.core.type.TypeReference; import com.github.dockerjava.api.command.InfoCmd; import com.github.dockerjava.api.model.Info; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.netty.WebTarget; /** - * 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 + * 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 * * @author marcus * */ public class InfoCmdExec implements InfoCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(InfoCmdExec.class); - - private WebTarget webResource; - - private DockerClientConfig dockerClientConfig; - - public InfoCmdExec(WebTarget webResource, DockerClientConfig dockerClientConfig) { - this.webResource = webResource; - this.dockerClientConfig = dockerClientConfig; - } - - - @Override - public Info exec(InfoCmd command) { - return webResource.path("info").request().get(Info.class); - } + private static final Logger LOGGER = LoggerFactory.getLogger(InfoCmdExec.class); + private WebTarget webResource; + private DockerClientConfig dockerClientConfig; + public InfoCmdExec(WebTarget webResource, DockerClientConfig dockerClientConfig) { + this.webResource = webResource; + this.dockerClientConfig = dockerClientConfig; + } + @Override + public Info exec(InfoCmd command) { + return webResource.path("info").request().get(new TypeReference() { + }).awaitResult(); + } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java index 6490ddd7f..85b391a20 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java @@ -1,5 +1,8 @@ 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.InspectContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; @@ -7,9 +10,6 @@ import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class InspectContainerCmdExec extends AbstrSyncDockerCmdExec implements InspectContainerCmd.Exec { @@ -25,7 +25,9 @@ protected InspectContainerResponse execute(InspectContainerCmd command) { command.getContainerId()); LOGGER.debug("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectContainerResponse.class); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .get(new TypeReference() { + }).awaitResult(); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java index 470df9c2c..aac395d32 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java @@ -1,14 +1,15 @@ 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.InspectExecCmd; import com.github.dockerjava.api.command.InspectExecResponse; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class InspectExecCmdExec extends AbstrSyncDockerCmdExec implements InspectExecCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(InspectExecCmdExec.class); @@ -20,7 +21,10 @@ public InspectExecCmdExec(WebTarget baseResource, DockerClientConfig dockerClien @Override protected InspectExecResponse execute(InspectExecCmd command) { WebTarget webResource = getBaseResource().path("/exec/{id}/json").resolveTemplate("id", command.getExecId()); + LOGGER.debug("GET: {}", webResource); - return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectExecResponse.class); + + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { + }).awaitResult(); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java index 0092b5ff9..b6f42414d 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java @@ -1,5 +1,8 @@ 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.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; @@ -7,9 +10,6 @@ import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class InspectImageCmdExec extends AbstrSyncDockerCmdExec implements InspectImageCmd.Exec { @@ -24,8 +24,9 @@ protected InspectImageResponse execute(InspectImageCmd command) { WebTarget webResource = getBaseResource().path("/images/{id}/json").resolveTemplate("id", command.getImageId()); LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { - }); + }).awaitResult(); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java index 0f35c84e3..fe08c507d 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java @@ -1,5 +1,12 @@ package com.github.dockerjava.netty.exec; +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +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.ListContainersCmd; import com.github.dockerjava.api.model.Container; @@ -7,15 +14,6 @@ import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -import javax.ws.rs.core.GenericType; - -import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; - public class ListContainersCmdExec extends AbstrSyncDockerCmdExec> implements ListContainersCmd.Exec { @@ -43,8 +41,11 @@ protected List execute(ListContainersCmd command) { } LOGGER.trace("GET: {}", webTarget); + List containers = webTarget.request().accept(MediaType.APPLICATION_JSON) - .get(new TypeReference>() {}); + .get(new TypeReference>() { + }).awaitResult(); + LOGGER.trace("Response: {}", containers); return containers; diff --git a/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java index ff4a2240e..46f8e5d21 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java @@ -25,9 +25,7 @@ protected Void execute(RemoveContainerCmd command) { webTarget = booleanQueryParam(webTarget, "force", command.hasForceEnabled()); LOGGER.trace("DELETE: {}", webTarget); - webTarget.request().accept(MediaType.APPLICATION_JSON).delete(); - - return null; + return webTarget.request().accept(MediaType.APPLICATION_JSON).delete().awaitResult(); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java index f4f0076f3..d6e5eb0f6 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java @@ -3,15 +3,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.core.type.TypeReference; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.model.WaitResponse; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.async.JsonStreamProcessor; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; - public class WaitContainerCmdExec extends AbstrAsyncDockerCmdExec implements WaitContainerCmd.Exec { @@ -28,7 +27,8 @@ protected Void execute0(WaitContainerCmd command, ResultCallback r LOGGER.trace("POST: {}", webTarget); - webTarget.request().accept(MediaType.APPLICATION_JSON).post(null, WaitResponse.class); + webTarget.request().accept(MediaType.APPLICATION_JSON).post(null, new TypeReference() { + }, resultCallback); return null; } diff --git a/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java deleted file mode 100644 index 543fc095b..000000000 --- a/src/main/java/com/github/dockerjava/netty/handler/AwaitObjectInboundHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.github.dockerjava.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import java.util.concurrent.CountDownLatch; - -public class AwaitObjectInboundHandler extends SimpleChannelInboundHandler { - - public AwaitObjectInboundHandler(Class clazz) { - super(clazz); - } - - private CountDownLatch countDownLatch = new CountDownLatch(1); - - private T object; - - @Override - protected void channelRead0(ChannelHandlerContext ctx, T msg) throws Exception { - object = msg; - countDownLatch.countDown(); - } - - public T await() { - try { - countDownLatch.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return object; - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - -} diff --git a/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java deleted file mode 100644 index 994169a36..000000000 --- a/src/main/java/com/github/dockerjava/netty/handler/DeserializeJsonInboundHandler.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.github.dockerjava.netty.handler; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -public class DeserializeJsonInboundHandler extends SimpleChannelInboundHandler{ - - private Class clazz; - - public DeserializeJsonInboundHandler(Class clazz) { - this.clazz = clazz; - } - - @Override - protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { - byte[] buffer = new byte[msg.readableBytes()]; - msg.readBytes(buffer); - - T object = null; - try { - object = new ObjectMapper().readValue(buffer, clazz); - } catch (Exception e) { - throw new RuntimeException(e); - } - - ctx.fireChannelRead(object); - } -} diff --git a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java index 7907a62b5..8a3a7f1d3 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java @@ -2,8 +2,10 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.util.concurrent.GenericFutureListener; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.Frame; @@ -47,8 +49,20 @@ protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Excep } while (frame != null); + +// ctx.channel().closeFuture().addListener(new GenericFutureListener() { +// +// @Override +// public void operationComplete(ChannelFuture future) throws Exception { +// System.err.println("channel closed"); +// resultCallback.onComplete(); +// } +// }); + } + + private int read(byte[] buf, int offset, int length) { length = Math.min(rawBuffer.readableBytes(), length); rawBuffer.readBytes(buf, offset, length); diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java index 0b1007869..548c13697 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java @@ -5,25 +5,39 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.HttpContent; +import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpObject; +import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; import io.netty.handler.codec.http.LastHttpContent; import java.nio.charset.Charset; import java.util.concurrent.CountDownLatch; +import com.github.dockerjava.api.BadRequestException; +import com.github.dockerjava.api.ConflictException; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.InternalServerErrorException; +import com.github.dockerjava.api.NotAcceptableException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.NotModifiedException; +import com.github.dockerjava.api.UnauthorizedException; +import com.github.dockerjava.api.async.ResultCallback; + public class HttpResponseHandler extends SimpleChannelInboundHandler { private HttpResponse response; private ByteBuf errorBody = Unpooled.buffer(); - private CountDownLatch responseLatch = new CountDownLatch(1); + private HttpRequestProvider requestProvider; - private CountDownLatch errorBodyLatch = new CountDownLatch(1); + private ResultCallback resultCallback; - public HttpResponseHandler() { + public HttpResponseHandler(HttpRequestProvider requestProvider, ResultCallback resultCallback) { super(false); + this.requestProvider = requestProvider; + this.resultCallback = resultCallback; } @Override @@ -31,8 +45,6 @@ protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Ex if (msg instanceof HttpResponse) { response = (HttpResponse) msg; - responseLatch.countDown(); - } else if (msg instanceof HttpContent) { HttpContent content = (HttpContent) msg; @@ -50,7 +62,47 @@ protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Ex } if (content instanceof LastHttpContent) { - errorBodyLatch.countDown(); + try { + + switch (response.status().code()) { + case 101: + case 200: + case 201: + case 204: + break; + case 301: + case 302: + if (response.headers().contains(HttpHeaderNames.LOCATION)) { + String location = response.headers().get(HttpHeaderNames.LOCATION); + System.out.println("redirected to :" + location); + HttpRequest redirected = requestProvider.getHttpRequest(location); + + ctx.channel().writeAndFlush(redirected); + } + break; + case 304: + throw new NotModifiedException(getBodyAsMessage(errorBody)); + case 400: + throw new BadRequestException(getBodyAsMessage(errorBody)); + case 401: + throw new UnauthorizedException(getBodyAsMessage(errorBody)); + case 404: + throw new NotFoundException(getBodyAsMessage(errorBody)); + case 406: + throw new NotAcceptableException(getBodyAsMessage(errorBody)); + case 409: + throw new ConflictException(getBodyAsMessage(errorBody)); + case 500: + throw new InternalServerErrorException(getBodyAsMessage(errorBody)); + default: + throw new DockerException(getBodyAsMessage(errorBody), response.status().code()); + } + } catch (Throwable e) { + resultCallback.onError(e); + } finally { + System.err.println("LastHttpContent"); + resultCallback.onComplete(); + } } } else { System.err.println("UNKNOWN"); @@ -62,22 +114,4 @@ private String getBodyAsMessage(ByteBuf body) { return body.readBytes(body.readableBytes()).toString(Charset.forName("UTF-8")); } - public HttpResponse awaitResponse() { - try { - responseLatch.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return response; - } - - public String awaitErrorBody() { - try { - errorBodyLatch.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return getBodyAsMessage(errorBody); - } - } diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java index 2f9974c16..f2a66c202 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java @@ -6,21 +6,16 @@ import java.io.IOException; import java.io.InputStream; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; public class HttpResponseStreamInboundHandler extends SimpleChannelInboundHandler { - private CountDownLatch latch = new CountDownLatch(1); - private HttpResponseInputStream stream = new HttpResponseInputStream(); @Override protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { - - latch.countDown(); stream.write(msg.copy()); } @@ -37,11 +32,6 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E } public InputStream getInputStream() { - try { - latch.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } return stream; } diff --git a/src/main/java/com/github/dockerjava/netty/handler/SerializeJsonOutboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java similarity index 87% rename from src/main/java/com/github/dockerjava/netty/handler/SerializeJsonOutboundHandler.java rename to src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java index 4505c02a9..d797ba188 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/SerializeJsonOutboundHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java @@ -6,7 +6,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; -public class SerializeJsonOutboundHandler extends MessageToByteEncoder{ +public class JsonRequestHandler extends MessageToByteEncoder{ private ObjectMapper mapper = new ObjectMapper(); diff --git a/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java b/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java new file mode 100644 index 000000000..e6b1ef3a8 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java @@ -0,0 +1,47 @@ +package com.github.dockerjava.netty.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.async.ResultCallback; + +public class JsonResponseCallbackHandler extends SimpleChannelInboundHandler { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + private TypeReference typeReference; + + private ResultCallback callback; + + public JsonResponseCallbackHandler(TypeReference typeReference, ResultCallback callback) { + this.typeReference = typeReference; + this.callback = callback; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + byte[] buffer = new byte[msg.readableBytes()]; + msg.readBytes(buffer); + + T object = null; + + try { + object = objectMapper.readValue(buffer, typeReference); + } catch (Exception e) { + callback.onError(e); + throw new RuntimeException(e); + } + + callback.onNext(object); + callback.close(); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + callback.onError(cause); + ctx.close(); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/handler/JsonResponseHandler.java b/src/main/java/com/github/dockerjava/netty/handler/JsonResponseHandler.java new file mode 100644 index 000000000..efbd74f1f --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/handler/JsonResponseHandler.java @@ -0,0 +1,62 @@ +package com.github.dockerjava.netty.handler; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +import java.util.concurrent.CountDownLatch; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JsonResponseHandler extends SimpleChannelInboundHandler { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + private TypeReference typeReference; + + private CountDownLatch countDownLatch = new CountDownLatch(1); + + private T object; + + public JsonResponseHandler(TypeReference typeReference) { + this.typeReference = typeReference; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + System.err.println("AwaitObjectInboundHandler: channelRead0: " + msg); + byte[] buffer = new byte[msg.readableBytes()]; + msg.readBytes(buffer); + + try { + object = objectMapper.readValue(buffer, typeReference); + } catch (Exception e) { + throw new RuntimeException(e); + } + + countDownLatch.countDown(); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + System.err.println("AwaitObjectInboundHandler: channelReadComplete"); + super.channelReadComplete(ctx); + } + + public T await() { + try { + countDownLatch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return object; + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + +} diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index ec4aa82be..81149c741 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -199,7 +199,8 @@ public static class LogContainerTestCallback extends LogContainerResultCallback @Override public void onNext(Frame frame) { log.append(new String(frame.getPayload())); - super.onNext(frame); + System.err.println("LogContainerTestCallback: " + log.toString()); + //super.onNext(frame); } @Override diff --git a/src/test/java/com/github/dockerjava/netty/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/netty/AbstractDockerClientTest.java index b9a914593..e178362a2 100644 --- a/src/test/java/com/github/dockerjava/netty/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/netty/AbstractDockerClientTest.java @@ -206,6 +206,14 @@ public void onNext(Frame frame) { public String toString() { return log.toString(); } + + @Override + public LogContainerResultCallback awaitCompletion() throws InterruptedException { + LogContainerResultCallback result = super.awaitCompletion(); + System.err.println("awaitCompletion returned"); + + return result; + } } protected String buildImage(File baseDir) throws Exception { 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 43400edfc..2660aff5a 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java @@ -230,13 +230,6 @@ public void createContainerWithName() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); assertThat(inspectContainerResponse.getName(), equalTo("/container")); - - try { - dockerClient.createContainerCmd("busybox").withName("container").withCmd("env").exec(); - fail("Expected ConflictException"); - } catch (ConflictException e) { - } - } @Test diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java new file mode 100644 index 000000000..dde8b3ab9 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java @@ -0,0 +1,81 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; +import java.security.SecureRandom; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.command.InspectExecResponse; +import com.github.dockerjava.core.command.ExecStartResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; +import com.github.dockerjava.test.serdes.JSONTestHelper; + +@Test(groups = "integration") +public class InspectContainerCmdExecTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(InspectContainerCmdExecTest.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 inspectContainer() throws DockerException { + + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") + .withName(containerName).exec(); + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(container.getId()).exec(); + assertEquals(containerInfo.getId(), container.getId()); + + } + + @Test + public void inspectNonExistingContainer() throws DockerException { + + try { + dockerClient.inspectContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java new file mode 100644 index 000000000..3f97aa69d --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java @@ -0,0 +1,171 @@ +package com.github.dockerjava.netty.exec; + +import static ch.lambdaj.Lambda.filter; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.startsWith; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; + +import org.hamcrest.Matcher; +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 com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.api.model.Filters; +import com.github.dockerjava.core.command.PullImageResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; +import com.google.common.collect.ImmutableMap; + +@Test(groups = "integration") +public class ListContainersCmdExecTest extends AbstractDockerClientTest { + + @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); + } + + public void testListContainers() throws Exception { + + String testImage = "busybox"; + +// // need to block until image is pulled completely +// dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); + + List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); + assertThat(containers, notNullValue()); + LOG.info("Container List: {}", containers); + + int size = containers.size(); + + CreateContainerResponse container1 = dockerClient.createContainerCmd(testImage).withCmd("echo").exec(); + + assertThat(container1.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container1.getId()).exec(); + + assertThat(inspectContainerResponse.getConfig().getImage(), is(equalTo(testImage))); + + dockerClient.startContainerCmd(container1.getId()).exec(); + + LOG.info("container id: " + container1.getId()); + + List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); + + for (Container container : containers2) { + LOG.info("listContainer: id=" + container.getId() + " image=" + container.getImage()); + } + + assertThat(size + 1, is(equalTo(containers2.size()))); + Matcher matcher = hasItem(hasField("id", startsWith(container1.getId()))); + assertThat(containers2, matcher); + + List filteredContainers = filter(hasField("id", startsWith(container1.getId())), containers2); + assertThat(filteredContainers.size(), is(equalTo(1))); + + for (Container container : filteredContainers) { + LOG.info("filteredContainer: " + container); + } + + Container container2 = filteredContainers.get(0); + assertThat(container2.getCommand(), not(isEmptyString())); + assertThat(container2.getImage(), startsWith(testImage)); + } + + @Test + public void testListContainersWithLabelsFilter() throws Exception { + + String testImage = "busybox"; + + // need to block until image is pulled completely + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitCompletion(); + + List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); + assertThat(containers, notNullValue()); + LOG.info("Container List: {}", containers); + + int size = containers.size(); + + CreateContainerResponse container1 = dockerClient.createContainerCmd(testImage).withCmd("echo").exec(); + + assertThat(container1.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container1.getId()).exec(); + + assertThat(inspectContainerResponse.getConfig().getImage(), is(equalTo(testImage))); + + dockerClient.startContainerCmd(container1.getId()).exec(); + + LOG.info("container id: " + container1.getId()); + + List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); + + for (Container container : containers2) { + LOG.info("listContainer: id=" + container.getId() + " image=" + container.getImage()); + } + + assertThat(size + 1, is(equalTo(containers2.size()))); + Matcher matcher = hasItem(hasField("id", startsWith(container1.getId()))); + assertThat(containers2, matcher); + + List filteredContainers = filter(hasField("id", startsWith(container1.getId())), containers2); + assertThat(filteredContainers.size(), is(equalTo(1))); + + for (Container container : filteredContainers) { + LOG.info("filteredContainer: " + container); + } + + Container container2 = filteredContainers.get(0); + assertThat(container2.getCommand(), not(isEmptyString())); + assertThat(container2.getImage(), startsWith(testImage)); + + Map labels = ImmutableMap.of("test", "docker-java"); + + // list with filter by label + dockerClient.createContainerCmd(testImage).withCmd("echo").withLabels(labels).exec(); + filteredContainers = dockerClient.listContainersCmd().withShowAll(true) + .withFilters(new Filters().withLabels(labels)).exec(); + assertThat(filteredContainers.size(), is(equalTo(1))); + Container container3 = filteredContainers.get(0); + assertThat(container3.getCommand(), not(isEmptyString())); + assertThat(container3.getImage(), startsWith(testImage)); + + filteredContainers = dockerClient.listContainersCmd().withShowAll(true) + .withFilters(new Filters().withLabels("test")).exec(); + assertThat(filteredContainers.size(), is(equalTo(1))); + container3 = filteredContainers.get(0); + assertThat(container3.getCommand(), not(isEmptyString())); + assertThat(container3.getImage(), startsWith(testImage)); + assertEquals(container3.getLabels(), labels); + } + +} 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 a9a48dc58..98c1043e1 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java @@ -17,8 +17,8 @@ import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.command.WaitContainerResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; @Test(groups = "integration") public class LogContainerCmdExecTest extends AbstractDockerClientTest { diff --git a/src/test/java/com/github/dockerjava/netty/exec/WaitContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/WaitContainerCmdExecTest.java index ba1dd518e..d28f45224 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/WaitContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/WaitContainerCmdExecTest.java @@ -96,6 +96,8 @@ public void testWaitContainerAbort() throws Exception { Thread.sleep(5000); + System.err.println("closing callback"); + callback.close(); dockerClient.killContainerCmd(container.getId()).exec(); From f85b59d3aefc4ae6f162fde075f118e03f245c52 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 24 Nov 2015 19:49:41 +0100 Subject: [PATCH 0065/1032] Renamed networStats to network --- .../java/com/github/dockerjava/api/model/Statistics.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 c4daf0573..ff08056c4 100644 --- a/src/main/java/com/github/dockerjava/api/model/Statistics.java +++ b/src/main/java/com/github/dockerjava/api/model/Statistics.java @@ -30,7 +30,7 @@ public class Statistics { */ @Deprecated @JsonProperty("network") - private Map networkStats; + private Map network; @JsonProperty("memory_stats") private Map memoryStats; @@ -53,8 +53,8 @@ public Map getNetworks() { * @deprecated as of Docker Remote API 1.21, replaced by {@link #getNetworks()} */ @Deprecated - public Map getNetworkStats() { - return networkStats; + public Map getNetwork() { + return network; } public Map getCpuStats() { From b0538819b13e70cbb1e60b1e2d2a352b10381bbb Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 24 Nov 2015 20:25:56 +0100 Subject: [PATCH 0066/1032] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50f95f871..9201a7683 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ Change Log + +2.1.3-SNAPSHOT +--- +* [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) + === v2.1.2 --- From fabfb01ea4a24d80fd7a5436abd74e96f2572893 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 24 Nov 2015 20:26:19 +0100 Subject: [PATCH 0067/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9201a7683..62b2e65bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ Change Log - +=== 2.1.3-SNAPSHOT --- * [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) From 609cf6e239032c98ceecbc71eaa8de9d6cc1bbfd Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 24 Nov 2015 20:31:18 +0100 Subject: [PATCH 0068/1032] Fix changelog --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35849bbbd..110dcb9fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ Change Log === -Latest SNAPSHOT (3.0.0-SNAPSHOT) + +3.0.0-SNAPSHOT --- Notes @@ -8,10 +9,15 @@ Notes All changes +* [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) * [#359] (https://github.com/docker-java/docker-java/pull/359) Fix performance issue of build command by adding bulk-read variant of InputStream.read() * [#357] (https://github.com/docker-java/docker-java/pull/357) Wait container command needs possibility to abort operation * [#313] (https://github.com/docker-java/docker-java/pull/313) Refactor primitive type fields to be of object type in JSON objects +2.1.3-SNAPSHOT +--- +* [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) + v2.1.2 --- * [#350] (https://github.com/docker-java/docker-java/pull/350) Remove ServiceLoader logic From 570fa096b681993dc99a987ed526d7c9b08dd2b7 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 24 Nov 2015 20:40:36 +0100 Subject: [PATCH 0069/1032] Fix potential NullpointerExceptions --- .../dockerjava/api/command/InspectContainerResponse.java | 4 ++-- .../dockerjava/client/AbstractDockerClientTest.java | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) 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 e37e28471..38e0b58f3 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -126,12 +126,12 @@ public String getResolvConfPath() { @JsonIgnore public VolumeBind[] getVolumes() { - return volumes.getBinds(); + return volumes == null ? null : volumes.getBinds(); } @JsonIgnore public VolumeRW[] getVolumesRW() { - return volumesRW.getVolumesRW(); + return volumesRW == null ? null : volumesRW.getVolumesRW(); } public String getHostnamePath() { diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 76409ebbc..2fd228b9f 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -178,12 +178,13 @@ public static Boolean available(int port) { */ public static void assertContainerHasVolumes(InspectContainerResponse inspectContainerResponse, Volume... expectedVolumes) { - VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); - LOG.info("Inspect .Volumes = [{}]", Joiner.on(", ").join(volumeBinds)); List volumes = new ArrayList(); - for (VolumeBind bind : volumeBinds) { - volumes.add(new Volume(bind.getContainerPath())); + VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); + if (volumeBinds != null) { + for (VolumeBind bind : volumeBinds) { + volumes.add(new Volume(bind.getContainerPath())); + } } assertThat(volumes, contains(expectedVolumes)); } From 0f654699e04985c2c129be1442798f6edbb600cc Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Fri, 27 Nov 2015 22:52:12 +0100 Subject: [PATCH 0070/1032] Fix formatting rules --- .../github/dockerjava/api/DockerClient.java | 25 +++++++++++++++++++ .../command/CopyArchiveFromContainerCmd.java | 2 +- .../command/CopyArchiveToContainerCmd.java | 4 --- .../command/CopyFileFromContainerCmdImpl.java | 2 +- .../dockerjava/core/util/FilePathUtil.java | 12 ++++++--- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 81bd1957e..9ee8e0aea 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -121,10 +121,35 @@ public interface DockerClient extends Closeable { public LogContainerCmd logContainerCmd(String containerId); + /** + * Copy resource from container to local machine. + * Since docker API version 1.20 and above. + * + * @param containerId id of the container + * @param resource path to container's resource + * @return created command + */ public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(String containerId, String resource); + /** + * Copy resource from container to local machine. + * Deprecated, since docker API version 1.20 and above use copyArchiveFromContainerCmd instead. + * + * @param containerId id of the container + * @param resource path to container's resource + * @return created command + */ + @Deprecated public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource); + /** + * Copy archive from local machine to remote container + * Since docker API version 1.20 and above. + * + * @param containerId id of the container + * @param hostResource path to container's resource + * @return created command + */ public CopyArchiveToContainerCmd copyArchiveToContainerCmd(String containerId, String hostResource); public ContainerDiffCmd containerDiffCmd(String containerId); diff --git a/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java index 1bb8cf617..56b24d24d 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java @@ -35,4 +35,4 @@ public interface CopyArchiveFromContainerCmd extends SyncDockerCmd public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java index 6fbad5eff..c21f76fa6 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java @@ -16,7 +16,6 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd { * Set container's id * * @param containerId id of the container to copy file to - * @return this */ public CopyArchiveToContainerCmd withContainerId(String containerId); @@ -24,7 +23,6 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd { * Set path to the resource on the host machine * * @param resource path to the resource on the host machine - * @return this */ public CopyArchiveToContainerCmd withHostResource(String resource); @@ -32,7 +30,6 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd { * If set to true then it will be an error if unpacking the given content would cause an existing directory to be replaced with a non-directory and vice versa * * @param noOverwriteDirNonDir flag to know if non directory can be overwritten - * @return this */ public CopyArchiveToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir); @@ -43,7 +40,6 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd { * dirChildrenOnly = false will create /var/data/root/titi and /var/data/root/tata * * @param dirChildrenOnly if root directory is ignored - * @return this */ public CopyArchiveToContainerCmd withDirChildrenOnly(boolean dirChildrenOnly); diff --git a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java index 77a219170..93c7e807c 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImpl.java @@ -74,4 +74,4 @@ public CopyFileFromContainerCmdImpl withHostPath(String hostPath) { public InputStream exec() throws NotFoundException { return super.exec(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/core/util/FilePathUtil.java b/src/main/java/com/github/dockerjava/core/util/FilePathUtil.java index 402991559..d5e14ed0d 100644 --- a/src/main/java/com/github/dockerjava/core/util/FilePathUtil.java +++ b/src/main/java/com/github/dockerjava/core/util/FilePathUtil.java @@ -14,8 +14,10 @@ private FilePathUtil() { /** * Return the relative path. Path elements are separated with / char. * - * @param baseDir a parent directory of {@code file} - * @param file the file to get the relative path + * @param baseDir + * a parent directory of {@code file} + * @param file + * the file to get the relative path * @return the relative path */ public static String relativize(File baseDir, File file) { @@ -32,8 +34,10 @@ public static String relativize(File baseDir, File file) { /** * Return the relative path. Path elements are separated with / char. * - * @param baseDir a parent directory of {@code file} - * @param file the file to get the relative path + * @param baseDir + * a parent directory of {@code file} + * @param file + * the file to get the relative path * @return the relative path */ public static String relativize(Path baseDir, Path file) { From f0dc0c7b3241b726e2cf736f0c28f60abe4931c4 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 29 Nov 2015 13:53:04 +0100 Subject: [PATCH 0071/1032] Added missing exec implementations as well as appropriate tests --- .../dockerjava/api/command/ExecCreateCmd.java | 2 + .../dockerjava/api/command/ExecStartCmd.java | 6 +- .../core/async/ResultCallbackTemplate.java | 1 + .../core/command/ExecCreateCmdImpl.java | 3 + .../core/command/ExecStartCmdImpl.java | 19 + .../core/dockerfile/Dockerfile.java | 11 +- .../netty/DockerCmdExecFactoryImpl.java | 88 ++- .../dockerjava/netty/InvocationBuilder.java | 124 +++- .../github/dockerjava/netty/WebTarget.java | 2 - .../netty/exec/AbstrAsyncDockerCmdExec.java | 10 +- .../netty/exec/AttachContainerCmdExec.java | 39 ++ .../netty/exec/BuildImageCmdExec.java | 93 +++ .../dockerjava/netty/exec/CommitCmdExec.java | 36 ++ .../netty/exec/ContainerDiffCmdExec.java | 34 ++ .../netty/exec/CreateContainerCmdExec.java | 8 +- .../netty/exec/CreateImageCmdExec.java | 31 + .../dockerjava/netty/exec/EventsCmdExec.java | 41 ++ .../netty/exec/ExecStartCmdExec.java | 10 +- .../netty/exec/ListImagesCmdExec.java | 45 ++ .../netty/exec/PauseContainerCmdExec.java | 31 + .../dockerjava/netty/exec/PingCmdExec.java | 28 + .../netty/exec/PullImageCmdExec.java | 46 ++ .../netty/exec/PushImageCmdExec.java | 48 ++ .../netty/exec/RemoveImageCmdExec.java | 31 + .../netty/exec/RestartContainerCmdExec.java | 36 ++ .../netty/exec/SaveImageCmdExec.java | 28 + .../netty/exec/SearchImagesCmdExec.java | 33 ++ .../netty/exec/StartContainerCmdExec.java | 8 +- .../dockerjava/netty/exec/StatsCmdExec.java | 33 ++ .../netty/exec/TagImageCmdExec.java | 30 + .../netty/exec/TopContainerCmdExec.java | 36 ++ .../netty/exec/UnpauseContainerCmdExec.java | 31 + .../dockerjava/netty/exec/VersionCmdExec.java | 30 + .../netty/exec/WaitContainerCmdExec.java | 2 +- .../handler/FramedResponseStreamHandler.java | 163 +++--- .../handler/HttpConnectionHijackHandler.java | 67 +-- .../netty/handler/HttpResponseHandler.java | 7 - ...er.java => HttpResponseStreamHandler.java} | 18 +- .../netty/handler/JsonRequestHandler.java | 7 +- .../handler/JsonResponseCallbackHandler.java | 1 - .../exec/AttachContainerCmdExecTest.java | 122 ++++ .../netty/exec/BuildImageCmdExecTest.java | 296 ++++++++++ .../netty/exec/CommitCmdExecTest.java | 80 +++ .../netty/exec/ContainerDiffCmdExecTest.java | 80 +++ .../CopyFileFromContainerCmdExecTest.java | 73 +++ .../netty/exec/EventsCmdExecTest.java | 162 +++++ .../netty/exec/ExecStartCmdExecTest.java | 49 ++ .../exec/InspectContainerCmdExecTest.java | 6 - .../netty/exec/InspectExecCmdExecTest.java | 18 +- .../netty/exec/ListContainersCmdExecTest.java | 4 +- .../netty/exec/ListImagesCmdExecTest.java | 102 ++++ .../netty/exec/PingCmdExecTest.java | 43 ++ .../netty/exec/PullImageCmdExecTest.java | 119 ++++ .../netty/exec/PushImageCmdExecTest.java | 79 +++ .../exec/RemoveContainerCmdExecTest.java | 81 +++ .../netty/exec/RemoveImageCmdExecTest.java | 88 +++ .../exec/RestartContainerCmdExecTest.java | 84 +++ .../netty/exec/SaveImageCmdExecTest.java | 55 ++ .../netty/exec/SearchImagesCmdExecTest.java | 59 ++ .../netty/exec/StartContainerCmdExecTest.java | 553 ++++++++++++++++++ .../netty/exec/StatsCmdExecTest.java | 106 ++++ .../netty/exec/TagImageCmdExecTest.java | 63 ++ .../netty/exec/VersionCmdExecTest.java | 52 ++ 63 files changed, 3443 insertions(+), 248 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/netty/exec/AttachContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/PauseContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/PingCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/PullImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/PushImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/RemoveImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/RestartContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/SaveImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/SearchImagesCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/StatsCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/TagImageCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/UnpauseContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/VersionCmdExec.java rename src/main/java/com/github/dockerjava/netty/handler/{HttpResponseStreamInboundHandler.java => HttpResponseStreamHandler.java} (87%) create mode 100644 src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/CommitCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/PingCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/PullImageCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/RestartContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/SaveImageCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/SearchImagesCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/StatsCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/TagImageCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/VersionCmdExecTest.java 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 67ffe5818..3fb227ff8 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -1,5 +1,7 @@ package com.github.dockerjava.api.command; +import java.io.InputStream; + import javax.annotation.CheckForNull; import javax.annotation.Nonnull; diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java index 2129bf40c..b883dee0e 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -5,7 +5,6 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.Frame; @@ -20,12 +19,17 @@ public interface ExecStartCmd extends AsyncDockerCmd { @CheckForNull public Boolean hasTtyEnabled(); + @CheckForNull + public InputStream getStdin(); + public ExecStartCmd withDetach(Boolean detach); public ExecStartCmd withExecId(@Nonnull String execId); public ExecStartCmd withTty(Boolean tty); + public ExecStartCmd withStdIn(InputStream stdin); + /** * * @throws com.github.dockerjava.api.NotFoundException 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 44af625af..4db4edcea 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -63,6 +63,7 @@ public void onError(Throwable throwable) { @Override public void onComplete() { + System.err.println("callback onComplete"); try { close(); } catch (IOException e) { 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 5df38860c..3e68db1e4 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -2,6 +2,9 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.io.InputStream; + +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonInclude.Include; diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 0871fddfb..a70bac7d7 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -2,7 +2,11 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.io.InputStream; + +import com.fasterxml.jackson.annotation.JsonIgnore; import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecStartCmd; import com.github.dockerjava.api.model.Frame; @@ -12,6 +16,8 @@ public class ExecStartCmdImpl extends AbstrAsyncDockerCmd i private Boolean detach, tty; + private InputStream stdin; + public ExecStartCmdImpl(ExecStartCmd.Exec exec, String execId) { super(exec); withExecId(execId); @@ -39,6 +45,13 @@ public Boolean hasTtyEnabled() { return tty; } + @Override + @JsonIgnore + public InputStream getStdin() { + return stdin; + } + + @Override public ExecStartCmd withDetach(Boolean detach) { this.detach = detach; @@ -51,6 +64,12 @@ public ExecStartCmd withTty(Boolean tty) { return this; } + @Override + public ExecStartCmd withStdIn(InputStream stdin) { + this.stdin = stdin; + return this; + } + /** * @throws com.github.dockerjava.api.NotFoundException * No such exec instance 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 c9bd37d1e..032b81cb7 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -17,6 +17,7 @@ import org.apache.commons.io.filefilter.TrueFileFilter; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -133,10 +134,18 @@ public InputStream buildDockerFolderTar(File directory) { dockerFolderTar = CompressArchiveUtil.archiveTARFiles(directory, filesToAdd, archiveNameWithOutExtension); - final InputStream tarInputStream = FileUtils.openInputStream(dockerFolderTar); + long length = dockerFolderTar.length(); + + final FileInputStream tarInputStream = FileUtils.openInputStream(dockerFolderTar); final File tarFile = dockerFolderTar; return new InputStream() { + + @Override + public int available() throws IOException { + return tarInputStream.available(); + } + @Override public int read() throws IOException { return tarInputStream.read(); diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java index 37d2534c5..303f8ddfc 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -74,9 +74,15 @@ import com.github.dockerjava.core.command.ExecStartCmdImpl; import com.github.dockerjava.core.command.ExecStartResultCallback; import com.github.dockerjava.core.command.InfoCmdImpl; +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.ContainerDiffCmdExec; 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.EventsCmdExec; import com.github.dockerjava.netty.exec.ExecCreateCmdExec; import com.github.dockerjava.netty.exec.ExecStartCmdExec; import com.github.dockerjava.netty.exec.InfoCmdExec; @@ -85,16 +91,30 @@ import com.github.dockerjava.netty.exec.InspectImageCmdExec; 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.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.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.VersionCmdExec; import com.github.dockerjava.netty.exec.WaitContainerCmdExec; /** - * http://stackoverflow.com/questions/33296749/netty-connect-to-unix-domain- socket-failed + * 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/netty/netty/blob/master/example/src/main/java/io/netty/example/http/snoop/HttpSnoopClient.java * * @author marcus * @@ -271,56 +291,47 @@ public InfoCmd.Exec createInfoCmdExec() { @Override public PingCmd.Exec createPingCmdExec() { - return null; // new PingCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new PingCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public VersionCmd.Exec createVersionCmdExec() { - return null; // new VersionCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new VersionCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public PullImageCmd.Exec createPullImageCmdExec() { - return null; // new PullImageCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new PullImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public PushImageCmd.Exec createPushImageCmdExec() { - return null; // new PushImageCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new PushImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public SaveImageCmd.Exec createSaveImageCmdExec() { - return null; // new SaveImageCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new SaveImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public CreateImageCmd.Exec createCreateImageCmdExec() { - return null; // new CreateImageCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new CreateImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public SearchImagesCmd.Exec createSearchImagesCmdExec() { - return null; // new SearchImagesCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public RemoveImageCmd.Exec createRemoveImageCmdExec() { - return null; // new RemoveImageCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new RemoveImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public ListImagesCmd.Exec createListImagesCmdExec() { - return null; // new ListImagesCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new ListImagesCmdExec(getBaseResource(), getDockerClientConfig()); } @Override @@ -365,8 +376,7 @@ public WaitContainerCmd.Exec createWaitContainerCmdExec() { @Override public AttachContainerCmd.Exec createAttachContainerCmdExec() { - return null; // new AttachContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new AttachContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override @@ -396,8 +406,7 @@ public StopContainerCmd.Exec createStopContainerCmdExec() { @Override public ContainerDiffCmd.Exec createContainerDiffCmdExec() { - return null; // new ContainerDiffCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new ContainerDiffCmdExec(getBaseResource(), getDockerClientConfig()); } @Override @@ -407,63 +416,52 @@ public KillContainerCmd.Exec createKillContainerCmdExec() { @Override public RestartContainerCmd.Exec createRestartContainerCmdExec() { - return null; // new RestartContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new RestartContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public CommitCmd.Exec createCommitCmdExec() { - return null; // new CommitCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new CommitCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public BuildImageCmd.Exec createBuildImageCmdExec() { - return null; // new BuildImageCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new BuildImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public TopContainerCmd.Exec createTopContainerCmdExec() { - return null; // new TopContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new TopContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public TagImageCmd.Exec createTagImageCmdExec() { - return null; // new TagImageCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new TagImageCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public PauseContainerCmd.Exec createPauseContainerCmdExec() { - return null; // new PauseContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new PauseContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { - return null; // new UnpauseContainerCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new UnpauseContainerCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public EventsCmd.Exec createEventsCmdExec() { - return null; // new EventsCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new EventsCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public StatsCmd.Exec createStatsCmdExec() { - return null; // new StatsCmdExec(getBaseResource(), - // getDockerClientConfig()); + return new StatsCmdExec(getBaseResource(), getDockerClientConfig()); } @Override public void close() throws IOException { - // checkNotNull(client, "Factory not initialized. You probably forgot to - // call init()!"); - // client.close(); + checkNotNull(eventLoopGroup, "Factory not initialized. You probably forgot to call init()!"); eventLoopGroup.shutdownGracefully(); } diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index 943875270..e8c358267 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -5,6 +5,7 @@ import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.handler.codec.http.DefaultFullHttpRequest; +import io.netty.handler.codec.http.DefaultHttpRequest; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpClientCodec; import io.netty.handler.codec.http.HttpClientUpgradeHandler; @@ -13,8 +14,12 @@ import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpVersion; +import io.netty.handler.codec.http.LastHttpContent; import io.netty.handler.codec.json.JsonObjectDecoder; +import io.netty.handler.stream.ChunkedStream; +import io.netty.handler.stream.ChunkedWriteHandler; +import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; @@ -29,6 +34,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.core.async.ResultCallbackTemplate; @@ -36,7 +42,7 @@ import com.github.dockerjava.netty.handler.HttpConnectionHijackHandler; import com.github.dockerjava.netty.handler.HttpRequestProvider; import com.github.dockerjava.netty.handler.HttpResponseHandler; -import com.github.dockerjava.netty.handler.HttpResponseStreamInboundHandler; +import com.github.dockerjava.netty.handler.HttpResponseStreamHandler; import com.github.dockerjava.netty.handler.JsonResponseCallbackHandler; public class InvocationBuilder { @@ -72,7 +78,11 @@ public InvocationBuilder(ChannelProvider channelProvider, String resource) { } public InvocationBuilder accept(MediaType mediaType) { - headers.put(HttpHeaderNames.ACCEPT.toString(), mediaType.getMediaType()); + return header(HttpHeaderNames.ACCEPT.toString(), mediaType.getMediaType()); + } + + public InvocationBuilder header(String name, String value) { + headers.put(name, value); return this; } @@ -88,7 +98,7 @@ public ResponseCallback delete() { channel.pipeline().addLast(responseHandler); - sendRequestAndHandleResponse(requestProvider, channel); + sendRequest(requestProvider, channel); return callback; } @@ -106,7 +116,7 @@ public void get(ResultCallback resultCallback) { channel.pipeline().addLast(responseHandler); channel.pipeline().addLast(streamHandler); - sendRequestAndHandleResponse(requestProvider, channel); + sendRequest(requestProvider, channel); } public ResponseCallback get(TypeReference typeReference) { @@ -135,15 +145,13 @@ public void get(TypeReference typeReference, ResultCallback resultCall channel.pipeline().addLast(new JsonObjectDecoder()); channel.pipeline().addLast(jsonResponseHandler); - sendRequestAndHandleResponse(requestProvider, channel); + sendRequest(requestProvider, channel); return; } private Channel getChannel() { - Channel channel = channelProvider.getChannel(); - - return channel; + return channelProvider.getChannel(); } private HttpRequestProvider httpDeleteRequestProvider() { @@ -179,17 +187,17 @@ public InputStream post(final Object entity) { Channel channel = getChannel(); - ResponseCallback callback = new ResponseCallback(); + ResponseCallback callback = new ResponseCallback(); HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, callback); - HttpResponseStreamInboundHandler streamHandler = new HttpResponseStreamInboundHandler(); + HttpResponseStreamHandler streamHandler = new HttpResponseStreamHandler(callback); channel.pipeline().addLast(responseHandler); channel.pipeline().addLast(streamHandler); - sendRequestAndHandleResponse(requestProvider, channel); + sendRequest(requestProvider, channel); - return streamHandler.getInputStream(); + return callback.awaitResult(); } public void post(final Object entity, final InputStream stdin, ResultCallback resultCallback) { @@ -208,7 +216,7 @@ public void post(final Object entity, final InputStream stdin, ResultCallback void post(final Object entity, TypeReference typeReference, final channel.pipeline().addLast(new JsonObjectDecoder()); channel.pipeline().addLast(jsonResponseHandler); - sendRequestAndHandleResponse(requestProvider, channel); + sendRequest(requestProvider, channel); return; } @@ -311,11 +319,12 @@ private FullHttpRequest prepareGetRequest(String uri) { private HttpRequest preparePostRequest(String uri, Object entity) { - FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, uri); - - setDefaultHeaders(request); + HttpRequest request = null; if (entity != null) { + + FullHttpRequest fullRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, uri); + byte[] bytes; try { bytes = new ObjectMapper().writeValueAsBytes(entity); @@ -323,17 +332,22 @@ private HttpRequest preparePostRequest(String uri, Object entity) { throw new RuntimeException(e); } - request.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json"); - request.content().clear().writeBytes(Unpooled.copiedBuffer(bytes)); - request.headers().set(HttpHeaderNames.CONTENT_LENGTH, bytes.length); + fullRequest.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json"); + fullRequest.content().clear().writeBytes(Unpooled.copiedBuffer(bytes)); + fullRequest.headers().set(HttpHeaderNames.CONTENT_LENGTH, bytes.length); + + request = fullRequest; } else { + request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, uri); request.headers().set(HttpHeaderNames.CONTENT_LENGTH, 0); } + setDefaultHeaders(request); + return request; } - private void sendRequestAndHandleResponse(HttpRequestProvider requestProvider, Channel channel) { + private void sendRequest(HttpRequestProvider requestProvider, Channel channel) { ChannelFuture channelFuture = channel.writeAndFlush(requestProvider.getHttpRequest(resource)); @@ -356,5 +370,73 @@ private void setDefaultHeaders(HttpRequest request) { for (Map.Entry entry : headers.entrySet()) { request.headers().set((CharSequence) entry.getKey(), entry.getValue()); } + } + + public T post(TypeReference typeReference, InputStream body) { + + ResponseCallback callback = new ResponseCallback(); + + post(typeReference, callback, body); + + return callback.awaitResult(); + } + + + public void post(TypeReference typeReference, ResultCallback resultCallback, InputStream body) { + HttpRequestProvider requestProvider = httpPostRequestProvider(null); + + Channel channel = getChannel(); + + resultCallbackOnStart(channel, resultCallback); + + JsonResponseCallbackHandler jsonResponseHandler = new JsonResponseCallbackHandler(typeReference, + resultCallback); + + HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); + + channel.pipeline().addLast(new ChunkedWriteHandler()); + channel.pipeline().addLast(responseHandler); + channel.pipeline().addLast(new JsonObjectDecoder()); + channel.pipeline().addLast(jsonResponseHandler); + + HttpRequest request = requestProvider.getHttpRequest(resource); + + // don't accept FullHttpRequest here + if (request instanceof FullHttpRequest) { + throw new DockerClientException("fatal: request is instance of FullHttpRequest"); + } + + request.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED); + request.headers().remove(HttpHeaderNames.CONTENT_LENGTH); + + channel.write(request); + + channel.write(new ChunkedStream(new BufferedInputStream(body, 1024 * 1024), 1024 * 1024)); + channel.write(LastHttpContent.EMPTY_LAST_CONTENT); + channel.flush(); + + return; + + } + + public InputStream get() { + HttpRequestProvider requestProvider = httpGetRequestProvider(); + + Channel channel = getChannel(); + + ResponseCallback resultCallback = new ResponseCallback(); + + resultCallbackOnStart(channel, resultCallback); + + HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); + + HttpResponseStreamHandler streamHandler = new HttpResponseStreamHandler(resultCallback); + + channel.pipeline().addLast(responseHandler); + channel.pipeline().addLast(streamHandler); + + sendRequest(requestProvider, channel); + + return resultCallback.awaitResult(); }; } diff --git a/src/main/java/com/github/dockerjava/netty/WebTarget.java b/src/main/java/com/github/dockerjava/netty/WebTarget.java index d4af90786..4362ccab9 100644 --- a/src/main/java/com/github/dockerjava/netty/WebTarget.java +++ b/src/main/java/com/github/dockerjava/netty/WebTarget.java @@ -8,8 +8,6 @@ import org.apache.commons.lang.StringUtils; -import io.netty.channel.Channel; - public class WebTarget { private ChannelProvider channelProvider; diff --git a/src/main/java/com/github/dockerjava/netty/exec/AbstrAsyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/AbstrAsyncDockerCmdExec.java index cb2b523c4..3d1d4fac3 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/AbstrAsyncDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/AbstrAsyncDockerCmdExec.java @@ -1,15 +1,14 @@ package com.github.dockerjava.netty.exec; +import java.io.Closeable; +import java.io.IOException; + import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.AsyncDockerCmd; import com.github.dockerjava.api.command.DockerCmdAsyncExec; import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.netty.WebTarget; -import java.io.Closeable; -import java.io.IOException; - public abstract class AbstrAsyncDockerCmdExec, A_RES_T> extends AbstrDockerCmdExec implements DockerCmdAsyncExec { @@ -61,7 +60,4 @@ public void onComplete() { protected abstract Void execute0(final CMD_T command, final ResultCallback resultCallback); - - - } diff --git a/src/main/java/com/github/dockerjava/netty/exec/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/AttachContainerCmdExec.java new file mode 100644 index 000000000..76cec4272 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/AttachContainerCmdExec.java @@ -0,0 +1,39 @@ +package com.github.dockerjava.netty.exec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; + +public class AttachContainerCmdExec extends AbstrAsyncDockerCmdExec implements + AttachContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(AttachContainerCmdExec.class); + + public AttachContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute0(AttachContainerCmd command, ResultCallback resultCallback) { + + WebTarget webTarget = getBaseResource().path("/containers/{id}/attach").resolveTemplate("id", + command.getContainerId()); + + webTarget = booleanQueryParam(webTarget, "logs", command.hasLogsEnabled()); + webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); + // webTarget = booleanQueryParam(webTarget, "stdin", command.hasStdinEnabled()); + webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); + webTarget = booleanQueryParam(webTarget, "stream", command.hasFollowStreamEnabled()); + + LOGGER.trace("POST: {}", webTarget); + + webTarget.request().post(null, System.in, resultCallback); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java new file mode 100644 index 000000000..9c0e6c09f --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java @@ -0,0 +1,93 @@ +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.async.ResultCallback; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.InvocationBuilder; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements + BuildImageCmd.Exec { + private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); + + public BuildImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + private InvocationBuilder resourceWithOptionalAuthConfig(BuildImageCmd command, InvocationBuilder request) { + final AuthConfigurations authConfigs = firstNonNull(command.getBuildAuthConfigs(), getBuildAuthConfigs()); + if (authConfigs != null) { + request = request.header("X-Registry-Config", registryConfigs(authConfigs)); + } + return request; + } + + private static AuthConfigurations firstNonNull(final AuthConfigurations fromCommand, + final AuthConfigurations fromConfig) { + if (fromCommand != null) { + return fromCommand; + } + if (fromConfig != null) { + return fromConfig; + } + return null; + } + + @Override + protected Void execute0(BuildImageCmd command, ResultCallback resultCallback) { + + WebTarget webTarget = getBaseResource().path("/build"); + String dockerFilePath = command.getPathToDockerfile(); + + 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.getRemote() != null) { + webTarget = webTarget.queryParam("remote", command.getRemote().toString()); + } + + webTarget = booleanQueryParam(webTarget, "q", command.isQuiet()); + webTarget = booleanQueryParam(webTarget, "nocache", command.hasNoCacheEnabled()); + webTarget = booleanQueryParam(webTarget, "pull", command.hasPullEnabled()); + webTarget = booleanQueryParam(webTarget, "rm", command.hasRemoveEnabled()); + webTarget = booleanQueryParam(webTarget, "forcerm", command.isForcerm()); + + // this has to be handled differently as it should switch to 'false' + if (command.hasRemoveEnabled() == null || !command.hasRemoveEnabled()) { + webTarget = webTarget.queryParam("rm", "false"); + } + + if (command.getMemory() != null) { + webTarget = webTarget.queryParam("memory", command.getMemory()); + } + if (command.getMemswap() != null) { + webTarget = webTarget.queryParam("memswap", command.getMemswap()); + } + if (command.getCpushares() != null) { + webTarget = webTarget.queryParam("cpushares", command.getCpushares()); + } + if (command.getCpusetcpus() != null) { + webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus()); + } + + LOGGER.trace("POST: {}", webTarget); + + InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request()).accept( + MediaType.APPLICATION_JSON).header("Content-Type", "application/tar").header("encoding", "gzip"); + + builder.post(new TypeReference() { + }, resultCallback, command.getTarInputStream()); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java new file mode 100644 index 000000000..98c2dbd97 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CommitCmdExec extends AbstrSyncDockerCmdExec implements CommitCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CommitCmdExec.class); + + public CommitCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected String execute(CommitCmd command) { + WebTarget webTarget = getBaseResource().path("/commit").queryParam("container", command.getContainerId()) + .queryParam("repo", command.getRepository()).queryParam("tag", command.getTag()) + .queryParam("m", command.getMessage()).queryParam("author", command.getAuthor()); + + webTarget = booleanQueryParam(webTarget, "pause", command.hasPauseEnabled()); + + LOGGER.trace("POST: {}", webTarget); + ObjectNode objectNode = webTarget.request().accept(MediaType.APPLICATION_JSON). + post(command, new TypeReference() {}); + + return objectNode.get("Id").asText(); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExec.java new file mode 100644 index 000000000..a1d2d9601 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExec.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.model.ChangeLog; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class ContainerDiffCmdExec extends AbstrSyncDockerCmdExec> implements + ContainerDiffCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ContainerDiffCmdExec.class); + + public ContainerDiffCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected List execute(ContainerDiffCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/changes").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference>() { + }).awaitResult(); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java index 3a5e75d60..f7e4e39d9 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateContainerCmdExec.java @@ -1,16 +1,15 @@ 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.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.CreateContainerCmd.Exec; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class CreateContainerCmdExec extends AbstrSyncDockerCmdExec implements CreateContainerCmd.Exec { @@ -33,5 +32,4 @@ protected CreateContainerResponse execute(CreateContainerCmd command) { .post(command, new TypeReference() { }); } - } diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java new file mode 100644 index 000000000..2526bc2e1 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateImageResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CreateImageCmdExec extends AbstrSyncDockerCmdExec implements + CreateImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateImageCmdExec.class); + + public CreateImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateImageResponse execute(CreateImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/create").queryParam("repo", command.getRepository()) + .queryParam("tag", command.getTag()).queryParam("fromSrc", "-"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM) + .post(new TypeReference() {}, command.getImageStream()); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java new file mode 100644 index 000000000..ef95d2e0d --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +public class EventsCmdExec extends AbstrAsyncDockerCmdExec implements EventsCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); + + public EventsCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute0(EventsCmd command, ResultCallback resultCallback) { + + WebTarget webTarget = getBaseResource().path("/events").queryParam("since", command.getSince()) + .queryParam("until", command.getUntil()); + + if (command.getFilters() != null) { + webTarget = webTarget + .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + } + + LOGGER.trace("GET: {}", webTarget); + + webTarget.request().get(new TypeReference() { + }, resultCallback); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ExecStartCmdExec.java index 9d684ca7b..374b2062d 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ExecStartCmdExec.java @@ -12,17 +12,17 @@ public class ExecStartCmdExec extends AbstrAsyncDockerCmdExec implements ExecStartCmd.Exec { - private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); - public ExecStartCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { - super(baseResource, dockerClientConfig); - } + public ExecStartCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } @Override protected Void execute0(ExecStartCmd command, ResultCallback resultCallback) { WebTarget webTarget = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getExecId()); - webTarget.request().accept(MediaType.APPLICATION_JSON).post(command, System.in, resultCallback); + webTarget.request().accept(MediaType.APPLICATION_JSON).post(command, command.getStdin(), resultCallback); return null; } diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java new file mode 100644 index 000000000..1521f3e5c --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java @@ -0,0 +1,45 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.model.Image; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +public class ListImagesCmdExec extends AbstrSyncDockerCmdExec> implements ListImagesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListImagesCmdExec.class); + + public ListImagesCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected List execute(ListImagesCmd command) { + WebTarget webTarget = getBaseResource().path("/images/json"); + + webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); + + if (command.getFilters() != null) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + + LOGGER.trace("GET: {}", webTarget); + + List images = webTarget.request().accept(MediaType.APPLICATION_JSON) + .get(new TypeReference>() { + }).awaitResult(); + + LOGGER.trace("Response: {}", images); + + return images; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/PauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/PauseContainerCmdExec.java new file mode 100644 index 000000000..178eee99c --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/PauseContainerCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PauseContainerCmdExec extends AbstrSyncDockerCmdExec implements + PauseContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PauseContainerCmdExec.class); + + public PauseContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(PauseContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/pause").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/PingCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/PingCmdExec.java new file mode 100644 index 000000000..6e305caed --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/PingCmdExec.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PingCmdExec extends AbstrSyncDockerCmdExec implements PingCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PingCmdExec.class); + + public PingCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(PingCmd command) { + WebTarget webResource = getBaseResource().path("/_ping"); + + LOGGER.trace("GET: {}", webResource); + webResource.request().get(); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/PullImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/PullImageCmdExec.java new file mode 100644 index 000000000..7f15b4e62 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/PullImageCmdExec.java @@ -0,0 +1,46 @@ +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.async.ResultCallback; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.PullResponseItem; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.InvocationBuilder; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class PullImageCmdExec extends AbstrAsyncDockerCmdExec implements + PullImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PullImageCmdExec.class); + + public PullImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + private InvocationBuilder resourceWithOptionalAuthConfig(PullImageCmd command, InvocationBuilder request) { + AuthConfig authConfig = command.getAuthConfig(); + if (authConfig != null) { + request = request.header("X-Registry-Auth", registryAuth(authConfig)); + } + return request; + } + + @Override + protected Void execute0(PullImageCmd command, ResultCallback resultCallback) { + + WebTarget webResource = getBaseResource().path("/images/create").queryParam("tag", command.getTag()) + .queryParam("fromImage", command.getRepository()).queryParam("registry", command.getRegistry()); + + LOGGER.trace("POST: {}", webResource); + resourceWithOptionalAuthConfig(command, webResource.request()).accept(MediaType.APPLICATION_OCTET_STREAM).post( + null, new TypeReference() { + }, resultCallback); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/PushImageCmdExec.java new file mode 100644 index 000000000..d6dcdbd00 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/PushImageCmdExec.java @@ -0,0 +1,48 @@ +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.async.ResultCallback; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.PushResponseItem; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.InvocationBuilder; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class PushImageCmdExec extends AbstrAsyncDockerCmdExec implements + PushImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(PushImageCmdExec.class); + + public PushImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + private String name(PushImageCmd command) { + String name = command.getName(); + AuthConfig authConfig = command.getAuthConfig(); + return (name.contains("/") || authConfig == null) ? name : authConfig.getUsername(); + } + + @Override + protected Void execute0(PushImageCmd command, ResultCallback resultCallback) { + + WebTarget webResource = getBaseResource().path("/images/" + name(command) + "/push").queryParam("tag", + command.getTag()); + + final String registryAuth = registryAuth(command.getAuthConfig()); + LOGGER.trace("POST: {}", webResource); + + InvocationBuilder builder = webResource.request().header("X-Registry-Auth", registryAuth) + .accept(MediaType.APPLICATION_JSON); + + builder.post(null, new TypeReference() { + }, resultCallback); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RemoveImageCmdExec.java new file mode 100644 index 000000000..fa3a7ed57 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/RemoveImageCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RemoveImageCmdExec extends AbstrSyncDockerCmdExec implements RemoveImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveImageCmdExec.class); + + public RemoveImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveImageCmd command) { + WebTarget webTarget = getBaseResource().path("/images/" + command.getImageId()); + + webTarget = booleanQueryParam(webTarget, "force", command.hasForceEnabled()); + webTarget = booleanQueryParam(webTarget, "noprune", command.hasNoPruneEnabled()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().delete().awaitResult(); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RestartContainerCmdExec.java new file mode 100644 index 000000000..dc52f0eef --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/RestartContainerCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class RestartContainerCmdExec extends AbstrSyncDockerCmdExec implements + RestartContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RestartContainerCmdExec.class); + + public RestartContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RestartContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/restart").resolveTemplate("id", + command.getContainerId()); + + if (command.getTimeout() != null) { + webResource = webResource.queryParam("t", String.valueOf(command.getTimeout())); + } + + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/SaveImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/SaveImageCmdExec.java new file mode 100644 index 000000000..629f49871 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/SaveImageCmdExec.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.netty.exec; + +import java.io.InputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.SaveImageCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class SaveImageCmdExec extends AbstrSyncDockerCmdExec implements SaveImageCmd.Exec { + private static final Logger LOGGER = LoggerFactory.getLogger(SaveImageCmdExec.class); + + public SaveImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InputStream execute(SaveImageCmd command) { + WebTarget webResource = getBaseResource().path("/images/" + command.getName() + "/get").queryParam("tag", + command.getTag()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/SearchImagesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/SearchImagesCmdExec.java new file mode 100644 index 000000000..31db18fc3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/SearchImagesCmdExec.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.model.SearchItem; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class SearchImagesCmdExec extends AbstrSyncDockerCmdExec> implements + SearchImagesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(SearchImagesCmdExec.class); + + public SearchImagesCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected List execute(SearchImagesCmd command) { + WebTarget webResource = getBaseResource().path("/images/search").queryParam("term", command.getTerm()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference>() { + }).awaitResult(); + } + +} 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 cfa7d28ce..12f2d8cbc 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/StartContainerCmdExec.java @@ -1,15 +1,13 @@ package com.github.dockerjava.netty.exec; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.github.dockerjava.api.command.StartContainerCmd; -import com.github.dockerjava.api.command.StartContainerCmd.Exec; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - public class StartContainerCmdExec extends AbstrSyncDockerCmdExec implements StartContainerCmd.Exec { diff --git a/src/main/java/com/github/dockerjava/netty/exec/StatsCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/StatsCmdExec.java new file mode 100644 index 000000000..d167d5686 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/StatsCmdExec.java @@ -0,0 +1,33 @@ +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.async.ResultCallback; +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.model.Statistics; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; + +public class StatsCmdExec extends AbstrAsyncDockerCmdExec implements StatsCmd.Exec { + private static final Logger LOGGER = LoggerFactory.getLogger(StatsCmdExec.class); + + public StatsCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute0(StatsCmd command, ResultCallback resultCallback) { + + WebTarget webTarget = getBaseResource().path("/containers/{id}/stats").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("GET: {}", webTarget); + + webTarget.request().get(new TypeReference() { + }, resultCallback); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/TagImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/TagImageCmdExec.java new file mode 100644 index 000000000..ad7ed264e --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/TagImageCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TagImageCmdExec extends AbstrSyncDockerCmdExec implements TagImageCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(TagImageCmdExec.class); + + public TagImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(TagImageCmd command) { + WebTarget webTarget = getBaseResource().path("/images/" + command.getImageId() + "/tag") + .queryParam("repo", command.getRepository()).queryParam("tag", command.getTag()); + + webTarget = booleanQueryParam(webTarget, "force", command.hasForceEnabled()); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(null); + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java new file mode 100644 index 000000000..630179b48 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.TopContainerResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TopContainerCmdExec extends AbstrSyncDockerCmdExec implements + TopContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(TopContainerCmdExec.class); + + public TopContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected TopContainerResponse execute(TopContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/top").resolveTemplate("id", + command.getContainerId()); + + if (!StringUtils.isEmpty(command.getPsArgs())) + webResource = webResource.queryParam("ps_args", command.getPsArgs()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { + }).awaitResult(); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/UnpauseContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/UnpauseContainerCmdExec.java new file mode 100644 index 000000000..61fb9a880 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/UnpauseContainerCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UnpauseContainerCmdExec extends AbstrSyncDockerCmdExec implements + UnpauseContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(UnpauseContainerCmdExec.class); + + public UnpauseContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(UnpauseContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/unpause").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("POST: {}", webResource); + webResource.request().accept(MediaType.APPLICATION_JSON).post(null); + + return null; + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/VersionCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/VersionCmdExec.java new file mode 100644 index 000000000..9f62ea921 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/VersionCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.model.Version; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class VersionCmdExec extends AbstrSyncDockerCmdExec implements VersionCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(VersionCmdExec.class); + + public VersionCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Version execute(VersionCmd command) { + WebTarget webResource = getBaseResource().path("/version"); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { + }).awaitResult(); + } + +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java index d6e5eb0f6..5883b7188 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/WaitContainerCmdExec.java @@ -27,7 +27,7 @@ protected Void execute0(WaitContainerCmd command, ResultCallback r LOGGER.trace("POST: {}", webTarget); - webTarget.request().accept(MediaType.APPLICATION_JSON).post(null, new TypeReference() { + webTarget.request().accept(MediaType.APPLICATION_JSON).post((Object) null, new TypeReference() { }, resultCallback); return null; diff --git a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java index 8a3a7f1d3..5974f407f 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java @@ -2,10 +2,8 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.util.concurrent.GenericFutureListener; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.Frame; @@ -13,115 +11,124 @@ public class FramedResponseStreamHandler extends SimpleChannelInboundHandler { - private static final int HEADER_SIZE = 8; + private static final int HEADER_SIZE = 8; - private final ByteBuf rawBuffer = Unpooled.buffer(1000); + private final ByteBuf rawBuffer = Unpooled.buffer(1000); - private byte[] header = new byte[HEADER_SIZE]; + private byte[] header = new byte[HEADER_SIZE]; - private int headerCnt = 0; + private int headerCnt = 0; - private byte[] payload = new byte[0]; + private byte[] payload = new byte[0]; - private int payloadCnt = 0; + private int payloadCnt = 0; - private ResultCallback resultCallback; + private ResultCallback resultCallback; - public FramedResponseStreamHandler(ResultCallback resultCallback) { - this.resultCallback = resultCallback; - } + private StreamType streamType = null; - @Override - protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + public FramedResponseStreamHandler(ResultCallback resultCallback) { + this.resultCallback = resultCallback; + } - rawBuffer.writeBytes(msg.copy(), 0, msg.readableBytes()); + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { - Frame frame = null; + rawBuffer.writeBytes(msg.copy(), 0, msg.readableBytes()); - do { - frame = decode(); + Frame frame = null; - if (frame != null) { - resultCallback.onNext(frame); - headerCnt = 0; - payloadCnt = 0; - } + do { + frame = decode(); - } while (frame != null); + if (frame != null) { + resultCallback.onNext(frame); + } + } while (frame != null); + } -// ctx.channel().closeFuture().addListener(new GenericFutureListener() { -// -// @Override -// public void operationComplete(ChannelFuture future) throws Exception { -// System.err.println("channel closed"); -// resultCallback.onComplete(); -// } -// }); + private int read(byte[] buf, int offset, int length) { + length = Math.min(rawBuffer.readableBytes(), length); + rawBuffer.readBytes(buf, offset, length); + return length; + } - } + private Frame decode() { + if (headerCnt < HEADER_SIZE) { + int headerCount = read(header, headerCnt, HEADER_SIZE - headerCnt); + if (headerCount == 0) { + return null; + } + headerCnt += headerCount; - private int read(byte[] buf, int offset, int length) { - length = Math.min(rawBuffer.readableBytes(), length); - rawBuffer.readBytes(buf, offset, length); - return length; - } + if (headerCnt < HEADER_SIZE) + return null; - private Frame decode() { - if (headerCnt < HEADER_SIZE) { + streamType = streamType(header[0]); - int headerCount = read(header, headerCnt, HEADER_SIZE - headerCnt); + if (streamType.equals(StreamType.RAW)) { + return new Frame(streamType, header); + } + } - if (headerCount == 0) { - return null; - } - headerCnt += headerCount; + if (streamType.equals(StreamType.RAW)) { - if (headerCnt < HEADER_SIZE) - return null; - } + if (payloadCnt == 0) + payload = new byte[rawBuffer.readableBytes()]; - StreamType streamType = streamType(header[0]); + int count = read(payload, payloadCnt, rawBuffer.readableBytes()); - int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) - + (header[7] & 0xff); + if (count == 0) + return null; - if(payloadCnt == 0) - payload = new byte[payloadSize]; + payloadCnt = 0; - int count = read(payload, payloadCnt, payloadSize - payloadCnt); + return new Frame(StreamType.RAW, payload); + } else { - if (count == 0) - return null; + int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + + (header[7] & 0xff); - payloadCnt += count; + if (payloadCnt == 0) + payload = new byte[payloadSize]; - if (payloadCnt < payloadSize) - return null; + int count = read(payload, payloadCnt, payloadSize - payloadCnt); - return new Frame(streamType, payload); + if (count == 0) + return null; - } + payloadCnt += count; - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - resultCallback.onError(cause); - ctx.close(); - } + if (payloadCnt < payloadSize) + return null; - private static StreamType streamType(byte streamType) { - switch (streamType) { - case 0: - return StreamType.STDIN; - case 1: - return StreamType.STDOUT; - case 2: - return StreamType.STDERR; - default: - return StreamType.RAW; - } - } + headerCnt = 0; + payloadCnt = 0; + + return new Frame(streamType, payload); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + resultCallback.onError(cause); + ctx.close(); + } + + private static StreamType streamType(byte streamType) { + switch (streamType) { + case 0: + return StreamType.STDIN; + case 1: + return StreamType.STDOUT; + case 2: + return StreamType.STDERR; + default: + return StreamType.RAW; + } + } } diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java index 1a59118fb..0b0135d7e 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java @@ -1,57 +1,46 @@ package com.github.dockerjava.netty.handler; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.Map.Entry; -import java.util.concurrent.CountDownLatch; - -import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.FullHttpResponse; -import io.netty.handler.codec.http.HttpClientCodec; import io.netty.handler.codec.http.HttpClientUpgradeHandler; import io.netty.handler.codec.http.HttpRequest; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CountDownLatch; + public class HttpConnectionHijackHandler implements HttpClientUpgradeHandler.UpgradeCodec { - private CountDownLatch latch = new CountDownLatch(1); + private CountDownLatch latch = new CountDownLatch(1); - private HttpResponseHandler httpResponseHandler; + private HttpResponseHandler httpResponseHandler; - public HttpConnectionHijackHandler(HttpResponseHandler httpResponseHandler) { + public HttpConnectionHijackHandler(HttpResponseHandler httpResponseHandler) { this.httpResponseHandler = httpResponseHandler; } - @Override - public void upgradeTo(ChannelHandlerContext ctx, FullHttpResponse upgradeResponse) - throws Exception { - System.out.println("UPGRADED"); - httpResponseHandler.channelRead(ctx, upgradeResponse); - ctx.pipeline().addLast(httpResponseHandler); - latch.countDown(); - } - - @Override - public Collection setUpgradeHeaders(ChannelHandlerContext ctx, - HttpRequest upgradeRequest) { - return Collections.emptyList(); - } - - @Override - public CharSequence protocol() { - return "tcp"; - } - - public void await() { - try { - latch.await(); - System.out.println("upgrade awaited"); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } + @Override + public void upgradeTo(ChannelHandlerContext ctx, FullHttpResponse upgradeResponse) throws Exception { + httpResponseHandler.channelRead(ctx, upgradeResponse); + ctx.pipeline().addLast(httpResponseHandler); + latch.countDown(); + } + @Override + public Collection setUpgradeHeaders(ChannelHandlerContext ctx, HttpRequest upgradeRequest) { + return Collections.emptyList(); + } + @Override + public CharSequence protocol() { + return "tcp"; + } + public void await() { + try { + latch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } } diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java index 548c13697..851295269 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java @@ -12,7 +12,6 @@ import io.netty.handler.codec.http.LastHttpContent; import java.nio.charset.Charset; -import java.util.concurrent.CountDownLatch; import com.github.dockerjava.api.BadRequestException; import com.github.dockerjava.api.ConflictException; @@ -74,7 +73,6 @@ protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Ex case 302: if (response.headers().contains(HttpHeaderNames.LOCATION)) { String location = response.headers().get(HttpHeaderNames.LOCATION); - System.out.println("redirected to :" + location); HttpRequest redirected = requestProvider.getHttpRequest(location); ctx.channel().writeAndFlush(redirected); @@ -100,18 +98,13 @@ protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Ex } catch (Throwable e) { resultCallback.onError(e); } finally { - System.err.println("LastHttpContent"); resultCallback.onComplete(); } } - } else { - System.err.println("UNKNOWN"); } - } private String getBodyAsMessage(ByteBuf body) { return body.readBytes(body.readableBytes()).toString(Charset.forName("UTF-8")); } - } diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java similarity index 87% rename from src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java rename to src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java index f2a66c202..0cda2de81 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamInboundHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java @@ -10,10 +10,16 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -public class HttpResponseStreamInboundHandler extends SimpleChannelInboundHandler { +import com.github.dockerjava.api.async.ResultCallback; + +public class HttpResponseStreamHandler extends SimpleChannelInboundHandler { private HttpResponseInputStream stream = new HttpResponseInputStream(); + public HttpResponseStreamHandler(ResultCallback resultCallback) { + resultCallback.onNext(stream); + } + @Override protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { stream.write(msg.copy()); @@ -25,16 +31,6 @@ public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { super.channelReadComplete(ctx); } - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - - public InputStream getInputStream() { - return stream; - } - public static class HttpResponseInputStream extends InputStream { private AtomicBoolean closed = new AtomicBoolean(false); diff --git a/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java b/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java index d797ba188..4340e1a38 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java @@ -1,19 +1,18 @@ package com.github.dockerjava.netty.handler; -import com.fasterxml.jackson.databind.ObjectMapper; - import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; +import com.fasterxml.jackson.databind.ObjectMapper; + public class JsonRequestHandler extends MessageToByteEncoder{ - + private ObjectMapper mapper = new ObjectMapper(); @Override protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { byte[] serialized = mapper.writeValueAsBytes(msg); - System.out.println("serialized: " + new String(serialized)); out.writeBytes(serialized); } } diff --git a/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java b/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java index e6b1ef3a8..614508a81 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java @@ -36,7 +36,6 @@ protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Excep } callback.onNext(object); - callback.close(); } @Override diff --git a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java new file mode 100644 index 000000000..2dedf0255 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java @@ -0,0 +1,122 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; + +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 com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.StreamType; +import com.github.dockerjava.core.command.AttachContainerResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class AttachContainerCmdExecTest extends AbstractDockerClientTest { + + @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 attachContainerWithoutTTY() throws Exception { + + String snippet = "hello world"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("echo", snippet) + .withTty(false).exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + AttachContainerTestCallback callback = new AttachContainerTestCallback() { + @Override + public void onNext(Frame frame) { + assertEquals(frame.getStreamType(), StreamType.STDOUT); + super.onNext(frame); + }; + }; + + dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true) + .withLogs(true).exec(callback).awaitCompletion(10, TimeUnit.SECONDS).close(); + + assertThat(callback.toString(), containsString(snippet)); + } + + @Test + public void attachContainerWithTTY() throws Exception { + + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("attachContainerTestDockerfile").getFile()); + + String imageId = buildImage(baseDir); + + CreateContainerResponse container = dockerClient.createContainerCmd(imageId).withTty(true).exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + AttachContainerTestCallback callback = new AttachContainerTestCallback() { + @Override + public void onNext(Frame frame) { + assertEquals(frame.getStreamType(), StreamType.RAW); + super.onNext(frame); + }; + }; + + dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true) + .exec(callback).awaitCompletion(10, TimeUnit.SECONDS).close(); + + System.out.println("log: " + callback.toString()); + + // HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); + + assertThat(callback.toString(), containsString("stdout\r\nstderr")); + } + + public static class AttachContainerTestCallback extends AttachContainerResultCallback { + private StringBuffer log = new StringBuffer(); + + @Override + public void onNext(Frame item) { + log.append(new String(item.getPayload())); + super.onNext(item); + } + + @Override + public String toString() { + return log.toString(); + } + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java new file mode 100644 index 000000000..b60968d06 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -0,0 +1,296 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +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; +import java.io.FileInputStream; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.UUID; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.TrueFileFilter; +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 com.github.dockerjava.api.DockerClientException; +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.model.AuthConfig; +import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.core.CompressArchiveUtil; +import com.github.dockerjava.core.command.BuildImageResultCallback; +import com.github.dockerjava.core.command.PushImageResultCallback; +import com.github.dockerjava.core.command.WaitContainerResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class BuildImageCmdExecTest extends AbstractDockerClientTest { + + @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 testNginxDockerfileBuilder() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nginx").getFile()); + + String imageId = buildImage(baseDir); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + assertThat(inspectImageResponse, not(nullValue())); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + 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()); + Collection files = FileUtils.listFiles(baseDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); + File tarFile = CompressArchiveUtil.archiveTARFiles(baseDir, files, UUID.randomUUID().toString()); + String response = dockerfileBuild(new FileInputStream(tarFile)); + assertThat(response, containsString("Successfully executed testrun.sh")); + } + + @Test + public void testDockerBuilderAddUrl() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddUrl").getFile()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("Docker")); + } + + @Test + public void testDockerBuilderAddFileInSubfolder() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFileInSubfolder") + .getFile()); + 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()); + 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()); + 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)); + } + + private String dockerfileBuild(File baseDir) throws Exception { + + return execBuild(dockerClient.buildImageCmd(baseDir)); + } + + private String execBuild(BuildImageCmd buildImageCmd) throws Exception { + String imageId = buildImageCmd.withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId(); + + // Create container based on image + CreateContainerResponse container = dockerClient.createContainerCmd(imageId).exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); + + return containerLog(container.getId()); + } + + @Test(expectedExceptions = { DockerClientException.class }) + public void testDockerfileIgnored() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored") + .getFile()); + + 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()); + + 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()); + + 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()); + 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()); + String response = dockerfileBuild(baseDir); + assertThat(response, containsString("testENVSubstitution successfully completed")); + } + + @Test + public void testBuildFromPrivateRegistry() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("privateRegistry").getFile()); + + String imageId = buildImage(baseDir); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + assertThat(inspectImageResponse, not(nullValue())); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + dockerClient.tagImageCmd(imageId, "testregistry", "2").withForce().exec(); + + // see https://github.com/docker/distribution/blob/master/docs/deploying.md#native-basic-auth + CreateContainerResponse testregistry = dockerClient + .createContainerCmd("testregistry:2") + .withName("registry") + .withPortBindings(new PortBinding(new Ports.Binding(5000), ExposedPort.tcp(5000))) + .withEnv("REGISTRY_AUTH=htpasswd", "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm", + "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd", "REGISTRY_LOG_LEVEL=debug", + "REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt", "REGISTRY_HTTP_TLS_KEY=/certs/domain.key") + .exec(); + + dockerClient.startContainerCmd(testregistry.getId()).exec(); + + AuthConfig authConfig = new AuthConfig(); + + // credentials as configured in /auth/htpasswd + authConfig.setUsername("testuser"); + authConfig.setPassword("testpassword"); + authConfig.setEmail("foo@bar.de"); + authConfig.setServerAddress("localhost:5000"); + + dockerClient.authCmd().withAuthConfig(authConfig).exec(); + dockerClient.tagImageCmd("busybox:latest", "localhost:5000/testuser/busybox", "latest").withForce().exec(); + + dockerClient.pushImageCmd("localhost:5000/testuser/busybox").withTag("latest").withAuthConfig(authConfig) + .exec(new PushImageResultCallback()).awaitSuccess(); + + dockerClient.removeImageCmd("localhost:5000/testuser/busybox").withForce(true).exec(); + + baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildFromPrivateRegistry") + .getFile()); + + AuthConfigurations authConfigurations = new AuthConfigurations(); + authConfigurations.addConfig(authConfig); + + imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildAuthConfigs(authConfigurations) + .exec(new BuildImageResultCallback()).awaitImageId(); + + inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + assertThat(inspectImageResponse, not(nullValue())); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/CommitCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CommitCmdExecTest.java new file mode 100644 index 000000000..fbb5cd547 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CommitCmdExecTest.java @@ -0,0 +1,80 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.startsWith; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectImageResponse; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class CommitCmdExecTest extends AbstractDockerClientTest { + + @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 commit() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("touch", "/test").exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Commiting container: {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).exec(); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + assertThat(inspectImageResponse, hasField("container", startsWith(container.getId()))); + assertThat(inspectImageResponse.getContainerConfig().getImage(), equalTo("busybox")); + + InspectImageResponse busyboxImg = dockerClient.inspectImageCmd("busybox").exec(); + + assertThat(inspectImageResponse.getParent(), equalTo(busyboxImg.getId())); + } + + @Test + public void commitNonExistingContainer() throws DockerException { + try { + dockerClient.commitCmd("non-existent").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExecTest.java new file mode 100644 index 000000000..6d03064da --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/ContainerDiffCmdExecTest.java @@ -0,0 +1,80 @@ +package com.github.dockerjava.netty.exec; + +import static ch.lambdaj.Lambda.selectUnique; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +import java.lang.reflect.Method; +import java.util.List; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.ChangeLog; +import com.github.dockerjava.core.command.WaitContainerResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class ContainerDiffCmdExecTest extends AbstractDockerClientTest { + + @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(groups = "ignoreInCircleCi") + public void testContainerDiff() throws DockerException { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("touch", "/test").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()) + .awaitStatusCode(); + assertThat(exitCode, equalTo(0)); + + List filesystemDiff = dockerClient.containerDiffCmd(container.getId()).exec(); + LOG.info("Container DIFF: {}", filesystemDiff.toString()); + + assertThat(filesystemDiff.size(), equalTo(1)); + ChangeLog testChangeLog = selectUnique(filesystemDiff, hasField("path", equalTo("/test"))); + + assertThat(testChangeLog, hasField("path", equalTo("/test"))); + assertThat(testChangeLog, hasField("kind", equalTo(1))); + } + + @Test + public void testContainerDiffWithNonExistingContainer() throws DockerException { + try { + dockerClient.containerDiffCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java new file mode 100644 index 000000000..d0a705a3a --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CopyFileFromContainerCmdExecTest.java @@ -0,0 +1,73 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.not; + +import java.io.InputStream; +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class CopyFileFromContainerCmdExecTest extends AbstractDockerClientTest { + + @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 copyFromContainer() throws Exception { + // TODO extract this into a shared method + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withName("docker-java-itest-copyFromContainer").withCmd("touch", "/copyFromContainer").exec(); + + LOG.info("Created container: {}", container); + assertThat(container.getId(), not(isEmptyOrNullString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/copyFromContainer").exec(); + Boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied from the container."); + + // read the stream fully. Otherwise, the underlying stream will not be closed. + String responseAsString = asString(response); + assertNotNull(responseAsString); + assertTrue(responseAsString.length() > 0); + } + + @Test + public void copyFromNonExistingContainer() throws Exception { + try { + dockerClient.copyFileFromContainerCmd("non-existing", "/test").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException ignored) { + } + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java new file mode 100644 index 000000000..0122858a7 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java @@ -0,0 +1,162 @@ +package com.github.dockerjava.netty.exec; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +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 com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.EventFilters; +import com.github.dockerjava.core.command.EventsResultCallback; +import com.github.dockerjava.core.command.PullImageResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class EventsCmdExecTest extends AbstractDockerClientTest { + + private static int KNOWN_NUM_EVENTS = 4; + + private static String getEpochTime() { + return String.valueOf(System.currentTimeMillis() / 1000); + } + + @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); + } + + /* + * 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 + TimeUnit.SECONDS.sleep(1); + + String startTime = getEpochTime(); + 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); + + 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 { + // 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()); + } + + public void testEventStreamingWithFilter() throws Exception { + // Don't include other tests events + TimeUnit.SECONDS.sleep(1); + + CountDownLatch countDownLatch = new CountDownLatch(1); + EventsTestCallback eventCallback = dockerClient.eventsCmd().withFilters(new EventFilters().withEvent("start")) + .exec(new EventsTestCallback(countDownLatch)); + + generateEvents(); + + Boolean zeroCount = countDownLatch.await(10, TimeUnit.SECONDS); + + eventCallback.close(); + assertTrue(zeroCount, "Received only: " + eventCallback.getEvents()); + } + + /** + * This method generates {#link KNOWN_NUM_EVENTS} events + */ + private int generateEvents() throws Exception { + String testImage = "busybox"; + + 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; + } + + private class EventsTestCallback extends EventsResultCallback { + + private final CountDownLatch countDownLatch; + + private final List events = new ArrayList(); + + public EventsTestCallback(CountDownLatch countDownLatch) { + this.countDownLatch = countDownLatch; + } + + public void onNext(Event event) { + LOG.info("Received event #{}: {}", countDownLatch.getCount(), event); + countDownLatch.countDown(); + events.add(event); + } + + public List getEvents() { + return new ArrayList(events); + } + } +} 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 3702a7102..a05e91b99 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java @@ -4,9 +4,12 @@ import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.lang.reflect.Method; import java.security.SecureRandom; +import java.util.concurrent.TimeUnit; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; @@ -94,4 +97,50 @@ public void execStartAttached() throws Exception { assertNotNull(responseAsString); assertTrue(responseAsString.length() > 0); } + + @Test(groups = "ignoreInCircleCi") + public void execStartAttachStdin() 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(); + + InputStream stdin = new ByteArrayInputStream("echo STDIN\n".getBytes()); + + ByteArrayOutputStream stdout = new ByteArrayOutputStream(); + + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStdin(true).withCmd("/bin/sh").exec(); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true).withStdIn(stdin) + .exec(new ExecStartResultCallback(stdout, System.err)).awaitCompletion(5, TimeUnit.SECONDS); + + assertEquals(stdout.toString(), "STDIN\n"); + } + + @Test(groups = "ignoreInCircleCi") + public void execStartNotAttachedStdin() 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(); + + InputStream stdin = new ByteArrayInputStream("echo STDIN\n".getBytes()); + + ByteArrayOutputStream stdout = new ByteArrayOutputStream(); + + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStdin(false).withCmd("/bin/sh").exec(); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true).withStdIn(stdin) + .exec(new ExecStartResultCallback(stdout, System.err)).awaitCompletion(5, TimeUnit.SECONDS); + + assertEquals(stdout.toString(), ""); + } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java index dde8b3ab9..e9403caa1 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java @@ -1,8 +1,6 @@ package com.github.dockerjava.netty.exec; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; @@ -21,12 +19,8 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.command.InspectExecResponse; -import com.github.dockerjava.core.command.ExecStartResultCallback; import com.github.dockerjava.netty.AbstractDockerClientTest; -import com.github.dockerjava.test.serdes.JSONTestHelper; @Test(groups = "integration") public class InspectContainerCmdExecTest extends AbstractDockerClientTest { diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java index c2fbc84a0..5efadaa2a 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java @@ -59,7 +59,7 @@ public void inspectExecTest() throws IOException { dockerClient.startContainerCmd(container.getId()).exec(); ExecCreateCmdResponse touchFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").exec(); + .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").withTty(true).exec(); LOG.info("Created exec {}", touchFileCmdCreateResponse.toString()); assertThat(touchFileCmdCreateResponse.getId(), not(isEmptyString())); ExecCreateCmdResponse checkFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) @@ -68,22 +68,26 @@ public void inspectExecTest() throws IOException { assertThat(checkFileCmdCreateResponse.getId(), not(isEmptyString())); // Check that file does not exist - dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + dockerClient.execStartCmd(container.getId()).withDetach(false).withTty(true) + .withExecId(checkFileCmdCreateResponse.getId()) + .exec(new ExecStartResultCallback(System.out, System.err)); InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); + assertEquals(first.isRunning(), new Boolean(false)); assertThat(first.getExitCode(), is(1)); // Create the file - dockerClient.execStartCmd(container.getId()) - .withExecId(touchFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + dockerClient.execStartCmd(container.getId()).withDetach(false).withTty(true) + .withExecId(touchFileCmdCreateResponse.getId()) + .exec(new ExecStartResultCallback(System.out, System.err)); InspectExecResponse second = dockerClient.inspectExecCmd(touchFileCmdCreateResponse.getId()).exec(); + assertEquals(first.isRunning(), new Boolean(false)); assertThat(second.getExitCode(), is(0)); // Check that file does exist now - dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + dockerClient.execStartCmd(container.getId()).withExecId(checkFileCmdCreateResponse.getId()) + .exec(new ExecStartResultCallback(System.out, System.err)); InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); assertThat(third.getExitCode(), is(0)); diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java index 3f97aa69d..bf4cb7504 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java @@ -58,8 +58,8 @@ public void testListContainers() throws Exception { String testImage = "busybox"; -// // need to block until image is pulled completely -// dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); + // // need to block until image is pulled completely + // dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); assertThat(containers, notNullValue()); diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java new file mode 100644 index 000000000..24def3d4a --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java @@ -0,0 +1,102 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.emptyArray; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; + +import java.lang.reflect.Method; +import java.util.List; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Image; +import com.github.dockerjava.api.model.Info; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class ListImagesCmdExecTest extends AbstractDockerClientTest { + + @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 listImages() throws DockerException { + List images = dockerClient.listImagesCmd().withShowAll(true).exec(); + assertThat(images, notNullValue()); + LOG.info("Images List: {}", images); + Info info = dockerClient.infoCmd().exec(); + + assertThat(images.size(), equalTo(info.getImages())); + + Image img = images.get(0); + assertThat(img.getCreated(), is(greaterThan(0L))); + assertThat(img.getVirtualSize(), is(greaterThan(0L))); + assertThat(img.getId(), not(isEmptyString())); + assertThat(img.getRepoTags(), not(emptyArray())); + } + + @Test(groups = "ignoreInCircleCi") + public void listDanglingImages() throws DockerException { + String imageId = createDanglingImage(); + List images = dockerClient.listImagesCmd().withFilters("{\"dangling\":[\"true\"]}").withShowAll(true) + .exec(); + assertThat(images, notNullValue()); + LOG.info("Images List: {}", images); + assertThat(images.size(), is(greaterThan(0))); + Boolean imageInFilteredList = isImageInFilteredList(images, imageId); + assertTrue(imageInFilteredList); + } + + private boolean isImageInFilteredList(List images, String expectedImageId) { + for (Image image : images) { + if (expectedImageId.equals(image.getId())) { + return true; + } + } + return false; + } + + private String createDanglingImage() { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "5").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Committing container {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).exec(); + + dockerClient.stopContainerCmd(container.getId()).exec(); + dockerClient.killContainerCmd(container.getId()).exec(); + dockerClient.removeContainerCmd(container.getId()).exec(); + return imageId; + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/PingCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/PingCmdExecTest.java new file mode 100644 index 000000000..b98ff9bfd --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/PingCmdExecTest.java @@ -0,0 +1,43 @@ +package com.github.dockerjava.netty.exec; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class PingCmdExecTest extends AbstractDockerClientTest { + + @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 ping() throws DockerException { + dockerClient.pingCmd().exec(); + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/PullImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/PullImageCmdExecTest.java new file mode 100644 index 000000000..620519326 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/PullImageCmdExecTest.java @@ -0,0 +1,119 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.lessThanOrEqualTo; +import static org.hamcrest.Matchers.notNullValue; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.InspectImageResponse; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.model.Info; +import com.github.dockerjava.api.model.PullResponseItem; +import com.github.dockerjava.core.command.PullImageCmdImpl; +import com.github.dockerjava.core.command.PullImageResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class PullImageCmdExecTest extends AbstractDockerClientTest { + + private static final PullImageCmd.Exec NOP_EXEC = new PullImageCmd.Exec() { + public Void exec(PullImageCmd command, ResultCallback resultCallback) { + return null; + }; + }; + + @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 nullAuthConfig() throws Exception { + PullImageCmdImpl pullImageCmd = new PullImageCmdImpl(NOP_EXEC, null, ""); + try { + pullImageCmd.withAuthConfig(null); + fail(); + } catch (Exception e) { + assertEquals(e.getMessage(), "authConfig was not specified"); + } finally { + pullImageCmd.close(); + } + } + + @Test + public void testPullImage() throws Exception { + Info info = dockerClient.infoCmd().exec(); + LOG.info("Client info: {}", info.toString()); + + int imgCount = info.getImages(); + LOG.info("imgCount1: {}", imgCount); + + // This should be an image that is not used by other repositories + // already + // pulled down, preferably small in size. If tag is not used pull will + // download all images in that repository but tmpImgs will only + // deleted 'latest' image but not images with other tags + String testImage = "hackmann/empty"; + + LOG.info("Removing image: {}", testImage); + + try { + dockerClient.removeImageCmd(testImage).withForce(true).exec(); + } catch (NotFoundException e) { + // just ignore if not exist + } + + info = dockerClient.infoCmd().exec(); + LOG.info("Client info: {}", info.toString()); + + imgCount = info.getImages(); + LOG.info("imgCount2: {}", imgCount); + + LOG.info("Pulling image: {}", testImage); + + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); + + info = dockerClient.infoCmd().exec(); + LOG.info("Client info after pull, {}", info.toString()); + + assertThat(imgCount, lessThanOrEqualTo(info.getImages())); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(testImage).exec(); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + assertThat(inspectImageResponse, notNullValue()); + } + + @Test + public void testPullNonExistingImage() throws Exception { + + // does not throw an exception + // stream needs to be fully read in order to close the underlying connection + dockerClient.pullImageCmd("xvxcv/foo").exec(new PullImageResultCallback()).awaitCompletion(); + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java new file mode 100644 index 000000000..3c8bd4eb8 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/PushImageCmdExecTest.java @@ -0,0 +1,79 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.core.command.PullImageResultCallback; +import com.github.dockerjava.core.command.PushImageResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class PushImageCmdExecTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(PushImageCmdExecTest.class); + + String username; + + @BeforeTest + public void beforeTest() throws Exception { + super.beforeTest(); + username = dockerClient.authConfig().getUsername(); + } + + @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 pushLatest() throws Exception { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + LOG.info("Committing container: {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).withRepository(username + "/busybox").exec(); + + // we have to block until image is pushed + dockerClient.pushImageCmd(username + "/busybox").exec(new PushImageResultCallback()).awaitSuccess(); + + LOG.info("Removing image: {}", imageId); + dockerClient.removeImageCmd(imageId).exec(); + + dockerClient.pullImageCmd(username + "/busybox").exec(new PullImageResultCallback()).awaitSuccess(); + } + + @Test(expectedExceptions = DockerClientException.class) + public void pushNonExistentImage() throws Exception { + + dockerClient.pushImageCmd(username + "/xxx").exec(new PushImageResultCallback()).awaitSuccess(); + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExecTest.java new file mode 100644 index 000000000..58be803d6 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExecTest.java @@ -0,0 +1,81 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.startsWith; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +import java.lang.reflect.Method; +import java.util.List; + +import org.hamcrest.Matcher; +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.core.command.WaitContainerResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class RemoveContainerCmdExecTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(RemoveContainerCmdExecTest.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(groups = "ignoreInCircleCi") + public void removeContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true").exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); + + LOG.info("Removing container: {}", container.getId()); + dockerClient.removeContainerCmd(container.getId()).exec(); + + List containers2 = dockerClient.listContainersCmd().withShowAll(true).exec(); + + Matcher matcher = not(hasItem(hasField("id", startsWith(container.getId())))); + assertThat(containers2, matcher); + + } + + @Test + public void removeNonExistingContainer() throws DockerException { + try { + dockerClient.removeContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java new file mode 100644 index 000000000..e1e11c308 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java @@ -0,0 +1,88 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.startsWith; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +import java.lang.reflect.Method; +import java.util.List; + +import org.hamcrest.Matcher; +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class RemoveImageCmdExecTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(RemoveImageCmdExecTest.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(groups = "ignoreInCircleCi") + public void removeImage() throws DockerException, InterruptedException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + LOG.info("Committing container {}", container.toString()); + String imageId = dockerClient.commitCmd(container.getId()).exec(); + + dockerClient.stopContainerCmd(container.getId()).exec(); + dockerClient.killContainerCmd(container.getId()).exec(); + dockerClient.removeContainerCmd(container.getId()).exec(); + + LOG.info("Removing image: {}", imageId); + dockerClient.removeImageCmd(imageId).exec(); + + List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); + + Matcher matcher = not(hasItem(hasField("id", startsWith(imageId)))); + assertThat(containers, matcher); + } + + @Test + public void removeNonExistingImage() throws DockerException, InterruptedException { + try { + dockerClient.removeImageCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/RestartContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RestartContainerCmdExecTest.java new file mode 100644 index 000000000..6fd50e122 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/RestartContainerCmdExecTest.java @@ -0,0 +1,84 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class RestartContainerCmdExecTest extends AbstractDockerClientTest { + + @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 restartContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + String startTime = inspectContainerResponse.getState().getStartedAt(); + + dockerClient.restartContainerCmd(container.getId()).withtTimeout(2).exec(); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect After Restart: {}", inspectContainerResponse2.toString()); + + String startTime2 = inspectContainerResponse2.getState().getStartedAt(); + + assertThat(startTime, not(equalTo(startTime2))); + + assertThat(inspectContainerResponse.getState().isRunning(), is(equalTo(true))); + + dockerClient.killContainerCmd(container.getId()).exec(); + } + + @Test + public void restartNonExistingContainer() throws DockerException, InterruptedException { + try { + dockerClient.restartContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/SaveImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/SaveImageCmdExecTest.java new file mode 100644 index 000000000..399eb5341 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/SaveImageCmdExecTest.java @@ -0,0 +1,55 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; + +import java.io.InputStream; +import java.lang.reflect.Method; + +import org.apache.commons.io.IOUtils; +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 com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class SaveImageCmdExecTest extends AbstractDockerClientTest { + public static final Logger LOG = LoggerFactory.getLogger(SaveImageCmdExecTest.class); + + String username; + + @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 saveImage() throws Exception { + + InputStream image = IOUtils.toBufferedInputStream(dockerClient.saveImageCmd("busybox").exec()); + assertThat(image.available(), greaterThan(0)); + + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/SearchImagesCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/SearchImagesCmdExecTest.java new file mode 100644 index 000000000..1055d6782 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/SearchImagesCmdExecTest.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.netty.exec; + +import static ch.lambdaj.Lambda.filter; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.is; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +import java.lang.reflect.Method; +import java.util.List; + +import org.hamcrest.Matcher; +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.model.SearchItem; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class SearchImagesCmdExecTest extends AbstractDockerClientTest { + + @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 searchImages() throws DockerException { + List dockerSearch = dockerClient.searchImagesCmd("busybox").exec(); + LOG.info("Search returned {}", dockerSearch.toString()); + + Matcher matcher = hasItem(hasField("name", equalTo("busybox"))); + assertThat(dockerSearch, matcher); + + assertThat(filter(hasField("name", is("busybox")), dockerSearch).size(), equalTo(1)); + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java new file mode 100644 index 000000000..5beded265 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java @@ -0,0 +1,553 @@ +package com.github.dockerjava.netty.exec; + +import static com.github.dockerjava.api.model.AccessMode.ro; +import static com.github.dockerjava.api.model.Capability.MKNOD; +import static com.github.dockerjava.api.model.Capability.NET_ADMIN; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.startsWith; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.UUID; + +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 com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.InternalServerErrorException; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.model.AccessMode; +import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.Device; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.Link; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeRW; +import com.github.dockerjava.api.model.VolumesFrom; +import com.github.dockerjava.core.command.WaitContainerResultCallback; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class StartContainerCmdExecTest extends AbstractDockerClientTest { + + @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 startContainerWithVolumes() throws DockerException { + + // see http://docs.docker.io/use/working_with_volumes/ + Volume volume1 = new Volume("/opt/webapp1"); + + Volume volume2 = new Volume("/opt/webapp2"); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withVolumes(volume1, volume2) + .withCmd("true").withBinds(new Bind("/src/webapp1", volume1, ro), new Bind("/src/webapp2", volume2)) + .exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/opt/webapp1", "/opt/webapp2")); + + dockerClient.startContainerCmd(container.getId()).exec(); + + dockerClient.waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()).awaitStatusCode(); + + inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); + + assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), + contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(volume2))); + + } + + @Test + public void startContainerWithVolumesFrom() throws DockerException { + + Volume volume1 = new Volume("/opt/webapp1"); + Volume volume2 = new Volume("/opt/webapp2"); + + String container1Name = UUID.randomUUID().toString(); + + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName(container1Name) + .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + LOG.info("Created container1 {}", container1.toString()); + + dockerClient.startContainerCmd(container1.getId()).exec(); + LOG.info("Started container1 {}", container1.toString()); + + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) + .exec(); + + assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); + + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withVolumesFrom(new VolumesFrom(container1Name)).exec(); + LOG.info("Created container2 {}", container2.toString()); + + dockerClient.startContainerCmd(container2.getId()).exec(); + LOG.info("Started container2 {}", container2.toString()); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + + assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); + } + + @Test + public void startContainerWithDns() throws DockerException { + + String aDnsServer = "8.8.8.8"; + String anotherDnsServer = "8.8.4.4"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withDns(aDnsServer, anotherDnsServer).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), + contains(aDnsServer, anotherDnsServer)); + } + + @Test + public void startContainerWithDnsSearch() throws DockerException { + + String dnsSearch = "example.com"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withDnsSearch(dnsSearch).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + + inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDnsSearch()), contains(dnsSearch)); + } + + @Test + public void startContainerWithPortBindings() throws DockerException { + + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); + + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(11022)); + portBindings.bind(tcp23, Ports.Binding(11023)); + portBindings.bind(tcp23, Ports.Binding(11024)); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + + inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0], + is(equalTo(Ports.Binding(11022)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], + is(equalTo(Ports.Binding(11023)))); + + assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], + is(equalTo(Ports.Binding(11024)))); + + } + + @Test + public void startContainerWithRandomPortBindings() throws DockerException { + + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); + + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(null)); + portBindings.bind(tcp23, Ports.Binding(null)); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).withPublishAllPorts(true).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); + + assertThat(inspectContainerResponse.getNetworkSettings().getPorts().getBindings().get(tcp22)[0].getHostPort(), + is(not(equalTo(tcp22.getPort())))); + + assertThat(inspectContainerResponse.getNetworkSettings().getPorts().getBindings().get(tcp23)[0].getHostPort(), + is(not(equalTo(tcp23.getPort())))); + + } + + @Test + public void startContainerWithConflictingPortBindings() throws DockerException { + + ExposedPort tcp22 = ExposedPort.tcp(22); + ExposedPort tcp23 = ExposedPort.tcp(23); + + Ports portBindings = new Ports(); + portBindings.bind(tcp22, Ports.Binding(11022)); + portBindings.bind(tcp23, Ports.Binding(11022)); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + try { + dockerClient.startContainerCmd(container.getId()).exec(); + fail("expected InternalServerErrorException"); + } catch (InternalServerErrorException e) { + + } + + } + + @Test + public void startContainerWithLinkingDeprecated() throws DockerException { + + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); + + LOG.info("Created container1 {}", container1.toString()); + 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.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getId(), startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); + assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getState(), is(notNullValue())); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + + if (!inspectContainerResponse1.getState().isRunning()) { + assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); + } + + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container2").withLinks(new Link("container1", "container1Link")).exec(); + + LOG.info("Created container2 {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container2.getId()).exec(); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); + + assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); + assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getState(), is(notNullValue())); + assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); + + } + + @Test + public void startContainerWithLinking() throws DockerException { + + CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container1").exec(); + + LOG.info("Created container1 {}", container1.toString()); + 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.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse1.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getId(), startsWith(container1.getId())); + assertThat(inspectContainerResponse1.getName(), equalTo("/container1")); + assertThat(inspectContainerResponse1.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse1.getState(), is(notNullValue())); + assertThat(inspectContainerResponse1.getState().isRunning(), is(true)); + + if (!inspectContainerResponse1.getState().isRunning()) { + assertThat(inspectContainerResponse1.getState().getExitCode(), is(equalTo(0))); + } + + CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withName("container2").withLinks(new Link("container1", "container1Link")).exec(); + + LOG.info("Created container2 {}", container2.toString()); + assertThat(container2.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container2.getId()).exec(); + + InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) + .exec(); + LOG.info("Container2 Inspect: {}", inspectContainerResponse2.toString()); + + assertThat(inspectContainerResponse2.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", + "container1Link") })); + assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); + assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); + assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse2.getState(), is(notNullValue())); + assertThat(inspectContainerResponse2.getState().isRunning(), is(true)); + + } + + @Test + public void startContainer() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(new String[] { "top" }) + .exec(); + + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + LOG.info("Container Inspect: {}", inspectContainerResponse.toString()); + + assertThat(inspectContainerResponse.getConfig(), is(notNullValue())); + assertThat(inspectContainerResponse.getId(), not(isEmptyString())); + + assertThat(inspectContainerResponse.getId(), startsWith(container.getId())); + + assertThat(inspectContainerResponse.getImageId(), not(isEmptyString())); + assertThat(inspectContainerResponse.getState(), is(notNullValue())); + + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + + if (!inspectContainerResponse.getState().isRunning()) { + assertThat(inspectContainerResponse.getState().getExitCode(), is(equalTo(0))); + } + } + + @Test + public void testStartNonExistingContainer() throws DockerException { + try { + dockerClient.startContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + + /** + * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the + * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for + * this container 'container:': reuses another container network stack 'host': use the host network stack inside the + * container. Note: the host mode gives the container full access to local system services such as D-bus and is + * therefore considered insecure. + */ + @Test + public void startContainerWithNetworkMode() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") + .withNetworkMode("host").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + + inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getNetworkMode(), is(equalTo("host"))); + } + + @Test + public void startContainerWithCapAddAndCapDrop() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withCapAdd(NET_ADMIN).withCapDrop(MKNOD).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapAdd()), contains(NET_ADMIN)); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getCapDrop()), contains(MKNOD)); + } + + @Test + public void startContainerWithDevices() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withDevices(new Device("rwm", "/dev/nulo", "/dev/zero")).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDevices()), contains(new Device("rwm", + "/dev/nulo", "/dev/zero"))); + } + + @Test + public void startContainerWithExtraHosts() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withExtraHosts("dockerhost:127.0.0.1").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getExtraHosts()), + contains("dockerhost:127.0.0.1")); + } + + @Test + public void startContainerWithRestartPolicy() throws DockerException { + + RestartPolicy restartPolicy = RestartPolicy.onFailureRestart(5); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") + .withRestartPolicy(restartPolicy).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getState().isRunning(), is(true)); + + assertThat(inspectContainerResponse.getHostConfig().getRestartPolicy(), is(equalTo(restartPolicy))); + } + + @Test + public void existingHostConfigIsPreservedByBlankStartCmd() throws DockerException { + + String dnsServer = "8.8.8.8"; + + // prepare a container with custom DNS + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withDns(dnsServer) + .withCmd("true").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + // start container _without_any_customization_ (important!) + dockerClient.startContainerCmd(container.getId()).exec(); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + // The DNS setting survived. + assertThat(inspectContainerResponse.getHostConfig().getDns(), is(notNullValue())); + assertThat(Arrays.asList(inspectContainerResponse.getHostConfig().getDns()), contains(dnsServer)); + } + + @Test + public void anUnconfiguredCommandSerializesToEmptyJson() throws Exception { + ObjectMapper objectMapper = new ObjectMapper(); + StartContainerCmd command = dockerClient.startContainerCmd(""); + assertThat(objectMapper.writeValueAsString(command), is("{}")); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/StatsCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/StatsCmdExecTest.java new file mode 100644 index 000000000..9b3e0a377 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/StatsCmdExecTest.java @@ -0,0 +1,106 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.security.SecureRandom; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +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 com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.Statistics; +import com.github.dockerjava.core.async.ResultCallbackTemplate; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class StatsCmdExecTest extends AbstractDockerClientTest { + + private static int NUM_STATS = 5; + + @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(groups = "ignoreInCircleCi") + public void testStatsStreaming() throws InterruptedException, IOException { + TimeUnit.SECONDS.sleep(1); + + CountDownLatch countDownLatch = new CountDownLatch(NUM_STATS); + + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") + .withName(containerName).exec(); + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + StatsCallbackTest statsCallback = dockerClient.statsCmd().withContainerId(container.getId()) + .exec(new StatsCallbackTest(countDownLatch)); + + countDownLatch.await(3, TimeUnit.SECONDS); + Boolean gotStats = statsCallback.gotStats(); + + LOG.info("Stop stats collection"); + + statsCallback.close(); + + LOG.info("Stopping container"); + dockerClient.stopContainerCmd(container.getId()).exec(); + dockerClient.removeContainerCmd(container.getId()).exec(); + + LOG.info("Completed test"); + assertTrue(gotStats, "Expected true"); + + } + + private class StatsCallbackTest extends ResultCallbackTemplate { + private final CountDownLatch countDownLatch; + + private Boolean gotStats = false; + + public StatsCallbackTest(CountDownLatch countDownLatch) { + this.countDownLatch = countDownLatch; + } + + @Override + public void onNext(Statistics stats) { + LOG.info("Received stats #{}: {}", countDownLatch.getCount(), stats); + if (stats != null) { + gotStats = true; + } + countDownLatch.countDown(); + } + + public Boolean gotStats() { + return gotStats; + } + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/TagImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/TagImageCmdExecTest.java new file mode 100644 index 000000000..edfc1b657 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/TagImageCmdExecTest.java @@ -0,0 +1,63 @@ +package com.github.dockerjava.netty.exec; + +import java.lang.reflect.Method; + +import org.apache.commons.lang.math.RandomUtils; +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 com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class TagImageCmdExecTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(TagImageCmdExecTest.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 tagImage() throws Exception { + String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); + + dockerClient.tagImageCmd("busybox:latest", "docker-java/busybox", tag).exec(); + + dockerClient.removeImageCmd("docker-java/busybox:" + tag).exec(); + } + + @Test + 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) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/VersionCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/VersionCmdExecTest.java new file mode 100644 index 000000000..78ac5ee27 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/VersionCmdExecTest.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.netty.exec; + +import java.lang.reflect.Method; + +import org.apache.commons.lang.StringUtils; +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 com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.model.Version; +import com.github.dockerjava.netty.AbstractDockerClientTest; + +@Test(groups = "integration") +public class VersionCmdExecTest extends AbstractDockerClientTest { + + @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 version() throws DockerException { + Version version = dockerClient.versionCmd().exec(); + LOG.info(version.toString()); + + assertTrue(version.getGoVersion().length() > 0); + assertTrue(version.getVersion().length() > 0); + + assertEquals(StringUtils.split(version.getVersion(), ".").length, 3); + + } + +} From 83c0407b22b50618e09101cc0282b0fc0362c878 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 1 Dec 2015 21:09:40 +0100 Subject: [PATCH 0072/1032] Basic http proxy configuration support --- .../jaxrs/DockerCmdExecFactoryImpl.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index c331f461c..26c78a6d4 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -45,6 +45,7 @@ import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter; + import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; @@ -63,8 +64,13 @@ import javax.ws.rs.client.ClientRequestFilter; import javax.ws.rs.client.ClientResponseFilter; import javax.ws.rs.client.WebTarget; + import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.ProxySelector; import java.net.URI; +import java.util.List; import static com.google.common.base.Preconditions.checkNotNull; @@ -96,6 +102,7 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @Override public void init(DockerClientConfig dockerClientConfig) { checkNotNull(dockerClientConfig, "config was not specified"); + this.dockerClientConfig = dockerClientConfig; ClientConfig clientConfig = new ClientConfig(); clientConfig.connectorProvider(new ApacheConnectorProvider()); @@ -135,11 +142,14 @@ public void init(DockerClientConfig dockerClientConfig) { SSLContext sslContext = null; if (dockerClientConfig.getSslConfig() != null) { + configureProxy(clientConfig, "https"); try { sslContext = dockerClientConfig.getSslConfig().getSSLContext(); } catch (Exception ex) { throw new DockerClientException("Error in SSL Configuration", ex); } + } else { + configureProxy(clientConfig, "http"); } PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry( @@ -170,7 +180,30 @@ public void init(DockerClientConfig dockerClientConfig) { baseResource = client.target(dockerClientConfig.getUri()).path(dockerClientConfig.getVersion().asWebPathPart()); - this.dockerClientConfig = dockerClientConfig; + } + + private void configureProxy(ClientConfig clientConfig, String protocol) { + + List proxies = ProxySelector.getDefault().select(dockerClientConfig.getUri()); + + 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, protocol + "://" + 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, From 04de9fbe56192a647e35d17134d4cfc4b0e0c34f Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 1 Dec 2015 21:41:52 +0100 Subject: [PATCH 0073/1032] Make ProgressDetails attributes public --- .../dockerjava/api/model/ResponseItem.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) 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 ea16c0801..c9a77554a 100644 --- a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java @@ -100,13 +100,25 @@ public static class ProgressDetail implements Serializable { private static final long serialVersionUID = -1954994695645715264L; @JsonProperty("current") - long current; + public long current; @JsonProperty("total") - long total; + public long total; @JsonProperty("start") - long start; + public long start; + + public long getCurrent() { + return current; + } + + public long getTotal() { + return total; + } + + public long getStart() { + return start; + } @Override public String toString() { @@ -124,6 +136,14 @@ public static class ErrorDetail implements Serializable { @JsonProperty("message") String message; + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE).toString(); From fb565f12fa27d9b1ab144a25103ae269aa251761 Mon Sep 17 00:00:00 2001 From: Zach Marshall Date: Sat, 21 Nov 2015 13:10:30 -0500 Subject: [PATCH 0074/1032] Allow legacy registry message to indicate pull success If build node is pulling from older registry and build node reports legacy registry message, docker java will treat this as a failure. This update allows this message to be treated as a success condition. Add tests for PullItemResponse Add new tests for testing the error/success logic of PullItemResponse. Update test framework with minor refactoring. --- .../api/model/PullResponseItem.java | 9 ++- .../api/model/PullResponseItemTest.java | 63 +++++++++++++++++++ .../api/model/PullResponseJSONSamples.java | 37 +++++++++++ .../test/serdes/JSONTestHelper.java | 18 +++--- .../api/model/pullImageResponse_error.json | 1 + .../api/model/pullImageResponse_legacy.json | 1 + .../model/pullImageResponse_newerImage.json | 1 + .../api/model/pullImageResponse_upToDate.json | 1 + 8 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java create mode 100644 src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java create mode 100644 src/test/resources/com/github/dockerjava/api/model/pullImageResponse_error.json create mode 100644 src/test/resources/com/github/dockerjava/api/model/pullImageResponse_legacy.json create mode 100644 src/test/resources/com/github/dockerjava/api/model/pullImageResponse_newerImage.json create mode 100644 src/test/resources/com/github/dockerjava/api/model/pullImageResponse_upToDate.json diff --git a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java index 834060b99..28aa3b14c 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -10,6 +10,10 @@ public class PullResponseItem extends ResponseItem { private static final long serialVersionUID = -2575482839766823293L; + private static final String LEGACY_REGISTRY = "this image was pulled from a legacy registry"; + private static final String DOWNLOADED_NEWER_IMAGE = "Downloaded newer image"; + private static final String IMAGE_UP_TO_DATE = "Image is up to date"; + private static final String DOWNLOAD_COMPLETE = "Download complete"; /** * Returns whether the status indicates a successful pull operation @@ -22,8 +26,9 @@ public boolean isPullSuccessIndicated() { return false; } - return (getStatus().contains("Download complete") || getStatus().contains("Image is up to date") || getStatus() - .contains("Downloaded newer image")); + return (getStatus().contains(DOWNLOAD_COMPLETE) || getStatus().contains(IMAGE_UP_TO_DATE) + || getStatus().contains(DOWNLOADED_NEWER_IMAGE) + || getStatus().contains(LEGACY_REGISTRY)); } } diff --git a/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java b/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java new file mode 100644 index 000000000..c69130d1f --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java @@ -0,0 +1,63 @@ +/* + * Copyright 2015, Zach Marshall. + * + * Licensed 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 com.github.dockerjava.api.model; + +import static com.github.dockerjava.test.serdes.JSONTestHelper.testRoundTrip; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import java.io.IOException; + +import org.testng.annotations.Test; + +/** + * Tests logic of PullResponseItem's error/success handling by simulating a JSON response. + * + * @author Zach Marshall + */ +public class PullResponseItemTest { + @Test + public void pullNewerImage() throws IOException { + PullResponseItem response = + testRoundTrip(PullResponseJSONSamples.pullImageResponse_newerImage, PullResponseItem.class); + assertTrue(response.isPullSuccessIndicated()); + assertFalse(response.isErrorIndicated()); + } + + @Test + public void pullUpToDate() throws IOException { + PullResponseItem response = + testRoundTrip(PullResponseJSONSamples.pullImageResponse_upToDate, PullResponseItem.class); + assertTrue(response.isPullSuccessIndicated()); + assertFalse(response.isErrorIndicated()); + } + + @Test + public void pullLegacyRegistry() throws IOException { + PullResponseItem response = + testRoundTrip(PullResponseJSONSamples.pullImageResponse_legacy, PullResponseItem.class); + assertTrue(response.isPullSuccessIndicated()); + assertFalse(response.isErrorIndicated()); + } + + @Test + public void pullAndEncounterError() throws IOException { + PullResponseItem response = + testRoundTrip(PullResponseJSONSamples.pullImageResponse_error, PullResponseItem.class); + assertFalse(response.isPullSuccessIndicated()); + assertTrue(response.isErrorIndicated()); + } +} diff --git a/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java b/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java new file mode 100644 index 000000000..31cdf0f3b --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java @@ -0,0 +1,37 @@ +/* + * Copyright 2015 Zach Marshall. + * + * Licensed 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 com.github.dockerjava.api.model; + +import com.github.dockerjava.test.serdes.JSONResourceRef; + +/** + * Enumeration for the available pull response statuses. + * + * @author Zach Marshall + */ +public enum PullResponseJSONSamples implements JSONResourceRef { + pullImageResponse_legacy, pullImageResponse_error, pullImageResponse_newerImage, pullImageResponse_upToDate; + + @Override + public String getFileName() { + return this + ".json"; + } + + @Override + public Class getResourceClass() { + return PullResponseJSONSamples.class; + } +} diff --git a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java index 602a6e76f..32c373d09 100644 --- a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java +++ b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java @@ -25,13 +25,14 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.command.CommandJSONSamples; /** - * Provides helper methods for serialization-deserialization tests - * + * Provides helper methods for serialization-deserialization tests. + * + *

TODO: Create helper that loads json files from simple folder + * structure using a type, version number, and name.

+ * * @author Oleg Nenashev - * @since TODO */ public class JSONTestHelper { @@ -45,11 +46,12 @@ public class JSONTestHelper { * JSON Conversion error */ public static String readString(JSONResourceRef resource) throws IOException { - InputStream istream = CommandJSONSamples.class.getResourceAsStream(resource.getFileName()); - if (istream == null) { - throw new IOException("Cannot retrieve resource " + resource.getFileName()); + try (InputStream istream = resource.getResourceClass().getResourceAsStream(resource.getFileName())) { + if (istream == null) { + throw new IOException("Cannot retrieve resource " + resource.getFileName()); + } + return IOUtils.toString(istream, "UTF-8"); } - return IOUtils.toString(istream, "UTF-8"); } /** diff --git a/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_error.json b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_error.json new file mode 100644 index 000000000..f2ed0ddf2 --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_error.json @@ -0,0 +1 @@ +{"errorDetail":{"message":"Error: image cccxxx/xxxccc:latest not found"},"error":"Error: image cccxxx/xxxccc:latest not found"} diff --git a/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_legacy.json b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_legacy.json new file mode 100644 index 000000000..9c755cf5b --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_legacy.json @@ -0,0 +1 @@ +{"status":"docker.com/xxxxcv/ccccxx: this image was pulled from a legacy registry. Important: This registry version will not be supported in future versions of docker."} diff --git a/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_newerImage.json b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_newerImage.json new file mode 100644 index 000000000..e5046c8b1 --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_newerImage.json @@ -0,0 +1 @@ +{"status":"Downloaded newer image for docker.com/xxxxcv/ccccxx"} diff --git a/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_upToDate.json b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_upToDate.json new file mode 100644 index 000000000..e821ce688 --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_upToDate.json @@ -0,0 +1 @@ +{"status":"Image is up to date for docker.com/xxxxcv/ccccxx"} From c03f0c5ed2dc54248113f36a9a70843dd671ce30 Mon Sep 17 00:00:00 2001 From: Zach Marshall Date: Sat, 21 Nov 2015 13:10:30 -0500 Subject: [PATCH 0075/1032] Allow legacy registry message to indicate pull success If build node is pulling from older registry and build node reports legacy registry message, docker java will treat this as a failure. This update allows this message to be treated as a success condition. Add tests for PullItemResponse Add new tests for testing the error/success logic of PullItemResponse. Update test framework with minor refactoring. --- .../api/model/PullResponseItem.java | 9 ++- .../api/model/PullResponseItemTest.java | 63 +++++++++++++++++++ .../api/model/PullResponseJSONSamples.java | 37 +++++++++++ .../test/serdes/JSONTestHelper.java | 18 +++--- .../api/model/pullImageResponse_error.json | 1 + .../api/model/pullImageResponse_legacy.json | 1 + .../model/pullImageResponse_newerImage.json | 1 + .../api/model/pullImageResponse_upToDate.json | 1 + 8 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java create mode 100644 src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java create mode 100644 src/test/resources/com/github/dockerjava/api/model/pullImageResponse_error.json create mode 100644 src/test/resources/com/github/dockerjava/api/model/pullImageResponse_legacy.json create mode 100644 src/test/resources/com/github/dockerjava/api/model/pullImageResponse_newerImage.json create mode 100644 src/test/resources/com/github/dockerjava/api/model/pullImageResponse_upToDate.json diff --git a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java index 834060b99..28aa3b14c 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -10,6 +10,10 @@ public class PullResponseItem extends ResponseItem { private static final long serialVersionUID = -2575482839766823293L; + private static final String LEGACY_REGISTRY = "this image was pulled from a legacy registry"; + private static final String DOWNLOADED_NEWER_IMAGE = "Downloaded newer image"; + private static final String IMAGE_UP_TO_DATE = "Image is up to date"; + private static final String DOWNLOAD_COMPLETE = "Download complete"; /** * Returns whether the status indicates a successful pull operation @@ -22,8 +26,9 @@ public boolean isPullSuccessIndicated() { return false; } - return (getStatus().contains("Download complete") || getStatus().contains("Image is up to date") || getStatus() - .contains("Downloaded newer image")); + return (getStatus().contains(DOWNLOAD_COMPLETE) || getStatus().contains(IMAGE_UP_TO_DATE) + || getStatus().contains(DOWNLOADED_NEWER_IMAGE) + || getStatus().contains(LEGACY_REGISTRY)); } } diff --git a/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java b/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java new file mode 100644 index 000000000..c69130d1f --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java @@ -0,0 +1,63 @@ +/* + * Copyright 2015, Zach Marshall. + * + * Licensed 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 com.github.dockerjava.api.model; + +import static com.github.dockerjava.test.serdes.JSONTestHelper.testRoundTrip; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import java.io.IOException; + +import org.testng.annotations.Test; + +/** + * Tests logic of PullResponseItem's error/success handling by simulating a JSON response. + * + * @author Zach Marshall + */ +public class PullResponseItemTest { + @Test + public void pullNewerImage() throws IOException { + PullResponseItem response = + testRoundTrip(PullResponseJSONSamples.pullImageResponse_newerImage, PullResponseItem.class); + assertTrue(response.isPullSuccessIndicated()); + assertFalse(response.isErrorIndicated()); + } + + @Test + public void pullUpToDate() throws IOException { + PullResponseItem response = + testRoundTrip(PullResponseJSONSamples.pullImageResponse_upToDate, PullResponseItem.class); + assertTrue(response.isPullSuccessIndicated()); + assertFalse(response.isErrorIndicated()); + } + + @Test + public void pullLegacyRegistry() throws IOException { + PullResponseItem response = + testRoundTrip(PullResponseJSONSamples.pullImageResponse_legacy, PullResponseItem.class); + assertTrue(response.isPullSuccessIndicated()); + assertFalse(response.isErrorIndicated()); + } + + @Test + public void pullAndEncounterError() throws IOException { + PullResponseItem response = + testRoundTrip(PullResponseJSONSamples.pullImageResponse_error, PullResponseItem.class); + assertFalse(response.isPullSuccessIndicated()); + assertTrue(response.isErrorIndicated()); + } +} diff --git a/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java b/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java new file mode 100644 index 000000000..31cdf0f3b --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java @@ -0,0 +1,37 @@ +/* + * Copyright 2015 Zach Marshall. + * + * Licensed 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 com.github.dockerjava.api.model; + +import com.github.dockerjava.test.serdes.JSONResourceRef; + +/** + * Enumeration for the available pull response statuses. + * + * @author Zach Marshall + */ +public enum PullResponseJSONSamples implements JSONResourceRef { + pullImageResponse_legacy, pullImageResponse_error, pullImageResponse_newerImage, pullImageResponse_upToDate; + + @Override + public String getFileName() { + return this + ".json"; + } + + @Override + public Class getResourceClass() { + return PullResponseJSONSamples.class; + } +} diff --git a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java index 602a6e76f..32c373d09 100644 --- a/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java +++ b/src/test/java/com/github/dockerjava/test/serdes/JSONTestHelper.java @@ -25,13 +25,14 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.command.CommandJSONSamples; /** - * Provides helper methods for serialization-deserialization tests - * + * Provides helper methods for serialization-deserialization tests. + * + *

TODO: Create helper that loads json files from simple folder + * structure using a type, version number, and name.

+ * * @author Oleg Nenashev - * @since TODO */ public class JSONTestHelper { @@ -45,11 +46,12 @@ public class JSONTestHelper { * JSON Conversion error */ public static String readString(JSONResourceRef resource) throws IOException { - InputStream istream = CommandJSONSamples.class.getResourceAsStream(resource.getFileName()); - if (istream == null) { - throw new IOException("Cannot retrieve resource " + resource.getFileName()); + try (InputStream istream = resource.getResourceClass().getResourceAsStream(resource.getFileName())) { + if (istream == null) { + throw new IOException("Cannot retrieve resource " + resource.getFileName()); + } + return IOUtils.toString(istream, "UTF-8"); } - return IOUtils.toString(istream, "UTF-8"); } /** diff --git a/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_error.json b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_error.json new file mode 100644 index 000000000..f2ed0ddf2 --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_error.json @@ -0,0 +1 @@ +{"errorDetail":{"message":"Error: image cccxxx/xxxccc:latest not found"},"error":"Error: image cccxxx/xxxccc:latest not found"} diff --git a/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_legacy.json b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_legacy.json new file mode 100644 index 000000000..9c755cf5b --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_legacy.json @@ -0,0 +1 @@ +{"status":"docker.com/xxxxcv/ccccxx: this image was pulled from a legacy registry. Important: This registry version will not be supported in future versions of docker."} diff --git a/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_newerImage.json b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_newerImage.json new file mode 100644 index 000000000..e5046c8b1 --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_newerImage.json @@ -0,0 +1 @@ +{"status":"Downloaded newer image for docker.com/xxxxcv/ccccxx"} diff --git a/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_upToDate.json b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_upToDate.json new file mode 100644 index 000000000..e821ce688 --- /dev/null +++ b/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_upToDate.json @@ -0,0 +1 @@ +{"status":"Image is up to date for docker.com/xxxxcv/ccccxx"} From 51e3983b32f9b43086586fa668c351b0f5e6bb63 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 2 Dec 2015 23:07:35 +0100 Subject: [PATCH 0076/1032] Remove public from members as getters are public already --- .../java/com/github/dockerjava/api/model/ResponseItem.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 c9a77554a..3ad013786 100644 --- a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java @@ -100,13 +100,13 @@ public static class ProgressDetail implements Serializable { private static final long serialVersionUID = -1954994695645715264L; @JsonProperty("current") - public long current; + long current; @JsonProperty("total") - public long total; + long total; @JsonProperty("start") - public long start; + long start; public long getCurrent() { return current; From 0576e8ef249622d72d4447a0f392a4c5c8783388 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 2 Dec 2015 23:20:18 +0100 Subject: [PATCH 0077/1032] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62b2e65bb..5e4ecdb37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ Change Log === 2.1.3-SNAPSHOT --- -* [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) +* [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public +* [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) === v2.1.2 From 09909136805a6adce27270b2557ebe9eceaabfeb Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 3 Dec 2015 00:12:29 +0100 Subject: [PATCH 0078/1032] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e03a67219..b1e90b8fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Notes All changes +* [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public * [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) * [#359] (https://github.com/docker-java/docker-java/pull/359) Fix performance issue of build command by adding bulk-read variant of InputStream.read() * [#357] (https://github.com/docker-java/docker-java/pull/357) Wait container command needs possibility to abort operation From 77b8559685906e68e1871084ee7bfbfba3e24b71 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 3 Dec 2015 20:52:42 +0100 Subject: [PATCH 0079/1032] Pass mandatory container id into stats command constructor --- src/main/java/com/github/dockerjava/api/DockerClient.java | 2 +- .../java/com/github/dockerjava/core/DockerClientImpl.java | 4 ++-- .../java/com/github/dockerjava/core/command/StatsCmdImpl.java | 3 ++- .../com/github/dockerjava/core/command/StatsCmdImplTest.java | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index bb0c67549..57c7f3dc0 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -147,7 +147,7 @@ public interface DockerClient extends Closeable { public EventsCmd eventsCmd(); - public StatsCmd statsCmd(); + public StatsCmd statsCmd(String containerId); @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index b00a7a7f9..9546335b1 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -370,8 +370,8 @@ public EventsCmd eventsCmd() { } @Override - public StatsCmd statsCmd() { - return new StatsCmdImpl(getDockerCmdExecFactory().createStatsCmdExec()); + public StatsCmd statsCmd(String containerId) { + return new StatsCmdImpl(getDockerCmdExecFactory().createStatsCmdExec(), containerId); } @Override diff --git a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java index bcd187d6a..69d9a02d7 100644 --- a/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java @@ -12,8 +12,9 @@ public class StatsCmdImpl extends AbstrAsyncDockerCmd impl private String containerId; - public StatsCmdImpl(StatsCmd.Exec exec) { + public StatsCmdImpl(StatsCmd.Exec exec, String containerId) { super(exec); + withContainerId(containerId); } @Override diff --git a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java index 611225d4c..169225e97 100644 --- a/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StatsCmdImplTest.java @@ -62,7 +62,7 @@ public void testStatsStreaming() throws InterruptedException, IOException { dockerClient.startContainerCmd(container.getId()).exec(); - StatsCallbackTest statsCallback = dockerClient.statsCmd().withContainerId(container.getId()) + StatsCallbackTest statsCallback = dockerClient.statsCmd(container.getId()) .exec(new StatsCallbackTest(countDownLatch)); countDownLatch.await(3, TimeUnit.SECONDS); From 6bea0f5bedd7c78a8e5e084f7e9ce77afeab3bbc Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 3 Dec 2015 21:06:46 +0100 Subject: [PATCH 0080/1032] Added @Nonnull annotations --- .../github/dockerjava/api/DockerClient.java | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 57c7f3dc0..2f16f6608 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -5,6 +5,8 @@ import java.io.IOException; import java.io.InputStream; +import javax.annotation.Nonnull; + import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.command.BuildImageCmd; @@ -65,23 +67,23 @@ public interface DockerClient extends Closeable { * * IMAGE API * */ - public PullImageCmd pullImageCmd(String repository); + public PullImageCmd pullImageCmd(@Nonnull String repository); - public PushImageCmd pushImageCmd(String name); + public PushImageCmd pushImageCmd(@Nonnull String name); - public PushImageCmd pushImageCmd(Identifier identifier); + public PushImageCmd pushImageCmd(@Nonnull Identifier identifier); - public CreateImageCmd createImageCmd(String repository, InputStream imageStream); + public CreateImageCmd createImageCmd(@Nonnull String repository, @Nonnull InputStream imageStream); - public SearchImagesCmd searchImagesCmd(String term); + public SearchImagesCmd searchImagesCmd(@Nonnull String term); - public RemoveImageCmd removeImageCmd(String imageId); + public RemoveImageCmd removeImageCmd(@Nonnull String imageId); public ListImagesCmd listImagesCmd(); - public InspectImageCmd inspectImageCmd(String imageId); + public InspectImageCmd inspectImageCmd(@Nonnull String imageId); - public SaveImageCmd saveImageCmd(String name); + public SaveImageCmd saveImageCmd(@Nonnull String name); /** * * CONTAINER API * @@ -89,7 +91,7 @@ public interface DockerClient extends Closeable { public ListContainersCmd listContainersCmd(); - public CreateContainerCmd createContainerCmd(String image); + public CreateContainerCmd createContainerCmd(@Nonnull String image); /** * Creates a new {@link StartContainerCmd} for the container with the given ID. The command can then be further @@ -101,35 +103,35 @@ public interface DockerClient extends Closeable { *

* This command corresponds to the /containers/{id}/start endpoint of the Docker Remote API. */ - public StartContainerCmd startContainerCmd(String containerId); + public StartContainerCmd startContainerCmd(@Nonnull String containerId); - public ExecCreateCmd execCreateCmd(String containerId); + public ExecCreateCmd execCreateCmd(@Nonnull String containerId); - public InspectContainerCmd inspectContainerCmd(String containerId); + public InspectContainerCmd inspectContainerCmd(@Nonnull String containerId); - public RemoveContainerCmd removeContainerCmd(String containerId); + public RemoveContainerCmd removeContainerCmd(@Nonnull String containerId); - public WaitContainerCmd waitContainerCmd(String containerId); + public WaitContainerCmd waitContainerCmd(@Nonnull String containerId); - public AttachContainerCmd attachContainerCmd(String containerId); + public AttachContainerCmd attachContainerCmd(@Nonnull String containerId); - public ExecStartCmd execStartCmd(String containerId); + public ExecStartCmd execStartCmd(@Nonnull String containerId); - public InspectExecCmd inspectExecCmd(String execId); + public InspectExecCmd inspectExecCmd(@Nonnull String execId); - public LogContainerCmd logContainerCmd(String containerId); + public LogContainerCmd logContainerCmd(@Nonnull String containerId); - public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource); + public CopyFileFromContainerCmd copyFileFromContainerCmd(@Nonnull String containerId, @Nonnull String resource); - public ContainerDiffCmd containerDiffCmd(String containerId); + public ContainerDiffCmd containerDiffCmd(@Nonnull String containerId); - public StopContainerCmd stopContainerCmd(String containerId); + public StopContainerCmd stopContainerCmd(@Nonnull String containerId); - public KillContainerCmd killContainerCmd(String containerId); + public KillContainerCmd killContainerCmd(@Nonnull String containerId); - public RestartContainerCmd restartContainerCmd(String containerId); + public RestartContainerCmd restartContainerCmd(@Nonnull String containerId); - public CommitCmd commitCmd(String containerId); + public CommitCmd commitCmd(@Nonnull String containerId); public BuildImageCmd buildImageCmd(); From fca2ea584f0ad588e0090280a53d904406e854fa Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Thu, 3 Dec 2015 21:50:14 +0100 Subject: [PATCH 0081/1032] Re-design API to accept both a path and a tar input stream --- .../github/dockerjava/api/DockerClient.java | 10 +-- .../command/CopyArchiveToContainerCmd.java | 35 +++++--- .../dockerjava/core/DockerClientImpl.java | 4 +- .../CopyArchiveToContainerCmdImpl.java | 84 ++++++++++++++----- .../jaxrs/CopyArchiveToContainerCmdExec.java | 32 ++----- .../CopyArchiveToContainerCmdImplTest.java | 35 ++++++-- 6 files changed, 131 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 9ee8e0aea..5e77e579b 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -133,24 +133,24 @@ public interface DockerClient extends Closeable { /** * Copy resource from container to local machine. - * Deprecated, since docker API version 1.20 and above use copyArchiveFromContainerCmd instead. * * @param containerId id of the container * @param resource path to container's resource * @return created command + * @see #copyArchiveFromContainerCmd(String, String) + * @deprecated since docker API version 1.20 and replaced by {@link #copyArchiveFromContainerCmd(String, String)} instead */ @Deprecated public CopyFileFromContainerCmd copyFileFromContainerCmd(String containerId, String resource); /** * Copy archive from local machine to remote container - * Since docker API version 1.20 and above. * - * @param containerId id of the container - * @param hostResource path to container's resource + * @param containerId id of the container * @return created command + * @since docker API version 1.20 and above. */ - public CopyArchiveToContainerCmd copyArchiveToContainerCmd(String containerId, String hostResource); + public CopyArchiveToContainerCmd copyArchiveToContainerCmd(String containerId); public ContainerDiffCmd containerDiffCmd(String containerId); diff --git a/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java index c21f76fa6..129526cfe 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java @@ -1,37 +1,48 @@ package com.github.dockerjava.api.command; +import java.io.InputStream; + import com.github.dockerjava.api.exception.NotFoundException; public interface CopyArchiveToContainerCmd extends SyncDockerCmd { - public String getContainerId(); + String getContainerId(); + + String getHostResource(); - public String getHostResource(); + InputStream getTarInputStream(); - public boolean isNoOverwriteDirNonDir(); + boolean isNoOverwriteDirNonDir(); - public boolean isDirChildrenOnly(); + boolean isDirChildrenOnly(); /** * Set container's id * * @param containerId id of the container to copy file to */ - public CopyArchiveToContainerCmd withContainerId(String containerId); + CopyArchiveToContainerCmd withContainerId(String containerId); /** * Set path to the resource on the host machine * * @param resource path to the resource on the host machine */ - public CopyArchiveToContainerCmd withHostResource(String resource); + CopyArchiveToContainerCmd withHostResource(String resource); + + /** + * Set the tar input stream that will be uploaded to the container. withHostResource or withTarInputStream can be defined but not both. + * + * @param tarInputStream the stream to upload to the container + */ + CopyArchiveToContainerCmd withTarInputStream(InputStream tarInputStream); /** * If set to true then it will be an error if unpacking the given content would cause an existing directory to be replaced with a non-directory and vice versa * * @param noOverwriteDirNonDir flag to know if non directory can be overwritten */ - public CopyArchiveToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir); + CopyArchiveToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir); /** * If this flag is set to true, all children of the local directory will be copied to the remote without the root directory. @@ -41,16 +52,16 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd { * * @param dirChildrenOnly if root directory is ignored */ - public CopyArchiveToContainerCmd withDirChildrenOnly(boolean dirChildrenOnly); + CopyArchiveToContainerCmd withDirChildrenOnly(boolean dirChildrenOnly); - public String getRemotePath(); + String getRemotePath(); - public CopyArchiveToContainerCmd withRemotePath(String remotePath); + CopyArchiveToContainerCmd withRemotePath(String remotePath); @Override - public Void exec() throws NotFoundException; + Void exec() throws NotFoundException; - public static interface Exec extends DockerCmdSyncExec { + 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 913cf0a4c..10014efcb 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -314,9 +314,9 @@ public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(String containerI } @Override - public CopyArchiveToContainerCmd copyArchiveToContainerCmd(String containerId, String hostResource) { + public CopyArchiveToContainerCmd copyArchiveToContainerCmd(String containerId) { return new CopyArchiveToContainerCmdImpl(getDockerCmdExecFactory().createCopyArchiveToContainerCmdExec(), - containerId, hostResource); + containerId); } @Override diff --git a/src/main/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImpl.java index 47c0d0446..a40fc72d9 100644 --- a/src/main/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImpl.java @@ -2,10 +2,19 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.builder.ToStringBuilder; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; +import com.github.dockerjava.api.exception.BadRequestException; import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.core.util.CompressArchiveUtil; public class CopyArchiveToContainerCmdImpl extends AbstrDockerCmd implements CopyArchiveToContainerCmd { @@ -13,16 +22,17 @@ public class CopyArchiveToContainerCmdImpl extends AbstrDockerCmd implements CopyArchiveToContainerCmd.Exec { @@ -26,28 +20,20 @@ public CopyArchiveToContainerCmdExec(WebTarget baseResource, DockerClientConfig super(baseResource, dockerClientConfig); } - private InputStream buildUploadStream(CopyArchiveToContainerCmd command) throws IOException { - Path toUpload = Files.createTempFile("docker-java", ".tar.gz"); - CompressArchiveUtil.tar(Paths.get(command.getHostResource()), toUpload, true, command.isDirChildrenOnly()); - return Files.newInputStream(toUpload); - } - @Override protected Void execute(CopyArchiveToContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/archive").resolveTemplate("id", command.getContainerId()); LOGGER.trace("PUT: " + webResource.toString()); - try (InputStream streamToUpload = buildUploadStream(command)) { - webResource - .queryParam("path", command.getRemotePath()) - .queryParam("noOverwriteDirNonDir", command.isNoOverwriteDirNonDir()) - .request() - .put(entity(streamToUpload, "application/x-tar")) - .close(); - return null; - } catch (IOException e) { - throw new DockerClientException("Error occurred while preparing uploading host resource <" + command.getHostResource() + ">", e); - } + InputStream streamToUpload = command.getTarInputStream(); + webResource + .queryParam("path", command.getRemotePath()) + .queryParam("noOverwriteDirNonDir", command.isNoOverwriteDirNonDir()) + .request() + .put(entity(streamToUpload, "application/x-tar")) + .close(); + return null; + } } 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 dfc991526..3e5cb6702 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java @@ -4,8 +4,12 @@ import static org.hamcrest.Matchers.isEmptyOrNullString; import static org.hamcrest.Matchers.not; +import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; @@ -17,6 +21,7 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.client.AbstractDockerClientTest; +import com.github.dockerjava.core.util.CompressArchiveUtil; public class CopyArchiveToContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest @@ -40,17 +45,33 @@ public void afterMethod(ITestResult result) { } @Test - public void copyToContainer() throws Exception { - // TODO extract this into a shared method - CreateContainerResponse container = dockerClient.createContainerCmd("busybox") - .withName("docker-java-itest-copyFromContainer").withCmd("touch", "/copyFromContainer").exec(); + public void copyFileToContainer() throws Exception { + CreateContainerResponse container = prepareContainerForCopy(); + Path temp = Files.createTempFile("", ".tar.gz"); + CompressArchiveUtil.tar(Paths.get("src/test/resources/testReadFile"), temp, true, false); + try (InputStream uploadStream = Files.newInputStream(temp)) { + dockerClient.copyArchiveToContainerCmd(container.getId()).withTarInputStream(uploadStream).exec(); + assertFileCopied(container); + } + } + @Test + public void copyStreamToContainer() throws Exception { + CreateContainerResponse container = prepareContainerForCopy(); + dockerClient.copyArchiveToContainerCmd(container.getId()).withHostResource("src/test/resources/testReadFile").exec(); + assertFileCopied(container); + } + + private CreateContainerResponse prepareContainerForCopy() { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("docker-java-itest-copyToContainer").exec(); LOG.info("Created container: {}", container); assertThat(container.getId(), not(isEmptyOrNullString())); - dockerClient.startContainerCmd(container.getId()).exec(); + // Copy a folder to the container + return container; + } - dockerClient.copyArchiveToContainerCmd(container.getId(), "src/test/resources/testReadFile").exec(); + private void assertFileCopied(CreateContainerResponse container) throws IOException { try (InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "testReadFile").exec()) { boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied to the container."); @@ -60,7 +81,7 @@ public void copyToContainer() throws Exception { @Test public void copyToNonExistingContainer() throws Exception { try { - dockerClient.copyArchiveFromContainerCmd("non-existing", "/test").exec(); + dockerClient.copyArchiveToContainerCmd("non-existing").withHostResource("src/test/resources/testReadFile").exec(); fail("expected NotFoundException"); } catch (NotFoundException ignored) { } From 0871b9dbed2efacbea3f32e0fa3b1906d2384b2c Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Thu, 3 Dec 2015 23:35:11 +0100 Subject: [PATCH 0082/1032] Minor fix API doc --- src/main/java/com/github/dockerjava/api/DockerClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 9a0c02962..586c40ff0 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -125,11 +125,11 @@ public interface DockerClient extends Closeable { /** * Copy resource from container to local machine. - * Since docker API version 1.20 and above. * * @param containerId id of the container * @param resource path to container's resource * @return created command + * @since docker API version 1.20 and above. */ public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(@Nonnull String containerId, @Nonnull String resource); @@ -140,7 +140,7 @@ public interface DockerClient extends Closeable { * @param resource path to container's resource * @return created command * @see #copyArchiveFromContainerCmd(String, String) - * @deprecated since docker API version 1.20 and replaced by {@link #copyArchiveFromContainerCmd(String, String)} instead + * @deprecated since docker API version 1.20, replaced by {@link #copyArchiveFromContainerCmd(String, String)} */ @Deprecated public CopyFileFromContainerCmd copyFileFromContainerCmd(@Nonnull String containerId, @Nonnull String resource); From a72355f47478f674eded2b0afe143dac6576a6a3 Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Sat, 5 Dec 2015 19:15:10 +0100 Subject: [PATCH 0083/1032] Rollback unrelated changes due to code formatter --- .../com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 2 +- .../core/command/CopyFileFromContainerCmdImplTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index ba076848d..6e2591f86 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -177,7 +177,7 @@ public void init(DockerClientConfig dockerClientConfig) { } 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) { 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 d073daf45..3e4e88612 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyFileFromContainerCmdImplTest.java @@ -70,4 +70,4 @@ public void copyFromNonExistingContainer() throws Exception { } catch (NotFoundException ignored) { } } -} \ No newline at end of file +} From 477f4a1eb32c459d1d3ec364039ed31e7f5d8820 Mon Sep 17 00:00:00 2001 From: VU Minh Khang Date: Sat, 5 Dec 2015 19:19:24 +0100 Subject: [PATCH 0084/1032] Use remote api version constant --- src/main/java/com/github/dockerjava/api/DockerClient.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 586c40ff0..49eafcfca 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -48,6 +48,7 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.Identifier; +import com.github.dockerjava.core.RemoteApiVersion; // https://godoc.org/github.com/fsouza/go-dockerclient public interface DockerClient extends Closeable { @@ -129,7 +130,7 @@ public interface DockerClient extends Closeable { * @param containerId id of the container * @param resource path to container's resource * @return created command - * @since docker API version 1.20 and above. + * @since {@link RemoteApiVersion#VERSION_1_20} */ public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(@Nonnull String containerId, @Nonnull String resource); @@ -150,7 +151,7 @@ public interface DockerClient extends Closeable { * * @param containerId id of the container * @return created command - * @since docker API version 1.20 and above. + * @since {@link RemoteApiVersion#VERSION_1_20} */ public CopyArchiveToContainerCmd copyArchiveToContainerCmd(@Nonnull String containerId); From be493f0a53e42cdf6b750ad0afa5b05800fce867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Warcha=C5=82?= Date: Mon, 7 Dec 2015 22:21:56 +0100 Subject: [PATCH 0085/1032] Added test to demonstrate #219 --- .../core/command/BuildImageCmdImplTest.java | 13 +++++++++++++ .../resources/testAddOnBuild/onbuild/Dockerfile | 8 ++++++++ src/test/resources/testAddOnBuild/test/Dockerfile | 1 + src/test/resources/testAddOnBuild/test/testrun.sh | 3 +++ 4 files changed, 25 insertions(+) create mode 100644 src/test/resources/testAddOnBuild/onbuild/Dockerfile create mode 100644 src/test/resources/testAddOnBuild/test/Dockerfile create mode 100755 src/test/resources/testAddOnBuild/test/testrun.sh 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 f8dc6a940..20e6b1935 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -100,6 +100,19 @@ public void testDockerBuilderFromTar() throws Exception { assertThat(response, containsString("Successfully executed testrun.sh")); } + @Test + public void testDockerBuildWithOnBuild() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddOnBuild/onbuild").getFile()); + dockerClient.buildImageCmd(baseDir) + .withNoCache(true) + .withTag("docker-java-onbuild") + .exec(new BuildImageResultCallback()) + .awaitImageId(); + baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddOnBuild/test").getFile()); + 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()); diff --git a/src/test/resources/testAddOnBuild/onbuild/Dockerfile b/src/test/resources/testAddOnBuild/onbuild/Dockerfile new file mode 100644 index 000000000..e482cd833 --- /dev/null +++ b/src/test/resources/testAddOnBuild/onbuild/Dockerfile @@ -0,0 +1,8 @@ +FROM ubuntu:latest + +# Copy testrun.sh files into the container + +ONBUILD ADD ./testrun.sh /tmp/ +ONBUILD RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh + +CMD ["testrun.sh"] diff --git a/src/test/resources/testAddOnBuild/test/Dockerfile b/src/test/resources/testAddOnBuild/test/Dockerfile new file mode 100644 index 000000000..533264d46 --- /dev/null +++ b/src/test/resources/testAddOnBuild/test/Dockerfile @@ -0,0 +1 @@ +FROM docker-java-onbuild diff --git a/src/test/resources/testAddOnBuild/test/testrun.sh b/src/test/resources/testAddOnBuild/test/testrun.sh new file mode 100755 index 000000000..80b468e71 --- /dev/null +++ b/src/test/resources/testAddOnBuild/test/testrun.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Successfully executed testrun.sh" From 61bcaa70a32a5b5e3b6556dfb2b84e5cba575e8e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 7 Dec 2015 22:38:14 +0100 Subject: [PATCH 0086/1032] Introduce InspectContainerResponse.Mounts Fix issue #388 --- .../api/command/InspectContainerResponse.java | 91 +++++++++++++++++++ .../github/dockerjava/api/model/Binds.java | 11 +-- .../github/dockerjava/api/model/VolumeRW.java | 3 + .../client/AbstractDockerClientTest.java | 15 +-- .../command/CreateContainerCmdImplTest.java | 57 ++++++------ .../command/StartContainerCmdImplTest.java | 10 +- src/test/resources/testAddUrl/Dockerfile | 2 +- 7 files changed, 146 insertions(+), 43 deletions(-) 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 d289d35be..1ce801540 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -4,6 +4,7 @@ import java.util.Map; import com.github.dockerjava.core.RemoteApiVersion; + import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; @@ -14,6 +15,7 @@ import com.github.dockerjava.api.model.ContainerConfig; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumeBind; import com.github.dockerjava.api.model.VolumeBinds; import com.github.dockerjava.api.model.VolumeRW; @@ -89,6 +91,9 @@ public class InspectContainerResponse { @JsonProperty("VolumesRW") private VolumesRW volumesRW; + @JsonProperty("Mounts") + private List mounts; + public String getId() { return id; } @@ -134,7 +139,12 @@ public VolumeBind[] getVolumes() { return volumes == null ? null : volumes.getBinds(); } + /** + * @deprecated As of {@link RemoteApiVersion#VERSION_1_20} + * use {@link #getMounts()} instead + */ @JsonIgnore + @Deprecated public VolumeRW[] getVolumesRW() { return volumesRW == null ? null : volumesRW.getVolumesRW(); } @@ -167,6 +177,10 @@ public String getMountLabel() { return mountLabel; } + public List getMounts() { + return mounts; + } + public List getExecIds() { return execIds; } @@ -413,4 +427,81 @@ public String toString() { } } + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Mount { + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Name") + private String name; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Source") + private String source; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Destination") + private Volume destination; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Driver") + private String driver; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Mode") + private String mode; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("RW") + private Boolean rw; + + @CheckForNull + public String getName() { + return name; + } + + @CheckForNull + public String getSource() { + return source; + } + + @CheckForNull + public Volume getDestination() { + return destination; + } + + @CheckForNull + public String getDriver() { + return driver; + } + + @CheckForNull + public String getMode() { + return mode; + } + + @CheckForNull + public Boolean getRW() { + return rw; + } + + } + } 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 1824ca77b..917cfdcbd 100644 --- a/src/main/java/com/github/dockerjava/api/model/Binds.java +++ b/src/main/java/com/github/dockerjava/api/model/Binds.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Map; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; @@ -17,7 +16,6 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.node.NullNode; @JsonSerialize(using = Binds.Serializer.class) @JsonDeserialize(using = Binds.Deserializer.class) @@ -58,12 +56,11 @@ public Binds deserialize(JsonParser jsonParser, DeserializationContext deseriali List binds = new ArrayList(); ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); - for (Iterator> it = node.fields(); it.hasNext();) { + for (Iterator it = node.elements(); it.hasNext();) { + + JsonNode field = it.next(); + binds.add(Bind.parse(field.asText())); - Map.Entry field = it.next(); - if (!field.getValue().equals(NullNode.getInstance())) { - binds.add(Bind.parse(field.getKey())); - } } return new Binds(binds.toArray(new Bind[0])); } 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 46d4539b4..bdb347bee 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java @@ -18,14 +18,17 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; +import com.github.dockerjava.core.RemoteApiVersion; /** * Represents a bind mounted volume in a Docker container. * * @see Bind + * @deprecated since {@link RemoteApiVersion#VERSION_1_20} */ @JsonDeserialize(using = VolumeRW.Deserializer.class) @JsonSerialize(using = VolumeRW.Serializer.class) +@Deprecated public class VolumeRW { private Volume volume; diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 2fd228b9f..c01ced920 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -2,6 +2,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; import java.io.File; import java.io.IOException; @@ -23,6 +24,8 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse.Mount; +import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumeBind; @@ -38,7 +41,7 @@ public abstract class AbstractDockerClientTest extends Assert { public static final Logger LOG = LoggerFactory.getLogger(AbstractDockerClientTest.class); - private String apiVersion = "1.19"; + private String apiVersion = "1.21"; protected DockerClient dockerClient; @@ -180,13 +183,13 @@ public static void assertContainerHasVolumes(InspectContainerResponse inspectCon Volume... expectedVolumes) { List volumes = new ArrayList(); - VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); - if (volumeBinds != null) { - for (VolumeBind bind : volumeBinds) { - volumes.add(new Volume(bind.getContainerPath())); + List mounts = inspectContainerResponse.getMounts(); + if (mounts != null) { + for (Mount mount : mounts) { + volumes.add(mount.getDestination()); } } - assertThat(volumes, contains(expectedVolumes)); + assertThat(volumes, containsInAnyOrder(expectedVolumes)); } protected String containerLog(String containerId) throws Exception { 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 f741f5245..2f6ea0859 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -1,29 +1,5 @@ package com.github.dockerjava.core.command; -import com.github.dockerjava.api.exception.ConflictException; -import com.github.dockerjava.api.exception.DockerException; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.model.AccessMode; -import com.github.dockerjava.api.model.Bind; -import com.github.dockerjava.api.model.Device; -import com.github.dockerjava.api.model.ExposedPort; -import com.github.dockerjava.api.model.Link; -import com.github.dockerjava.api.model.LogConfig; -import com.github.dockerjava.api.model.Ports; -import com.github.dockerjava.api.model.RestartPolicy; -import com.github.dockerjava.api.model.Ulimit; -import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumeRW; -import com.github.dockerjava.api.model.VolumesFrom; -import com.github.dockerjava.client.AbstractDockerClientTest; -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 static com.github.dockerjava.api.model.Capability.MKNOD; import static com.github.dockerjava.api.model.Capability.NET_ADMIN; import static org.hamcrest.MatcherAssert.assertThat; @@ -45,7 +21,29 @@ import java.util.Map; import java.util.UUID; -import static org.hamcrest.MatcherAssert.assertThat; +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 com.github.dockerjava.api.command.CreateContainerResponse; +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.AccessMode; +import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.Device; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.Link; +import com.github.dockerjava.api.model.LogConfig; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.Ulimit; +import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumesFrom; +import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") public class CreateContainerCmdImplTest extends AbstractDockerClientTest { @@ -107,9 +105,12 @@ public void createContainerWithVolume() throws DockerException { assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/var/log")); - assertThat(inspectContainerResponse.getVolumesRW(), hasItemInArray(new VolumeRW(volume, AccessMode.rw))); + assertEquals(inspectContainerResponse.getMounts().get(0).getDestination(), volume); + assertEquals(inspectContainerResponse.getMounts().get(0).getMode(), AccessMode.rw); + assertTrue(inspectContainerResponse.getMounts().get(0).getRW()); } + @Test public void createContainerWithReadOnlyVolume() throws DockerException { @@ -128,7 +129,9 @@ public void createContainerWithReadOnlyVolume() throws DockerException { assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/srv/test")); - assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), contains(new VolumeRW(volume))); + assertEquals(inspectContainerResponse.getMounts().get(0).getDestination(), volume); + // TODO: Create a read-only volume and test like this + // assertFalse(inspectContainerResponse.getMounts().get(0).getRW()); } @Test 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 db6e28fe0..6b672c93c 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -93,9 +93,15 @@ public void startContainerWithVolumes() throws DockerException { assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); - assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), - contains(new VolumeRW(volume1, AccessMode.ro), new VolumeRW(volume2))); + assertEquals(inspectContainerResponse.getMounts().size(), 2); + assertEquals(inspectContainerResponse.getMounts().get(0).getDestination(), volume1); + assertEquals(inspectContainerResponse.getMounts().get(0).getMode(), "ro"); + assertEquals(inspectContainerResponse.getMounts().get(0).getRW(), Boolean.FALSE); + + assertEquals(inspectContainerResponse.getMounts().get(1).getDestination(), volume2); + assertEquals(inspectContainerResponse.getMounts().get(1).getMode(), "rw"); + assertEquals(inspectContainerResponse.getMounts().get(1).getRW(), Boolean.TRUE); } @Test diff --git a/src/test/resources/testAddUrl/Dockerfile b/src/test/resources/testAddUrl/Dockerfile index ba0b91a0b..d9a0676d4 100644 --- a/src/test/resources/testAddUrl/Dockerfile +++ b/src/test/resources/testAddUrl/Dockerfile @@ -2,7 +2,7 @@ FROM ubuntu:latest # Copy testrun.sh files into the container -ADD http://www.docker.io /tmp/docker_home.html +ADD https://hub.docker.com/r/marcuslinke/busybox/ /tmp/docker_home.html ADD ./testrun.sh /tmp/ RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh From c2d62fa350a889c5f334d1d3321c255d6f02435f Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 7 Dec 2015 23:18:21 +0100 Subject: [PATCH 0087/1032] Code cleanup --- .../api/command/InspectContainerResponse.java | 4 ++++ .../client/AbstractDockerClientTest.java | 5 +---- .../core/command/CreateContainerCmdImplTest.java | 8 ++++---- .../core/command/StartContainerCmdImplTest.java | 14 +++++++------- 4 files changed, 16 insertions(+), 15 deletions(-) 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 1ce801540..6a899a908 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -177,6 +177,10 @@ public String getMountLabel() { return mountLabel; } + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull public List getMounts() { return mounts; } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index c01ced920..dd07afdb4 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -1,7 +1,6 @@ package com.github.dockerjava.client; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import java.io.File; @@ -22,10 +21,9 @@ import org.testng.ITestResult; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse.Mount; -import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumeBind; @@ -35,7 +33,6 @@ import com.github.dockerjava.core.command.BuildImageResultCallback; import com.github.dockerjava.core.command.LogContainerResultCallback; import com.github.dockerjava.core.command.PullImageResultCallback; -import com.google.common.base.Joiner; public abstract class AbstractDockerClientTest extends Assert { 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 2f6ea0859..6150140c9 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -105,9 +105,9 @@ public void createContainerWithVolume() throws DockerException { assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/var/log")); - assertEquals(inspectContainerResponse.getMounts().get(0).getDestination(), volume); - assertEquals(inspectContainerResponse.getMounts().get(0).getMode(), AccessMode.rw); - assertTrue(inspectContainerResponse.getMounts().get(0).getRW()); + assertThat(inspectContainerResponse.getMounts().get(0).getDestination(), equalTo(volume)); + assertThat(inspectContainerResponse.getMounts().get(0).getMode(), equalTo("")); + assertThat(inspectContainerResponse.getMounts().get(0).getRW(), equalTo(true)); } @@ -129,7 +129,7 @@ public void createContainerWithReadOnlyVolume() throws DockerException { assertThat(inspectContainerResponse.getConfig().getVolumes().keySet(), contains("/srv/test")); - assertEquals(inspectContainerResponse.getMounts().get(0).getDestination(), volume); + assertThat(inspectContainerResponse.getMounts().get(0).getDestination(), equalTo(volume)); // TODO: Create a read-only volume and test like this // assertFalse(inspectContainerResponse.getMounts().get(0).getRW()); } 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 6b672c93c..a927daaaf 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -93,15 +93,15 @@ public void startContainerWithVolumes() throws DockerException { assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); - assertEquals(inspectContainerResponse.getMounts().size(), 2); + assertThat(inspectContainerResponse.getMounts().size(), equalTo(2)); - assertEquals(inspectContainerResponse.getMounts().get(0).getDestination(), volume1); - assertEquals(inspectContainerResponse.getMounts().get(0).getMode(), "ro"); - assertEquals(inspectContainerResponse.getMounts().get(0).getRW(), Boolean.FALSE); + assertThat(inspectContainerResponse.getMounts().get(0).getDestination(), equalTo(volume1)); + assertThat(inspectContainerResponse.getMounts().get(0).getMode(), equalTo("ro")); + assertThat(inspectContainerResponse.getMounts().get(0).getRW(), equalTo(Boolean.FALSE)); - assertEquals(inspectContainerResponse.getMounts().get(1).getDestination(), volume2); - assertEquals(inspectContainerResponse.getMounts().get(1).getMode(), "rw"); - assertEquals(inspectContainerResponse.getMounts().get(1).getRW(), Boolean.TRUE); + assertThat(inspectContainerResponse.getMounts().get(1).getDestination(), equalTo(volume2)); + assertThat(inspectContainerResponse.getMounts().get(1).getMode(), equalTo("rw")); + assertThat(inspectContainerResponse.getMounts().get(1).getRW(), equalTo(Boolean.TRUE)); } @Test From 089bdd1a6fbdc55fad2c11922c0ad6ec446f066e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 7 Dec 2015 23:31:02 +0100 Subject: [PATCH 0088/1032] Adding @CheckForNull --- .../github/dockerjava/api/command/InspectContainerResponse.java | 1 + 1 file changed, 1 insertion(+) 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 6a899a908..cb14b7e5b 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -145,6 +145,7 @@ public VolumeBind[] getVolumes() { */ @JsonIgnore @Deprecated + @CheckForNull public VolumeRW[] getVolumesRW() { return volumesRW == null ? null : volumesRW.getVolumesRW(); } From e043190ad16727c049a3f7250c613aaa7e1169b2 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 8 Dec 2015 00:08:36 +0100 Subject: [PATCH 0089/1032] Use custom matcher for testing containers mounted volumes --- .../client/AbstractDockerClientTest.java | 30 +++++++++++-------- .../command/CreateContainerCmdImplTest.java | 6 ++-- .../command/StartContainerCmdImplTest.java | 15 +++++----- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index dd07afdb4..f2e2489c0 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -15,6 +15,8 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; +import org.hamcrest.FeatureMatcher; +import org.hamcrest.Matcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; @@ -172,21 +174,23 @@ public static Boolean available(int port) { return false; } - /** - * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) has {@link VolumeBind}s for - * the given {@link Volume}s - */ - public static void assertContainerHasVolumes(InspectContainerResponse inspectContainerResponse, - Volume... expectedVolumes) { - - List volumes = new ArrayList(); - List mounts = inspectContainerResponse.getMounts(); - if (mounts != null) { - for (Mount mount : mounts) { - volumes.add(mount.getDestination()); + protected MountedVolumes mountedVolumes(Matcher> subMatcher) { + return new MountedVolumes(subMatcher, "Mounted volumes", "mountedVolumes"); + } + + private static class MountedVolumes extends FeatureMatcher> { + public MountedVolumes(Matcher> subMatcher, String featureDescription, String featureName) { + super(subMatcher, featureDescription, featureName); + } + + @Override + public List featureValueOf(InspectContainerResponse item) { + List volumes = new ArrayList(); + for (Mount mount : item.getMounts()) { + volumes.add(mount.getDestination()); } + return volumes; } - assertThat(volumes, containsInAnyOrder(expectedVolumes)); } protected String containerLog(String containerId) throws Exception { 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 6150140c9..4e4cac9f1 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -32,7 +32,6 @@ 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.AccessMode; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Device; import com.github.dockerjava.api.model.ExposedPort; @@ -154,7 +153,7 @@ public void createContainerWithVolumesFrom() throws DockerException { InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) .exec(); - assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); + assertThat(inspectContainerResponse1, mountedVolumes(containsInAnyOrder(volume1, volume2))); // create a second container with volumes from first container CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") @@ -180,7 +179,8 @@ public void createContainerWithVolumesFrom() throws DockerException { assertThat(inspectContainerResponse2.getHostConfig().getVolumesFrom(), hasItemInArray(new VolumesFrom( container1Name))); - assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); + + assertThat(inspectContainerResponse2, mountedVolumes(containsInAnyOrder(volume1, volume2))); } @Test 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 a927daaaf..b43eb0ff2 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -5,6 +5,7 @@ import static com.github.dockerjava.api.model.Capability.NET_ADMIN; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.isEmptyString; @@ -24,13 +25,12 @@ import org.testng.annotations.Test; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.dockerjava.api.exception.DockerException; -import com.github.dockerjava.api.exception.InternalServerErrorException; -import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.StartContainerCmd; -import com.github.dockerjava.api.model.AccessMode; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.InternalServerErrorException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Device; import com.github.dockerjava.api.model.ExposedPort; @@ -38,7 +38,6 @@ import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumeRW; import com.github.dockerjava.api.model.VolumesFrom; import com.github.dockerjava.client.AbstractDockerClientTest; @@ -91,7 +90,7 @@ public void startContainerWithVolumes() throws DockerException { inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); + assertThat(inspectContainerResponse, mountedVolumes(containsInAnyOrder(volume1, volume2))); assertThat(inspectContainerResponse.getMounts().size(), equalTo(2)); @@ -123,7 +122,7 @@ public void startContainerWithVolumesFrom() throws DockerException { InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) .exec(); - assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); + assertThat(inspectContainerResponse1, mountedVolumes(containsInAnyOrder(volume1, volume2))); CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") .withVolumesFrom(new VolumesFrom(container1Name)).exec(); @@ -135,7 +134,7 @@ public void startContainerWithVolumesFrom() throws DockerException { InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) .exec(); - assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); + assertThat(inspectContainerResponse2, mountedVolumes(containsInAnyOrder(volume1, volume2))); } @Test From 9653b7022642f6db6d84f368f772fbb248affacb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Warcha=C5=82?= Date: Tue, 8 Dec 2015 00:18:59 +0100 Subject: [PATCH 0090/1032] Fixes #219 --- .../core/dockerfile/Dockerfile.java | 80 +++---------------- .../resources/testDockerignore/.dockerignore | 2 +- 2 files changed, 10 insertions(+), 72 deletions(-) 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 2112a794c..f889e2282 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -5,7 +5,6 @@ import com.github.dockerjava.core.util.FilePathUtil; import com.github.dockerjava.core.GoLangFileMatch; import com.github.dockerjava.core.exception.GoLangFileMatchException; -import com.github.dockerjava.core.GoLangMatchFileFilter; import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.base.Optional; @@ -21,9 +20,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.UUID; /** @@ -115,8 +112,6 @@ public class ScannedResult { final List ignores; - final Map environmentMap = new HashMap(); - final List filesToAdd = new ArrayList(); public InputStream buildDockerFolderTar() { @@ -162,7 +157,8 @@ public void close() throws IOException { @Override public String toString() { - return Objects.toStringHelper(this).add("ignores", ignores).add("environmentMap", environmentMap) + return Objects.toStringHelper(this) + .add("ignores", ignores) .add("filesToAdd", filesToAdd).toString(); } @@ -172,18 +168,17 @@ public ScannedResult() throws IOException { String matchingIgnorePattern = effectiveMatchingIgnorePattern(dockerFile); - if (matchingIgnorePattern == null) { - filesToAdd.add(dockerFile); - } else { + if (matchingIgnorePattern != null) { throw new DockerClientException(String.format( "Dockerfile is excluded by pattern '%s' in .dockerignore file", matchingIgnorePattern)); } - for (DockerfileStatement statement : getStatements()) { - if (statement instanceof DockerfileStatement.Env) { - processEnvStatement((DockerfileStatement.Env) statement); - } else if (statement instanceof DockerfileStatement.Add) { - processAddStatement((DockerfileStatement.Add) statement); + Collection filesInBuildContext = FileUtils.listFiles(getDockerFolder(), TrueFileFilter.INSTANCE, + TrueFileFilter.INSTANCE); + + for (File f : filesInBuildContext) { + if (effectiveMatchingIgnorePattern(f) == null) { + filesToAdd.add(f); } } } @@ -238,62 +233,5 @@ private String effectiveMatchingIgnorePattern(File file) { return lastMatchingPattern; } - - private void processAddStatement(DockerfileStatement.Add add) throws IOException { - - add = add.transform(environmentMap); - - for (String resource : add.getFileResources()) { - - File dockerFolder = getDockerFolder(); - - File src = new File(resource); - if (!src.isAbsolute()) { - src = new File(dockerFolder, resource); - } else { - throw new DockerClientException(String.format("Source file %s must be relative to %s", src, - dockerFolder)); - } - - if (src.exists()) { - src = src.getCanonicalFile(); - if (src.isDirectory()) { - Collection files = FileUtils.listFiles(src, new GoLangMatchFileFilter(src, ignores), - TrueFileFilter.INSTANCE); - filesToAdd.addAll(files); - } else if (effectiveMatchingIgnorePattern(src) == null) { - filesToAdd.add(src); - } else { - throw new DockerClientException(String.format( - "Source file %s is excluded by .dockerignore file", src)); - } - } else { - filesToAdd.addAll(resolveWildcards(src, ignores)); - } - } - } - - private Collection resolveWildcards(File file, List ignores) { - List filesToAdd = new ArrayList(); - - File parent = file.getParentFile(); - if (parent != null) { - if (parent.isDirectory()) { - Collection files = FileUtils.listFiles(parent, new GoLangMatchFileFilter(parent, ignores), - TrueFileFilter.INSTANCE); - filesToAdd.addAll(files); - } else { - filesToAdd.addAll(resolveWildcards(parent, ignores)); - } - } else { - throw new DockerClientException(String.format("Source file %s doesn't exist", file)); - } - - return filesToAdd; - } - - private void processEnvStatement(DockerfileStatement.Env env) { - environmentMap.put(env.variable, env.value); - } } } diff --git a/src/test/resources/testDockerignore/.dockerignore b/src/test/resources/testDockerignore/.dockerignore index 63d8dbd40..bd3b31a85 100644 --- a/src/test/resources/testDockerignore/.dockerignore +++ b/src/test/resources/testDockerignore/.dockerignore @@ -1 +1 @@ -b \ No newline at end of file +*/b From d63e70b123f615be526544f89ca522c694ae5a9a Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 8 Dec 2015 19:36:21 +0100 Subject: [PATCH 0091/1032] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1e90b8fb..db41510df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ Notes * The upcoming release will contain multiple API breaking changes therefore the major version switch All changes - + +* [#392] (https://github.com/docker-java/docker-java/pull/392) Introduce InspectContainerResponse.Mounts * [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public * [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) * [#359] (https://github.com/docker-java/docker-java/pull/359) Fix performance issue of build command by adding bulk-read variant of InputStream.read() From 7b1e19024be0cc7cde10b6aad61d8b86a0077ee5 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 8 Dec 2015 19:43:15 +0100 Subject: [PATCH 0092/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e4ecdb37..7c17b4d19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ Change Log === 2.1.3-SNAPSHOT --- + * [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public +* [#386] (https://github.com/docker-java/docker-java/pull/386) Basic http proxy configuration support * [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) === From 0e46d3fc27ce3494b141a7e708f55e7dca355819 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 8 Dec 2015 20:22:14 +0100 Subject: [PATCH 0093/1032] [maven-release-plugin] prepare release docker-java-2.1.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index debfb672e..eb77e55ee 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.1.3-SNAPSHOT + 2.1.3 docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - HEAD + docker-java-2.1.3 From bcacdb1efc5e9569a9fefd4af2e5cb9b728d38c5 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 8 Dec 2015 20:22:18 +0100 Subject: [PATCH 0094/1032] [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 eb77e55ee..6bcd3989d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.1.3 + 2.1.4-SNAPSHOT docker-java https://github.com/docker-java/docker-java @@ -28,7 +28,7 @@ scm:git:git@github.com:docker-java/docker-java.git git@github.com:docker-java/docker-java.git scm:git:git@github.com:docker-java/docker-java.git - docker-java-2.1.3 + HEAD From 45aa177105efa701f7cdf44ce2f5a450ee2d1831 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 8 Dec 2015 20:25:24 +0100 Subject: [PATCH 0095/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c17b4d19..fbcfaf035 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ Change Log === -2.1.3-SNAPSHOT +2.1.3 --- * [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public From 418d192791d30367ccfdd7ee16428e05f2bbb04a Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 8 Dec 2015 22:15:37 +0100 Subject: [PATCH 0096/1032] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eee4da341..aa2af5646 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,13 +8,14 @@ Notes * The upcoming release will contain multiple API breaking changes therefore the major version switch All changes - + * [#392] (https://github.com/docker-java/docker-java/pull/392) Introduce InspectContainerResponse.Mounts * [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public * [#386] (https://github.com/docker-java/docker-java/pull/386) Basic http proxy configuration support * [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) * [#359] (https://github.com/docker-java/docker-java/pull/359) Fix performance issue of build command by adding bulk-read variant of InputStream.read() * [#357] (https://github.com/docker-java/docker-java/pull/357) Wait container command needs possibility to abort operation +* [#347] (https://github.com/docker-java/docker-java/pull/347) Implementation of copy archive to/from container commands * [#313] (https://github.com/docker-java/docker-java/pull/313) Refactor primitive type fields to be of object type in JSON objects v2.1.3 From b18125c860d3439c70089aeac51d0af47a5e42c3 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 8 Dec 2015 22:17:19 +0100 Subject: [PATCH 0097/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa2af5646..b72b2438b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ Change Log --- Notes -* The upcoming release will contain multiple API breaking changes therefore the major version switch +* The upcoming release will contain multiple API breaking changes therefore the major version switch. It will supports a subset of v.1.21 of the docker remote API. All changes From 033caf8b3798c8d68dff4ad2236cdcc3e487f1ea Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 8 Dec 2015 22:59:44 +0100 Subject: [PATCH 0098/1032] Format sources --- .../github/dockerjava/core/dockerfile/Dockerfile.java | 4 +--- .../dockerjava/core/command/BuildImageCmdImplTest.java | 10 ++++------ 2 files changed, 5 insertions(+), 9 deletions(-) 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 f889e2282..46b5642f4 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -157,9 +157,7 @@ public void close() throws IOException { @Override public String toString() { - return Objects.toStringHelper(this) - .add("ignores", ignores) - .add("filesToAdd", filesToAdd).toString(); + return Objects.toStringHelper(this).add("ignores", ignores).add("filesToAdd", filesToAdd).toString(); } public ScannedResult() throws IOException { 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 20e6b1935..017186ccd 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -102,12 +102,10 @@ public void testDockerBuilderFromTar() throws Exception { @Test public void testDockerBuildWithOnBuild() throws Exception { - File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddOnBuild/onbuild").getFile()); - dockerClient.buildImageCmd(baseDir) - .withNoCache(true) - .withTag("docker-java-onbuild") - .exec(new BuildImageResultCallback()) - .awaitImageId(); + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddOnBuild/onbuild") + .getFile()); + dockerClient.buildImageCmd(baseDir).withNoCache(true).withTag("docker-java-onbuild") + .exec(new BuildImageResultCallback()).awaitImageId(); baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddOnBuild/test").getFile()); String response = dockerfileBuild(baseDir); assertThat(response, containsString("Successfully executed testrun.sh")); From 58bcd6fe2ddb50c16d9ceb0c58c696f78854a64a Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 8 Dec 2015 23:02:29 +0100 Subject: [PATCH 0099/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b72b2438b..760bf3b52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ Notes * The upcoming release will contain multiple API breaking changes therefore the major version switch. It will supports a subset of v.1.21 of the docker remote API. All changes - +* [#393] (https://github.com/docker-java/docker-java/pull/392) Support ONBUILD instruction in Dockerfiles * [#392] (https://github.com/docker-java/docker-java/pull/392) Introduce InspectContainerResponse.Mounts * [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public * [#386] (https://github.com/docker-java/docker-java/pull/386) Basic http proxy configuration support From 47a9391f03932f3a437a9d192863de271e1cdddb Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 8 Dec 2015 23:07:54 +0100 Subject: [PATCH 0100/1032] Tag as integration test --- .../core/command/CopyArchiveToContainerCmdImplTest.java | 1 + 1 file changed, 1 insertion(+) 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 eaa4f9b54..0f8f2164b 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java @@ -23,6 +23,7 @@ import com.github.dockerjava.client.AbstractDockerClientTest; import com.github.dockerjava.core.util.CompressArchiveUtil; +@Test(groups = "integration") public class CopyArchiveToContainerCmdImplTest extends AbstractDockerClientTest { @BeforeTest public void beforeTest() throws Exception { From a1c7bf594e781219aa3da19055f11c655b701d4a Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 10 Dec 2015 22:13:16 +0100 Subject: [PATCH 0101/1032] Added copy archive from/to container command for (netty) --- .../exec/CopyArchiveFromContainerCmdExec.java | 32 +++++++ .../exec/CopyArchiveToContainerCmdExec.java | 36 +++++++ .../CopyArchiveFromContainerCmdExecTest.java | 73 ++++++++++++++ .../CopyArchiveToContainerCmdExecTest.java | 94 +++++++++++++++++++ 4 files changed, 235 insertions(+) create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExec.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExecTest.java diff --git a/src/main/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExec.java new file mode 100644 index 000000000..6f4a93ba3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExec.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.netty.exec; + +import java.io.InputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class CopyArchiveFromContainerCmdExec extends AbstrSyncDockerCmdExec + implements CopyArchiveFromContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CopyArchiveFromContainerCmdExec.class); + + public CopyArchiveFromContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InputStream execute(CopyArchiveFromContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/archive").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("Get: " + webResource.toString()); + + return webResource.queryParam("path", command.getResource()).request().accept(MediaType.APPLICATION_X_TAR) + .get(); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExec.java new file mode 100644 index 000000000..c956a815d --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.netty.exec; + +import java.io.InputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class CopyArchiveToContainerCmdExec extends AbstrSyncDockerCmdExec implements + CopyArchiveToContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CopyArchiveFromContainerCmdExec.class); + + public CopyArchiveToContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(CopyArchiveToContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/archive").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("PUT: " + webResource.toString()); + InputStream streamToUpload = command.getTarInputStream(); + + webResource.queryParam("path", command.getRemotePath()) + .queryParam("noOverwriteDirNonDir", command.isNoOverwriteDirNonDir()).request() + .put(streamToUpload, MediaType.APPLICATION_X_TAR); + + return null; + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java new file mode 100644 index 000000000..aa4dcc575 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveFromContainerCmdExecTest.java @@ -0,0 +1,73 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.not; + +import java.io.InputStream; +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class CopyArchiveFromContainerCmdExecTest 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 copyFromContainer() throws Exception { + // TODO extract this into a shared method + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withName("docker-java-itest-copyFromContainer").withCmd("touch", "/copyFromContainer").exec(); + + LOG.info("Created container: {}", container); + assertThat(container.getId(), not(isEmptyOrNullString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/copyFromContainer").exec(); + Boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied from the container."); + + // read the stream fully. Otherwise, the underlying stream will not be closed. + String responseAsString = asString(response); + assertNotNull(responseAsString); + assertTrue(responseAsString.length() > 0); + } + + @Test + public void copyFromNonExistingContainer() throws Exception { + try { + dockerClient.copyArchiveFromContainerCmd("non-existing", "/test").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException ignored) { + } + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExecTest.java new file mode 100644 index 000000000..d755dfcba --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CopyArchiveToContainerCmdExecTest.java @@ -0,0 +1,94 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.not; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +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 com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.core.util.CompressArchiveUtil; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class CopyArchiveToContainerCmdExecTest 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 copyFileToContainer() throws Exception { + CreateContainerResponse container = prepareContainerForCopy(); + Path temp = Files.createTempFile("", ".tar.gz"); + CompressArchiveUtil.tar(Paths.get("src/test/resources/testReadFile"), temp, true, false); + try (InputStream uploadStream = Files.newInputStream(temp)) { + dockerClient.copyArchiveToContainerCmd(container.getId()).withTarInputStream(uploadStream).exec(); + assertFileCopied(container); + } + } + + @Test + public void copyStreamToContainer() throws Exception { + CreateContainerResponse container = prepareContainerForCopy(); + dockerClient.copyArchiveToContainerCmd(container.getId()).withHostResource("src/test/resources/testReadFile") + .exec(); + assertFileCopied(container); + } + + private CreateContainerResponse prepareContainerForCopy() { + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withName("docker-java-itest-copyToContainer").exec(); + LOG.info("Created container: {}", container); + assertThat(container.getId(), not(isEmptyOrNullString())); + dockerClient.startContainerCmd(container.getId()).exec(); + // Copy a folder to the container + return container; + } + + private void assertFileCopied(CreateContainerResponse container) throws IOException { + try (InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "testReadFile").exec()) { + boolean bytesAvailable = response.available() > 0; + assertTrue(bytesAvailable, "The file was not copied to the container."); + } + } + + @Test + public void copyToNonExistingContainer() throws Exception { + try { + dockerClient.copyArchiveToContainerCmd("non-existing").withHostResource("src/test/resources/testReadFile") + .exec(); + fail("expected NotFoundException"); + } catch (NotFoundException ignored) { + } + } + +} From ca376d6862d160df16e17b48e37f8a6246e8779b Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 11 Dec 2015 22:18:21 +0100 Subject: [PATCH 0102/1032] Added stdin parameter to attach command api, implemented for netty --- .../api/command/AttachContainerCmd.java | 5 +++ .../core/async/ResultCallbackTemplate.java | 1 - .../core/command/AttachContainerCmdImpl.java | 18 +++++++++ .../jaxrs/AttachContainerCmdExec.java | 5 ++- .../dockerjava/netty/InvocationBuilder.java | 22 +++++------ .../netty/exec/AttachContainerCmdExec.java | 4 +- .../netty/exec/RemoveContainerCmdExec.java | 4 +- .../netty/exec/RemoveImageCmdExec.java | 2 +- .../command/AttachContainerCmdImplTest.java | 29 +++++++++++++++ .../exec/AttachContainerCmdExecTest.java | 37 +++++++++++++++++++ 10 files changed, 109 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java index 13979fb8b..6326fa13b 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -43,6 +43,9 @@ public interface AttachContainerCmd extends AsyncDockerCmd { 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 4db4edcea..44af625af 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -63,7 +63,6 @@ public void onError(Throwable throwable) { @Override public void onComplete() { - System.err.println("callback onComplete"); try { close(); } catch (IOException e) { diff --git a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java index 629990ff1..89e27c8ea 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -2,6 +2,8 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.io.InputStream; + import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.model.Frame; @@ -17,6 +19,8 @@ * - true or false, includes stdout log. Defaults to false. * @param stderr * - true or false, includes stderr log. Defaults to false. + * @param stdin + * - null or {@link InputStream}, pass stream to stdin of the container. * @param timestamps * - true or false, if true, print timestamps for every log line. Defaults to false. */ @@ -27,6 +31,8 @@ public class AttachContainerCmdImpl extends AbstrAsyncDockerCmd callbackNotifier(AttachContainerCmd command, ResultCallback resultCallback) { + if (command.getStdin() != null) + throw new UnsupportedOperationException( + "Passing stdin to the container is currently not supported. Try experimental netty engine!"); + WebTarget webTarget = getBaseResource().path("/containers/{id}/attach").resolveTemplate("id", command.getContainerId()); webTarget = booleanQueryParam(webTarget, "logs", command.hasLogsEnabled()); webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); - // webTarget = booleanQueryParam(webTarget, "stdin", command.hasStdinEnabled()); webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); webTarget = booleanQueryParam(webTarget, "stream", command.hasFollowStreamEnabled()); diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index c49328c2a..8b6688ca6 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -86,7 +86,7 @@ public InvocationBuilder header(String name, String value) { return this; } - public ResponseCallback delete() { + public void delete() { HttpRequestProvider requestProvider = httpDeleteRequestProvider(); @@ -100,7 +100,7 @@ public ResponseCallback delete() { sendRequest(requestProvider, channel); - return callback; + callback.awaitResult(); } public void get(ResultCallback resultCallback) { @@ -134,7 +134,7 @@ public void get(TypeReference typeReference, ResultCallback resultCall Channel channel = getChannel(); - resultCallbackOnStart(channel, resultCallback); + initCallback(channel, resultCallback); JsonResponseCallbackHandler jsonResponseHandler = new JsonResponseCallbackHandler(typeReference, resultCallback); @@ -276,7 +276,7 @@ public void post(final Object entity, TypeReference typeReference, final Channel channel = getChannel(); - resultCallbackOnStart(channel, resultCallback); + initCallback(channel, resultCallback); JsonResponseCallbackHandler jsonResponseHandler = new JsonResponseCallbackHandler(typeReference, resultCallback); @@ -292,12 +292,11 @@ public void post(final Object entity, TypeReference typeReference, final return; } - private void resultCallbackOnStart(final Channel channel, final ResultCallback resultCallback) { + private void initCallback(final Channel channel, final ResultCallback resultCallback) { Closeable closeable = new Closeable() { @Override public void close() throws IOException { try { - System.err.println("closing channel"); channel.close().sync(); } catch (InterruptedException e) { resultCallback.onError(e); @@ -327,14 +326,14 @@ private FullHttpRequest prepareGetRequest(String uri) { } private HttpRequest preparePostRequest(String uri, Object entity) { - return prepareRequest(uri, entity, HttpMethod.POST); + return prepareEntityRequest(uri, entity, HttpMethod.POST); } private HttpRequest preparePutRequest(String uri, Object entity) { - return prepareRequest(uri, entity, HttpMethod.PUT); + return prepareEntityRequest(uri, entity, HttpMethod.PUT); } - private HttpRequest prepareRequest(String uri, Object entity, HttpMethod httpMethod) { + private HttpRequest prepareEntityRequest(String uri, Object entity, HttpMethod httpMethod) { HttpRequest request = null; @@ -404,7 +403,7 @@ public void post(TypeReference typeReference, ResultCallback resultCal Channel channel = getChannel(); - resultCallbackOnStart(channel, resultCallback); + initCallback(channel, resultCallback); JsonResponseCallbackHandler jsonResponseHandler = new JsonResponseCallbackHandler(typeReference, resultCallback); @@ -440,7 +439,7 @@ public InputStream get() { ResponseCallback resultCallback = new ResponseCallback(); - resultCallbackOnStart(channel, resultCallback); + initCallback(channel, resultCallback); HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); @@ -482,6 +481,5 @@ public void put(InputStream body, MediaType mediaType) { channel.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT); resultCallback.awaitResult(); - }; } diff --git a/src/main/java/com/github/dockerjava/netty/exec/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/AttachContainerCmdExec.java index 76cec4272..2fdace48a 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/AttachContainerCmdExec.java @@ -26,13 +26,13 @@ protected Void execute0(AttachContainerCmd command, ResultCallback result webTarget = booleanQueryParam(webTarget, "logs", command.hasLogsEnabled()); webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); - // webTarget = booleanQueryParam(webTarget, "stdin", command.hasStdinEnabled()); webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); + webTarget = booleanQueryParam(webTarget, "stdin", command.getStdin() != null); webTarget = booleanQueryParam(webTarget, "stream", command.hasFollowStreamEnabled()); LOGGER.trace("POST: {}", webTarget); - webTarget.request().post(null, System.in, resultCallback); + webTarget.request().post(null, command.getStdin(), resultCallback); return null; } diff --git a/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java index bf3a3a56b..63d16bda6 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/RemoveContainerCmdExec.java @@ -25,7 +25,9 @@ protected Void execute(RemoveContainerCmd command) { webTarget = booleanQueryParam(webTarget, "force", command.hasForceEnabled()); LOGGER.trace("DELETE: {}", webTarget); - return webTarget.request().accept(MediaType.APPLICATION_JSON).delete().awaitResult(); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete(); + + return null; } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/RemoveImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RemoveImageCmdExec.java index d4e0e212a..35ae053d3 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/RemoveImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/RemoveImageCmdExec.java @@ -23,7 +23,7 @@ protected Void execute(RemoveImageCmd command) { webTarget = booleanQueryParam(webTarget, "noprune", command.hasNoPruneEnabled()); LOGGER.trace("DELETE: {}", webTarget); - webTarget.request().delete().awaitResult(); + webTarget.request().delete(); return null; } 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 ead8ad39e..be2d5fdd0 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -5,7 +5,9 @@ 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.lang.reflect.Method; import java.util.concurrent.TimeUnit; @@ -104,6 +106,33 @@ public void onNext(Frame frame) { assertThat(callback.toString(), containsString("stdout\r\nstderr")); } + @Test(expectedExceptions = UnsupportedOperationException.class) + public void attachContainerStdinUnsupported() throws Exception { + + String snippet = "hello world"; + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("echo", snippet) + .withTty(false).exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + AttachContainerTestCallback callback = new AttachContainerTestCallback() { + @Override + public void onNext(Frame frame) { + assertEquals(frame.getStreamType(), StreamType.STDOUT); + super.onNext(frame); + }; + }; + + InputStream stdin = new ByteArrayInputStream("".getBytes()); + + dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true) + .withLogs(true).withStdIn(stdin).exec(callback).awaitCompletion(30, TimeUnit.SECONDS).close(); + } + public static class AttachContainerTestCallback extends AttachContainerResultCallback { private StringBuffer log = new StringBuffer(); 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 06f33d00e..08daa7e6f 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java @@ -5,7 +5,9 @@ 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.lang.reflect.Method; import java.util.concurrent.TimeUnit; @@ -17,6 +19,7 @@ import org.testng.annotations.Test; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.StreamType; import com.github.dockerjava.core.command.AttachContainerResultCallback; @@ -72,6 +75,40 @@ public void onNext(Frame frame) { assertThat(callback.toString(), containsString(snippet)); } + @Test + 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(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + 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) + .withStdIn(stdin).exec(callback).awaitCompletion(2, TimeUnit.SECONDS).close(); + + assertThat(callback.toString(), containsString(snippet)); + } + @Test public void attachContainerWithTTY() throws Exception { From feb93a41658067105a60a9b5f05a923e80be14ca Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 11 Dec 2015 22:20:58 +0100 Subject: [PATCH 0103/1032] Removed println() debugging --- .../java/com/github/dockerjava/core/command/FrameReader.java | 4 +--- .../dockerjava/netty/exec/AttachContainerCmdExecTest.java | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index ff1a9d7ea..0e885082a 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -67,7 +67,7 @@ public Frame readFrame() throws IOException { } while (actualHeaderSize < HEADER_SIZE); // HexDump.dump(header, 0, System.err, 0); - + StreamType streamType = streamType(header[0]); if (streamType.equals(StreamType.RAW)) { @@ -77,8 +77,6 @@ public Frame readFrame() throws IOException { int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff); - - //System.out.println("payload size: " + payloadSize); byte[] payload = new byte[payloadSize]; int actualPayloadSize = 0; 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 08daa7e6f..fe34aa537 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/AttachContainerCmdExecTest.java @@ -135,8 +135,6 @@ public void onNext(Frame frame) { dockerClient.attachContainerCmd(container.getId()).withStdErr(true).withStdOut(true).withFollowStream(true) .exec(callback).awaitCompletion(10, TimeUnit.SECONDS).close(); - System.out.println("log: " + callback.toString()); - // HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); assertThat(callback.toString(), containsString("stdout\r\nstderr")); From 8039e18dfb12d9c1412d7e90c1c47d96ac4c28dd Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 12 Dec 2015 20:13:53 +0100 Subject: [PATCH 0104/1032] Code cleanup --- .../api/command/AsyncDockerCmd.java | 2 +- .../api/command/TopContainerResponse.java | 2 +- .../dockerjava/api/model/RestartPolicy.java | 2 +- .../dockerjava/core/DockerClientConfig.java | 3 +- .../core/async/FrameStreamProcessor.java | 2 +- .../core/async/JsonStreamProcessor.java | 2 +- .../core/async/ResponseStreamProcessor.java | 2 +- .../core/async/ResultCallbackTemplate.java | 2 +- .../AttachContainerResultCallback.java | 2 +- .../command/BuildImageResultCallback.java | 2 +- .../core/command/EventsResultCallback.java | 2 +- .../core/command/ExecStartResultCallback.java | 6 +- .../command/LogContainerResultCallback.java | 2 +- .../core/command/PullImageResultCallback.java | 2 +- .../core/command/PushImageResultCallback.java | 2 +- .../command/WaitContainerResultCallback.java | 2 +- .../jaxrs/async/GETCallbackNotifier.java | 2 +- .../jaxrs/async/POSTCallbackNotifier.java | 2 +- .../ApacheConnectorClientResponse.java | 2 +- .../filter/ResponseStatusExceptionFilter.java | 2 +- .../util/WrappedResponseInputStream.java | 2 +- .../dockerjava/netty/ChannelProvider.java | 4 +- .../netty/DockerCmdExecFactoryImpl.java | 6 +- .../dockerjava/netty/InvocationBuilder.java | 6 +- .../netty/exec/ContainerDiffCmdExec.java | 2 +- .../dockerjava/netty/exec/InfoCmdExec.java | 7 +- .../netty/exec/InspectContainerCmdExec.java | 2 +- .../netty/exec/InspectExecCmdExec.java | 2 +- .../netty/exec/InspectImageCmdExec.java | 2 +- .../netty/exec/ListContainersCmdExec.java | 2 +- .../netty/exec/ListImagesCmdExec.java | 6 +- .../netty/exec/LogContainerCmdExec.java | 1 - .../netty/exec/SearchImagesCmdExec.java | 2 +- .../netty/exec/TopContainerCmdExec.java | 2 +- .../dockerjava/netty/exec/VersionCmdExec.java | 2 +- .../handler/FramedResponseStreamHandler.java | 16 +- .../handler/HttpConnectionHijackHandler.java | 2 +- .../netty/handler/HttpRequestProvider.java | 3 +- .../handler/HttpResponseStreamHandler.java | 14 +- .../dockerjava/core/NameParserTest.java | 2 +- .../core/TestDockerCmdExecFactory.java | 2 +- .../netty/AbstractNettyDockerClientTest.java | 209 ------------------ 42 files changed, 64 insertions(+), 277 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java index 78ee978fa..221d3d165 100644 --- a/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java @@ -8,7 +8,7 @@ /** * * - * @author marcus + * @author Marcus Linke * */ public interface AsyncDockerCmd, A_RES_T> extends DockerCmd { diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java index 8864167f3..cd6da6814 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java @@ -6,7 +6,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ @JsonIgnoreProperties(ignoreUnknown = true) 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 cd437667f..34f8e7e57 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -24,7 +24,7 @@ *

* * - * @author marcus + * @author Marcus Linke * */ public class RestartPolicy { diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 618309fd6..fa5c77e6a 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -346,7 +346,7 @@ public String toString() { public static class DockerClientConfigBuilder { private URI uri; - private String version, username, password, email, serverAddress, dockerCfgPath, dockerCertPath; + private String version, username, password, email, serverAddress, dockerCfgPath; private SSLConfig sslConfig; @@ -401,7 +401,6 @@ public DockerClientConfigBuilder withServerAddress(String serverAddress) { public final DockerClientConfigBuilder withDockerCertPath(String dockerCertPath) { if (dockerCertPath != null) { this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); - this.dockerCertPath = dockerCertPath; } return this; } diff --git a/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java index 220cd80ef..3070930d6 100644 --- a/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/FrameStreamProcessor.java @@ -13,7 +13,7 @@ /** * * - * @author marcus + * @author Marcus Linke * */ public class FrameStreamProcessor implements ResponseStreamProcessor { diff --git a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java index 522d5b189..7e6c497e6 100644 --- a/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/JsonStreamProcessor.java @@ -14,7 +14,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class JsonStreamProcessor implements ResponseStreamProcessor { diff --git a/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java b/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java index 879a8c305..5c93801d3 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java +++ b/src/main/java/com/github/dockerjava/core/async/ResponseStreamProcessor.java @@ -9,7 +9,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public interface ResponseStreamProcessor { 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 44af625af..3a62ae46a 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -19,7 +19,7 @@ /** * Abstract template implementation of {@link ResultCallback} * - * @author marcus + * @author Marcus Linke * */ public abstract class ResultCallbackTemplate, A_RES_T> implements diff --git a/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java index 2822b8e48..f16b20301 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java @@ -11,7 +11,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class AttachContainerResultCallback extends ResultCallbackTemplate { 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 2463f8b1d..06c6b1e51 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java @@ -16,7 +16,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class BuildImageResultCallback extends ResultCallbackTemplate { diff --git a/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java b/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java index 29efac6ca..c731b863e 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java @@ -11,7 +11,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class EventsResultCallback extends ResultCallbackTemplate { diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java index dda336807..ebf1d08a1 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java @@ -1,6 +1,3 @@ -/* - * Created on 21.07.2015 - */ package com.github.dockerjava.core.command; import java.io.IOException; @@ -14,7 +11,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class ExecStartResultCallback extends ResultCallbackTemplate { @@ -32,7 +29,6 @@ public ExecStartResultCallback() { this(null, null); } - @Override public void onNext(Frame frame) { if (frame != null) { diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java index ffe46baf8..b7fc81cb2 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java @@ -11,7 +11,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class LogContainerResultCallback extends ResultCallbackTemplate { diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java index 5416d0537..27be12215 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java @@ -14,7 +14,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class PullImageResultCallback extends ResultCallbackTemplate { diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java index 8f08f3e15..65ec93c88 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java @@ -14,7 +14,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class PushImageResultCallback extends ResultCallbackTemplate { diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java index 5af956cf2..5416d124c 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java @@ -16,7 +16,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class WaitContainerResultCallback extends ResultCallbackTemplate { diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java index 996696479..e6f4fd1d2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java +++ b/src/main/java/com/github/dockerjava/jaxrs/async/GETCallbackNotifier.java @@ -11,7 +11,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class GETCallbackNotifier extends AbstractCallbackNotifier { diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java index 9fe848950..bd96e8250 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java +++ b/src/main/java/com/github/dockerjava/jaxrs/async/POSTCallbackNotifier.java @@ -12,7 +12,7 @@ /** * - * @author marcus + * @author Marcus Linke * */ public class POSTCallbackNotifier extends AbstractCallbackNotifier { diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java index a4d68e202..d358f574a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java @@ -14,7 +14,7 @@ * * https://java.net/jira/browse/JERSEY-2852 * - * @author marcus + * @author Marcus Linke * */ public class ApacheConnectorClientResponse extends ClientResponse { diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java index e597b594b..e119c7303 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java @@ -24,7 +24,7 @@ /** * This {@link ClientResponseFilter} implementation detects http status codes and throws {@link DockerException}s * - * @author marcus + * @author Marcus Linke * */ public class ResponseStatusExceptionFilter implements ClientResponseFilter { 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 05d4f9066..14072ba55 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java @@ -10,7 +10,7 @@ * {@link WrappedResponseInputStream} is closed it closes the underlying {@link Response} object also to prevent * blocking/hanging connections. * - * @author marcus + * @author Marcus Linke */ public class WrappedResponseInputStream extends InputStream { diff --git a/src/main/java/com/github/dockerjava/netty/ChannelProvider.java b/src/main/java/com/github/dockerjava/netty/ChannelProvider.java index a868f1cd1..49cefe9d5 100644 --- a/src/main/java/com/github/dockerjava/netty/ChannelProvider.java +++ b/src/main/java/com/github/dockerjava/netty/ChannelProvider.java @@ -3,5 +3,5 @@ import io.netty.channel.Channel; public interface ChannelProvider { - Channel getChannel(); -} + Channel getChannel(); +} \ No newline at end of file diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java index 4ac044ac6..570f8a663 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -115,7 +115,7 @@ * 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 * - * @author marcus + * @author Marcus Linke * */ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @@ -154,7 +154,7 @@ public void init(DockerClientConfig dockerClientConfig) { nettyInitializer = new InetSocketInitializer(); } - nettyInitializer.init(bootstrap, dockerClientConfig); + eventLoopGroup = nettyInitializer.init(bootstrap, dockerClientConfig); } private Channel connect() { @@ -169,7 +169,7 @@ private Channel connect(final Bootstrap bootstrap) throws InterruptedException { return nettyInitializer.connect(bootstrap); } - private static interface NettyInitializer { + private interface NettyInitializer { EventLoopGroup init(final Bootstrap bootstrap, DockerClientConfig dockerClientConfig); Channel connect(final Bootstrap bootstrap) throws InterruptedException; diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index 8b6688ca6..68516100a 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -119,13 +119,13 @@ public void get(ResultCallback resultCallback) { sendRequest(requestProvider, channel); } - public ResponseCallback get(TypeReference typeReference) { + public T get(TypeReference typeReference) { ResponseCallback callback = new ResponseCallback(); get(typeReference, callback); - return callback; + return callback.awaitResult(); } public void get(TypeReference typeReference, ResultCallback resultCallback) { @@ -228,7 +228,7 @@ public void post(final Object entity, final InputStream stdin, ResultCallback execute(ContainerDiffCmd command) { LOGGER.trace("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference>() { - }).awaitResult(); + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java index 1db090ae6..288765650 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java @@ -14,7 +14,7 @@ * 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 * - * @author marcus + * @author Marcus Linke * */ public class InfoCmdExec implements InfoCmd.Exec { @@ -23,17 +23,14 @@ public class InfoCmdExec implements InfoCmd.Exec { private WebTarget webResource; - private DockerClientConfig dockerClientConfig; - public InfoCmdExec(WebTarget webResource, DockerClientConfig dockerClientConfig) { this.webResource = webResource; - this.dockerClientConfig = dockerClientConfig; } @Override public Info exec(InfoCmd command) { return webResource.path("info").request().get(new TypeReference() { - }).awaitResult(); + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java index 85b391a20..e8f691ba1 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectContainerCmdExec.java @@ -27,7 +27,7 @@ protected InspectContainerResponse execute(InspectContainerCmd command) { LOGGER.debug("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON) .get(new TypeReference() { - }).awaitResult(); + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java index aac395d32..ee913f369 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectExecCmdExec.java @@ -25,6 +25,6 @@ protected InspectExecResponse execute(InspectExecCmd command) { LOGGER.debug("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { - }).awaitResult(); + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java index b6f42414d..b86072ecb 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectImageCmdExec.java @@ -26,7 +26,7 @@ protected InspectImageResponse execute(InspectImageCmd command) { LOGGER.trace("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { - }).awaitResult(); + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java index fe08c507d..b45e76cbd 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java @@ -44,7 +44,7 @@ protected List execute(ListContainersCmd command) { List containers = webTarget.request().accept(MediaType.APPLICATION_JSON) .get(new TypeReference>() { - }).awaitResult(); + }); LOGGER.trace("Response: {}", containers); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java index b27bfcf8b..4ca65a061 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java @@ -28,18 +28,18 @@ protected List execute(ListImagesCmd command) { webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); - if (command.getFilters() != null) + if (command.getFilters() != null) { webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + } LOGGER.trace("GET: {}", webTarget); List images = webTarget.request().accept(MediaType.APPLICATION_JSON) .get(new TypeReference>() { - }).awaitResult(); + }); LOGGER.trace("Response: {}", images); return images; } - } diff --git a/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java index 4135f7308..911780362 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java @@ -44,5 +44,4 @@ protected Void execute0(LogContainerCmd command, ResultCallback resultCal return null; } - } diff --git a/src/main/java/com/github/dockerjava/netty/exec/SearchImagesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/SearchImagesCmdExec.java index b1ff7b10c..d31d00a9f 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/SearchImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/SearchImagesCmdExec.java @@ -27,7 +27,7 @@ protected List execute(SearchImagesCmd command) { LOGGER.trace("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference>() { - }).awaitResult(); + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java index 9b04e6c7d..07ec12b03 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java @@ -30,7 +30,7 @@ protected TopContainerResponse execute(TopContainerCmd command) { LOGGER.trace("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { - }).awaitResult(); + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/VersionCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/VersionCmdExec.java index 4d2bf936e..84857c208 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/VersionCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/VersionCmdExec.java @@ -24,7 +24,7 @@ protected Version execute(VersionCmd command) { LOGGER.trace("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { - }).awaitResult(); + }); } } diff --git a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java index 5974f407f..c1b6a4812 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java @@ -62,10 +62,12 @@ private Frame decode() { if (headerCount == 0) { return null; } + headerCnt += headerCount; - if (headerCnt < HEADER_SIZE) + if (headerCnt < HEADER_SIZE) { return null; + } streamType = streamType(header[0]); @@ -81,8 +83,9 @@ private Frame decode() { int count = read(payload, payloadCnt, rawBuffer.readableBytes()); - if (count == 0) + if (count == 0) { return null; + } payloadCnt = 0; @@ -92,18 +95,21 @@ private Frame decode() { int payloadSize = ((header[4] & 0xff) << 24) + ((header[5] & 0xff) << 16) + ((header[6] & 0xff) << 8) + (header[7] & 0xff); - if (payloadCnt == 0) + if (payloadCnt == 0) { payload = new byte[payloadSize]; + } int count = read(payload, payloadCnt, payloadSize - payloadCnt); - if (count == 0) + if (count == 0) { return null; + } payloadCnt += count; - if (payloadCnt < payloadSize) + if (payloadCnt < payloadSize) { return null; + } headerCnt = 0; payloadCnt = 0; diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java index 0b0135d7e..3010682f6 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpConnectionHijackHandler.java @@ -36,7 +36,7 @@ public CharSequence protocol() { return "tcp"; } - public void await() { + public void awaitUpgrade() { try { latch.await(); } catch (InterruptedException e) { diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpRequestProvider.java b/src/main/java/com/github/dockerjava/netty/handler/HttpRequestProvider.java index 9777a1098..0d861cc01 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpRequestProvider.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpRequestProvider.java @@ -3,7 +3,6 @@ import io.netty.handler.codec.http.HttpRequest; public interface HttpRequestProvider { - - HttpRequest getHttpRequest(String uri); + public HttpRequest getHttpRequest(String uri); } 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 0cda2de81..59dc8929e 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java @@ -56,10 +56,12 @@ public int available() throws IOException { } private int readableBytes() { - if (current != null) + if (current != null) { return current.readableBytes(); - else + } else { return 0; + } + } @Override @@ -68,8 +70,9 @@ public int read() throws IOException { poll(); if (readableBytes() == 0) { - if (closed.get()) + if (closed.get()) { return -1; + } } if (current != null && current.readableBytes() > 0) { @@ -77,7 +80,6 @@ public int read() throws IOException { } else { return read(); } - } private void poll() { @@ -89,7 +91,5 @@ private void poll() { } } } - } - -} +} \ No newline at end of file diff --git a/src/test/java/com/github/dockerjava/core/NameParserTest.java b/src/test/java/com/github/dockerjava/core/NameParserTest.java index afae80ebb..865f9a401 100644 --- a/src/test/java/com/github/dockerjava/core/NameParserTest.java +++ b/src/test/java/com/github/dockerjava/core/NameParserTest.java @@ -16,7 +16,7 @@ /** * * - * @author marcus + * @author Marcus Linke * */ public class NameParserTest { diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index d1ff920b0..4a96e664f 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -53,7 +53,7 @@ * Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution * for the purpose of automatically cleanup. * - * @author marcus + * @author Marcus Linke */ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { diff --git a/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java b/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java index 7f2b83f4d..6dcb435f1 100644 --- a/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java @@ -1,39 +1,10 @@ package com.github.dockerjava.netty; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; -import java.lang.reflect.Method; -import java.net.DatagramSocket; -import java.net.ServerSocket; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.LineIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.testng.Assert; -import org.testng.ITestResult; -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.exception.DockerException; -import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.model.Frame; -import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumeBind; import com.github.dockerjava.client.AbstractDockerClientTest; -import com.github.dockerjava.core.DockerClientBuilder; -import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.TestDockerCmdExecFactory; -import com.github.dockerjava.core.command.BuildImageResultCallback; -import com.github.dockerjava.core.command.LogContainerResultCallback; -import com.github.dockerjava.core.command.PullImageResultCallback; -import com.google.common.base.Joiner; public abstract class AbstractNettyDockerClientTest extends AbstractDockerClientTest { @@ -44,184 +15,4 @@ protected TestDockerCmdExecFactory initTestDockerCmdExecFactory() { return new TestDockerCmdExecFactory( new DockerCmdExecFactoryImpl()); } -// -// protected TestDockerCmdExecFactory dockerCmdExecFactory = -// -// public void beforeTest() throws Exception { -// -// LOG.info("======================= BEFORETEST ======================="); -// LOG.info("Connecting to Docker server"); -// dockerClient = DockerClientBuilder.getInstance(config()).withDockerCmdExecFactory(dockerCmdExecFactory).build(); -// -//// LOG.info("Pulling image 'busybox'"); -//// -//// // need to block until image is pulled completely -//// dockerClient.pullImageCmd("busybox").withTag("latest").exec(new PullImageResultCallback()).awaitSuccess(); -// -// assertNotNull(dockerClient); -// LOG.info("======================= END OF BEFORETEST =======================\n\n"); -// } -// -// private DockerClientConfig config() { -// return config(null); -// } -// -// protected DockerClientConfig config(String password) { -// DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder() -// .withServerAddress("https://index.docker.io/v1/"); -// if (password != null) { -// builder = builder.withPassword(password); -// } -// -// return builder.withVersion(apiVersion).build(); -// } -// -// public void afterTest() { -// LOG.info("======================= END OF AFTERTEST ======================="); -// } -// -// public void beforeMethod(Method method) { -// LOG.info(String.format("################################## STARTING %s ##################################", -// method.getName())); -// } -// -// public void afterMethod(ITestResult result) { -// -// for (String container : dockerCmdExecFactory.getContainerNames()) { -// LOG.info("Cleaning up temporary container {}", container); -// -// try { -// dockerClient.removeContainerCmd(container).withForce(true).exec(); -// } catch (DockerException ignore) { -// // ignore.printStackTrace(); -// } -// } -// -// for (String image : dockerCmdExecFactory.getImageNames()) { -// LOG.info("Cleaning up temporary image with {}", image); -// try { -// dockerClient.removeImageCmd(image).withForce(true).exec(); -// } catch (DockerException ignore) { -// // ignore.printStackTrace(); -// } -// } -// -// LOG.info("################################## END OF {} ##################################\n", result.getName()); -// } -// -// protected String asString(InputStream response) { -// return consumeAsString(response); -// } -// -// public static String consumeAsString(InputStream response) { -// -// StringWriter logwriter = new StringWriter(); -// -// try { -// LineIterator itr = IOUtils.lineIterator(response, "UTF-8"); -// -// while (itr.hasNext()) { -// String line = itr.next(); -// logwriter.write(line + (itr.hasNext() ? "\n" : "")); -// LOG.info("line: " + line); -// } -// response.close(); -// -// return logwriter.toString(); -// } catch (IOException e) { -// throw new RuntimeException(e); -// } finally { -// IOUtils.closeQuietly(response); -// } -// } -// -// // UTIL -// -// /** -// * Checks to see if a specific port is available. -// * -// * @param port -// * the port to check for availability -// */ -// public static Boolean available(int port) { -// if (port < 1100 || port > 60000) { -// throw new IllegalArgumentException("Invalid start port: " + port); -// } -// -// ServerSocket ss = null; -// DatagramSocket ds = null; -// try { -// ss = new ServerSocket(port); -// ss.setReuseAddress(true); -// ds = new DatagramSocket(port); -// ds.setReuseAddress(true); -// return true; -// } catch (IOException ignored) { -// } finally { -// if (ds != null) { -// ds.close(); -// } -// -// if (ss != null) { -// try { -// ss.close(); -// } catch (IOException e) { -// /* should not be thrown */ -// } -// } -// } -// -// return false; -// } -// -// /** -// * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) has {@link VolumeBind}s for -// * the given {@link Volume}s -// */ -// public static void assertContainerHasVolumes(InspectContainerResponse inspectContainerResponse, -// Volume... expectedVolumes) { -// VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); -// LOG.info("Inspect .Volumes = [{}]", Joiner.on(", ").join(volumeBinds)); -// -// List volumes = new ArrayList(); -// for (VolumeBind bind : volumeBinds) { -// volumes.add(new Volume(bind.getContainerPath())); -// } -// assertThat(volumes, contains(expectedVolumes)); -// } -// -// protected String containerLog(String containerId) throws Exception { -// return dockerClient.logContainerCmd(containerId).withStdOut(true).exec(new LogContainerTestCallback()) -// .awaitCompletion().toString(); -// } -// -// public static class LogContainerTestCallback extends LogContainerResultCallback { -// protected final StringBuffer log = new StringBuffer(); -// -// @Override -// public void onNext(Frame frame) { -// log.append(new String(frame.getPayload())); -// super.onNext(frame); -// } -// -// @Override -// public String toString() { -// return log.toString(); -// } -// -// @Override -// public LogContainerResultCallback awaitCompletion() throws InterruptedException { -// LogContainerResultCallback result = super.awaitCompletion(); -// System.err.println("awaitCompletion returned"); -// -// return result; -// } -// } -// -// protected String buildImage(File baseDir) throws Exception { -// -// return dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()) -// .awaitImageId(); -// } - } From d5dbb5de459809fdf90467a67ffd07b5595725ed Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 14 Dec 2015 21:04:01 +0100 Subject: [PATCH 0105/1032] Added some javadoc --- .../netty/DockerCmdExecFactoryImpl.java | 25 +++++--- .../dockerjava/netty/InvocationBuilder.java | 6 ++ .../github/dockerjava/netty/MediaType.java | 6 ++ .../github/dockerjava/netty/WebTarget.java | 6 ++ .../handler/FramedResponseStreamHandler.java | 9 +++ .../netty/handler/HttpResponseHandler.java | 6 ++ .../handler/HttpResponseStreamHandler.java | 5 ++ .../netty/handler/JsonRequestHandler.java | 5 ++ .../handler/JsonResponseCallbackHandler.java | 5 ++ .../netty/handler/JsonResponseHandler.java | 62 ------------------- 10 files changed, 65 insertions(+), 70 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/netty/handler/JsonResponseHandler.java diff --git a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java index 570f8a663..865389fef 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -27,8 +27,6 @@ import javax.net.ssl.SSLParameters; import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.AuthCmd; @@ -70,6 +68,7 @@ import com.github.dockerjava.api.command.VersionCmd; import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.DockerClientImpl; import com.github.dockerjava.netty.exec.AttachContainerCmdExec; import com.github.dockerjava.netty.exec.AuthCmdExec; import com.github.dockerjava.netty.exec.BuildImageCmdExec; @@ -110,17 +109,27 @@ import com.github.dockerjava.netty.exec.WaitContainerCmdExec; /** - * 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 + * Experimental implementation of {@link DockerCmdExecFactory} that supports http connection hijacking that is needed to + * pass STDIN to the container. * - * @author Marcus Linke + * 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 DockerCmdExecFactoryImpl implements DockerCmdExecFactory { - private static final Logger LOGGER = LoggerFactory.getLogger(DockerCmdExecFactoryImpl.class.getName()); + /* + * 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; diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index 68516100a..a478cf6c1 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -45,6 +45,12 @@ import com.github.dockerjava.netty.handler.HttpResponseStreamHandler; import com.github.dockerjava.netty.handler.JsonResponseCallbackHandler; +/** + * This class is basically a replacement of javax.ws.rs.client.Invocation.Builder to allow simpler + * migration of JAX-RS code to a netty based implementation. + * + * @author Marcus Linke + */ public class InvocationBuilder { public class ResponseCallback extends ResultCallbackTemplate, T> { diff --git a/src/main/java/com/github/dockerjava/netty/MediaType.java b/src/main/java/com/github/dockerjava/netty/MediaType.java index 3341f4a46..a7738604a 100644 --- a/src/main/java/com/github/dockerjava/netty/MediaType.java +++ b/src/main/java/com/github/dockerjava/netty/MediaType.java @@ -1,5 +1,11 @@ package com.github.dockerjava.netty; +/** + * This class is basically a replacement of javax.ws.rs.core.MediaType to allow simpler + * migration of JAX-RS code to a netty based implementation. + * + * @author Marcus Linke + */ public enum MediaType { APPLICATION_JSON("application/json"), diff --git a/src/main/java/com/github/dockerjava/netty/WebTarget.java b/src/main/java/com/github/dockerjava/netty/WebTarget.java index 4362ccab9..7698858a3 100644 --- a/src/main/java/com/github/dockerjava/netty/WebTarget.java +++ b/src/main/java/com/github/dockerjava/netty/WebTarget.java @@ -8,6 +8,12 @@ import org.apache.commons.lang.StringUtils; +/** + * 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. + * + * @author Marcus Linke + */ public class WebTarget { private ChannelProvider channelProvider; diff --git a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java index c1b6a4812..87878f0da 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java @@ -9,6 +9,15 @@ import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.StreamType; +/** + * Handler that decodes a docker-raw-stream as described here: + * + * https://docs.docker.com/engine/reference/api/docker_remote_api_v1.21/#attach-to-a-container + * + * It drives the {@link ResultCallback#onNext(Object)} method of the passed {@link ResultCallback}. + * + * @author Marcus Linke + */ public class FramedResponseStreamHandler extends SimpleChannelInboundHandler { private static final int HEADER_SIZE = 8; diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java index d5306ba26..2f11ccf38 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java @@ -23,6 +23,12 @@ import com.github.dockerjava.api.exception.NotModifiedException; import com.github.dockerjava.api.exception.UnauthorizedException; +/** + * Handler that is responsible to handle an incoming {@link HttpResponse}. It evaluates the status code and + * triggers the appropriate lifecycle methods at the passed {@link ResultCallback}. + * + * @author Marcus Linke + */ public class HttpResponseHandler extends SimpleChannelInboundHandler { private HttpResponse response; 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 59dc8929e..b3800be56 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java @@ -12,6 +12,11 @@ import com.github.dockerjava.api.async.ResultCallback; +/** + * Handler that converts an incoming byte stream to an {@link InputStream}. + * + * @author marcus + */ public class HttpResponseStreamHandler extends SimpleChannelInboundHandler { private HttpResponseInputStream stream = new HttpResponseInputStream(); diff --git a/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java b/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java index 4340e1a38..54ffb2f96 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java @@ -6,6 +6,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; +/** + * Handler that encodes an outgoing object to JSON. + * + * @author Marcus Linke + */ public class JsonRequestHandler extends MessageToByteEncoder{ private ObjectMapper mapper = new ObjectMapper(); diff --git a/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java b/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java index 614508a81..b5f76ab73 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/JsonResponseCallbackHandler.java @@ -8,6 +8,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.async.ResultCallback; +/** + * Handler that decodes an incoming byte stream into objects of T and calls {@link ResultCallback#onNext(Object)} + * + * @author Marcus Linke + */ public class JsonResponseCallbackHandler extends SimpleChannelInboundHandler { private static ObjectMapper objectMapper = new ObjectMapper(); diff --git a/src/main/java/com/github/dockerjava/netty/handler/JsonResponseHandler.java b/src/main/java/com/github/dockerjava/netty/handler/JsonResponseHandler.java deleted file mode 100644 index efbd74f1f..000000000 --- a/src/main/java/com/github/dockerjava/netty/handler/JsonResponseHandler.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.github.dockerjava.netty.handler; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; - -import java.util.concurrent.CountDownLatch; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class JsonResponseHandler extends SimpleChannelInboundHandler { - - private static ObjectMapper objectMapper = new ObjectMapper(); - - private TypeReference typeReference; - - private CountDownLatch countDownLatch = new CountDownLatch(1); - - private T object; - - public JsonResponseHandler(TypeReference typeReference) { - this.typeReference = typeReference; - } - - @Override - protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { - System.err.println("AwaitObjectInboundHandler: channelRead0: " + msg); - byte[] buffer = new byte[msg.readableBytes()]; - msg.readBytes(buffer); - - try { - object = objectMapper.readValue(buffer, typeReference); - } catch (Exception e) { - throw new RuntimeException(e); - } - - countDownLatch.countDown(); - } - - @Override - public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { - System.err.println("AwaitObjectInboundHandler: channelReadComplete"); - super.channelReadComplete(ctx); - } - - public T await() { - try { - countDownLatch.await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return object; - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - -} From 60e021bb5078e0678769094c6e150f03c25242df Mon Sep 17 00:00:00 2001 From: Simon Webb Date: Thu, 5 Nov 2015 11:24:41 +0000 Subject: [PATCH 0106/1032] Added override for bulk-read variant of InputStream.read() in anonymous inner class created by Dockerfile.ScannedResult.buildDockerFolderTar(). This fixes an IO performance issue that occurs when only the single-byte variant of the read() method on InputStream is overriden. --- .../com/github/dockerjava/core/dockerfile/Dockerfile.java | 5 +++++ 1 file changed, 5 insertions(+) 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 9c8ef428d..38f40fc7a 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -142,6 +142,11 @@ public int read() throws IOException { return tarInputStream.read(); } + @Override + public int read(byte [] buff, int offset, int len) throws IOException { + return tarInputStream.read(buff, offset, len); + } + @Override public void close() throws IOException { IOUtils.closeQuietly(tarInputStream); From 61fc0a332bf974f686509519b554ff2253f1fb58 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 15 Dec 2015 20:09:49 +0100 Subject: [PATCH 0107/1032] Update CHANGELOG.md --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbcfaf035..a9e70ddc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Change Log === -2.1.3 + +2.1.4-SNAPSHOT +--- +* [#359] (https://github.com/docker-java/docker-java/pull/359) Fix performance issue of build command by adding bulk-read variant of InputStream.read() + +v2.1.3 --- * [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public From b9f32db8d341871d2d0250d2ce7ecab17756fbbe Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 15 Dec 2015 20:49:10 +0100 Subject: [PATCH 0108/1032] Fix issue #396 --- .../jaxrs/DockerCmdExecFactoryImpl.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 26c78a6d4..ceddb8af4 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -140,16 +140,23 @@ public void init(DockerClientConfig dockerClientConfig) { URI originalUri = dockerClientConfig.getUri(); SSLContext sslContext = null; + String protocol = null; if (dockerClientConfig.getSslConfig() != null) { - configureProxy(clientConfig, "https"); + protocol = "https"; try { sslContext = dockerClientConfig.getSslConfig().getSSLContext(); } catch (Exception ex) { throw new DockerClientException("Error in SSL Configuration", ex); } } else { - configureProxy(clientConfig, "http"); + protocol = "http"; + } + + if(originalUri.getScheme().equals("unix")) { + dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); + } else { + configureProxy(clientConfig, protocol); } PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry( @@ -174,12 +181,7 @@ public void init(DockerClientConfig dockerClientConfig) { client = clientBuilder.build(); - if (originalUri.getScheme().equals("unix")) { - dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); - } - baseResource = client.target(dockerClientConfig.getUri()).path(dockerClientConfig.getVersion().asWebPathPart()); - } private void configureProxy(ClientConfig clientConfig, String protocol) { From dd022034fc49336f0f229ff7fac17ea82639a2c1 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 15 Dec 2015 21:14:22 +0100 Subject: [PATCH 0109/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9e70ddc3..fc64027de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Change Log 2.1.4-SNAPSHOT --- + +* [#396] (https://github.com/docker-java/docker-java/pull/396) Disable evaluation of http.proxy... variables when using unix socket connection * [#359] (https://github.com/docker-java/docker-java/pull/359) Fix performance issue of build command by adding bulk-read variant of InputStream.read() v2.1.3 From 3aef2d0fce14e4ffefcd7ace620b9f05252f982d Mon Sep 17 00:00:00 2001 From: gtejasvarma Date: Thu, 17 Dec 2015 11:37:53 -0800 Subject: [PATCH 0110/1032] adding RestartCount to InspectContainerResponse --- .../dockerjava/api/command/InspectContainerResponse.java | 7 +++++++ 1 file changed, 7 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 b98e6d70d..a6e396985 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -66,6 +66,9 @@ public class InspectContainerResponse { @JsonProperty("Name") private String name; + @JsonProperty("RestartCount") + private int restartCount;; + @JsonProperty("NetworkSettings") private NetworkSettings networkSettings; @@ -160,6 +163,10 @@ public String getName() { return name; } + public int getRestartCount() { + return restartCount; + } + public String getDriver() { return driver; } From c32d631220fd76a408302399ea9192577fcba51f Mon Sep 17 00:00:00 2001 From: Ivan Gracia Date: Fri, 18 Dec 2015 13:25:20 +0100 Subject: [PATCH 0111/1032] Upgraded jackson-jaxrs-json-provider dependency --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index af33917b8..308432bd0 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 1.7 2.11 - 2.1.2 + 2.6.4 4.3.1 1.5 1.8 From 4e9b85fa048b5f619553dcc4deae167a5d90f724 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sat, 19 Dec 2015 02:16:54 +0300 Subject: [PATCH 0112/1032] Checkstyle NL in EOF. --- .../java/com/github/dockerjava/api/command/AuthCmd.java | 2 +- .../com/github/dockerjava/api/command/BuildImageCmd.java | 2 +- .../java/com/github/dockerjava/api/command/CommitCmd.java | 2 +- .../com/github/dockerjava/api/command/ContainerDiffCmd.java | 2 +- .../dockerjava/api/command/CopyFileFromContainerCmd.java | 2 +- .../com/github/dockerjava/api/command/CreateImageCmd.java | 2 +- .../java/com/github/dockerjava/api/command/DockerCmd.java | 2 +- .../github/dockerjava/api/command/DockerCmdExecFactory.java | 2 +- .../java/com/github/dockerjava/api/command/InfoCmd.java | 2 +- .../github/dockerjava/api/command/InspectContainerCmd.java | 2 +- .../com/github/dockerjava/api/command/InspectImageCmd.java | 2 +- .../com/github/dockerjava/api/command/KillContainerCmd.java | 2 +- .../github/dockerjava/api/command/ListContainersCmd.java | 2 +- .../com/github/dockerjava/api/command/ListImagesCmd.java | 2 +- .../github/dockerjava/api/command/PauseContainerCmd.java | 2 +- .../java/com/github/dockerjava/api/command/PingCmd.java | 2 +- .../com/github/dockerjava/api/command/PullImageCmd.java | 2 +- .../com/github/dockerjava/api/command/PushImageCmd.java | 2 +- .../github/dockerjava/api/command/RemoveContainerCmd.java | 2 +- .../com/github/dockerjava/api/command/RemoveImageCmd.java | 2 +- .../github/dockerjava/api/command/RestartContainerCmd.java | 2 +- .../com/github/dockerjava/api/command/SearchImagesCmd.java | 2 +- .../com/github/dockerjava/api/command/StopContainerCmd.java | 2 +- .../com/github/dockerjava/api/command/SyncDockerCmd.java | 2 +- .../java/com/github/dockerjava/api/command/TagImageCmd.java | 2 +- .../com/github/dockerjava/api/command/TopContainerCmd.java | 2 +- .../github/dockerjava/api/command/UnpauseContainerCmd.java | 2 +- .../java/com/github/dockerjava/api/command/VersionCmd.java | 2 +- .../dockerjava/core/command/AbstrAuthCfgDockerCmd.java | 2 +- .../dockerjava/jaxrs/CopyFileFromContainerCmdExec.java | 2 +- .../com/github/dockerjava/jaxrs/filter/LoggingFilter.java | 2 +- .../java/com/github/dockerjava/netty/ChannelProvider.java | 2 +- .../dockerjava/netty/handler/HttpResponseStreamHandler.java | 2 +- src/main/resources/docker.io.properties | 2 +- src/test/resources/checkstyle/checkstyle-config.xml | 6 ++++++ 35 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java index 168927959..8402ee533 100644 --- a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java @@ -31,4 +31,4 @@ public interface AuthCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} 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 643d95bae..96d94fd06 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -124,4 +124,4 @@ public interface BuildImageCmd extends AsyncDockerCmd { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java index c948ed7d3..81bc70e0c 100644 --- a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java @@ -123,4 +123,4 @@ public interface CommitCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java index 204e35fce..cc3bfa757 100644 --- a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java @@ -34,4 +34,4 @@ public interface ContainerDiffCmd extends SyncDockerCmd> { public static interface Exec extends DockerCmdSyncExec> { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java index 5ae9f6276..8786ca57f 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -35,4 +35,4 @@ public interface CopyFileFromContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java index 66df49c98..db10a374c 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java @@ -38,4 +38,4 @@ public interface CreateImageCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java index eafe34ae5..27aad850b 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java @@ -7,4 +7,4 @@ public interface DockerCmd extends Closeable { @Override public void close(); -} \ No newline at end of file +} 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 f0b35f58f..c3c753e9c 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -87,4 +87,4 @@ public interface DockerCmdExecFactory extends Closeable { @Override public void close() throws IOException; -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java index 2fe7f2bf6..257c3bec1 100644 --- a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java @@ -7,4 +7,4 @@ public interface InfoCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java index b6fde3fdc..b5fbe212f 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java @@ -21,4 +21,4 @@ public interface InspectContainerCmd extends SyncDockerCmd { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java index 2d3163533..253c31e78 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java @@ -25,4 +25,4 @@ public interface InspectImageCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java index 1e8da1a18..aca3902c0 100644 --- a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java @@ -30,4 +30,4 @@ public interface KillContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java index cec5f66c2..87faec0b3 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -57,4 +57,4 @@ public interface ListContainersCmd extends SyncDockerCmd> { public static interface Exec extends DockerCmdSyncExec> { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index 481bf7e49..3ef40f48f 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -29,4 +29,4 @@ public interface ListImagesCmd extends SyncDockerCmd> { public static interface Exec extends DockerCmdSyncExec> { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java index 4ca00a90d..74a4c86bc 100644 --- a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java @@ -29,4 +29,4 @@ public interface PauseContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/PingCmd.java b/src/main/java/com/github/dockerjava/api/command/PingCmd.java index 0be834e9a..07de7e959 100644 --- a/src/main/java/com/github/dockerjava/api/command/PingCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PingCmd.java @@ -9,4 +9,4 @@ public interface PingCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java index 641258fd1..319fecd14 100644 --- a/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java @@ -34,4 +34,4 @@ public interface PullImageCmd extends AsyncDockerCmd { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java index 24cb7fd71..8b9f3961e 100644 --- a/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -48,4 +48,4 @@ public interface PushImageCmd extends AsyncDockerCmd { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java index 5cbb21171..bcc700d03 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java @@ -40,4 +40,4 @@ public interface RemoveContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java index 987d29410..cfd9c36cd 100644 --- a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -44,4 +44,4 @@ public interface RemoveImageCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index 688141a20..d15666437 100644 --- a/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -34,4 +34,4 @@ public interface RestartContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java index 897623517..42cd6917e 100644 --- a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java @@ -24,4 +24,4 @@ public interface SearchImagesCmd extends SyncDockerCmd> { public static interface Exec extends DockerCmdSyncExec> { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java index cf7cb53c8..2c99a5fd5 100644 --- a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -39,4 +39,4 @@ public interface StopContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java b/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java index 0ac3cf819..4bc55fec6 100644 --- a/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java @@ -4,4 +4,4 @@ public interface SyncDockerCmd extends DockerCmd { public RES_T exec(); -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java index 8ceab3656..08b1411ff 100644 --- a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java @@ -41,4 +41,4 @@ public interface TagImageCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java index 5c6381a71..edde72628 100644 --- a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java @@ -30,4 +30,4 @@ public interface TopContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java index 5e620a079..8b751e55c 100644 --- a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java @@ -29,4 +29,4 @@ public interface UnpauseContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/api/command/VersionCmd.java b/src/main/java/com/github/dockerjava/api/command/VersionCmd.java index 5f823c6cb..789c521fb 100644 --- a/src/main/java/com/github/dockerjava/api/command/VersionCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/VersionCmd.java @@ -10,4 +10,4 @@ public interface VersionCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java index 626affae2..64e0e27f8 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAuthCfgDockerCmd.java @@ -34,4 +34,4 @@ private T withOptionalAuthConfig(AuthConfig authConfig) { return (T) this; } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java index f63b0cb58..6afffe0c4 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/CopyFileFromContainerCmdExec.java @@ -37,4 +37,4 @@ protected InputStream execute(CopyFileFromContainerCmd command) { return new WrappedResponseInputStream(response); } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java index 69fdf8c92..6dbea0045 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java @@ -337,4 +337,4 @@ public void write(final int i) throws IOException { inner.write(i); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/dockerjava/netty/ChannelProvider.java b/src/main/java/com/github/dockerjava/netty/ChannelProvider.java index 49cefe9d5..c742015fc 100644 --- a/src/main/java/com/github/dockerjava/netty/ChannelProvider.java +++ b/src/main/java/com/github/dockerjava/netty/ChannelProvider.java @@ -4,4 +4,4 @@ public interface ChannelProvider { Channel getChannel(); -} \ No newline at end of file +} 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 b3800be56..d4f19f2e3 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandler.java @@ -97,4 +97,4 @@ private void poll() { } } } -} \ No newline at end of file +} diff --git a/src/main/resources/docker.io.properties b/src/main/resources/docker.io.properties index 30ba2b62a..719500e24 100644 --- a/src/main/resources/docker.io.properties +++ b/src/main/resources/docker.io.properties @@ -2,4 +2,4 @@ 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/ \ No newline at end of file +docker.io.serverAddress=https://index.docker.io/v1/ diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index b804c7f97..9f9f7b02b 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -12,6 +12,12 @@ --> + + + + + + From 2f82aab16f9743bdd324e184590344c6411b6c49 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 18 Dec 2015 22:29:51 +0100 Subject: [PATCH 0113/1032] Support for volume API --- .../github/dockerjava/api/DockerClient.java | 12 ++++ .../api/command/CreateVolumeCmd.java | 40 +++++++++++ .../api/command/CreateVolumeResponse.java | 40 +++++++++++ .../api/command/DockerCmdExecFactory.java | 9 +++ .../api/command/InspectVolumeCmd.java | 23 +++++++ .../api/command/InspectVolumeResponse.java | 40 +++++++++++ .../api/command/ListVolumesCmd.java | 25 +++++++ .../api/command/ListVolumesResponse.java | 28 ++++++++ .../api/command/RemoveVolumeCmd.java | 30 +++++++++ .../dockerjava/core/DockerClientImpl.java | 28 ++++++++ .../core/command/CreateVolumeCmdImpl.java | 66 +++++++++++++++++++ .../core/command/InspectVolumeCmdImpl.java | 42 ++++++++++++ .../core/command/ListVolumesCmdImpl.java | 32 +++++++++ .../core/command/RemoveVolumeCmdImpl.java | 38 +++++++++++ .../dockerjava/jaxrs/CreateVolumeCmdExec.java | 32 +++++++++ .../jaxrs/DockerCmdExecFactoryImpl.java | 26 +++++++- .../jaxrs/InspectVolumeCmdExec.java | 29 ++++++++ .../dockerjava/jaxrs/ListVolumesCmdExec.java | 34 ++++++++++ .../dockerjava/jaxrs/RemoveVolumeCmdExec.java | 30 +++++++++ .../netty/DockerCmdExecFactoryImpl.java | 28 ++++++++ .../dockerjava/netty/InvocationBuilder.java | 51 +++++++------- .../netty/exec/CreateVolumeCmdExec.java | 31 +++++++++ .../netty/exec/InspectVolumeCmdExec.java | 30 +++++++++ .../netty/exec/ListVolumesCmdExec.java | 36 ++++++++++ .../netty/exec/RemoveVolumeCmdExec.java | 29 ++++++++ .../core/TestDockerCmdExecFactory.java | 25 ++++++- .../core/command/BuildImageCmdImplTest.java | 3 + .../core/command/CreateVolumeCmdImplTest.java | 53 +++++++++++++++ .../command/InspectVolumeCmdImplTest.java | 56 ++++++++++++++++ .../core/command/ListVolumesCmdImplTest.java | 59 +++++++++++++++++ .../core/command/RemoveVolumeCmdImplTest.java | 65 ++++++++++++++++++ .../netty/AbstractNettyDockerClientTest.java | 3 +- .../netty/exec/BuildImageCmdExecTest.java | 3 + .../netty/exec/CreateVolumeCmdExecTest.java | 53 +++++++++++++++ .../netty/exec/InspectVolumeCmdExecTest.java | 56 ++++++++++++++++ .../netty/exec/ListVolumesCmdExecTest.java | 59 +++++++++++++++++ .../netty/exec/RemoveVolumeCmdExecTest.java | 65 ++++++++++++++++++ 37 files changed, 1280 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java create mode 100644 src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java create mode 100644 src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java create mode 100644 src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java create mode 100644 src/main/java/com/github/dockerjava/core/command/CreateVolumeCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/RemoveVolumeCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/CreateVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/InspectVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/RemoveVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExec.java create mode 100644 src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/ListVolumesCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ListVolumesCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 6694be0de..a3a3a9aa0 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -17,6 +17,7 @@ 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.CreateVolumeCmd; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecStartCmd; @@ -24,9 +25,11 @@ 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.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.ListVolumesCmd; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; @@ -34,6 +37,7 @@ 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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -188,6 +192,14 @@ public interface DockerClient extends Closeable { public StatsCmd statsCmd(String containerId); + public CreateVolumeCmd createVolumeCmd(); + + public InspectVolumeCmd inspectVolumeCmd(String name); + + public RemoveVolumeCmd removeVolumeCmd(String name); + + public ListVolumesCmd listVolumesCmd(); + @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java new file mode 100644 index 000000000..0642cf902 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.api.command; + +import java.util.Map; + +import javax.annotation.CheckForNull; + +public interface CreateVolumeCmd extends SyncDockerCmd { + + @CheckForNull + public String getName(); + + @CheckForNull + public String getDriver(); + + @CheckForNull + public Map getDriverOpts(); + + /** + * @param name + * - The new volume’s name. If not specified, Docker generates a name. + */ + public CreateVolumeCmd withName(String name); + + /** + * @param driver + * - Name of the volume driver to use. Defaults to local for the name. + */ + public CreateVolumeCmd withDriver(String driver); + + /** + * @param driverOpts + * - A mapping of driver options and values. These options are passed directly to the driver and are + * driver specific. + */ + public CreateVolumeCmd withDriverOpts(Map driverOpts); + + public static interface Exec extends DockerCmdSyncExec { + } +} + diff --git a/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java b/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java new file mode 100644 index 000000000..3a541a0cd --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.api.command; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * + * @author Marcus Linke + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class CreateVolumeResponse { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("Mountpoint") + private String mountpoint; + + public String getName() { + return name; + } + + public String getDriver() { + return driver; + } + + public String getMountpoint() { + return mountpoint; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} 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 c3c753e9c..98de728e8 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -85,6 +85,15 @@ public interface DockerCmdExecFactory extends Closeable { public StatsCmd.Exec createStatsCmdExec(); + public CreateVolumeCmd.Exec createCreateVolumeCmdExec(); + + public InspectVolumeCmd.Exec createInspectVolumeCmdExec(); + + public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec(); + + public ListVolumesCmd.Exec createListVolumesCmdExec(); + @Override public void close() throws IOException; + } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java new file mode 100644 index 000000000..bf08e18b4 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java @@ -0,0 +1,23 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.Nonnull; + +/** + * Inspect the details of a volume. + * + * @author Marcus Linke + * + */ +public interface InspectVolumeCmd extends SyncDockerCmd { + + public String getName(); + + /** + * @param name + * - The volume’s name. + */ + public InspectVolumeCmd withName(@Nonnull String name); + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java new file mode 100644 index 000000000..b5b35c563 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.api.command; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * + * @author Marcus Linke + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class InspectVolumeResponse { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("Mountpoint") + private String mountpoint; + + public String getName() { + return name; + } + + public String getDriver() { + return driver; + } + + public String getMountpoint() { + return mountpoint; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java new file mode 100644 index 000000000..f900f1967 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java @@ -0,0 +1,25 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; + +/** + * List volumes. + * + * + * @author Marcus Linke + */ +public interface ListVolumesCmd extends SyncDockerCmd { + + @CheckForNull + public String getFilters(); + + /** + * @param filters + * - JSON encoded value of the filters (a map[string][]string) to process on the volumes list. There is + * one available filter: dangling=true + */ + public ListVolumesCmd withFilters(String filters); + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java b/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java new file mode 100644 index 000000000..c45712d09 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.api.command; + +import java.util.List; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * + * @author Marcus Linke + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ListVolumesResponse { + + @JsonProperty("Volumes") + private List volumes; + + public List getVolumes() { + return volumes; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java new file mode 100644 index 000000000..ba136af25 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Remove a volume. + * + * @author Marcus Linke + */ +public interface RemoveVolumeCmd extends SyncDockerCmd { + + public String getName(); + + public RemoveVolumeCmd withName(@Nonnull String name); + + /** + * @throws NotFoundException + * No such volume + * @throws ConflictException + * Volume is in use and cannot be removed + */ + @Override + public Void exec() throws NotFoundException; + + public static 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 62df4aacb..05726f735 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -18,6 +18,7 @@ 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.CreateVolumeCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -26,9 +27,11 @@ 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.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.ListVolumesCmd; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; @@ -36,6 +39,7 @@ 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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -59,6 +63,7 @@ import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; import com.github.dockerjava.core.command.CreateContainerCmdImpl; import com.github.dockerjava.core.command.CreateImageCmdImpl; +import com.github.dockerjava.core.command.CreateVolumeCmdImpl; import com.github.dockerjava.core.command.EventsCmdImpl; import com.github.dockerjava.core.command.ExecCreateCmdImpl; import com.github.dockerjava.core.command.ExecStartCmdImpl; @@ -66,9 +71,11 @@ import com.github.dockerjava.core.command.InspectContainerCmdImpl; import com.github.dockerjava.core.command.InspectExecCmdImpl; import com.github.dockerjava.core.command.InspectImageCmdImpl; +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.ListImagesCmdImpl; +import com.github.dockerjava.core.command.ListVolumesCmdImpl; import com.github.dockerjava.core.command.LogContainerCmdImpl; import com.github.dockerjava.core.command.PauseContainerCmdImpl; import com.github.dockerjava.core.command.PingCmdImpl; @@ -76,6 +83,7 @@ import com.github.dockerjava.core.command.PushImageCmdImpl; import com.github.dockerjava.core.command.RemoveContainerCmdImpl; import com.github.dockerjava.core.command.RemoveImageCmdImpl; +import com.github.dockerjava.core.command.RemoveVolumeCmdImpl; import com.github.dockerjava.core.command.RestartContainerCmdImpl; import com.github.dockerjava.core.command.SaveImageCmdImpl; import com.github.dockerjava.core.command.SearchImagesCmdImpl; @@ -389,6 +397,26 @@ public StatsCmd statsCmd(String containerId) { return new StatsCmdImpl(getDockerCmdExecFactory().createStatsCmdExec(), containerId); } + @Override + public CreateVolumeCmd createVolumeCmd() { + return new CreateVolumeCmdImpl(getDockerCmdExecFactory().createCreateVolumeCmdExec()); + } + + @Override + public InspectVolumeCmd inspectVolumeCmd(String name) { + return new InspectVolumeCmdImpl(getDockerCmdExecFactory().createInspectVolumeCmdExec(), name); + } + + @Override + public RemoveVolumeCmd removeVolumeCmd(String name) { + return new RemoveVolumeCmdImpl(getDockerCmdExecFactory().createRemoveVolumeCmdExec(), name); + } + + @Override + public ListVolumesCmd listVolumesCmd() { + return new ListVolumesCmdImpl(getDockerCmdExecFactory().createListVolumesCmdExec()); + } + @Override public void close() throws IOException { getDockerCmdExecFactory().close(); diff --git a/src/main/java/com/github/dockerjava/core/command/CreateVolumeCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateVolumeCmdImpl.java new file mode 100644 index 000000000..13cb0ac83 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/CreateVolumeCmdImpl.java @@ -0,0 +1,66 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.CreateVolumeResponse; + +/** + * Create a volume. + * + * @author Marcus Linke + */ +public class CreateVolumeCmdImpl extends AbstrDockerCmd implements + CreateVolumeCmd { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("DriverOpts") + private Map driverOpts; + + public CreateVolumeCmdImpl(CreateVolumeCmd.Exec exec) { + super(exec); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getDriver() { + return driver; + } + + @Override + public Map getDriverOpts() { + return driverOpts; + } + + @Override + public CreateVolumeCmdImpl withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + @Override + public CreateVolumeCmdImpl withDriver(String driver) { + checkNotNull(driver, "driver was not specified"); + this.driver = driver; + return this; + } + + @Override + public CreateVolumeCmd withDriverOpts(Map driverOpts) { + checkNotNull(driverOpts, "driverOpts was not specified"); + return this; + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java new file mode 100644 index 000000000..c789d91c9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java @@ -0,0 +1,42 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.github.dockerjava.api.command.InspectVolumeCmd; +import com.github.dockerjava.api.command.InspectVolumeResponse; +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Inspect the details of a volume. + */ +public class InspectVolumeCmdImpl extends AbstrDockerCmd implements + InspectVolumeCmd { + + private String name; + + public InspectVolumeCmdImpl(InspectVolumeCmd.Exec exec, String name) { + super(exec); + withName(name); + } + + @Override + public String getName() { + return name; + } + + @Override + public InspectVolumeCmd withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + /** + * @throws NotFoundException + * No such volume + */ + @Override + public InspectVolumeResponse exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java new file mode 100644 index 000000000..af1ca3fae --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.github.dockerjava.api.command.ListVolumesCmd; +import com.github.dockerjava.api.command.ListVolumesResponse; + +/** + * + * @author Marcus Linke + * + */ +public class ListVolumesCmdImpl extends AbstrDockerCmd implements ListVolumesCmd { + + private String filters; + + public ListVolumesCmdImpl(ListVolumesCmd.Exec exec) { + super(exec); + } + + @Override + public String getFilters() { + return filters; + } + + @Override + public ListVolumesCmd withFilters(String filter) { + checkNotNull(filter, "filters have not been specified"); + this.filters = filter; + return this; + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/RemoveVolumeCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/RemoveVolumeCmdImpl.java new file mode 100644 index 000000000..ee294a130 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/RemoveVolumeCmdImpl.java @@ -0,0 +1,38 @@ +package com.github.dockerjava.core.command; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.github.dockerjava.api.command.RemoveVolumeCmd; +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Remove a volume. + * + * @author Marcus Linke + */ +public class RemoveVolumeCmdImpl extends AbstrDockerCmd implements RemoveVolumeCmd { + + private String name; + + public RemoveVolumeCmdImpl(RemoveVolumeCmd.Exec exec, String name) { + super(exec); + withName(name); + } + + @Override + public String getName() { + return name; + } + + @Override + public RemoveVolumeCmd withName(String name) { + checkNotNull(name, "name was not specified"); + this.name = name; + return this; + } + + @Override + public Void exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateVolumeCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateVolumeCmdExec.java new file mode 100644 index 000000000..c71d2297e --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateVolumeCmdExec.java @@ -0,0 +1,32 @@ +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.CreateVolumeCmd; +import com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.core.DockerClientConfig; + +public class CreateVolumeCmdExec extends AbstrSyncDockerCmdExec implements + CreateVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateVolumeCmdExec.class); + + public CreateVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateVolumeResponse execute(CreateVolumeCmd command) { + WebTarget webResource = getBaseResource().path("/volumes/create"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), CreateVolumeResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 62b49d7d7..30bc5e34f 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -39,6 +39,7 @@ 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.CreateVolumeCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -47,9 +48,11 @@ 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.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.ListVolumesCmd; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; @@ -57,6 +60,7 @@ 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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -154,7 +158,7 @@ public void init(DockerClientConfig dockerClientConfig) { protocol = "http"; } - if(originalUri.getScheme().equals("unix")) { + if (originalUri.getScheme().equals("unix")) { dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); } else { configureProxy(clientConfig, protocol); @@ -421,6 +425,26 @@ 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 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/InspectVolumeCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectVolumeCmdExec.java new file mode 100644 index 000000000..9ca2ac02a --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectVolumeCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.jaxrs; + +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.InspectVolumeCmd; +import com.github.dockerjava.api.command.InspectVolumeResponse; +import com.github.dockerjava.core.DockerClientConfig; + +public class InspectVolumeCmdExec extends AbstrSyncDockerCmdExec implements + InspectVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectVolumeCmdExec.class); + + public InspectVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InspectVolumeResponse execute(InspectVolumeCmd command) { + WebTarget webResource = getBaseResource().path("/volumes/{name}").resolveTemplate("name", command.getName()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(InspectVolumeResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java new file mode 100644 index 000000000..2550db31b --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.jaxrs; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +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.ListVolumesCmd; +import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.core.DockerClientConfig; + +public class ListVolumesCmdExec extends AbstrSyncDockerCmdExec implements ListVolumesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListVolumesCmdExec.class); + + public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected ListVolumesResponse execute(ListVolumesCmd command) { + WebTarget webTarget = getBaseResource().path("/volumes"); + + if (command.getFilters() != null) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + + LOGGER.trace("GET: {}", webTarget); + + return webTarget.request().accept(MediaType.APPLICATION_JSON).get(ListVolumesResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveVolumeCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveVolumeCmdExec.java new file mode 100644 index 000000000..618a85ed8 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveVolumeCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.jaxrs; + +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.RemoveVolumeCmd; +import com.github.dockerjava.core.DockerClientConfig; + +public class RemoveVolumeCmdExec extends AbstrSyncDockerCmdExec implements + RemoveVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveVolumeCmdExec.class); + + public RemoveVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveVolumeCmd command) { + WebTarget webTarget = getBaseResource().path("/volumes/" + command.getName()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete().close(); + + 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 865389fef..9ddd51288 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -38,6 +38,7 @@ 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.CreateVolumeCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -46,9 +47,11 @@ 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.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.ListVolumesCmd; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; @@ -56,6 +59,7 @@ 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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -79,6 +83,7 @@ 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.CreateVolumeCmdExec; import com.github.dockerjava.netty.exec.EventsCmdExec; import com.github.dockerjava.netty.exec.ExecCreateCmdExec; import com.github.dockerjava.netty.exec.ExecStartCmdExec; @@ -86,9 +91,11 @@ 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.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.ListVolumesCmdExec; import com.github.dockerjava.netty.exec.LogContainerCmdExec; import com.github.dockerjava.netty.exec.PauseContainerCmdExec; import com.github.dockerjava.netty.exec.PingCmdExec; @@ -96,6 +103,7 @@ 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.RemoveVolumeCmdExec; import com.github.dockerjava.netty.exec.RestartContainerCmdExec; import com.github.dockerjava.netty.exec.SaveImageCmdExec; import com.github.dockerjava.netty.exec.SearchImagesCmdExec; @@ -477,6 +485,26 @@ 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 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/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index a478cf6c1..36fea48eb 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -46,8 +46,8 @@ import com.github.dockerjava.netty.handler.JsonResponseCallbackHandler; /** - * This class is basically a replacement of javax.ws.rs.client.Invocation.Builder to allow simpler - * migration of JAX-RS code to a netty based implementation. + * This class is basically a replacement of javax.ws.rs.client.Invocation.Builder to allow simpler migration of JAX-RS + * code to a netty based implementation. * * @author Marcus Linke */ @@ -236,35 +236,37 @@ public void post(final Object entity, final InputStream stdin, ResultCallback T post(final Object entity, TypeReference typeReference) { @@ -403,7 +405,6 @@ public T post(TypeReference typeReference, InputStream body) { return callback.awaitResult(); } - public void post(TypeReference typeReference, ResultCallback resultCallback, InputStream body) { HttpRequestProvider requestProvider = httpPostRequestProvider(null); diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExec.java new file mode 100644 index 000000000..746e46067 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExec.java @@ -0,0 +1,31 @@ +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.CreateVolumeCmd; +import com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class CreateVolumeCmdExec extends AbstrSyncDockerCmdExec implements + CreateVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateVolumeCmdExec.class); + + public CreateVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateVolumeResponse execute(CreateVolumeCmd command) { + WebTarget webResource = getBaseResource().path("/volumes/create"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(command, new TypeReference() { + }); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExec.java new file mode 100644 index 000000000..1c3adf47e --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExec.java @@ -0,0 +1,30 @@ +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.InspectVolumeCmd; +import com.github.dockerjava.api.command.InspectVolumeResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class InspectVolumeCmdExec extends AbstrSyncDockerCmdExec implements + InspectVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectVolumeCmdExec.class); + + public InspectVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InspectVolumeResponse execute(InspectVolumeCmd command) { + WebTarget webResource = getBaseResource().path("/volumes/{name}").resolveTemplate("name", command.getName()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { + }); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java new file mode 100644 index 000000000..2086e4d2d --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.netty.exec; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.ListVolumesCmd; +import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class ListVolumesCmdExec extends AbstrSyncDockerCmdExec implements + ListVolumesCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListVolumesCmdExec.class); + + public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected ListVolumesResponse execute(ListVolumesCmd command) { + WebTarget webTarget = getBaseResource().path("/volumes"); + + if (command.getFilters() != null) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + + LOGGER.trace("GET: {}", webTarget); + + return webTarget.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { + }); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExec.java new file mode 100644 index 000000000..baf6eabe1 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.RemoveVolumeCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; + +public class RemoveVolumeCmdExec extends AbstrSyncDockerCmdExec implements + RemoveVolumeCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveVolumeCmdExec.class); + + public RemoveVolumeCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveVolumeCmd command) { + WebTarget webTarget = getBaseResource().path("/volumes/" + command.getName()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete(); + + return null; + } +} diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 4a96e664f..6045ce56b 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -18,6 +18,7 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.CreateImageResponse; +import com.github.dockerjava.api.command.CreateVolumeCmd; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -26,9 +27,11 @@ 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.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.ListVolumesCmd; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; import com.github.dockerjava.api.command.PingCmd; @@ -36,6 +39,7 @@ 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.RemoveVolumeCmd; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.command.SearchImagesCmd; @@ -308,6 +312,26 @@ public StatsCmd.Exec createStatsCmdExec() { return delegate.createStatsCmdExec(); } + @Override + public CreateVolumeCmd.Exec createCreateVolumeCmdExec() { + return delegate.createCreateVolumeCmdExec(); + } + + @Override + public InspectVolumeCmd.Exec createInspectVolumeCmdExec() { + return delegate.createInspectVolumeCmdExec(); + } + + @Override + public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() { + return delegate.createRemoveVolumeCmdExec(); + } + + @Override + public ListVolumesCmd.Exec createListVolumesCmdExec() { + return delegate.createListVolumesCmdExec(); + } + public List getContainerNames() { return new ArrayList(containerNames); } @@ -315,5 +339,4 @@ public List getContainerNames() { public List getImageNames() { return new ArrayList(imageNames); } - } 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 017186ccd..9623e077f 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -271,6 +271,9 @@ public void testBuildFromPrivateRegistry() throws Exception { dockerClient.startContainerCmd(testregistry.getId()).exec(); + // wait for registry to boot + Thread.sleep(3000); + AuthConfig authConfig = new AuthConfig(); // credentials as configured in /auth/htpasswd diff --git a/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java new file mode 100644 index 000000000..c08c55c2c --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java @@ -0,0 +1,53 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class CreateVolumeCmdImplTest extends AbstractDockerClientTest { + + @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 createVolume() throws DockerException { + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java new file mode 100644 index 000000000..730246d3d --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java @@ -0,0 +1,56 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.command.InspectVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class InspectVolumeCmdImplTest extends AbstractDockerClientTest { + + @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 inspectVolume() throws DockerException { + + String volumeName = "volume1"; + + dockerClient.createVolumeCmd().withName(volumeName).withDriver("local").exec(); + + InspectVolumeResponse inspectVolumeResponse = dockerClient.inspectVolumeCmd(volumeName).exec(); + + assertThat(inspectVolumeResponse.getName(), equalTo("volume1")); + assertThat(inspectVolumeResponse.getDriver(), equalTo("local")); + assertThat(inspectVolumeResponse.getMountpoint(), containsString("/volume1/")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/ListVolumesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListVolumesCmdImplTest.java new file mode 100644 index 000000000..646f502c8 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ListVolumesCmdImplTest.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class ListVolumesCmdImplTest extends AbstractDockerClientTest { + + @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 listVolumes() throws DockerException { + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + + ListVolumesResponse listVolumesResponse = dockerClient.listVolumesCmd().exec(); + + assertThat(listVolumesResponse.getVolumes().size(), greaterThanOrEqualTo(1)); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java new file mode 100644 index 000000000..249bf8493 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/RemoveVolumeCmdImplTest.java @@ -0,0 +1,65 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class RemoveVolumeCmdImplTest extends AbstractDockerClientTest { + + @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 removeVolume() throws DockerException { + + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + + dockerClient.removeVolumeCmd(volumeName).exec(); + + try { + dockerClient.inspectVolumeCmd(volumeName).exec(); + fail("Expected NotFoundException"); + } catch (NotFoundException e) { + // just ignore + } + } +} diff --git a/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java b/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java index 6dcb435f1..44a541808 100644 --- a/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/netty/AbstractNettyDockerClientTest.java @@ -12,7 +12,6 @@ public abstract class AbstractNettyDockerClientTest extends AbstractDockerClient @Override protected TestDockerCmdExecFactory initTestDockerCmdExecFactory() { - return new TestDockerCmdExecFactory( - new DockerCmdExecFactoryImpl()); + return new TestDockerCmdExecFactory(new DockerCmdExecFactoryImpl()); } } 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 19b42420e..7fb94fcd4 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -263,6 +263,9 @@ public void testBuildFromPrivateRegistry() throws Exception { dockerClient.startContainerCmd(testregistry.getId()).exec(); + // wait for registry to boot + Thread.sleep(3000); + AuthConfig authConfig = new AuthConfig(); // credentials as configured in /auth/htpasswd diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java new file mode 100644 index 000000000..3e971dc3b --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java @@ -0,0 +1,53 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class CreateVolumeCmdExecTest 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 createVolume() throws DockerException { + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java new file mode 100644 index 000000000..65f7ff983 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java @@ -0,0 +1,56 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.command.InspectVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class InspectVolumeCmdExecTest 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 inspectVolume() throws DockerException { + + String volumeName = "volume1"; + + dockerClient.createVolumeCmd().withName(volumeName).withDriver("local").exec(); + + InspectVolumeResponse inspectVolumeResponse = dockerClient.inspectVolumeCmd(volumeName).exec(); + + assertThat(inspectVolumeResponse.getName(), equalTo("volume1")); + assertThat(inspectVolumeResponse.getDriver(), equalTo("local")); + assertThat(inspectVolumeResponse.getMountpoint(), containsString("/volume1/")); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListVolumesCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListVolumesCmdExecTest.java new file mode 100644 index 000000000..bca5ebece --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/ListVolumesCmdExecTest.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class ListVolumesCmdExecTest 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 listVolumes() throws DockerException { + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + + ListVolumesResponse listVolumesResponse = dockerClient.listVolumesCmd().exec(); + + assertThat(listVolumesResponse.getVolumes().size(), greaterThanOrEqualTo(1)); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java new file mode 100644 index 000000000..59aafde67 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveVolumeCmdExecTest.java @@ -0,0 +1,65 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; + +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 com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class RemoveVolumeCmdExecTest 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 removeVolume() throws DockerException { + + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse.getDriver(), equalTo("local")); + assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); + + dockerClient.removeVolumeCmd(volumeName).exec(); + + try { + dockerClient.inspectVolumeCmd(volumeName).exec(); + fail("Expected NotFoundException"); + } catch (NotFoundException e) { + // just ignore + } + } +} From 96d01bf3a961c42ccbb11a9920bd670eaf957763 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 18 Dec 2015 23:13:41 +0100 Subject: [PATCH 0114/1032] Improved volume API tests --- .../dockerjava/netty/InvocationBuilder.java | 4 --- .../client/AbstractDockerClientTest.java | 9 +++++++ .../core/TestDockerCmdExecFactory.java | 25 ++++++++++++++++-- .../core/command/CreateVolumeCmdImplTest.java | 26 +++++++++++++++++-- .../command/InspectVolumeCmdImplTest.java | 9 +++++++ .../netty/exec/CreateVolumeCmdExecTest.java | 20 ++++++++++++++ .../netty/exec/InspectVolumeCmdExecTest.java | 9 +++++++ 7 files changed, 94 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java index 36fea48eb..8f1641279 100644 --- a/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java +++ b/src/main/java/com/github/dockerjava/netty/InvocationBuilder.java @@ -378,10 +378,6 @@ private void sendRequest(HttpRequestProvider requestProvider, Channel channel) { channelFuture.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { - if (future.isSuccess()) { - System.err.println("Request success"); - } - } }); } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index cdf7f457e..8751e07e5 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -109,6 +109,15 @@ public void afterMethod(ITestResult result) { } } + for (String volume : dockerCmdExecFactory.getVolumeNames()) { + LOG.info("Cleaning up temporary volume with {}", volume); + try { + dockerClient.removeVolumeCmd(volume).exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + LOG.info("################################## END OF {} ##################################\n", result.getName()); } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 6045ce56b..8128bb915 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -19,6 +19,7 @@ import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.CreateImageResponse; import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.CreateVolumeResponse; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -65,6 +66,8 @@ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { private List imageNames = new ArrayList(); + private List volumeNames = new ArrayList(); + private DockerCmdExecFactory delegate; public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { @@ -314,7 +317,14 @@ public StatsCmd.Exec createStatsCmdExec() { @Override public CreateVolumeCmd.Exec createCreateVolumeCmdExec() { - return delegate.createCreateVolumeCmdExec(); + return new CreateVolumeCmd.Exec() { + @Override + public CreateVolumeResponse exec(CreateVolumeCmd command) { + CreateVolumeResponse result = delegate.createCreateVolumeCmdExec().exec(command); + volumeNames.add(command.getName()); + return result; + } + }; } @Override @@ -324,7 +334,14 @@ public InspectVolumeCmd.Exec createInspectVolumeCmdExec() { @Override public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() { - return delegate.createRemoveVolumeCmdExec(); + return new RemoveVolumeCmd.Exec() { + @Override + public Void exec(RemoveVolumeCmd command) { + delegate.createRemoveVolumeCmdExec().exec(command); + volumeNames.remove(command.getName()); + return null; + } + }; } @Override @@ -339,4 +356,8 @@ public List getContainerNames() { public List getImageNames() { return new ArrayList(imageNames); } + + public List getVolumeNames() { + return new ArrayList(volumeNames); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java index c08c55c2c..39688b424 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateVolumeCmdImplTest.java @@ -43,11 +43,33 @@ public void afterMethod(ITestResult result) { @Test public void createVolume() throws DockerException { - CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName("volume1") + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse = dockerClient.createVolumeCmd().withName(volumeName) .withDriver("local").exec(); - assertThat(createVolumeResponse.getName(), equalTo("volume1")); + assertThat(createVolumeResponse.getName(), equalTo(volumeName)); assertThat(createVolumeResponse.getDriver(), equalTo("local")); assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); } + + @Test + public void createVolumeWithExistingName() throws DockerException { + + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse1 = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse1.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse1.getDriver(), equalTo("local")); + assertThat(createVolumeResponse1.getMountpoint(), containsString("/volume1/")); + + CreateVolumeResponse createVolumeResponse2 = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse2.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse2.getDriver(), equalTo("local")); + assertThat(createVolumeResponse2.getMountpoint(), equalTo(createVolumeResponse1.getMountpoint())); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java index 730246d3d..c24f173df 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectVolumeCmdImplTest.java @@ -15,6 +15,7 @@ import com.github.dockerjava.api.command.InspectVolumeResponse; import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -53,4 +54,12 @@ public void inspectVolume() throws DockerException { assertThat(inspectVolumeResponse.getDriver(), equalTo("local")); assertThat(inspectVolumeResponse.getMountpoint(), containsString("/volume1/")); } + + @Test(expectedExceptions = NotFoundException.class) + public void inspectNonExistentVolume() throws DockerException { + + String volumeName = "non-existing"; + + dockerClient.inspectVolumeCmd(volumeName).exec(); + } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java index 3e971dc3b..1e1a30b73 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateVolumeCmdExecTest.java @@ -50,4 +50,24 @@ public void createVolume() throws DockerException { assertThat(createVolumeResponse.getDriver(), equalTo("local")); assertThat(createVolumeResponse.getMountpoint(), containsString("/volume1/")); } + + @Test + public void createVolumeWithExistingName() throws DockerException { + + String volumeName = "volume1"; + + CreateVolumeResponse createVolumeResponse1 = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse1.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse1.getDriver(), equalTo("local")); + assertThat(createVolumeResponse1.getMountpoint(), containsString("/volume1/")); + + CreateVolumeResponse createVolumeResponse2 = dockerClient.createVolumeCmd().withName(volumeName) + .withDriver("local").exec(); + + assertThat(createVolumeResponse2.getName(), equalTo(volumeName)); + assertThat(createVolumeResponse2.getDriver(), equalTo("local")); + assertThat(createVolumeResponse2.getMountpoint(), equalTo(createVolumeResponse1.getMountpoint())); + } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java index 65f7ff983..191767f87 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectVolumeCmdExecTest.java @@ -15,6 +15,7 @@ import com.github.dockerjava.api.command.InspectVolumeResponse; import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; @Test(groups = "integration") @@ -53,4 +54,12 @@ public void inspectVolume() throws DockerException { assertThat(inspectVolumeResponse.getDriver(), equalTo("local")); assertThat(inspectVolumeResponse.getMountpoint(), containsString("/volume1/")); } + + @Test(expectedExceptions = NotFoundException.class) + public void inspectNonExistentVolume() throws DockerException { + + String volumeName = "non-existing"; + + dockerClient.inspectVolumeCmd(volumeName).exec(); + } } From ce17ccae43f27d81f9fede3663d6efe9598f684a Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sat, 19 Dec 2015 08:58:49 +0100 Subject: [PATCH 0115/1032] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e545233bb..dc09dcc4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Notes All changes +* [#408] (https://github.com/docker-java/docker-java/pull/408) Support for volume API * [#396] (https://github.com/docker-java/docker-java/pull/396) Disable evaluation of http.proxy... variables when using unix socket connection * [#393] (https://github.com/docker-java/docker-java/pull/392) Support ONBUILD instruction in Dockerfiles * [#392] (https://github.com/docker-java/docker-java/pull/392) Introduce InspectContainerResponse.Mounts From ff8c01c3e3f7c53b2998c427278e71150d509669 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sat, 19 Dec 2015 09:08:55 +0100 Subject: [PATCH 0116/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc09dcc4b..a9c6adde9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ Change Log --- Notes -* The upcoming release will contain multiple API breaking changes therefore the major version switch. It will supports a subset of v.1.21 of the docker remote API. +* The upcoming release will contain multiple API breaking changes therefore the major version switch. It will support a subset of v.1.21 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. All changes From 95caffad742b61470b4a4ce98286b6b2fa5a07fc Mon Sep 17 00:00:00 2001 From: alenkacz Date: Sat, 19 Dec 2015 15:58:36 +0100 Subject: [PATCH 0117/1032] Support for build-args of docker build In 1.9 there is new property - build-args that can be specified for docker build command --- .../dockerjava/api/command/BuildImageCmd.java | 6 ++++++ .../core/command/BuildImageCmdImpl.java | 15 +++++++++++++++ .../dockerjava/jaxrs/BuildImageCmdExec.java | 16 ++++++++++++++++ .../core/command/BuildImageCmdImplTest.java | 14 ++++++++++++++ src/test/resources/testBuildArgs/Dockerfile | 5 +++++ 5 files changed, 56 insertions(+) create mode 100644 src/test/resources/testBuildArgs/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 96d94fd06..07d29fb54 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.InputStream; import java.net.URI; +import java.util.Map; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -87,6 +88,9 @@ public interface BuildImageCmd extends AsyncDockerCmd getBuildArgs(); + // setters public BuildImageCmd withTag(String tag); @@ -115,6 +119,8 @@ public interface BuildImageCmd extends AsyncDockerCmd buildArgs = new HashMap(); + public BuildImageCmdImpl(BuildImageCmd.Exec exec) { super(exec); } @@ -138,6 +142,11 @@ public String getCpusetcpus() { return cpusetcpus; } + @Override + public Map getBuildArgs() { + return buildArgs; + } + // getter lib specific @Override @@ -219,6 +228,12 @@ public BuildImageCmd withCpusetcpus(String cpusetcpus) { return this; } + @Override + public BuildImageCmd withBuildArg(String key, String value) { + this.buildArgs.put(key, value); + return this; + } + // lib specific @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index fd868a7b3..68e56bbec 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -6,6 +6,7 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; +import com.fasterxml.jackson.databind.ObjectMapper; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.RequestEntityProcessing; import org.slf4j.Logger; @@ -20,9 +21,12 @@ import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; +import java.io.IOException; + 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); @@ -88,6 +92,18 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus()); } + if (command.hasRemoveEnabled() == null || !command.hasRemoveEnabled()) { + webTarget = webTarget.queryParam("rm", "false"); + } + + if (command.getBuildArgs() != null) { + try { + webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs())); + } catch (IOException e) { + // pass + } + } + webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); webTarget.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); 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 9623e077f..9266c5ccd 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -304,4 +304,18 @@ public void testBuildFromPrivateRegistry() throws Exception { LOG.info("Image Inspect: {}", inspectImageResponse.toString()); } + + @Test + public void testBuildArgs() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildArgs").getFile()); + + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "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")); + } } diff --git a/src/test/resources/testBuildArgs/Dockerfile b/src/test/resources/testBuildArgs/Dockerfile new file mode 100644 index 000000000..c8dd0ae36 --- /dev/null +++ b/src/test/resources/testBuildArgs/Dockerfile @@ -0,0 +1,5 @@ +FROM ubuntu:latest + +ARG testArg + +LABEL "test"=$testArg From 6845dc30222fa1982aad55fa53a062ae189e1e2a Mon Sep 17 00:00:00 2001 From: gtejasvarma Date: Mon, 21 Dec 2015 13:48:00 -0800 Subject: [PATCH 0118/1032] changing to Object type from native type --- .../dockerjava/api/command/InspectContainerResponse.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 a6e396985..d8d3a5066 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -67,7 +67,7 @@ public class InspectContainerResponse { private String name; @JsonProperty("RestartCount") - private int restartCount;; + private Integer restartCount; @JsonProperty("NetworkSettings") private NetworkSettings networkSettings; @@ -163,7 +163,7 @@ public String getName() { return name; } - public int getRestartCount() { + public Integer getRestartCount() { return restartCount; } From a11811b8b6a725ba0f3349dd4e543f8ba80d0123 Mon Sep 17 00:00:00 2001 From: alenkacz Date: Sat, 9 Jan 2016 13:38:04 +0100 Subject: [PATCH 0119/1032] Add information about API version --- .../com/github/dockerjava/api/command/BuildImageCmd.java | 7 +++++++ 1 file changed, 7 insertions(+) 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 07d29fb54..3f3ca5a5e 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -10,6 +10,7 @@ import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.core.RemoteApiVersion; /** * Build an image from Dockerfile. @@ -88,6 +89,9 @@ public interface BuildImageCmd extends AsyncDockerCmd getBuildArgs(); @@ -119,6 +123,9 @@ public interface BuildImageCmd extends AsyncDockerCmd Date: Sun, 10 Jan 2016 09:24:28 +0100 Subject: [PATCH 0120/1032] Add also netty based implementation --- .../dockerjava/netty/exec/BuildImageCmdExec.java | 12 ++++++++++++ .../netty/exec/BuildImageCmdExecTest.java | 14 ++++++++++++++ 2 files changed, 26 insertions(+) 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 9c0e6c09f..0d1573158 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java @@ -1,5 +1,6 @@ package com.github.dockerjava.netty.exec; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,9 +14,12 @@ import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; +import java.io.IOException; + 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); @@ -80,6 +84,14 @@ protected Void execute0(BuildImageCmd command, ResultCallback webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus()); } + if (command.getBuildArgs() != null) { + try { + webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs())); + } catch (IOException e) { + // pass + } + } + LOGGER.trace("POST: {}", webTarget); InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request()).accept( 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 7fb94fcd4..e4aa05250 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -296,4 +296,18 @@ public void testBuildFromPrivateRegistry() throws Exception { LOG.info("Image Inspect: {}", inspectImageResponse.toString()); } + + @Test + public void testBuildArgs() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildArgs").getFile()); + + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "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")); + } } From 5b6cc0f5ad41f1e9e1ed49625d0c82229ae50428 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 Jan 2016 17:26:51 +0100 Subject: [PATCH 0121/1032] Dont preset empty buildArgs --- .../github/dockerjava/core/command/BuildImageCmdImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 6d2fefd92..acf4fa10a 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -52,7 +52,7 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd buildArgs = new HashMap(); + private Map buildArgs; public BuildImageCmdImpl(BuildImageCmd.Exec exec) { super(exec); @@ -230,6 +230,9 @@ public BuildImageCmd withCpusetcpus(String cpusetcpus) { @Override public BuildImageCmd withBuildArg(String key, String value) { + if (this.buildArgs == null) { + this.buildArgs = new HashMap(); + } this.buildArgs.put(key, value); return this; } From 49a84c1aec17e293801db8743828e0b73198afdf Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 Jan 2016 17:28:11 +0100 Subject: [PATCH 0122/1032] send buildArgs only if non-empty --- .../github/dockerjava/jaxrs/BuildImageCmdExec.java | 10 +++++++--- .../dockerjava/netty/exec/BuildImageCmdExec.java | 14 ++++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 68e56bbec..ec6be7fe1 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -7,6 +7,7 @@ import javax.ws.rs.core.MediaType; import com.fasterxml.jackson.databind.ObjectMapper; + import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.RequestEntityProcessing; import org.slf4j.Logger; @@ -22,10 +23,12 @@ import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; import java.io.IOException; +import java.net.URLEncoder; 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) { @@ -96,11 +99,12 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag webTarget = webTarget.queryParam("rm", "false"); } - if (command.getBuildArgs() != null) { + if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) { try { - webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs())); + webTarget = webTarget.queryParam("buildargs", + URLEncoder.encode(MAPPER.writeValueAsString(command.getBuildArgs()), "UTF-8")); } catch (IOException e) { - // pass + throw new RuntimeException(e); } } 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 0d1573158..ba09fa743 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java @@ -19,6 +19,7 @@ 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) { @@ -84,18 +85,19 @@ protected Void execute0(BuildImageCmd command, ResultCallback webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus()); } - if (command.getBuildArgs() != null) { + if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) { try { webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs())); - } catch (IOException e) { - // pass - } + } catch (IOException e) { + throw new RuntimeException(e); + } } LOGGER.trace("POST: {}", webTarget); - InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request()).accept( - MediaType.APPLICATION_JSON).header("Content-Type", "application/tar").header("encoding", "gzip"); + InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request()) + .accept(MediaType.APPLICATION_JSON).header("Content-Type", "application/tar") + .header("encoding", "gzip"); builder.post(new TypeReference() { }, resultCallback, command.getTarInputStream()); From 672984d11f8468531700e180631e462723d35674 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 10 Jan 2016 17:30:52 +0100 Subject: [PATCH 0123/1032] update CHANGELOG --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9c6adde9..55e1593d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,10 @@ Notes All changes +* [#410] (https://github.com/docker-java/docker-java/pull/410) Support for build-args of docker build * [#408] (https://github.com/docker-java/docker-java/pull/408) Support for volume API * [#396] (https://github.com/docker-java/docker-java/pull/396) Disable evaluation of http.proxy... variables when using unix socket connection -* [#393] (https://github.com/docker-java/docker-java/pull/392) Support ONBUILD instruction in Dockerfiles +* [#393] (https://github.com/docker-java/docker-java/pull/393) Support ONBUILD instruction in Dockerfiles * [#392] (https://github.com/docker-java/docker-java/pull/392) Introduce InspectContainerResponse.Mounts * [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public * [#386] (https://github.com/docker-java/docker-java/pull/386) Basic http proxy configuration support From 231d0c5509e63ae69e4d9e37549ef28460abc9f4 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Mon, 11 Jan 2016 22:52:34 +0100 Subject: [PATCH 0124/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55e1593d8..380ba2c38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ All changes * [#347] (https://github.com/docker-java/docker-java/pull/347) Implementation of copy archive to/from container commands * [#313] (https://github.com/docker-java/docker-java/pull/313) Refactor primitive type fields to be of object type in JSON objects -2.1.4-SNAPSHOT +v2.1.4 --- * [#396] (https://github.com/docker-java/docker-java/pull/396) Disable evaluation of http.proxy... variables when using unix socket connection From d4e01e30002df2dad89a700f04a2e0d53117eb64 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 15 Jan 2016 21:39:38 +0100 Subject: [PATCH 0125/1032] Add inspect container RestartCount test --- .../api/command/InspectContainerResponse.java | 3 + .../command/InspectContainerCmdImplTest.java | 90 +++++++++++++++++++ .../exec/InspectContainerCmdExecTest.java | 15 ++++ 3 files changed, 108 insertions(+) create mode 100644 src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java 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 d8d3a5066..59438dba2 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -66,6 +66,9 @@ public class InspectContainerResponse { @JsonProperty("Name") private String name; + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ @JsonProperty("RestartCount") private Integer restartCount; diff --git a/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java new file mode 100644 index 000000000..cf555a28a --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java @@ -0,0 +1,90 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +import java.lang.reflect.Method; +import java.security.SecureRandom; + +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 com.github.dockerjava.api.command.CreateContainerResponse; +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.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class InspectContainerCmdImplTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(InspectContainerCmdImplTest.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 inspectContainer() throws DockerException { + + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") + .withName(containerName).exec(); + LOG.info("Created container {}", container.toString()); + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse containerInfo = dockerClient.inspectContainerCmd(container.getId()).exec(); + assertEquals(containerInfo.getId(), container.getId()); + + } + + @Test + public void inspectNonExistingContainer() throws DockerException { + + try { + dockerClient.inspectContainerCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + + @Test + public void inspectContainerRestartCount() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withCmd("env").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getRestartCount(), equalTo(0)); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java index 63bafe7d2..31116ef22 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java @@ -1,6 +1,7 @@ package com.github.dockerjava.netty.exec; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; @@ -72,4 +73,18 @@ public void inspectNonExistingContainer() throws DockerException { } } + @Test + public void inspectContainerRestartCount() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withCmd("env").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getRestartCount(), equalTo(0)); + } } From b86392aea1358f3b0341f297c38cd59865c17d79 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 15 Jan 2016 21:41:05 +0100 Subject: [PATCH 0126/1032] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 380ba2c38..6b0b38327 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,9 @@ Notes * The upcoming release will contain multiple API breaking changes therefore the major version switch. It will support a subset of v.1.21 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. All changes - * [#410] (https://github.com/docker-java/docker-java/pull/410) Support for build-args of docker build -* [#408] (https://github.com/docker-java/docker-java/pull/408) Support for volume API +* [#408] (https://github.com/docker-java/docker-java/pull/408) Support for volume API +* [#406] (https://github.com/docker-java/docker-java/pull/406) Added RestartCount to InspectContainerResponse * [#396] (https://github.com/docker-java/docker-java/pull/396) Disable evaluation of http.proxy... variables when using unix socket connection * [#393] (https://github.com/docker-java/docker-java/pull/393) Support ONBUILD instruction in Dockerfiles * [#392] (https://github.com/docker-java/docker-java/pull/392) Introduce InspectContainerResponse.Mounts From f6d225d2c2e65aa058da5b94c2350cbe5d5f96c9 Mon Sep 17 00:00:00 2001 From: Andrew Keely Date: Fri, 8 Jan 2016 22:58:51 -0500 Subject: [PATCH 0127/1032] Implement Network API --- .../github/dockerjava/api/DockerClient.java | 18 ++ .../api/command/ConnectToNetworkCmd.java | 27 ++ .../api/command/CreateNetworkCmd.java | 42 +++ .../api/command/CreateNetworkResponse.java | 36 +++ .../api/command/DisconnectFromNetworkCmd.java | 27 ++ .../api/command/DockerCmdExecFactory.java | 12 + .../api/command/InspectContainerResponse.java | 54 +--- .../api/command/InspectExecResponse.java | 31 ++ .../api/command/InspectNetworkCmd.java | 31 ++ .../api/command/ListNetworksCmd.java | 25 ++ .../api/command/RemoveNetworkCmd.java | 30 ++ .../github/dockerjava/api/model/Network.java | 154 ++++++++++ .../dockerjava/api/model/NetworkFilters.java | 15 + .../dockerjava/api/model/NetworkSettings.java | 272 ++++++++++++++++++ .../dockerjava/api/model/PortBinding.java | 1 - .../github/dockerjava/api/model/Ports.java | 1 - .../dockerjava/core/DockerClientImpl.java | 42 +++ .../core/command/ConnectToNetworkCmdImpl.java | 39 +++ .../core/command/CreateNetworkCmdImpl.java | 71 +++++ .../command/DisconnectFromNetworkCmdImpl.java | 40 +++ .../core/command/InpectNetworkCmdImpl.java | 24 ++ .../core/command/ListNetworksCmdImpl.java | 27 ++ .../core/command/RemoveNetworkCmdImpl.java | 26 ++ .../jaxrs/ConnectToNetworkCmdExec.java | 32 +++ .../jaxrs/CreateNetworkCmdExec.java | 31 ++ .../jaxrs/DisconnectFromNetworkCmdExec.java | 32 +++ .../jaxrs/DockerCmdExecFactoryImpl.java | 91 ++++-- .../jaxrs/InspectNetworkCmdExec.java | 28 ++ .../dockerjava/jaxrs/ListNetworksCmdExec.java | 43 +++ .../jaxrs/RemoveNetworkCmdExec.java | 30 ++ .../netty/DockerCmdExecFactoryImpl.java | 96 +++++-- .../netty/exec/ConnectToNetworkCmdExec.java | 29 ++ .../netty/exec/CreateNetworkCmdExec.java | 30 ++ .../exec/DisconnectFromNetworkCmdExec.java | 29 ++ .../netty/exec/InspectNetworkCmdExec.java | 29 ++ .../netty/exec/ListNetworksCmdExec.java | 37 +++ .../netty/exec/RemoveNetworkCmdExec.java | 29 ++ .../client/AbstractDockerClientTest.java | 23 ++ .../core/TestDockerCmdExecFactory.java | 97 ++++--- .../command/ConnectToNetworkCmdImplTest.java | 59 ++++ .../command/CreateNetworkCmdImplTest.java | 52 ++++ .../DisconnectFromNetworkCmdImplTest.java | 59 ++++ .../command/InspectContainerCmdImplTest.java | 15 + .../core/command/InspectExecCmdImplTest.java | 30 +- .../command/InspectNetworkCmdImplTest.java | 57 ++++ .../core/command/ListNetworksCmdImplTest.java | 55 ++++ .../command/RemoveNetworkCmdImplTest.java | 76 +++++ .../netty/exec/CreateNetworkCmdExecTest.java | 52 ++++ .../exec/InspectContainerCmdExecTest.java | 15 + .../netty/exec/InspectExecCmdExecTest.java | 22 ++ .../netty/exec/InspectNetworkCmdExecTest.java | 57 ++++ .../netty/exec/ListNetworksCmdExecTest.java | 55 ++++ .../netty/exec/RemoveNetworkCmdExecTest.java | 76 +++++ 53 files changed, 2252 insertions(+), 159 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java create mode 100644 src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java create mode 100644 src/main/java/com/github/dockerjava/api/model/Network.java create mode 100644 src/main/java/com/github/dockerjava/api/model/NetworkFilters.java create mode 100644 src/main/java/com/github/dockerjava/api/model/NetworkSettings.java create mode 100644 src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/CreateNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java create mode 100644 src/main/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExec.java create mode 100644 src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/InspectNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/ListNetworksCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/ListNetworksCmdExecTest.java create mode 100644 src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index a3a3a9aa0..5db2967ff 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -11,13 +11,16 @@ 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.EventsCmd; import com.github.dockerjava.api.command.ExecCreateCmd; import com.github.dockerjava.api.command.ExecStartCmd; @@ -25,10 +28,12 @@ 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.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; @@ -37,6 +42,7 @@ 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; @@ -200,6 +206,18 @@ public interface DockerClient extends Closeable { public ListVolumesCmd listVolumesCmd(); + public ListNetworksCmd listNetworksCmd(); + + public InspectNetworkCmd inspectNetworkCmd(); + + public CreateNetworkCmd createNetworkCmd(); + + public RemoveNetworkCmd removeNetworkCmd(@Nonnull String networkId); + + public ConnectToNetworkCmd connectToNetworkCmd(); + + public DisconnectFromNetworkCmd disconnectFromNetworkCmd(); + @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java new file mode 100644 index 000000000..cf76e2ec3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Connects a container to a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface ConnectToNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getNetworkId(); + + @CheckForNull + public String getContainerId(); + + public ConnectToNetworkCmd withNetworkId(@Nonnull String networkId); + + public ConnectToNetworkCmd withContainerId(@Nonnull String containerId); + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java new file mode 100644 index 000000000..2e3cd92a0 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java @@ -0,0 +1,42 @@ +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; + +/** + * Create a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface CreateNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getName(); + + @CheckForNull + public String getDriver(); + + @CheckForNull + public Network.Ipam getIpam(); + + /** The new network's name. Required. */ + public CreateNetworkCmd withName(@Nonnull String name); + + /** Optional custom IP scheme for the network. */ + public CreateNetworkCmd withIpamConfig(Ipam.Config config); + + /** Name of the network driver to use. Defaults to bridge. */ + public CreateNetworkCmd withDriver(String driver); + + /** Driver specific options */ + public CreateNetworkCmd withOptions(Map options); + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java b/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java new file mode 100644 index 000000000..ec4827476 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.ToStringBuilder; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class CreateNetworkResponse { + + @JsonProperty("Id") + private String id; + + @JsonProperty("Warnings") + private String[] warnings; + + public String getId() { + return id; + } + + public String[] getWarnings() { + return warnings; + } + + public void setId(String id) { + this.id = id; + } + + public void setWarnings(String[] warnings) { + this.warnings = warnings; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java new file mode 100644 index 000000000..a2452416b --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Disconnects a container from a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface DisconnectFromNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getNetworkId(); + + @CheckForNull + public String getContainerId(); + + public DisconnectFromNetworkCmd withNetworkId(@Nonnull String networkId); + + public DisconnectFromNetworkCmd withContainerId(@Nonnull String containerId); + + public static interface Exec extends DockerCmdSyncExec { + } +} 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 98de728e8..fb1715e38 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -93,6 +93,18 @@ public interface DockerCmdExecFactory extends Closeable { public ListVolumesCmd.Exec createListVolumesCmdExec(); + public ListNetworksCmd.Exec createListNetworksCmdExec(); + + public InspectNetworkCmd.Exec createInspectNetworkCmdExec(); + + public CreateNetworkCmd.Exec createCreateNetworkCmdExec(); + + public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec(); + + public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec(); + + public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec(); + @Override public void close() throws IOException; 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 59438dba2..85f2812f0 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -1,7 +1,6 @@ package com.github.dockerjava.api.command; import java.util.List; -import java.util.Map; import javax.annotation.CheckForNull; @@ -14,7 +13,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.model.ContainerConfig; import com.github.dockerjava.api.model.HostConfig; -import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.NetworkSettings; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumeBind; import com.github.dockerjava.api.model.VolumeBinds; @@ -203,56 +202,7 @@ public String toString() { return ToStringBuilder.reflectionToString(this); } - @JsonIgnoreProperties(ignoreUnknown = true) - public class NetworkSettings { - - @JsonProperty("IPAddress") - private String ipAddress; - - @JsonProperty("IPPrefixLen") - private Integer ipPrefixLen; - - @JsonProperty("Gateway") - private String gateway; - - @JsonProperty("Bridge") - private String bridge; - - @JsonProperty("PortMapping") - private Map> portMapping; - - @JsonProperty("Ports") - private Ports ports; - - public String getIpAddress() { - return ipAddress; - } - - public Integer getIpPrefixLen() { - return ipPrefixLen; - } - - public String getGateway() { - return gateway; - } - public String getBridge() { - return bridge; - } - - public Map> getPortMapping() { - return portMapping; - } - - public Ports getPorts() { - return ports; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this); - } - } @JsonIgnoreProperties(ignoreUnknown = true) public class ContainerState { @@ -514,7 +464,5 @@ public String getMode() { public Boolean getRW() { return rw; } - } - } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java index b1cb09b20..63f111dce 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java @@ -6,6 +6,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.NetworkSettings; +import com.github.dockerjava.core.RemoteApiVersion; @JsonIgnoreProperties(ignoreUnknown = true) public class InspectExecResponse { @@ -27,6 +29,12 @@ public class InspectExecResponse { @JsonProperty("ExitCode") private Integer exitCode; + @JsonProperty("ProcessConfig") + private ProcessConfig processConfig; + + @JsonProperty("Container") + private Container container; + public String getId() { return id; } @@ -51,6 +59,14 @@ public Integer getExitCode() { return exitCode; } + public ProcessConfig getProcessConfig() { + return processConfig; + } + + public Container getContainer() { + return container; + } + @Override public String toString() { return ToStringBuilder.reflectionToString(this); @@ -58,6 +74,7 @@ public String toString() { @JsonIgnoreProperties(ignoreUnknown = true) public class ProcessConfig { + @JsonProperty("arguments") private List arguments; @@ -98,4 +115,18 @@ public String toString() { return ToStringBuilder.reflectionToString(this); } } + + @JsonIgnoreProperties(ignoreUnknown = true) + public class Container { + + @JsonProperty("NetworkSettings") + private NetworkSettings networkSettings; + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public NetworkSettings getNetworkSettings() { + return networkSettings; + } + } } diff --git a/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java new file mode 100644 index 000000000..18394879a --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Inspect a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface InspectNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getNetworkId(); + + public InspectNetworkCmd withNetworkId(@Nonnull String networkId); + + /** + * @throws NotFoundException + * No such network + */ + @Override + public Network exec() throws NotFoundException; + + public static interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java new file mode 100644 index 000000000..2b5b29996 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java @@ -0,0 +1,25 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Filters; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; + +import java.util.List; + +/** + * List networks. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface ListNetworksCmd extends SyncDockerCmd> { + + @CheckForNull + public Filters getFilters(); + + ListNetworksCmd withFilters(Filters filters); + + public static interface Exec extends DockerCmdSyncExec> { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java b/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java new file mode 100644 index 000000000..3dcb428e2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.core.RemoteApiVersion; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Remove a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface RemoveNetworkCmd extends SyncDockerCmd { + + @CheckForNull + public String getNetworkId(); + + public RemoveNetworkCmd withNetworkId(@Nonnull String networkId); + + /** + * @throws NotFoundException + * No such network + */ + @Override + public Void exec() throws NotFoundException; + + public static 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 new file mode 100644 index 000000000..d62d83019 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/Network.java @@ -0,0 +1,154 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.commons.lang.builder.ToStringBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Network { + + @JsonProperty("Id") + private String id; + + @JsonProperty("Name") + private String name; + + @JsonProperty("Scope") + private String scope; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("IPAM") + private Ipam ipam; + + @JsonProperty("Containers") + private Map containers; + + @JsonProperty("Options") + private Map options; + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public String getScope() { + return scope; + } + + public String getDriver() { + return driver; + } + + public Ipam getIpam() { + return ipam; + } + + public Map getContainers() { + return containers; + } + + public Map getOptions() { + return options; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class ContainerNetworkConfig { + + @JsonProperty("EndpointID") + private String endpointId; + + @JsonProperty("MacAddress") + private String macAddress; + + @JsonProperty("IPv4Address") + private String ipv4Address; + + @JsonProperty("IPv6Address") + private String ipv6Address; + + public String getEndpointId() { + return endpointId; + } + + public String getMacAddress() { + return macAddress; + } + + public String getIpv4Address() { + return ipv4Address; + } + + public String getIpv6Address() { + return ipv6Address; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Ipam { + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("Config") + List config = new ArrayList<>(); + + public String getDriver() { + return driver; + } + + public List getConfig() { + return config; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Config { + + @JsonProperty("Subnet") + private String subnet; + + @JsonProperty("IPRange") + private String ipRange; + + @JsonProperty("Gateway") + private String gateway; + + public String getSubnet() { + return subnet; + } + + public String getIpRange() { + return ipRange; + } + + public String getGateway() { + return gateway; + } + } + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java b/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java new file mode 100644 index 000000000..f3c837643 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java @@ -0,0 +1,15 @@ +package com.github.dockerjava.api.model; + +/** + * Created by andrewk on 1/5/16. + */ +public class NetworkFilters extends Filters { + + public Filters withNames(String... names) { + return withFilter("name", names); + } + + public Filters withIds(String... ids) { + return withFilter("id", ids); + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java new file mode 100644 index 000000000..64c954ec9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/model/NetworkSettings.java @@ -0,0 +1,272 @@ +/* + * Created on 16.01.2016 + */ +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; + +/** + * + * @author Marcus Linke + * + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class NetworkSettings { + + @JsonProperty("Bridge") + private String bridge; + + @JsonProperty("SandboxID") + private String sandboxId; + + @JsonProperty("HairpinMode") + private Boolean hairpinMode; + + @JsonProperty("LinkLocalIPv6Address") + private String linkLocalIPv6Address; + + @JsonProperty("LinkLocalIPv6PrefixLen") + private Integer linkLocalIPv6PrefixLen; + + @JsonProperty("Ports") + private Ports ports; + + @JsonProperty("SandboxKey") + private String sandboxKey; + + @JsonProperty("SecondaryIPAddresses") + private Object secondaryIPAddresses; + + @JsonProperty("SecondaryIPv6Addresses") + private Object secondaryIPv6Addresses; + + @JsonProperty("EndpointID") + private String endpointID; + + @JsonProperty("Gateway") + private String gateway; + + @JsonProperty("PortMapping") + private Map> portMapping; + + @JsonProperty("GlobalIPv6Address") + private String globalIPv6Address; + + @JsonProperty("GlobalIPv6PrefixLen") + private Integer globalIPv6PrefixLen; + + @JsonProperty("IPAddress") + private String ipAddress; + + @JsonProperty("IPPrefixLen") + private Integer ipPrefixLen; + + @JsonProperty("IPv6Gateway") + private String ipV6Gateway; + + @JsonProperty("MacAddress") + private String macAddress; + + @JsonProperty("Networks") + private Map networks; + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getIpAddress() { + return ipAddress; + } + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public Integer getIpPrefixLen() { + return ipPrefixLen; + } + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getGateway() { + return gateway; + } + + public String getBridge() { + return bridge; + } + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public Map> getPortMapping() { + return portMapping; + } + + /** + * @deprecated since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getMacAddress() { + return macAddress; + } + + public Ports getPorts() { + return ports; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getEndpointID() { + return endpointID; + } + + public String getIpV6Gateway() { + return ipV6Gateway; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Map getNetworks() { + return networks; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getSandboxId() { + return sandboxId; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getSandboxKey() { + return sandboxKey; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Object getSecondaryIPAddresses() { + return secondaryIPAddresses; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Object getSecondaryIPv6Addresses() { + return secondaryIPv6Addresses; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Boolean getHairpinMode() { + return hairpinMode; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getLinkLocalIPv6Address() { + return linkLocalIPv6Address; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Integer getLinkLocalIPv6PrefixLen() { + return linkLocalIPv6PrefixLen; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public String getGlobalIPv6Address() { + return globalIPv6Address; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public Integer getGlobalIPv6PrefixLen() { + return globalIPv6PrefixLen; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Network { + + @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; + + 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/api/model/PortBinding.java b/src/main/java/com/github/dockerjava/api/model/PortBinding.java index 355e83aa3..99e04f1bc 100644 --- a/src/main/java/com/github/dockerjava/api/model/PortBinding.java +++ b/src/main/java/com/github/dockerjava/api/model/PortBinding.java @@ -4,7 +4,6 @@ import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; -import com.github.dockerjava.api.command.InspectContainerResponse.NetworkSettings; import com.github.dockerjava.api.model.Ports.Binding; /** 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 a5f13977b..0ff5762e6 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -23,7 +23,6 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.node.NullNode; -import com.github.dockerjava.api.command.InspectContainerResponse.NetworkSettings; /** * A container for port bindings, made available as a {@link Map} via its {@link #getBindings()} method. diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 05726f735..ede135613 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -12,13 +12,16 @@ 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; @@ -27,10 +30,12 @@ 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.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; @@ -39,6 +44,7 @@ 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; @@ -57,17 +63,21 @@ import com.github.dockerjava.core.command.AuthCmdImpl; import com.github.dockerjava.core.command.BuildImageCmdImpl; import com.github.dockerjava.core.command.CommitCmdImpl; +import com.github.dockerjava.core.command.ConnectToNetworkCmdImpl; import com.github.dockerjava.core.command.ContainerDiffCmdImpl; import com.github.dockerjava.core.command.CopyArchiveFromContainerCmdImpl; import com.github.dockerjava.core.command.CopyArchiveToContainerCmdImpl; import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; import com.github.dockerjava.core.command.CreateContainerCmdImpl; import com.github.dockerjava.core.command.CreateImageCmdImpl; +import com.github.dockerjava.core.command.CreateNetworkCmdImpl; import com.github.dockerjava.core.command.CreateVolumeCmdImpl; +import com.github.dockerjava.core.command.DisconnectFromNetworkCmdImpl; import com.github.dockerjava.core.command.EventsCmdImpl; import com.github.dockerjava.core.command.ExecCreateCmdImpl; import com.github.dockerjava.core.command.ExecStartCmdImpl; import com.github.dockerjava.core.command.InfoCmdImpl; +import com.github.dockerjava.core.command.InpectNetworkCmdImpl; import com.github.dockerjava.core.command.InspectContainerCmdImpl; import com.github.dockerjava.core.command.InspectExecCmdImpl; import com.github.dockerjava.core.command.InspectImageCmdImpl; @@ -75,6 +85,7 @@ import com.github.dockerjava.core.command.KillContainerCmdImpl; import com.github.dockerjava.core.command.ListContainersCmdImpl; 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.LogContainerCmdImpl; import com.github.dockerjava.core.command.PauseContainerCmdImpl; @@ -83,6 +94,7 @@ import com.github.dockerjava.core.command.PushImageCmdImpl; import com.github.dockerjava.core.command.RemoveContainerCmdImpl; 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.RestartContainerCmdImpl; import com.github.dockerjava.core.command.SaveImageCmdImpl; @@ -417,6 +429,36 @@ public ListVolumesCmd listVolumesCmd() { return new ListVolumesCmdImpl(getDockerCmdExecFactory().createListVolumesCmdExec()); } + @Override + public ListNetworksCmd listNetworksCmd() { + return new ListNetworksCmdImpl(getDockerCmdExecFactory().createListNetworksCmdExec()); + } + + @Override + public InspectNetworkCmd inspectNetworkCmd() { + return new InpectNetworkCmdImpl(getDockerCmdExecFactory().createInspectNetworkCmdExec()); + } + + @Override + public CreateNetworkCmd createNetworkCmd() { + return new CreateNetworkCmdImpl(getDockerCmdExecFactory().createCreateNetworkCmdExec()); + } + + @Override + public RemoveNetworkCmd removeNetworkCmd(String networkId) { + return new RemoveNetworkCmdImpl(getDockerCmdExecFactory().createRemoveNetworkCmdExec(), networkId); + } + + @Override + public ConnectToNetworkCmd connectToNetworkCmd() { + return new ConnectToNetworkCmdImpl(getDockerCmdExecFactory().createConnectToNetworkCmdExec()); + } + + @Override + public DisconnectFromNetworkCmd disconnectFromNetworkCmd() { + return new DisconnectFromNetworkCmdImpl(getDockerCmdExecFactory().createDisconnectFromNetworkCmdExec()); + } + @Override public void close() throws IOException { getDockerCmdExecFactory().close(); diff --git a/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java new file mode 100644 index 000000000..cfb6cce14 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java @@ -0,0 +1,39 @@ +package com.github.dockerjava.core.command; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.command.ConnectToNetworkCmd; +import com.github.dockerjava.api.command.DockerCmdSyncExec; + +public class ConnectToNetworkCmdImpl extends AbstrDockerCmd implements ConnectToNetworkCmd { + + @JsonIgnore + private String networkId; + + @JsonProperty("Container") + private String containerId; + + public ConnectToNetworkCmdImpl(DockerCmdSyncExec execution) { + super(execution); + } + + @Override + public String getNetworkId() { + return networkId; + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override public ConnectToNetworkCmd withNetworkId(String networkId) { + this.networkId = networkId; + return this; + } + + @Override public ConnectToNetworkCmd withContainerId(String containerId) { + this.containerId = containerId; + 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 new file mode 100644 index 000000000..fba16dfb9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java @@ -0,0 +1,71 @@ +package com.github.dockerjava.core.command; + + +import java.util.HashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.command.CreateNetworkCmd; +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.api.model.Network.Ipam; + +public class CreateNetworkCmdImpl extends AbstrDockerCmd + implements CreateNetworkCmd { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("IPAM") + private Network.Ipam ipam; + + @JsonProperty("Options") + private Map options = new HashMap<>(); + + public CreateNetworkCmdImpl(DockerCmdSyncExec execution) { + super(execution); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getDriver() { + return driver; + } + + @Override + public Network.Ipam getIpam() { + return ipam; + } + + @Override + public CreateNetworkCmd withName(String name) { + this.name = name; + return this; + } + + @Override + public CreateNetworkCmd withDriver(String driver) { + this.driver = driver; + return this; + } + + @Override + public CreateNetworkCmd withIpamConfig(Ipam.Config config) { + this.ipam.getConfig().add(config); + return this; + } + + @Override + public CreateNetworkCmd withOptions(Map options) { + this.options = options; + 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 new file mode 100644 index 000000000..a89201ad2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.core.command; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; +import com.github.dockerjava.api.command.DockerCmdSyncExec; + +public class DisconnectFromNetworkCmdImpl extends AbstrDockerCmd + implements DisconnectFromNetworkCmd { + + @JsonIgnore + private String networkId; + + @JsonProperty("Container") + private String containerId; + + public DisconnectFromNetworkCmdImpl(DockerCmdSyncExec execution) { + super(execution); + } + + @Override + public String getNetworkId() { + return networkId; + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override public DisconnectFromNetworkCmd withNetworkId(String networkId) { + this.networkId = networkId; + return this; + } + + @Override public DisconnectFromNetworkCmd withContainerId(String containerId) { + this.containerId = containerId; + return this; + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java new file mode 100644 index 000000000..0a0c564c5 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java @@ -0,0 +1,24 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.api.command.InspectNetworkCmd; +import com.github.dockerjava.api.model.Network; + +public class InpectNetworkCmdImpl extends AbstrDockerCmd implements InspectNetworkCmd { + + private String networkId; + + public InpectNetworkCmdImpl(DockerCmdSyncExec exec) { + super(exec); + } + + @Override public String getNetworkId() { + return networkId; + } + + @Override public InspectNetworkCmd withNetworkId(String networkId) { + + this.networkId = networkId; + return this; + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java new file mode 100644 index 000000000..2303e7c9c --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.ListNetworksCmd; +import com.github.dockerjava.api.model.Filters; +import com.github.dockerjava.api.model.Network; + +import java.util.List; + +public class ListNetworksCmdImpl extends AbstrDockerCmd> implements + ListNetworksCmd { + + private Filters filters; + + public ListNetworksCmdImpl(ListNetworksCmd.Exec exec) { + super(exec); + } + + @Override public Filters getFilters() { + return filters; + } + + @Override public ListNetworksCmd withFilters(Filters filters) { + + this.filters = filters; + 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 new file mode 100644 index 000000000..ced7279f9 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/RemoveNetworkCmdImpl.java @@ -0,0 +1,26 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.DockerCmdSyncExec; +import com.github.dockerjava.api.command.RemoveNetworkCmd; + +public class RemoveNetworkCmdImpl extends AbstrDockerCmd implements RemoveNetworkCmd { + + private String networkId; + + public RemoveNetworkCmdImpl(DockerCmdSyncExec execution, String networkId) { + super(execution); + withNetworkId(networkId); + } + + @Override + public String getNetworkId() { + + return networkId; + } + + @Override + public RemoveNetworkCmd withNetworkId(String networkId) { + this.networkId = networkId; + return this; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java new file mode 100644 index 000000000..dfc730e03 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ConnectToNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; + +public class ConnectToNetworkCmdExec extends AbstrSyncDockerCmdExec + implements ConnectToNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ConnectToNetworkCmdExec.class); + + public ConnectToNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(ConnectToNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId() + "/connect"); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(entity(command, MediaType.APPLICATION_JSON)); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/CreateNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/CreateNetworkCmdExec.java new file mode 100644 index 000000000..14f22b502 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/CreateNetworkCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.CreateNetworkCmd; +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; + +public class CreateNetworkCmdExec extends AbstrSyncDockerCmdExec implements + CreateNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateNetworkCmdExec.class); + + public CreateNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateNetworkResponse execute(CreateNetworkCmd command) { + WebTarget webResource = getBaseResource().path("/networks/create"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(entity(command, MediaType.APPLICATION_JSON), CreateNetworkResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java new file mode 100644 index 000000000..4f6f54576 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; + +public class DisconnectFromNetworkCmdExec extends AbstrSyncDockerCmdExec + implements DisconnectFromNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(DisconnectFromNetworkCmdExec.class); + + public DisconnectFromNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(DisconnectFromNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId() + "/disconnect"); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(entity(command, MediaType.APPLICATION_JSON)); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 30bc5e34f..bbd71ba38 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -2,44 +2,21 @@ 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.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 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.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; @@ -48,10 +25,12 @@ 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.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; @@ -60,6 +39,7 @@ 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; @@ -78,6 +58,30 @@ import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter; +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.client.ClientConfig; +import org.glassfish.jersey.client.ClientProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +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 java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.ProxySelector; +import java.net.URI; +import java.util.List; //import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; // see https://github.com/docker-java/docker-java/issues/196 @@ -445,6 +449,41 @@ 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()!"); diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java new file mode 100644 index 000000000..c5e6b4d0a --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.InspectNetworkCmd; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +public class InspectNetworkCmdExec extends AbstrSyncDockerCmdExec implements InspectNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListNetworksCmdExec.class); + + public InspectNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override protected Network execute(InspectNetworkCmd command) { + + WebTarget webResource = getBaseResource().path("/networks/{id}").resolveTemplate("id", + command.getNetworkId()); + + LOGGER.debug("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(Network.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java new file mode 100644 index 000000000..80438d433 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java @@ -0,0 +1,43 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ListNetworksCmd; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; +import java.util.List; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +public class ListNetworksCmdExec extends AbstrSyncDockerCmdExec> implements + ListNetworksCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListNetworksCmdExec.class); + + public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected List execute(ListNetworksCmd command) { + WebTarget webTarget = getBaseResource().path("/networks"); + + if (command.getFilters() != null) { + webTarget = webTarget + .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + } + + LOGGER.trace("GET: {}", webTarget); + List networks = webTarget.request().accept(MediaType.APPLICATION_JSON) + .get(new GenericType>() { + }); + LOGGER.trace("Response: {}", networks); + + return networks; + } + +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java new file mode 100644 index 000000000..84f115d4c --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.RemoveNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +public class RemoveNetworkCmdExec extends AbstrSyncDockerCmdExec + implements RemoveNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveNetworkCmdExec.class); + + public RemoveNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete().close(); + + 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 9ddd51288..ee3b50101 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -1,44 +1,19 @@ 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.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.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 java.io.IOException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.security.Security; - -import javax.net.ssl.SSLContext; -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; 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; @@ -47,10 +22,12 @@ 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.LogContainerCmd; import com.github.dockerjava.api.command.PauseContainerCmd; @@ -59,6 +36,7 @@ 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; @@ -77,13 +55,16 @@ 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; @@ -91,10 +72,12 @@ 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.LogContainerCmdExec; import com.github.dockerjava.netty.exec.PauseContainerCmdExec; @@ -103,6 +86,7 @@ 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; @@ -115,6 +99,32 @@ import com.github.dockerjava.netty.exec.UnpauseContainerCmdExec; import com.github.dockerjava.netty.exec.VersionCmdExec; import com.github.dockerjava.netty.exec.WaitContainerCmdExec; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +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.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 org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.net.ssl.SSLContext; +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 @@ -505,6 +515,36 @@ 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()!"); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java new file mode 100644 index 000000000..b1090f4c3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.ConnectToNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class ConnectToNetworkCmdExec extends AbstrSyncDockerCmdExec + implements ConnectToNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ConnectToNetworkCmdExec.class); + + public ConnectToNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(ConnectToNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId() + "/connect"); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(command); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExec.java new file mode 100644 index 000000000..cfc825e80 --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.CreateNetworkCmd; +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CreateNetworkCmdExec extends AbstrSyncDockerCmdExec implements + CreateNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(CreateNetworkCmdExec.class); + + public CreateNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected CreateNetworkResponse execute(CreateNetworkCmd command) { + WebTarget webResource = getBaseResource().path("/networks/create"); + + LOGGER.trace("POST: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON) + .post(command, new TypeReference() { + }); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java new file mode 100644 index 000000000..8b814bddc --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class DisconnectFromNetworkCmdExec extends AbstrSyncDockerCmdExec + implements DisconnectFromNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(DisconnectFromNetworkCmdExec.class); + + public DisconnectFromNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(DisconnectFromNetworkCmd command) { + + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId() + "/disconnect"); + + LOGGER.trace("POST: {}", webTarget); + webTarget.request().post(command); + + return null; + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExec.java new file mode 100644 index 000000000..51777972f --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.InspectNetworkCmd; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class InspectNetworkCmdExec extends AbstrSyncDockerCmdExec implements + InspectNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(InspectNetworkCmdExec.class); + + public InspectNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Network execute(InspectNetworkCmd command) { + WebTarget webResource = getBaseResource().path("/networks/{id}").resolveTemplate("id", command.getNetworkId()); + + LOGGER.trace("GET: {}", webResource); + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { + }); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java new file mode 100644 index 000000000..8f370642f --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.netty.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.ListNetworksCmd; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; + +public class ListNetworksCmdExec extends AbstrSyncDockerCmdExec> implements + ListNetworksCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ListNetworksCmdExec.class); + + public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected List execute(ListNetworksCmd command) { + WebTarget webTarget = getBaseResource().path("/networks"); + + if (command.getFilters() != null) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + + LOGGER.trace("GET: {}", webTarget); + + return webTarget.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference>() { + }); + } +} diff --git a/src/main/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExec.java new file mode 100644 index 000000000..deb52100d --- /dev/null +++ b/src/main/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExec.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.RemoveNetworkCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.netty.MediaType; +import com.github.dockerjava.netty.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RemoveNetworkCmdExec extends AbstrSyncDockerCmdExec implements + RemoveNetworkCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveNetworkCmdExec.class); + + public RemoveNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute(RemoveNetworkCmd command) { + WebTarget webTarget = getBaseResource().path("/networks/" + command.getNetworkId()); + + LOGGER.trace("DELETE: {}", webTarget); + webTarget.request().accept(MediaType.APPLICATION_JSON).delete(); + + return null; + } + +} diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 8751e07e5..37e2916e6 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -12,6 +12,7 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; +import org.apache.commons.lang.StringUtils; import org.hamcrest.FeatureMatcher; import org.hamcrest.Matcher; import org.slf4j.Logger; @@ -24,6 +25,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse.Mount; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.api.model.Network; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; @@ -118,6 +120,15 @@ public void afterMethod(ITestResult result) { } } + for (String networkId : dockerCmdExecFactory.getNetworkIds()) { + LOG.info("Cleaning up temporary network with {}", networkId); + try { + dockerClient.removeNetworkCmd(networkId).exec(); + } catch (DockerException ignore) { + // ignore.printStackTrace(); + } + } + LOG.info("################################## END OF {} ##################################\n", result.getName()); } @@ -232,4 +243,16 @@ protected String buildImage(File baseDir) throws Exception { .awaitImageId(); } + protected Network findNetwork(List networks, String name) { + + for (Network network : networks) { + if (StringUtils.equals(network.getName(), name)) { + return network; + } + } + + fail("No network found."); + return null; + } + } diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 8128bb915..50860789b 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -6,52 +6,8 @@ import java.util.List; import com.github.dockerjava.api.async.ResultCallback; -import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.command.AuthCmd.Exec; -import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.api.command.CommitCmd; -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.CreateContainerResponse; -import com.github.dockerjava.api.command.CreateImageCmd; -import com.github.dockerjava.api.command.CreateImageResponse; -import com.github.dockerjava.api.command.CreateVolumeCmd; -import com.github.dockerjava.api.command.CreateVolumeResponse; -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.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.ListVolumesCmd; -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.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.model.BuildResponseItem; /** @@ -68,6 +24,8 @@ public class TestDockerCmdExecFactory implements DockerCmdExecFactory { private List volumeNames = new ArrayList(); + private List networkIds = new ArrayList<>(); + private DockerCmdExecFactory delegate; public TestDockerCmdExecFactory(DockerCmdExecFactory delegate) { @@ -349,6 +307,51 @@ public ListVolumesCmd.Exec createListVolumesCmdExec() { return delegate.createListVolumesCmdExec(); } + @Override + public ListNetworksCmd.Exec createListNetworksCmdExec() { + return delegate.createListNetworksCmdExec(); + } + + @Override + public InspectNetworkCmd.Exec createInspectNetworkCmdExec() { + return delegate.createInspectNetworkCmdExec(); + } + + @Override + public CreateNetworkCmd.Exec createCreateNetworkCmdExec() { + + return new CreateNetworkCmd.Exec() { + @Override + public CreateNetworkResponse exec(CreateNetworkCmd command) { + CreateNetworkResponse result = delegate.createCreateNetworkCmdExec().exec(command); + networkIds.add(result.getId()); + return result; + } + }; + } + + @Override + public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() { + return new RemoveNetworkCmd.Exec() { + @Override + public Void exec(RemoveNetworkCmd command) { + delegate.createRemoveNetworkCmdExec().exec(command); + networkIds.remove(command.getNetworkId()); + return null; + } + }; + } + + @Override + public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() { + return delegate.createConnectToNetworkCmdExec(); + } + + @Override + public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() { + return delegate.createDisconnectFromNetworkCmdExec(); + } + public List getContainerNames() { return new ArrayList(containerNames); } @@ -360,4 +363,8 @@ public List getImageNames() { public List getVolumeNames() { return new ArrayList(volumeNames); } + + public List getNetworkIds() { + return new ArrayList<>(networkIds); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java new file mode 100644 index 000000000..ad051e0bd --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImplTest.java @@ -0,0 +1,59 @@ +package com.github.dockerjava.core.command; + +import java.lang.reflect.Method; + +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 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; + +@Test(groups = "integration") +public class ConnectToNetworkCmdImplTest extends AbstractDockerClientTest { + + @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")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java new file mode 100644 index 000000000..eefeb535f --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/CreateNetworkCmdImplTest.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.exception.DockerException; +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; +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 CreateNetworkCmdImplTest extends AbstractDockerClientTest { + + @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 createNetwork() throws DockerException { + + String networkName = "testNetwork"; + + CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd().withName(networkName).exec(); + + assertNotNull(createNetworkResponse.getId()); + + Network network = dockerClient.inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec(); + assertEquals(network.getName(), networkName); + assertEquals(network.getDriver(), "bridge"); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java new file mode 100644 index 000000000..7f94c5a0f --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImplTest.java @@ -0,0 +1,59 @@ +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.model.Network; +import com.github.dockerjava.client.AbstractDockerClientTest; +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 DisconnectFromNetworkCmdImplTest extends AbstractDockerClientTest { + + @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())); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java index cf555a28a..e11ff6839 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectContainerCmdImplTest.java @@ -87,4 +87,19 @@ public void inspectContainerRestartCount() throws DockerException { assertThat(inspectContainerResponse.getRestartCount(), equalTo(0)); } + + @Test + public void inspectContainerNetworkSettings() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withCmd("env").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertFalse(inspectContainerResponse.getNetworkSettings().getHairpinMode()); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java index 4f88b6317..4e87d5abf 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -6,7 +6,6 @@ import static org.hamcrest.Matchers.not; import java.io.IOException; -import java.io.InputStream; import java.lang.reflect.Method; import java.security.SecureRandom; @@ -47,10 +46,10 @@ public void afterMethod(ITestResult result) { } @Test(groups = "ignoreInCircleCi") - public void inspectExecTest() throws IOException { + public void inspectExec() throws IOException { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") .withName(containerName).exec(); LOG.info("Created container {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); @@ -70,9 +69,8 @@ public void inspectExecTest() throws IOException { dockerClient.execStartCmd(container.getId()) .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); - InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); - assertThat(first.getExitCode(), is(1)); + assertThat(first.getExitCode(), is(0)); // Create the file dockerClient.execStartCmd(container.getId()) @@ -93,4 +91,26 @@ public void inspectExecTest() throws IOException { assertEquals(containerInfo.getId(), container.getId()); JSONTestHelper.testRoundTrip(containerInfo); } + + @Test(groups = "ignoreInCircleCi") + public void inspectExecNetworkSettings() throws IOException { + 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 exec = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("/bin/bash").exec(); + LOG.info("Created exec {}", exec.toString()); + assertThat(exec.getId(), not(isEmptyString())); + + InspectExecResponse inspectExecResponse = dockerClient.inspectExecCmd(exec.getId()).exec(); + assertThat(inspectExecResponse.getExitCode(), is(0)); + + assertNotNull(inspectExecResponse.getContainer().getNetworkSettings().getNetworks().get("bridge")); + } } diff --git a/src/test/java/com/github/dockerjava/core/command/InspectNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectNetworkCmdImplTest.java new file mode 100644 index 000000000..9d992eb15 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/InspectNetworkCmdImplTest.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.exception.DockerException; +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; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +@Test(groups = "integration") +public class InspectNetworkCmdImplTest extends AbstractDockerClientTest { + + @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 inspectNetwork() throws DockerException { + + List networks = dockerClient.listNetworksCmd().exec(); + + Network expected = findNetwork(networks, "bridge"); + + Network network = dockerClient.inspectNetworkCmd().withNetworkId(expected.getId()).exec(); + + assertThat(network.getName(), equalTo(expected.getName())); + assertThat(network.getScope(), equalTo(expected.getScope())); + assertThat(network.getDriver(), equalTo(expected.getDriver())); + assertThat(network.getIpam().getConfig().get(0).getSubnet(), equalTo(expected.getIpam().getConfig().get(0).getSubnet())); + assertThat(network.getIpam().getDriver(), equalTo(expected.getIpam().getDriver())); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/ListNetworksCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListNetworksCmdImplTest.java new file mode 100644 index 000000000..192adb4bc --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ListNetworksCmdImplTest.java @@ -0,0 +1,55 @@ +package com.github.dockerjava.core.command; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; +import java.util.List; + +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 com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.client.AbstractDockerClientTest; + +@Test(groups = "integration") +public class ListNetworksCmdImplTest extends AbstractDockerClientTest { + + @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 listNetworks() throws DockerException { + + List networks = dockerClient.listNetworksCmd().exec(); + + Network network = findNetwork(networks, "bridge"); + + assertThat(network.getName(), equalTo("bridge")); + assertThat(network.getScope(), equalTo("local")); + assertThat(network.getDriver(), equalTo("bridge")); + assertThat(network.getIpam().getDriver(), equalTo("default")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java new file mode 100644 index 000000000..e1e4e45fe --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/RemoveNetworkCmdImplTest.java @@ -0,0 +1,76 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.hamcrest.Matcher; +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 java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.startsWith; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +@Test(groups = "integration") +public class RemoveNetworkCmdImplTest extends AbstractDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(RemoveNetworkCmdImplTest.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(groups = "ignoreInCircleCi") + public void removeNetwork() throws DockerException { + + CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("test-network").exec(); + + LOG.info("Removing network: {}", network.getId()); + dockerClient.removeNetworkCmd(network.getId()).exec(); + + List networks = dockerClient.listNetworksCmd().exec(); + + Matcher matcher = not(hasItem(hasField("id", startsWith(network.getId())))); + assertThat(networks, matcher); + + } + + @Test + public void removeNonExistingContainer() throws DockerException { + try { + dockerClient.removeNetworkCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExecTest.java new file mode 100644 index 000000000..fa9962826 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateNetworkCmdExecTest.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.exception.DockerException; +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 CreateNetworkCmdExecTest 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 createNetwork() throws DockerException { + + String networkName = "testNetwork"; + + CreateNetworkResponse createNetworkResponse = dockerClient.createNetworkCmd().withName(networkName).exec(); + + assertNotNull(createNetworkResponse.getId()); + + Network network = dockerClient.inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec(); + assertEquals(network.getName(), networkName); + assertEquals(network.getDriver(), "bridge"); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java index 31116ef22..f63dda273 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java @@ -87,4 +87,19 @@ public void inspectContainerRestartCount() throws DockerException { assertThat(inspectContainerResponse.getRestartCount(), equalTo(0)); } + + @Test + public void inspectContainerNetworkSettings() throws DockerException { + + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") + .withCmd("env").exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertNotNull(inspectContainerResponse.getNetworkSettings().getNetworks().get("bridge")); + } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java index fc3bb089b..efeba6e99 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java @@ -97,4 +97,26 @@ public void inspectExecTest() throws IOException { assertEquals(containerInfo.getId(), container.getId()); JSONTestHelper.testRoundTrip(containerInfo); } + + @Test(groups = "ignoreInCircleCi") + public void inspectExecNetworkSettings() throws IOException { + 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 exec = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("/bin/bash").exec(); + LOG.info("Created exec {}", exec.toString()); + assertThat(exec.getId(), not(isEmptyString())); + + InspectExecResponse inspectExecResponse = dockerClient.inspectExecCmd(exec.getId()).exec(); + assertThat(inspectExecResponse.getExitCode(), is(0)); + + assertNotNull(inspectExecResponse.getContainer().getNetworkSettings().getNetworks().get("bridge")); + } } diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExecTest.java new file mode 100644 index 000000000..7cbab660b --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectNetworkCmdExecTest.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.exception.DockerException; +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.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +@Test(groups = "integration") +public class InspectNetworkCmdExecTest 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 inspectNetwork() throws DockerException { + + List networks = dockerClient.listNetworksCmd().exec(); + + Network expected = findNetwork(networks, "bridge"); + + Network network = dockerClient.inspectNetworkCmd().withNetworkId(expected.getId()).exec(); + + assertThat(network.getName(), equalTo(expected.getName())); + assertThat(network.getScope(), equalTo(expected.getScope())); + assertThat(network.getDriver(), equalTo(expected.getDriver())); + assertThat(network.getIpam().getConfig().get(0).getSubnet(), equalTo(expected.getIpam().getConfig().get(0).getSubnet())); + assertThat(network.getIpam().getDriver(), equalTo(expected.getIpam().getDriver())); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListNetworksCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListNetworksCmdExecTest.java new file mode 100644 index 000000000..8a5d975f0 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/ListNetworksCmdExecTest.java @@ -0,0 +1,55 @@ +package com.github.dockerjava.netty.exec; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +import java.lang.reflect.Method; +import java.util.List; + +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 com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; + +@Test(groups = "integration") +public class ListNetworksCmdExecTest 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 listNetworks() throws DockerException { + + List networks = dockerClient.listNetworksCmd().exec(); + + Network network = findNetwork(networks, "bridge"); + + assertThat(network.getName(), equalTo("bridge")); + assertThat(network.getScope(), equalTo("local")); + assertThat(network.getDriver(), equalTo("bridge")); + assertThat(network.getIpam().getDriver(), equalTo("default")); + } +} diff --git a/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java new file mode 100644 index 000000000..9fda49f21 --- /dev/null +++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveNetworkCmdExecTest.java @@ -0,0 +1,76 @@ +package com.github.dockerjava.netty.exec; + +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.netty.AbstractNettyDockerClientTest; +import org.hamcrest.Matcher; +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 java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.startsWith; +import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField; + +@Test(groups = "integration") +public class RemoveNetworkCmdExecTest extends AbstractNettyDockerClientTest { + + public static final Logger LOG = LoggerFactory.getLogger(RemoveNetworkCmdExecTest.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(groups = "ignoreInCircleCi") + public void removeNetwork() throws DockerException { + + CreateNetworkResponse network = dockerClient.createNetworkCmd().withName("test-network").exec(); + + LOG.info("Removing network: {}", network.getId()); + dockerClient.removeNetworkCmd(network.getId()).exec(); + + List networks = dockerClient.listNetworksCmd().exec(); + + Matcher matcher = not(hasItem(hasField("id", startsWith(network.getId())))); + assertThat(networks, matcher); + + } + + @Test + public void removeNonExistingContainer() throws DockerException { + try { + dockerClient.removeNetworkCmd("non-existing").exec(); + fail("expected NotFoundException"); + } catch (NotFoundException e) { + } + } + +} From aabf07b17e03742f9cbb1cd186df87ed1b9fb30b Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Mon, 18 Jan 2016 21:01:58 +0100 Subject: [PATCH 0128/1032] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b0b38327..c6d7b5550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Notes * The upcoming release will contain multiple API breaking changes therefore the major version switch. It will support a subset of v.1.21 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. All changes +* [#425] (https://github.com/docker-java/docker-java/pull/425) Implement Network API * [#410] (https://github.com/docker-java/docker-java/pull/410) Support for build-args of docker build * [#408] (https://github.com/docker-java/docker-java/pull/408) Support for volume API * [#406] (https://github.com/docker-java/docker-java/pull/406) Added RestartCount to InspectContainerResponse From acfe65de6f4ef1392a9bc561a01d88268ef9869b Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 18 Jan 2016 21:53:13 +0100 Subject: [PATCH 0129/1032] Refactored filters API --- .../dockerjava/api/command/EventsCmd.java | 49 ++++++++++++--- .../api/command/ListContainersCmd.java | 62 ++++++++++++++----- .../dockerjava/api/command/ListImagesCmd.java | 32 +++++++--- .../api/command/ListNetworksCmd.java | 8 ++- .../api/command/ListVolumesCmd.java | 13 ++-- .../dockerjava/api/model/EventFilters.java | 37 ----------- .../dockerjava/api/model/NetworkFilters.java | 15 ----- .../api/model/PullResponseItem.java | 1 - .../core/command/EventsCmdImpl.java | 45 +++++++++++--- .../core/command/ListContainersCmdImpl.java | 49 +++++++++------ .../core/command/ListImagesCmdImpl.java | 56 +++++++++++++---- .../core/command/ListNetworksCmdImpl.java | 23 ++++--- .../core/command/ListVolumesCmdImpl.java | 16 +++-- .../util/FiltersBuilder.java} | 39 ++++-------- .../dockerjava/core/util/FiltersEncoder.java | 30 +++++++++ .../dockerjava/jaxrs/EventsCmdExec.java | 5 +- .../jaxrs/ListContainersCmdExec.java | 3 +- .../dockerjava/jaxrs/ListImagesCmdExec.java | 10 ++- .../dockerjava/jaxrs/ListNetworksCmdExec.java | 7 ++- .../dockerjava/jaxrs/ListVolumesCmdExec.java | 5 +- .../dockerjava/netty/exec/EventsCmdExec.java | 5 +- .../netty/exec/ListContainersCmdExec.java | 3 +- .../netty/exec/ListImagesCmdExec.java | 5 +- .../netty/exec/ListNetworksCmdExec.java | 6 +- .../netty/exec/ListVolumesCmdExec.java | 5 +- .../dockerjava/api/model/FiltersTest.java | 58 ----------------- .../core/command/EventsCmdImplTest.java | 3 +- .../command/ListContainersCmdImplTest.java | 5 +- .../core/command/ListImagesCmdImplTest.java | 7 +-- .../core/util/FiltersBuilderTest.java | 61 ++++++++++++++++++ .../netty/exec/EventsCmdExecTest.java | 3 +- .../netty/exec/ListContainersCmdExecTest.java | 6 +- .../netty/exec/ListImagesCmdExecTest.java | 8 +-- 33 files changed, 412 insertions(+), 268 deletions(-) delete mode 100644 src/main/java/com/github/dockerjava/api/model/EventFilters.java delete mode 100644 src/main/java/com/github/dockerjava/api/model/NetworkFilters.java rename src/main/java/com/github/dockerjava/{api/model/Filters.java => core/util/FiltersBuilder.java} (66%) create mode 100644 src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java delete mode 100644 src/test/java/com/github/dockerjava/api/model/FiltersTest.java create mode 100644 src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java diff --git a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java index 4020a8e72..8c03270df 100644 --- a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -1,22 +1,19 @@ package com.github.dockerjava.api.command; +import java.util.List; +import java.util.Map; + import javax.annotation.CheckForNull; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.api.model.Filters; /** * Get events - * - * @param since - * - Show all events created since timestamp - * @param until - * - Stream events until this timestamp */ public interface EventsCmd extends AsyncDockerCmd { @CheckForNull - public Filters getFilters(); + public Map> getFilters(); @CheckForNull public String getSince(); @@ -24,10 +21,46 @@ public interface EventsCmd extends AsyncDockerCmd { @CheckForNull public String getUntil(); - public EventsCmd withFilters(Filters filters); + /** + * @param container + * - container to filter + */ + public EventsCmd withContainerFilter(String... container); + + /** + * @param event + * - event to filter (pull | create | attach | start | stop | kill) + */ + public EventsCmd withEventFilter(String... event); + + /** + * @param image + * - image to filter + */ + public EventsCmd withImageFilter(String... image); + + /** + * @param label + * - label to filter + */ + public EventsCmd withLabelFilter(String... label); + + /** + * @param labels + * - labels to filter (map of names and values) + */ + public EventsCmd withLabelFilter(Map labels); + /** + * @param since + * - Show all events created since timestamp + */ public EventsCmd withSince(String since); + /** + * @param until + * - Show all events created until timestamp + */ public EventsCmd withUntil(String until); public static interface Exec extends DockerCmdAsyncExec { diff --git a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java index 87faec0b3..842f242cc 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -1,26 +1,15 @@ package com.github.dockerjava.api.command; import java.util.List; +import java.util.Map; import javax.annotation.CheckForNull; import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.Filters; /** * List containers * - * @param showAll - * - true or false, Show all containers. Only running containers are shown by default. - * @param showSize - * - true or false, Show the containers sizes. This is false by default. - * @param limit - * - Show `limit` last created containers, include non-running ones. There is no limit by default. - * @param sinceId - * - Show only containers created since Id, include non-running ones. - * @param beforeId - * - Show only containers created before Id, include non-running ones. - * */ public interface ListContainersCmd extends SyncDockerCmd> { @@ -28,7 +17,7 @@ public interface ListContainersCmd extends SyncDockerCmd> { public String getBeforeId(); @CheckForNull - public Filters getFilters(); + public Map> getFilters(); @CheckForNull public Integer getLimit(); @@ -42,16 +31,59 @@ public interface ListContainersCmd extends SyncDockerCmd> { @CheckForNull public Boolean hasShowSizeEnabled(); + /** + * @param beforeId + * - Show only containers created before Id, include non-running ones. + */ public ListContainersCmd withBefore(String before); - public ListContainersCmd withFilters(Filters filters); - + /** + * @param exitcode + * - Show only containers that exited with the passed exitcode. + */ + public ListContainersCmd withExitcodeFilter(Integer exitcode); + + /** + * @param exitcode + * - Show only containers with the passed status (created|restarting|running|paused|exited). + */ + public ListContainersCmd withStatusFilter(String status); + + /** + * @param labels + * - Show only containers with the passed labels. + */ + public ListContainersCmd withLabelFilter(String... labels); + + /** + * @param labels + * - Show only containers with the passed labels. Labels is a {@link Map} that contains label keys and + * values + */ + public ListContainersCmd withLabelFilter(Map labels); + + /** + * @param limit + * - Show `limit` last created containers, include non-running ones. There is no limit by default. + */ public ListContainersCmd withLimit(Integer limit); + /** + * @param showAll + * - Show all containers. Only running containers are shown by default. + */ public ListContainersCmd withShowAll(Boolean showAll); + /** + * @param showSize + * - Show the containers sizes. This is false by default. + */ public ListContainersCmd withShowSize(Boolean showSize); + /** + * @param sinceId + * - Show only containers created since Id, include non-running ones. + */ public ListContainersCmd withSince(String since); public static interface Exec extends DockerCmdSyncExec> { diff --git a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index 3ef40f48f..7dee8c918 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -1,6 +1,7 @@ package com.github.dockerjava.api.command; import java.util.List; +import java.util.Map; import javax.annotation.CheckForNull; @@ -8,23 +9,40 @@ /** * List images - * - * @param showAll - * - Show all images (by default filter out the intermediate images used to build) - * @param filters - * - a json encoded value of the filters (a map[string][]string) to process on the images list. */ public interface ListImagesCmd extends SyncDockerCmd> { @CheckForNull - public String getFilters(); + public Map> getFilters(); + + public String getImageNameFilter(); @CheckForNull public Boolean hasShowAllEnabled(); + /** + * Show all images (by default filter out the intermediate images used to build) + */ public ListImagesCmd withShowAll(Boolean showAll); - public ListImagesCmd withFilters(String filters); + public ListImagesCmd withImageNameFilter(String imageName); + + /** + * Filter dangling images + */ + public ListImagesCmd withDanglingFilter(Boolean dangling); + + /** + * @param labels + * - string array in the form ["key"] or ["key=value"] or a mix of both + */ + public ListImagesCmd withLabelFilter(String... label); + + /** + * @param labels + * - {@link Map} of labels that contains label keys and values + */ + public ListImagesCmd withLabelFilter(Map labels); public static interface Exec extends DockerCmdSyncExec> { } diff --git a/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java index 2b5b29996..dd3c89c7b 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java @@ -1,12 +1,12 @@ package com.github.dockerjava.api.command; -import com.github.dockerjava.api.model.Filters; import com.github.dockerjava.api.model.Network; import com.github.dockerjava.core.RemoteApiVersion; import javax.annotation.CheckForNull; import java.util.List; +import java.util.Map; /** * List networks. @@ -16,9 +16,11 @@ public interface ListNetworksCmd extends SyncDockerCmd> { @CheckForNull - public Filters getFilters(); + public Map> getFilters(); - ListNetworksCmd withFilters(Filters filters); + ListNetworksCmd withNameFilter(String... networkName); + + ListNetworksCmd withIdFilter(String... networkId); public static interface Exec extends DockerCmdSyncExec> { } diff --git a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java index f900f1967..a049aa20f 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java @@ -1,24 +1,25 @@ package com.github.dockerjava.api.command; +import java.util.List; +import java.util.Map; + import javax.annotation.CheckForNull; /** * List volumes. * - * * @author Marcus Linke */ public interface ListVolumesCmd extends SyncDockerCmd { @CheckForNull - public String getFilters(); + public Map> getFilters(); /** - * @param filters - * - JSON encoded value of the filters (a map[string][]string) to process on the volumes list. There is - * one available filter: dangling=true + * @param dangling + * - Show dangling volumes filter */ - public ListVolumesCmd withFilters(String filters); + public ListVolumesCmd withDanglingFilter(Boolean dangling); public static interface Exec extends DockerCmdSyncExec { } diff --git a/src/main/java/com/github/dockerjava/api/model/EventFilters.java b/src/main/java/com/github/dockerjava/api/model/EventFilters.java deleted file mode 100644 index 08cb7ad11..000000000 --- a/src/main/java/com/github/dockerjava/api/model/EventFilters.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.dockerjava.api.model; - -import java.util.List; - -/** - * Representation of a Docker event filter. - * - * @author Carlos Sanchez - * - */ -public class EventFilters extends Filters { - - /** - * Default constructor for the deserialization. - */ - public EventFilters() { - } - - /** - * Constructor. - * - * @param event - * event to filter - */ - public EventFilters(String... event) { - super(); - withEvent(event); - } - - public Filters withEvent(String... event) { - return withFilter("event", event); - } - - public List getEvent() { - return getFilter("event"); - } -} diff --git a/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java b/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java deleted file mode 100644 index f3c837643..000000000 --- a/src/main/java/com/github/dockerjava/api/model/NetworkFilters.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.dockerjava.api.model; - -/** - * Created by andrewk on 1/5/16. - */ -public class NetworkFilters extends Filters { - - public Filters withNames(String... names) { - return withFilter("name", names); - } - - public Filters withIds(String... ids) { - return withFilter("id", ids); - } -} diff --git a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java index c18d12bd0..3ab77bee0 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -33,5 +33,4 @@ public boolean isPullSuccessIndicated() { return (getStatus().contains(DOWNLOAD_COMPLETE) || getStatus().contains(IMAGE_UP_TO_DATE) || getStatus().contains(DOWNLOADED_NEWER_IMAGE) || getStatus().contains(LEGACY_REGISTRY)); } - } diff --git a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index 9bd34e57d..230f6dd5a 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -2,9 +2,12 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.List; +import java.util.Map; + import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.api.model.Filters; +import com.github.dockerjava.core.util.FiltersBuilder; /** * Stream docker events @@ -15,7 +18,7 @@ public class EventsCmdImpl extends AbstrAsyncDockerCmd impleme private String until; - private Filters filters; + private FiltersBuilder filters = new FiltersBuilder(); public EventsCmdImpl(EventsCmd.Exec exec) { super(exec); @@ -34,9 +37,37 @@ public EventsCmd withUntil(String until) { } @Override - public EventsCmd withFilters(Filters filters) { - checkNotNull(filters, "filters have not been specified"); - this.filters = filters; + public EventsCmd withContainerFilter(String... container) { + checkNotNull(container, "container have not been specified"); + this.filters.withContainers(container); + return this; + } + + @Override + public EventsCmd withImageFilter(String... image) { + checkNotNull(image, "image have not been specified"); + this.filters.withImages(image); + return this; + } + + @Override + public EventsCmd withEventFilter(String... event) { + checkNotNull(event, "event have not been specified"); + this.filters.withFilter("event", event); + return this; + } + + @Override + public EventsCmd withLabelFilter(String... label) { + checkNotNull(label, "label have not been specified"); + this.filters.withLabels(label); + return this; + } + + @Override + public EventsCmd withLabelFilter(Map labels) { + checkNotNull(labels, "labels have not been specified"); + this.filters.withLabels(labels); return this; } @@ -51,8 +82,8 @@ public String getUntil() { } @Override - public Filters getFilters() { - return filters; + public Map> getFilters() { + return filters.build(); } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index b7a70603d..8e8e194da 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -4,25 +4,14 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; +import java.util.Map; import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.Filters; +import com.github.dockerjava.core.util.FiltersBuilder; /** - * List containers - * - * @param showAll - * - true or false, Show all containers. Only running containers are shown by default. - * @param showSize - * - true or false, Show the containers sizes. This is false by default. - * @param limit - * - Show `limit` last created containers, include non-running ones. There is no limit by default. - * @param sinceId - * - Show only containers created since Id, include non-running ones. - * @param beforeId - * - Show only containers created before Id, include non-running ones. - * + * List containers. */ public class ListContainersCmdImpl extends AbstrDockerCmd> implements ListContainersCmd { @@ -33,7 +22,7 @@ public class ListContainersCmdImpl extends AbstrDockerCmd> getFilters() { + return filters.build(); } @Override @@ -104,10 +93,30 @@ public ListContainersCmd withBefore(String before) { } @Override - public ListContainersCmd withFilters(Filters filters) { - checkNotNull(filters, "filters was not specified"); - this.filters = filters; + public ListContainersCmd withLabelFilter(String... labels) { + checkNotNull(labels, "labels was not specified"); + this.filters.withLabels(labels); return this; } + @Override + public ListContainersCmd withLabelFilter(Map labels) { + checkNotNull(labels, "labels was not specified"); + this.filters.withLabels(labels); + return this; + } + + @Override + public ListContainersCmd withExitcodeFilter(Integer exitcode) { + checkNotNull(exitcode, "exitcode was not specified"); + this.filters.withFilter("exitcode", exitcode.toString()); + return this; + } + + @Override + public ListContainersCmd withStatusFilter(String status) { + checkNotNull(status, "status was not specified"); + this.filters.withFilter("status", status); + return this; + } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index 69879b673..d726ca7ce 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -3,31 +3,33 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.builder.ReflectionToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; +import com.github.dockerjava.core.util.FiltersBuilder; /** * List images - * - * @param showAll - * - Show all images (by default filter out the intermediate images used to build) - * @param filters - * - a json encoded value of the filters (a map[string][]string) to process on the images list. */ public class ListImagesCmdImpl extends AbstrDockerCmd> implements ListImagesCmd { - private String filters; + private String imageNameFilter; + + private Boolean showAll = false; - private Boolean showAll = false; + private FiltersBuilder filters = new FiltersBuilder(); public ListImagesCmdImpl(ListImagesCmd.Exec exec) { super(exec); } @Override - public String getFilters() { - return filters; + public Map> getFilters() { + return filters.build(); } @Override @@ -42,10 +44,40 @@ public ListImagesCmd withShowAll(Boolean showAll) { } @Override - public ListImagesCmd withFilters(String filter) { - checkNotNull(filter, "filters have not been specified"); - this.filters = filter; + public ListImagesCmd withDanglingFilter(Boolean dangling) { + checkNotNull(dangling, "dangling have not been specified"); + filters.withFilter("dangling", dangling.toString()); + return this; + } + + @Override + public ListImagesCmd withLabelFilter(String... labels) { + checkNotNull(labels, "labels have not been specified"); + filters.withLabels(labels); + return this; + } + + @Override + public ListImagesCmd withLabelFilter(Map labels) { + checkNotNull(labels, "labels have not been specified"); + filters.withLabels(labels); return this; } + @Override + public ListImagesCmd withImageNameFilter(String imageNameFilter) { + checkNotNull(imageNameFilter, "image name filter not specified"); + this.imageNameFilter = imageNameFilter; + return this; + } + + @Override + public String getImageNameFilter() { + return this.imageNameFilter; + } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); + } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java index 2303e7c9c..44a9d2cfb 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java @@ -1,27 +1,34 @@ package com.github.dockerjava.core.command; import com.github.dockerjava.api.command.ListNetworksCmd; -import com.github.dockerjava.api.model.Filters; import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.core.util.FiltersBuilder; import java.util.List; +import java.util.Map; -public class ListNetworksCmdImpl extends AbstrDockerCmd> implements - ListNetworksCmd { +public class ListNetworksCmdImpl extends AbstrDockerCmd> implements ListNetworksCmd { - private Filters filters; + private FiltersBuilder filtersBuilder = new FiltersBuilder(); public ListNetworksCmdImpl(ListNetworksCmd.Exec exec) { super(exec); } - @Override public Filters getFilters() { - return filters; + @Override + public Map> getFilters() { + return filtersBuilder.build(); } - @Override public ListNetworksCmd withFilters(Filters filters) { + @Override + public ListNetworksCmd withIdFilter(String... networkId) { + this.filtersBuilder.withFilter("id", networkId); + return this; + } - this.filters = filters; + @Override + public ListNetworksCmd withNameFilter(String... networkName) { + this.filtersBuilder.withFilter("name", networkName); return this; } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java index af1ca3fae..d9efe7b17 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java @@ -2,8 +2,12 @@ import static com.google.common.base.Preconditions.checkNotNull; +import java.util.List; +import java.util.Map; + import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.core.util.FiltersBuilder; /** * @@ -12,21 +16,21 @@ */ public class ListVolumesCmdImpl extends AbstrDockerCmd implements ListVolumesCmd { - private String filters; + private FiltersBuilder filters = new FiltersBuilder(); public ListVolumesCmdImpl(ListVolumesCmd.Exec exec) { super(exec); } @Override - public String getFilters() { - return filters; + public Map> getFilters() { + return filters.build(); } @Override - public ListVolumesCmd withFilters(String filter) { - checkNotNull(filter, "filters have not been specified"); - this.filters = filter; + public ListVolumesCmd withDanglingFilter(Boolean dangling) { + checkNotNull(dangling, "dangling have not been specified"); + this.filters.withFilter("dangling", dangling.toString()); return this; } } diff --git a/src/main/java/com/github/dockerjava/api/model/Filters.java b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java similarity index 66% rename from src/main/java/com/github/dockerjava/api/model/Filters.java rename to src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java index b24dd69db..d6cd0d9f7 100644 --- a/src/main/java/com/github/dockerjava/api/model/Filters.java +++ b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api.model; +package com.github.dockerjava.core.util; import java.util.ArrayList; import java.util.Arrays; @@ -7,29 +7,20 @@ import java.util.Map; import java.util.Map.Entry; -import javax.ws.rs.core.MediaType; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; - /** * Representation of Docker filters. * * @author Carlos Sanchez * */ -public class Filters { - - private static ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, - MediaType.APPLICATION_JSON_TYPE); +public class FiltersBuilder { private Map> filters = new HashMap>(); - public Filters() { + public FiltersBuilder() { } - public Filters withFilter(String key, String... value) { + public FiltersBuilder withFilter(String key, String... value) { filters.put(key, Arrays.asList(value)); return this; } @@ -38,7 +29,7 @@ public List getFilter(String key) { return filters.get(key); } - public Filters withImages(String... image) { + public FiltersBuilder withImages(String... image) { withFilter("image", image); return this; } @@ -47,7 +38,7 @@ public List getImage() { return getFilter("image"); } - public Filters withContainers(String... container) { + public FiltersBuilder withContainers(String... container) { withFilter("container", container); return this; } @@ -61,9 +52,8 @@ public List getContainer() { * * @param labels * string array in the form ["key"] or ["key=value"] or a mix of both - * @return */ - public Filters withLabels(String... labels) { + public FiltersBuilder withLabels(String... labels) { withFilter("label", labels); return this; } @@ -73,9 +63,8 @@ public Filters withLabels(String... labels) { * * @param labels * {@link Map} of labels that contains label keys and values - * @return */ - public Filters withLabels(Map labels) { + public FiltersBuilder withLabels(Map labels) { withFilter("label", labelsMapToList(labels).toArray(new String[labels.size()])); return this; } @@ -99,7 +88,7 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; - Filters filters1 = (Filters) o; + FiltersBuilder filters1 = (FiltersBuilder) o; return filters.equals(filters1.filters); @@ -110,13 +99,7 @@ public int hashCode() { return filters.hashCode(); } - @Override - public String toString() { - try { - return OBJECT_MAPPER.writeValueAsString(filters); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + public Map> build() { + return filters; } - } diff --git a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java new file mode 100644 index 000000000..75f9d48c2 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.core.util; + +import java.util.List; +import java.util.Map; + +import javax.ws.rs.core.MediaType; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; + +/** + * JSON Encoder for docker filters. + * + * @author Carlos Sanchez + * + */ +public class FiltersEncoder { + + private static ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, + MediaType.APPLICATION_JSON_TYPE); + + public static String jsonEncode(Map> filters) { + try { + return OBJECT_MAPPER.writeValueAsString(filters); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java index 395fde4e0..3d4c8dc17 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/EventsCmdExec.java @@ -12,6 +12,7 @@ import com.github.dockerjava.api.model.Event; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.async.JsonStreamProcessor; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.GETCallbackNotifier; @@ -28,9 +29,9 @@ protected AbstractCallbackNotifier callbackNotifier(EventsCmd command, Re WebTarget webTarget = getBaseResource().path("/events").queryParam("since", command.getSince()) .queryParam("until", command.getUntil()); - if (command.getFilters() != null) { + if (command.getFilters() != null && !command.getFilters().isEmpty()) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java index 4031bfa0d..fd882b673 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListContainersCmdExec.java @@ -14,6 +14,7 @@ import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; public class ListContainersCmdExec extends AbstrSyncDockerCmdExec> implements ListContainersCmd.Exec { @@ -38,7 +39,7 @@ protected List execute(ListContainersCmd command) { if (command.getFilters() != null) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 9734dfb42..1e7acfc33 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -14,6 +14,7 @@ import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; public class ListImagesCmdExec extends AbstrSyncDockerCmdExec> implements ListImagesCmd.Exec { @@ -29,8 +30,13 @@ protected List execute(ListImagesCmd command) { webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); - if (command.getFilters() != null) - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) { + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); + } + + if (command.getImageNameFilter() != null) { + webTarget = webTarget.queryParam("filter", urlPathSegmentEscaper().escape(command.getImageNameFilter())); + } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java index 80438d433..9137e28d2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListNetworksCmdExec.java @@ -3,12 +3,15 @@ import com.github.dockerjava.api.command.ListNetworksCmd; import com.github.dockerjava.api.model.Network; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; + import java.util.List; import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper; @@ -26,9 +29,9 @@ public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClie protected List execute(ListNetworksCmd command) { WebTarget webTarget = getBaseResource().path("/networks"); - if (command.getFilters() != null) { + if (command.getFilters() != null && !command.getFilters().isEmpty()) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java index 2550db31b..dd877a89a 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java @@ -11,6 +11,7 @@ import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.ListVolumesResponse; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; public class ListVolumesCmdExec extends AbstrSyncDockerCmdExec implements ListVolumesCmd.Exec { @@ -24,8 +25,8 @@ public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClien protected ListVolumesResponse execute(ListVolumesCmd command) { WebTarget webTarget = getBaseResource().path("/volumes"); - if (command.getFilters() != null) - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java index be1ac0956..f07230c07 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/EventsCmdExec.java @@ -10,6 +10,7 @@ import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.WebTarget; public class EventsCmdExec extends AbstrAsyncDockerCmdExec implements EventsCmd.Exec { @@ -26,9 +27,9 @@ protected Void execute0(EventsCmd command, ResultCallback resultCallback) WebTarget webTarget = getBaseResource().path("/events").queryParam("since", command.getSince()) .queryParam("until", command.getUntil()); - if (command.getFilters() != null) { + if (command.getFilters() != null && !command.getFilters().isEmpty()) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java index b45e76cbd..219aebc4b 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListContainersCmdExec.java @@ -11,6 +11,7 @@ import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.model.Container; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; @@ -37,7 +38,7 @@ protected List execute(ListContainersCmd command) { if (command.getFilters() != null) { webTarget = webTarget - .queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + .queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java index 4ca65a061..0d1b81962 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListImagesCmdExec.java @@ -11,6 +11,7 @@ import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; @@ -28,8 +29,8 @@ protected List execute(ListImagesCmd command) { webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); - if (command.getFilters() != null) { - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) { + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java index 8f370642f..e0c945d6d 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java @@ -4,8 +4,10 @@ import com.github.dockerjava.api.command.ListNetworksCmd; import com.github.dockerjava.api.model.Network; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,8 +28,8 @@ public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClie protected List execute(ListNetworksCmd command) { WebTarget webTarget = getBaseResource().path("/networks"); - if (command.getFilters() != null) - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters().toString())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java index 2086e4d2d..98d073ff5 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java @@ -9,6 +9,7 @@ import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.ListVolumesResponse; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.util.FiltersEncoder; import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; @@ -25,8 +26,8 @@ public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClien protected ListVolumesResponse execute(ListVolumesCmd command) { WebTarget webTarget = getBaseResource().path("/volumes"); - if (command.getFilters() != null) - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(command.getFilters())); + if (command.getFilters() != null && !command.getFilters().isEmpty()) + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); LOGGER.trace("GET: {}", webTarget); diff --git a/src/test/java/com/github/dockerjava/api/model/FiltersTest.java b/src/test/java/com/github/dockerjava/api/model/FiltersTest.java deleted file mode 100644 index 8016ec49f..000000000 --- a/src/test/java/com/github/dockerjava/api/model/FiltersTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.github.dockerjava.api.model; - -import com.google.common.collect.Maps; -import org.testng.annotations.Test; - -import java.util.Map; - -import static org.testng.Assert.*; - -/** - * @author Vincent Latombe - */ -public class FiltersTest { - - @Test - public void newFiltersShouldBeEquals() { - assertEquals(new Filters(), new Filters()); - } - - @Test - public void newFiltersShouldHaveEqualHashcode() { - assertEquals(new Filters().hashCode(), new Filters().hashCode()); - } - - @Test - public void filtersWithEqualContentShouldBeEquals() { - assertEquals(new Filters().withContainers("foo"), new Filters().withContainers("foo")); - assertEquals(new Filters().withLabels("alpha=val"), new Filters().withLabels("alpha=val")); - } - - @Test - public void filtersWithEqualContentShouldHaveEqualHashcode() { - assertEquals(new Filters().withContainers("foo").hashCode(), new Filters().withContainers("foo").hashCode()); - assertEquals(new Filters().withLabels("alpha=val").hashCode(), new Filters().withLabels("alpha=val").hashCode()); - } - - @Test - public void withLabelsMapShouldBeEqualsToVarargs() { - Map map = Maps.newHashMap(); - map.put("alpha", "val"); - assertEquals(new Filters().withLabels("alpha=val"), new Filters().withLabels(map)); - - map = Maps.newHashMap(); - map.put("alpha", "val"); - map.put("beta", "val1"); - assertEquals(new Filters().withLabels("alpha=val", "beta=val1"), new Filters().withLabels(map)); - } - - @Test - public void filtersWithDifferentContentShouldntBeEquals() { - assertNotEquals(new Filters().withContainers("foo"), new Filters().withContainers("bar")); - } - - @Test - public void filtersWithDifferentContentShouldntHaveEqualHashcode() { - assertNotEquals(new Filters().withContainers("foo").hashCode(), new Filters().withContainers("bar").hashCode()); - } -} 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 ead529107..939f95087 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -15,7 +15,6 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.api.model.EventFilters; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -112,7 +111,7 @@ public void testEventStreamingWithFilter() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(1); - EventsTestCallback eventCallback = dockerClient.eventsCmd().withFilters(new EventFilters().withEvent("start")) + EventsTestCallback eventCallback = dockerClient.eventsCmd().withEventFilter("start") .exec(new EventsTestCallback(countDownLatch)); generateEvents(); diff --git a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java index e41b7736f..529c2f89b 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java @@ -26,7 +26,6 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.Filters; import com.github.dockerjava.client.AbstractDockerClientTest; import com.google.common.collect.ImmutableMap; @@ -152,14 +151,14 @@ public void testListContainersWithLabelsFilter() throws Exception { // list with filter by label dockerClient.createContainerCmd(testImage).withCmd("echo").withLabels(labels).exec(); filteredContainers = dockerClient.listContainersCmd().withShowAll(true) - .withFilters(new Filters().withLabels(labels)).exec(); + .withLabelFilter(labels).exec(); assertThat(filteredContainers.size(), is(equalTo(1))); Container container3 = filteredContainers.get(0); assertThat(container3.getCommand(), not(isEmptyString())); assertThat(container3.getImage(), startsWith(testImage)); filteredContainers = dockerClient.listContainersCmd().withShowAll(true) - .withFilters(new Filters().withLabels("test")).exec(); + .withLabelFilter("test").exec(); assertThat(filteredContainers.size(), is(equalTo(1))); container3 = filteredContainers.get(0); assertThat(container3.getCommand(), not(isEmptyString())); diff --git a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java index 6f1ae7a68..1b811867a 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListImagesCmdImplTest.java @@ -65,9 +65,9 @@ public void listImages() throws DockerException { } @Test(groups = "ignoreInCircleCi") - public void listDanglingImages() throws DockerException { + public void listImagesWithDanglingFilter() throws DockerException { String imageId = createDanglingImage(); - List images = dockerClient.listImagesCmd().withFilters("{\"dangling\":[\"true\"]}").withShowAll(true) + List images = dockerClient.listImagesCmd().withDanglingFilter(true).withShowAll(true) .exec(); assertThat(images, notNullValue()); LOG.info("Images List: {}", images); @@ -86,7 +86,7 @@ private boolean isImageInFilteredList(List images, String expectedImageId } private String createDanglingImage() { - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "5").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); LOG.info("Created container: {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()).exec(); @@ -95,7 +95,6 @@ private String createDanglingImage() { String imageId = dockerClient.commitCmd(container.getId()).exec(); dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); dockerClient.removeContainerCmd(container.getId()).exec(); return imageId; } diff --git a/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java b/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java new file mode 100644 index 000000000..125fd0785 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java @@ -0,0 +1,61 @@ +package com.github.dockerjava.core.util; + +import com.github.dockerjava.core.util. +FiltersBuilder; +import com.google.common.collect.Maps; + +import org.testng.annotations.Test; + +import java.util.Map; + +import static org.testng.Assert.*; + +/** + * @author Vincent Latombe + */ +public class FiltersBuilderTest { + + @Test + public void newFiltersShouldBeEquals() { + assertEquals(new FiltersBuilder(), new FiltersBuilder()); + } + + @Test + public void newFiltersShouldHaveEqualHashcode() { + assertEquals(new FiltersBuilder().hashCode(), new FiltersBuilder().hashCode()); + } + + @Test + public void filtersWithEqualContentShouldBeEquals() { + assertEquals(new FiltersBuilder().withContainers("foo"), new FiltersBuilder().withContainers("foo")); + assertEquals(new FiltersBuilder().withLabels("alpha=val"), new FiltersBuilder().withLabels("alpha=val")); + } + + @Test + public void filtersWithEqualContentShouldHaveEqualHashcode() { + assertEquals(new FiltersBuilder().withContainers("foo").hashCode(), new FiltersBuilder().withContainers("foo").hashCode()); + assertEquals(new FiltersBuilder().withLabels("alpha=val").hashCode(), new FiltersBuilder().withLabels("alpha=val").hashCode()); + } + + @Test + public void withLabelsMapShouldBeEqualsToVarargs() { + Map map = Maps.newHashMap(); + map.put("alpha", "val"); + assertEquals(new FiltersBuilder().withLabels("alpha=val"), new FiltersBuilder().withLabels(map)); + + map = Maps.newHashMap(); + map.put("alpha", "val"); + map.put("beta", "val1"); + assertEquals(new FiltersBuilder().withLabels("alpha=val", "beta=val1"), new FiltersBuilder().withLabels(map)); + } + + @Test + public void filtersWithDifferentContentShouldntBeEquals() { + assertNotEquals(new FiltersBuilder().withContainers("foo"), new FiltersBuilder().withContainers("bar")); + } + + @Test + public void filtersWithDifferentContentShouldntHaveEqualHashcode() { + assertNotEquals(new FiltersBuilder().withContainers("foo").hashCode(), new FiltersBuilder().withContainers("bar").hashCode()); + } +} 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 06119b203..a634e2562 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/EventsCmdExecTest.java @@ -15,7 +15,6 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Event; -import com.github.dockerjava.api.model.EventFilters; import com.github.dockerjava.core.command.EventsResultCallback; import com.github.dockerjava.core.command.PullImageResultCallback; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; @@ -114,7 +113,7 @@ public void testEventStreamingWithFilter() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(1); - EventsTestCallback eventCallback = dockerClient.eventsCmd().withFilters(new EventFilters().withEvent("start")) + EventsTestCallback eventCallback = dockerClient.eventsCmd().withEventFilter("start") .exec(new EventsTestCallback(countDownLatch)); generateEvents(); diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java index c36bead2e..673784281 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/ListContainersCmdExecTest.java @@ -26,8 +26,8 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.Filters; import com.github.dockerjava.core.command.PullImageResultCallback; +import com.github.dockerjava.core.util.FiltersBuilder; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; import com.google.common.collect.ImmutableMap; @@ -153,14 +153,14 @@ public void testListContainersWithLabelsFilter() throws Exception { // list with filter by label dockerClient.createContainerCmd(testImage).withCmd("echo").withLabels(labels).exec(); filteredContainers = dockerClient.listContainersCmd().withShowAll(true) - .withFilters(new Filters().withLabels(labels)).exec(); + .withLabelFilter(labels).exec(); assertThat(filteredContainers.size(), is(equalTo(1))); Container container3 = filteredContainers.get(0); assertThat(container3.getCommand(), not(isEmptyString())); assertThat(container3.getImage(), startsWith(testImage)); filteredContainers = dockerClient.listContainersCmd().withShowAll(true) - .withFilters(new Filters().withLabels("test")).exec(); + .withLabelFilter("test").exec(); assertThat(filteredContainers.size(), is(equalTo(1))); container3 = filteredContainers.get(0); assertThat(container3.getCommand(), not(isEmptyString())); diff --git a/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java index f6348c7d9..c83fa7ef9 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/ListImagesCmdExecTest.java @@ -65,10 +65,9 @@ public void listImages() throws DockerException { } @Test(groups = "ignoreInCircleCi") - public void listDanglingImages() throws DockerException { + public void listImagesWithDanglingFilter() throws DockerException { String imageId = createDanglingImage(); - List images = dockerClient.listImagesCmd().withFilters("{\"dangling\":[\"true\"]}").withShowAll(true) - .exec(); + List images = dockerClient.listImagesCmd().withDanglingFilter(true).withShowAll(true).exec(); assertThat(images, notNullValue()); LOG.info("Images List: {}", images); assertThat(images.size(), is(greaterThan(0))); @@ -86,7 +85,7 @@ private boolean isImageInFilteredList(List images, String expectedImageId } private String createDanglingImage() { - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "5").exec(); + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999").exec(); LOG.info("Created container: {}", container.toString()); assertThat(container.getId(), not(isEmptyString())); dockerClient.startContainerCmd(container.getId()).exec(); @@ -95,7 +94,6 @@ private String createDanglingImage() { String imageId = dockerClient.commitCmd(container.getId()).exec(); dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); dockerClient.removeContainerCmd(container.getId()).exec(); return imageId; } From 6e2a702911b11b1224c1ac907da2260a65617736 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Mon, 18 Jan 2016 22:00:07 +0100 Subject: [PATCH 0130/1032] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6d7b5550..56914c46b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Notes * The upcoming release will contain multiple API breaking changes therefore the major version switch. It will support a subset of v.1.21 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. All changes +* [#426] (https://github.com/docker-java/docker-java/pull/426) Refactored filters API * [#425] (https://github.com/docker-java/docker-java/pull/425) Implement Network API * [#410] (https://github.com/docker-java/docker-java/pull/410) Support for build-args of docker build * [#408] (https://github.com/docker-java/docker-java/pull/408) Support for volume API From 1f943a3df92eb87e24f0dd0ffdc2c5898ffb6f8d Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 20 Jan 2016 23:34:54 +0100 Subject: [PATCH 0131/1032] Enable all tests again --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 308432bd0..c6a93bc7a 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 1.7 2.11 - 2.6.4 + 2.1.2 4.3.1 1.5 1.8 @@ -391,7 +391,7 @@ integration - ignoreInCircleCi + **/*Test.java From 6b2253571fae133e7c923dd3b4ec0d9c4ed66abf Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 20 Jan 2016 23:37:18 +0100 Subject: [PATCH 0132/1032] Catch NotFoundException --- .../com/github/dockerjava/client/AbstractDockerClientTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 37e2916e6..074c19ad9 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -24,6 +24,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse.Mount; import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.Network; import com.github.dockerjava.api.model.Volume; @@ -57,7 +58,7 @@ public void beforeTest() throws Exception { try { dockerClient.inspectImageCmd("busybox").exec(); - } catch (Exception e) { + } catch (NotFoundException e) { LOG.info("Pulling image 'busybox'"); // need to block until image is pulled completely dockerClient.pullImageCmd("busybox").withTag("latest").exec(new PullImageResultCallback()).awaitSuccess(); From 9d2b823b5925aff5885dd2c3242a86564f154c04 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 20 Jan 2016 23:39:41 +0100 Subject: [PATCH 0133/1032] Fix removeImage test: Don't kill already stopped container --- .../github/dockerjava/core/command/RemoveImageCmdImplTest.java | 1 - .../com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java | 1 - 2 files changed, 2 deletions(-) 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 a4d670e31..90be81c7f 100644 --- a/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/RemoveImageCmdImplTest.java @@ -63,7 +63,6 @@ public void removeImage() throws DockerException, InterruptedException { String imageId = dockerClient.commitCmd(container.getId()).exec(); dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); dockerClient.removeContainerCmd(container.getId()).exec(); LOG.info("Removing image: {}", imageId); 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 62ff486ea..e2f69ac1e 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/RemoveImageCmdExecTest.java @@ -63,7 +63,6 @@ public void removeImage() throws DockerException, InterruptedException { String imageId = dockerClient.commitCmd(container.getId()).exec(); dockerClient.stopContainerCmd(container.getId()).exec(); - dockerClient.killContainerCmd(container.getId()).exec(); dockerClient.removeContainerCmd(container.getId()).exec(); LOG.info("Removing image: {}", imageId); From 70e9680f3b1df10c1f14e0119bf03621cb279d3f Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 20 Jan 2016 23:41:20 +0100 Subject: [PATCH 0134/1032] Fix inspectContainer test --- .../dockerjava/netty/exec/InspectContainerCmdExecTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java index f63dda273..a07e23143 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectContainerCmdExecTest.java @@ -100,6 +100,6 @@ public void inspectContainerNetworkSettings() throws DockerException { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); - assertNotNull(inspectContainerResponse.getNetworkSettings().getNetworks().get("bridge")); + assertFalse(inspectContainerResponse.getNetworkSettings().getHairpinMode()); } } From c931fb7558ab9e0a512fa9bdd54a603c3649bb1e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 20 Jan 2016 23:42:46 +0100 Subject: [PATCH 0135/1032] Fix issue #424 --- .../core/command/ExecStartCmdImpl.java | 12 ++++- .../core/command/ExecStartResultCallback.java | 2 + .../dockerjava/jaxrs/ExecStartCmdExec.java | 3 +- .../handler/FramedResponseStreamHandler.java | 12 +++-- .../core/command/ExecStartCmdImplTest.java | 2 +- .../core/command/InspectExecCmdImplTest.java | 42 ++++++++-------- .../netty/exec/ExecStartCmdExecTest.java | 7 ++- .../netty/exec/InspectExecCmdExecTest.java | 50 +++++++++---------- 8 files changed, 72 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index f77460730..836c9158e 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -5,17 +5,27 @@ import java.io.InputStream; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.ExecStartCmd; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Frame; +@JsonInclude(Include.NON_NULL) public class ExecStartCmdImpl extends AbstrAsyncDockerCmd implements ExecStartCmd { + @JsonIgnore private String execId; - private Boolean detach, tty; + @JsonProperty("Detach") + private Boolean detach; + + @JsonProperty("Tty") + private Boolean tty; + @JsonIgnore private InputStream stdin; public ExecStartCmdImpl(ExecStartCmd.Exec exec, String execId) { diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java index ebf1d08a1..5f4c33729 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java @@ -35,7 +35,9 @@ public void onNext(Frame frame) { try { switch (frame.getStreamType()) { case STDOUT: + case RAW: if (stdout != null) { + System.err.println(new String(frame.getPayload())); stdout.write(frame.getPayload()); stdout.flush(); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java index f737f6e28..dc7cf6598 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -1,5 +1,6 @@ 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; @@ -30,6 +31,6 @@ protected AbstractCallbackNotifier callbackNotifier(ExecStartCmd command, LOGGER.trace("POST: {}", webTarget); return new POSTCallbackNotifier(new FrameStreamProcessor(), resultCallback, webTarget.request().accept( - MediaType.APPLICATION_JSON), null); + MediaType.APPLICATION_JSON), entity(command, MediaType.APPLICATION_JSON)); } } diff --git a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java index 87878f0da..945833cdd 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java @@ -1,5 +1,7 @@ package com.github.dockerjava.netty.handler; +import java.util.Arrays; + import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; @@ -74,14 +76,14 @@ private Frame decode() { headerCnt += headerCount; - if (headerCnt < HEADER_SIZE) { - return null; - } - streamType = streamType(header[0]); if (streamType.equals(StreamType.RAW)) { - return new Frame(streamType, header); + return new Frame(streamType, Arrays.copyOf(header, headerCount)); + } + + if (headerCnt < HEADER_SIZE) { + return null; } } diff --git a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java index 6d15cf03b..d7b689a9e 100644 --- a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -55,7 +55,7 @@ public void execStart() throws Exception { ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec(); dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec( - new ExecStartResultCallback(System.out, System.err)); + new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec(); Boolean bytesAvailable = response.available() > 0; diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java index 4e87d5abf..51c2e3c29 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -46,7 +46,7 @@ public void afterMethod(ITestResult result) { } @Test(groups = "ignoreInCircleCi") - public void inspectExec() throws IOException { + public void inspectExec() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") @@ -56,34 +56,34 @@ public void inspectExec() throws IOException { dockerClient.startContainerCmd(container.getId()).exec(); - ExecCreateCmdResponse touchFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").exec(); - LOG.info("Created exec {}", touchFileCmdCreateResponse.toString()); - assertThat(touchFileCmdCreateResponse.getId(), not(isEmptyString())); - ExecCreateCmdResponse checkFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); - LOG.info("Created exec {}", checkFileCmdCreateResponse.toString()); - assertThat(checkFileCmdCreateResponse.getId(), not(isEmptyString())); - // Check that file does not exist - dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); - - InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); - assertThat(first.getExitCode(), is(0)); + ExecCreateCmdResponse checkFileExec1 = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); + LOG.info("Created exec {}", checkFileExec1.toString()); + assertThat(checkFileExec1.getId(), not(isEmptyString())); + dockerClient.execStartCmd(checkFileExec1.getId()).exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); + InspectExecResponse first = dockerClient.inspectExecCmd(checkFileExec1.getId()).exec(); + assertThat(first.getExitCode(), is(1)); // Create the file + ExecCreateCmdResponse touchFileExec = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").exec(); + LOG.info("Created exec {}", touchFileExec.toString()); + assertThat(touchFileExec.getId(), not(isEmptyString())); dockerClient.execStartCmd(container.getId()) - .withExecId(touchFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); - - InspectExecResponse second = dockerClient.inspectExecCmd(touchFileCmdCreateResponse.getId()).exec(); + .withExecId(touchFileExec.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + InspectExecResponse second = dockerClient.inspectExecCmd(touchFileExec.getId()).exec(); assertThat(second.getExitCode(), is(0)); + // Check that file does exist now + ExecCreateCmdResponse checkFileExec2 = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); + LOG.info("Created exec {}", checkFileExec2.toString()); + assertThat(checkFileExec2.getId(), not(isEmptyString())); dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileCmdCreateResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err)); - - InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); + .withExecId(checkFileExec2.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + InspectExecResponse third = dockerClient.inspectExecCmd(checkFileExec2.getId()).exec(); assertThat(third.getExitCode(), is(0)); // Get container info and check its roundtrip to ensure the consistency 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 b9d81db9d..1e5af11da 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java @@ -61,7 +61,10 @@ public void execStart() throws Exception { dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec( new ExecStartResultCallback(System.out, System.err)); - InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); + LOG.info("Wait for 5 seconds"); + Thread.sleep(5000); + + InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec(); Boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied from the container."); @@ -88,7 +91,7 @@ public void execStartAttached() throws Exception { dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true) .exec(new ExecStartResultCallback(System.out, System.err)); - InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/execStartTest.log").exec(); + InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec(); Boolean bytesAvailable = response.available() > 0; assertTrue(bytesAvailable, "The file was not copied from the container."); diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java index efeba6e99..1849b2fe3 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java @@ -48,48 +48,44 @@ public void afterMethod(ITestResult result) { } @Test(groups = "ignoreInCircleCi") - public void inspectExecTest() throws IOException { + public void inspectExec() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("top") + 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 touchFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").withTty(true).exec(); - LOG.info("Created exec {}", touchFileCmdCreateResponse.toString()); - assertThat(touchFileCmdCreateResponse.getId(), not(isEmptyString())); - ExecCreateCmdResponse checkFileCmdCreateResponse = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); - LOG.info("Created exec {}", checkFileCmdCreateResponse.toString()); - assertThat(checkFileCmdCreateResponse.getId(), not(isEmptyString())); - // Check that file does not exist - dockerClient.execStartCmd(container.getId()).withDetach(false).withTty(true) - .withExecId(checkFileCmdCreateResponse.getId()) - .exec(new ExecStartResultCallback(System.out, System.err)); - - InspectExecResponse first = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); - assertEquals(first.isRunning(), new Boolean(false)); + ExecCreateCmdResponse checkFileExec1 = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(false).withAttachStderr(false).withCmd("test", "-e", "/marker").exec(); + LOG.info("Created exec {}", checkFileExec1.toString()); + assertThat(checkFileExec1.getId(), not(isEmptyString())); + dockerClient.execStartCmd(checkFileExec1.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + InspectExecResponse first = dockerClient.inspectExecCmd(checkFileExec1.getId()).exec(); assertThat(first.getExitCode(), is(1)); // Create the file - dockerClient.execStartCmd(container.getId()).withDetach(false).withTty(true) - .withExecId(touchFileCmdCreateResponse.getId()) - .exec(new ExecStartResultCallback(System.out, System.err)); - - InspectExecResponse second = dockerClient.inspectExecCmd(touchFileCmdCreateResponse.getId()).exec(); - assertEquals(first.isRunning(), new Boolean(false)); + ExecCreateCmdResponse touchFileExec = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").exec(); + LOG.info("Created exec {}", touchFileExec.toString()); + assertThat(touchFileExec.getId(), not(isEmptyString())); + dockerClient.execStartCmd(container.getId()) + .withExecId(touchFileExec.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + InspectExecResponse second = dockerClient.inspectExecCmd(touchFileExec.getId()).exec(); assertThat(second.getExitCode(), is(0)); - // Check that file does exist now - dockerClient.execStartCmd(container.getId()).withExecId(checkFileCmdCreateResponse.getId()) - .exec(new ExecStartResultCallback(System.out, System.err)); - InspectExecResponse third = dockerClient.inspectExecCmd(checkFileCmdCreateResponse.getId()).exec(); + // Check that file does exist now + ExecCreateCmdResponse checkFileExec2 = dockerClient.execCreateCmd(container.getId()) + .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); + LOG.info("Created exec {}", checkFileExec2.toString()); + assertThat(checkFileExec2.getId(), not(isEmptyString())); + dockerClient.execStartCmd(container.getId()) + .withExecId(checkFileExec2.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + InspectExecResponse third = dockerClient.inspectExecCmd(checkFileExec2.getId()).exec(); assertThat(third.getExitCode(), is(0)); // Get container info and check its roundtrip to ensure the consistency From af2a37a095d618f622b4275ef7eec35f7b8df789 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 20 Jan 2016 23:41:20 +0100 Subject: [PATCH 0136/1032] Remove debug println --- .../github/dockerjava/core/command/ExecStartResultCallback.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java index 5f4c33729..23f549c49 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java @@ -37,7 +37,6 @@ public void onNext(Frame frame) { case STDOUT: case RAW: if (stdout != null) { - System.err.println(new String(frame.getPayload())); stdout.write(frame.getPayload()); stdout.flush(); } From bb6bbd63d42007dce69295d668a9bf2e25522ff4 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 21 Jan 2016 22:34:01 +0100 Subject: [PATCH 0137/1032] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56914c46b..2f0141068 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Notes * The upcoming release will contain multiple API breaking changes therefore the major version switch. It will support a subset of v.1.21 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. All changes +* [#430] (https://github.com/docker-java/docker-java/pull/430) Fix ExecStartCmd failure * [#426] (https://github.com/docker-java/docker-java/pull/426) Refactored filters API * [#425] (https://github.com/docker-java/docker-java/pull/425) Implement Network API * [#410] (https://github.com/docker-java/docker-java/pull/410) Support for build-args of docker build From 9b3ed93add255b7da3e123f5a8710fa54c9ca651 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 22 Jan 2016 19:30:35 +0100 Subject: [PATCH 0138/1032] Revert downgrade of jackson --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c6a93bc7a..43a73c889 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 1.7 2.11 - 2.1.2 + 2.6.4 4.3.1 1.5 1.8 From 822cb327d21370a059ef7cc1aa50341d273aa0df Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 23 Jan 2016 19:24:36 +0100 Subject: [PATCH 0139/1032] Fix issue #434 --- .../dockerjava/api/async/ResultCallback.java | 4 +-- .../core/async/ResultCallbackTemplate.java | 24 +++++++++++++ .../core/command/ExecStartResultCallback.java | 2 +- .../dockerjava/netty/InvocationBuilder.java | 36 ++++++------------- .../netty/handler/HttpResponseHandler.java | 15 ++++++-- .../core/command/ExecStartCmdImplTest.java | 2 +- .../core/command/InspectExecCmdImplTest.java | 31 ++++++++-------- .../netty/exec/ExecStartCmdExecTest.java | 13 +++---- .../netty/exec/InspectExecCmdExecTest.java | 31 ++++++++-------- 9 files changed, 90 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java index 2016e1980..0bb052a0b 100644 --- a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java +++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java @@ -7,8 +7,8 @@ */ public interface ResultCallback extends Closeable { /** - * Called when the async processing starts. The passed {@link Closeable} can be used to close/interrupt the - * processing + * Called when the async processing starts respectively when the response arrives from the server. The passed + * {@link Closeable} can be used to close/interrupt the processing. */ void onStart(Closeable closeable); 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 3a62ae46a..5e63f2b5f 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -27,6 +27,8 @@ public abstract class ResultCallbackTemplate void get(TypeReference typeReference, ResultCallback resultCall Channel channel = getChannel(); - initCallback(channel, resultCallback); - JsonResponseCallbackHandler jsonResponseHandler = new JsonResponseCallbackHandler(typeReference, resultCallback); @@ -215,7 +214,7 @@ public InputStream post(final Object entity) { return callback.awaitResult(); } - public void post(final Object entity, final InputStream stdin, ResultCallback resultCallback) { + public void post(final Object entity, final InputStream stdin, final ResultCallback resultCallback) { HttpRequestProvider requestProvider = httpPostRequestProvider(entity); @@ -223,6 +222,14 @@ public void post(final Object entity, final InputStream stdin, ResultCallback>() { + @Override + public void operationComplete(Future future) throws Exception { + resultCallback.onComplete(); + } + }); + HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); HttpConnectionHijackHandler hijackHandler = new HttpConnectionHijackHandler(responseHandler); @@ -284,8 +291,6 @@ public void post(final Object entity, TypeReference typeReference, final Channel channel = getChannel(); - initCallback(channel, resultCallback); - JsonResponseCallbackHandler jsonResponseHandler = new JsonResponseCallbackHandler(typeReference, resultCallback); @@ -300,21 +305,6 @@ public void post(final Object entity, TypeReference typeReference, final return; } - private void initCallback(final Channel channel, final ResultCallback resultCallback) { - Closeable closeable = new Closeable() { - @Override - public void close() throws IOException { - try { - channel.close().sync(); - } catch (InterruptedException e) { - resultCallback.onError(e); - } - } - }; - - resultCallback.onStart(closeable); - } - private HttpRequest prepareDeleteRequest(String uri) { FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.DELETE, uri); @@ -406,8 +396,6 @@ public void post(TypeReference typeReference, ResultCallback resultCal Channel channel = getChannel(); - initCallback(channel, resultCallback); - JsonResponseCallbackHandler jsonResponseHandler = new JsonResponseCallbackHandler(typeReference, resultCallback); @@ -442,8 +430,6 @@ public InputStream get() { ResponseCallback resultCallback = new ResponseCallback(); - initCallback(channel, resultCallback); - HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback); HttpResponseStreamHandler streamHandler = new HttpResponseStreamHandler(resultCallback); diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java index 2f11ccf38..cbe8686d9 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java @@ -11,6 +11,7 @@ import io.netty.handler.codec.http.HttpResponse; import io.netty.handler.codec.http.LastHttpContent; +import java.io.Closeable; import java.nio.charset.Charset; import com.github.dockerjava.api.async.ResultCallback; @@ -24,8 +25,8 @@ import com.github.dockerjava.api.exception.UnauthorizedException; /** - * Handler that is responsible to handle an incoming {@link HttpResponse}. It evaluates the status code and - * triggers the appropriate lifecycle methods at the passed {@link ResultCallback}. + * Handler that is responsible to handle an incoming {@link HttpResponse}. It evaluates the status code and triggers the + * appropriate lifecycle methods at the passed {@link ResultCallback}. * * @author Marcus Linke */ @@ -46,10 +47,18 @@ public HttpResponseHandler(HttpRequestProvider requestProvider, ResultCallback 0; diff --git a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java index 51c2e3c29..f40ee7e69 100644 --- a/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/InspectExecCmdImplTest.java @@ -57,33 +57,36 @@ public void inspectExec() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); // Check that file does not exist - ExecCreateCmdResponse checkFileExec1 = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); + ExecCreateCmdResponse checkFileExec1 = dockerClient.execCreateCmd(container.getId()).withAttachStdout(true) + .withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); LOG.info("Created exec {}", checkFileExec1.toString()); assertThat(checkFileExec1.getId(), not(isEmptyString())); - dockerClient.execStartCmd(checkFileExec1.getId()).exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); + dockerClient.execStartCmd(checkFileExec1.getId()).withDetach(false) + .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); InspectExecResponse first = dockerClient.inspectExecCmd(checkFileExec1.getId()).exec(); + assertThat(first.isRunning(), is(false)); assertThat(first.getExitCode(), is(1)); // Create the file - ExecCreateCmdResponse touchFileExec = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").exec(); + ExecCreateCmdResponse touchFileExec = dockerClient.execCreateCmd(container.getId()).withAttachStdout(true) + .withAttachStderr(true).withCmd("touch", "/marker").exec(); LOG.info("Created exec {}", touchFileExec.toString()); assertThat(touchFileExec.getId(), not(isEmptyString())); - dockerClient.execStartCmd(container.getId()) - .withExecId(touchFileExec.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + dockerClient.execStartCmd(touchFileExec.getId()).withDetach(false) + .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); InspectExecResponse second = dockerClient.inspectExecCmd(touchFileExec.getId()).exec(); + assertThat(second.isRunning(), is(false)); assertThat(second.getExitCode(), is(0)); - // Check that file does exist now - ExecCreateCmdResponse checkFileExec2 = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); + ExecCreateCmdResponse checkFileExec2 = dockerClient.execCreateCmd(container.getId()).withAttachStdout(true) + .withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); LOG.info("Created exec {}", checkFileExec2.toString()); assertThat(checkFileExec2.getId(), not(isEmptyString())); - dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileExec2.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + dockerClient.execStartCmd(checkFileExec2.getId()).withDetach(false) + .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); InspectExecResponse third = dockerClient.inspectExecCmd(checkFileExec2.getId()).exec(); + assertThat(third.isRunning(), is(false)); assertThat(third.getExitCode(), is(0)); // Get container info and check its roundtrip to ensure the consistency @@ -103,8 +106,8 @@ public void inspectExecNetworkSettings() throws IOException { dockerClient.startContainerCmd(container.getId()).exec(); - ExecCreateCmdResponse exec = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("/bin/bash").exec(); + ExecCreateCmdResponse exec = dockerClient.execCreateCmd(container.getId()).withAttachStdout(true) + .withAttachStderr(true).withCmd("/bin/bash").exec(); LOG.info("Created exec {}", exec.toString()); assertThat(exec.getId(), not(isEmptyString())); 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 1e5af11da..e4ceedac7 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/ExecStartCmdExecTest.java @@ -58,11 +58,8 @@ public void execStart() throws Exception { ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec(); - dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec( - new ExecStartResultCallback(System.out, System.err)); - - LOG.info("Wait for 5 seconds"); - Thread.sleep(5000); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false) + .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); InputStream response = dockerClient.copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec(); @@ -88,8 +85,8 @@ public void execStartAttached() throws Exception { ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec(); - dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true) - .exec(new ExecStartResultCallback(System.out, System.err)); + 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; @@ -141,7 +138,7 @@ public void execStartNotAttachedStdin() throws Exception { ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()) .withAttachStdout(true).withAttachStdin(false).withCmd("/bin/sh").exec(); - dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true).withStdIn(stdin) + dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withStdIn(stdin) .exec(new ExecStartResultCallback(stdout, System.err)).awaitCompletion(5, TimeUnit.SECONDS); assertEquals(stdout.toString(), ""); diff --git a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java index 1849b2fe3..ecf5ed568 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/InspectExecCmdExecTest.java @@ -59,33 +59,36 @@ public void inspectExec() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); // Check that file does not exist - ExecCreateCmdResponse checkFileExec1 = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(false).withAttachStderr(false).withCmd("test", "-e", "/marker").exec(); + ExecCreateCmdResponse checkFileExec1 = dockerClient.execCreateCmd(container.getId()).withAttachStdout(true) + .withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); LOG.info("Created exec {}", checkFileExec1.toString()); assertThat(checkFileExec1.getId(), not(isEmptyString())); - dockerClient.execStartCmd(checkFileExec1.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + dockerClient.execStartCmd(checkFileExec1.getId()).withDetach(false) + .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); InspectExecResponse first = dockerClient.inspectExecCmd(checkFileExec1.getId()).exec(); + assertThat(first.isRunning(), is(false)); assertThat(first.getExitCode(), is(1)); // Create the file - ExecCreateCmdResponse touchFileExec = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("touch", "/marker").exec(); + ExecCreateCmdResponse touchFileExec = dockerClient.execCreateCmd(container.getId()).withAttachStdout(true) + .withAttachStderr(true).withCmd("touch", "/marker").exec(); LOG.info("Created exec {}", touchFileExec.toString()); assertThat(touchFileExec.getId(), not(isEmptyString())); - dockerClient.execStartCmd(container.getId()) - .withExecId(touchFileExec.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + dockerClient.execStartCmd(touchFileExec.getId()).withDetach(false) + .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); InspectExecResponse second = dockerClient.inspectExecCmd(touchFileExec.getId()).exec(); + assertThat(second.isRunning(), is(false)); assertThat(second.getExitCode(), is(0)); - // Check that file does exist now - ExecCreateCmdResponse checkFileExec2 = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); + ExecCreateCmdResponse checkFileExec2 = dockerClient.execCreateCmd(container.getId()).withAttachStdout(true) + .withAttachStderr(true).withCmd("test", "-e", "/marker").exec(); LOG.info("Created exec {}", checkFileExec2.toString()); assertThat(checkFileExec2.getId(), not(isEmptyString())); - dockerClient.execStartCmd(container.getId()) - .withExecId(checkFileExec2.getId()).exec(new ExecStartResultCallback(System.out, System.err)); + dockerClient.execStartCmd(checkFileExec2.getId()).withDetach(false) + .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion(); InspectExecResponse third = dockerClient.inspectExecCmd(checkFileExec2.getId()).exec(); + assertThat(third.isRunning(), is(false)); assertThat(third.getExitCode(), is(0)); // Get container info and check its roundtrip to ensure the consistency @@ -105,8 +108,8 @@ public void inspectExecNetworkSettings() throws IOException { dockerClient.startContainerCmd(container.getId()).exec(); - ExecCreateCmdResponse exec = dockerClient.execCreateCmd(container.getId()) - .withAttachStdout(true).withAttachStderr(true).withCmd("/bin/bash").exec(); + ExecCreateCmdResponse exec = dockerClient.execCreateCmd(container.getId()).withAttachStdout(true) + .withAttachStderr(true).withCmd("/bin/bash").exec(); LOG.info("Created exec {}", exec.toString()); assertThat(exec.getId(), not(isEmptyString())); From 0115561927dd420ba6e6109132a3b56e8e48edbe Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 24 Jan 2016 19:03:41 +0100 Subject: [PATCH 0140/1032] Fix tests --- .../dockerjava/core/command/LogContainerCmdImplTest.java | 3 ++- .../github/dockerjava/netty/exec/LogContainerCmdExecTest.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 0a9a39718..817179eb2 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -4,6 +4,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.containsString; import java.io.IOException; import java.lang.reflect.Method; @@ -164,7 +165,7 @@ public void asyncLogContainerWithSince() throws Exception { loggingCallback.awaitCompletion(); - assertFalse(loggingCallback.toString().contains(snippet)); + 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 b3bb6ed58..310994755 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/LogContainerCmdExecTest.java @@ -4,6 +4,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.containsString; import java.io.IOException; import java.lang.reflect.Method; @@ -165,7 +166,7 @@ public void asyncLogContainerWithSince() throws Exception { loggingCallback.awaitCompletion(); - assertFalse(loggingCallback.toString().contains(snippet)); + assertThat(loggingCallback.toString(), containsString(snippet)); } } From d3c7df8df5b4d9565299445257526a4ade0ae610 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 25 Jan 2016 22:24:59 +0100 Subject: [PATCH 0141/1032] Test binds in inspect container response --- .../core/command/CreateContainerCmdImplTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 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 e89d09861..ce2771652 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -140,18 +140,20 @@ public void createContainerWithVolumesFrom() throws DockerException { String container1Name = UUID.randomUUID().toString(); + Bind bind1 = new Bind("/src/webapp1", volume1); + Bind bind2 = new Bind("/src/webapp2", volume2); + // create a running container with bind mounts CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") .withName(container1Name) - .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + .withBinds(bind1, bind2).exec(); LOG.info("Created container1 {}", container1.toString()); - dockerClient.startContainerCmd(container1.getId()).exec(); - LOG.info("Started container1 {}", container1.toString()); - InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) .exec(); + assertThat(Arrays.asList(inspectContainerResponse1.getHostConfig().getBinds()), containsInAnyOrder(bind1, bind2)); + assertThat(inspectContainerResponse1, mountedVolumes(containsInAnyOrder(volume1, volume2))); // create a second container with volumes from first container From edd90c389b632e4ed01ba12456654a5a81bdfee1 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 25 Jan 2016 22:46:26 +0100 Subject: [PATCH 0142/1032] netty: Test binds in inspect container response --- .../netty/exec/CreateContainerCmdExecTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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 0a11c8ce4..9a37ef01a 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java @@ -142,18 +142,20 @@ public void createContainerWithVolumesFrom() throws DockerException { String container1Name = UUID.randomUUID().toString(); + Bind bind1 = new Bind("/src/webapp1", volume1); + Bind bind2 = new Bind("/src/webapp2", volume2); + // create a running container with bind mounts CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") .withName(container1Name) - .withBinds(new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + .withBinds(bind1, bind2).exec(); LOG.info("Created container1 {}", container1.toString()); - dockerClient.startContainerCmd(container1.getId()).exec(); - LOG.info("Started container1 {}", container1.toString()); - InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd(container1.getId()) .exec(); + assertThat(Arrays.asList(inspectContainerResponse1.getHostConfig().getBinds()), containsInAnyOrder(bind1, bind2)); + assertThat(inspectContainerResponse1, mountedVolumes(containsInAnyOrder(volume1, volume2))); // create a second container with volumes from first container From f2954e037ef6be098b1ef838480d61421ed34ceb Mon Sep 17 00:00:00 2001 From: Marcus Thiesen Date: Wed, 27 Jan 2016 10:58:00 +0100 Subject: [PATCH 0143/1032] Make API Version transitions easier IMHO there is no reason to be that strict about the JSON models, because it leads to things like e.g. Issue #437 . Be more lenient with changes in the data. --- .../com/github/dockerjava/api/model/BuildResponseItem.java | 2 +- .../com/github/dockerjava/api/model/PullResponseItem.java | 2 +- .../com/github/dockerjava/api/model/PushResponseItem.java | 2 +- .../java/com/github/dockerjava/api/model/ResponseItem.java | 6 +++--- .../java/com/github/dockerjava/api/model/WaitResponse.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) 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 264988910..a53a1df9a 100644 --- a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -6,7 +6,7 @@ /** * Represents a build response stream item */ -@JsonIgnoreProperties(ignoreUnknown = false) +@JsonIgnoreProperties(ignoreUnknown = true) public class BuildResponseItem extends ResponseItem { private static final long serialVersionUID = -1252904184236343612L; diff --git a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java index 3ab77bee0..90b3ee336 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -6,7 +6,7 @@ /** * Represents a pull response stream item */ -@JsonIgnoreProperties(ignoreUnknown = false) +@JsonIgnoreProperties(ignoreUnknown = true) public class PullResponseItem extends ResponseItem { private static final long serialVersionUID = -2575482839766823293L; diff --git a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java index 059398d4e..829fbbbad 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java @@ -5,7 +5,7 @@ /** * Represents a push response stream item */ -@JsonIgnoreProperties(ignoreUnknown = false) +@JsonIgnoreProperties(ignoreUnknown = true) public class PushResponseItem extends ResponseItem { private static final long serialVersionUID = 8256977108011295857L; 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 1bf71fa34..586a49d63 100644 --- a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java @@ -14,7 +14,7 @@ /** * Represents a pull response stream item */ -@JsonIgnoreProperties(ignoreUnknown = false) +@JsonIgnoreProperties(ignoreUnknown = true) public class ResponseItem implements Serializable { private static final long serialVersionUID = -5187169652557467828L; @@ -105,7 +105,7 @@ public boolean isErrorIndicated() { return getError() != null || getErrorDetail() != null; } - @JsonIgnoreProperties(ignoreUnknown = false) + @JsonIgnoreProperties(ignoreUnknown = true) public static class ProgressDetail implements Serializable { private static final long serialVersionUID = -1954994695645715264L; @@ -139,7 +139,7 @@ public String toString() { } } - @JsonIgnoreProperties(ignoreUnknown = false) + @JsonIgnoreProperties(ignoreUnknown = true) public static class ErrorDetail implements Serializable { private static final long serialVersionUID = -9136704865403084083L; 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 ca6d61eb9..a2ab16f6f 100644 --- a/src/main/java/com/github/dockerjava/api/model/WaitResponse.java +++ b/src/main/java/com/github/dockerjava/api/model/WaitResponse.java @@ -6,7 +6,7 @@ /** * Represents a wait container command response */ -@JsonIgnoreProperties(ignoreUnknown = false) +@JsonIgnoreProperties(ignoreUnknown = true) public class WaitResponse { @JsonProperty("StatusCode") From d0cde8e79f20d6c21b526222e62f709c3f86e55f Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 16:11:36 +0300 Subject: [PATCH 0144/1032] Checkstyle: not tabs. --- .../api/command/ExecCreateCmdResponse.java | 4 ++-- .../core/command/ListImagesCmdImpl.java | 4 ++-- .../dockerjava/jaxrs/ListImagesCmdExec.java | 4 ++-- .../github/dockerjava/netty/MediaType.java | 20 +++++++++---------- .../netty/handler/JsonRequestHandler.java | 14 ++++++------- .../checkstyle/checkstyle-config.xml | 8 ++++++++ 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java index 08751f3e2..9c13912fc 100644 --- a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java @@ -15,9 +15,9 @@ public class ExecCreateCmdResponse { public String getId() { return id; } - + @Override public String toString() { - return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); + return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); } } diff --git a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index d726ca7ce..1033b43ec 100644 --- a/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -17,9 +17,9 @@ */ public class ListImagesCmdImpl extends AbstrDockerCmd> implements ListImagesCmd { - private String imageNameFilter; + private String imageNameFilter; - private Boolean showAll = false; + private Boolean showAll = false; private FiltersBuilder filters = new FiltersBuilder(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java index 1e7acfc33..3d6320151 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListImagesCmdExec.java @@ -31,11 +31,11 @@ protected List execute(ListImagesCmd command) { webTarget = booleanQueryParam(webTarget, "all", command.hasShowAllEnabled()); if (command.getFilters() != null && !command.getFilters().isEmpty()) { - webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); + webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); } if (command.getImageNameFilter() != null) { - webTarget = webTarget.queryParam("filter", urlPathSegmentEscaper().escape(command.getImageNameFilter())); + webTarget = webTarget.queryParam("filter", urlPathSegmentEscaper().escape(command.getImageNameFilter())); } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/MediaType.java b/src/main/java/com/github/dockerjava/netty/MediaType.java index a7738604a..50732aeb8 100644 --- a/src/main/java/com/github/dockerjava/netty/MediaType.java +++ b/src/main/java/com/github/dockerjava/netty/MediaType.java @@ -8,17 +8,17 @@ */ public enum MediaType { - APPLICATION_JSON("application/json"), - APPLICATION_OCTET_STREAM("application/octet-stream"), - APPLICATION_X_TAR("application/x-tar"); + APPLICATION_JSON("application/json"), + APPLICATION_OCTET_STREAM("application/octet-stream"), + APPLICATION_X_TAR("application/x-tar"); - private String mediaType; + private String mediaType; - private MediaType(String mediaType) { - this.mediaType = mediaType; - } + private MediaType(String mediaType) { + this.mediaType = mediaType; + } - public String getMediaType() { - return mediaType; - } + public String getMediaType() { + return mediaType; + } } diff --git a/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java b/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java index 54ffb2f96..cb6f60678 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/JsonRequestHandler.java @@ -11,13 +11,13 @@ * * @author Marcus Linke */ -public class JsonRequestHandler extends MessageToByteEncoder{ +public class JsonRequestHandler extends MessageToByteEncoder { - private ObjectMapper mapper = new ObjectMapper(); + private ObjectMapper mapper = new ObjectMapper(); - @Override - protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { - byte[] serialized = mapper.writeValueAsBytes(msg); - out.writeBytes(serialized); - } + @Override + protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { + byte[] serialized = mapper.writeValueAsBytes(msg); + out.writeBytes(serialized); + } } diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index 9f9f7b02b..f65ea846f 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -18,6 +18,14 @@ + + + + + + + + From 2d110ad9ee602e08190c9859fb39334f6907250e Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 16:15:27 +0300 Subject: [PATCH 0145/1032] Checkstyle: no trailing spaces. --- .../github/dockerjava/api/model/Capability.java | 2 +- .../dockerjava/api/model/InternetProtocol.java | 14 +++++++++----- .../github/dockerjava/api/model/Repository.java | 4 ++-- .../github/dockerjava/core/GoLangFileMatch.java | 6 +++--- .../github/dockerjava/core/KeystoreSSLConfig.java | 2 +- .../java/com/github/dockerjava/core/SSLConfig.java | 2 +- .../dockerjava/core/command/PingCmdImpl.java | 1 - .../connector/ApacheConnectorClientResponse.java | 4 ++-- .../jaxrs/filter/FollowRedirectsFilter.java | 2 +- .../jaxrs/filter/SelectiveLoggingFilter.java | 3 +-- .../resources/checkstyle/checkstyle-config.xml | 7 +++++++ 11 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/Capability.java b/src/main/java/com/github/dockerjava/api/model/Capability.java index b17827553..4757937e3 100644 --- a/src/main/java/com/github/dockerjava/api/model/Capability.java +++ b/src/main/java/com/github/dockerjava/api/model/Capability.java @@ -3,7 +3,7 @@ /** * The Linux capabilities supported by Docker. The list of capabilities is defined in Docker's types.go, {@link #ALL} * was added manually. - * + * * @see http://man7.org/linux/man-pages/man7/capabilities.7.html */ diff --git a/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java b/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java index 65df8cf6f..e3ef2b98c 100644 --- a/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java +++ b/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java @@ -2,15 +2,19 @@ /** * The IP protocols supported by Docker. - * + * * @see #TCP * @see #UDP */ public enum InternetProtocol { - /** The Transmission Control Protocol */ + /** + * The Transmission Control Protocol + */ TCP, - /** The User Datagram Protocol */ + /** + * The User Datagram Protocol + */ UDP; /** @@ -21,7 +25,7 @@ public enum InternetProtocol { /** * Returns a string representation of this {@link InternetProtocol} suitable for inclusion in a JSON message. The * output is the lowercased name of the Protocol, e.g. tcp. - * + * * @return a string representation of this {@link InternetProtocol} */ @Override @@ -31,7 +35,7 @@ public String toString() { /** * Parses a string to an {@link InternetProtocol}. - * + * * @param serialized * the protocol, e.g. tcp or TCP * @return an {@link InternetProtocol} described by the string 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 1c5b641ba..3055c8980 100644 --- a/src/main/java/com/github/dockerjava/api/model/Repository.java +++ b/src/main/java/com/github/dockerjava/api/model/Repository.java @@ -13,7 +13,7 @@ public class Repository { /** * Name may be eg. 'busybox' or '10.0.0.1:5000/fred' - * + * * @param name * Repository name */ @@ -23,7 +23,7 @@ public Repository(String name) { /** * Return the URL portion (repository). Note that this might not actually BE a repository location. - * + * * @return * @throws java.net.MalformedURLException */ diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index ef798d68d..2f29789ea 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -26,16 +26,16 @@ * character class (must be non-empty) * c matches character c (c != '*', '?', '\\', '[') * '\\' c matches character c - * + * * character-range: * c matches character c (c != '\\', '-', ']') * '\\' c matches character c * lo '-' hi matches character c for lo <= c <= hi - * + * * Match requires pattern to match all of name, not just a substring. * The only possible returned error is ErrBadPattern, when pattern * is malformed. - * + * * On Windows, escaping is disabled. Instead, '\\' is treated as * path separator. * diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index dc9defbfb..5e62f4d78 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -65,7 +65,7 @@ public KeystoreSSLConfig(File pfxFile, String password) throws KeyStoreException /** * Get the SSL Context out of the keystore. - * + * * @return java SSLContext * @throws KeyManagementException * @throws UnrecoverableKeyException diff --git a/src/main/java/com/github/dockerjava/core/SSLConfig.java b/src/main/java/com/github/dockerjava/core/SSLConfig.java index 6c7e5c353..0346aa610 100644 --- a/src/main/java/com/github/dockerjava/core/SSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/SSLConfig.java @@ -14,7 +14,7 @@ public interface SSLConfig { /** * Get the SSL Context, from wherever it comes (file, keystore). - * + * * @return an SSL context. */ SSLContext getSSLContext() throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, diff --git a/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java index c9118a095..39c9666d7 100644 --- a/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/PingCmdImpl.java @@ -4,7 +4,6 @@ /** * Ping the Docker server - * */ public class PingCmdImpl extends AbstrDockerCmd implements PingCmd { diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java index d358f574a..fead3575c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorClientResponse.java @@ -11,9 +11,9 @@ /** * Fix for https://github.com/docker-java/docker-java/issues/196 - * + * * https://java.net/jira/browse/JERSEY-2852 - * + * * @author Marcus Linke * */ diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java index be079d430..cb5cd0687 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java @@ -12,7 +12,7 @@ * Default implementation of RedirectStrategy honors the restrictions on automatic redirection of entity enclosing * methods such as POST and PUT imposed by the HTTP specification. 302 Moved Temporarily, 301 Moved Permanently and 307 * Temporary Redirect status codes will result in an automatic redirect of HEAD and GET methods only. - * + * * {@link org.apache.http.impl.client.DefaultRedirectStrategy} * * This filter allows arbitrary redirection for other methods. 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 847033fd5..2251d8fad 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java @@ -13,9 +13,8 @@ /** * A version of the logging filter that will avoid trying to log entities which can cause issues with the console. - * - * @author sfitts * + * @author sfitts */ public class SelectiveLoggingFilter extends LoggingFilter { diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index f65ea846f..0b42e4d05 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -26,6 +26,13 @@ + + + + + + + From 3dcb1439957e51e669f8a2ed476aad612ba47e6f Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 16:35:38 +0300 Subject: [PATCH 0146/1032] Checkstyle: fix naming convention. --- .../com/github/dockerjava/api/model/Info.java | 36 +++++++++---------- .../github/dockerjava/api/model/Ports.java | 4 +-- .../dockerjava/core/DockerClientConfig.java | 6 ++-- .../github/dockerjava/core/NameParser.java | 3 +- .../dockerjava/core/util/FiltersEncoder.java | 2 +- .../jaxrs/connector/ApacheConnector.java | 10 +++--- .../jaxrs/filter/LoggingFilter.java | 10 +++--- .../github/dockerjava/netty/WebTarget.java | 2 +- .../dockerjava/api/model/BindingTest.java | 8 ++--- .../api/model/Ports_addBindingsTest.java | 4 +-- .../command/CreateContainerCmdImplTest.java | 12 +++---- .../command/StartContainerCmdImplTest.java | 20 +++++------ .../exec/CreateContainerCmdExecTest.java | 14 ++++---- .../netty/exec/StartContainerCmdExecTest.java | 22 ++++++------ .../checkstyle/checkstyle-config.xml | 31 ++++++++++++++++ 15 files changed, 106 insertions(+), 78 deletions(-) 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 d038df878..0e4816cce 100644 --- a/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/src/main/java/com/github/dockerjava/api/model/Info.java @@ -25,7 +25,7 @@ public class Info { private Boolean debug; @JsonProperty("DockerRootDir") - private String DockerRootDir; + private String dockerRootDir; @JsonProperty("Driver") private String driver; @@ -37,16 +37,16 @@ public class Info { private String executionDriver; @JsonProperty("ID") - private String ID; + private String id; @JsonProperty("IPv4Forwarding") - private Boolean IPv4Forwarding; + private Boolean ipv4Forwarding; @JsonProperty("Images") private Integer images; @JsonProperty("IndexServerAddress") - private String IndexServerAddress; + private String indexServerAddress; @JsonProperty("InitPath") private String initPath; @@ -58,7 +58,7 @@ public class Info { private String kernelVersion; @JsonProperty("Labels") - private String[] Labels; + private String[] labels; @JsonProperty("MemoryLimit") private Boolean memoryLimit; @@ -70,19 +70,19 @@ public class Info { private String name; @JsonProperty("NCPU") - private Integer NCPU; + private Integer ncpu; @JsonProperty("NEventsListener") private Long nEventListener; @JsonProperty("NFd") - private Integer NFd; + private Integer nfd; @JsonProperty("NGoroutines") - private Integer NGoroutines; + private Integer nGoroutines; @JsonProperty("OperatingSystem") - private String OperatingSystem; + private String operatingSystem; @JsonProperty("Sockets") private String[] sockets; @@ -99,7 +99,7 @@ public Integer getContainers() { } public String getDockerRootDir() { - return DockerRootDir; + return dockerRootDir; } public String getDriver() { @@ -115,15 +115,15 @@ public Integer getImages() { } public String getID() { - return ID; + return id; } public Boolean getIPv4Forwarding() { - return IPv4Forwarding; + return ipv4Forwarding; } public String getIndexServerAddress() { - return IndexServerAddress; + return indexServerAddress; } public String getInitPath() { @@ -139,7 +139,7 @@ public String getKernelVersion() { } public String[] getLabels() { - return Labels; + return labels; } public String[] getSockets() { @@ -163,19 +163,19 @@ public String getName() { } public Integer getNCPU() { - return NCPU; + return ncpu; } public Integer getNFd() { - return NFd; + return nfd; } public Integer getNGoroutines() { - return NGoroutines; + return nGoroutines; } public String getOperatingSystem() { - return OperatingSystem; + return operatingSystem; } public Boolean getSwapLimit() { 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 0ff5762e6..780e5911c 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -112,14 +112,14 @@ public Map getBindings() { /** * Creates a {@link Binding} for the given IP address and port number. */ - public static Binding Binding(String hostIp, Integer hostPort) { + public static Binding binding(String hostIp, Integer hostPort) { return new Binding(hostIp, hostPort); } /** * Creates a {@link Binding} for the given port number, leaving the IP address undefined. */ - public static Binding Binding(Integer hostPort) { + public static Binding binding(Integer hostPort) { return new Binding(hostPort); } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index fa5c77e6a..0a1868922 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -270,10 +270,10 @@ public AuthConfig effectiveAuthConfig(String imageName) { authConfig = authConfigFile.resolveAuthConfig(hostnameReposName.hostname); } - AuthConfig _authConfig = getAuthConfig(); + AuthConfig otherAuthConfig = getAuthConfig(); - if (_authConfig != null) - authConfig = _authConfig; + if (otherAuthConfig != null) + authConfig = otherAuthConfig; return authConfig; } diff --git a/src/main/java/com/github/dockerjava/core/NameParser.java b/src/main/java/com/github/dockerjava/core/NameParser.java index ba2948fb8..3c58eb331 100644 --- a/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/src/main/java/com/github/dockerjava/core/NameParser.java @@ -13,13 +13,14 @@ import com.github.dockerjava.core.exception.InvalidRepositoryNameException; public class NameParser { - + //CHECKSTYLE:OFF private static final int RepositoryNameTotalLengthMax = 255; private static final Pattern RepositoryNameComponentRegexp = Pattern.compile("[a-z0-9]+(?:[._-][a-z0-9]+)*"); private static final Pattern RepositoryNameComponentAnchoredRegexp = Pattern.compile("^" + RepositoryNameComponentRegexp.pattern() + "$"); + //CHECKSTYLE:ON // private static final Pattern RepositoryNameRegexp = Pattern.compile("(?:" + // RepositoryNameComponentRegexp.pattern() diff --git a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java index 75f9d48c2..164528a8c 100644 --- a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java +++ b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java @@ -17,7 +17,7 @@ */ public class FiltersEncoder { - private static ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, + private static final ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, MediaType.APPLICATION_JSON_TYPE); public static String jsonEncode(Map> filters) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java index f7c830902..cfbabb513 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java @@ -184,13 +184,13 @@ class ApacheConnector implements Connector { private final static Logger LOGGER = Logger.getLogger(ApacheConnector.class.getName()); - private static final VersionInfo vi; + private static final VersionInfo VERSION_INFO; - private static final String release; + private static final String RELEASE; static { - vi = VersionInfo.loadVersionInfo("org.apache.http.client", HttpClientBuilder.class.getClassLoader()); - release = (vi != null) ? vi.getRelease() : VersionInfo.UNAVAILABLE; + VERSION_INFO = VersionInfo.loadVersionInfo("org.apache.http.client", HttpClientBuilder.class.getClassLoader()); + RELEASE = (VERSION_INFO != null) ? VERSION_INFO.getRelease() : VersionInfo.UNAVAILABLE; } private final CloseableHttpClient client; @@ -507,7 +507,7 @@ public void run() { @Override public String getName() { - return "Apache HttpClient " + release; + return "Apache HttpClient " + RELEASE; } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java index 6dbea0045..ccd6500d1 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java @@ -109,7 +109,7 @@ public int compare(final Map.Entry> o1, final Map.Entry queryParams = new HashMap(); - private static String PATH_SEPARATOR = "/"; + private static final String PATH_SEPARATOR = "/"; public WebTarget(ChannelProvider channelProvider) { this.channelProvider = channelProvider; diff --git a/src/test/java/com/github/dockerjava/api/model/BindingTest.java b/src/test/java/com/github/dockerjava/api/model/BindingTest.java index 3309a8904..23e793cf8 100644 --- a/src/test/java/com/github/dockerjava/api/model/BindingTest.java +++ b/src/test/java/com/github/dockerjava/api/model/BindingTest.java @@ -10,22 +10,22 @@ public class BindingTest { @Test public void parseIpAndPort() { - assertEquals(Binding.parse("127.0.0.1:80"), Ports.Binding("127.0.0.1", 80)); + assertEquals(Binding.parse("127.0.0.1:80"), Ports.binding("127.0.0.1", 80)); } @Test public void parsePortOnly() { - assertEquals(Binding.parse("80"), Ports.Binding(null, 80)); + assertEquals(Binding.parse("80"), Ports.binding(null, 80)); } @Test public void parseIPOnly() { - assertEquals(Binding.parse("127.0.0.1"), Ports.Binding("127.0.0.1", null)); + assertEquals(Binding.parse("127.0.0.1"), Ports.binding("127.0.0.1", null)); } @Test public void parseEmptyString() { - assertEquals(Binding.parse(""), Ports.Binding(null, null)); + assertEquals(Binding.parse(""), Ports.binding(null, null)); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = "Error parsing Binding 'nonsense'") diff --git a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java index da127b122..05a2b3f01 100644 --- a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java @@ -19,9 +19,9 @@ public class Ports_addBindingsTest { private static final ExposedPort TCP_90 = ExposedPort.tcp(90); - private static final Binding BINDING_8080 = Ports.Binding(8080); + private static final Binding BINDING_8080 = Ports.binding(8080); - private static final Binding BINDING_9090 = Ports.Binding(9090); + private static final Binding BINDING_9090 = Ports.binding(9090); private Ports ports; 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 ce2771652..3f989c114 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -363,9 +363,9 @@ public void createContainerWithPortBindings() throws DockerException { ExposedPort tcp23 = ExposedPort.tcp(23); Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(11022)); - portBindings.bind(tcp23, Ports.Binding(11023)); - portBindings.bind(tcp23, Ports.Binding(11024)); + portBindings.bind(tcp22, Ports.binding(11022)); + portBindings.bind(tcp23, Ports.binding(11023)); + portBindings.bind(tcp23, Ports.binding(11024)); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); @@ -379,13 +379,13 @@ public void createContainerWithPortBindings() throws DockerException { assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0], - is(equalTo(Ports.Binding(11022)))); + is(equalTo(Ports.binding(11022)))); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], - is(equalTo(Ports.Binding(11023)))); + is(equalTo(Ports.binding(11023)))); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], - is(equalTo(Ports.Binding(11024)))); + is(equalTo(Ports.binding(11024)))); } 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 b43eb0ff2..ce060f4bb 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -186,9 +186,9 @@ public void startContainerWithPortBindings() throws DockerException { ExposedPort tcp23 = ExposedPort.tcp(23); Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(11022)); - portBindings.bind(tcp23, Ports.Binding(11023)); - portBindings.bind(tcp23, Ports.Binding(11024)); + portBindings.bind(tcp22, Ports.binding(11022)); + portBindings.bind(tcp23, Ports.binding(11023)); + portBindings.bind(tcp23, Ports.binding(11024)); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); @@ -206,13 +206,13 @@ public void startContainerWithPortBindings() throws DockerException { assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0], - is(equalTo(Ports.Binding(11022)))); + is(equalTo(Ports.binding(11022)))); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], - is(equalTo(Ports.Binding(11023)))); + is(equalTo(Ports.binding(11023)))); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], - is(equalTo(Ports.Binding(11024)))); + is(equalTo(Ports.binding(11024)))); } @@ -223,8 +223,8 @@ public void startContainerWithRandomPortBindings() throws DockerException { ExposedPort tcp23 = ExposedPort.tcp(23); Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(null)); - portBindings.bind(tcp23, Ports.Binding(null)); + portBindings.bind(tcp22, Ports.binding(null)); + portBindings.bind(tcp23, Ports.binding(null)); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).withPublishAllPorts(true).exec(); @@ -254,8 +254,8 @@ public void startContainerWithConflictingPortBindings() throws DockerException { ExposedPort tcp23 = ExposedPort.tcp(23); Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(11022)); - portBindings.bind(tcp23, Ports.Binding(11022)); + portBindings.bind(tcp22, Ports.binding(11022)); + portBindings.bind(tcp23, Ports.binding(11022)); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); 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 9a37ef01a..a29b26d7b 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java @@ -32,7 +32,6 @@ 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.AccessMode; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Device; import com.github.dockerjava.api.model.ExposedPort; @@ -42,7 +41,6 @@ import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Ulimit; import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumeRW; import com.github.dockerjava.api.model.VolumesFrom; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; @@ -358,9 +356,9 @@ public void createContainerWithPortBindings() throws DockerException { ExposedPort tcp23 = ExposedPort.tcp(23); Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(11022)); - portBindings.bind(tcp23, Ports.Binding(11023)); - portBindings.bind(tcp23, Ports.Binding(11024)); + portBindings.bind(tcp22, Ports.binding(11022)); + portBindings.bind(tcp23, Ports.binding(11023)); + portBindings.bind(tcp23, Ports.binding(11024)); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); @@ -374,13 +372,13 @@ public void createContainerWithPortBindings() throws DockerException { assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0], - is(equalTo(Ports.Binding(11022)))); + is(equalTo(Ports.binding(11022)))); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], - is(equalTo(Ports.Binding(11023)))); + is(equalTo(Ports.binding(11023)))); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], - is(equalTo(Ports.Binding(11024)))); + is(equalTo(Ports.binding(11024)))); } 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 d743935eb..8af196a60 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java @@ -31,7 +31,6 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.exception.InternalServerErrorException; import com.github.dockerjava.api.exception.NotFoundException; -import com.github.dockerjava.api.model.AccessMode; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Device; import com.github.dockerjava.api.model.ExposedPort; @@ -39,7 +38,6 @@ import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.RestartPolicy; import com.github.dockerjava.api.model.Volume; -import com.github.dockerjava.api.model.VolumeRW; import com.github.dockerjava.api.model.VolumesFrom; import com.github.dockerjava.core.command.WaitContainerResultCallback; import com.github.dockerjava.netty.AbstractNettyDockerClientTest; @@ -189,9 +187,9 @@ public void startContainerWithPortBindings() throws DockerException { ExposedPort tcp23 = ExposedPort.tcp(23); Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(11022)); - portBindings.bind(tcp23, Ports.Binding(11023)); - portBindings.bind(tcp23, Ports.Binding(11024)); + portBindings.bind(tcp22, Ports.binding(11022)); + portBindings.bind(tcp23, Ports.binding(11023)); + portBindings.bind(tcp23, Ports.binding(11024)); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); @@ -209,13 +207,13 @@ public void startContainerWithPortBindings() throws DockerException { assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23)); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp22)[0], - is(equalTo(Ports.Binding(11022)))); + is(equalTo(Ports.binding(11022)))); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[0], - is(equalTo(Ports.Binding(11023)))); + is(equalTo(Ports.binding(11023)))); assertThat(inspectContainerResponse.getHostConfig().getPortBindings().getBindings().get(tcp23)[1], - is(equalTo(Ports.Binding(11024)))); + is(equalTo(Ports.binding(11024)))); } @@ -226,8 +224,8 @@ public void startContainerWithRandomPortBindings() throws DockerException { ExposedPort tcp23 = ExposedPort.tcp(23); Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(null)); - portBindings.bind(tcp23, Ports.Binding(null)); + portBindings.bind(tcp22, Ports.binding(null)); + portBindings.bind(tcp23, Ports.binding(null)); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("sleep", "9999") .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).withPublishAllPorts(true).exec(); @@ -257,8 +255,8 @@ public void startContainerWithConflictingPortBindings() throws DockerException { ExposedPort tcp23 = ExposedPort.tcp(23); Ports portBindings = new Ports(); - portBindings.bind(tcp22, Ports.Binding(11022)); - portBindings.bind(tcp23, Ports.Binding(11022)); + portBindings.bind(tcp22, Ports.binding(11022)); + portBindings.bind(tcp23, Ports.binding(11022)); CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd("true") .withExposedPorts(tcp22, tcp23).withPortBindings(portBindings).exec(); diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index 0b42e4d05..c31d642ef 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -32,8 +32,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 5bcb8f846edc81fc97b5d7d19c1c6d513c9c80e3 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 16:49:45 +0300 Subject: [PATCH 0147/1032] Checkstyle: line length fix + other. --- .../dockerjava/api/command/AuthCmd.java | 3 +- .../checkstyle/checkstyle-config.xml | 44 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java index 8402ee533..75e5801ff 100644 --- a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java @@ -21,7 +21,8 @@ public interface AuthCmd extends SyncDockerCmd { /** * @return The status. Based on it's value you may mean you need to authorise your account, e.g.: - * "Account created. Please see the documentation of the registry http://localhost:5000/v1/ for instructions how to activate it." + * "Account created. Please see the documentation of the registry http://localhost:5000/v1/ + * for instructions how to activate it." * @throws UnauthorizedException * If you're not authorised (e.g. bad password). */ diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index c31d642ef..74a724eba 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -64,10 +64,52 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c76a187bee6bc9d3d3b322914356b8aa13007f0c Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 17:07:14 +0300 Subject: [PATCH 0148/1032] Checkstyle: whitespace checks. --- .../java/com/github/dockerjava/api/model/Ports.java | 2 +- .../github/dockerjava/core/DockerClientConfig.java | 2 +- .../github/dockerjava/core/KeystoreSSLConfig.java | 2 +- .../dockerjava/core/dockerfile/Dockerfile.java | 2 +- .../dockerjava/core/util/CertificateUtils.java | 2 +- src/test/resources/checkstyle/checkstyle-config.xml | 13 ++++++++----- 6 files changed, 13 insertions(+), 10 deletions(-) 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 780e5911c..6132e4647 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -70,7 +70,7 @@ public void bind(ExposedPort exposedPort, Binding binding) { if (binding == null) { ports.put(exposedPort, null); } else { - ports.put(exposedPort, new Binding[] { binding }); + ports.put(exposedPort, new Binding[]{binding}); } } } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 0a1868922..8c363321c 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -178,7 +178,7 @@ private static Properties overrideDockerPropertiesWithSystemProperties(Propertie Properties overriddenProperties = new Properties(); overriddenProperties.putAll(p); - for (String key : new String[] { DOCKER_IO_URL_PROPERTY, DOCKER_IO_VERSION_PROPERTY, + for (String key : new String[]{DOCKER_IO_URL_PROPERTY, DOCKER_IO_VERSION_PROPERTY, DOCKER_IO_USERNAME_PROPERTY, DOCKER_IO_PASSWORD_PROPERTY, DOCKER_IO_EMAIL_PROPERTY, DOCKER_IO_SERVER_ADDRESS_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, }) { diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index 5e62f4d78..a552b3775 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -87,7 +87,7 @@ public SSLContext getSSLContext() throws KeyManagementException, UnrecoverableKe final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory .getDefaultAlgorithm()); keyManagerFactory.init(keystore, keystorePassword.toCharArray()); - context.init(keyManagerFactory.getKeyManagers(), new TrustManager[] { new X509TrustManager() { + context.init(keyManagerFactory.getKeyManagers(), new TrustManager[]{new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; 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 077aff4bf..d7173d4d8 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -147,7 +147,7 @@ public int read() throws IOException { } @Override - public int read(byte [] buff, int offset, int len) throws IOException { + public int read(byte[] buff, int offset, int len) throws IOException { return tarInputStream.read(buff, offset, len); } 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 19f142593..65e6544f1 100644 --- a/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java +++ b/src/main/java/com/github/dockerjava/core/util/CertificateUtils.java @@ -31,7 +31,7 @@ private CertificateUtils() { } public static boolean verifyCertificatesExist(String dockerCertPath) { - String[] files = { "ca.pem", "cert.pem", "key.pem" }; + String[] files = {"ca.pem", "cert.pem", "key.pem"}; for (String file : files) { File path = new File(dockerCertPath, file); return path.exists(); diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index 74a724eba..1f9e606eb 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -98,17 +98,20 @@ - + + - - - + + + + - + + From 01f82d2c2c4ff93a7c5d0fcf22750f615f7e46eb Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 18:36:39 +0300 Subject: [PATCH 0149/1032] Checkstyle: redundant lines. Disabled for now. --- .../api/command/AsyncDockerCmd.java | 2 +- .../api/command/AttachContainerCmd.java | 30 +++++++++---------- .../checkstyle/checkstyle-config.xml | 4 +++ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java index 221d3d165..3218a8419 100644 --- a/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java @@ -13,6 +13,6 @@ */ public interface AsyncDockerCmd, A_RES_T> extends DockerCmd { - public > T exec(T resultCallback); + > T exec(T resultCallback); } diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java index 6326fa13b..84f063d7e 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -26,46 +26,46 @@ public interface AttachContainerCmd extends AsyncDockerCmd { @CheckForNull - public String getContainerId(); + String getContainerId(); @CheckForNull - public Boolean hasLogsEnabled(); + Boolean hasLogsEnabled(); @CheckForNull - public Boolean hasFollowStreamEnabled(); + Boolean hasFollowStreamEnabled(); @CheckForNull - public Boolean hasTimestampsEnabled(); + Boolean hasTimestampsEnabled(); @CheckForNull - public Boolean hasStdoutEnabled(); + Boolean hasStdoutEnabled(); @CheckForNull - public Boolean hasStderrEnabled(); + Boolean hasStderrEnabled(); @CheckForNull - public InputStream getStdin(); + InputStream getStdin(); - public AttachContainerCmd withContainerId(@Nonnull String containerId); + AttachContainerCmd withContainerId(@Nonnull String containerId); /** * Following the stream means the resulting {@link InputStream} returned by {@link #exec()} reads infinitely. So a * {@link InputStream#read()} MAY BLOCK FOREVER as long as no data is streamed from the docker host to * {@link DockerClient}! */ - public AttachContainerCmd withFollowStream(Boolean followStream); + AttachContainerCmd withFollowStream(Boolean followStream); - public AttachContainerCmd withTimestamps(Boolean timestamps); + AttachContainerCmd withTimestamps(Boolean timestamps); - public AttachContainerCmd withStdOut(Boolean stdout); + AttachContainerCmd withStdOut(Boolean stdout); - public AttachContainerCmd withStdErr(Boolean stderr); + AttachContainerCmd withStdErr(Boolean stderr); - public AttachContainerCmd withStdIn(InputStream stdin); + AttachContainerCmd withStdIn(InputStream stdin); - public AttachContainerCmd withLogs(Boolean logs); + AttachContainerCmd withLogs(Boolean logs); - public static interface Exec extends DockerCmdAsyncExec { + interface Exec extends DockerCmdAsyncExec { } } diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index 1f9e606eb..0a0969513 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -113,6 +113,10 @@ + + + + From a2c6773a037fd86ae8bb5ad0f5cd5bce381d597b Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 18:37:12 +0300 Subject: [PATCH 0150/1032] Checkstyle: fixed ModifierOrder. ModifierOrder: 'static' modifier out of order with the JLS suggestions. --- .../github/dockerjava/core/async/ResultCallbackTemplate.java | 2 +- .../java/com/github/dockerjava/core/command/AbstrDockerCmd.java | 2 +- .../dockerjava/core/command/AttachContainerResultCallback.java | 2 +- .../dockerjava/core/command/BuildImageResultCallback.java | 2 +- .../github/dockerjava/core/command/EventsResultCallback.java | 2 +- .../github/dockerjava/core/command/ExecStartResultCallback.java | 2 +- .../dockerjava/core/command/LogContainerResultCallback.java | 2 +- .../github/dockerjava/core/command/PullImageResultCallback.java | 2 +- .../github/dockerjava/core/command/PushImageResultCallback.java | 2 +- .../dockerjava/core/command/WaitContainerResultCallback.java | 2 +- .../com/github/dockerjava/jaxrs/connector/ApacheConnector.java | 2 +- src/test/resources/checkstyle/checkstyle-config.xml | 2 ++ 12 files changed, 13 insertions(+), 11 deletions(-) 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 5e63f2b5f..f87c0e525 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -25,7 +25,7 @@ public abstract class ResultCallbackTemplate, A_RES_T> implements ResultCallback { - private final static Logger LOGGER = LoggerFactory.getLogger(ResultCallbackTemplate.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ResultCallbackTemplate.class); private final CountDownLatch started = new CountDownLatch(1); diff --git a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 0c7877503..9e1e775c5 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -19,7 +19,7 @@ public abstract class AbstrDockerCmd, RES_T> implements SyncDockerCmd { - private final static Logger LOGGER = LoggerFactory.getLogger(AbstrDockerCmd.class); + private static final Logger LOGGER = LoggerFactory.getLogger(AbstrDockerCmd.class); protected DockerCmdSyncExec execution; diff --git a/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java index f16b20301..bddddfd4f 100644 --- a/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java @@ -16,7 +16,7 @@ */ public class AttachContainerResultCallback extends ResultCallbackTemplate { - private final static Logger LOGGER = LoggerFactory.getLogger(AttachContainerResultCallback.class); + private static final Logger LOGGER = LoggerFactory.getLogger(AttachContainerResultCallback.class); @Override public void onNext(Frame item) { 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 06c6b1e51..1ca276434 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java @@ -21,7 +21,7 @@ */ public class BuildImageResultCallback extends ResultCallbackTemplate { - private final static Logger LOGGER = LoggerFactory.getLogger(BuildImageResultCallback.class); + private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageResultCallback.class); @CheckForNull private BuildResponseItem latestItem = null; diff --git a/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java b/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java index c731b863e..cd6205f6d 100644 --- a/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java @@ -16,7 +16,7 @@ */ public class EventsResultCallback extends ResultCallbackTemplate { - private final static Logger LOGGER = LoggerFactory.getLogger(EventsResultCallback.class); + private static final Logger LOGGER = LoggerFactory.getLogger(EventsResultCallback.class); @Override public void onNext(Event item) { diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java index 5f73b65eb..62e492db9 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java @@ -16,7 +16,7 @@ */ public class ExecStartResultCallback extends ResultCallbackTemplate { - private final static Logger LOGGER = LoggerFactory.getLogger(ExecStartResultCallback.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartResultCallback.class); private OutputStream stdout, stderr; diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java index b7fc81cb2..677e5fb64 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java @@ -16,7 +16,7 @@ */ public class LogContainerResultCallback extends ResultCallbackTemplate { - private final static Logger LOGGER = LoggerFactory.getLogger(LogContainerResultCallback.class); + private static final Logger LOGGER = LoggerFactory.getLogger(LogContainerResultCallback.class); @Override public void onNext(Frame item) { diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java index 27be12215..ce274dbe8 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java @@ -19,7 +19,7 @@ */ public class PullImageResultCallback extends ResultCallbackTemplate { - private final static Logger LOGGER = LoggerFactory.getLogger(PullImageResultCallback.class); + private static final Logger LOGGER = LoggerFactory.getLogger(PullImageResultCallback.class); @CheckForNull private PullResponseItem latestItem = null; diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java index 65ec93c88..55dfb5650 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java @@ -19,7 +19,7 @@ */ public class PushImageResultCallback extends ResultCallbackTemplate { - private final static Logger LOGGER = LoggerFactory.getLogger(PushImageResultCallback.class); + private static final Logger LOGGER = LoggerFactory.getLogger(PushImageResultCallback.class); @CheckForNull private PushResponseItem latestItem = null; diff --git a/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java index 5416d124c..feb7916e7 100644 --- a/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/WaitContainerResultCallback.java @@ -21,7 +21,7 @@ */ public class WaitContainerResultCallback extends ResultCallbackTemplate { - private final static Logger LOGGER = LoggerFactory.getLogger(WaitContainerResultCallback.class); + private static final Logger LOGGER = LoggerFactory.getLogger(WaitContainerResultCallback.class); @CheckForNull private WaitResponse waitResponse = null; diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java index cfbabb513..7994f3261 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java @@ -182,7 +182,7 @@ @SuppressWarnings("deprecation") class ApacheConnector implements Connector { - private final static Logger LOGGER = Logger.getLogger(ApacheConnector.class.getName()); + private static final Logger LOGGER = Logger.getLogger(ApacheConnector.class.getName()); private static final VersionInfo VERSION_INFO; diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index 0a0969513..ee08b57c2 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -114,6 +114,8 @@ + + From 1fc561bf1245c3464deb4ad44de619b781527d0d Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 19:05:58 +0300 Subject: [PATCH 0151/1032] Checkstyle: fixed braces. --- .../github/dockerjava/api/model/AuthConfig.java | 2 ++ .../java/com/github/dockerjava/api/model/Bind.java | 3 ++- .../com/github/dockerjava/api/model/Device.java | 3 ++- .../github/dockerjava/api/model/ExposedPort.java | 3 ++- .../com/github/dockerjava/api/model/Frame.java | 2 ++ .../github/dockerjava/api/model/Identifier.java | 13 ++++++++----- .../java/com/github/dockerjava/api/model/Link.java | 3 ++- .../com/github/dockerjava/api/model/LogConfig.java | 3 ++- .../github/dockerjava/api/model/PortBinding.java | 3 ++- .../com/github/dockerjava/api/model/Ports.java | 3 ++- .../github/dockerjava/api/model/Repository.java | 3 ++- .../github/dockerjava/api/model/RestartPolicy.java | 11 ++++++++--- .../com/github/dockerjava/api/model/Ulimit.java | 2 ++ .../com/github/dockerjava/api/model/Volume.java | 3 ++- .../com/github/dockerjava/api/model/VolumeRW.java | 3 ++- .../github/dockerjava/api/model/VolumesFrom.java | 3 ++- .../com/github/dockerjava/core/AuthConfigFile.java | 2 ++ .../github/dockerjava/core/DockerClientConfig.java | 5 ++++- .../github/dockerjava/core/DockerClientImpl.java | 9 ++++++--- .../github/dockerjava/core/KeystoreSSLConfig.java | 3 ++- .../github/dockerjava/core/RemoteApiVersion.java | 2 ++ .../core/async/ResultCallbackTemplate.java | 9 +++++---- .../dockerjava/core/command/BuildImageCmdImpl.java | 9 ++++++--- .../dockerjava/core/dockerfile/Dockerfile.java | 9 ++++++--- .../dockerjava/core/util/FiltersBuilder.java | 2 ++ .../dockerjava/jaxrs/AttachContainerCmdExec.java | 3 ++- .../dockerjava/jaxrs/DockerCmdExecFactoryImpl.java | 12 ++++++++---- .../dockerjava/jaxrs/ListVolumesCmdExec.java | 3 ++- .../dockerjava/jaxrs/TopContainerCmdExec.java | 3 ++- .../jaxrs/async/AbstractCallbackNotifier.java | 3 ++- .../dockerjava/netty/exec/ListNetworksCmdExec.java | 3 ++- .../dockerjava/netty/exec/ListVolumesCmdExec.java | 3 ++- .../dockerjava/netty/exec/TopContainerCmdExec.java | 3 ++- .../netty/handler/FramedResponseStreamHandler.java | 3 ++- .../resources/checkstyle/checkstyle-config.xml | 14 ++++++++++++++ 35 files changed, 117 insertions(+), 46 deletions(-) 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 0e994daf3..0bd6cac8c 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -79,6 +79,7 @@ public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); } + //CHECKSTYLE:OFF @Override public int hashCode() { final int prime = 31; @@ -127,4 +128,5 @@ public boolean equals(Object obj) { return false; return true; } + //CHECKSTYLE:ON } 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 f7f6954f5..aa4863923 100644 --- a/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -72,8 +72,9 @@ public boolean equals(Object obj) { Bind other = (Bind) obj; return new EqualsBuilder().append(path, other.getPath()).append(volume, other.getVolume()) .append(accessMode, other.getAccessMode()).isEquals(); - } else + } else { return super.equals(obj); + } } @Override 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 21aef589a..9240239b1 100644 --- a/src/main/java/com/github/dockerjava/api/model/Device.java +++ b/src/main/java/com/github/dockerjava/api/model/Device.java @@ -52,8 +52,9 @@ public boolean equals(Object obj) { return new EqualsBuilder().append(cGroupPermissions, other.getcGroupPermissions()) .append(pathInContainer, other.getPathInContainer()).append(pathOnHost, other.getPathOnHost()) .isEquals(); - } else + } else { return super.equals(obj); + } } @Override 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 4dbdbe19b..43ee92291 100644 --- a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java +++ b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java @@ -151,8 +151,9 @@ public boolean equals(Object obj) { if (obj instanceof ExposedPort) { ExposedPort other = (ExposedPort) obj; return new EqualsBuilder().append(protocol, other.getProtocol()).append(port, other.getPort()).isEquals(); - } else + } else { return super.equals(obj); + } } @Override 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 1be92f9b6..e398ec255 100644 --- a/src/main/java/com/github/dockerjava/api/model/Frame.java +++ b/src/main/java/com/github/dockerjava/api/model/Frame.java @@ -28,6 +28,7 @@ public String toString() { return String.format("%s: %s", streamType, new String(payload).trim()); } + //CHECKSTYLE:OFF @Override public boolean equals(Object o) { if (this == o) @@ -47,4 +48,5 @@ public int hashCode() { result = 31 * result + Arrays.hashCode(payload); return result; } + //CHECKSTYLE:ON } 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 96daab11a..ed5100e25 100644 --- a/src/main/java/com/github/dockerjava/api/model/Identifier.java +++ b/src/main/java/com/github/dockerjava/api/model/Identifier.java @@ -14,10 +14,11 @@ public class Identifier { public Identifier(Repository repository, String tag) { this.repository = repository; - if (tag == null) + if (tag == null) { this.tag = Optional.absent(); - else + } else { this.tag = Optional.of(tag); + } } /** @@ -33,15 +34,17 @@ public static Identifier fromCompoundString(String identifier) { String[] parts = identifier.split("/"); if (parts.length != 2) { String[] rhs = identifier.split(":"); - if (rhs.length != 2) + if (rhs.length != 2) { return new Identifier(new Repository(identifier), null); - else + } else { return new Identifier(new Repository(rhs[0]), rhs[1]); + } } String[] rhs = parts[1].split(":"); - if (rhs.length != 2) + if (rhs.length != 2) { return new Identifier(new Repository(identifier), null); + } return new Identifier(new Repository(parts[0] + "/" + rhs[0]), rhs[1]); } 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 43f9de65b..f647438a9 100644 --- a/src/main/java/com/github/dockerjava/api/model/Link.java +++ b/src/main/java/com/github/dockerjava/api/model/Link.java @@ -74,8 +74,9 @@ public boolean equals(final Object obj) { if (obj instanceof Link) { final Link other = (Link) obj; return new EqualsBuilder().append(name, other.getName()).append(alias, other.getAlias()).isEquals(); - } else + } else { return super.equals(obj); + } } @Override 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 37bb17a8e..669bbc554 100644 --- a/src/main/java/com/github/dockerjava/api/model/LogConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/LogConfig.java @@ -98,8 +98,9 @@ public LoggingType deserialize(JsonParser jsonParser, DeserializationContext des JsonNode node = oc.readTree(jsonParser); for (LoggingType loggingType : values()) { - if (loggingType.getType().equals(node.asText())) + if (loggingType.getType().equals(node.asText())) { return loggingType; + } } throw new IllegalArgumentException("No enum constant " + LoggingType.class + "." + node.asText()); 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 99e04f1bc..81f94ca06 100644 --- a/src/main/java/com/github/dockerjava/api/model/PortBinding.java +++ b/src/main/java/com/github/dockerjava/api/model/PortBinding.java @@ -64,8 +64,9 @@ public boolean equals(Object obj) { PortBinding other = (PortBinding) obj; return new EqualsBuilder().append(binding, other.getBinding()).append(exposedPort, other.getExposedPort()) .isEquals(); - } else + } else { return super.equals(obj); + } } @Override 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 6132e4647..43ad92585 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -249,8 +249,9 @@ public boolean equals(Object obj) { Binding other = (Binding) obj; return new EqualsBuilder().append(hostIp, other.getHostIp()).append(hostPort, other.getHostPort()) .isEquals(); - } else + } else { return super.equals(obj); + } } } 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 3055c8980..1e814a1b5 100644 --- a/src/main/java/com/github/dockerjava/api/model/Repository.java +++ b/src/main/java/com/github/dockerjava/api/model/Repository.java @@ -37,8 +37,9 @@ public String toString() { } public String getPath() { - if (!name.contains("/")) + if (!name.contains("/")) { return name; + } return name.substring(name.indexOf("/") + 1); } 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 34f8e7e57..d5c8f6e8e 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -89,10 +89,14 @@ public static RestartPolicy parse(String serialized) throws IllegalArgumentExcep try { String[] parts = serialized.split(":"); String name = parts[0]; - if ("no".equals(name)) + if ("no".equals(name)) { return noRestart(); - if ("always".equals(name)) + } + + if ("always".equals(name)) { return alwaysRestart(); + } + if ("on-failure".equals(name)) { int count = 0; if (parts.length == 2) { @@ -124,8 +128,9 @@ public boolean equals(Object obj) { RestartPolicy other = (RestartPolicy) obj; return new EqualsBuilder().append(maximumRetryCount, other.getMaximumRetryCount()) .append(name, other.getName()).isEquals(); - } else + } else { return super.equals(obj); + } } @Override 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 209eb22fe..51602e043 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ulimit.java +++ b/src/main/java/com/github/dockerjava/api/model/Ulimit.java @@ -45,6 +45,7 @@ public Integer getHard() { return hard; } + //CHECKSTYLE:OFF @Override public boolean equals(Object obj) { if (obj instanceof Ulimit) { @@ -60,4 +61,5 @@ public boolean equals(Object obj) { public int hashCode() { return new HashCodeBuilder().append(name).append(soft).append(hard).toHashCode(); } + //CHECKSTYLE:ON } 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 93f7e4e4f..655a8dbfc 100644 --- a/src/main/java/com/github/dockerjava/api/model/Volume.java +++ b/src/main/java/com/github/dockerjava/api/model/Volume.java @@ -30,8 +30,9 @@ public boolean equals(Object obj) { if (obj instanceof Volume) { Volume other = (Volume) obj; return new EqualsBuilder().append(path, other.getPath()).isEquals(); - } else + } else { return super.equals(obj); + } } @Override 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 bdb347bee..3709d1b0c 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java @@ -69,8 +69,9 @@ public boolean equals(Object obj) { VolumeRW other = (VolumeRW) obj; return new EqualsBuilder().append(getVolume(), other.getVolume()).append(accessMode, other.getAccessMode()) .isEquals(); - } else + } else { return super.equals(obj); + } } @Override 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 01f80aba9..78585ef48 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java @@ -77,8 +77,9 @@ public boolean equals(Object obj) { VolumesFrom other = (VolumesFrom) obj; return new EqualsBuilder().append(container, other.getContainer()) .append(accessMode, other.getAccessMode()).isEquals(); - } else + } else { return super.equals(obj); + } } @Override diff --git a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java index 78fd453ab..7315a05af 100644 --- a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java +++ b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java @@ -63,6 +63,7 @@ public AuthConfigurations getAuthConfigurations() { return authConfigurations; } + //CHECKSTYLE:OFF @Override public int hashCode() { final int prime = 31; @@ -87,6 +88,7 @@ public boolean equals(Object obj) { return false; return true; } + //CHECKSTYLE:ON @Override public String toString() { diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 8c363321c..35f54c736 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -272,8 +272,9 @@ public AuthConfig effectiveAuthConfig(String imageName) { AuthConfig otherAuthConfig = getAuthConfig(); - if (otherAuthConfig != null) + if (otherAuthConfig != null) { authConfig = otherAuthConfig; + } return authConfig; } @@ -294,6 +295,7 @@ public AuthConfigurations getAuthConfigurations() { return new AuthConfigurations(); } + //CHECKSTYLE:OFF @Override public boolean equals(Object o) { if (this == o) @@ -335,6 +337,7 @@ public int hashCode() { result = 31 * result + (sslConfig != null ? sslConfig.hashCode() : 0); return result; } + //CHECKSTYLE:ON @Override public String toString() { diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index ede135613..ca842b383 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -214,20 +214,23 @@ public PushImageCmd pushImageCmd(String name) { PushImageCmd cmd = new PushImageCmdImpl(getDockerCmdExecFactory().createPushImageCmdExec(), name); AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(name); - if (cfg != null) + if (cfg != null) { cmd.withAuthConfig(cfg); + } return cmd; } @Override public PushImageCmd pushImageCmd(Identifier identifier) { PushImageCmd cmd = pushImageCmd(identifier.repository.name); - if (identifier.tag.isPresent()) + if (identifier.tag.isPresent()) { cmd.withTag(identifier.tag.get()); + } AuthConfig cfg = dockerClientConfig.effectiveAuthConfig(identifier.repository.name); - if (cfg != null) + if (cfg != null) { cmd.withAuthConfig(cfg); + } return cmd; } diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index a552b3775..bdc2e6e89 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -81,8 +81,9 @@ public SSLContext getSSLContext() throws KeyManagementException, UnrecoverableKe String httpProtocols = System.getProperty("https.protocols"); System.setProperty("https.protocols", "TLSv1"); - if (httpProtocols != null) + if (httpProtocols != null) { System.setProperty("https.protocols", httpProtocols); + } final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory .getDefaultAlgorithm()); diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index 63269ce55..80f9406b7 100644 --- a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -127,6 +127,7 @@ public boolean isGreaterOrEqual(final RemoteApiVersion other) { return false; } + //CHECKSTYLE:OFF @Override public boolean equals(final Object o) { if (this == o) @@ -136,6 +137,7 @@ public boolean equals(final Object o) { final RemoteApiVersion that = (RemoteApiVersion) o; return Objects.equal(major, that.major) && Objects.equal(minor, that.minor); } + //CHECKSTYLE:ON @Override public int hashCode() { 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 f87c0e525..0e146c1e9 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -47,11 +47,11 @@ public void onStart(Closeable stream) { @Override public void onError(Throwable throwable) { - if (closed) - return; + if (closed) return; - if (this.firstError == null) + if (this.firstError == null) { this.firstError = throwable; + } try { LOGGER.error("Error during callback", throwable); @@ -76,8 +76,9 @@ public void onComplete() { @Override public void close() throws IOException { closed = true; - if (stream != null) + if (stream != null) { stream.close(); + } completed.countDown(); } 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 acf4fa10a..ef57e84a4 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -248,13 +248,16 @@ public BuildImageCmd withBaseDirectory(File baseDirectory) { @Override public BuildImageCmdImpl withDockerfile(File dockerfile) { checkNotNull(dockerfile); - if (!dockerfile.exists()) + if (!dockerfile.exists()) { throw new IllegalArgumentException("Dockerfile does not exist"); - if (!dockerfile.isFile()) + } + if (!dockerfile.isFile()) { throw new IllegalArgumentException("Not a directory"); + } - if (baseDirectory == null) + if (baseDirectory == null) { withBaseDirectory(dockerfile.getParentFile()); + } this.dockerFile = dockerfile; 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 d7173d4d8..9a94d6b1d 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -221,21 +221,24 @@ private String effectiveMatchingIgnorePattern(File file) { List matchingPattern = matchingIgnorePatterns(relativeFilename); - if (matchingPattern.isEmpty()) + if (matchingPattern.isEmpty()) { return null; + } String lastMatchingPattern = matchingPattern.get(matchingPattern.size() - 1); int lastMatchingPatternIndex = ignores.lastIndexOf(lastMatchingPattern); - if (lastMatchingPatternIndex == ignores.size() - 1) + if (lastMatchingPatternIndex == ignores.size() - 1) { return lastMatchingPattern; + } List remainingIgnorePattern = ignores.subList(lastMatchingPatternIndex + 1, ignores.size()); for (String ignorePattern : remainingIgnorePattern) { - if (ignorePattern.equals("!" + relativeFilename)) + if (ignorePattern.equals("!" + relativeFilename)) { return null; + } } return lastMatchingPattern; diff --git a/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java index d6cd0d9f7..7ad380481 100644 --- a/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java +++ b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java @@ -81,6 +81,7 @@ private static List labelsMapToList(Map labels) { return result; } + //CHECKSTYLE:OFF @Override public boolean equals(Object o) { if (this == o) @@ -93,6 +94,7 @@ public boolean equals(Object o) { return filters.equals(filters1.filters); } + //CHECKSTYLE:ON @Override public int hashCode() { diff --git a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java index b3670a8b9..c21c305df 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AttachContainerCmdExec.java @@ -26,9 +26,10 @@ public AttachContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerC protected AbstractCallbackNotifier callbackNotifier(AttachContainerCmd command, ResultCallback resultCallback) { - if (command.getStdin() != null) + if (command.getStdin() != null) { throw new UnsupportedOperationException( "Passing stdin to the container is currently not supported. Try experimental netty engine!"); + } WebTarget webTarget = getBaseResource().path("/containers/{id}/attach").resolveTemplate("id", command.getContainerId()); diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index bbd71ba38..79f60ec39 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -134,15 +134,17 @@ public void init(DockerClientConfig dockerClientConfig) { if (clientResponseFilters != null) { for (ClientResponseFilter clientResponseFilter : clientResponseFilters) { - if (clientResponseFilter != null) + if (clientResponseFilter != null) { clientConfig.register(clientResponseFilter); + } } } if (clientRequestFilters != null) { for (ClientRequestFilter clientRequestFilter : clientRequestFilters) { - if (clientRequestFilter != null) + if (clientRequestFilter != null) { clientConfig.register(clientRequestFilter); + } } } @@ -171,10 +173,12 @@ public void init(DockerClientConfig dockerClientConfig) { PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry( originalUri, sslContext)); - if (maxTotalConnections != null) + if (maxTotalConnections != null) { connManager.setMaxTotal(maxTotalConnections); - if (maxPerRouteConnections != null) + } + if (maxPerRouteConnections != null) { connManager.setDefaultMaxPerRoute(maxPerRouteConnections); + } clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java index dd877a89a..4f2165b93 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ListVolumesCmdExec.java @@ -25,8 +25,9 @@ public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClien protected ListVolumesResponse execute(ListVolumesCmd command) { WebTarget webTarget = getBaseResource().path("/volumes"); - if (command.getFilters() != null && !command.getFilters().isEmpty()) + if (command.getFilters() != null && !command.getFilters().isEmpty()) { webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); + } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java index 48b6641a1..22841d8bf 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/TopContainerCmdExec.java @@ -25,8 +25,9 @@ protected TopContainerResponse execute(TopContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/top").resolveTemplate("id", command.getContainerId()); - if (!StringUtils.isEmpty(command.getPsArgs())) + if (!StringUtils.isEmpty(command.getPsArgs())) { webResource = webResource.queryParam("ps_args", command.getPsArgs()); + } LOGGER.trace("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(TopContainerResponse.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java index e94ad1f2c..aac5a94d6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java +++ b/src/main/java/com/github/dockerjava/jaxrs/async/AbstractCallbackNotifier.java @@ -58,8 +58,9 @@ public Void call() throws Exception { try { InputStream inputStream = new WrappedResponseInputStream(response); - if (resultCallback != null) + if (resultCallback != null) { responseStreamProcessor.processResponseStream(inputStream, resultCallback); + } return null; } catch (Exception e) { diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java index e0c945d6d..11e5fe238 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListNetworksCmdExec.java @@ -28,8 +28,9 @@ public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClie protected List execute(ListNetworksCmd command) { WebTarget webTarget = getBaseResource().path("/networks"); - if (command.getFilters() != null && !command.getFilters().isEmpty()) + if (command.getFilters() != null && !command.getFilters().isEmpty()) { webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); + } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java index 98d073ff5..1db5684cb 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ListVolumesCmdExec.java @@ -26,8 +26,9 @@ public ListVolumesCmdExec(WebTarget baseResource, DockerClientConfig dockerClien protected ListVolumesResponse execute(ListVolumesCmd command) { WebTarget webTarget = getBaseResource().path("/volumes"); - if (command.getFilters() != null && !command.getFilters().isEmpty()) + if (command.getFilters() != null && !command.getFilters().isEmpty()) { webTarget = webTarget.queryParam("filters", urlPathSegmentEscaper().escape(FiltersEncoder.jsonEncode(command.getFilters()))); + } LOGGER.trace("GET: {}", webTarget); diff --git a/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java index 07ec12b03..c4ae9249d 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/TopContainerCmdExec.java @@ -25,8 +25,9 @@ protected TopContainerResponse execute(TopContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/top").resolveTemplate("id", command.getContainerId()); - if (!StringUtils.isEmpty(command.getPsArgs())) + if (!StringUtils.isEmpty(command.getPsArgs())) { webResource = webResource.queryParam("ps_args", command.getPsArgs()); + } LOGGER.trace("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference() { diff --git a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java index 945833cdd..b58292b51 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java @@ -89,8 +89,9 @@ private Frame decode() { if (streamType.equals(StreamType.RAW)) { - if (payloadCnt == 0) + if (payloadCnt == 0) { payload = new byte[rawBuffer.readableBytes()]; + } int count = read(payload, payloadCnt, rawBuffer.readableBytes()); diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index ee08b57c2..a97064845 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -119,6 +119,20 @@ + + + + + + + + + + + + + + From 552b05dbafbabab2eeac7c21f596779f8d2e7367 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 30 Jan 2016 22:35:49 +0100 Subject: [PATCH 0152/1032] Refactoring of DockerClientConfig to better match with docker CLI configuration options --- README.md | 62 ++-- .../api/command/DockerCmdExecFactory.java | 4 + .../dockerjava/core/DockerClientConfig.java | 317 +++++++++--------- .../dockerjava/core/DockerClientImpl.java | 14 +- .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 2 +- .../jaxrs/DockerCmdExecFactoryImpl.java | 83 +++-- .../netty/DockerCmdExecFactoryImpl.java | 31 +- .../netty/exec/AbstrDockerCmdExec.java | 2 +- src/main/resources/docker-java.properties | 17 + src/main/resources/docker.io.properties | 5 - .../client/AbstractDockerClientTest.java | 6 +- .../core/DockerClientConfigTest.java | 195 +++++------ .../dockerjava/core/DockerClientImplTest.java | 7 +- .../core/TestDockerCmdExecFactory.java | 7 + .../someHomeDir/.docker/certs/dummy.txt | 0 .../resources/someHomeDir/.docker/config.json | 9 + 16 files changed, 414 insertions(+), 347 deletions(-) create mode 100644 src/main/resources/docker-java.properties delete mode 100644 src/main/resources/docker.io.properties create mode 100644 src/test/resources/someHomeDir/.docker/certs/dummy.txt create mode 100644 src/test/resources/someHomeDir/.docker/config.json diff --git a/README.md b/README.md index 26ec653ac..9175135ae 100644 --- a/README.md +++ b/README.md @@ -85,13 +85,15 @@ For code examples, please look at the [Wiki](https://github.com/docker-java/dock There are a couple of configuration items, all of which have sensible defaults: -* `url` The Docker URL, e.g. `https://localhost:2376` or `unix:///var/run/docker.sock` -* `version` The API version, e.g. `1.16`. -* `username` Your registry username (required to push containers). -* `password` Your registry password. -* `email` Your registry email. -* `serverAddress` Your registry's address. -* `dockerCertPath` Path to the docker certs. +* `DOCKER_HOST` The Docker Host URL, e.g. `tcp://localhost:2376` or `unix:///var/run/docker.sock` +* `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`. +* `registry.url` Your registry's address. +* `registry.username` Your registry username (required to push containers). +* `registry.password` Your registry password. +* `registry.email` Your registry email. There are three ways to configure, in descending order of precedence: @@ -99,42 +101,46 @@ There are three ways to configure, in descending order of precedence: In your application, e.g. DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder() - .withVersion("1.16") - .withUri("https://my-docker-host.tld:2376") - .withUsername("dockeruser") - .withPassword("ilovedocker") - .withEmail("dockeruser@github.com") - .withServerAddress("https://index.docker.io/v1/") - .withDockerCertPath("/home/user/.docker") + .withDockerHost("tcp://my-docker-host.tld:2376") + .withDockerTlsVerify("1") + .withDockerCertPath("/home/user/.docker/certs") + .withDockerConfig("/home/user/.docker") + .withApiVersion("1.21") + .withRegistryUrl("https://index.docker.io/v1/") + .withRegistryUsername("dockeruser") + .withRegistryPassword("ilovedocker") + .withRegistryEmail("dockeruser@github.com") .build(); DockerClient docker = DockerClientBuilder.getInstance(config).build(); #### Properties - docker.io.url=https://localhost:2376 - docker.io.version=1.16 - docker.io.username=dockeruser - docker.io.password=ilovedocker - docker.io.email=dockeruser@github.com - docker.io.serverAddress=https://index.docker.io/v1/ - docker.io.dockerCertPath=/home/user/.docker - + DOCKER_HOST=tcp://localhost:2376 + DOCKER_TLS_VERIFY=1 + DOCKER_CERT_PATH=/home/user/.docker/certs + DOCKER_CONFIG=/home/user/.docker + api.version=1.21 + registry.url=https://index.docker.io/v1/ + registry.username=dockeruser + registry.password=ilovedocker + registry.email=dockeruser@github.com ##### System Properties: - java -Ddocker.io.username=dockeruser pkg.Main + java -Dregistry.username=dockeruser pkg.Main ##### System Environment - export DOCKER_URL=http://localhost:2376 - -Note: we also auto-detect defaults. If you use `DOCKER_HOST` we use that value, and if `DOCKER_CERT_PATH` or `DOCKER_TLS_VERIFY=1` is set, we switch to SSL. + export DOCKER_URL=tcp://localhost:2376 + export DOCKER_TLS_VERIFY=1 + export DOCKER_CERT_PATH=/home/user/.docker/certs + export DOCKER_CONFIG=/home/user/.docker ##### File System -In `$HOME/.docker.io.properties` +In `$HOME/.docker-java.properties` ##### Class Path -In the class path at `/docker.io.properties` +In the class path at `/docker-java.properties` 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 fb1715e38..fc793558f 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -3,6 +3,8 @@ import java.io.Closeable; import java.io.IOException; +import javax.net.ssl.SSLContext; + import com.github.dockerjava.core.DockerClientConfig; public interface DockerCmdExecFactory extends Closeable { @@ -105,6 +107,8 @@ public interface DockerCmdExecFactory extends Closeable { public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec(); + public DockerCmdExecFactory withSSLContext(SSLContext sslContext); + @Override public void close() throws IOException; diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index fa5c77e6a..400f417ea 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -8,10 +8,17 @@ import java.io.InputStream; import java.io.Serializable; import java.net.URI; -import java.util.Collections; -import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Properties; +import java.util.Set; + +import org.apache.commons.lang.BooleanUtils; +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; @@ -19,74 +26,108 @@ 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 DockerClientConfig implements Serializable { private static final long serialVersionUID = -4307357472441531489L; - private static final String DOCKER_HOST_PROPERTY = "DOCKER_HOST"; + public static final String DOCKER_HOST = "DOCKER_HOST"; - private static final String DOCKER_CERT_PATH_PROPERTY = "DOCKER_CERT_PATH"; + public static final String DOCKER_TLS_VERIFY = "DOCKER_TLS_VERIFY"; - private static final String DOCKER_VERIFY_TLS_PROPERTY = "DOCKER_TLS_VERIFY"; + public static final String DOCKER_CONFIG = "DOCKER_CONFIG"; - private static final String DOCKER_IO_URL_PROPERTY = "docker.io.url"; + public static final String DOCKER_CERT_PATH = "DOCKER_CERT_PATH"; - private static final String DOCKER_IO_VERSION_PROPERTY = "docker.io.version"; + public static final String API_VERSION = "api.version"; - private static final String DOCKER_IO_USERNAME_PROPERTY = "docker.io.username"; + public static final String REGISTRY_USERNAME = "registry.username"; - private static final String DOCKER_IO_PASSWORD_PROPERTY = "docker.io.password"; + public static final String REGISTRY_PASSWORD = "registry.password"; - private static final String DOCKER_IO_EMAIL_PROPERTY = "docker.io.email"; + public static final String REGISTRY_EMAIL = "registry.email"; - private static final String DOCKER_IO_SERVER_ADDRESS_PROPERTY = "docker.io.serverAddress"; + public static final String REGISTRY_URL = "registry.url"; - private static final String DOCKER_IO_DOCKER_CERT_PATH_PROPERTY = "docker.io.dockerCertPath"; + private static final String DOCKER_JAVA_PROPERTIES = "docker-java.properties"; - private static final String DOCKER_IO_DOCKER_CFG_PATH_PROPERTY = "docker.io.dockerCfgPath"; + private static final String DOCKER_CFG = ".dockercfg"; + + private static final Set configKeys = new HashSet(); - /** - * A map from the environment name to the interval name. - */ - // Immutable ish - private static final Map ENV_NAME_TO_IO_NAME; static { - Map m = new HashMap(); - m.put("DOCKER_URL", DOCKER_IO_URL_PROPERTY); - m.put("DOCKER_VERSION", DOCKER_IO_VERSION_PROPERTY); - m.put("DOCKER_USERNAME", DOCKER_IO_USERNAME_PROPERTY); - m.put("DOCKER_PASSWORD", DOCKER_IO_PASSWORD_PROPERTY); - m.put("DOCKER_EMAIL", DOCKER_IO_EMAIL_PROPERTY); - m.put("DOCKER_SERVER_ADDRESS", DOCKER_IO_SERVER_ADDRESS_PROPERTY); - m.put(DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY); - m.put("DOCKER_CFG_PATH", DOCKER_IO_DOCKER_CFG_PATH_PROPERTY); - ENV_NAME_TO_IO_NAME = Collections.unmodifiableMap(m); + configKeys.add(DOCKER_HOST); + configKeys.add(DOCKER_TLS_VERIFY); + configKeys.add(DOCKER_CONFIG); + configKeys.add(DOCKER_CERT_PATH); + configKeys.add(API_VERSION); + configKeys.add(REGISTRY_USERNAME); + configKeys.add(REGISTRY_PASSWORD); + configKeys.add(REGISTRY_EMAIL); + configKeys.add(REGISTRY_URL); } - private static final String DOCKER_IO_PROPERTIES_PROPERTY = "docker.io.properties"; + private URI dockerHost; - private URI uri; + private final String registryUsername, registryPassword, registryEmail, registryUrl, dockerConfig, dockerCertPath; - private final String username, password, email, serverAddress, dockerCfgPath; + private boolean dockerTlsVerify; - private final RemoteApiVersion version; + private final RemoteApiVersion apiVersion; - private final SSLConfig sslConfig; + DockerClientConfig(URI dockerHost, String dockerConfig, String apiVersion, String registryUrl, + String registryUsername, String registryPassword, String registryEmail, String dockerCertPath, + boolean dockerTslVerify) { + this.dockerHost = checkDockerHostScheme(dockerHost); + this.dockerTlsVerify = dockerTslVerify; + this.dockerCertPath = checkDockerCertPath(dockerTslVerify, dockerCertPath); + this.dockerConfig = dockerConfig; + this.apiVersion = RemoteApiVersion.parseConfigWithDefault(apiVersion); + this.registryUsername = registryUsername; + this.registryPassword = registryPassword; + this.registryEmail = registryEmail; + this.registryUrl = registryUrl; + } - DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, - String dockerCfgPath, SSLConfig sslConfig) { - this.uri = uri; - this.version = RemoteApiVersion.parseConfigWithDefault(version); - this.username = username; - this.password = password; - this.email = email; - this.serverAddress = serverAddress; - this.dockerCfgPath = dockerCfgPath; - this.sslConfig = sslConfig; + 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 String checkDockerCertPath(boolean dockerTlsVerify, String dockerCertPath) { + if (dockerTlsVerify) { + if (StringUtils.isEmpty(dockerCertPath)) { + throw new DockerClientException( + "Enabled TLS verification (DOCKER_TLS_VERIFY=1) but certifate path (DOCKER_CERT_PATH) is not defined."); + } else { + File certPath = new File(dockerCertPath); + + if (!certPath.exists()) { + throw new DockerClientException( + "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."); + } + } + } else { + return dockerCertPath; + } } private static Properties loadIncludedDockerProperties(Properties systemProperties) { - try (InputStream is = DockerClientConfig.class.getResourceAsStream("/" + DOCKER_IO_PROPERTIES_PROPERTY)) { + try (InputStream is = DockerClientConfig.class.getResourceAsStream("/" + DOCKER_JAVA_PROPERTIES)) { Properties p = new Properties(); p.load(is); replaceProperties(p, systemProperties); @@ -125,7 +166,7 @@ private static Properties overrideDockerPropertiesWithSettingsFromUserHome(Prope overriddenProperties.putAll(p); final File usersDockerPropertiesFile = new File(systemProperties.getProperty("user.home"), "." - + DOCKER_IO_PROPERTIES_PROPERTY); + + DOCKER_JAVA_PROPERTIES); if (usersDockerPropertiesFile.isFile()) { try { final FileInputStream in = new FileInputStream(usersDockerPropertiesFile); @@ -146,27 +187,20 @@ private static Properties overrideDockerPropertiesWithEnv(Properties properties, overriddenProperties.putAll(properties); // special case which is a sensible default - if (env.containsKey(DOCKER_HOST_PROPERTY)) { - overriddenProperties.setProperty(DOCKER_IO_URL_PROPERTY, - env.get(DOCKER_HOST_PROPERTY).replace("tcp", protocol(env))); + if (env.containsKey(DOCKER_HOST)) { + overriddenProperties.setProperty(DOCKER_HOST, env.get(DOCKER_HOST)); } for (Map.Entry envEntry : env.entrySet()) { String envKey = envEntry.getKey(); - if (ENV_NAME_TO_IO_NAME.containsKey(envKey)) { - overriddenProperties.setProperty(ENV_NAME_TO_IO_NAME.get(envKey), envEntry.getValue()); + if (configKeys.contains(envKey)) { + overriddenProperties.setProperty(envKey, envEntry.getValue()); } } return overriddenProperties; } - private static String protocol(Map env) { - // if this is set, we assume we need SSL - return env.containsKey(DOCKER_CERT_PATH_PROPERTY) || "1".equals(env.get(DOCKER_VERIFY_TLS_PROPERTY)) ? "https" - : "http"; - } - /** * Creates a new Properties object containing values overridden from the System properties * @@ -178,10 +212,7 @@ private static Properties overrideDockerPropertiesWithSystemProperties(Propertie Properties overriddenProperties = new Properties(); overriddenProperties.putAll(p); - for (String key : new String[] { DOCKER_IO_URL_PROPERTY, DOCKER_IO_VERSION_PROPERTY, - DOCKER_IO_USERNAME_PROPERTY, DOCKER_IO_PASSWORD_PROPERTY, DOCKER_IO_EMAIL_PROPERTY, - DOCKER_IO_SERVER_ADDRESS_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, - DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, }) { + for (String key : configKeys) { if (systemProperties.containsKey(key)) { overriddenProperties.setProperty(key, systemProperties.getProperty(key)); } @@ -204,50 +235,55 @@ static DockerClientConfigBuilder createDefaultConfigBuilder(Map return new DockerClientConfigBuilder().withProperties(properties); } - public URI getUri() { - return uri; + public URI getDockerHost() { + return dockerHost; } - public void setUri(URI uri) { - this.uri = uri; + public void setDockerHost(URI dockerHost) { + this.dockerHost = dockerHost; } - public RemoteApiVersion getVersion() { - return version; + public RemoteApiVersion getApiVersion() { + return apiVersion; } - public String getUsername() { - return username; + public String getRegistryUsername() { + return registryUsername; } - public String getPassword() { - return password; + public String getRegistryPassword() { + return registryPassword; } - public String getEmail() { - return email; + public String getRegistryEmail() { + return registryEmail; } - public String getServerAddress() { - return serverAddress; + public String getRegistryUrl() { + return registryUrl; } - public SSLConfig getSslConfig() { - return sslConfig; + public String getDockerConfig() { + return dockerConfig; } - public String getDockerCfgPath() { - return dockerCfgPath; + public String getDockerCertPath() { + return dockerCertPath; + } + + public boolean getDockerTlsVerify() { + return dockerTlsVerify; } private AuthConfig getAuthConfig() { AuthConfig authConfig = null; - if (getUsername() != null && getPassword() != null && getEmail() != null && getServerAddress() != null) { + if (getRegistryUsername() != null && getRegistryPassword() != null && getRegistryEmail() != null + && getRegistryUrl() != null) { authConfig = new AuthConfig(); - authConfig.setUsername(getUsername()); - authConfig.setPassword(getPassword()); - authConfig.setEmail(getEmail()); - authConfig.setServerAddress(getServerAddress()); + authConfig.setUsername(getRegistryUsername()); + authConfig.setPassword(getRegistryPassword()); + authConfig.setEmail(getRegistryEmail()); + authConfig.setServerAddress(getRegistryUrl()); } return authConfig; } @@ -255,12 +291,12 @@ private AuthConfig getAuthConfig() { public AuthConfig effectiveAuthConfig(String imageName) { AuthConfig authConfig = null; - String dockerCfgFile = getDockerCfgPath(); + File dockerCfgFile = new File(getDockerConfig() + File.separator + DOCKER_CFG); - if (dockerCfgFile != null && imageName != null) { + if (dockerCfgFile.exists() && dockerCfgFile.isFile() && imageName != null) { AuthConfigFile authConfigFile; try { - authConfigFile = AuthConfigFile.loadConfig(new File(dockerCfgFile)); + authConfigFile = AuthConfigFile.loadConfig(dockerCfgFile); } catch (IOException e) { throw new DockerClientException("Failed to parse dockerCfgFile", e); } @@ -279,11 +315,11 @@ public AuthConfig effectiveAuthConfig(String imageName) { } public AuthConfigurations getAuthConfigurations() { - String dockerCfgFile = getDockerCfgPath(); - if (dockerCfgFile != null) { + File dockerCfgFile = new File(getDockerConfig() + File.separator + DOCKER_CFG); + if (dockerCfgFile.exists() && dockerCfgFile.isFile()) { AuthConfigFile authConfigFile; try { - authConfigFile = AuthConfigFile.loadConfig(new File(dockerCfgFile)); + authConfigFile = AuthConfigFile.loadConfig(dockerCfgFile); } catch (IOException e) { throw new DockerClientException("Failed to parse dockerCfgFile", e); } @@ -303,121 +339,92 @@ public boolean equals(Object o) { DockerClientConfig that = (DockerClientConfig) o; - if (sslConfig != null ? !sslConfig.equals(that.sslConfig) : that.sslConfig != null) - return false; - if (dockerCfgPath != null ? !dockerCfgPath.equals(that.dockerCfgPath) : that.dockerCfgPath != null) - return false; - if (email != null ? !email.equals(that.email) : that.email != null) - return false; - if (password != null ? !password.equals(that.password) : that.password != null) - return false; - if (serverAddress != null ? !serverAddress.equals(that.serverAddress) : that.serverAddress != null) - return false; - if (uri != null ? !uri.equals(that.uri) : that.uri != null) - return false; - if (username != null ? !username.equals(that.username) : that.username != null) - return false; - if (version != null ? !version.equals(that.version) : that.version != null) - return false; - - return true; + return EqualsBuilder.reflectionEquals(this, that); } @Override public int hashCode() { - int result = uri != null ? uri.hashCode() : 0; - result = 31 * result + (version != null ? version.hashCode() : 0); - result = 31 * result + (username != null ? username.hashCode() : 0); - result = 31 * result + (password != null ? password.hashCode() : 0); - result = 31 * result + (email != null ? email.hashCode() : 0); - result = 31 * result + (serverAddress != null ? serverAddress.hashCode() : 0); - result = 31 * result + (dockerCfgPath != null ? dockerCfgPath.hashCode() : 0); - result = 31 * result + (sslConfig != null ? sslConfig.hashCode() : 0); - return result; + return HashCodeBuilder.reflectionHashCode(this); } @Override public String toString() { - return "DockerClientConfig{" + "uri=" + uri + ", version='" + version + '\'' + ", username='" + username + '\'' - + ", password='" + password + '\'' + ", email='" + email + '\'' + ", serverAddress='" + serverAddress - + '\'' + ", dockerCfgPath='" + dockerCfgPath + '\'' + ", sslConfig='" + sslConfig + '\'' + '}'; + return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } public static class DockerClientConfigBuilder { - private URI uri; + private URI dockerHost; - private String version, username, password, email, serverAddress, dockerCfgPath; + private String apiVersion, registryUsername, registryPassword, registryEmail, registryUrl, dockerConfig, + dockerCertPath; - private SSLConfig sslConfig; + private boolean dockerTlsVerify; /** * This will set all fields in the builder to those contained in the Properties object. The Properties object - * should contain the following docker.io.* keys: url, version, username, password, email, dockerCertPath, and - * dockerCfgPath. If docker.io.readTimeout or docker.io.enableLoggingFilter are not contained, they will be set - * to 1000 and true, respectively. + * should contain the following docker-java configuration keys: DOCKER_HOST, DOCKER_TLS_VERIFY, api.version, + * registry.username, registry.password, registry.email, DOCKER_CERT_PATH, and DOCKER_CONFIG. */ public DockerClientConfigBuilder withProperties(Properties p) { - return withUri(p.getProperty(DOCKER_IO_URL_PROPERTY)) - .withVersion(p.getProperty(DOCKER_IO_VERSION_PROPERTY)) - .withUsername(p.getProperty(DOCKER_IO_USERNAME_PROPERTY)) - .withPassword(p.getProperty(DOCKER_IO_PASSWORD_PROPERTY)) - .withEmail(p.getProperty(DOCKER_IO_EMAIL_PROPERTY)) - .withServerAddress(p.getProperty(DOCKER_IO_SERVER_ADDRESS_PROPERTY)) - .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) - .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)); + return withDockerHost(p.getProperty(DOCKER_HOST)).withDockerTlsVerify(p.getProperty(DOCKER_TLS_VERIFY)) + .withDockerConfig(p.getProperty(DOCKER_CONFIG)).withDockerCertPath(p.getProperty(DOCKER_CERT_PATH)) + .withApiVersion(p.getProperty(API_VERSION)).withRegistryUsername(p.getProperty(REGISTRY_USERNAME)) + .withRegistryPassword(p.getProperty(REGISTRY_PASSWORD)) + .withRegistryEmail(p.getProperty(REGISTRY_EMAIL)).withRegistryUrl(p.getProperty(REGISTRY_URL)); } - public final DockerClientConfigBuilder withUri(String uri) { - checkNotNull(uri, "uri was not specified"); - this.uri = URI.create(uri); + /** + * configure DOCKER_HOST + */ + public final DockerClientConfigBuilder withDockerHost(String dockerHost) { + checkNotNull(dockerHost, "uri was not specified"); + this.dockerHost = URI.create(dockerHost); return this; } - public final DockerClientConfigBuilder withVersion(String version) { - this.version = version; + public final DockerClientConfigBuilder withApiVersion(String apiVersion) { + this.apiVersion = apiVersion; return this; } - public final DockerClientConfigBuilder withUsername(String username) { - this.username = username; + public final DockerClientConfigBuilder withRegistryUsername(String registryUsername) { + this.registryUsername = registryUsername; return this; } - public final DockerClientConfigBuilder withPassword(String password) { - this.password = password; + public final DockerClientConfigBuilder withRegistryPassword(String registryPassword) { + this.registryPassword = registryPassword; return this; } - public final DockerClientConfigBuilder withEmail(String email) { - this.email = email; + public final DockerClientConfigBuilder withRegistryEmail(String registryEmail) { + this.registryEmail = registryEmail; return this; } - public DockerClientConfigBuilder withServerAddress(String serverAddress) { - this.serverAddress = serverAddress; + public DockerClientConfigBuilder withRegistryUrl(String registryUrl) { + this.registryUrl = registryUrl; return this; } public final DockerClientConfigBuilder withDockerCertPath(String dockerCertPath) { - if (dockerCertPath != null) { - this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); - } + this.dockerCertPath = dockerCertPath; return this; } - public final DockerClientConfigBuilder withDockerCfgPath(String dockerCfgPath) { - this.dockerCfgPath = dockerCfgPath; + public final DockerClientConfigBuilder withDockerConfig(String dockerConfig) { + this.dockerConfig = dockerConfig; return this; } - public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { - this.sslConfig = config; + public final DockerClientConfigBuilder withDockerTlsVerify(String dockerTlsVerify) { + this.dockerTlsVerify = BooleanUtils.toBoolean(dockerTlsVerify.trim(), "1", "0"); return this; } public DockerClientConfig build() { - return new DockerClientConfig(uri, version, username, password, email, serverAddress, dockerCfgPath, - sslConfig); + return new DockerClientConfig(dockerHost, dockerConfig, apiVersion, registryUrl, registryUsername, + registryPassword, registryEmail, dockerCertPath, dockerTlsVerify); } } diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index ede135613..0ee71909c 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -132,7 +132,7 @@ private DockerClientImpl(DockerClientConfig dockerClientConfig) { } private static DockerClientConfig configWithServerUrl(String serverUrl) { - return DockerClientConfig.createDefaultConfigBuilder().withUri(serverUrl).build(); + return DockerClientConfig.createDefaultConfigBuilder().withDockerHost(serverUrl).build(); } public static DockerClientImpl getInstance() { @@ -161,14 +161,14 @@ private DockerCmdExecFactory getDockerCmdExecFactory() { @Override public AuthConfig authConfig() { - checkNotNull(dockerClientConfig.getUsername(), "Configured username is null."); - checkNotNull(dockerClientConfig.getServerAddress(), "Configured serverAddress is null."); + checkNotNull(dockerClientConfig.getRegistryUsername(), "Configured username is null."); + checkNotNull(dockerClientConfig.getRegistryUrl(), "Configured serverAddress is null."); AuthConfig authConfig = new AuthConfig(); - authConfig.setUsername(dockerClientConfig.getUsername()); - authConfig.setPassword(dockerClientConfig.getPassword()); - authConfig.setEmail(dockerClientConfig.getEmail()); - authConfig.setServerAddress(dockerClientConfig.getServerAddress()); + authConfig.setUsername(dockerClientConfig.getRegistryUsername()); + authConfig.setPassword(dockerClientConfig.getRegistryPassword()); + authConfig.setEmail(dockerClientConfig.getRegistryEmail()); + authConfig.setServerAddress(dockerClientConfig.getRegistryUrl()); return authConfig; } diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index d8c84663c..750114b11 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -46,7 +46,7 @@ protected String registryAuth(AuthConfig authConfig) { protected String registryConfigs(AuthConfigurations authConfigs) { try { final String json; - if (dockerClientConfig.getVersion().isGreaterOrEqual(RemoteApiVersion.VERSION_1_19)) { + if (dockerClientConfig.getApiVersion().isGreaterOrEqual(RemoteApiVersion.VERSION_1_19)) { json = new ObjectMapper().writeValueAsString(authConfigs.getConfigs()); } else { json = new ObjectMapper().writeValueAsString(authConfigs); diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index bbd71ba38..337b3e790 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -2,6 +2,33 @@ 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 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.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; @@ -54,34 +81,11 @@ import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.LocalDirectorySSLConfig; import com.github.dockerjava.jaxrs.connector.ApacheConnectorProvider; import com.github.dockerjava.jaxrs.filter.JsonClientFilter; import com.github.dockerjava.jaxrs.filter.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.filter.SelectiveLoggingFilter; -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.client.ClientConfig; -import org.glassfish.jersey.client.ClientProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -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 java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.ProxySelector; -import java.net.URI; -import java.util.List; //import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; // see https://github.com/docker-java/docker-java/issues/196 @@ -108,6 +112,8 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private DockerClientConfig dockerClientConfig; + SSLContext sslContext = null; + @Override public void init(DockerClientConfig dockerClientConfig) { checkNotNull(dockerClientConfig, "config was not specified"); @@ -146,15 +152,19 @@ public void init(DockerClientConfig dockerClientConfig) { } } - URI originalUri = dockerClientConfig.getUri(); + URI originalUri = dockerClientConfig.getDockerHost(); - SSLContext sslContext = null; String protocol = null; - if (dockerClientConfig.getSslConfig() != null) { + if (dockerClientConfig.getDockerTlsVerify()) { protocol = "https"; + try { - sslContext = dockerClientConfig.getSslConfig().getSSLContext(); + + if (sslContext == null) { + sslContext = new LocalDirectorySSLConfig(dockerClientConfig.getDockerCertPath()).getSSLContext(); + } + } catch (Exception ex) { throw new DockerClientException("Error in SSL Configuration", ex); } @@ -163,8 +173,13 @@ public void init(DockerClientConfig dockerClientConfig) { } if (originalUri.getScheme().equals("unix")) { - dockerClientConfig.setUri(UnixConnectionSocketFactory.sanitizeUri(originalUri)); + dockerClientConfig.setDockerHost(UnixConnectionSocketFactory.sanitizeUri(originalUri)); } else { + try { + originalUri = new URI(originalUri.toString().replaceFirst("tcp", protocol)); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } configureProxy(clientConfig, protocol); } @@ -190,12 +205,12 @@ public void init(DockerClientConfig dockerClientConfig) { client = clientBuilder.build(); - baseResource = client.target(dockerClientConfig.getUri()).path(dockerClientConfig.getVersion().asWebPathPart()); + baseResource = client.target(originalUri.toString()).path(dockerClientConfig.getApiVersion().asWebPathPart()); } private void configureProxy(ClientConfig clientConfig, String protocol) { - List proxies = ProxySelector.getDefault().select(dockerClientConfig.getUri()); + List proxies = ProxySelector.getDefault().select(dockerClientConfig.getDockerHost()); for (Proxy proxy : proxies) { InetSocketAddress address = (InetSocketAddress) proxy.address(); @@ -490,6 +505,12 @@ public void close() throws IOException { client.close(); } + @Override + public DockerCmdExecFactoryImpl withSSLContext(SSLContext sslContext) { + this.sslContext = sslContext; + return this; + } + public DockerCmdExecFactoryImpl withReadTimeout(Integer readTimeout) { this.readTimeout = readTimeout; 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 ee3b50101..d26cf70c0 100644 --- a/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/netty/DockerCmdExecFactoryImpl.java @@ -51,6 +51,7 @@ import com.github.dockerjava.api.command.WaitContainerCmd; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.DockerClientImpl; +import com.github.dockerjava.core.LocalDirectorySSLConfig; import com.github.dockerjava.netty.exec.AttachContainerCmdExec; import com.github.dockerjava.netty.exec.AuthCmdExec; import com.github.dockerjava.netty.exec.BuildImageCmdExec; @@ -99,6 +100,7 @@ import com.github.dockerjava.netty.exec.UnpauseContainerCmdExec; import com.github.dockerjava.netty.exec.VersionCmdExec; import com.github.dockerjava.netty.exec.WaitContainerCmdExec; + import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; @@ -113,11 +115,13 @@ import io.netty.handler.codec.http.HttpClientCodec; import io.netty.handler.logging.LoggingHandler; import io.netty.handler.ssl.SslHandler; + import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLParameters; + import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -157,6 +161,8 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private NettyInitializer nettyInitializer; + private SSLContext sslContext = null; + private ChannelProvider channelProvider = new ChannelProvider() { @Override public Channel getChannel() { @@ -173,11 +179,11 @@ public void init(DockerClientConfig dockerClientConfig) { bootstrap = new Bootstrap(); - String scheme = dockerClientConfig.getUri().getScheme(); + String scheme = dockerClientConfig.getDockerHost().getScheme(); if ("unix".equals(scheme)) { nettyInitializer = new UnixDomainSocketInitializer(); - } else if (scheme.startsWith("http")) { + } else if ("tcp".equals(scheme)) { nettyInitializer = new InetSocketInitializer(); } @@ -248,8 +254,8 @@ protected void initChannel(final SocketChannel channel) throws Exception { @Override public Channel connect(Bootstrap bootstrap) throws InterruptedException { - String host = dockerClientConfig.getUri().getHost(); - int port = dockerClientConfig.getUri().getPort(); + String host = dockerClientConfig.getDockerHost().getHost(); + int port = dockerClientConfig.getDockerHost().getPort(); if (port == -1) { throw new RuntimeException("no port configured for " + host); @@ -257,7 +263,7 @@ public Channel connect(Bootstrap bootstrap) throws InterruptedException { Channel channel = bootstrap.connect(host, port).sync().channel(); - if ("https".equals(dockerClientConfig.getUri().getScheme())) { + if (dockerClientConfig.getDockerTlsVerify()) { final SslHandler ssl = initSsl(dockerClientConfig); if (ssl != null) { @@ -272,10 +278,12 @@ private SslHandler initSsl(DockerClientConfig dockerClientConfig) { SslHandler ssl = null; try { - String host = dockerClientConfig.getUri().getHost(); - int port = dockerClientConfig.getUri().getPort(); + String host = dockerClientConfig.getDockerHost().getHost(); + int port = dockerClientConfig.getDockerHost().getPort(); - SSLContext sslContext = dockerClientConfig.getSslConfig().getSSLContext(); + if(sslContext == null) { + sslContext = new LocalDirectorySSLConfig(dockerClientConfig.getDockerCertPath()).getSSLContext(); + } SSLEngine engine = sslContext.createSSLEngine(host, port); engine.setUseClientMode(true); @@ -552,6 +560,13 @@ public void close() throws IOException { eventLoopGroup.shutdownGracefully(); } + @Override + public DockerCmdExecFactory withSSLContext(SSLContext sslContext) { + this.sslContext = sslContext; + return this; + } + + private WebTarget getBaseResource() { return new WebTarget(channelProvider); } diff --git a/src/main/java/com/github/dockerjava/netty/exec/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/AbstrDockerCmdExec.java index e8b3597c9..5cf36a0a4 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/AbstrDockerCmdExec.java @@ -45,7 +45,7 @@ protected String registryAuth(AuthConfig authConfig) { protected String registryConfigs(AuthConfigurations authConfigs) { try { final String json; - if (dockerClientConfig.getVersion().isGreaterOrEqual(RemoteApiVersion.VERSION_1_19)) { + if (dockerClientConfig.getApiVersion().isGreaterOrEqual(RemoteApiVersion.VERSION_1_19)) { json = new ObjectMapper().writeValueAsString(authConfigs.getConfigs()); } else { json = new ObjectMapper().writeValueAsString(authConfigs); diff --git a/src/main/resources/docker-java.properties b/src/main/resources/docker-java.properties new file mode 100644 index 000000000..ea85f6c01 --- /dev/null +++ b/src/main/resources/docker-java.properties @@ -0,0 +1,17 @@ +#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_CONFIG=${user.home}/.docker +DOCKER_CERT_PATH=${user.home}/.docker/certs + +api.version= +registry.url=https://index.docker.io/v1/ +registry.username=${user.name} +#registry.password= +#registry.email= + diff --git a/src/main/resources/docker.io.properties b/src/main/resources/docker.io.properties deleted file mode 100644 index 719500e24..000000000 --- a/src/main/resources/docker.io.properties +++ /dev/null @@ -1,5 +0,0 @@ -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/ diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 074c19ad9..5f63207d1 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -74,12 +74,12 @@ private DockerClientConfig config() { protected DockerClientConfig config(String password) { DockerClientConfig.DockerClientConfigBuilder builder = DockerClientConfig.createDefaultConfigBuilder() - .withServerAddress("https://index.docker.io/v1/"); + .withRegistryUrl("https://index.docker.io/v1/"); if (password != null) { - builder = builder.withPassword(password); + builder = builder.withRegistryPassword(password); } - return builder.withVersion(apiVersion).build(); + return builder.withApiVersion(apiVersion).build(); } public void afterTest() { diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index 8bb1c3e39..e87254b88 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -1,8 +1,8 @@ package com.github.dockerjava.core; -import com.github.dockerjava.api.model.AuthConfig; -import org.apache.commons.lang.SerializationUtils; -import org.testng.annotations.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.testng.Assert.assertEquals; import java.net.URI; import java.util.Collections; @@ -10,113 +10,57 @@ import java.util.Map; import java.util.Properties; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.testng.Assert.assertEquals; +import org.apache.commons.lang.SerializationUtils; +import org.testng.annotations.Test; + +import com.github.dockerjava.api.exception.DockerClientException; +import com.github.dockerjava.api.model.AuthConfig; public class DockerClientConfigTest { public static final DockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); private static DockerClientConfig newExampleConfig() { - return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", - new LocalDirectorySSLConfig("flim")); - } - @Test - public void string() throws Exception { - assertEquals( - EXAMPLE_CONFIG.toString(), - "DockerClientConfig{uri=http://foo, version='{UNKNOWN_VERSION}', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}'}"); - } + String dockerCertPath = dockerCertPath(); - @Test - public void equals() throws Exception { - assertEquals(EXAMPLE_CONFIG, newExampleConfig()); + return new DockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + dockerCertPath, true); } - @Test - public void environmentDockerHost() throws Exception { - - // given docker host in env - Map env = new HashMap(); - env.put("DOCKER_HOST", "tcp://baz:8768"); - // and it looks to be SSL disabled - env.remove("DOCKER_CERT_PATH"); - - // when you build a config - DockerClientConfig config = buildConfig(env, new Properties()); - - // then the URL is that value with "http" instead of "tcp" - assertEquals(config.getUri(), URI.create("http://baz:8768")); + private static String homeDir() { + return "target/test-classes/someHomeDir"; } - @Test - public void environmentDockerHostHttpsAutoDetectByCertPath() throws Exception { - - // given docker host in env - Map env = new HashMap(System.getenv()); - env.put("DOCKER_HOST", "tcp://bar:8768"); - // and it looks to be SSL enabled - env.put("DOCKER_CERT_PATH", "any value"); - - // when you build a config - DockerClientConfig config = buildConfig(env, new Properties()); - - // then the URL is that value with "tcp" changed to "https" - assertEquals(config.getUri(), URI.create("https://bar:8768")); + private static String dockerCertPath() { + return homeDir() + "/.docker"; } @Test - public void environmentDockerHostHttpsAutoDetectByTlsVerify() throws Exception { - - // given docker host in env - Map env = new HashMap(System.getenv()); - env.put("DOCKER_HOST", "tcp://bar:8768"); - // and it looks to be SSL enabled - env.put("DOCKER_TLS_VERIFY", "1"); - - // when you build a config - DockerClientConfig config = buildConfig(env, new Properties()); - - // then the URL is that value with "tcp" changed to "https" - assertEquals(config.getUri(), URI.create("https://bar:8768")); + public void equals() throws Exception { + assertEquals(EXAMPLE_CONFIG, newExampleConfig()); } @Test - public void environmentDockerHostWithInvalidTlsVerify() throws Exception { + public void environmentDockerHost() throws Exception { // given docker host in env - Map env = new HashMap(System.getenv()); - env.put("DOCKER_HOST", "tcp://bar:8768"); + Map env = new HashMap(); + env.put(DockerClientConfig.DOCKER_HOST, "tcp://baz:8768"); // and it looks to be SSL disabled env.remove("DOCKER_CERT_PATH"); - // and it has an invalid TLS_VERIFY value - env.put("DOCKER_TLS_VERIFY", "any value different from '1'"); - // when you build a config - DockerClientConfig config = buildConfig(env, new Properties()); - // then the URL is that value with "tcp" changed to "https" - assertEquals(config.getUri(), URI.create("http://bar:8768")); - } - - @Test - public void environmentDockerHostWithInvalidTlsVerifyButWithCertPath() throws Exception { - // given docker host in env - Map env = new HashMap(System.getenv()); - env.put("DOCKER_HOST", "tcp://bar:8768"); - // and it looks to be SSL enabled - env.put("DOCKER_CERT_PATH", "any value"); - // and it has an invalid TLS_VERIFY value - env.put("DOCKER_TLS_VERIFY", "any value different from '1'"); + // given default cert path + Properties systemProperties = new Properties(); + systemProperties.setProperty("user.name", "someUserName"); + systemProperties.setProperty("user.home", homeDir()); // when you build a config - DockerClientConfig config = buildConfig(env, new Properties()); + DockerClientConfig config = buildConfig(env, systemProperties); - // then the URL is that value with "tcp" changed to "https" - assertEquals(config.getUri(), URI.create("https://bar:8768")); + assertEquals(config.getDockerHost(), URI.create("tcp://baz:8768")); } @Test @@ -124,16 +68,16 @@ public void environment() throws Exception { // given a default config in env properties Map env = new HashMap(); - env.put("DOCKER_URL", "http://foo"); - env.put("DOCKER_VERSION", "bar"); - env.put("DOCKER_USERNAME", "baz"); - env.put("DOCKER_PASSWORD", "qux"); - env.put("DOCKER_EMAIL", "blam"); - env.put("DOCKER_SERVER_ADDRESS", "wham"); - env.put("DOCKER_CERT_PATH", "flim"); - env.put("DOCKER_CFG_PATH", "flam"); - env.put("DOCKER_READ_TIMEOUT", "877"); - env.put("DOCKER_LOGGING_FILTER_ENABLED", "false"); + env.put(DockerClientConfig.DOCKER_HOST, "tcp://foo"); + env.put(DockerClientConfig.API_VERSION, "apiVersion"); + env.put(DockerClientConfig.REGISTRY_USERNAME, "registryUsername"); + env.put(DockerClientConfig.REGISTRY_PASSWORD, "registryPassword"); + env.put(DockerClientConfig.REGISTRY_EMAIL, "registryEmail"); + env.put(DockerClientConfig.REGISTRY_URL, "registryUrl"); + env.put(DockerClientConfig.DOCKER_CONFIG, "dockerConfig"); + 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()); @@ -152,18 +96,18 @@ public void defaults() throws Exception { // given default cert path Properties systemProperties = new Properties(); systemProperties.setProperty("user.name", "someUserName"); - systemProperties.setProperty("user.home", "someHomeDir"); + systemProperties.setProperty("user.home", homeDir()); // when you build config DockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties); // then the cert path is as expected - assertEquals(config.getUri(), URI.create("https://localhost:2376")); - assertEquals(config.getUsername(), "someUserName"); - assertEquals(config.getServerAddress(), AuthConfig.DEFAULT_SERVER_ADDRESS); - assertEquals(config.getVersion(), RemoteApiVersion.unknown()); - assertEquals(config.getDockerCfgPath(), "someHomeDir/.dockercfg"); - assertEquals(((LocalDirectorySSLConfig) config.getSslConfig()).getDockerCertPath(), "someHomeDir/.docker"); + assertEquals(config.getDockerHost(), URI.create("tcp://localhost:2376")); + 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"); } @Test @@ -171,14 +115,15 @@ public void systemProperties() throws Exception { // given system properties based on the example Properties systemProperties = new Properties(); - systemProperties.setProperty("docker.io.url", "http://foo"); - systemProperties.setProperty("docker.io.version", "bar"); - systemProperties.setProperty("docker.io.username", "baz"); - systemProperties.setProperty("docker.io.password", "qux"); - systemProperties.setProperty("docker.io.email", "blam"); - systemProperties.setProperty("docker.io.serverAddress", "wham"); - systemProperties.setProperty("docker.io.dockerCertPath", "flim"); - systemProperties.setProperty("docker.io.dockerCfgPath", "flam"); + systemProperties.put(DockerClientConfig.DOCKER_HOST, "tcp://foo"); + systemProperties.put(DockerClientConfig.API_VERSION, "apiVersion"); + systemProperties.put(DockerClientConfig.REGISTRY_USERNAME, "registryUsername"); + systemProperties.put(DockerClientConfig.REGISTRY_PASSWORD, "registryPassword"); + systemProperties.put(DockerClientConfig.REGISTRY_EMAIL, "registryEmail"); + systemProperties.put(DockerClientConfig.REGISTRY_URL, "registryUrl"); + systemProperties.put(DockerClientConfig.DOCKER_CONFIG, "dockerConfig"); + systemProperties.put(DockerClientConfig.DOCKER_CERT_PATH, dockerCertPath()); + systemProperties.put(DockerClientConfig.DOCKER_TLS_VERIFY, "1"); // when you build new config DockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties); @@ -195,4 +140,40 @@ public void serializableTest() { assertThat("Deserialized object mush match source object", deserialized, equalTo(EXAMPLE_CONFIG)); } + + @Test(expectedExceptions = DockerClientException.class) + public void testTlsVerifyAndCertPathNull() throws Exception { + new DockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + null, true); + } + + @Test(expectedExceptions = DockerClientException.class) + public void testTlsVerifyAndCertPathEmpty() throws Exception { + new DockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + "", true); + } + + @Test() + public void testTlsVerifyAndCertPath() throws Exception { + new DockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + dockerCertPath(), true); + } + + @Test(expectedExceptions = DockerClientException.class) + public void testWrongHostScheme() throws Exception { + new DockerClientConfig(URI.create("http://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + null, false); + } + + @Test() + public void testTcpHostScheme() throws Exception { + new DockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + null, false); + } + + @Test() + public void testUnixHostScheme() throws Exception { + new DockerClientConfig(URI.create("unix://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + null, false); + } } diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index c5a1e841c..62cfaa146 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -3,6 +3,8 @@ import static org.testng.Assert.assertEquals; import static org.testng.AssertJUnit.fail; +import java.net.URI; + import org.testng.annotations.Test; public class DockerClientImplTest { @@ -10,7 +12,7 @@ public class DockerClientImplTest { @Test public void configuredInstanceAuthConfig() throws Exception { // given a config with null serverAddress - DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null, null); + DockerClientConfig dockerClientConfig = new DockerClientConfig(URI.create("tcp://foo"), null, null, null, "", "", "", null, false); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config @@ -25,6 +27,9 @@ public void configuredInstanceAuthConfig() throws Exception { @Test public void defaultInstanceAuthConfig() throws Exception { + + System.setProperty("user.home", "target/test-classes/someHomeDir"); + // given a default client DockerClientImpl dockerClient = DockerClientImpl.getInstance(); diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 50860789b..a5dfcfbc5 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -5,6 +5,8 @@ import java.util.ArrayList; import java.util.List; +import javax.net.ssl.SSLContext; + import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.command.AuthCmd.Exec; @@ -367,4 +369,9 @@ public List getVolumeNames() { public List getNetworkIds() { return new ArrayList<>(networkIds); } + + @Override + public DockerCmdExecFactory withSSLContext(SSLContext sslContext) { + return delegate.withSSLContext(sslContext); + } } diff --git a/src/test/resources/someHomeDir/.docker/certs/dummy.txt b/src/test/resources/someHomeDir/.docker/certs/dummy.txt new file mode 100644 index 000000000..e69de29bb diff --git a/src/test/resources/someHomeDir/.docker/config.json b/src/test/resources/someHomeDir/.docker/config.json new file mode 100644 index 000000000..630394039 --- /dev/null +++ b/src/test/resources/someHomeDir/.docker/config.json @@ -0,0 +1,9 @@ +{ + "auths":{ + "https://index.docker.io/v1/":{ + "auth":"XXXX=", + "email":"foo.bar@test.com" + } + + } +} \ No newline at end of file From 7d9ed5d154d38c2ea7f6e3da2f649c6cde9fdb9b Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 19:13:56 +0300 Subject: [PATCH 0153/1032] Checkstyle: common coding problems. Some hashes probably need to be reviewed. --- .../com/github/dockerjava/api/model/Ports.java | 1 + .../com/github/dockerjava/core/NameParser.java | 1 + .../dockerjava/jaxrs/filter/LoggingFilter.java | 10 +++++----- .../netty/DockerCmdExecFactoryImpl.java | 12 ++++++------ .../resources/checkstyle/checkstyle-config.xml | 15 +++++++++++++++ 5 files changed, 28 insertions(+), 11 deletions(-) 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 43ad92585..6bbb05fa2 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -33,6 +33,7 @@ * @see HostConfig#getPortBindings() * @see NetworkSettings#getPorts() */ +@SuppressWarnings(value = "checkstyle:equalshashcode") //FIXME? @JsonDeserialize(using = Ports.Deserializer.class) @JsonSerialize(using = Ports.Serializer.class) public class Ports { diff --git a/src/main/java/com/github/dockerjava/core/NameParser.java b/src/main/java/com/github/dockerjava/core/NameParser.java index 3c58eb331..77cc6bb06 100644 --- a/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/src/main/java/com/github/dockerjava/core/NameParser.java @@ -12,6 +12,7 @@ import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.core.exception.InvalidRepositoryNameException; +@SuppressWarnings(value = "checkstyle:equalshashcode") public class NameParser { //CHECKSTYLE:OFF private static final int RepositoryNameTotalLengthMax = 255; diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java index ccd6500d1..76666fe4e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java @@ -109,7 +109,7 @@ public int compare(final Map.Entry> o1, final Map.Entry() { @Override protected void initChannel(final UnixChannel channel) throws Exception { channel.pipeline().addLast(new HttpClientCodec()); } }); - return eventLoopGroup; + return epollEventLoopGroup; } @Override @@ -225,7 +225,7 @@ public Channel connect(Bootstrap bootstrap) throws InterruptedException { private class InetSocketInitializer implements NettyInitializer { @Override public EventLoopGroup init(Bootstrap bootstrap, final DockerClientConfig dockerClientConfig) { - EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + EventLoopGroup nioEventLoopGroup = new NioEventLoopGroup(); InetAddress addr = InetAddress.getLoopbackAddress(); @@ -233,7 +233,7 @@ public EventLoopGroup init(Bootstrap bootstrap, final DockerClientConfig dockerC Security.addProvider(new BouncyCastleProvider()); - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) + bootstrap.group(nioEventLoopGroup).channel(NioSocketChannel.class) .handler(new ChannelInitializer() { @Override protected void initChannel(final SocketChannel channel) throws Exception { @@ -243,7 +243,7 @@ protected void initChannel(final SocketChannel channel) throws Exception { } }); - return eventLoopGroup; + return nioEventLoopGroup; } @Override diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index a97064845..3c353fc1a 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -132,6 +132,21 @@ + + + + + + + + + + + + + + + From e835537d195c9cdf55058fa95542621fc7671265 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 19:18:41 +0300 Subject: [PATCH 0154/1032] Checkstyle: class design. Utility classes should not have a public or default constructor. --- .../java/com/github/dockerjava/core/GoLangFileMatch.java | 2 ++ src/main/java/com/github/dockerjava/core/NameParser.java | 3 +++ .../com/github/dockerjava/core/util/FiltersEncoder.java | 2 ++ src/test/resources/checkstyle/checkstyle-config.xml | 7 +++++++ 4 files changed, 14 insertions(+) diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index 2f29789ea..7bed65c5b 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -44,6 +44,8 @@ * */ public class GoLangFileMatch { + private GoLangFileMatch() { + } public static final boolean IS_WINDOWS = File.separatorChar == '\\'; diff --git a/src/main/java/com/github/dockerjava/core/NameParser.java b/src/main/java/com/github/dockerjava/core/NameParser.java index 77cc6bb06..5027422fd 100644 --- a/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/src/main/java/com/github/dockerjava/core/NameParser.java @@ -14,6 +14,9 @@ @SuppressWarnings(value = "checkstyle:equalshashcode") public class NameParser { + private NameParser() { + } + //CHECKSTYLE:OFF private static final int RepositoryNameTotalLengthMax = 255; diff --git a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java index 164528a8c..280daad45 100644 --- a/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java +++ b/src/main/java/com/github/dockerjava/core/util/FiltersEncoder.java @@ -16,6 +16,8 @@ * */ public class FiltersEncoder { + private FiltersEncoder() { + } private static final ObjectMapper OBJECT_MAPPER = new JacksonJaxbJsonProvider().locateMapper(Map.class, MediaType.APPLICATION_JSON_TYPE); diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index 3c353fc1a..2906a76ad 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -148,6 +148,13 @@ + + + + + + + From b0e2853feca000af1ec95deb2f0976eb3ddf71aa Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 19:20:55 +0300 Subject: [PATCH 0155/1032] Checkstyle: other checks. --- src/test/resources/checkstyle/checkstyle-config.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index 2906a76ad..02f55585f 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -155,6 +155,16 @@ + + + + + + + + + + From d5d77ad81c355cba305d76e138d500706dcf339b Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Sun, 31 Jan 2016 19:33:16 +0300 Subject: [PATCH 0156/1032] checkstyle: violations were in overlapped netty classes. --- .../java/com/github/dockerjava/netty/exec/CommitCmdExec.java | 4 ++-- .../com/github/dockerjava/netty/exec/CreateImageCmdExec.java | 2 +- src/test/resources/checkstyle/checkstyle-config.xml | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java index b42bbdb3b..eaba91fdb 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java @@ -27,8 +27,8 @@ protected String execute(CommitCmd command) { webTarget = booleanQueryParam(webTarget, "pause", command.hasPauseEnabled()); LOGGER.trace("POST: {}", webTarget); - ObjectNode objectNode = webTarget.request().accept(MediaType.APPLICATION_JSON). - post(command, new TypeReference() {}); + ObjectNode objectNode = webTarget.request().accept(MediaType.APPLICATION_JSON) + .post(command, new TypeReference() { }); return objectNode.get("Id").asText(); } diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java index 3d3ddec27..0e182e8bc 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java @@ -26,6 +26,6 @@ protected CreateImageResponse execute(CreateImageCmd command) { LOGGER.trace("POST: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM) - .post(new TypeReference() {}, command.getImageStream()); + .post(new TypeReference() { }, command.getImageStream()); } } diff --git a/src/test/resources/checkstyle/checkstyle-config.xml b/src/test/resources/checkstyle/checkstyle-config.xml index 02f55585f..ea30a270d 100644 --- a/src/test/resources/checkstyle/checkstyle-config.xml +++ b/src/test/resources/checkstyle/checkstyle-config.xml @@ -98,8 +98,7 @@ - - + @@ -111,7 +110,7 @@ - + From 60a3518631cdc0a5606c0a96fcbc579fc27af526 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 6 Feb 2016 18:30:53 +0100 Subject: [PATCH 0157/1032] Sync sources with eclipse code formatter and checkstyle --- etc/docker-java-formatter.xml | 587 ++++++++++++++++++ .../github/dockerjava/api/DockerClient.java | 9 +- .../dockerjava/api/async/ResultCallback.java | 4 +- .../api/command/AttachContainerCmd.java | 3 +- .../dockerjava/api/command/AuthCmd.java | 5 +- .../command/CopyArchiveToContainerCmd.java | 14 +- .../api/command/CreateContainerCmd.java | 32 +- .../api/command/CreateNetworkCmd.java | 2 +- .../api/command/CreateVolumeCmd.java | 4 +- .../api/command/InspectContainerResponse.java | 2 - .../api/command/ListContainersCmd.java | 3 +- .../api/command/LogContainerCmd.java | 7 +- .../dockerjava/api/command/StatsCmd.java | 4 +- .../dockerjava/api/model/AuthConfig.java | 4 +- .../com/github/dockerjava/api/model/Bind.java | 27 +- .../dockerjava/api/model/Capability.java | 62 +- .../github/dockerjava/api/model/Event.java | 6 +- .../dockerjava/api/model/ExposedPort.java | 22 +- .../github/dockerjava/api/model/Frame.java | 4 +- .../dockerjava/api/model/Identifier.java | 4 +- .../api/model/InternetProtocol.java | 4 +- .../com/github/dockerjava/api/model/Link.java | 27 +- .../dockerjava/api/model/LogConfig.java | 6 +- .../github/dockerjava/api/model/Network.java | 2 +- .../dockerjava/api/model/PortBinding.java | 34 +- .../github/dockerjava/api/model/Ports.java | 69 +- .../dockerjava/api/model/RestartPolicy.java | 7 +- .../github/dockerjava/api/model/Ulimit.java | 4 +- .../github/dockerjava/api/model/VolumeRW.java | 4 +- .../dockerjava/api/model/VolumesFrom.java | 24 +- .../dockerjava/core/AuthConfigFile.java | 5 +- .../dockerjava/core/DockerClientConfig.java | 17 +- .../dockerjava/core/GoLangFileMatch.java | 136 ++-- .../dockerjava/core/KeystoreSSLConfig.java | 26 +- .../github/dockerjava/core/NameParser.java | 5 +- .../dockerjava/core/RemoteApiVersion.java | 15 +- .../core/async/ResultCallbackTemplate.java | 9 +- .../core/command/ConnectToNetworkCmdImpl.java | 6 +- .../core/command/CreateNetworkCmdImpl.java | 3 +- .../command/DisconnectFromNetworkCmdImpl.java | 8 +- .../core/command/ExecStartCmdImpl.java | 1 - .../core/command/ExecStartResultCallback.java | 30 +- .../dockerjava/core/command/FrameReader.java | 17 +- .../core/command/InpectNetworkCmdImpl.java | 6 +- .../core/command/LogContainerCmdImpl.java | 4 +- .../core/dockerfile/Dockerfile.java | 4 +- .../core/util/CompressArchiveUtil.java | 4 +- .../dockerjava/core/util/FiltersBuilder.java | 5 +- .../dockerjava/jaxrs/ApacheUnixSocket.java | 10 +- .../jaxrs/ConnectToNetworkCmdExec.java | 2 +- .../jaxrs/DisconnectFromNetworkCmdExec.java | 2 +- .../jaxrs/InspectNetworkCmdExec.java | 5 +- .../jaxrs/RemoveNetworkCmdExec.java | 2 +- .../jaxrs/connector/ApacheConnector.java | 32 +- .../connector/ApacheConnectorProvider.java | 47 +- .../jaxrs/filter/FollowRedirectsFilter.java | 6 +- .../jaxrs/filter/LoggingFilter.java | 13 +- .../filter/ResponseStatusExceptionFilter.java | 40 +- .../util/WrappedResponseInputStream.java | 5 +- .../netty/DockerCmdExecFactoryImpl.java | 4 +- .../dockerjava/netty/InvocationBuilder.java | 4 +- .../github/dockerjava/netty/MediaType.java | 4 +- .../github/dockerjava/netty/WebTarget.java | 4 +- .../netty/exec/AbstrSyncDockerCmdExec.java | 1 - .../dockerjava/netty/exec/CommitCmdExec.java | 3 +- .../netty/exec/ConnectToNetworkCmdExec.java | 3 +- .../netty/exec/CreateImageCmdExec.java | 3 +- .../exec/DisconnectFromNetworkCmdExec.java | 3 +- .../dockerjava/netty/exec/InfoCmdExec.java | 3 +- .../netty/exec/LogContainerCmdExec.java | 1 - .../netty/exec/RestartContainerCmdExec.java | 1 - .../netty/exec/StopContainerCmdExec.java | 2 - .../handler/FramedResponseStreamHandler.java | 16 +- .../netty/handler/HttpResponseHandler.java | 78 +-- .../dockerjava/api/model/AuthConfigTest.java | 2 +- .../dockerjava/api/model/IdentifierTest.java | 2 +- .../api/model/Ports_addBindingsTest.java | 11 +- .../dockerjava/api/model/RepositoryTest.java | 2 +- .../model/RestartPolicy_SerializingTest.java | 4 +- .../api/model/RestartPolicy_toStringTest.java | 2 +- .../dockerjava/api/model/VolumeBindsTest.java | 2 +- .../client/AbstractDockerClientTest.java | 2 +- .../dockerjava/client/DockerClientTest.java | 4 +- .../dockerjava/core/DockerClientImplTest.java | 2 +- .../dockerjava/core/GoLangFileMatchTest.java | 108 ++-- .../core/TestDockerCmdExecFactory.java | 4 +- .../core/command/BuildImageCmdImplTest.java | 7 +- .../command/CreateContainerCmdImplTest.java | 21 +- .../core/command/FrameReaderTest.java | 2 +- .../command/StartContainerCmdImplTest.java | 19 +- .../DockerfileStatementAddTest.java | 18 +- .../core/dockerfile/DockerfileTest.java | 2 +- .../core/util/FiltersBuilderTest.java | 3 +- .../netty/exec/BuildImageCmdExecTest.java | 7 +- .../exec/CreateContainerCmdExecTest.java | 21 +- .../netty/exec/StartContainerCmdExecTest.java | 19 +- 96 files changed, 1192 insertions(+), 653 deletions(-) create mode 100644 etc/docker-java-formatter.xml diff --git a/etc/docker-java-formatter.xml b/etc/docker-java-formatter.xml new file mode 100644 index 000000000..211b0a223 --- /dev/null +++ b/etc/docker-java-formatter.xml @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 5db2967ff..aaa3c5fcf 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -107,12 +107,11 @@ public interface DockerClient extends Closeable { public CreateContainerCmd createContainerCmd(@Nonnull String image); /** - * Creates a new {@link StartContainerCmd} for the container with the given ID. The command can then be further - * customized by using builder methods on it like {@link StartContainerCmd#withDns(String...)}. + * Creates a new {@link StartContainerCmd} for the container with the given ID. The command can then be further customized by using + * builder methods on it like {@link StartContainerCmd#withDns(String...)}. *

- * If you customize the command, any existing configuration of the target container will get reset to its default - * before applying the new configuration. To preserve the existing configuration, use an unconfigured - * {@link StartContainerCmd}. + * If you customize the command, any existing configuration of the target container will get reset to its default before applying the + * new configuration. To preserve the existing configuration, use an unconfigured {@link StartContainerCmd}. *

* This command corresponds to the /containers/{id}/start endpoint of the Docker Remote API. */ diff --git a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java index 0bb052a0b..5b9fdb81c 100644 --- a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java +++ b/src/main/java/com/github/dockerjava/api/async/ResultCallback.java @@ -7,8 +7,8 @@ */ public interface ResultCallback extends Closeable { /** - * Called when the async processing starts respectively when the response arrives from the server. The passed - * {@link Closeable} can be used to close/interrupt the processing. + * Called when the async processing starts respectively when the response arrives from the server. The passed {@link Closeable} can be + * used to close/interrupt the processing. */ void onStart(Closeable closeable); diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java index 84f063d7e..ddeb21c2d 100644 --- a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -50,8 +50,7 @@ public interface AttachContainerCmd extends AsyncDockerCmd { public AuthCmd withAuthConfig(@Nonnull AuthConfig authConfig); /** - * @return The status. Based on it's value you may mean you need to authorise your account, e.g.: - * "Account created. Please see the documentation of the registry http://localhost:5000/v1/ - * for instructions how to activate it." + * @return The status. Based on it's value you may mean you need to authorise your account, e.g.: "Account created. Please see the + * documentation of the registry http://localhost:5000/v1/ for instructions how to activate it." * @throws UnauthorizedException * If you're not authorised (e.g. bad password). */ diff --git a/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java index bbfae4597..a4dfb5c03 100644 --- a/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java @@ -33,8 +33,7 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd { CopyArchiveToContainerCmd withHostResource(String resource); /** - * Set the tar input stream that will be uploaded to the container. withHostResource or withTarInputStream can be - * defined but not both. + * Set the tar input stream that will be uploaded to the container. withHostResource or withTarInputStream can be defined but not both. * * @param tarInputStream * the stream to upload to the container @@ -42,8 +41,8 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd { CopyArchiveToContainerCmd withTarInputStream(InputStream tarInputStream); /** - * If set to true then it will be an error if unpacking the given content would cause an existing directory to be - * replaced with a non-directory and vice versa + * If set to true then it will be an error if unpacking the given content would cause an existing directory to be replaced with a + * non-directory and vice versa * * @param noOverwriteDirNonDir * flag to know if non directory can be overwritten @@ -51,10 +50,9 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd { CopyArchiveToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir); /** - * If this flag is set to true, all children of the local directory will be copied to the remote without the root - * directory. For ex: if I have root/titi and root/tata and the remote path is /var/data. dirChildrenOnly = true - * will create /var/data/titi and /var/data/tata dirChildrenOnly = false will create /var/data/root/titi and - * /var/data/root/tata + * If this flag is set to true, all children of the local directory will be copied to the remote without the root directory. For ex: if + * I have root/titi and root/tata and the remote path is /var/data. dirChildrenOnly = true will create /var/data/titi and /var/data/tata + * dirChildrenOnly = false will create /var/data/root/titi and /var/data/root/tata * * @param dirChildrenOnly * if root directory is ignored 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 f1c7fdd9c..6b004c826 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -195,30 +195,26 @@ public interface CreateContainerCmd extends SyncDockerCmdkernel capability to the - * container. For example: adding {@link Capability#MKNOD} allows the container to create special files using the - * 'mknod' command. + * Add linux kernel capability to the container. For example: + * adding {@link Capability#MKNOD} allows the container to create special files using the 'mknod' command. */ public CreateContainerCmd withCapAdd(Capability... capAdd); /** - * Add linux kernel capability to the - * container. For example: adding {@link Capability#MKNOD} allows the container to create special files using the - * 'mknod' command. + * Add linux kernel capability to the container. For example: + * adding {@link Capability#MKNOD} allows the container to create special files using the 'mknod' command. */ public CreateContainerCmd withCapAdd(List capAdd); /** - * Drop linux kernel capability from the - * container. For example: dropping {@link Capability#CHOWN} prevents the container from changing the owner of any - * files. + * Drop linux kernel capability from the container. For example: + * dropping {@link Capability#CHOWN} prevents the container from changing the owner of any files. */ public CreateContainerCmd withCapDrop(Capability... capDrop); /** - * Drop linux kernel capability from the - * container. For example: dropping {@link Capability#CHOWN} prevents the container from changing the owner of any - * files. + * Drop linux kernel capability from the container. For example: + * dropping {@link Capability#CHOWN} prevents the container from changing the owner of any files. */ public CreateContainerCmd withCapDrop(List capDrop); @@ -334,8 +330,8 @@ public interface CreateContainerCmd extends SyncDockerCmd'bridge': creates a new network stack for the container on the docker bridge *

  • 'none': no networking for this container
  • *
  • 'container:': reuses another container network stack
  • - *
  • 'host': use the host network stack inside the container. Note: the host mode gives the container full access - * to local system services such as D-bus and is therefore considered insecure.
  • + *
  • 'host': use the host network stack inside the container. Note: the host mode gives the container full access to local system + * services such as D-bus and is therefore considered insecure.
  • * */ public CreateContainerCmd withNetworkMode(String networkMode); @@ -346,14 +342,14 @@ public interface CreateContainerCmd extends SyncDockerCmd--publish (-p) option of - * the docker run CLI command. + * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of the + * docker run CLI command. */ public CreateContainerCmd withPortBindings(PortBinding... portBindings); /** - * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of - * the docker run CLI command. + * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of the + * docker run CLI command. */ public CreateContainerCmd withPortBindings(List portBindings); 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 2e3cd92a0..82b4ac18c 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java @@ -34,7 +34,7 @@ public interface CreateNetworkCmd extends SyncDockerCmd { /** Name of the network driver to use. Defaults to bridge. */ public CreateNetworkCmd withDriver(String driver); - /** Driver specific options */ + /** Driver specific options */ public CreateNetworkCmd withOptions(Map options); public static interface Exec extends DockerCmdSyncExec { diff --git a/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java index 0642cf902..801fb6122 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java @@ -29,12 +29,10 @@ public interface CreateVolumeCmd extends SyncDockerCmd { /** * @param driverOpts - * - A mapping of driver options and values. These options are passed directly to the driver and are - * driver specific. + * - A mapping of driver options and values. These options are passed directly to the driver and are driver specific. */ public CreateVolumeCmd withDriverOpts(Map driverOpts); public static interface Exec extends DockerCmdSyncExec { } } - 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 85f2812f0..3a49a4dd4 100644 --- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -202,8 +202,6 @@ public String toString() { return ToStringBuilder.reflectionToString(this); } - - @JsonIgnoreProperties(ignoreUnknown = true) public class ContainerState { diff --git a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java index 842f242cc..4ae506a42 100644 --- a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -57,8 +57,7 @@ public interface ListContainersCmd extends SyncDockerCmd> { /** * @param labels - * - Show only containers with the passed labels. Labels is a {@link Map} that contains label keys and - * values + * - Show only containers with the passed labels. Labels is a {@link Map} that contains label keys and values */ public ListContainersCmd withLabelFilter(Map labels); diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index f4b5076c5..bb3081ce4 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -23,8 +23,8 @@ * @param tail * - `all` or ``, Output specified number of lines at the end of logs * @param since - * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that - * timestamp. Default: 0 (unfiltered) + * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: + * 0 (unfiltered) */ public interface LogContainerCmd extends AsyncDockerCmd { @@ -53,8 +53,7 @@ public interface LogContainerCmd extends AsyncDockerCmd /** * Following the stream means the resulting {@link InputStream} returned by {@link #exec()} reads infinitely. So a - * {@link InputStream#read()} MAY BLOCK FOREVER as long as no data is streamed from the docker host to - * {@link DockerClient}! + * {@link InputStream#read()} MAY BLOCK FOREVER as long as no data is streamed from the docker host to {@link DockerClient}! */ public LogContainerCmd withFollowStream(Boolean followStream); diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java index 653cd3bb2..d2d7fe385 100644 --- a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/StatsCmd.java @@ -6,8 +6,8 @@ import com.github.dockerjava.api.model.Statistics; /** - * Get container stats. The result of {@link Statistics} is handled asynchronously because the docker remote API will - * block when a container is stopped until the container is up again. + * Get container stats. The result of {@link Statistics} is handled asynchronously because the docker remote API will block when a container + * is stopped until the container is up again. */ public interface StatsCmd extends AsyncDockerCmd { 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 0bd6cac8c..3dc3ef348 100644 --- a/src/main/java/com/github/dockerjava/api/model/AuthConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -79,7 +79,7 @@ public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); } - //CHECKSTYLE:OFF + // CHECKSTYLE:OFF @Override public int hashCode() { final int prime = 31; @@ -128,5 +128,5 @@ public boolean equals(Object obj) { return false; return true; } - //CHECKSTYLE:ON + // CHECKSTYLE:ON } 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 aa4863923..bc7c8e4bb 100644 --- a/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -4,8 +4,8 @@ import org.apache.commons.lang.builder.HashCodeBuilder; /** - * 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. + * 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 { @@ -50,16 +50,16 @@ public static Bind parse(String serialized) { try { String[] parts = serialized.split(":"); switch (parts.length) { - case 2: { - return new Bind(parts[0], new Volume(parts[1])); - } - case 3: { - AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase()); - return new Bind(parts[0], new Volume(parts[1]), accessMode); - } - default: { - throw new IllegalArgumentException(); - } + case 2: { + return new Bind(parts[0], new Volume(parts[1])); + } + case 3: { + AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase()); + return new Bind(parts[0], new Volume(parts[1]), accessMode); + } + default: { + throw new IllegalArgumentException(); + } } } catch (Exception e) { throw new IllegalArgumentException("Error parsing Bind '" + serialized + "'"); @@ -84,8 +84,7 @@ public int hashCode() { /** * Returns a string representation of this {@link Bind} suitable for inclusion in a JSON message. The format is - * <host path>:<container path>:<access mode>, like the argument in - * {@link #parse(String)}. + * <host path>:<container path>:<access mode>, like the argument in {@link #parse(String)}. * * @return a string representation of this {@link Bind} */ diff --git a/src/main/java/com/github/dockerjava/api/model/Capability.java b/src/main/java/com/github/dockerjava/api/model/Capability.java index 4757937e3..6237a65ae 100644 --- a/src/main/java/com/github/dockerjava/api/model/Capability.java +++ b/src/main/java/com/github/dockerjava/api/model/Capability.java @@ -1,11 +1,9 @@ package com.github.dockerjava.api.model; /** - * The Linux capabilities supported by Docker. The list of capabilities is defined in Docker's types.go, {@link #ALL} - * was added manually. + * The Linux capabilities supported by Docker. The list of capabilities is defined in Docker's types.go, {@link #ALL} was added manually. * - * @see http://man7.org/linux/man-pages/man7/capabilities.7.html + * @see http://man7.org/linux/man-pages/man7/capabilities.7.html */ public enum Capability { /** @@ -33,8 +31,7 @@ public enum Capability { */ CHOWN, /** - * Bypass file read, write, and execute permission checks. (DAC is an abbreviation of - * "discretionary access control".) + * Bypass file read, write, and execute permission checks. (DAC is an abbreviation of "discretionary access control".) */ DAC_OVERRIDE, /** @@ -43,9 +40,8 @@ public enum Capability { DAC_READ_SEARCH, /** *
      - *
    • Bypass permission checks on operations that normally require the file system UID of the process to match the - * UID of the file (e.g., chmod(2), utime(2)), excluding those operations covered by the {@link #DAC_OVERRIDE} and - * {@link #DAC_READ_SEARCH}. + *
    • Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file + * (e.g., chmod(2), utime(2)), excluding those operations covered by the {@link #DAC_OVERRIDE} and {@link #DAC_READ_SEARCH}. *
    • Set extended file attributes (see chattr(1)) on arbitrary files. *
    • Set Access Control Lists (ACLs) on arbitrary files. *
    • Ignore directory sticky bit on file deletion. @@ -56,8 +52,8 @@ public enum Capability { /** *
        *
      • Don't clear set-user-ID and set-group-ID permission bits when a file is modified. - *
      • Set the set-group-ID bit for a file whose GID does not match the file system or any of the supplementary GIDs - * of the calling process. + *
      • Set the set-group-ID bit for a file whose GID does not match the file system or any of the supplementary GIDs of the calling + * process. *
      */ FSETID, @@ -70,8 +66,7 @@ public enum Capability { */ IPC_OWNER, /** - * Bypass permission checks for sending signals (see kill(2)). This includes use of the ioctl(2) KDSIGACCEPT - * operation. + * Bypass permission checks for sending signals (see kill(2)). This includes use of the ioctl(2) KDSIGACCEPT operation. */ KILL, /** @@ -105,8 +100,8 @@ public enum Capability { *
    • Clear driver statistics. *
    • Set promiscuous mode. *
    • Enabling multicasting. - *
    • Use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside - * the range 0 to 6), SO_RCVBUFFORCE, and SO_SNDBUFFORCE. + *
    • Use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside the range 0 to 6), + * SO_RCVBUFFORCE, and SO_SNDBUFFORCE. *
    */ NET_ADMIN, @@ -139,9 +134,9 @@ public enum Capability { /** * If file capabilities are not supported: *
      - *
    • grant or remove any capability in the caller's permitted capability set to or from any other process. (This - * property of CAP_SETPCAP is not available when the kernel is configured to support file capabilities, since - * CAP_SETPCAP has entirely different semantics for such kernels.) + *
    • grant or remove any capability in the caller's permitted capability set to or from any other process. (This property of + * CAP_SETPCAP is not available when the kernel is configured to support file capabilities, since CAP_SETPCAP has entirely different + * semantics for such kernels.) *
    *

    * If file capabilities are supported: @@ -161,19 +156,17 @@ public enum Capability { SETUID, /** *

      - *
    • Perform a range of system administration operations including: quotactl(2), mount(2), umount(2), swapon(2), - * swapoff(2), sethostname(2), and setdomainname(2). - *
    • Perform privileged syslog(2) operations (since Linux 2.6.37, CAP_SYSLOG should be used to permit such - * operations). + *
    • Perform a range of system administration operations including: quotactl(2), mount(2), umount(2), swapon(2), swapoff(2), + * sethostname(2), and setdomainname(2). + *
    • Perform privileged syslog(2) operations (since Linux 2.6.37, CAP_SYSLOG should be used to permit such operations). *
    • Perform VM86_REQUEST_IRQ vm86(2) command. *
    • Perform IPC_SET and IPC_RMID operations on arbitrary System V IPC objects. *
    • Perform operations on trusted and security Extended Attributes (see attr(5)). *
    • Use lookup_dcookie(2) - *
    • Use ioprio_set(2) to assign IOPRIO_CLASS_RT and (before Linux 2.6.25) IOPRIO_CLASS_IDLE I/O scheduling - * classes. + *
    • Use ioprio_set(2) to assign IOPRIO_CLASS_RT and (before Linux 2.6.25) IOPRIO_CLASS_IDLE I/O scheduling classes. *
    • Forge UID when passing socket credentials. - *
    • Exceed /proc/sys/fs/file-max, the system-wide limit on the number of open files, in system calls that open - * files (e.g., accept(2), execve(2), open(2), pipe(2)). + *
    • Exceed /proc/sys/fs/file-max, the system-wide limit on the number of open files, in system calls that open files (e.g., + * accept(2), execve(2), open(2), pipe(2)). *
    • Employ CLONE_* flags that create new namespaces with clone(2) and unshare(2). *
    • Call perf_event_open(2). *
    • Access privileged perf event information. @@ -181,8 +174,7 @@ public enum Capability { *
    • Call fanotify_init(2). *
    • Perform KEYCTL_CHOWN and KEYCTL_SETPERM keyctl(2) operations. *
    • Perform madvise(2) MADV_HWPOISON operation. - *
    • Employ the TIOCSTI ioctl(2) to insert characters into the input queue of a terminal other than the caller's - * controlling terminal. + *
    • Employ the TIOCSTI ioctl(2) to insert characters into the input queue of a terminal other than the caller's controlling terminal. *
    • Employ the obsolete nfsservctl(2) system call. *
    • Employ the obsolete bdflush(2) system call. *
    • Perform various privileged block-device ioctl(2) operations. @@ -202,8 +194,8 @@ public enum Capability { /** *
        *
      • Perform privileged syslog(2) operations. See syslog(2) for information on which operations require privilege. - *
      • View kernel addresses exposed via /proc and other interfaces when /proc/sys/kernel/kptr_restrict has the - * value 1. (See the discussion of the kptr_restrict in proc(5).) + *
      • View kernel addresses exposed via /proc and other interfaces when /proc/sys/kernel/kptr_restrict has the value 1. (See the + * discussion of the kptr_restrict in proc(5).) *
      */ SYSLOG, @@ -217,8 +209,8 @@ public enum Capability { /** *
        *
      • Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. - *
      • Set real-time scheduling policies for calling process, and set scheduling policies and priorities for - * arbitrary processes (sched_setscheduler(2), sched_setparam(2)). + *
      • Set real-time scheduling policies for calling process, and set scheduling policies and priorities for arbitrary processes + * (sched_setscheduler(2), sched_setparam(2)). *
      • Set CPU affinity for arbitrary processes (sched_setaffinity(2)). *
      • Set I/O scheduling class and priority for arbitrary processes (ioprio_set(2)). *
      • Apply migrate_pages(2) to arbitrary processes and allow processes to be migrated to arbitrary nodes. @@ -265,10 +257,8 @@ public enum Capability { *
      • Override maximum number of consoles on console allocation. *
      • Override maximum number of keymaps. *
      • Allow more than 64hz interrupts from the real-time clock. - *
      • Raise msg_qbytes limit for a System V message queue above the limit in /proc/sys/kernel/msgmnb (see msgop(2) - * and msgctl(2)). - *
      • Override the /proc/sys/fs/pipe-size-max limit when setting the capacity of a pipe using the F_SETPIPE_SZ - * fcntl(2) command. + *
      • Raise msg_qbytes limit for a System V message queue above the limit in /proc/sys/kernel/msgmnb (see msgop(2) and msgctl(2)). + *
      • Override the /proc/sys/fs/pipe-size-max limit when setting the capacity of a pipe using the F_SETPIPE_SZ fcntl(2) command. *
      • Use F_SETPIPE_SZ to increase the capacity of a pipe above the limit specified by /proc/sys/fs/pipe-max-size. *
      • Override /proc/sys/fs/mqueue/queues_max limit when creating POSIX message queues (see mq_overview(7)). *
      • Employ prctl(2) PR_SET_MM operation. 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 1ec0f433d..202f5a350 100644 --- a/src/main/java/com/github/dockerjava/api/model/Event.java +++ b/src/main/java/com/github/dockerjava/api/model/Event.java @@ -36,8 +36,7 @@ public Event() { * Container ID * @param status * Status string. List of statuses is available in Docker - * API v.1.16 + * href="https://docs.docker.com/reference/api/docker_remote_api_v1.16/#monitor-dockers-events">Docker API v.1.16 * @param from * Image, from which the container has been created * @param time @@ -53,8 +52,7 @@ public Event(String status, String id, String from, Long time) { /** * Status of docker image or container. List of statuses is available in Docker API - * v.1.16 + * href="https://docs.docker.com/reference/api/docker_remote_api_v1.16/#monitor-dockers-events">Docker API v.1.16 * * @return Status string */ 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 43ee92291..25829b8aa 100644 --- a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java +++ b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java @@ -24,9 +24,9 @@ import com.github.dockerjava.api.model.Ports.Binding; /** - * Represents a container port that Docker exposes to external clients. The port is defined by its {@link #getPort() - * port number} and an {@link InternetProtocol}. It can be published by Docker by - * {@link Ports#bind(ExposedPort, Binding) binding} it to a host port, represented by a {@link Binding}. + * Represents a container port that Docker exposes to external clients. The port is defined by its {@link #getPort() port number} and an + * {@link InternetProtocol}. It can be published by Docker by {@link Ports#bind(ExposedPort, Binding) binding} it to a host port, + * represented by a {@link Binding}. */ @JsonDeserialize(using = ExposedPort.Deserializer.class) @JsonSerialize(using = ExposedPort.Serializer.class) @@ -123,12 +123,12 @@ public static ExposedPort parse(String serialized) throws IllegalArgumentExcepti try { String[] parts = serialized.split("/"); switch (parts.length) { - case 1: - return new ExposedPort(Integer.valueOf(parts[0])); - case 2: - return new ExposedPort(Integer.valueOf(parts[0]), InternetProtocol.parse(parts[1])); - default: - throw new IllegalArgumentException(); + case 1: + return new ExposedPort(Integer.valueOf(parts[0])); + case 2: + return new ExposedPort(Integer.valueOf(parts[0]), InternetProtocol.parse(parts[1])); + default: + throw new IllegalArgumentException(); } } catch (Exception e) { throw new IllegalArgumentException("Error parsing ExposedPort '" + serialized + "'"); @@ -136,8 +136,8 @@ public static ExposedPort parse(String serialized) throws IllegalArgumentExcepti } /** - * Returns a string representation of this {@link ExposedPort} suitable for inclusion in a JSON message. The format - * is port/protocol, like the argument in {@link #parse(String)}. + * Returns a string representation of this {@link ExposedPort} suitable for inclusion in a JSON message. The format is + * port/protocol, like the argument in {@link #parse(String)}. * * @return a string representation of this {@link ExposedPort} */ 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 e398ec255..0ad16e8c6 100644 --- a/src/main/java/com/github/dockerjava/api/model/Frame.java +++ b/src/main/java/com/github/dockerjava/api/model/Frame.java @@ -28,7 +28,7 @@ public String toString() { return String.format("%s: %s", streamType, new String(payload).trim()); } - //CHECKSTYLE:OFF + // CHECKSTYLE:OFF @Override public boolean equals(Object o) { if (this == o) @@ -48,5 +48,5 @@ public int hashCode() { result = 31 * result + Arrays.hashCode(payload); return result; } - //CHECKSTYLE:ON + // CHECKSTYLE:ON } 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 ed5100e25..1051d857f 100644 --- a/src/main/java/com/github/dockerjava/api/model/Identifier.java +++ b/src/main/java/com/github/dockerjava/api/model/Identifier.java @@ -22,8 +22,8 @@ public Identifier(Repository repository, String tag) { } /** - * Return an identifier that correctly splits up the repository and tag. There can be > 1 ":" fred/jim --> - * fred/jim, [] fred/jim:123 --> fred/jim, 123 fred:123/jim:123 --> fred:123/jim, 123 + * Return an identifier that correctly splits up the repository and tag. There can be > 1 ":" fred/jim --> fred/jim, [] + * fred/jim:123 --> fred/jim, 123 fred:123/jim:123 --> fred:123/jim, 123 * * * @param identifier diff --git a/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java b/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java index e3ef2b98c..2bb4db285 100644 --- a/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java +++ b/src/main/java/com/github/dockerjava/api/model/InternetProtocol.java @@ -23,8 +23,8 @@ public enum InternetProtocol { public static final InternetProtocol DEFAULT = TCP; /** - * Returns a string representation of this {@link InternetProtocol} suitable for inclusion in a JSON message. The - * output is the lowercased name of the Protocol, e.g. tcp. + * Returns a string representation of this {@link InternetProtocol} suitable for inclusion in a JSON message. The output is the + * lowercased name of the Protocol, e.g. tcp. * * @return a string representation of this {@link InternetProtocol} */ 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 f647438a9..89647306c 100644 --- a/src/main/java/com/github/dockerjava/api/model/Link.java +++ b/src/main/java/com/github/dockerjava/api/model/Link.java @@ -4,10 +4,9 @@ import org.apache.commons.lang.builder.HashCodeBuilder; /** - * 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. + * 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 { @@ -55,14 +54,14 @@ public static Link parse(final String serialized) throws IllegalArgumentExceptio try { final String[] parts = serialized.split(":"); switch (parts.length) { - case 2: { - String[] nameSplit = parts[0].split("/"); - String[] aliasSplit = parts[1].split("/"); - return new Link(nameSplit[nameSplit.length - 1], aliasSplit[aliasSplit.length - 1]); - } - default: { - throw new IllegalArgumentException(); - } + case 2: { + String[] nameSplit = parts[0].split("/"); + String[] aliasSplit = parts[1].split("/"); + return new Link(nameSplit[nameSplit.length - 1], aliasSplit[aliasSplit.length - 1]); + } + default: { + throw new IllegalArgumentException(); + } } } catch (final Exception e) { throw new IllegalArgumentException("Error parsing Link '" + serialized + "'"); @@ -85,8 +84,8 @@ public int hashCode() { } /** - * Returns a string representation of this {@link Link} suitable for inclusion in a JSON message. The format is - * name:alias, like the argument in {@link #parse(String)}. + * Returns a string representation of this {@link Link} suitable for inclusion in a JSON message. The format is name:alias, + * like the argument in {@link #parse(String)}. * * @return a string representation of this {@link Link} */ 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 669bbc554..cf9cdc1ee 100644 --- a/src/main/java/com/github/dockerjava/api/model/LogConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/LogConfig.java @@ -22,9 +22,9 @@ * * json-file (default) syslog journald none * - * If a driver is specified that is NOT supported,docker will default to null. If configs are supplied that are not - * supported by the type 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. + * If a driver is specified that is NOT supported,docker will default to null. If configs are supplied that are not supported by the type + * 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 { 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 d62d83019..546904254 100644 --- a/src/main/java/com/github/dockerjava/api/model/Network.java +++ b/src/main/java/com/github/dockerjava/api/model/Network.java @@ -149,6 +149,6 @@ public String getIpRange() { public String getGateway() { return gateway; } - } + } } } 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 81f94ca06..e163272d7 100644 --- a/src/main/java/com/github/dockerjava/api/model/PortBinding.java +++ b/src/main/java/com/github/dockerjava/api/model/PortBinding.java @@ -7,13 +7,13 @@ import com.github.dockerjava.api.model.Ports.Binding; /** - * 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 similar) CLI command for adding port bindings to a container. + * 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 + * similar) CLI command for adding port bindings to a container. *

        - * Note: This is an abstraction used for creating new port bindings. It is not to be confused with the abstraction - * used for querying existing port bindings from a container configuration in {@link NetworkSettings#getPorts()} and - * {@link HostConfig#getPortBindings()}. In that context, a Map<ExposedPort, Binding[]> is used. + * Note: This is an abstraction used for creating new port bindings. It is not to be confused with the abstraction used for querying + * 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 { private final Binding binding; @@ -37,17 +37,17 @@ public static PortBinding parse(String serialized) throws IllegalArgumentExcepti try { String[] parts = StringUtils.splitByWholeSeparator(serialized, ":"); switch (parts.length) { - case 3: - // 127.0.0.1:80:8080/tcp - return createFromSubstrings(parts[0] + ":" + parts[1], parts[2]); - case 2: - // 80:8080 // 127.0.0.1::8080 - return createFromSubstrings(parts[0], parts[1]); - case 1: - // 8080 - return createFromSubstrings("", parts[0]); - default: - throw new IllegalArgumentException(); + case 3: + // 127.0.0.1:80:8080/tcp + return createFromSubstrings(parts[0] + ":" + parts[1], parts[2]); + case 2: + // 80:8080 // 127.0.0.1::8080 + return createFromSubstrings(parts[0], parts[1]); + case 1: + // 8080 + return createFromSubstrings("", parts[0]); + default: + throw new IllegalArgumentException(); } } catch (Exception e) { throw new IllegalArgumentException("Error parsing PortBinding '" + serialized + "'", e); 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 6bbb05fa2..e0250bba1 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ports.java +++ b/src/main/java/com/github/dockerjava/api/model/Ports.java @@ -27,13 +27,13 @@ /** * A container for port bindings, made available as a {@link Map} via its {@link #getBindings()} method. *

        - * Note: This is an abstraction used for querying existing port bindings from a container configuration. It is not to - * be confused with the {@link PortBinding} abstraction used for adding new port bindings to a container. + * Note: This is an abstraction used for querying existing port bindings from a container configuration. It is not to be confused with + * the {@link PortBinding} abstraction used for adding new port bindings to a container. * * @see HostConfig#getPortBindings() * @see NetworkSettings#getPorts() */ -@SuppressWarnings(value = "checkstyle:equalshashcode") //FIXME? +@SuppressWarnings(value = "checkstyle:equalshashcode") @JsonDeserialize(using = Ports.Deserializer.class) @JsonSerialize(using = Ports.Serializer.class) public class Ports { @@ -41,16 +41,15 @@ public class Ports { private final Map ports = new HashMap(); /** - * Creates a {@link Ports} object with no {@link PortBinding}s. Use {@link #bind(ExposedPort, Binding)} or - * {@link #add(PortBinding...)} to add {@link PortBinding}s. + * Creates a {@link Ports} object with no {@link PortBinding}s. Use {@link #bind(ExposedPort, Binding)} or {@link #add(PortBinding...)} + * to add {@link PortBinding}s. */ public Ports() { } /** - * Creates a {@link Ports} object with an initial {@link PortBinding} for the specified {@link ExposedPort} and - * {@link Binding}. Use {@link #bind(ExposedPort, Binding)} or {@link #add(PortBinding...)} to add more - * {@link PortBinding}s. + * Creates a {@link Ports} object with an initial {@link PortBinding} for the specified {@link ExposedPort} and {@link Binding}. Use + * {@link #bind(ExposedPort, Binding)} or {@link #add(PortBinding...)} to add more {@link PortBinding}s. */ public Ports(ExposedPort exposedPort, Binding host) { bind(exposedPort, host); @@ -71,7 +70,7 @@ public void bind(ExposedPort exposedPort, Binding binding) { if (binding == null) { ports.put(exposedPort, null); } else { - ports.put(exposedPort, new Binding[]{binding}); + ports.put(exposedPort, new Binding[] {binding}); } } } @@ -91,8 +90,7 @@ public String toString() { } /** - * Returns the port bindings in the format used by the Docker remote API, i.e. the {@link Binding}s grouped by - * {@link ExposedPort}. + * Returns the port bindings in the format used by the Docker remote API, i.e. the {@link Binding}s grouped by {@link ExposedPort}. * * @return the port bindings as a {@link Map} that contains one or more {@link Binding}s per {@link ExposedPort}. */ @@ -125,9 +123,9 @@ public static Binding binding(Integer hostPort) { } /** - * A {@link Binding} represents a socket on the Docker host that is used in a {@link PortBinding}. It is - * characterized by an {@link #getHostIp() IP address} and a {@link #getHostPort() port number}. Both properties may - * be null in order to let Docker assign them dynamically/using defaults. + * A {@link Binding} represents a socket on the Docker host that is used in a {@link PortBinding}. It is characterized by an + * {@link #getHostIp() IP address} and a {@link #getHostPort() port number}. Both properties may be null in order to let + * Docker assign them dynamically/using defaults. * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort @@ -139,8 +137,7 @@ public static class Binding { private final Integer hostPort; /** - * Creates a {@link Binding} for the given {@link #getHostIp() IP address} and {@link #getHostPort() port - * number}. + * Creates a {@link Binding} for the given {@link #getHostIp() IP address} and {@link #getHostPort() port number}. * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort @@ -151,8 +148,8 @@ public Binding(String hostIp, Integer hostPort) { } /** - * Creates a {@link Binding} for the given {@link #getHostPort() port number}, leaving the {@link #getHostIp() - * IP address} undefined. + * Creates a {@link Binding} for the given {@link #getHostPort() port number}, leaving the {@link #getHostIp() IP address} + * undefined. * * @see Ports#bind(ExposedPort, Binding) * @see ExposedPort @@ -162,32 +159,30 @@ public Binding(Integer hostPort) { } /** - * Creates a {@link Binding} for the given {@link #getHostIp() IP address}, leaving the {@link #getHostPort() - * port number} undefined. + * Creates a {@link Binding} for the given {@link #getHostIp() IP address}, leaving the {@link #getHostPort() port number} + * undefined. */ public Binding(String hostIp) { this(hostIp, null); } /** - * Creates a {@link Binding} with both {@link #getHostIp() IP address} and {@link #getHostPort() port number} - * undefined. + * Creates a {@link Binding} with both {@link #getHostIp() IP address} and {@link #getHostPort() port number} undefined. */ public Binding() { this(null, null); } /** - * @return the IP address on the Docker host. May be null, in which case Docker will bind the port - * to all interfaces (0.0.0.0). + * @return the IP address on the Docker host. May be null, in which case Docker will bind the port to all interfaces ( + * 0.0.0.0). */ public String getHostIp() { return hostIp; } /** - * @return the port number on the Docker host. May be null, in which case Docker will dynamically - * assign a port. + * @return the port number on the Docker host. May be null, in which case Docker will dynamically assign a port. */ public Integer getHostPort() { return hostPort; @@ -212,15 +207,15 @@ public static Binding parse(String serialized) throws IllegalArgumentException { String[] parts = serialized.split(":"); switch (parts.length) { - case 2: { - return new Binding(parts[0], Integer.valueOf(parts[1])); - } - case 1: { - return parts[0].contains(".") ? new Binding(parts[0]) : new Binding(Integer.valueOf(parts[0])); - } - default: { - throw new IllegalArgumentException(); - } + case 2: { + return new Binding(parts[0], Integer.valueOf(parts[1])); + } + case 1: { + return parts[0].contains(".") ? new Binding(parts[0]) : new Binding(Integer.valueOf(parts[0])); + } + default: { + throw new IllegalArgumentException(); + } } } catch (Exception e) { throw new IllegalArgumentException("Error parsing Binding '" + serialized + "'"); @@ -228,8 +223,8 @@ public static Binding parse(String serialized) throws IllegalArgumentException { } /** - * Returns a string representation of this {@link Binding} suitable for inclusion in a JSON message. The format - * is [IP:]Port, like the argument in {@link #parse(String)}. + * Returns a string representation of this {@link Binding} suitable for inclusion in a JSON message. The format is + * [IP:]Port, like the argument in {@link #parse(String)}. * * @return a string representation of this {@link Binding} */ 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 d5c8f6e8e..ac6c4a318 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -15,8 +15,7 @@ *

        Do not restart the container if it dies. (default)
        * *
        on-failure
        - *
        Restart the container if it exits with a non-zero exit code. Can also accept an optional maximum restart count - * (e.g. on-failure:5). + *
        Restart the container if it exits with a non-zero exit code. Can also accept an optional maximum restart count (e.g. on-failure:5). *
        * *
        always
        @@ -111,8 +110,8 @@ public static RestartPolicy parse(String serialized) throws IllegalArgumentExcep } /** - * Returns a string representation of this {@link RestartPolicy}. The format is name[:count], like the - * argument in {@link #parse(String)}. + * Returns a string representation of this {@link RestartPolicy}. The format is name[:count], like the argument in + * {@link #parse(String)}. * * @return a string representation of this {@link RestartPolicy} */ 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 51602e043..7427fb0cc 100644 --- a/src/main/java/com/github/dockerjava/api/model/Ulimit.java +++ b/src/main/java/com/github/dockerjava/api/model/Ulimit.java @@ -45,7 +45,7 @@ public Integer getHard() { return hard; } - //CHECKSTYLE:OFF + // CHECKSTYLE:OFF @Override public boolean equals(Object obj) { if (obj instanceof Ulimit) { @@ -61,5 +61,5 @@ public boolean equals(Object obj) { public int hashCode() { return new HashCodeBuilder().append(name).append(soft).append(hard).toHashCode(); } - //CHECKSTYLE:ON + // CHECKSTYLE:ON } 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 3709d1b0c..7c4bdfb26 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeRW.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeRW.java @@ -53,8 +53,8 @@ public AccessMode getAccessMode() { } /** - * Returns a string representation of this {@link VolumeRW} suitable for inclusion in a JSON message. The returned - * String is simply the container path, {@link #getPath()}. + * Returns a string representation of this {@link VolumeRW} suitable for inclusion in a JSON message. The returned String is simply the + * container path, {@link #getPath()}. * * @return a string representation of this {@link VolumeRW} */ 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 78585ef48..f027b6d71 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumesFrom.java @@ -55,16 +55,16 @@ public static VolumesFrom parse(String serialized) { try { String[] parts = serialized.split(":"); switch (parts.length) { - case 1: { - return new VolumesFrom(parts[0]); - } - case 2: { - return new VolumesFrom(parts[0], AccessMode.valueOf(parts[1])); - } - - default: { - throw new IllegalArgumentException(); - } + case 1: { + return new VolumesFrom(parts[0]); + } + case 2: { + return new VolumesFrom(parts[0], AccessMode.valueOf(parts[1])); + } + + default: { + throw new IllegalArgumentException(); + } } } catch (Exception e) { throw new IllegalArgumentException("Error parsing Bind '" + serialized + "'"); @@ -88,8 +88,8 @@ public int hashCode() { } /** - * Returns a string representation of this {@link VolumesFrom} suitable for inclusion in a JSON message. The format - * is <container>:<access mode>, like the argument in {@link #parse(String)}. + * Returns a string representation of this {@link VolumesFrom} suitable for inclusion in a JSON message. The format is + * <container>:<access mode>, like the argument in {@link #parse(String)}. * * @return a string representation of this {@link VolumesFrom} */ diff --git a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java index 7315a05af..1a4ef5a47 100644 --- a/src/main/java/com/github/dockerjava/core/AuthConfigFile.java +++ b/src/main/java/com/github/dockerjava/core/AuthConfigFile.java @@ -63,7 +63,7 @@ public AuthConfigurations getAuthConfigurations() { return authConfigurations; } - //CHECKSTYLE:OFF + // CHECKSTYLE:OFF @Override public int hashCode() { final int prime = 31; @@ -88,7 +88,8 @@ public boolean equals(Object obj) { return false; return true; } - //CHECKSTYLE:ON + + // CHECKSTYLE:ON @Override public String toString() { diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 35f54c736..89c4d3787 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -178,10 +178,11 @@ private static Properties overrideDockerPropertiesWithSystemProperties(Propertie Properties overriddenProperties = new Properties(); overriddenProperties.putAll(p); - for (String key : new String[]{DOCKER_IO_URL_PROPERTY, DOCKER_IO_VERSION_PROPERTY, + for (String key : new String[] { + DOCKER_IO_URL_PROPERTY, DOCKER_IO_VERSION_PROPERTY, DOCKER_IO_USERNAME_PROPERTY, DOCKER_IO_PASSWORD_PROPERTY, DOCKER_IO_EMAIL_PROPERTY, DOCKER_IO_SERVER_ADDRESS_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, - DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, }) { + DOCKER_IO_DOCKER_CFG_PATH_PROPERTY}) { if (systemProperties.containsKey(key)) { overriddenProperties.setProperty(key, systemProperties.getProperty(key)); } @@ -295,7 +296,7 @@ public AuthConfigurations getAuthConfigurations() { return new AuthConfigurations(); } - //CHECKSTYLE:OFF + // CHECKSTYLE:OFF @Override public boolean equals(Object o) { if (this == o) @@ -337,7 +338,8 @@ public int hashCode() { result = 31 * result + (sslConfig != null ? sslConfig.hashCode() : 0); return result; } - //CHECKSTYLE:ON + + // CHECKSTYLE:ON @Override public String toString() { @@ -354,10 +356,9 @@ public static class DockerClientConfigBuilder { private SSLConfig sslConfig; /** - * This will set all fields in the builder to those contained in the Properties object. The Properties object - * should contain the following docker.io.* keys: url, version, username, password, email, dockerCertPath, and - * dockerCfgPath. If docker.io.readTimeout or docker.io.enableLoggingFilter are not contained, they will be set - * to 1000 and true, respectively. + * This will set all fields in the builder to those contained in the Properties object. The Properties object should contain the + * following docker.io.* keys: url, version, username, password, email, dockerCertPath, and dockerCfgPath. If docker.io.readTimeout + * or docker.io.enableLoggingFilter are not contained, they will be set to 1000 and true, respectively. */ public DockerClientConfigBuilder withProperties(Properties p) { return withUri(p.getProperty(DOCKER_IO_URL_PROPERTY)) diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index 7bed65c5b..5dabdf404 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -116,22 +116,22 @@ static ScanResult scanChunk(String pattern) { int i; Scan: for (i = 0; i < pattern.length(); i++) { switch (pattern.charAt(i)) { - case '\\': { - if (!IS_WINDOWS && i + 1 < pattern.length()) { - i++; - } - break; - } - case '[': - inRange = true; - break; - case ']': - inRange = false; - break; - case '*': - if (!inRange) { - break Scan; + case '\\': { + if (!IS_WINDOWS && i + 1 < pattern.length()) { + i++; + } + break; } + case '[': + inRange = true; + break; + case ']': + inRange = false; + break; + case '*': + if (!inRange) { + break Scan; + } } } return new ScanResult(star, pattern.substring(0, i), pattern.substring(i)); @@ -148,68 +148,68 @@ static String matchChunk(String chunk, String s) { return null; } switch (chunk.charAt(chunkOffset)) { - 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) { + case '[': + r = s.charAt(sOffset); + sOffset++; chunkOffset++; - } - // parse all ranges - boolean match = false; - int nrange = 0; - while (true) { - if (chunkOffset < chunkLength && chunk.charAt(chunkOffset) == ']' && nrange > 0) { + // 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++; - break; } - 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); + // parse all ranges + boolean match = false; + int nrange = 0; + while (true) { + if (chunkOffset < chunkLength && chunk.charAt(chunkOffset) == ']' && nrange > 0) { + chunkOffset++; + break; + } + GetEscResult result = getEsc(chunk, chunkOffset, chunkLength); + char lo = result.lo; + char hi = lo; chunkOffset = result.chunkOffset; - hi = result.lo; + if (chunk.charAt(chunkOffset) == '-') { + result = getEsc(chunk, ++chunkOffset, chunkLength); + chunkOffset = result.chunkOffset; + hi = result.lo; + } + if (lo <= r && r <= hi) { + match = true; + } + nrange++; } - if (lo <= r && r <= hi) { - match = true; + if (match == negated) { + return null; } - nrange++; - } - if (match == negated) { - return null; - } - break; + break; - case '?': - if (s.charAt(sOffset) == File.separatorChar) { - return null; - } - sOffset++; - chunkOffset++; - break; - case '\\': - if (!IS_WINDOWS) { + case '?': + if (s.charAt(sOffset) == File.separatorChar) { + return null; + } + sOffset++; chunkOffset++; - if (chunkOffset == chunkLength) { - throw new GoLangFileMatchException(); + break; + case '\\': + if (!IS_WINDOWS) { + chunkOffset++; + if (chunkOffset == chunkLength) { + throw new GoLangFileMatchException(); + } } - } - // fallthrough - default: - if (chunk.charAt(chunkOffset) != s.charAt(sOffset)) { - return null; - } - sOffset++; - chunkOffset++; + // fallthrough + default: + if (chunk.charAt(chunkOffset) != s.charAt(sOffset)) { + return null; + } + sOffset++; + chunkOffset++; } } return s.substring(sOffset); diff --git a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index bdc2e6e89..43946a53b 100644 --- a/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -88,22 +88,24 @@ public SSLContext getSSLContext() throws KeyManagementException, UnrecoverableKe final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory .getDefaultAlgorithm()); keyManagerFactory.init(keystore, keystorePassword.toCharArray()); - context.init(keyManagerFactory.getKeyManagers(), new TrustManager[]{new X509TrustManager() { - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[] {}; - } + context.init(keyManagerFactory.getKeyManagers(), new TrustManager[] { + new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[] {}; + } - @Override - public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) { + @Override + public void checkClientTrusted(final X509Certificate[] arg0, final String arg1) { - } + } - @Override - public void checkServerTrusted(final X509Certificate[] arg0, final String arg1) { + @Override + public void checkServerTrusted(final X509Certificate[] arg0, final String arg1) { - } - } }, new SecureRandom()); + } + } + }, new SecureRandom()); return context; } diff --git a/src/main/java/com/github/dockerjava/core/NameParser.java b/src/main/java/com/github/dockerjava/core/NameParser.java index 5027422fd..1db59e3a0 100644 --- a/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/src/main/java/com/github/dockerjava/core/NameParser.java @@ -17,14 +17,15 @@ public class NameParser { private NameParser() { } - //CHECKSTYLE:OFF + // CHECKSTYLE:OFF private static final int RepositoryNameTotalLengthMax = 255; private static final Pattern RepositoryNameComponentRegexp = Pattern.compile("[a-z0-9]+(?:[._-][a-z0-9]+)*"); private static final Pattern RepositoryNameComponentAnchoredRegexp = Pattern.compile("^" + RepositoryNameComponentRegexp.pattern() + "$"); - //CHECKSTYLE:ON + + // CHECKSTYLE:ON // private static final Pattern RepositoryNameRegexp = Pattern.compile("(?:" + // RepositoryNameComponentRegexp.pattern() diff --git a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index 80f9406b7..4a264ab17 100644 --- a/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -10,8 +10,8 @@ import com.google.common.base.Strings; /** - * Bean to encapsulate the version of the Docker Remote (REST) API + * Bean to encapsulate the version of the Docker Remote (REST) + * API *

        * Contains the minor and major version of the API as well as operations to compare API versions. * @@ -53,14 +53,12 @@ public class RemoteApiVersion implements Serializable { public static final RemoteApiVersion VERSION_1_21 = RemoteApiVersion.create(1, 21); /** - * @see Docker - * API 1.22 + * @see Docker API 1.22 */ public static final RemoteApiVersion VERSION_1_22 = RemoteApiVersion.create(1, 22); /** - * Unknown, docker doesn't reflect reality. I.e. we implemented method, but for javadoc it not clear when it was - * added. + * Unknown, docker doesn't reflect reality. I.e. we implemented method, but for javadoc it not clear when it was added. */ private static final RemoteApiVersion UNKNOWN_VERSION = new RemoteApiVersion(0, 0) { @@ -127,7 +125,7 @@ public boolean isGreaterOrEqual(final RemoteApiVersion other) { return false; } - //CHECKSTYLE:OFF + // CHECKSTYLE:OFF @Override public boolean equals(final Object o) { if (this == o) @@ -137,7 +135,8 @@ public boolean equals(final Object o) { final RemoteApiVersion that = (RemoteApiVersion) o; return Objects.equal(major, that.major) && Objects.equal(minor, that.minor); } - //CHECKSTYLE:ON + + // CHECKSTYLE:ON @Override public int hashCode() { 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 0e146c1e9..edbf49827 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -103,8 +103,8 @@ public RC_T awaitCompletion(long timeout, TimeUnit timeUnit) throws InterruptedE } /** - * Blocks until {@link ResultCallback#onStart()} was called. {@link ResultCallback#onStart()} is called when the - * request was processed on the server side and the response is incoming. + * Blocks until {@link ResultCallback#onStart()} was called. {@link ResultCallback#onStart()} is called when the request was processed + * on the server side and the response is incoming. */ @SuppressWarnings("unchecked") public RC_T awaitStarted() throws InterruptedException { @@ -113,9 +113,8 @@ public RC_T awaitStarted() throws InterruptedException { } /** - * Blocks until {@link ResultCallback#onStart()} was called or the given timeout occurs. - * {@link ResultCallback#onStart()} is called when the request was processed on the server side and the response is - * incoming. + * Blocks until {@link ResultCallback#onStart()} was called or the given timeout occurs. {@link ResultCallback#onStart()} is called when + * the request was processed on the server side and the response is incoming. */ @SuppressWarnings("unchecked") public RC_T awaitStarted(long timeout, TimeUnit timeUnit) throws InterruptedException { 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 cfb6cce14..7014704b1 100644 --- a/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ConnectToNetworkCmdImpl.java @@ -27,12 +27,14 @@ public String getContainerId() { return containerId; } - @Override public ConnectToNetworkCmd withNetworkId(String networkId) { + @Override + public ConnectToNetworkCmd withNetworkId(String networkId) { this.networkId = networkId; return this; } - @Override public ConnectToNetworkCmd withContainerId(String containerId) { + @Override + public ConnectToNetworkCmd withContainerId(String containerId) { this.containerId = containerId; 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 fba16dfb9..c7d3b0abb 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java @@ -1,6 +1,5 @@ package com.github.dockerjava.core.command; - import java.util.HashMap; import java.util.Map; @@ -12,7 +11,7 @@ import com.github.dockerjava.api.model.Network.Ipam; public class CreateNetworkCmdImpl extends AbstrDockerCmd - implements CreateNetworkCmd { + implements CreateNetworkCmd { @JsonProperty("Name") private String name; 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 a89201ad2..ae24946b6 100644 --- a/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/DisconnectFromNetworkCmdImpl.java @@ -6,7 +6,7 @@ import com.github.dockerjava.api.command.DockerCmdSyncExec; public class DisconnectFromNetworkCmdImpl extends AbstrDockerCmd - implements DisconnectFromNetworkCmd { + implements DisconnectFromNetworkCmd { @JsonIgnore private String networkId; @@ -28,12 +28,14 @@ public String getContainerId() { return containerId; } - @Override public DisconnectFromNetworkCmd withNetworkId(String networkId) { + @Override + public DisconnectFromNetworkCmd withNetworkId(String networkId) { this.networkId = networkId; return this; } - @Override public DisconnectFromNetworkCmd withContainerId(String containerId) { + @Override + public DisconnectFromNetworkCmd withContainerId(String containerId) { this.containerId = containerId; return this; } diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 836c9158e..01532090a 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -61,7 +61,6 @@ public InputStream getStdin() { return stdin; } - @Override public ExecStartCmd withDetach(Boolean detach) { this.detach = detach; diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java index 62e492db9..847d62057 100644 --- a/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartResultCallback.java @@ -34,21 +34,21 @@ public void onNext(Frame frame) { if (frame != null) { try { switch (frame.getStreamType()) { - case STDOUT: - case RAW: - if (stdout != null) { - stdout.write(frame.getPayload()); - stdout.flush(); - } - break; - case STDERR: - if (stderr != null) { - stderr.write(frame.getPayload()); - stderr.flush(); - } - break; - default: - LOGGER.error("unknown stream type:" + frame.getStreamType()); + case STDOUT: + case RAW: + if (stdout != null) { + stdout.write(frame.getPayload()); + stdout.flush(); + } + break; + case STDERR: + if (stderr != null) { + stderr.write(frame.getPayload()); + stderr.flush(); + } + break; + default: + LOGGER.error("unknown stream type:" + frame.getStreamType()); } } catch (IOException e) { onError(e); diff --git a/src/main/java/com/github/dockerjava/core/command/FrameReader.java b/src/main/java/com/github/dockerjava/core/command/FrameReader.java index 0e885082a..1e8ac0930 100644 --- a/src/main/java/com/github/dockerjava/core/command/FrameReader.java +++ b/src/main/java/com/github/dockerjava/core/command/FrameReader.java @@ -22,21 +22,20 @@ public class FrameReader implements AutoCloseable { private Boolean rawStreamDetected = false; - public FrameReader(InputStream inputStream) { this.inputStream = inputStream; } private static StreamType streamType(byte streamType) { switch (streamType) { - case 0: - return StreamType.STDIN; - case 1: - return StreamType.STDOUT; - case 2: - return StreamType.STDERR; - default: - return StreamType.RAW; + case 0: + return StreamType.STDIN; + case 1: + return StreamType.STDOUT; + case 2: + return StreamType.STDERR; + default: + return StreamType.RAW; } } diff --git a/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java index 0a0c564c5..7d9ef75b1 100644 --- a/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/InpectNetworkCmdImpl.java @@ -12,11 +12,13 @@ public InpectNetworkCmdImpl(DockerCmdSyncExec exec) super(exec); } - @Override public String getNetworkId() { + @Override + public String getNetworkId() { return networkId; } - @Override public InspectNetworkCmd withNetworkId(String networkId) { + @Override + public InspectNetworkCmd withNetworkId(String networkId) { this.networkId = networkId; return this; diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index f561a6deb..aa267fc8f 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -22,8 +22,8 @@ * @param tail * - `all` or ``, Output specified number of lines at the end of logs * @param since - * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that - * timestamp. Default: 0 (unfiltered) + * - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default: + * 0 (unfiltered) */ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd implements LogContainerCmd { 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 9a94d6b1d..8c1c34e2a 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -213,8 +213,8 @@ private List matchingIgnorePatterns(String fileName) { } /** - * Returns the matching ignore pattern for the given file or null if it should NOT be ignored. Exception rules - * like "!Dockerfile" will be respected. + * Returns the matching ignore pattern for the given file or null if it should NOT be ignored. Exception rules like "!Dockerfile" + * will be respected. */ private String effectiveMatchingIgnorePattern(File file) { String relativeFilename = FilePathUtil.relativize(getDockerFolder(), file); diff --git a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java index c63489d85..5052dda40 100644 --- a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java @@ -54,8 +54,8 @@ private static TarArchiveOutputStream buildTarStream(Path outputPath, boolean gZ * @param outputPath * where to put the archived file * @param childrenOnly - * if inputPath is directory and if childrenOnly is true, the archive will contain all of its children, - * else the archive contains unique entry which is the inputPath itself + * if inputPath is directory and if childrenOnly is true, the archive will contain all of its children, else the archive + * contains unique entry which is the inputPath itself * @param gZipped * compress with gzip algorithm */ diff --git a/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java index 7ad380481..4d71014dd 100644 --- a/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java +++ b/src/main/java/com/github/dockerjava/core/util/FiltersBuilder.java @@ -81,7 +81,7 @@ private static List labelsMapToList(Map labels) { return result; } - //CHECKSTYLE:OFF + // CHECKSTYLE:OFF @Override public boolean equals(Object o) { if (this == o) @@ -94,7 +94,8 @@ public boolean equals(Object o) { return filters.equals(filters1.filters); } - //CHECKSTYLE:ON + + // CHECKSTYLE:ON @Override public int hashCode() { diff --git a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java index e30028f34..a1b860b28 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ApacheUnixSocket.java @@ -35,13 +35,11 @@ import org.newsclub.net.unix.AFUNIXSocket; /** - * Provides a socket that wraps an org.newsclub.net.unix.AFUNIXSocket and delays setting options until the socket is - * connected. This is necessary because the Apache HTTP client attempts to set options prior to connecting the socket, - * which doesn't work for Unix sockets since options are being set on the underlying file descriptor. Until the socket - * is connected, the file descriptor doesn't exist. + * Provides a socket that wraps an org.newsclub.net.unix.AFUNIXSocket and delays setting options until the socket is connected. This is + * necessary because the Apache HTTP client attempts to set options prior to connecting the socket, which doesn't work for Unix sockets + * since options are being set on the underlying file descriptor. Until the socket is connected, the file descriptor doesn't exist. * - * This class also noop's any calls to setReuseAddress, which is called by the Apache client but isn't supported by - * AFUnixSocket. + * This class also noop's any calls to setReuseAddress, which is called by the Apache client but isn't supported by AFUnixSocket. */ public class ApacheUnixSocket extends Socket { diff --git a/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java index dfc730e03..8a69b31fd 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/ConnectToNetworkCmdExec.java @@ -11,7 +11,7 @@ import static javax.ws.rs.client.Entity.entity; public class ConnectToNetworkCmdExec extends AbstrSyncDockerCmdExec - implements ConnectToNetworkCmd.Exec { + implements ConnectToNetworkCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ConnectToNetworkCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java index 4f6f54576..95c3f5c22 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DisconnectFromNetworkCmdExec.java @@ -11,7 +11,7 @@ import static javax.ws.rs.client.Entity.entity; public class DisconnectFromNetworkCmdExec extends AbstrSyncDockerCmdExec - implements DisconnectFromNetworkCmd.Exec { + implements DisconnectFromNetworkCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(DisconnectFromNetworkCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java index c5e6b4d0a..c9b19f881 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/InspectNetworkCmdExec.java @@ -17,10 +17,11 @@ public InspectNetworkCmdExec(WebTarget baseResource, DockerClientConfig dockerCl super(baseResource, dockerClientConfig); } - @Override protected Network execute(InspectNetworkCmd command) { + @Override + protected Network execute(InspectNetworkCmd command) { WebTarget webResource = getBaseResource().path("/networks/{id}").resolveTemplate("id", - command.getNetworkId()); + command.getNetworkId()); LOGGER.debug("GET: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_JSON).get(Network.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java index 84f115d4c..acc2bdd27 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/RemoveNetworkCmdExec.java @@ -9,7 +9,7 @@ import javax.ws.rs.core.MediaType; public class RemoveNetworkCmdExec extends AbstrSyncDockerCmdExec - implements RemoveNetworkCmd.Exec { + implements RemoveNetworkCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(RemoveNetworkCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java index 7994f3261..68b47bfa8 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnector.java @@ -142,32 +142,29 @@ *

      • {@link ApacheClientProperties#SSL_CONFIG}
      • *
      *

      - * This connector uses {@link RequestEntityProcessing#CHUNKED chunked encoding} as a default setting. This can be - * overridden by the {@link ClientProperties#REQUEST_ENTITY_PROCESSING}. By default the - * {@link ClientProperties#CHUNKED_ENCODING_SIZE} property is only supported by using default connection manager. If - * custom connection manager needs to be used then chunked encoding size can be set by providing a custom - * {@link org.apache.http.HttpClientConnection} (via custom - * {@link org.apache.http.impl.conn.ManagedHttpClientConnectionFactory}) and overriding {@code createOutputStream} - * method. + * This connector uses {@link RequestEntityProcessing#CHUNKED chunked encoding} as a default setting. This can be overridden by the + * {@link ClientProperties#REQUEST_ENTITY_PROCESSING}. By default the {@link ClientProperties#CHUNKED_ENCODING_SIZE} property is only + * supported by using default connection manager. If custom connection manager needs to be used then chunked encoding size can be set by + * providing a custom {@link org.apache.http.HttpClientConnection} (via custom + * {@link org.apache.http.impl.conn.ManagedHttpClientConnectionFactory}) and overriding {@code createOutputStream} method. *

      *

      - * Using of authorization 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}. + * Using of authorization 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. + * {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called after processing the response to release connection-based + * resources. *

      *

      * Client operations are thread safe, the HTTP connection may be shared between different threads. *

      *

      - * If a response entity is obtained that is an instance of {@link Closeable} then the instance MUST be closed after - * processing the entity to release connection-based resources. + * If a response entity is obtained that is an instance of {@link 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. @@ -404,8 +401,7 @@ public HttpClient getHttpClient() { /** * Get the {@link CookieStore}. * - * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set - * to {@code true}. + * @return the {@link CookieStore} instance or {@code null} when {@value ApacheClientProperties#DISABLE_COOKIES} set to {@code true}. */ public CookieStore getCookieStore() { return cookieStore; diff --git a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java index 00deefe85..eafb55c29 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java +++ b/src/main/java/com/github/dockerjava/jaxrs/connector/ApacheConnectorProvider.java @@ -51,8 +51,8 @@ import org.glassfish.jersey.client.spi.ConnectorProvider; /** - * Connector provider for Jersey {@link Connector connectors} that utilize Apache HTTP Client to send and receive HTTP - * request and responses. + * Connector provider for Jersey {@link Connector connectors} that utilize Apache HTTP Client to send and receive HTTP request and + * responses. *

      * The following connector configuration properties are supported: *

        @@ -70,30 +70,28 @@ *
      *

      *

      - * 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. + * 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}. + * 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. + * {@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. + * 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. @@ -114,17 +112,16 @@ public Connector getConnector(Client client, Configuration 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}. + * 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}. + * {@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}. + * 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) { diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java index cb5cd0687..4a7765d97 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java @@ -9,9 +9,9 @@ import javax.ws.rs.core.Response; /** - * Default implementation of RedirectStrategy honors the restrictions on automatic redirection of entity enclosing - * methods such as POST and PUT imposed by the HTTP specification. 302 Moved Temporarily, 301 Moved Permanently and 307 - * Temporary Redirect status codes will result in an automatic redirect of HEAD and GET methods only. + * Default implementation of RedirectStrategy honors the restrictions on automatic redirection of entity enclosing methods such as POST and + * PUT imposed by the HTTP specification. 302 Moved Temporarily, 301 Moved Permanently and 307 Temporary Redirect status codes will result + * in an automatic redirect of HEAD and GET methods only. * * {@link org.apache.http.impl.client.DefaultRedirectStrategy} * diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java index 76666fe4e..8c9848318 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java @@ -116,8 +116,8 @@ public int compare(final Map.Entry> o1, final Map.Entry, RES_T> extends AbstrDockerCmdExec implements DockerCmdSyncExec { diff --git a/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java index eaba91fdb..e568345cd 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/CommitCmdExec.java @@ -28,7 +28,8 @@ protected String execute(CommitCmd command) { LOGGER.trace("POST: {}", webTarget); ObjectNode objectNode = webTarget.request().accept(MediaType.APPLICATION_JSON) - .post(command, new TypeReference() { }); + .post(command, new TypeReference() { + }); return objectNode.get("Id").asText(); } diff --git a/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java index b1090f4c3..b7bff9d52 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/ConnectToNetworkCmdExec.java @@ -6,9 +6,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; - public class ConnectToNetworkCmdExec extends AbstrSyncDockerCmdExec - implements ConnectToNetworkCmd.Exec { + implements ConnectToNetworkCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(ConnectToNetworkCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java index 0e182e8bc..8fd791f53 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/CreateImageCmdExec.java @@ -26,6 +26,7 @@ protected CreateImageResponse execute(CreateImageCmd command) { LOGGER.trace("POST: {}", webResource); return webResource.request().accept(MediaType.APPLICATION_OCTET_STREAM) - .post(new TypeReference() { }, command.getImageStream()); + .post(new TypeReference() { + }, command.getImageStream()); } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java index 8b814bddc..ef139517f 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/DisconnectFromNetworkCmdExec.java @@ -6,9 +6,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; - public class DisconnectFromNetworkCmdExec extends AbstrSyncDockerCmdExec - implements DisconnectFromNetworkCmd.Exec { + implements DisconnectFromNetworkCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(DisconnectFromNetworkCmdExec.class); diff --git a/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java index 288765650..8fc211322 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/InfoCmdExec.java @@ -10,8 +10,7 @@ import com.github.dockerjava.netty.WebTarget; /** - * http://stackoverflow.com/questions/33296749/netty-connect-to-unix-domain- socket-failed - * http://netty.io/wiki/native-transports.html + * 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 * * @author Marcus Linke diff --git a/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java index 911780362..a23bcb20d 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/LogContainerCmdExec.java @@ -9,7 +9,6 @@ import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.netty.WebTarget; - public class LogContainerCmdExec extends AbstrAsyncDockerCmdExec implements LogContainerCmd.Exec { diff --git a/src/main/java/com/github/dockerjava/netty/exec/RestartContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/RestartContainerCmdExec.java index 6c1f47a0b..df9721054 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/RestartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/RestartContainerCmdExec.java @@ -8,7 +8,6 @@ import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; - public class RestartContainerCmdExec extends AbstrSyncDockerCmdExec implements RestartContainerCmd.Exec { diff --git a/src/main/java/com/github/dockerjava/netty/exec/StopContainerCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/StopContainerCmdExec.java index 3bade97e7..cd85d92c2 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/StopContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/StopContainerCmdExec.java @@ -8,8 +8,6 @@ import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; - - public class StopContainerCmdExec extends AbstrSyncDockerCmdExec implements StopContainerCmd.Exec { diff --git a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java index b58292b51..0567050d2 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandler.java @@ -138,14 +138,14 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E private static StreamType streamType(byte streamType) { switch (streamType) { - case 0: - return StreamType.STDIN; - case 1: - return StreamType.STDOUT; - case 2: - return StreamType.STDERR; - default: - return StreamType.RAW; + case 0: + return StreamType.STDIN; + case 1: + return StreamType.STDOUT; + case 2: + return StreamType.STDERR; + default: + return StreamType.RAW; } } diff --git a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java index cbe8686d9..571fa9be5 100644 --- a/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java +++ b/src/main/java/com/github/dockerjava/netty/handler/HttpResponseHandler.java @@ -25,8 +25,8 @@ import com.github.dockerjava.api.exception.UnauthorizedException; /** - * Handler that is responsible to handle an incoming {@link HttpResponse}. It evaluates the status code and triggers the - * appropriate lifecycle methods at the passed {@link ResultCallback}. + * Handler that is responsible to handle an incoming {@link HttpResponse}. It evaluates the status code and triggers the appropriate + * lifecycle methods at the passed {@link ResultCallback}. * * @author Marcus Linke */ @@ -66,49 +66,49 @@ public void close() { ByteBuf byteBuf = content.content(); switch (response.status().code()) { - case 200: - case 201: - case 204: - ctx.fireChannelRead(byteBuf); - break; - default: - errorBody.writeBytes(byteBuf); + case 200: + case 201: + case 204: + ctx.fireChannelRead(byteBuf); + break; + default: + errorBody.writeBytes(byteBuf); } if (content instanceof LastHttpContent) { try { switch (response.status().code()) { - case 101: - case 200: - case 201: - case 204: - break; - case 301: - case 302: - if (response.headers().contains(HttpHeaderNames.LOCATION)) { - String location = response.headers().get(HttpHeaderNames.LOCATION); - HttpRequest redirected = requestProvider.getHttpRequest(location); - - ctx.channel().writeAndFlush(redirected); - } - break; - case 304: - throw new NotModifiedException(getBodyAsMessage(errorBody)); - case 400: - throw new BadRequestException(getBodyAsMessage(errorBody)); - case 401: - throw new UnauthorizedException(getBodyAsMessage(errorBody)); - case 404: - throw new NotFoundException(getBodyAsMessage(errorBody)); - case 406: - throw new NotAcceptableException(getBodyAsMessage(errorBody)); - case 409: - throw new ConflictException(getBodyAsMessage(errorBody)); - case 500: - throw new InternalServerErrorException(getBodyAsMessage(errorBody)); - default: - throw new DockerException(getBodyAsMessage(errorBody), response.status().code()); + case 101: + case 200: + case 201: + case 204: + break; + case 301: + case 302: + if (response.headers().contains(HttpHeaderNames.LOCATION)) { + String location = response.headers().get(HttpHeaderNames.LOCATION); + HttpRequest redirected = requestProvider.getHttpRequest(location); + + ctx.channel().writeAndFlush(redirected); + } + break; + case 304: + throw new NotModifiedException(getBodyAsMessage(errorBody)); + case 400: + throw new BadRequestException(getBodyAsMessage(errorBody)); + case 401: + throw new UnauthorizedException(getBodyAsMessage(errorBody)); + case 404: + throw new NotFoundException(getBodyAsMessage(errorBody)); + case 406: + throw new NotAcceptableException(getBodyAsMessage(errorBody)); + case 409: + throw new ConflictException(getBodyAsMessage(errorBody)); + case 500: + throw new InternalServerErrorException(getBodyAsMessage(errorBody)); + default: + throw new DockerException(getBodyAsMessage(errorBody), response.status().code()); } } catch (Throwable e) { resultCallback.onError(e); diff --git a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java index f718b1bdb..33066a84f 100644 --- a/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java +++ b/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java @@ -22,4 +22,4 @@ public void setUp() throws Exception { public void defaultServerAddress() throws Exception { assertEquals(new AuthConfig().getServerAddress(), "https://index.docker.io/v1/"); } -} \ No newline at end of file +} diff --git a/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java b/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java index 14325bd12..e8d4703db 100644 --- a/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java +++ b/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java @@ -34,4 +34,4 @@ public void testFromCompoundString() throws Exception { Identifier i6 = Identifier.fromCompoundString("10.0.0.1:5000/my-test-image:1234"); assertEquals(i6.repository.getPath(), "my-test-image"); } -} \ No newline at end of file +} diff --git a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java index 05a2b3f01..a5a8697f5 100644 --- a/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/Ports_addBindingsTest.java @@ -10,9 +10,8 @@ import com.github.dockerjava.api.model.Ports.Binding; /** - * As there may be several {@link Binding}s per {@link ExposedPort}, it makes a difference if you add - * {@link PortBinding}s for the same or different {@link ExposedPort}s to {@link Ports}. This test verifies that the Map - * in {@link Ports} is populated correctly in both cases. + * As there may be several {@link Binding}s per {@link ExposedPort}, it makes a difference if you add {@link PortBinding}s for the same or + * different {@link ExposedPort}s to {@link Ports}. This test verifies that the Map in {@link Ports} is populated correctly in both cases. */ public class Ports_addBindingsTest { private static final ExposedPort TCP_80 = ExposedPort.tcp(80); @@ -37,8 +36,8 @@ public void addTwoBindingsForDifferentExposedPorts() { Map bindings = ports.getBindings(); // two keys with one value each assertEquals(bindings.size(), 2); - assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080 }); - assertEquals(bindings.get(TCP_90), new Binding[] { BINDING_9090 }); + assertEquals(bindings.get(TCP_80), new Binding[] {BINDING_8080}); + assertEquals(bindings.get(TCP_90), new Binding[] {BINDING_9090}); } @Test @@ -48,7 +47,7 @@ public void addTwoBindingsForSameExposedPort() { Map bindings = ports.getBindings(); // one key with two values assertEquals(bindings.size(), 1); - assertEquals(bindings.get(TCP_80), new Binding[] { BINDING_8080, BINDING_9090 }); + assertEquals(bindings.get(TCP_80), new Binding[] {BINDING_8080, BINDING_9090}); } @Test diff --git a/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java b/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java index 8db0273df..c78b61a85 100644 --- a/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java +++ b/src/test/java/com/github/dockerjava/api/model/RepositoryTest.java @@ -15,4 +15,4 @@ public void testRepository() throws Exception { assertEquals(1234, repo1.getURL().getPort()); } -} \ No newline at end of file +} 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 b4a9a746a..74c97fcf6 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 @@ -7,8 +7,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; /** - * Compares serialization results of various {@link RestartPolicy}s with what Docker (as of 1.3.3) actually sends when - * executing docker run --restart xxx. + * Compares serialization results of various {@link RestartPolicy}s with what Docker (as of 1.3.3) actually sends when executing + * docker run --restart xxx. */ public class RestartPolicy_SerializingTest { private final ObjectMapper objectMapper = new ObjectMapper(); 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 a2d99ce9c..69e1e88a2 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"}, {"on-failure"}, {"on-failure:2"}}; } @Test(dataProvider = "input") diff --git a/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java b/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java index 7a22d6587..7d35c25a3 100644 --- a/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java +++ b/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java @@ -28,4 +28,4 @@ public void t1() throws IOException { objectMapper.readValue(s, VolumeBinds.class); } -} \ No newline at end of file +} diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 074c19ad9..bc36acb33 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -229,7 +229,7 @@ public static class LogContainerTestCallback extends LogContainerResultCallback public void onNext(Frame frame) { log.append(new String(frame.getPayload())); System.err.println("LogContainerTestCallback: " + log.toString()); - //super.onNext(frame); + // super.onNext(frame); } @Override diff --git a/src/test/java/com/github/dockerjava/client/DockerClientTest.java b/src/test/java/com/github/dockerjava/client/DockerClientTest.java index 8a7d6f6a4..72a09f0e5 100644 --- a/src/test/java/com/github/dockerjava/client/DockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/DockerClientTest.java @@ -50,11 +50,11 @@ public void afterMethod(ITestResult result) { @Test public void testRunShlex() throws DockerException { - String[] commands = new String[] { "true", + String[] commands = new String[] {"true", "echo \"The Young Descendant of Tepes & Septette for the Dead Princess\"", "echo -n 'The Young Descendant of Tepes & Septette for the Dead Princess'", "/bin/sh -c echo Hello World", "/bin/sh -c echo 'Hello World'", "echo 'Night of Nights'", - "true && echo 'Night of Nights'" }; + "true && echo 'Night of Nights'"}; for (String command : commands) { LOG.info("Running command: [{}]", command); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index c5a1e841c..34995ab1a 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -33,4 +33,4 @@ public void defaultInstanceAuthConfig() throws Exception { // then we do not get an exception } -} \ No newline at end of file +} diff --git a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java index 342c740ed..0fd870194 100644 --- a/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java +++ b/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java @@ -41,60 +41,60 @@ public void testMatch(MatchTestCase testCase) throws IOException { @DataProvider public Object[][] getTestData() { - return new Object[][] { 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*/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) }, - new Object[] { new MatchTestCase("a*b*c*d*e*/f", "axbxcxdxexxx/f", true, false) }, - new Object[] { new MatchTestCase("a*b*c*d*e*/f", "axbxcxdxe/xxx/f", false, false) }, - new Object[] { new MatchTestCase("a*b*c*d*e*/f", "axbxcxdxexxx/fff", false, false) }, - new Object[] { new MatchTestCase("a*b?c*x", "abxbbxdbxebxczzx", true, false) }, - new Object[] { new MatchTestCase("a*b?c*x", "abxbbxdbxebxczzy", false, false) }, - new Object[] { new MatchTestCase("ab[c]", "abc", true, false) }, - new Object[] { new MatchTestCase("ab[b-d]", "abc", true, false) }, - new Object[] { new MatchTestCase("ab[e-g]", "abc", false, false) }, - new Object[] { new MatchTestCase("ab[^c]", "abc", false, false) }, - new Object[] { new MatchTestCase("ab[^b-d]", "abc", false, false) }, - new Object[] { new MatchTestCase("ab[^e-g]", "abc", true, false) }, - new Object[] { new MatchTestCase("a\\*b", "a*b", true, false) }, - new Object[] { new MatchTestCase("a\\*b", "ab", false, false) }, - new Object[] { new MatchTestCase("a?b", "a☺b", true, false) }, - new Object[] { new MatchTestCase("a[^a]b", "a☺b", true, false) }, - new Object[] { new MatchTestCase("a???b", "a☺b", false, false) }, - new Object[] { new MatchTestCase("a[^a][^a][^a]b", "a☺b", false, false) }, - new Object[] { new MatchTestCase("[a-ζ]*", "α", true, false) }, - new Object[] { new MatchTestCase("*[a-ζ]", "A", false, false) }, - new Object[] { new MatchTestCase("a?b", "a/b", false, false) }, - new Object[] { new MatchTestCase("a*b", "a/b", false, false) }, - new Object[] { new MatchTestCase("[\\]a]", "]", true, false) }, - new Object[] { new MatchTestCase("[\\-]", "-", true, false) }, - new Object[] { new MatchTestCase("[x\\-]", "x", true, false) }, - new Object[] { new MatchTestCase("[x\\-]", "-", true, false) }, - new Object[] { new MatchTestCase("[x\\-]", "z", false, false) }, - new Object[] { new MatchTestCase("[\\-x]", "x", true, false) }, - new Object[] { new MatchTestCase("[\\-x]", "-", true, false) }, - new Object[] { new MatchTestCase("[\\-x]", "a", false, false) }, - new Object[] { new MatchTestCase("[]a]", "]", false, true) }, - new Object[] { new MatchTestCase("[-]", "-", false, true) }, - new Object[] { new MatchTestCase("[x-]", "x", false, true) }, - new Object[] { new MatchTestCase("[x-]", "-", false, true) }, - new Object[] { new MatchTestCase("[x-]", "z", false, true) }, - new Object[] { new MatchTestCase("[-x]", "x", false, true) }, - new Object[] { new MatchTestCase("[-x]", "-", false, true) }, - new Object[] { new MatchTestCase("[-x]", "a", false, true) }, - new Object[] { new MatchTestCase("\\", "a", false, true) }, - new Object[] { new MatchTestCase("[a-b-c]", "a", false, true) }, - 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[", "ab", false, true) }, - new Object[] { new MatchTestCase("*x", "xxx", true, false) } }; + return new Object[][] {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*/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)}, + new Object[] {new MatchTestCase("a*b*c*d*e*/f", "axbxcxdxexxx/f", true, false)}, + new Object[] {new MatchTestCase("a*b*c*d*e*/f", "axbxcxdxe/xxx/f", false, false)}, + new Object[] {new MatchTestCase("a*b*c*d*e*/f", "axbxcxdxexxx/fff", false, false)}, + new Object[] {new MatchTestCase("a*b?c*x", "abxbbxdbxebxczzx", true, false)}, + new Object[] {new MatchTestCase("a*b?c*x", "abxbbxdbxebxczzy", false, false)}, + new Object[] {new MatchTestCase("ab[c]", "abc", true, false)}, + new Object[] {new MatchTestCase("ab[b-d]", "abc", true, false)}, + new Object[] {new MatchTestCase("ab[e-g]", "abc", false, false)}, + new Object[] {new MatchTestCase("ab[^c]", "abc", false, false)}, + new Object[] {new MatchTestCase("ab[^b-d]", "abc", false, false)}, + new Object[] {new MatchTestCase("ab[^e-g]", "abc", true, false)}, + new Object[] {new MatchTestCase("a\\*b", "a*b", true, false)}, + new Object[] {new MatchTestCase("a\\*b", "ab", false, false)}, + new Object[] {new MatchTestCase("a?b", "a☺b", true, false)}, + new Object[] {new MatchTestCase("a[^a]b", "a☺b", true, false)}, + new Object[] {new MatchTestCase("a???b", "a☺b", false, false)}, + new Object[] {new MatchTestCase("a[^a][^a][^a]b", "a☺b", false, false)}, + new Object[] {new MatchTestCase("[a-ζ]*", "α", true, false)}, + new Object[] {new MatchTestCase("*[a-ζ]", "A", false, false)}, + new Object[] {new MatchTestCase("a?b", "a/b", false, false)}, + new Object[] {new MatchTestCase("a*b", "a/b", false, false)}, + new Object[] {new MatchTestCase("[\\]a]", "]", true, false)}, + new Object[] {new MatchTestCase("[\\-]", "-", true, false)}, + new Object[] {new MatchTestCase("[x\\-]", "x", true, false)}, + new Object[] {new MatchTestCase("[x\\-]", "-", true, false)}, + new Object[] {new MatchTestCase("[x\\-]", "z", false, false)}, + new Object[] {new MatchTestCase("[\\-x]", "x", true, false)}, + new Object[] {new MatchTestCase("[\\-x]", "-", true, false)}, + new Object[] {new MatchTestCase("[\\-x]", "a", false, false)}, + new Object[] {new MatchTestCase("[]a]", "]", false, true)}, + new Object[] {new MatchTestCase("[-]", "-", false, true)}, + new Object[] {new MatchTestCase("[x-]", "x", false, true)}, + new Object[] {new MatchTestCase("[x-]", "-", false, true)}, + new Object[] {new MatchTestCase("[x-]", "z", false, true)}, + new Object[] {new MatchTestCase("[-x]", "x", false, true)}, + new Object[] {new MatchTestCase("[-x]", "-", false, true)}, + new Object[] {new MatchTestCase("[-x]", "a", false, true)}, + new Object[] {new MatchTestCase("\\", "a", false, true)}, + new Object[] {new MatchTestCase("[a-b-c]", "a", false, true)}, + 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[", "ab", false, true)}, + new Object[] {new MatchTestCase("*x", "xxx", true, false)}}; } private final class MatchTestCase { diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 50860789b..3ac8828e8 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -11,8 +11,8 @@ import com.github.dockerjava.api.model.BuildResponseItem; /** - * Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution - * for the purpose of automatically cleanup. + * Special {@link DockerCmdExecFactory} implementation that collects container and image creations while test execution for the purpose of + * automatically cleanup. * * @author Marcus Linke */ 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 9266c5ccd..775b12b16 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -174,7 +174,7 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception { return containerLog(container.getId()); } - @Test(expectedExceptions = { DockerClientException.class }) + @Test(expectedExceptions = {DockerClientException.class}) public void testDockerfileIgnored() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored") .getFile()); @@ -190,7 +190,7 @@ public void testDockerfileNotIgnored() throws Exception { dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId(); } - @Test(expectedExceptions = { DockerClientException.class }) + @Test(expectedExceptions = {DockerClientException.class}) public void testInvalidDockerIgnorePattern() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testInvalidDockerignorePattern").getFile()); @@ -309,7 +309,8 @@ public void testBuildFromPrivateRegistry() throws Exception { public void testBuildArgs() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildArgs").getFile()); - String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "abc").exec(new BuildImageResultCallback()) + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "abc") + .exec(new BuildImageResultCallback()) .awaitImageId(); InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).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 3f989c114..dba1a1a34 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -266,8 +266,8 @@ public void createContainerWithLink() throws DockerException { InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) .exec(); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1", + "container1Link")})); } @Test @@ -325,7 +325,7 @@ public void createContainerWithEntrypoint() throws DockerException { @Test public void createContainerWithExtraHosts() throws DockerException { - String[] extraHosts = { "dockerhost:127.0.0.1", "otherhost:10.0.0.1" }; + String[] extraHosts = {"dockerhost:127.0.0.1", "otherhost:10.0.0.1"}; CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") .withExtraHosts(extraHosts).exec(); @@ -430,8 +430,8 @@ public void createContainerWithLinking() throws DockerException { assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1", + "container1Link")})); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); @@ -471,11 +471,10 @@ public void createContainerWithPidMode() throws DockerException { } /** - * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the - * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for - * this container 'container:': reuses another container network stack 'host': use the host network stack inside the - * container. Note: the host mode gives the container full access to local system services such as D-bus and is - * therefore considered insecure. + * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the container 'bridge': + * creates a new network stack for the container on the docker bridge 'none': no networking for this container 'container:': reuses + * another container network stack 'host': use the host network stack inside the container. Note: the host mode gives the container full + * access to local system services such as D-bus and is therefore considered insecure. */ @Test public void createContainerWithNetworkMode() throws DockerException { @@ -510,7 +509,7 @@ public void createContainerWithMacAddress() throws DockerException { @Test(groups = "ignoreInCircleCi") public void createContainerWithULimits() throws DockerException { - Ulimit[] ulimits = { new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096) }; + Ulimit[] ulimits = {new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)}; CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") .withUlimits(ulimits).exec(); diff --git a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java index 1d21b8e95..38ddf1402 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java @@ -58,4 +58,4 @@ private void setBytes(int... bytes) { this.bytes.add(aByte); } } -} \ No newline at end of file +} 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 ce060f4bb..0bc2c9b1a 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -316,8 +316,8 @@ public void startContainerWithLinkingDeprecated() throws DockerException { assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1", + "container1Link")})); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); @@ -369,8 +369,8 @@ public void startContainerWithLinking() throws DockerException { assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1", + "container1Link")})); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); @@ -382,7 +382,7 @@ public void startContainerWithLinking() throws DockerException { @Test public void startContainer() throws DockerException { - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(new String[] { "top" }) + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(new String[] {"top"}) .exec(); LOG.info("Created container {}", container.toString()); @@ -418,11 +418,10 @@ public void testStartNonExistingContainer() throws DockerException { } /** - * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the - * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for - * this container 'container:': reuses another container network stack 'host': use the host network stack inside the - * container. Note: the host mode gives the container full access to local system services such as D-bus and is - * therefore considered insecure. + * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the container 'bridge': + * creates a new network stack for the container on the docker bridge 'none': no networking for this container 'container:': reuses + * another container network stack 'host': use the host network stack inside the container. Note: the host mode gives the container full + * access to local system services such as D-bus and is therefore considered insecure. */ @Test public void startContainerWithNetworkMode() throws DockerException { diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java index b121900b4..47d570d8c 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java @@ -20,14 +20,14 @@ public class DockerfileStatementAddTest extends TestCase { @DataProvider(name = "valid scenarios") public Object[][] validScenarios() { - return new Object[][] { { "ADD src dest", contains("src"), "dest" }, - { "ADD \"src file\" \"dest\"", contains("src file"), "dest" }, - { "ADD src\"file dest", contains("src\"file"), "dest" }, - { "ADD src1 src2 dest", containsInAnyOrder("src1", "src2"), "dest" }, - { "COPY src dest", contains("src"), "dest" }, - { "COPY \"src file\" \"dest\"", contains("src file"), "dest" }, - { "COPY src\"file dest", contains("src\"file"), "dest" }, - { "COPY src1 src2 dest", containsInAnyOrder("src1", "src2"), "dest" } }; + return new Object[][] { {"ADD src dest", contains("src"), "dest"}, + {"ADD \"src file\" \"dest\"", contains("src file"), "dest"}, + {"ADD src\"file dest", contains("src\"file"), "dest"}, + {"ADD src1 src2 dest", containsInAnyOrder("src1", "src2"), "dest"}, + {"COPY src dest", contains("src"), "dest"}, + {"COPY \"src file\" \"dest\"", contains("src file"), "dest"}, + {"COPY src\"file dest", contains("src\"file"), "dest"}, + {"COPY src1 src2 dest", containsInAnyOrder("src1", "src2"), "dest"}}; } @Test(dataProvider = "valid scenarios") @@ -38,7 +38,7 @@ public void testAddOrCopyPattern(String command, Matcher matchesExpectation, Str assertThat(optionalAdd.get().destination, is(expectedDest)); } - @Test(expectedExceptions = { DockerClientException.class }) + @Test(expectedExceptions = {DockerClientException.class}) public void shouldThrowExceptionIfDestNotSpecified() { DockerfileStatement.Add.create("ADD src"); } diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java index c69529d02..ba96ad2eb 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileTest.java @@ -46,4 +46,4 @@ public void testAllItems() throws IOException { } } -} \ No newline at end of file +} diff --git a/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java b/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java index 125fd0785..25027ae76 100644 --- a/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java +++ b/src/test/java/com/github/dockerjava/core/util/FiltersBuilderTest.java @@ -1,7 +1,6 @@ package com.github.dockerjava.core.util; -import com.github.dockerjava.core.util. -FiltersBuilder; +import com.github.dockerjava.core.util.FiltersBuilder; import com.google.common.collect.Maps; import org.testng.annotations.Test; 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 e4aa05250..fad4ef7b1 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -166,7 +166,7 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception { return containerLog(container.getId()); } - @Test(expectedExceptions = { DockerClientException.class }) + @Test(expectedExceptions = {DockerClientException.class}) public void testDockerfileIgnored() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored") .getFile()); @@ -182,7 +182,7 @@ public void testDockerfileNotIgnored() throws Exception { dockerClient.buildImageCmd(baseDir).withNoCache(true).exec(new BuildImageResultCallback()).awaitImageId(); } - @Test(expectedExceptions = { DockerClientException.class }) + @Test(expectedExceptions = {DockerClientException.class}) public void testInvalidDockerIgnorePattern() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testInvalidDockerignorePattern").getFile()); @@ -301,7 +301,8 @@ public void testBuildFromPrivateRegistry() throws Exception { public void testBuildArgs() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildArgs").getFile()); - String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "abc").exec(new BuildImageResultCallback()) + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "abc") + .exec(new BuildImageResultCallback()) .awaitImageId(); InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); 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 a29b26d7b..9a6d4b354 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/CreateContainerCmdExecTest.java @@ -259,8 +259,8 @@ public void createContainerWithLink() throws DockerException { InspectContainerResponse inspectContainerResponse2 = dockerClient.inspectContainerCmd(container2.getId()) .exec(); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1", + "container1Link")})); } @Test @@ -318,7 +318,7 @@ public void createContainerWithEntrypoint() throws DockerException { @Test public void createContainerWithExtraHosts() throws DockerException { - String[] extraHosts = { "dockerhost:127.0.0.1", "otherhost:10.0.0.1" }; + String[] extraHosts = {"dockerhost:127.0.0.1", "otherhost:10.0.0.1"}; CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") .withExtraHosts(extraHosts).exec(); @@ -423,8 +423,8 @@ public void createContainerWithLinking() throws DockerException { assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1", + "container1Link")})); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); @@ -464,11 +464,10 @@ public void createContainerWithPidMode() throws DockerException { } /** - * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the - * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for - * this container 'container:': reuses another container network stack 'host': use the host network stack inside the - * container. Note: the host mode gives the container full access to local system services such as D-bus and is - * therefore considered insecure. + * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the container 'bridge': + * creates a new network stack for the container on the docker bridge 'none': no networking for this container 'container:': reuses + * another container network stack 'host': use the host network stack inside the container. Note: the host mode gives the container full + * access to local system services such as D-bus and is therefore considered insecure. */ @Test public void createContainerWithNetworkMode() throws DockerException { @@ -503,7 +502,7 @@ public void createContainerWithMacAddress() throws DockerException { @Test(groups = "ignoreInCircleCi") public void createContainerWithULimits() throws DockerException { - Ulimit[] ulimits = { new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096) }; + Ulimit[] ulimits = {new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)}; CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withName("container") .withUlimits(ulimits).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 8af196a60..02b7cd51b 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/StartContainerCmdExecTest.java @@ -317,8 +317,8 @@ public void startContainerWithLinkingDeprecated() throws DockerException { assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1", + "container1Link")})); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); @@ -370,8 +370,8 @@ public void startContainerWithLinking() throws DockerException { assertThat(inspectContainerResponse2.getId(), not(isEmptyString())); assertThat(inspectContainerResponse2.getHostConfig(), is(notNullValue())); assertThat(inspectContainerResponse2.getHostConfig().getLinks(), is(notNullValue())); - assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] { new Link("container1", - "container1Link") })); + assertThat(inspectContainerResponse2.getHostConfig().getLinks(), equalTo(new Link[] {new Link("container1", + "container1Link")})); assertThat(inspectContainerResponse2.getId(), startsWith(container2.getId())); assertThat(inspectContainerResponse2.getName(), equalTo("/container2")); assertThat(inspectContainerResponse2.getImageId(), not(isEmptyString())); @@ -383,7 +383,7 @@ public void startContainerWithLinking() throws DockerException { @Test public void startContainer() throws DockerException { - CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(new String[] { "top" }) + CreateContainerResponse container = dockerClient.createContainerCmd("busybox").withCmd(new String[] {"top"}) .exec(); LOG.info("Created container {}", container.toString()); @@ -419,11 +419,10 @@ public void testStartNonExistingContainer() throws DockerException { } /** - * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the - * container 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for - * this container 'container:': reuses another container network stack 'host': use the host network stack inside the - * container. Note: the host mode gives the container full access to local system services such as D-bus and is - * therefore considered insecure. + * This tests support for --net option for the docker run command: --net="bridge" Set the Network mode for the container 'bridge': + * creates a new network stack for the container on the docker bridge 'none': no networking for this container 'container:': reuses + * another container network stack 'host': use the host network stack inside the container. Note: the host mode gives the container full + * access to local system services such as D-bus and is therefore considered insecure. */ @Test public void startContainerWithNetworkMode() throws DockerException { From fbef1cd41ed5e3b3202d82f88117d907e54fea85 Mon Sep 17 00:00:00 2001 From: Christopher Dancy Date: Sat, 6 Feb 2016 16:20:57 -0500 Subject: [PATCH 0158/1032] Return null, instead of NullPointerException, should no exposedPorts be found --- .../java/com/github/dockerjava/api/model/ContainerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 efc5e0248..d7f4b81ee 100644 --- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java @@ -84,7 +84,7 @@ public class ContainerConfig { @JsonIgnore public ExposedPort[] getExposedPorts() { - return exposedPorts.getExposedPorts(); + return exposedPorts != null ? exposedPorts.getExposedPorts() : null; } public Boolean isNetworkDisabled() { From 835c78c250c6f59a838e5e947ea1971961c644c9 Mon Sep 17 00:00:00 2001 From: Christopher Dancy Date: Sat, 6 Feb 2016 16:49:28 -0500 Subject: [PATCH 0159/1032] Expose netty deps as a version and bump to latest 4.1.0.CR2 --- pom.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 43a73c889..60e8fcad5 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,7 @@ 1.1.0 6.1.1 + 4.1.0.CR2 1.3 1.6 2.3.3 @@ -206,22 +207,22 @@ io.netty netty-codec-http - 4.1.0.Beta7 + ${netty.version} io.netty netty-handler - 4.1.0.Beta7 + ${netty.version} io.netty netty-handler-proxy - 4.1.0.Beta7 + ${netty.version} io.netty netty-transport-native-epoll - 4.1.0.Beta7 + ${netty.version} linux-x86_64 From 3a1527714910ff8e65edb745aac4f6d44aa83f9c Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 7 Feb 2016 19:43:44 +0100 Subject: [PATCH 0160/1032] Add withDockerTlsVerify(Boolean dockerTlsVerify) --- .../dockerjava/core/DockerClientConfig.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 400f417ea..12d09664c 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -27,8 +27,7 @@ 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 + * Respects some of the docker CLI options. See https://docs.docker.com/engine/reference/commandline/cli/#environment-variables */ public class DockerClientConfig implements Serializable { @@ -114,7 +113,7 @@ private String checkDockerCertPath(boolean dockerTlsVerify, String dockerCertPat "Certificate path (DOCKER_CERT_PATH) '" + dockerCertPath + "' doesn't exist."); } - if(certPath.isDirectory()) { + if (certPath.isDirectory()) { return dockerCertPath; } else { throw new DockerClientException( @@ -361,9 +360,9 @@ public static class DockerClientConfigBuilder { private boolean dockerTlsVerify; /** - * This will set all fields in the builder to those contained in the Properties object. The Properties object - * should contain the following docker-java configuration keys: DOCKER_HOST, DOCKER_TLS_VERIFY, api.version, - * registry.username, registry.password, registry.email, DOCKER_CERT_PATH, and DOCKER_CONFIG. + * This will set all fields in the builder to those contained in the Properties object. The Properties object should contain the + * following docker-java configuration keys: DOCKER_HOST, DOCKER_TLS_VERIFY, api.version, registry.username, registry.password, + * registry.email, DOCKER_CERT_PATH, and DOCKER_CONFIG. */ public DockerClientConfigBuilder withProperties(Properties p) { return withDockerHost(p.getProperty(DOCKER_HOST)).withDockerTlsVerify(p.getProperty(DOCKER_TLS_VERIFY)) @@ -418,7 +417,13 @@ public final DockerClientConfigBuilder withDockerConfig(String dockerConfig) { } public final DockerClientConfigBuilder withDockerTlsVerify(String dockerTlsVerify) { - this.dockerTlsVerify = BooleanUtils.toBoolean(dockerTlsVerify.trim(), "1", "0"); + this.dockerTlsVerify = BooleanUtils.toBoolean(dockerTlsVerify.trim()) + || BooleanUtils.toBoolean(dockerTlsVerify.trim(), "1", "0"); + return this; + } + + public final DockerClientConfigBuilder withDockerTlsVerify(Boolean dockerTlsVerify) { + this.dockerTlsVerify = dockerTlsVerify; return this; } From 4bafd142f0633f3aa34c217f4fcdcbbbac7416a7 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 7 Feb 2016 19:51:01 +0100 Subject: [PATCH 0161/1032] Fix README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9175135ae..0b519d0f3 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ In your application, e.g. DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder() .withDockerHost("tcp://my-docker-host.tld:2376") - .withDockerTlsVerify("1") + .withDockerTlsVerify(true) .withDockerCertPath("/home/user/.docker/certs") .withDockerConfig("/home/user/.docker") .withApiVersion("1.21") @@ -113,7 +113,7 @@ In your application, e.g. .build(); DockerClient docker = DockerClientBuilder.getInstance(config).build(); -#### Properties +#### Properties (docker-java.properties) DOCKER_HOST=tcp://localhost:2376 DOCKER_TLS_VERIFY=1 From 6e91d2606d3befd0962683830ccbe14c9c1a3002 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Sun, 7 Feb 2016 22:51:38 +0100 Subject: [PATCH 0162/1032] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f0141068..f33c3a30f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,10 @@ Change Log Notes * The upcoming release will contain multiple API breaking changes therefore the major version switch. It will support a subset of v.1.21 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 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 +* [#447] (https://github.com/docker-java/docker-java/pull/447) Refactoring of DockerClientConfig * [#430] (https://github.com/docker-java/docker-java/pull/430) Fix ExecStartCmd failure * [#426] (https://github.com/docker-java/docker-java/pull/426) Refactored filters API * [#425] (https://github.com/docker-java/docker-java/pull/425) Implement Network API From 55ad6295f523cb93ca47296a67195d498943acfb Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 7 Feb 2016 23:12:53 +0100 Subject: [PATCH 0163/1032] Remove code-style.epf in favor of docker-java-formatter.xml --- etc/code-style.epf | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 etc/code-style.epf diff --git a/etc/code-style.epf b/etc/code-style.epf deleted file mode 100644 index abd8a9364..000000000 --- a/etc/code-style.epf +++ /dev/null @@ -1,23 +0,0 @@ -#Mon Jun 29 09:34:24 CEST 2015 -/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.overrideannotation=true -/instance/org.eclipse.jdt.ui/formatter_settings_version=12 -/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles.version=12 -/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.fieldSuffixes= -/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.text.custom_code_templates=