From 80679f48c5fbb5165778ff0e05d59a8a7b6134b7 Mon Sep 17 00:00:00 2001 From: Marcus Thiesen Date: Tue, 21 Jul 2015 16:20:59 +0200 Subject: [PATCH 0001/1124] Stop leaking tar files in temporary folder The temporary tar files generated from the docker folder are preserved after the contents is send to the docker deamon. In order to prevent filling up the temporary directory those files must be deleted. As the API is based on InputStreams the easiest solution is to wrap the input stream an delete the file on close. --- .../core/dockerfile/Dockerfile.java | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 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 8c26c4932..fe1a18f68 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -1,19 +1,5 @@ package com.github.dockerjava.core.dockerfile; -import java.io.File; -import java.io.IOException; -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; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.filefilter.TrueFileFilter; - import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.core.CompressArchiveUtil; import com.github.dockerjava.core.FilePathUtil; @@ -24,6 +10,20 @@ import com.google.common.base.Objects; import com.google.common.base.Optional; import com.google.common.collect.Collections2; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.filefilter.TrueFileFilter; + +import java.io.File; +import java.io.IOException; +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; /** * Parse a Dockerfile. @@ -130,15 +130,29 @@ public InputStream buildDockerFolderTar() { public InputStream buildDockerFolderTar(File directory) { - // ARCHIVE TAR File dockerFolderTar = null; try { - String archiveNameWithOutExtension = UUID.randomUUID().toString(); + final String archiveNameWithOutExtension = UUID.randomUUID().toString(); dockerFolderTar = CompressArchiveUtil.archiveTARFiles(directory, filesToAdd, archiveNameWithOutExtension); - return FileUtils.openInputStream(dockerFolderTar); + + final InputStream tarInputStream = FileUtils.openInputStream(dockerFolderTar); + final File tarFile = dockerFolderTar; + + return new InputStream() { + @Override + public int read() throws IOException { + return tarInputStream.read(); + } + + @Override + public void close() throws IOException { + IOUtils.closeQuietly(tarInputStream); + FileUtils.deleteQuietly(tarFile); + } + }; } catch (IOException ex) { FileUtils.deleteQuietly(dockerFolderTar); From d13d36403cdd324430f6d1d8862b503a9a992fe6 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 21 Jul 2015 20:51:32 +0200 Subject: [PATCH 0002/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6ec47070..35cdb4979 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log Latest SNAPSHOT --- +* [#278](https://github.com/docker-java/docker-java/pull/278) Stop leaking tar files in temporary folder * [#275](https://github.com/docker-java/docker-java/pull/275) Implemented LogConfig (create and inspect containers) * [#272](https://github.com/docker-java/docker-java/pull/272) remove withHostConfig() from create container command * [#270](https://github.com/docker-java/docker-java/pull/270) Passing result callbacks for async commands via commands exec() From 4993c7154e0d6631451cc8e925cf95fa5d2c7387 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Thu, 23 Jul 2015 18:41:12 +1000 Subject: [PATCH 0003/1124] Fix for #279 Handle multiple source files in ADD command --- .../core/dockerfile/Dockerfile.java | 3 +- .../core/dockerfile/DockerfileStatement.java | 82 +++++++++++++------ .../DockerfileAddMultipleFilesTest.java | 36 ++++++++ .../DockerfileStatementAddTest.java | 47 +++++++++++ .../resources/testAddMultipleFiles/Dockerfile | 5 ++ src/test/resources/testAddMultipleFiles/src1 | 0 src/test/resources/testAddMultipleFiles/src2 | 0 7 files changed, 144 insertions(+), 29 deletions(-) create mode 100644 src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java create mode 100644 src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java create mode 100644 src/test/resources/testAddMultipleFiles/Dockerfile create mode 100644 src/test/resources/testAddMultipleFiles/src1 create mode 100644 src/test/resources/testAddMultipleFiles/src2 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 fe1a18f68..9513678d7 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -184,10 +184,9 @@ private void processAddStatement(DockerfileStatement.Add add) throws IOException add = add.transform(environmentMap); - if (add.isFileResource()) { + for (String resource : add.getFileResources()) { File dockerFolder = getDockerFolder(); - String resource = add.source; File src = new File(resource); if (!src.isAbsolute()) { 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 a3ceab2b9..b37f5b4f7 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -2,13 +2,19 @@ import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Collection; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.github.dockerjava.api.DockerClientException; +import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; +import org.apache.commons.lang.StringUtils; /** * A statement present in a dockerfile. @@ -72,36 +78,42 @@ public String toString() { */ public static class Add extends DockerfileStatement { - private static final Pattern ADD_OR_COPY_PATTERN = Pattern.compile("^(ADD|COPY)\\s+(.*)\\s+(.*)$"); + private static final Pattern ARGUMENT_TOKENIZER = Pattern.compile("(?:\"[^\"]+\")|(\\S+)"); - public final String source; + public final Collection sources; public final String destination; - private Add(String source, String destination) { - this.source = source; + private Add(Collection sources, String destination) { + this.sources = sources; this.destination = destination; } - private Add(final Matcher matcher) { - source = matcher.group(2); - destination = matcher.group(3); - } - @Override - public Add transform(Map env) { - String resource = filterForEnvironmentVars(env, source).trim(); - return new Add(resource, destination); - } - - public boolean isFileResource() { - URI uri; - try { - uri = new URI(source); - } catch (URISyntaxException e) { - return false; - } - return uri.getScheme() == null || "file".equals(uri.getScheme()); + public Add transform(final Map env) { + Collection resources = Collections2.transform(sources, new Function() { + @Override + public String apply(String source) { + return filterForEnvironmentVars(env, source).trim(); + } + }); + return new Add(resources, destination); + } + + public Iterable getFileResources() { + return Collections2.filter(sources, new Predicate() { + + @Override + public boolean apply(String source) { + URI uri; + try { + uri = new URI(source); + } catch (URISyntaxException e) { + return false; + } + return uri.getScheme() == null || "file".equals(uri.getScheme()); + } + }); } /** @@ -112,21 +124,37 @@ public boolean isFileResource() { * @return optional typed item. */ public static Optional create(String statement) { - Matcher matcher = ADD_OR_COPY_PATTERN.matcher(statement.trim()); - if (!matcher.find()) { + Matcher argumentMatcher = ARGUMENT_TOKENIZER.matcher(statement.trim()); + + if (!argumentMatcher.find()) { return Optional.absent(); } - if (matcher.groupCount() != 3) { + String commandName = argumentMatcher.group(); + if (!(StringUtils.equals(commandName, "ADD") || StringUtils.equals(commandName, "COPY"))) { + return Optional.absent(); + } + + String lastToken = null; + Collection sources = new ArrayList<>(); + + while (argumentMatcher.find()) { + if (lastToken != null) { + sources.add(lastToken); + } + lastToken = argumentMatcher.group().replaceAll("(^\")|(\"$)", ""); + } + + if (sources.isEmpty()) { throw new DockerClientException("Wrong ADD or COPY format"); } - return Optional.of(new Add(matcher)); + return Optional.of(new Add(sources, lastToken)); } @Override public String toString() { - return Objects.toStringHelper(this).add("source", source).add("destination", destination).toString(); + return Objects.toStringHelper(this).add("sources", sources).add("destination", destination).toString(); } } diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java new file mode 100644 index 000000000..65af93774 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.core.dockerfile; + +import com.google.common.base.Function; +import junit.framework.TestCase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; + +import static com.google.common.collect.Collections2.transform; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; + +public class DockerfileAddMultipleFilesTest extends TestCase { + + private static final Logger log = LoggerFactory.getLogger(DockerfileAddMultipleFilesTest.class); + private static final Function TO_FILE_NAMES = new Function() { + @Override + public String apply(File file) { + return file.getName(); + } + }; + + @Test + public void testAddMultipleFiles() throws IOException { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddMultipleFiles").getFile()); + Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile")); + Dockerfile.ScannedResult result = dockerfile.parse(); + Collection filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES); + + assertThat(filesToAdd, containsInAnyOrder("Dockerfile", "src1", "src2")); + } +} diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java new file mode 100644 index 000000000..691137afd --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java @@ -0,0 +1,47 @@ +package com.github.dockerjava.core.dockerfile; + +import com.github.dockerjava.api.DockerClientException; +import com.google.common.base.Optional; +import junit.framework.TestCase; +import org.hamcrest.Matcher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.is; + +public class DockerfileStatementAddTest extends TestCase { + + private static final Logger log = LoggerFactory.getLogger(DockerfileStatementAddTest.class); + + @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"} + }; + } + + @Test(dataProvider = "valid scenarios") + public void testAddOrCopyPattern(String command, Matcher matchesExpectation, String expectedDest) { + Optional optionalAdd = DockerfileStatement.Add.create(command); + assertThat(optionalAdd.isPresent(), is(true)); + assertThat(optionalAdd.get().sources, matchesExpectation); + assertThat(optionalAdd.get().destination, is(expectedDest)); + } + + @Test(expectedExceptions = { DockerClientException.class }) + public void shouldThrowExceptionIfDestNotSpecified() { + DockerfileStatement.Add.create("ADD src"); + } +} diff --git a/src/test/resources/testAddMultipleFiles/Dockerfile b/src/test/resources/testAddMultipleFiles/Dockerfile new file mode 100644 index 000000000..52c5bfc6c --- /dev/null +++ b/src/test/resources/testAddMultipleFiles/Dockerfile @@ -0,0 +1,5 @@ +FROM ubuntu:latest + +# Copy multiple source files into the container + +ADD src1 src2 /tmp/ diff --git a/src/test/resources/testAddMultipleFiles/src1 b/src/test/resources/testAddMultipleFiles/src1 new file mode 100644 index 000000000..e69de29bb diff --git a/src/test/resources/testAddMultipleFiles/src2 b/src/test/resources/testAddMultipleFiles/src2 new file mode 100644 index 000000000..e69de29bb From 6c9dbdb72d3ac39c4520fa378517c127f9b64d74 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 23 Jul 2015 20:39:40 +0200 Subject: [PATCH 0004/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35cdb4979..1c86c3cc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log Latest SNAPSHOT --- +* [#280](https://github.com/docker-java/docker-java/pull/280) Handle multiple source files in ADD command * [#278](https://github.com/docker-java/docker-java/pull/278) Stop leaking tar files in temporary folder * [#275](https://github.com/docker-java/docker-java/pull/275) Implemented LogConfig (create and inspect containers) * [#272](https://github.com/docker-java/docker-java/pull/272) remove withHostConfig() from create container command From 58720dce6c67d9f6d56993f544c4f583ca49b9a2 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 24 Jul 2015 22:40:09 +0200 Subject: [PATCH 0005/1124] Provide default callback implementations for various commands --- .../api/model/BuildResponseItem.java | 20 ++++ .../api/model/PullResponseItem.java | 15 +++ .../api/model/PushResponseItem.java | 14 +++ .../dockerjava/api/model/ResponseItem.java | 8 ++ .../core/async/ResultCallbackTemplate.java | 18 ++-- .../core/command/AbstrAsyncDockerCmd.java | 5 - .../AttachContainerResultCallback.java | 25 +++++ .../command/BuildImageResultCallback.java | 72 ++++++++++++++ .../core/command/EventsResultCallback.java | 25 +++++ .../command/LogContainerResultCallback.java | 25 +++++ .../core/command/PullImageResultCallback.java | 47 +++++++++ .../core/command/PushImageResultCallback.java | 47 +++++++++ .../util/WrappedResponseInputStream.java | 7 ++ .../client/AbstractDockerClientTest.java | 97 +++++++++---------- .../command/AttachContainerCmdImplTest.java | 35 ++++--- .../core/command/BuildImageCmdImplTest.java | 32 ++---- .../core/command/DockerfileFixture.java | 3 +- .../core/command/EventsCmdImplTest.java | 17 ++-- .../core/command/FrameReaderITest.java | 21 +++- .../command/ListContainersCmdImplTest.java | 4 +- .../core/command/LogContainerCmdImplTest.java | 13 ++- .../core/command/PullImageCmdImplTest.java | 9 +- .../core/command/PushImageCmdImplTest.java | 22 ++--- src/test/resources/logback.xml | 2 +- 24 files changed, 437 insertions(+), 146 deletions(-) create mode 100644 src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java create mode 100644 src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java create mode 100644 src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java create mode 100644 src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java create mode 100644 src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java create mode 100644 src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java 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 c999652ec..5fd4effc8 100644 --- a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -11,10 +12,29 @@ public class BuildResponseItem extends ResponseItem { private static final long serialVersionUID = -1252904184236343612L; + private static final String BUILD_SUCCESS = "Successfully built"; + @JsonProperty("stream") private String stream; public String getStream() { return stream; } + + /** + * Returns whether the stream field indicates a successful build operation + */ + @JsonIgnore + public boolean isBuildSuccessIndicated() { + if(getStream() == null) return false; + + return getStream().contains(BUILD_SUCCESS); + } + + @JsonIgnore + public String getImageId() { + if(!isBuildSuccessIndicated()) return null; + + return getStream().replaceFirst(BUILD_SUCCESS, "").trim(); + } } 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 cb856a115..6b2d46e7f 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** @@ -10,4 +11,18 @@ public class PullResponseItem extends ResponseItem { private static final long serialVersionUID = 6316219017613249047L; + /** + * Returns whether the status indicates a successful pull operation + * + * @returns true: status indicates that pull was successful, false: status doesn't indicate a successful pull + */ + @JsonIgnore + public boolean isPullSuccessIndicated() { + if (getStatus() == null) + return false; + + return (getStatus().contains("Download complete") || getStatus().contains("Image is up to date") || getStatus() + .contains("Downloaded newer image")); + } + } 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 b97042154..2555271fd 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java @@ -1,5 +1,6 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** @@ -9,4 +10,17 @@ public class PushResponseItem extends ResponseItem { private static final long serialVersionUID = 8256977108011295857L; + + /** + * Returns whether the error field indicates an error + * + * @returns true: the error field indicates an error, false: the error field doesn't indicate an error + */ + @JsonIgnore + public boolean isErrorIndicated() { + if (getError() == null) + return false; + + return true; + } } 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 f7c4c502d..3ea625164 100644 --- a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java @@ -50,6 +50,14 @@ public String getId() { return id; } + public String getError() { + return error; + } + + public ErrorDetail getErrorDetail() { + return errorDetail; + } + @JsonIgnoreProperties(ignoreUnknown = false) public static class ProgressDetail implements Serializable { private static final long serialVersionUID = -1954994695645715264L; 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 40354447f..d94ce1950 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -24,21 +24,22 @@ public abstract class ResultCallbackTemplate, A_RES_T> implements AsyncDockerCmd { - private final static Logger LOGGER = LoggerFactory.getLogger(AbstrAsyncDockerCmd.class); - protected DockerCmdAsyncExec execution; public AbstrAsyncDockerCmd(DockerCmdAsyncExec 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 new file mode 100644 index 000000000..2822b8e48 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/AttachContainerResultCallback.java @@ -0,0 +1,25 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +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 AttachContainerResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(AttachContainerResultCallback.class); + + @Override + public void onNext(Frame item) { + LOGGER.debug(item.toString()); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java new file mode 100644 index 000000000..9f33f81dc --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java @@ -0,0 +1,72 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class BuildImageResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(BuildImageResultCallback.class); + + private BuildResponseItem latestItem = null; + + @Override + public void onNext(BuildResponseItem item) { + this.latestItem = item; + LOGGER.debug(item.toString()); + } + + /** + * Awaits the image id from the response stream. + * + * @throws DockerClientException + * if the build fails. + */ + public String awaitImageId() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + return getImageId(); + } + + /** + * Awaits the image id from the response stream. + * + * @throws DockerClientException + * if the build fails or the timeout occurs. + */ + public String awaitImageId(long timeout, TimeUnit timeUnit) { + try { + awaitCompletion(timeout, timeUnit); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + return getImageId(); + } + + private String getImageId() { + if (latestItem == null || !latestItem.isBuildSuccessIndicated()) { + throw new DockerClientException("Could not build image: " + latestItem.getError()); + } else { + return latestItem.getImageId(); + } + } + +} diff --git a/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java b/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java new file mode 100644 index 000000000..29efac6ca --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/EventsResultCallback.java @@ -0,0 +1,25 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class EventsResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(EventsResultCallback.class); + + @Override + public void onNext(Event item) { + LOGGER.debug(item.toString()); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java b/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java new file mode 100644 index 000000000..ffe46baf8 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerResultCallback.java @@ -0,0 +1,25 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +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 LogContainerResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(LogContainerResultCallback.class); + + @Override + public void onNext(Frame item) { + LOGGER.debug(item.toString()); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java new file mode 100644 index 000000000..18c33f885 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java @@ -0,0 +1,47 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.PullResponseItem; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class PullImageResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(PullImageResultCallback.class); + + private PullResponseItem latestItem = null; + + @Override + public void onNext(PullResponseItem item) { + this.latestItem = item; + LOGGER.debug(item.toString()); + } + + /** + * Awaits the image to be pulled successful. + * + * @throws DockerClientException + * if the pull fails. + */ + public void awaitSuccess() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + if (latestItem == null || !latestItem.isPullSuccessIndicated()) { + throw new DockerClientException("Could not pull image: " + latestItem.getError()); + } + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java new file mode 100644 index 000000000..afcd16389 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java @@ -0,0 +1,47 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.core.command; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.DockerClientException; +import com.github.dockerjava.api.model.PushResponseItem; +import com.github.dockerjava.core.async.ResultCallbackTemplate; + +/** + * + * @author marcus + * + */ +public class PushImageResultCallback extends ResultCallbackTemplate { + + private final static Logger LOGGER = LoggerFactory.getLogger(PushImageResultCallback.class); + + private PushResponseItem latestItem = null; + + @Override + public void onNext(PushResponseItem item) { + this.latestItem = item; + LOGGER.debug(item.toString()); + } + + /** + * Awaits the image to be pulled successful. + * + * @throws DockerClientException + * if the push fails. + */ + public void awaitSuccess() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + if (latestItem == null || latestItem.isErrorIndicated()) { + throw new DockerClientException("Could not push image: " + latestItem.getError()); + } + } +} 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 fe4514273..05d4f9066 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java +++ b/src/main/java/com/github/dockerjava/jaxrs/util/WrappedResponseInputStream.java @@ -18,6 +18,8 @@ public class WrappedResponseInputStream extends InputStream { private InputStream delegate; + private boolean closed = false; + public WrappedResponseInputStream(Response response) { this.response = response; this.delegate = response.readEntity(InputStream.class); @@ -52,6 +54,7 @@ public int available() throws IOException { } public void close() throws IOException { + closed = true; response.close(); delegate.close(); } @@ -68,4 +71,8 @@ public boolean markSupported() { return delegate.markSupported(); } + public boolean isClosed() { + return closed; + } + } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index cc07540f0..6c7b4f860 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -2,7 +2,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsString; import java.io.File; import java.io.IOException; @@ -25,7 +24,6 @@ import com.github.dockerjava.api.DockerException; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.InspectContainerResponse; -import com.github.dockerjava.api.model.BuildResponseItem; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.PullResponseItem; import com.github.dockerjava.api.model.Volume; @@ -34,6 +32,9 @@ import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.TestDockerCmdExecFactory; import com.github.dockerjava.core.async.ResultCallbackTemplate; +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 { @@ -54,7 +55,7 @@ public void beforeTest() throws Exception { LOG.info("Pulling image 'busybox'"); // need to block until image is pulled completely - dockerClient.pullImageCmd("busybox").withTag("latest").exec(new PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd("busybox").withTag("latest").exec(new PullImageResultCallback()).awaitSuccess(); assertNotNull(dockerClient); LOG.info("======================= END OF BEFORETEST =======================\n\n"); @@ -187,43 +188,53 @@ public static void assertContainerHasVolumes(InspectContainerResponse inspectCon assertThat(volumes, contains(expectedVolumes)); } - public static class CollectFramesCallback extends CollectStreamItemCallback { - - @Override - public void onNext(Frame frame) { - items.add(frame); - log.append(new String(frame.getPayload())); - } - - } +// public static class CollectFramesCallback extends CollectStreamItemCallback { +// +// @Override +// public void onNext(Frame frame) { +// items.add(frame); +// log.append(new String(frame.getPayload())); +// } +// +// } protected String containerLog(String containerId) throws Exception { - - CollectFramesCallback collectFramesCallback = dockerClient.logContainerCmd(containerId).withStdOut() - .exec(new CollectFramesCallback()); - - collectFramesCallback.awaitCompletion(); - - return collectFramesCallback.toString(); - } - - public static class CollectStreamItemCallback, A_RES_T> extends - ResultCallbackTemplate { - public final List items = new ArrayList(); - + return dockerClient.logContainerCmd(containerId).withStdOut() + .exec(new LogContainerTestCallback()).awaitCompletion().toString(); + } + +// public static class CollectStreamItemCallback, A_RES_T> extends +// ResultCallbackTemplate { +// public final List items = new ArrayList(); +// +// protected final StringBuffer log = new StringBuffer(); +// +// @Override +// public void onError(Throwable throwable) { +// throwable.printStackTrace(); +// super.onError(throwable); +// } +// +// @Override +// public void onNext(A_RES_T item) { +// items.add(item); +// log.append("" + item); +// LOG.info(item.toString()); +// } +// +// @Override +// public String toString() { +// return log.toString(); +// } +// } + + public static class LogContainerTestCallback extends LogContainerResultCallback { protected final StringBuffer log = new StringBuffer(); @Override - public void onError(Throwable throwable) { - throwable.printStackTrace(); - super.onError(throwable); - } - - @Override - public void onNext(A_RES_T item) { - items.add(item); - log.append("" + item); - LOG.info(item.toString()); + public void onNext(Frame frame) { + log.append(new String(frame.getPayload())); + super.onNext(frame); } @Override @@ -232,21 +243,9 @@ public String toString() { } } - public static class BuildLogCallback extends CollectStreamItemCallback { - public String awaitImageId() throws Exception { - awaitCompletion(); - BuildResponseItem item = items.get(items.size() - 1); - assertThat(item.toString(), containsString("Successfully built")); - return item.getStream().replaceFirst("Successfully built", "").trim(); - } - } - - public static class PullResponseCallback extends CollectStreamItemCallback { - - } - protected String buildImage(File baseDir) throws Exception { - return dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildLogCallback()).awaitImageId(); + return dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); } + } 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 04e344056..8fa5b2269 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -57,7 +57,7 @@ public void attachContainerWithoutTTY() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - CollectFramesCallback collectFramesCallback = new CollectFramesCallback() { + AttachContainerTestCallback callback = new AttachContainerTestCallback() { @Override public void onNext(Frame frame) { assertEquals(frame.getStreamType(), StreamType.STDOUT); @@ -66,13 +66,9 @@ public void onNext(Frame frame) { }; dockerClient.attachContainerCmd(container.getId()).withStdErr().withStdOut().withFollowStream().withLogs() - .exec(collectFramesCallback); + .exec(callback).awaitCompletion(30, TimeUnit.SECONDS).close(); - collectFramesCallback.awaitCompletion(30, TimeUnit.SECONDS); - - collectFramesCallback.close(); - - assertThat(collectFramesCallback.toString(), containsString(snippet)); + assertThat(callback.toString(), containsString(snippet)); } @Test @@ -90,7 +86,7 @@ public void attachContainerWithTTY() throws Exception { dockerClient.startContainerCmd(container.getId()).exec(); - CollectFramesCallback collectFramesCallback = new CollectFramesCallback() { + AttachContainerTestCallback callback = new AttachContainerTestCallback() { @Override public void onNext(Frame frame) { assertEquals(frame.getStreamType(), StreamType.RAW); @@ -99,16 +95,27 @@ public void onNext(Frame frame) { }; dockerClient.attachContainerCmd(container.getId()).withStdErr().withStdOut().withFollowStream() - .exec(collectFramesCallback); + .exec(callback).awaitCompletion(15, TimeUnit.SECONDS).close(); + + System.out.println("log: " + callback.toString()); - collectFramesCallback.awaitCompletion(15, TimeUnit.SECONDS); + // HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); - collectFramesCallback.close(); + assertThat(callback.toString(), containsString("stdout\r\nstderr")); + } - System.out.println("log: " + collectFramesCallback.toString()); + public static class AttachContainerTestCallback extends AttachContainerResultCallback { + private StringBuffer log = new StringBuffer(); - // HexDump.dump(collectFramesCallback.toString().getBytes(), 0, System.out, 0); + @Override + public void onNext(Frame item) { + log.append(new String(item.getPayload())); + super.onNext(item); + } - assertThat(collectFramesCallback.toString(), containsString("stdout\r\nstderr")); + @Override + public String toString() { + return log.toString(); + } } } 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 597a90877..6d2b4c805 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -86,7 +86,7 @@ public void testNonstandard2() throws Exception { .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); dockerClient.buildImageCmd().withBaseDirectory(baseDir).withDockerfile(dockerFile).withNoCache() - .exec(new BuildLogCallback()).awaitImageId(); + .exec(new BuildImageResultCallback()).awaitImageId(); } @Test @@ -147,13 +147,7 @@ private String dockerfileBuild(File baseDir) throws Exception { } private String execBuild(BuildImageCmd buildImageCmd) throws Exception { - - BuildLogCallback resultCallback = new BuildLogCallback(); - ; - - buildImageCmd.withNoCache().exec(resultCallback); - - String imageId = resultCallback.awaitImageId(); + String imageId = buildImageCmd.withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); // Create container based on image CreateContainerResponse container = dockerClient.createContainerCmd(imageId).exec(); @@ -165,7 +159,6 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception { dockerClient.waitContainerCmd(container.getId()).exec(); return containerLog(container.getId()); - } @Test(expectedExceptions = { DockerClientException.class }) @@ -173,7 +166,7 @@ public void testDockerfileIgnored() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileIgnored") .getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildLogCallback()).awaitImageId(); + dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); } @Test(expectedExceptions = { DockerClientException.class }) @@ -181,7 +174,7 @@ public void testInvalidDockerIgnorePattern() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() .getResource("testInvalidDockerignorePattern").getFile()); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildLogCallback()).awaitImageId(); + dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); } @Test(groups = "ignoreInCircleCi") @@ -193,22 +186,11 @@ public void testDockerIgnore() throws Exception { } @Test - public void testNetCatDockerfileBuilder() throws InterruptedException, IOException { + public void testNetCatDockerfileBuilder() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile()); - BuildLogCallback resultCallback = new BuildLogCallback(); - dockerClient.buildImageCmd(baseDir).withNoCache().exec(resultCallback); - - resultCallback.awaitCompletion(); - - String imageId = null; - - for (BuildResponseItem item : resultCallback.items) { - String text = item.getStream(); - if (text.startsWith("Successfully built ")) { - imageId = StringUtils.substringBetween(text, "Successfully built ", "\n").trim(); - } - } + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()) + .awaitImageId(); assertNotNull(imageId, "Not successful in build"); 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 3d6df071d..9d9b15fd1 100644 --- a/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java +++ b/src/test/java/com/github/dockerjava/core/command/DockerfileFixture.java @@ -9,7 +9,6 @@ import com.github.dockerjava.api.InternalServerErrorException; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.model.Image; -import com.github.dockerjava.client.AbstractDockerClientTest.BuildLogCallback; /** * Start and stop a single container for testing. @@ -36,7 +35,7 @@ public void open() throws Exception { LOGGER.info("building {}", directory); dockerClient.buildImageCmd(new File("src/test/resources", directory)).withNoCache() - .exec(new BuildLogCallback()).awaitImageId(); + .exec(new BuildImageResultCallback()).awaitImageId(); Image lastCreatedImage = dockerClient.listImagesCmd().exec().get(0); 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 433940e2e..2d1be184a 100644 --- a/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/EventsCmdImplTest.java @@ -17,7 +17,6 @@ import com.github.dockerjava.api.model.Event; import com.github.dockerjava.api.model.EventFilters; import com.github.dockerjava.client.AbstractDockerClientTest; -import com.github.dockerjava.core.async.ResultCallbackTemplate; @Test(groups = "integration") public class EventsCmdImplTest extends AbstractDockerClientTest { @@ -61,7 +60,7 @@ public void testEventStreamTimeBound() throws Exception { String endTime = getEpochTime(); CountDownLatch countDownLatch = new CountDownLatch(expectedEvents); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch); dockerClient.eventsCmd().withSince(startTime).withUntil(endTime).exec(eventCallback); @@ -78,7 +77,7 @@ public void testEventStreaming1() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch); dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback); @@ -96,7 +95,7 @@ public void testEventStreaming2() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(KNOWN_NUM_EVENTS); - EventCallbackTest eventCallback = new EventCallbackTest(countDownLatch); + EventsTestCallback eventCallback = new EventsTestCallback(countDownLatch); dockerClient.eventsCmd().withSince(getEpochTime()).exec(eventCallback); @@ -113,8 +112,8 @@ public void testEventStreamingWithFilter() throws Exception { TimeUnit.SECONDS.sleep(1); CountDownLatch countDownLatch = new CountDownLatch(1); - EventCallbackTest eventCallback = dockerClient.eventsCmd().withFilters(new EventFilters().withEvent("start")) - .exec(new EventCallbackTest(countDownLatch)); + EventsTestCallback eventCallback = dockerClient.eventsCmd().withFilters(new EventFilters().withEvent("start")) + .exec(new EventsTestCallback(countDownLatch)); generateEvents(); @@ -130,7 +129,7 @@ public void testEventStreamingWithFilter() throws Exception { private int generateEvents() throws Exception { String testImage = "busybox"; - dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); CreateContainerResponse container = dockerClient.createContainerCmd(testImage).withCmd("sleep", "9999").exec(); dockerClient.startContainerCmd(container.getId()).exec(); @@ -138,13 +137,13 @@ private int generateEvents() throws Exception { return KNOWN_NUM_EVENTS; } - private class EventCallbackTest extends ResultCallbackTemplate { + private class EventsTestCallback extends EventsResultCallback { private final CountDownLatch countDownLatch; private final List events = new ArrayList(); - public EventCallbackTest(CountDownLatch countDownLatch) { + public EventsTestCallback(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } 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 6be9b2a49..5b1df2241 100644 --- a/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java +++ b/src/test/java/com/github/dockerjava/core/command/FrameReaderITest.java @@ -3,6 +3,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -53,16 +54,14 @@ public void canCloseFrameReaderAndReadExpectedLines() throws Exception { private List getLoggingFrames() throws Exception { - AbstractDockerClientTest.CollectFramesCallback collectFramesCallback = new AbstractDockerClientTest.CollectFramesCallback(); + FrameReaderITestCallback collectFramesCallback = new FrameReaderITestCallback(); dockerClient.logContainerCmd(dockerfileFixture.getContainerId()).withStdOut().withStdErr().withTailAll() // we can't follow stream here as it blocks reading from resulting InputStream infinitely // .withFollowStream() - .exec(collectFramesCallback); + .exec(collectFramesCallback).awaitCompletion(); - collectFramesCallback.awaitCompletion(); - - return collectFramesCallback.items; + return collectFramesCallback.frames; } @Test @@ -94,4 +93,16 @@ public void run() { thread.join(); } + + public static class FrameReaderITestCallback extends LogContainerResultCallback { + + public List frames = new ArrayList(); + + @Override + public void onNext(Frame item) { + frames.add(item); + super.onNext(item); + } + + } } 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 033c7a709..e41b7736f 100644 --- a/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/ListContainersCmdImplTest.java @@ -58,7 +58,7 @@ public void testListContainers() throws Exception { String testImage = "busybox"; // need to block until image is pulled completely - dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); assertThat(containers, notNullValue()); @@ -106,7 +106,7 @@ public void testListContainersWithLabelsFilter() throws Exception { String testImage = "busybox"; // need to block until image is pulled completely - dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitCompletion(); List containers = dockerClient.listContainersCmd().withShowAll(true).exec(); assertThat(containers, notNullValue()); 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 f3c8f0222..6d887f359 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -17,6 +17,7 @@ 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") @@ -59,7 +60,7 @@ public void asyncLogContainer() throws Exception { assertThat(exitCode, equalTo(0)); - CollectFramesCallback loggingCallback = new CollectFramesCallback(); + LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); @@ -71,7 +72,7 @@ public void asyncLogContainer() throws Exception { @Test public void asyncLogNonExistingContainer() throws Exception { - CollectFramesCallback loggingCallback = new CollectFramesCallback() { + LogContainerTestCallback loggingCallback = new LogContainerTestCallback() { @Override public void onError(Throwable throwable) { @@ -113,19 +114,19 @@ public void asyncMultipleLogContainer() throws Exception { assertThat(exitCode, equalTo(0)); - CollectFramesCallback loggingCallback = new CollectFramesCallback(); + LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); loggingCallback.close(); - loggingCallback = new CollectFramesCallback(); + loggingCallback = new LogContainerTestCallback(); dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); loggingCallback.close(); - loggingCallback = new CollectFramesCallback(); + loggingCallback = new LogContainerTestCallback(); dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); @@ -133,4 +134,6 @@ public void asyncMultipleLogContainer() throws Exception { assertTrue(loggingCallback.toString().contains(snippet)); } + + } 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 83c433775..10e31e171 100644 --- a/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PullImageCmdImplTest.java @@ -1,7 +1,6 @@ package com.github.dockerjava.core.command; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.hamcrest.Matchers.notNullValue; @@ -95,11 +94,7 @@ public void testPullImage() throws Exception { LOG.info("Pulling image: {}", testImage); - PullResponseCallback callback = dockerClient.pullImageCmd(testImage).exec(new PullResponseCallback()); - - callback.awaitCompletion(); - - assertThat(callback.toString(), containsString("Download complete")); + dockerClient.pullImageCmd(testImage).exec(new PullImageResultCallback()).awaitSuccess(); info = dockerClient.infoCmd().exec(); LOG.info("Client info after pull, {}", info.toString()); @@ -116,7 +111,7 @@ 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 PullResponseCallback()).awaitCompletion(); + dockerClient.pullImageCmd("xvxcv/foo").exec(new PullImageResultCallback()).awaitCompletion(); } } 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 23eff6db4..bb42d5b4b 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -1,7 +1,6 @@ package com.github.dockerjava.core.command; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.not; @@ -16,8 +15,8 @@ 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.api.model.PushResponseItem; import com.github.dockerjava.client.AbstractDockerClientTest; @Test(groups = "integration") @@ -61,28 +60,23 @@ public void pushLatest() throws Exception { String imageId = dockerClient.commitCmd(container.getId()).withRepository(username + "/busybox").exec(); // we have to block until image is pushed - dockerClient.pushImageCmd(username + "/busybox").exec(new PushResponseCallback()).awaitCompletion(); + dockerClient.pushImageCmd(username + "/busybox").exec(new PushImageResultCallback()).awaitSuccess(); LOG.info("Removing image: {}", imageId); dockerClient.removeImageCmd(imageId).exec(); - PullResponseCallback pushCallback = dockerClient.pullImageCmd(username + "/busybox") - .exec(new PullResponseCallback()).awaitCompletion(); - - assertThat(pushCallback.toString(), not(containsString("HTTP code: 404"))); + dockerClient.pullImageCmd(username + "/busybox") + .exec(new PullImageResultCallback()).awaitSuccess(); } - @Test + @Test(expectedExceptions = DockerClientException.class) public void pushNonExistentImage() throws Exception { - PushResponseCallback callback = dockerClient.pushImageCmd(username + "/xxx").exec(new PushResponseCallback()) - .awaitCompletion(); + dockerClient.pushImageCmd(username + "/xxx").exec(new PushImageResultCallback()) + .awaitSuccess(); - assertThat(callback.toString(), containsString("error")); - } - - public static class PushResponseCallback extends CollectStreamItemCallback { } + } diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml index bea30de0e..c2d4557a4 100644 --- a/src/test/resources/logback.xml +++ b/src/test/resources/logback.xml @@ -6,7 +6,7 @@ - + From d54c5218dfdb0584280c7aaca4b5d04a3a44e05d Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 24 Jul 2015 22:49:35 +0200 Subject: [PATCH 0006/1124] Remove comments --- .../client/AbstractDockerClientTest.java | 38 ------------------- 1 file changed, 38 deletions(-) diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 6c7b4f860..8ed9164da 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -22,16 +22,13 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.DockerException; -import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Frame; -import com.github.dockerjava.api.model.PullResponseItem; 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.async.ResultCallbackTemplate; import com.github.dockerjava.core.command.BuildImageResultCallback; import com.github.dockerjava.core.command.LogContainerResultCallback; import com.github.dockerjava.core.command.PullImageResultCallback; @@ -188,46 +185,11 @@ public static void assertContainerHasVolumes(InspectContainerResponse inspectCon assertThat(volumes, contains(expectedVolumes)); } -// public static class CollectFramesCallback extends CollectStreamItemCallback { -// -// @Override -// public void onNext(Frame frame) { -// items.add(frame); -// log.append(new String(frame.getPayload())); -// } -// -// } - protected String containerLog(String containerId) throws Exception { return dockerClient.logContainerCmd(containerId).withStdOut() .exec(new LogContainerTestCallback()).awaitCompletion().toString(); } -// public static class CollectStreamItemCallback, A_RES_T> extends -// ResultCallbackTemplate { -// public final List items = new ArrayList(); -// -// protected final StringBuffer log = new StringBuffer(); -// -// @Override -// public void onError(Throwable throwable) { -// throwable.printStackTrace(); -// super.onError(throwable); -// } -// -// @Override -// public void onNext(A_RES_T item) { -// items.add(item); -// log.append("" + item); -// LOG.info(item.toString()); -// } -// -// @Override -// public String toString() { -// return log.toString(); -// } -// } - public static class LogContainerTestCallback extends LogContainerResultCallback { protected final StringBuffer log = new StringBuffer(); From ec74b04c25ea89a16ca43493a2115fc8e1bcf3e3 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 24 Jul 2015 23:13:04 +0200 Subject: [PATCH 0007/1124] Fixing serialVersionId --- .../java/com/github/dockerjava/api/model/PullResponseItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6b2d46e7f..b2bedca60 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -9,7 +9,7 @@ @JsonIgnoreProperties(ignoreUnknown = false) public class PullResponseItem extends ResponseItem { - private static final long serialVersionUID = 6316219017613249047L; + private static final long serialVersionUID = -2575482839766823293L; /** * Returns whether the status indicates a successful pull operation From ba9fe85a5536bb5c988452551550e255bbeca094 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 24 Jul 2015 23:13:31 +0200 Subject: [PATCH 0008/1124] Format source --- .../com/github/dockerjava/api/model/BuildResponseItem.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 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 5fd4effc8..37fae34e7 100644 --- a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -26,14 +26,16 @@ public String getStream() { */ @JsonIgnore public boolean isBuildSuccessIndicated() { - if(getStream() == null) return false; + if (getStream() == null) + return false; return getStream().contains(BUILD_SUCCESS); } @JsonIgnore public String getImageId() { - if(!isBuildSuccessIndicated()) return null; + if (!isBuildSuccessIndicated()) + return null; return getStream().replaceFirst(BUILD_SUCCESS, "").trim(); } From 12ab37e3277064a899ee0550ab2f4b6fe6ddd6af Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 24 Jul 2015 23:13:49 +0200 Subject: [PATCH 0009/1124] Add exception message --- .../dockerjava/core/command/BuildImageResultCallback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9f33f81dc..4de6e280e 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java @@ -55,7 +55,7 @@ public String awaitImageId(long timeout, TimeUnit timeUnit) { try { awaitCompletion(timeout, timeUnit); } catch (InterruptedException e) { - throw new DockerClientException("", e); + throw new DockerClientException("Awaiting image id interrupted: ", e); } return getImageId(); From 2e315103591ab8cea58b218cb7b2804b58e18af9 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 26 Jul 2015 20:16:48 +0200 Subject: [PATCH 0010/1124] Remove JAXRS/ApacheConnector implementation specific properties from DockerClientConfig --- .../dockerjava/core/DockerClientConfig.java | 112 +----------------- .../jaxrs/DockerCmdExecFactoryImpl.java | 86 +++++++++++--- .../filter}/FollowRedirectsFilter.java | 2 +- .../filter}/JsonClientFilter.java | 2 +- .../util => jaxrs/filter}/LoggingFilter.java | 2 +- .../ResponseStatusExceptionFilter.java | 2 +- .../filter}/SelectiveLoggingFilter.java | 2 +- .../core/DockerClientConfigTest.java | 11 +- .../dockerjava/core/DockerClientImplTest.java | 3 +- 9 files changed, 85 insertions(+), 137 deletions(-) rename src/main/java/com/github/dockerjava/{core/util => jaxrs/filter}/FollowRedirectsFilter.java (96%) rename src/main/java/com/github/dockerjava/{core/util => jaxrs/filter}/JsonClientFilter.java (94%) rename src/main/java/com/github/dockerjava/{core/util => jaxrs/filter}/LoggingFilter.java (99%) rename src/main/java/com/github/dockerjava/{core/util => jaxrs/filter}/ResponseStatusExceptionFilter.java (98%) rename src/main/java/com/github/dockerjava/{core/util => jaxrs/filter}/SelectiveLoggingFilter.java (96%) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index a96f61556..800ed5772 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -40,22 +40,10 @@ public class DockerClientConfig implements Serializable { private static final String DOCKER_IO_SERVER_ADDRESS_PROPERTY = "docker.io.serverAddress"; - private static final String DOCKER_IO_READ_TIMEOUT_PROPERTY = "docker.io.readTimeout"; - - // this is really confusing, as there are two ways to spell it - private static final String DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY = "docker.io.enableLoggingFilter"; - - private static final String DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY = "docker.io.followRedirectsFilter"; - private static final String DOCKER_IO_DOCKER_CERT_PATH_PROPERTY = "docker.io.dockerCertPath"; private static final String DOCKER_IO_DOCKER_CFG_PATH_PROPERTY = "docker.io.dockerCfgPath"; - // connection pooling properties - private static final String DOCKER_IO_MAX_PER_ROUTE_PROPERTY = "docker.io.perRouteConnections"; - - private static final String DOCKER_IO_MAX_TOTAL_PROPERTY = "docker.io.totalConnections"; - /** * A map from the environment name to the interval name. */ @@ -69,9 +57,6 @@ public class DockerClientConfig implements Serializable { 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_READ_TIMEOUT", DOCKER_IO_READ_TIMEOUT_PROPERTY); - m.put("DOCKER_LOGGING_FILTER_ENABLED", DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY); - m.put("DOCKER_FOLLOW_REDIRECTS_FILTER_ENABLED", DOCKER_IO_FOLLOW_REDIRECTS_FILTER_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); @@ -83,21 +68,10 @@ public class DockerClientConfig implements Serializable { private final String version, username, password, email, serverAddress, dockerCfgPath; - private final Integer readTimeout; - - private final boolean loggingFilterEnabled; - - private final boolean followRedirectsFilterEnabled; - private final SSLConfig sslConfig; - private final Integer maxTotalConnections; - - private final Integer maxPerRouteConnections; - DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress, - String dockerCfgPath, Integer readTimeout, boolean loggingFilterEnabled, - boolean followRedirectsFilterEnabled, SSLConfig sslConfig, Integer maxTotalConns, Integer maxPerRouteConns) { + String dockerCfgPath, SSLConfig sslConfig) { this.uri = uri; this.version = version; this.username = username; @@ -105,12 +79,7 @@ public class DockerClientConfig implements Serializable { this.email = email; this.serverAddress = serverAddress; this.dockerCfgPath = dockerCfgPath; - this.readTimeout = readTimeout; - this.loggingFilterEnabled = loggingFilterEnabled; - this.followRedirectsFilterEnabled = followRedirectsFilterEnabled; this.sslConfig = sslConfig; - this.maxTotalConnections = maxTotalConns; - this.maxPerRouteConnections = maxPerRouteConns; } private static Properties loadIncludedDockerProperties(Properties systemProperties) { @@ -208,8 +177,7 @@ private static Properties overrideDockerPropertiesWithSystemProperties(Propertie 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_READ_TIMEOUT_PROPERTY, - DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, + DOCKER_IO_SERVER_ADDRESS_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, }) { if (systemProperties.containsKey(key)) { overriddenProperties.setProperty(key, systemProperties.getProperty(key)); @@ -261,18 +229,6 @@ public String getServerAddress() { return serverAddress; } - public Integer getReadTimeout() { - return readTimeout; - } - - public boolean isLoggingFilterEnabled() { - return loggingFilterEnabled; - } - - public boolean followRedirectsFilterEnabled() { - return followRedirectsFilterEnabled; - } - public SSLConfig getSslConfig() { return sslConfig; } @@ -281,14 +237,6 @@ public String getDockerCfgPath() { return dockerCfgPath; } - public Integer getMaxTotalConnections() { - return maxTotalConnections; - } - - public Integer getMaxPerRoutConnections() { - return maxPerRouteConnections; - } - private AuthConfig getAuthConfig() { AuthConfig authConfig = null; if (getUsername() != null && getPassword() != null && getEmail() != null && getServerAddress() != null) { @@ -352,8 +300,6 @@ public boolean equals(Object o) { DockerClientConfig that = (DockerClientConfig) o; - if (loggingFilterEnabled != that.loggingFilterEnabled) - return false; if (sslConfig != null ? !sslConfig.equals(that.sslConfig) : that.sslConfig != null) return false; if (dockerCfgPath != null ? !dockerCfgPath.equals(that.dockerCfgPath) : that.dockerCfgPath != null) @@ -362,8 +308,6 @@ public boolean equals(Object o) { return false; if (password != null ? !password.equals(that.password) : that.password != null) return false; - if (readTimeout != null ? !readTimeout.equals(that.readTimeout) : that.readTimeout != 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) @@ -386,8 +330,6 @@ public int hashCode() { result = 31 * result + (serverAddress != null ? serverAddress.hashCode() : 0); result = 31 * result + (dockerCfgPath != null ? dockerCfgPath.hashCode() : 0); result = 31 * result + (sslConfig != null ? sslConfig.hashCode() : 0); - result = 31 * result + (readTimeout != null ? readTimeout.hashCode() : 0); - result = 31 * result + (loggingFilterEnabled ? 1 : 0); return result; } @@ -396,8 +338,7 @@ public String toString() { return "DockerClientConfig{" + "uri=" + uri + ", version='" + version + '\'' + ", username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + ", serverAddress='" + serverAddress + '\'' + ", dockerCfgPath='" + dockerCfgPath + '\'' + ", sslConfig='" + sslConfig + '\'' - + ", readTimeout=" + readTimeout + ", loggingFilterEnabled=" + loggingFilterEnabled - + ", followRedirectsFilterEnabled=" + followRedirectsFilterEnabled + '}'; + + '}'; } public static class DockerClientConfigBuilder { @@ -405,10 +346,6 @@ public static class DockerClientConfigBuilder { private String version, username, password, email, serverAddress, dockerCfgPath; - private Integer readTimeout, maxTotalConnections, maxPerRouteConnections; - - private boolean loggingFilterEnabled, followRedirectsFilterEnabled; - private SSLConfig sslConfig; /** @@ -424,21 +361,8 @@ public DockerClientConfigBuilder withProperties(Properties p) { .withPassword(p.getProperty(DOCKER_IO_PASSWORD_PROPERTY)) .withEmail(p.getProperty(DOCKER_IO_EMAIL_PROPERTY)) .withServerAddress(p.getProperty(DOCKER_IO_SERVER_ADDRESS_PROPERTY)) - .withReadTimeout(Integer.valueOf(p.getProperty(DOCKER_IO_READ_TIMEOUT_PROPERTY, "0"))) - .withLoggingFilter(Boolean.valueOf(p.getProperty(DOCKER_IO_ENABLE_LOGGING_FILTER_PROPERTY, "true"))) - .withFollowRedirectsFilter( - Boolean.valueOf(p.getProperty(DOCKER_IO_FOLLOW_REDIRECTS_FILTER_PROPERTY, "false"))) .withDockerCertPath(p.getProperty(DOCKER_IO_DOCKER_CERT_PATH_PROPERTY)) - .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)) - .withMaxPerRouteConnections(integerValue(p.getProperty(DOCKER_IO_MAX_PER_ROUTE_PROPERTY))) - .withMaxTotalConnections(integerValue(p.getProperty(DOCKER_IO_MAX_TOTAL_PROPERTY))); - } - - private Integer integerValue(String value) { - if (value != null) - return Integer.valueOf(value); - else - return null; + .withDockerCfgPath(p.getProperty(DOCKER_IO_DOCKER_CFG_PATH_PROPERTY)); } public final DockerClientConfigBuilder withUri(String uri) { @@ -472,31 +396,6 @@ public DockerClientConfigBuilder withServerAddress(String serverAddress) { return this; } - public final DockerClientConfigBuilder withReadTimeout(Integer readTimeout) { - this.readTimeout = readTimeout; - return this; - } - - public final DockerClientConfigBuilder withMaxTotalConnections(Integer maxTotalConnections) { - this.maxTotalConnections = maxTotalConnections; - return this; - } - - public final DockerClientConfigBuilder withMaxPerRouteConnections(Integer maxPerRouteConnections) { - this.maxPerRouteConnections = maxPerRouteConnections; - return this; - } - - public final DockerClientConfigBuilder withLoggingFilter(boolean loggingFilterEnabled) { - this.loggingFilterEnabled = loggingFilterEnabled; - return this; - } - - public final DockerClientConfigBuilder withFollowRedirectsFilter(boolean followRedirectsFilterEnabled) { - this.followRedirectsFilterEnabled = followRedirectsFilterEnabled; - return this; - } - public final DockerClientConfigBuilder withDockerCertPath(String dockerCertPath) { if (dockerCertPath != null) { this.sslConfig = new LocalDirectorySSLConfig(dockerCertPath); @@ -516,8 +415,7 @@ public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { public DockerClientConfig build() { return new DockerClientConfig(uri, version, username, password, email, serverAddress, dockerCfgPath, - readTimeout, loggingFilterEnabled, followRedirectsFilterEnabled, sslConfig, maxTotalConnections, - maxPerRouteConnections); + sslConfig); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index cb08f8d8b..f3ad427f5 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -8,6 +8,8 @@ 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; @@ -62,13 +64,13 @@ 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.util.FollowRedirectsFilter; -import com.github.dockerjava.core.util.JsonClientFilter; -import com.github.dockerjava.core.util.ResponseStatusExceptionFilter; -import com.github.dockerjava.core.util.SelectiveLoggingFilter; //import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; // see https://github.com/docker-java/docker-java/issues/196 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; public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @@ -78,6 +80,18 @@ public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { private WebTarget baseResource; + private Integer readTimeout = null; + + private Integer connectTimeout = null; + + private Integer maxTotalConnections = null; + + private Integer maxPerRouteConnections = null; + + private ClientRequestFilter[] clientRequestFilters = null; + + private ClientResponseFilter[] clientResponseFilters = null; + @Override public void init(DockerClientConfig dockerClientConfig) { checkNotNull(dockerClientConfig, "config was not specified"); @@ -90,20 +104,30 @@ public void init(DockerClientConfig dockerClientConfig) { clientConfig.register(JsonClientFilter.class); clientConfig.register(JacksonJsonProvider.class); - if (dockerClientConfig.followRedirectsFilterEnabled()) { - clientConfig.register(FollowRedirectsFilter.class); + // logging may disabled via log level + clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); + + if (readTimeout != null) { + clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); } - if (dockerClientConfig.isLoggingFilterEnabled()) { - clientConfig.register(new SelectiveLoggingFilter(LOGGER, true)); + if (connectTimeout != null) { + clientConfig.property(ClientProperties.CONNECT_TIMEOUT, connectTimeout); } - if (dockerClientConfig.getReadTimeout() != null) { - int readTimeout = dockerClientConfig.getReadTimeout(); - clientConfig.property(ClientProperties.READ_TIMEOUT, readTimeout); + if (clientResponseFilters != null) { + for (ClientResponseFilter clientResponseFilter : clientResponseFilters) { + if (clientResponseFilter != null) + clientConfig.register(clientResponseFilter); + } } - // clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 10000); + if (clientRequestFilters != null) { + for (ClientRequestFilter clientRequestFilter : clientRequestFilters) { + if(clientRequestFilter != null) + clientConfig.register(clientRequestFilter); + } + } URI originalUri = dockerClientConfig.getUri(); @@ -120,10 +144,10 @@ public void init(DockerClientConfig dockerClientConfig) { PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry( originalUri, sslContext)); - if (dockerClientConfig.getMaxTotalConnections() != null) - connManager.setMaxTotal(dockerClientConfig.getMaxTotalConnections()); - if (dockerClientConfig.getMaxPerRoutConnections() != null) - connManager.setDefaultMaxPerRoute(dockerClientConfig.getMaxPerRoutConnections()); + if (maxTotalConnections != null) + connManager.setMaxTotal(maxTotalConnections); + if (maxPerRouteConnections != null) + connManager.setDefaultMaxPerRoute(maxPerRouteConnections); clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connManager); @@ -353,4 +377,34 @@ public void close() throws IOException { client.close(); } + public DockerCmdExecFactoryImpl withReadTimeout(Integer readTimeout) { + this.readTimeout = readTimeout; + return this; + } + + public DockerCmdExecFactoryImpl withConnectTimeout(Integer connectTimeout) { + this.connectTimeout = connectTimeout; + return this; + } + + public DockerCmdExecFactoryImpl withMaxTotalConnections(Integer maxTotalConnections) { + this.maxTotalConnections = maxTotalConnections; + return this; + } + + public DockerCmdExecFactoryImpl withMaxPerRouteConnections(Integer maxPerRouteConnections) { + this.maxPerRouteConnections = maxPerRouteConnections; + return this; + } + + public DockerCmdExecFactoryImpl withClientResponseFilters(ClientResponseFilter... clientResponseFilter) { + this.clientResponseFilters = clientResponseFilter; + return this; + } + + public DockerCmdExecFactoryImpl withClientRequestFilters(ClientRequestFilter... clientRequestFilters) { + this.clientRequestFilters = clientRequestFilters; + return this; + } + } diff --git a/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java similarity index 96% rename from src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java rename to src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java index e4ba60f90..be079d430 100644 --- a/src/main/java/com/github/dockerjava/core/util/FollowRedirectsFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/FollowRedirectsFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.core.util; +package com.github.dockerjava.jaxrs.filter; import java.io.IOException; import java.io.InputStream; diff --git a/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/JsonClientFilter.java similarity index 94% rename from src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java rename to src/main/java/com/github/dockerjava/jaxrs/filter/JsonClientFilter.java index fe8207cd9..2abc20618 100644 --- a/src/main/java/com/github/dockerjava/core/util/JsonClientFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/JsonClientFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.core.util; +package com.github.dockerjava.jaxrs.filter; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java similarity index 99% rename from src/main/java/com/github/dockerjava/core/util/LoggingFilter.java rename to src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java index 96b028b5f..0ba33ec82 100644 --- a/src/main/java/com/github/dockerjava/core/util/LoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/LoggingFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.core.util; +package com.github.dockerjava.jaxrs.filter; /* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. diff --git a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java similarity index 98% rename from src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java rename to src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java index 24f31fb14..fc01327c2 100644 --- a/src/main/java/com/github/dockerjava/core/util/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.core.util; +package com.github.dockerjava.jaxrs.filter; import java.io.EOFException; import java.io.IOException; diff --git a/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java similarity index 96% rename from src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java rename to src/main/java/com/github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java index d4c9b8400..a93085987 100644 --- a/src/main/java/com/github/dockerjava/core/util/SelectiveLoggingFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/SelectiveLoggingFilter.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.core.util; +package com.github.dockerjava.jaxrs.filter; import java.io.IOException; import java.util.Collections; diff --git a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java index d520e1d65..9597b97d7 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientConfigTest.java @@ -17,15 +17,15 @@ 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", 877, - false, false, new LocalDirectorySSLConfig("flim"), 20, 2); + return new DockerClientConfig(URI.create("http://foo"), "bar", "baz", "qux", "blam", "wham", "flam", + new LocalDirectorySSLConfig("flim")); } @Test public void string() throws Exception { assertEquals( - "DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}', readTimeout=877, loggingFilterEnabled=false, followRedirectsFilterEnabled=false}", - EXAMPLE_CONFIG.toString()); + EXAMPLE_CONFIG.toString(), + "DockerClientConfig{uri=http://foo, version='bar', username='baz', password='qux', email='blam', serverAddress='wham', dockerCfgPath='flam', sslConfig='LocalDirectorySSLConfig{dockerCertPath=flim}'}"); } @Test @@ -160,7 +160,6 @@ public void defaults() throws Exception { assertEquals(config.getUsername(), "someUserName"); assertEquals(config.getServerAddress(), AuthConfig.DEFAULT_SERVER_ADDRESS); assertEquals(config.getVersion(), null); - assertEquals(config.isLoggingFilterEnabled(), true); assertEquals(config.getDockerCfgPath(), "someHomeDir/.dockercfg"); assertEquals(((LocalDirectorySSLConfig) config.getSslConfig()).getDockerCertPath(), "someHomeDir/.docker"); } @@ -178,8 +177,6 @@ public void systemProperties() throws Exception { systemProperties.setProperty("docker.io.serverAddress", "wham"); systemProperties.setProperty("docker.io.dockerCertPath", "flim"); systemProperties.setProperty("docker.io.dockerCfgPath", "flam"); - systemProperties.setProperty("docker.io.readTimeout", "877"); - systemProperties.setProperty("docker.io.enableLoggingFilter", "false"); // when you build new config DockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties); diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index a2a77734f..8a9879470 100644 --- a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,8 +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, 0, false, - false, null, 20, 2); + DockerClientConfig dockerClientConfig = new DockerClientConfig(null, null, "", "", "", null, null,null); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config From ae6027ce50718b43e9bee03fdce9097ebd97b4bf Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 28 Jul 2015 21:08:40 +0200 Subject: [PATCH 0011/1124] Added GZIP compression for build context creation --- .../github/dockerjava/core/CompressArchiveUtil.java | 5 ++++- .../core/async/ResultCallbackTemplate.java | 2 +- .../dockerjava/core/CompressArchiveUtilTest.java | 5 ++++- .../core/command/BuildImageCmdImplTest.java | 13 +++++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index 6a1a54809..cf089e33c 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -2,9 +2,11 @@ import static com.github.dockerjava.core.FilePathUtil.relativize; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.zip.GZIPOutputStream; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; @@ -16,7 +18,8 @@ public static File archiveTARFiles(File base, Iterable files, String archi throws IOException { File tarFile = new File(FileUtils.getTempDirectoryPath(), archiveNameWithOutExtension + ".tar"); tarFile.deleteOnExit(); - TarArchiveOutputStream tos = new TarArchiveOutputStream(new FileOutputStream(tarFile)); + TarArchiveOutputStream tos = new TarArchiveOutputStream(new GZIPOutputStream( + new BufferedOutputStream(new FileOutputStream(tarFile)))); try { tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); for (File file : files) { 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 d94ce1950..857ca9177 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -63,10 +63,10 @@ public void onComplete() { @Override public void close() throws IOException { + closed = true; if (stream != null) stream.close(); completed.countDown(); - closed = true; } /** diff --git a/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java b/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java index 827f8d3be..90ca91fca 100644 --- a/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java +++ b/src/test/java/com/github/dockerjava/core/CompressArchiveUtilTest.java @@ -5,10 +5,12 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.util.zip.GZIPInputStream; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; @@ -43,7 +45,8 @@ private File extractFileByName(File archive, String filenameToExtract) throws IO expectedFile.delete(); assertThat(expectedFile.exists(), is(false)); - TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(new FileInputStream(archive)); + TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(new GZIPInputStream( + new BufferedInputStream(new FileInputStream(archive)))); TarArchiveEntry entry; while ((entry = tarArchiveInputStream.getNextTarEntry()) != null) { String individualFiles = entry.getName(); 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 6d2b4c805..5385287ef 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -225,4 +225,17 @@ public void testAddAndCopySubstitution() throws Exception { String response = dockerfileBuild(baseDir); assertThat(response, containsString("testENVSubstitution successfully completed")); } + + @Test + public void testBuilderPerformance() 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\"")); + } } From d8d394630d1baebf7da165236a22a2a2e070064f Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 30 Jul 2015 21:05:12 +0200 Subject: [PATCH 0012/1124] use try-with-resource --- .../com/github/dockerjava/core/CompressArchiveUtil.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index cf089e33c..0a93af3d8 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -18,9 +18,8 @@ public static File archiveTARFiles(File base, Iterable files, String archi throws IOException { File tarFile = new File(FileUtils.getTempDirectoryPath(), archiveNameWithOutExtension + ".tar"); tarFile.deleteOnExit(); - TarArchiveOutputStream tos = new TarArchiveOutputStream(new GZIPOutputStream( - new BufferedOutputStream(new FileOutputStream(tarFile)))); - try { + try(TarArchiveOutputStream tos = new TarArchiveOutputStream(new GZIPOutputStream( + new BufferedOutputStream(new FileOutputStream(tarFile))))) { tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); for (File file : files) { TarArchiveEntry tarEntry = new TarArchiveEntry(file); @@ -39,8 +38,6 @@ public static File archiveTARFiles(File base, Iterable files, String archi } tos.closeArchiveEntry(); } - } finally { - tos.close(); } return tarFile; From aef0aa8bd698071aa2ca9a3bfb839dec1b8078c5 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 30 Jul 2015 21:07:21 +0200 Subject: [PATCH 0013/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c86c3cc8..ea9156c2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log Latest SNAPSHOT --- +* [#284](https://github.com/docker-java/docker-java/pull/284) Added GZIP compression for build context creation * [#280](https://github.com/docker-java/docker-java/pull/280) Handle multiple source files in ADD command * [#278](https://github.com/docker-java/docker-java/pull/278) Stop leaking tar files in temporary folder * [#275](https://github.com/docker-java/docker-java/pull/275) Implemented LogConfig (create and inspect containers) From 8eb28d3b66f8d0920fe22461bfc3e56f90fb9b30 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 31 Jul 2015 21:57:11 +0200 Subject: [PATCH 0014/1124] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea9156c2a..455e2a8ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,9 @@ Change Log Latest SNAPSHOT --- + * [#284](https://github.com/docker-java/docker-java/pull/284) Added GZIP compression for build context creation +* [#282](https://github.com/docker-java/docker-java/pull/282) Remove JAXRS/ApacheConnector implementation specific properties from DockerClientConfig * [#280](https://github.com/docker-java/docker-java/pull/280) Handle multiple source files in ADD command * [#278](https://github.com/docker-java/docker-java/pull/278) Stop leaking tar files in temporary folder * [#275](https://github.com/docker-java/docker-java/pull/275) Implemented LogConfig (create and inspect containers) From eebc1bf0f9a11774b5de03161e32abba2b3068a0 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 31 Jul 2015 22:26:00 +0200 Subject: [PATCH 0015/1124] Switch to version 2.0.0-SNAPSHOT due to incompatible API changes --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7618263ae..ecb4812af 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 1.4.1-SNAPSHOT + 2.0.0-SNAPSHOT docker-java https://github.com/docker-java/docker-java From f27f113cb6d4cd482bc99de6bca76b5526e69ed7 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 31 Jul 2015 22:26:55 +0200 Subject: [PATCH 0016/1124] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 455e2a8ba..b2d52c002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Change Log === -Latest SNAPSHOT +v.2.0.0 --- * [#284](https://github.com/docker-java/docker-java/pull/284) Added GZIP compression for build context creation From 5c4a5ccb6fe20762b5b3cb4144e0d883676bb40d Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 31 Jul 2015 22:30:41 +0200 Subject: [PATCH 0017/1124] [maven-release-plugin] prepare release docker-java-2.0.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ecb4812af..3be438999 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.0.0-SNAPSHOT + 2.0.0 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.0.0 From 46077cfdd285709cba43168e63d69dbe2440e190 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 31 Jul 2015 22:30:45 +0200 Subject: [PATCH 0018/1124] [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 3be438999..a6c343ce6 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.0.0 + 2.0.1-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.0.0 + HEAD From fdcd43d428f5247debb2cdaa5359cd0f703257cc Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 31 Jul 2015 22:40:33 +0200 Subject: [PATCH 0019/1124] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5c6c55d31..558b71f65 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![Build Status](https://travis-ci.org/docker-java/docker-java.svg?branch=master)](https://travis-ci.org/docker-java/docker-java) -[![Circle CI](https://circleci.com/gh/docker-java/docker-java.svg?style=svg)](https://circleci.com/gh/docker-java/docker-java) + # docker-java Java API client for [Docker](http://docs.docker.io/ "Docker") From 9a909e50bd5987c5e5e9099dd1f77ebcb88ac8de Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 31 Jul 2015 22:45:56 +0200 Subject: [PATCH 0020/1124] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 558b71f65..6c05fbc68 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Run build without integration tests: com.github.docker-java docker-java - 1.4.0 + 2.0.0 ### 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 - 1.4.1-SNAPSHOT + 2.0.1-SNAPSHOT ## Documentation From 08e15d9fcaffacf59c47b3fecc5a027a2249dee1 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 31 Jul 2015 23:33:12 +0200 Subject: [PATCH 0021/1124] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2d52c002..fe47ddcfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ Change Log v.2.0.0 --- +Release notes + +* Some commands APIs has been changed to be callback-driven now to simplify the processing of the result streams for the client application. This affects namely the events, log, attach, build, push and pull commands. Look at the Wiki how to [process events](https://github.com/docker-java/docker-java/wiki#handle-events) or how to [build an image](https://github.com/docker-java/docker-java/wiki#build-image-from-dockerfile) from dockerfile for example. +* The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmaticaly](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/master/src/test/resources/logback.xml) configuration file in the classpath. + +All changes * [#284](https://github.com/docker-java/docker-java/pull/284) Added GZIP compression for build context creation * [#282](https://github.com/docker-java/docker-java/pull/282) Remove JAXRS/ApacheConnector implementation specific properties from DockerClientConfig From 8dce17cd43d903b145000e26b2e7ccb52df0e6d3 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 31 Jul 2015 23:34:02 +0200 Subject: [PATCH 0022/1124] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe47ddcfa..016cff47e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ v.2.0.0 Release notes * Some commands APIs has been changed to be callback-driven now to simplify the processing of the result streams for the client application. This affects namely the events, log, attach, build, push and pull commands. Look at the Wiki how to [process events](https://github.com/docker-java/docker-java/wiki#handle-events) or how to [build an image](https://github.com/docker-java/docker-java/wiki#build-image-from-dockerfile) from dockerfile for example. -* The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmaticaly](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/master/src/test/resources/logback.xml) configuration file in the classpath. +* The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmatically](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/master/src/test/resources/logback.xml) configuration file in the classpath. All changes From 5d6d95ca76a810701174f5be048a130e846636f4 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 31 Jul 2015 23:36:44 +0200 Subject: [PATCH 0023/1124] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 016cff47e..19af87f0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ v.2.0.0 --- Release notes -* Some commands APIs has been changed to be callback-driven now to simplify the processing of the result streams for the client application. This affects namely the events, log, attach, build, push and pull commands. Look at the Wiki how to [process events](https://github.com/docker-java/docker-java/wiki#handle-events) or how to [build an image](https://github.com/docker-java/docker-java/wiki#build-image-from-dockerfile) from dockerfile for example. +* Some commands APIs has been changed to be callback-driven now to simplify the processing of the result streams for the client application. This affects namely the events, stats, log, attach, build, push and pull commands. Look at the Wiki how to [process events](https://github.com/docker-java/docker-java/wiki#handle-events) or how to [build an image](https://github.com/docker-java/docker-java/wiki#build-image-from-dockerfile) from dockerfile for example. * The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmatically](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/master/src/test/resources/logback.xml) configuration file in the classpath. All changes From f7b902ffb59144039aa534c43ae7a14b7cfce866 Mon Sep 17 00:00:00 2001 From: Alex Tomovski Date: Tue, 4 Aug 2015 06:58:07 +0300 Subject: [PATCH 0024/1124] Using the oomKillDisable flag throws a null pointer exception. --- .../github/dockerjava/core/command/CreateContainerCmdImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e522266c3..f29c5c05f 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -631,7 +631,7 @@ public CreateContainerCmd withNetworkMode(String networkMode) { public CreateContainerCmd withOomKillDisable(Boolean oomKillDisable) { checkNotNull(oomKillDisable, "oomKillDisable was not specified"); this.oomKillDisable = oomKillDisable; - return null; + return this; } @Override From 79a6b60597b451432defbd9217fa975bb0a6a2a4 Mon Sep 17 00:00:00 2001 From: Khva0 Date: Mon, 10 Aug 2015 18:56:24 +0300 Subject: [PATCH 0025/1124] Add Memory, MemorySwap and CpuShares mappings to HostConfig --- .../dockerjava/api/model/HostConfig.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) 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 5d4074eb9..9b31e05a9 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -66,6 +66,15 @@ public class HostConfig { @JsonProperty("Ulimits") private Ulimit[] ulimits; + @JsonProperty("Memory") + private long memoryLimit = 0; + + @JsonProperty("MemorySwap") + private long memorySwap = 0; + + @JsonProperty("CpuShares") + private int cpuShares = 0; + public HostConfig() { } @@ -173,6 +182,18 @@ public Ulimit[] getUlimits() { return ulimits; } + public long getMemoryLimit() { + return memoryLimit; + } + + public long getMemorySwap() { + return memorySwap; + } + + public int getCpuShares() { + return cpuShares; + } + @JsonIgnore public void setBinds(Bind... binds) { this.binds = new Binds(binds); From 9cfdf0ca3939a220ea61779371d7dc3532d00f10 Mon Sep 17 00:00:00 2001 From: Khva0 Date: Mon, 10 Aug 2015 18:56:49 +0300 Subject: [PATCH 0026/1124] Remove Memory, MemorySwap and CpuShares mappings from ContainerConfig --- .../dockerjava/api/model/ContainerConfig.java | 28 ------------------- 1 file changed, 28 deletions(-) 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 29b2af38e..34cb71d4d 100644 --- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java @@ -28,12 +28,6 @@ public class ContainerConfig { @JsonProperty("Cmd") private String[] cmd; - @JsonProperty("CpuShares") - private int cpuShares = 0; - - @JsonProperty("Cpuset") - private String cpuset = ""; - @JsonProperty("Domainname") private String domainName = ""; @@ -58,12 +52,6 @@ public class ContainerConfig { @JsonProperty("MacAddress") private String macAddress; - @JsonProperty("Memory") - private long memoryLimit = 0; - - @JsonProperty("MemorySwap") - private long memorySwap = 0; - @JsonProperty("NetworkDisabled") private boolean networkDisabled = false; @@ -136,22 +124,6 @@ public String getMacAddress() { return macAddress; } - public long getMemoryLimit() { - return memoryLimit; - } - - public long getMemorySwap() { - return memorySwap; - } - - public int getCpuShares() { - return cpuShares; - } - - public String getCpuset() { - return cpuset; - } - public boolean isAttachStdin() { return attachStdin; } From d9dc93562c574d9f9f16fa9dbc1803ffa5caf09d Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 13 Aug 2015 18:25:57 +0200 Subject: [PATCH 0027/1124] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19af87f0e..68cc7f8e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change Log === +Latest SNAPSHOT +--- +* [#287] (https://github.com/docker-java/docker-java/pull/287) Using the oomKillDisable flag throws a null pointer exception + v.2.0.0 --- Release notes From 35c28ddda8dd6217a7fdfc2002e3ac5141229a9b Mon Sep 17 00:00:00 2001 From: Chris Barbara Date: Thu, 13 Aug 2015 16:26:20 -0700 Subject: [PATCH 0028/1124] Support certificate chains in cert.pem Issue 294 --- .../dockerjava/core/CertificateUtils.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/CertificateUtils.java index 7490ba54e..13482b0a1 100644 --- a/src/main/java/com/github/dockerjava/core/CertificateUtils.java +++ b/src/main/java/com/github/dockerjava/core/CertificateUtils.java @@ -1,5 +1,11 @@ package com.github.dockerjava.core; +import org.apache.commons.io.IOUtils; +import org.bouncycastle.cert.X509CertificateHolder; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; +import org.bouncycastle.openssl.PEMKeyPair; +import org.bouncycastle.openssl.PEMParser; + import java.io.BufferedReader; import java.io.File; import java.io.FileReader; @@ -16,12 +22,8 @@ import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; - -import org.apache.commons.io.IOUtils; -import org.bouncycastle.cert.X509CertificateHolder; -import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; -import org.bouncycastle.openssl.PEMKeyPair; -import org.bouncycastle.openssl.PEMParser; +import java.util.ArrayList; +import java.util.List; public class CertificateUtils { @@ -41,13 +43,13 @@ public static boolean verifyCertificatesExist(String dockerCertPath) { public static KeyStore createKeyStore(final String dockerCertPath) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, CertificateException, KeyStoreException { KeyPair keyPair = loadPrivateKey(dockerCertPath); - Certificate privateCertificate = loadCertificate(dockerCertPath); + List privateCertificates = loadCertificates(dockerCertPath); KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(null); keyStore.setKeyEntry("docker", keyPair.getPrivate(), "docker".toCharArray(), - new Certificate[] { privateCertificate }); + privateCertificates.toArray(new Certificate[privateCertificates.size()]) ); return keyStore; } @@ -80,15 +82,25 @@ public static KeyStore createTrustStore(final String dockerCertPath) throws IOEx } - private static Certificate loadCertificate(final String dockerCertPath) throws IOException, CertificateException { + private static List loadCertificates(final String dockerCertPath) throws IOException, CertificateException { File certificate = new File(dockerCertPath, "cert.pem"); BufferedReader reader = new BufferedReader(new FileReader(certificate)); PEMParser pemParser = null; try { + List certificates = new ArrayList<>(); pemParser = new PEMParser(reader); - X509CertificateHolder certificateHolder = (X509CertificateHolder) pemParser.readObject(); - return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certificateHolder); + JcaX509CertificateConverter certificateConverter = new JcaX509CertificateConverter().setProvider("BC"); + Object certObj = pemParser.readObject(); + + while (certObj != null) { + X509CertificateHolder certificateHolder = (X509CertificateHolder) certObj; + certificates.add(certificateConverter.getCertificate(certificateHolder)); + + certObj = pemParser.readObject(); + } + + return certificates; } finally { if (pemParser != null) { IOUtils.closeQuietly(pemParser); From 3cb87ac724f429dd931741d1733f980073659006 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 14 Aug 2015 18:21:50 +0200 Subject: [PATCH 0029/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68cc7f8e2..81639f894 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log Latest SNAPSHOT --- +* [#295] (https://github.com/docker-java/docker-java/pull/295) Support certificate chains in cert.pem * [#287] (https://github.com/docker-java/docker-java/pull/287) Using the oomKillDisable flag throws a null pointer exception v.2.0.0 From 63688e056a569e8426a65880cbf5b383c1b7c2f7 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 15 Aug 2015 19:09:06 +0200 Subject: [PATCH 0030/1124] Format sources --- .../dockerjava/core/CertificateUtils.java | 5 +++-- .../dockerjava/core/CompressArchiveUtil.java | 4 ++-- .../dockerjava/core/DockerClientConfig.java | 9 ++++----- .../core/async/ResultCallbackTemplate.java | 3 ++- .../dockerjava/jaxrs/AbstrDockerCmdExec.java | 3 ++- .../jaxrs/DockerCmdExecFactoryImpl.java | 4 ++-- .../client/AbstractDockerClientTest.java | 4 ++-- .../dockerjava/core/DockerClientImplTest.java | 2 +- .../command/AttachContainerCmdImplTest.java | 4 ++-- .../core/command/LogContainerCmdImplTest.java | 1 - .../core/command/PushImageCmdImplTest.java | 8 ++------ .../DockerfileAddMultipleFilesTest.java | 4 +++- .../dockerfile/DockerfileStatementAddTest.java | 18 ++++++++---------- 13 files changed, 33 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/CertificateUtils.java b/src/main/java/com/github/dockerjava/core/CertificateUtils.java index 13482b0a1..465b06460 100644 --- a/src/main/java/com/github/dockerjava/core/CertificateUtils.java +++ b/src/main/java/com/github/dockerjava/core/CertificateUtils.java @@ -49,7 +49,7 @@ public static KeyStore createKeyStore(final String dockerCertPath) throws NoSuch keyStore.load(null); keyStore.setKeyEntry("docker", keyPair.getPrivate(), "docker".toCharArray(), - privateCertificates.toArray(new Certificate[privateCertificates.size()]) ); + privateCertificates.toArray(new Certificate[privateCertificates.size()])); return keyStore; } @@ -82,7 +82,8 @@ public static KeyStore createTrustStore(final String dockerCertPath) throws IOEx } - private static List loadCertificates(final String dockerCertPath) throws IOException, CertificateException { + private static List loadCertificates(final String dockerCertPath) throws IOException, + CertificateException { File certificate = new File(dockerCertPath, "cert.pem"); BufferedReader reader = new BufferedReader(new FileReader(certificate)); PEMParser pemParser = null; diff --git a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java index 0a93af3d8..59dec59ef 100644 --- a/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/CompressArchiveUtil.java @@ -18,8 +18,8 @@ public static File archiveTARFiles(File base, Iterable files, String archi throws IOException { File tarFile = new File(FileUtils.getTempDirectoryPath(), archiveNameWithOutExtension + ".tar"); tarFile.deleteOnExit(); - try(TarArchiveOutputStream tos = new TarArchiveOutputStream(new GZIPOutputStream( - new BufferedOutputStream(new FileOutputStream(tarFile))))) { + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(new GZIPOutputStream(new BufferedOutputStream( + new FileOutputStream(tarFile))))) { tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); for (File file : files) { TarArchiveEntry tarEntry = new TarArchiveEntry(file); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java index 800ed5772..ae8156748 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientConfig.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientConfig.java @@ -177,8 +177,8 @@ private static Properties overrideDockerPropertiesWithSystemProperties(Propertie 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_SERVER_ADDRESS_PROPERTY, DOCKER_IO_DOCKER_CERT_PATH_PROPERTY, + DOCKER_IO_DOCKER_CFG_PATH_PROPERTY, }) { if (systemProperties.containsKey(key)) { overriddenProperties.setProperty(key, systemProperties.getProperty(key)); } @@ -337,8 +337,7 @@ public int hashCode() { public String toString() { return "DockerClientConfig{" + "uri=" + uri + ", version='" + version + '\'' + ", username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + ", serverAddress='" + serverAddress - + '\'' + ", dockerCfgPath='" + dockerCfgPath + '\'' + ", sslConfig='" + sslConfig + '\'' - + '}'; + + '\'' + ", dockerCfgPath='" + dockerCfgPath + '\'' + ", sslConfig='" + sslConfig + '\'' + '}'; } public static class DockerClientConfigBuilder { @@ -415,7 +414,7 @@ public final DockerClientConfigBuilder withSSLConfig(SSLConfig config) { public DockerClientConfig build() { return new DockerClientConfig(uri, version, username, password, email, serverAddress, dockerCfgPath, - sslConfig); + sslConfig); } } 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 857ca9177..b5387ede0 100644 --- a/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java +++ b/src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java @@ -38,7 +38,8 @@ public void onStart(Closeable stream) { @Override public void onError(Throwable throwable) { - if(closed) return; + if (closed) + return; try { LOGGER.error("Error during callback", throwable); diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java index cd23dd8b1..4c0d36eaa 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java @@ -35,7 +35,8 @@ protected String registryAuth(AuthConfig authConfig) { protected String registryConfigs(AuthConfigurations authConfigs) { try { - return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfigs).getBytes()); + String json = new ObjectMapper().writeValueAsString(authConfigs.getConfigs()); + return Base64.encodeBase64String(json.getBytes()); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index f3ad427f5..ef8d4e4fb 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -124,8 +124,8 @@ public void init(DockerClientConfig dockerClientConfig) { if (clientRequestFilters != null) { for (ClientRequestFilter clientRequestFilter : clientRequestFilters) { - if(clientRequestFilter != null) - clientConfig.register(clientRequestFilter); + if (clientRequestFilter != null) + clientConfig.register(clientRequestFilter); } } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 8ed9164da..e8dfa9bd7 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -186,8 +186,8 @@ public static void assertContainerHasVolumes(InspectContainerResponse inspectCon } protected String containerLog(String containerId) throws Exception { - return dockerClient.logContainerCmd(containerId).withStdOut() - .exec(new LogContainerTestCallback()).awaitCompletion().toString(); + return dockerClient.logContainerCmd(containerId).withStdOut().exec(new LogContainerTestCallback()) + .awaitCompletion().toString(); } public static class LogContainerTestCallback extends LogContainerResultCallback { diff --git a/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index 8a9879470..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); + 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/AttachContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java index 8fa5b2269..11a65aa14 100644 --- a/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java @@ -94,8 +94,8 @@ public void onNext(Frame frame) { }; }; - dockerClient.attachContainerCmd(container.getId()).withStdErr().withStdOut().withFollowStream() - .exec(callback).awaitCompletion(15, TimeUnit.SECONDS).close(); + dockerClient.attachContainerCmd(container.getId()).withStdErr().withStdOut().withFollowStream().exec(callback) + .awaitCompletion(15, TimeUnit.SECONDS).close(); System.out.println("log: " + callback.toString()); 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 6d887f359..2e2dedb45 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -135,5 +135,4 @@ public void asyncMultipleLogContainer() throws Exception { assertTrue(loggingCallback.toString().contains(snippet)); } - } 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 bb42d5b4b..2f7e1c391 100644 --- a/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/PushImageCmdImplTest.java @@ -65,18 +65,14 @@ public void pushLatest() throws Exception { LOG.info("Removing image: {}", imageId); dockerClient.removeImageCmd(imageId).exec(); - dockerClient.pullImageCmd(username + "/busybox") - .exec(new PullImageResultCallback()).awaitSuccess(); + 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(); - + dockerClient.pushImageCmd(username + "/xxx").exec(new PushImageResultCallback()).awaitSuccess(); } - } diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java index 65af93774..0752aded5 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java @@ -17,6 +17,7 @@ public class DockerfileAddMultipleFilesTest extends TestCase { private static final Logger log = LoggerFactory.getLogger(DockerfileAddMultipleFilesTest.class); + private static final Function TO_FILE_NAMES = new Function() { @Override public String apply(File file) { @@ -26,7 +27,8 @@ public String apply(File file) { @Test public void testAddMultipleFiles() throws IOException { - File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddMultipleFiles").getFile()); + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddMultipleFiles") + .getFile()); Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile")); Dockerfile.ScannedResult result = dockerfile.parse(); Collection filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES); 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 691137afd..133ed2eae 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileStatementAddTest.java @@ -20,16 +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") From e580ea81c8dcf6cddf79ece70b782b4fc1bffa09 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 15 Aug 2015 19:09:33 +0200 Subject: [PATCH 0031/1124] Fix for issue #288 --- .../core/command/BuildImageCmdImplTest.java | 60 ++++++++++++++++--- src/test/resources/privateRegistry/Dockerfile | 3 + .../resources/privateRegistry/auth/htpasswd | 2 + .../privateRegistry/certs/README.txt | 2 + .../privateRegistry/certs/domain.crt | 35 +++++++++++ .../privateRegistry/certs/domain.key | 52 ++++++++++++++++ .../testBuildFromPrivateRegistry/Dockerfile | 1 + 7 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 src/test/resources/privateRegistry/Dockerfile create mode 100644 src/test/resources/privateRegistry/auth/htpasswd create mode 100644 src/test/resources/privateRegistry/certs/README.txt create mode 100644 src/test/resources/privateRegistry/certs/domain.crt create mode 100644 src/test/resources/privateRegistry/certs/domain.key create mode 100644 src/test/resources/testBuildFromPrivateRegistry/Dockerfile 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 5385287ef..2fcc22c94 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -10,7 +10,6 @@ import java.io.File; import java.io.FileInputStream; -import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.util.Collection; @@ -18,7 +17,6 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.TrueFileFilter; -import org.apache.commons.lang.StringUtils; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; @@ -31,7 +29,11 @@ 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.BuildResponseItem; +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.client.AbstractDockerClientTest; import com.github.dockerjava.core.CompressArchiveUtil; @@ -225,10 +227,10 @@ public void testAddAndCopySubstitution() throws Exception { String response = dockerfileBuild(baseDir); assertThat(response, containsString("testENVSubstitution successfully completed")); } - + @Test - public void testBuilderPerformance() throws Exception { - File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nginx").getFile()); + public void testBuildFromPrivateRegistry() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("privateRegistry").getFile()); String imageId = buildImage(baseDir); @@ -236,6 +238,50 @@ public void testBuilderPerformance() throws Exception { assertThat(inspectImageResponse, not(nullValue())); LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - assertThat(inspectImageResponse.getAuthor(), equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\"")); + 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("busybox:latest").withForce().exec(); + + dockerClient.removeImageCmd("localhost:5000/testuser/busybox").withForce().exec(); + + baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildFromPrivateRegistry") + .getFile()); + + AuthConfigurations authConfigurations = new AuthConfigurations(); + authConfigurations.addConfig(authConfig); + + imageId = dockerClient.buildImageCmd(baseDir).withNoCache().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/resources/privateRegistry/Dockerfile b/src/test/resources/privateRegistry/Dockerfile new file mode 100644 index 000000000..35046d980 --- /dev/null +++ b/src/test/resources/privateRegistry/Dockerfile @@ -0,0 +1,3 @@ +FROM registry:2 +ADD auth/htpasswd /auth/htpasswd +ADD certs/* /certs/ \ No newline at end of file diff --git a/src/test/resources/privateRegistry/auth/htpasswd b/src/test/resources/privateRegistry/auth/htpasswd new file mode 100644 index 000000000..3835b5d08 --- /dev/null +++ b/src/test/resources/privateRegistry/auth/htpasswd @@ -0,0 +1,2 @@ +# testuser:testpasswd (see see https://github.com/docker/distribution/blob/master/docs/deploying.md#native-basic-auth) +testuser:$2y$05$gI1hyzOYeLU92o5/DjVtOOHtdGymYbkjqJipZNqPET.ChzXMsz2KS diff --git a/src/test/resources/privateRegistry/certs/README.txt b/src/test/resources/privateRegistry/certs/README.txt new file mode 100644 index 000000000..7e2abff9c --- /dev/null +++ b/src/test/resources/privateRegistry/certs/README.txt @@ -0,0 +1,2 @@ +This directory contains self signed certificate for docker registry with CN: "localhost". For testing purposes only. +See https://github.com/docker/distribution/blob/master/docs/insecure.md#using-self-signed-certificates diff --git a/src/test/resources/privateRegistry/certs/domain.crt b/src/test/resources/privateRegistry/certs/domain.crt new file mode 100644 index 000000000..159cd1cf8 --- /dev/null +++ b/src/test/resources/privateRegistry/certs/domain.crt @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +MIIGHzCCBAegAwIBAgIJALeUCTgohkuvMA0GCSqGSIb3DQEBCwUAMIGlMQswCQYD +VQQGEwJERTEQMA4GA1UECAwHSGFtYnVyZzEQMA4GA1UEBwwHSGFtYnVyZzEUMBIG +A1UECgwLZG9ja2VyLWphdmExFDASBgNVBAsMC2RvY2tlci1qYXZhMRIwEAYDVQQD +DAlsb2NhbGhvc3QxMjAwBgkqhkiG9w0BCQEWI2RvY2tlci1qYXZhLW1haW50YWlu +QGdvb2dsZW1haWwuY29tMB4XDTE1MDgxNDE3NDkyN1oXDTE2MDgxMzE3NDkyN1ow +gaUxCzAJBgNVBAYTAkRFMRAwDgYDVQQIDAdIYW1idXJnMRAwDgYDVQQHDAdIYW1i +dXJnMRQwEgYDVQQKDAtkb2NrZXItamF2YTEUMBIGA1UECwwLZG9ja2VyLWphdmEx +EjAQBgNVBAMMCWxvY2FsaG9zdDEyMDAGCSqGSIb3DQEJARYjZG9ja2VyLWphdmEt +bWFpbnRhaW5AZ29vZ2xlbWFpbC5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQC/Y6Zn5H/K6nSfNDyNUL8Dl+h8/cLi4QAIRSTp5YIy1VtWbECPF5bj +2TnIB8GK0r40OMbc2c0KYPPNjmeP47pUKPawkoIFQCe+ErvpYqSKD0C6L3Gn2BOp +Cd/K6mgrsgAPaaGpm4p2+bBCLioLYSLFg3St3GSl+TkcylDzBlIDliWLyfqQletg +a7C01RoAfzgcXD551TD+ShbB9ybUWnhZuAhj10WN4YajCBpxv1jBbEHj3JQlnmkG +bOXLsA+nFrkFOyvyKTNz4Ncuj6FxmGs3eqP2FwWcowkAA8Eq2n2TSP4bVojlxWeX +qdBbaejEcWvItGTQ3GyzQ0+4mGwyfghDACdx1dT3HdaXzS+Y+oP17ijcVkDhbKCo +GFgwyN+t4fS2AsTaZ6LXfP9PXzwZd2usj6bMZ/DOMKgmVaK9eYXhP9vjwYYoQIiX +Vh4Lh+O94SG2j6AQPbixEj/3yJLf9owBkUUc/mgOCVgLSNgzBpTXKUlLASh35DSQ +xH6gJ87ljtHk+A8EVXFCDYf9T6b0y3okVBkbnliP/nr4TFbWr91+wHk/OyfTbZYY +uIc288HbC5d2qUGnDV7vMn5Rh8a1gqdZ8onbVuX65D9WQ7WtMMwbAEsMYihmj2WC +AzLHuWmDy6WBd8WRHSJLh+o5zqRi25YDJyNiKb/tXESf580OhqYL1QIDAQABo1Aw +TjAdBgNVHQ4EFgQUWQykHhTnePyTnsym33ex9u+6CKQwHwYDVR0jBBgwFoAUWQyk +HhTnePyTnsym33ex9u+6CKQwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEAB9fdGw8lJ7tZWa54xcwUuAFiQJCpJ5D3arKv80Oy+uDWlp4+8ezUnytKj6u4 +G4T6jNFhgWM9GFaxeuKPIzx4WO0pFB6bSHQ6lXUOrcn8umFcPzzSyIAdzNYxIVv8 +HXvy450XQKVMZPp9EvTgKmF+cDGKrOXlHMpl4lDjUJTuoKFjNB/eA9ropLfD4mvY +uaerHfJRlPUOvKrg0BwRVpaqZdPxULWmnaM5tmYSgQ8gpQab71w8J7Sere6+x+jc +sI0pXVHvsSUOGWY8/Juc7yhV1uYmuA8FBgyn8p38HrErwQDyQJfw5YD9jY+oa+vK +r6qqR9reaJtEipMT9aVY81cH040hZEKjm9Y5U3G+1YKWiHZYRL7pettzEaAh/PW1 +1SBgBg611BRrscR4MZ1AAbVh+Wn895Vpa61ZDsA/jIvaGQ1+EmikzWawBiOo4voX +ftUK8nViSBtnwaZ1DwdcEtPKwD8YYWSoBC/tEc6ErjnVXjYBEZc+BaSu+LQUz12t +IK6WvJf6uA+CTUuU9WvVTZtBI98p09ikGNjqM7scaP9BiOeRZQskVNU0MfCblgn/ +FugrJHHUzCNyOQpRktl7L2bULDfaHgjlNCbLc9e2NmW/pTTxBShESWxtNyFmPGGY +eiv/xHjlgJzNvHAoHrFj7szAiDQOncRTYeW1k1fe4WVmli8= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/src/test/resources/privateRegistry/certs/domain.key b/src/test/resources/privateRegistry/certs/domain.key new file mode 100644 index 000000000..460a206e1 --- /dev/null +++ b/src/test/resources/privateRegistry/certs/domain.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQC/Y6Zn5H/K6nSf +NDyNUL8Dl+h8/cLi4QAIRSTp5YIy1VtWbECPF5bj2TnIB8GK0r40OMbc2c0KYPPN +jmeP47pUKPawkoIFQCe+ErvpYqSKD0C6L3Gn2BOpCd/K6mgrsgAPaaGpm4p2+bBC +LioLYSLFg3St3GSl+TkcylDzBlIDliWLyfqQletga7C01RoAfzgcXD551TD+ShbB +9ybUWnhZuAhj10WN4YajCBpxv1jBbEHj3JQlnmkGbOXLsA+nFrkFOyvyKTNz4Ncu +j6FxmGs3eqP2FwWcowkAA8Eq2n2TSP4bVojlxWeXqdBbaejEcWvItGTQ3GyzQ0+4 +mGwyfghDACdx1dT3HdaXzS+Y+oP17ijcVkDhbKCoGFgwyN+t4fS2AsTaZ6LXfP9P +XzwZd2usj6bMZ/DOMKgmVaK9eYXhP9vjwYYoQIiXVh4Lh+O94SG2j6AQPbixEj/3 +yJLf9owBkUUc/mgOCVgLSNgzBpTXKUlLASh35DSQxH6gJ87ljtHk+A8EVXFCDYf9 +T6b0y3okVBkbnliP/nr4TFbWr91+wHk/OyfTbZYYuIc288HbC5d2qUGnDV7vMn5R +h8a1gqdZ8onbVuX65D9WQ7WtMMwbAEsMYihmj2WCAzLHuWmDy6WBd8WRHSJLh+o5 +zqRi25YDJyNiKb/tXESf580OhqYL1QIDAQABAoICAQC/EuiubmTbG8mErC0L1KJv +Hvjf2KT5xzI2D3nz/ctHntSKapblhOKC5XsXZg7m3tE/57M6CEP5aaPeA58G+48p +uJ/Y1tvyDAPhcmiib3Xf06yGdRlePY4bRB1mQzHu9c2zlXztjLjnYQ6Ec/xL0hVZ +5YzWiuL9BNztDltU1WmJ5Rvk/KgoM1SDtd/8GYjVGC3XuowxLBO2vBcOXQYqGYxv +3hiaPPBW3uKA33UvPJ6KtN7vc2eASy+FV7Dv8v0djsT3IQUVxeZ1ePK7rG+8rjPU +dp887+0NXYN9vUHb27hlFAmFF5ai9rseok2/BfR6MtYt0VOZZYcsTTZJD/ttSYBK +T/S1sIu6pgb5Yb39ZjRDGEfWTop3iLC2euAhhY6NDOXHxPtPPye3W/qZu4uE+vpT +nptw1/1yy4gg2gjkK63HDxNLHQqQODJSJv08gh9KY9gVFCLKxshbYwtSPFd6CpaW +CHIT73D7/5yBTTX2uVnZfcRSKUXt9jrCNTYqXoSBGNrYDNzh9U1cZ/ZwTxVODaO2 +1cT6mzREIfuOvUqIaYLreSuM0TVBx68QZ8wNTI2SOijSDWzf8nOiKJhHe1yF3ybR +Xtz2J9/rVeyYedYUSdcIu52o5VqcZMgcSVtWJe5hhe/rbfz9k6Iey8DkKFWxMr2y +F2ID2kINOFL8D72I3/16nQKCAQEA8wI/2z2SC4zq8rbVqa2NXtvxIv8lzbc/D1PC +X0xIw+jPW4FgfrmCkt0z/yofvKKLiVq71mIclBc9zFQKZlCEXMrVzxQh7x1bfu2V +JxMKeiixqevrEt+tCc29ILqmhmH6TfbDEiSaSs3KvTaABpvbgC/iCLbpN6QRCnsu +6qO/ViXiUAqsg6dDJixyerE+0KdKAS4fvXdAC0xNPtcXCfEXUEB0XriJDtn/8jhR +9O+bZPesXCNH9l3PHhrfxE0qyxOAM/iZJtaQjnBJ+gMNxozqqnrwHZAQ9WL8xYZq +B/5eQoYdpvlBLxJc5aWJuZInJZ/wnJo58WlaA5JwCeXTBqih3wKCAQEAyZ7zORsa +7Yqxnr9ttdz5ASGQffcvYyQube8ADsNdj3B3BNeCjg9lT0pthEHZNrKdBDAfcFeE +w9dmndeKEH9IC4CaYc7k364ndlyaVHu/YdhnV6HkoEv46WWLEss2neuGhHZ5T90p +jO8Dv4EdciYhsGCj0HG/hNIqvIUd26KCfuFqEojuaoyGgLXLSGBWaO8bqL4Kt+ZP +s9R/pIGXtzBJ08Fe9ZO5nEn6/P9LoR02M/HPXv3qJs0lvocemRLQjBb8CDe1vYV3 +d3Qt6FFdo9XvxS1DsQ8phTFQu0I70/8R6Jnaoo2QI0Z6AKVynSdC94+Y4JsGc/OW +fqLXERAE7qhQywKCAQEAmz3Fo36a7QwSEAojRulbVc02KABNmzTEcTs2AgFOvvDc +fv2QsoQ6WS49CHZVngFNGOtA8jztOuH6Fa1ek2w+krT1j/uxjfr4N4b5cOPmHpIe +pYnUO9NuzMOFXgI/Xbv71pCcn9uIQd9j9Cp78TziJerxAFYxeN00EbkOCNGg6xz6 +jd2zxcs1x44/eAgBM/Sa/1QC7NvgqxcMheeMjUpadWcnsFc9H6K+snOuT8Y+RGtA +zf+v+kCFjxrl9pbBjsgfb5QR6tDJumUbrT8ELuJZC53MBWbCnrClAF7VH9QtTVw2 +VzQGo1acyAxPhqBKp+ucH78a4xFFcuC6+Ge8vxU9iwKCAQBG/StAKRYDGzlM3rPf +O62Ew2+fmn/Z1Wxvkp4flJQFpCCT2NmD8VHHaDpFPfYf9yWnytXW9UmuttHPs4tO +IbKZMi+pTnJxe10zpIlGQ8fvyIUiasMX2YgLjZA5DsntMndLfndaMlGl6KYWMHzQ +qzJjarNi+hnnxyP6+pe3tHFkATQa0JG5fD8DZH7tvdXO3pmLgVY+x926QJCsuGBV +xK/J2iT4LIpGyBmSKMVVNfbWtUZBeP+Pp92pRuP0G5bILHOS5SKdVzfoHETprnRc +8j+Y2kYiOmdxGRsGw9xS2VVR45ICd/uPIApm3doMET3X8nxuYMcV3mdXsTguLsi9 +yw+fAoIBAQC80GMgjuVk6nE8wSeahoWPMM9kxo8XDmBht//cXIzgKKGkvnUBbxPo +G17lD4nBtmENYOTRAqvwlbO0WWLIeDFXoYfo3cvoGBk0VxnhlLph6i+Dyk8e7vYf +DAkYESffS5pyt1Iza25u7XW9AvEoSojzSxVOQAZgejIwRohF4OqwHlGZwyl933Ne +BVPTVqmMrNnFdD1u/zM5b5/hjJcSPpqP+ERokt/WSz5no4IV71F0C2JwNYw13wnN +N5V/GhcifuEi9ZtSq+ydxSFvBbtgCdQOPXBDUfsFWvrBswknJ9xPv8K0KLCvvtVb +mNBmSA/sL18D7k8x9HykstMQh0O2ZurT +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/src/test/resources/testBuildFromPrivateRegistry/Dockerfile b/src/test/resources/testBuildFromPrivateRegistry/Dockerfile new file mode 100644 index 000000000..b3d914c6c --- /dev/null +++ b/src/test/resources/testBuildFromPrivateRegistry/Dockerfile @@ -0,0 +1 @@ +FROM localhost:5000/testuser/busybox:latest From b34135d388f7cadd9445384c4cf756ce57121385 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sat, 15 Aug 2015 19:13:03 +0200 Subject: [PATCH 0032/1124] Fix wrong comment --- src/test/resources/privateRegistry/auth/htpasswd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/privateRegistry/auth/htpasswd b/src/test/resources/privateRegistry/auth/htpasswd index 3835b5d08..59a40620e 100644 --- a/src/test/resources/privateRegistry/auth/htpasswd +++ b/src/test/resources/privateRegistry/auth/htpasswd @@ -1,2 +1,2 @@ -# testuser:testpasswd (see see https://github.com/docker/distribution/blob/master/docs/deploying.md#native-basic-auth) +# testuser:testpassword (see see https://github.com/docker/distribution/blob/master/docs/deploying.md#native-basic-auth) testuser:$2y$05$gI1hyzOYeLU92o5/DjVtOOHtdGymYbkjqJipZNqPET.ChzXMsz2KS From 12818cc56f7659ff8912bffe2f3f14ea37c12bf9 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Sun, 16 Aug 2015 12:31:11 +0200 Subject: [PATCH 0033/1124] Fix test --- .../github/dockerjava/core/command/BuildImageCmdImplTest.java | 2 -- 1 file changed, 2 deletions(-) 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 2fcc22c94..2fb1c545b 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -266,8 +266,6 @@ public void testBuildFromPrivateRegistry() throws Exception { dockerClient.pushImageCmd("localhost:5000/testuser/busybox").withTag("latest").withAuthConfig(authConfig) .exec(new PushImageResultCallback()).awaitSuccess(); - dockerClient.removeImageCmd("busybox:latest").withForce().exec(); - dockerClient.removeImageCmd("localhost:5000/testuser/busybox").withForce().exec(); baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildFromPrivateRegistry") From 4fe366a513c276b4e7178f4f51698068b4c35e3a Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Mon, 17 Aug 2015 19:33:34 +0200 Subject: [PATCH 0034/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81639f894..66195fc81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log Latest SNAPSHOT --- +* [#296] (https://github.com/docker-java/docker-java/pull/296) Fix Build FROM private registry broken with docker 1.7.x * [#295] (https://github.com/docker-java/docker-java/pull/295) Support certificate chains in cert.pem * [#287] (https://github.com/docker-java/docker-java/pull/287) Using the oomKillDisable flag throws a null pointer exception From 7e56f36cdd1d128145b6867b7ebf10c19cf57940 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 17 Aug 2015 19:41:10 +0200 Subject: [PATCH 0035/1124] Fix issue #228 --- src/main/java/com/github/dockerjava/core/DockerClientImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 206ce26fd..60776fda2 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -90,7 +90,7 @@ * * @see "https://github.com/docker/docker/blob/master/api/client/commands.go" */ -public class DockerClientImpl implements Closeable, DockerClient { +public class DockerClientImpl implements Closeable, AutoCloseable, DockerClient { private final DockerClientConfig dockerClientConfig; From ae107a58150220fef96a774cb413c2ff380b4e83 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 17 Aug 2015 19:43:58 +0200 Subject: [PATCH 0036/1124] Fix issue #293 --- src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java index 8e79fc662..2095fd3e2 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/PushImageCmdExec.java @@ -29,7 +29,7 @@ public PushImageCmdExec(WebTarget baseResource) { private String name(PushImageCmd command) { String name = command.getName(); AuthConfig authConfig = command.getAuthConfig(); - return name.contains("/") ? name : authConfig.getUsername(); + return (name.contains("/") || authConfig == null) ? name : authConfig.getUsername(); } @Override From 07640545695665eb996d90c59f4a29de464e72b8 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 18 Aug 2015 22:22:31 +0200 Subject: [PATCH 0037/1124] Fix issue #290 --- .../github/dockerjava/core/NameParser.java | 88 ++++++++---- .../dockerjava/core/NameParserTest.java | 126 ++++++++++++++++++ 2 files changed, 190 insertions(+), 24 deletions(-) create mode 100644 src/test/java/com/github/dockerjava/core/NameParserTest.java diff --git a/src/main/java/com/github/dockerjava/core/NameParser.java b/src/main/java/com/github/dockerjava/core/NameParser.java index 2bd99bf31..bff61e75f 100644 --- a/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/src/main/java/com/github/dockerjava/core/NameParser.java @@ -5,15 +5,24 @@ import java.util.regex.Pattern; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; + import com.github.dockerjava.api.model.AuthConfig; public class NameParser { - private static final Pattern VALID_HEX_PATTERN = Pattern.compile("^([a-f0-9]{64})$"); + private static final int RepositoryNameTotalLengthMax = 255; + + private static final Pattern RepositoryNameComponentRegexp = Pattern.compile("[a-z0-9]+(?:[._-][a-z0-9]+)*"); - private static final Pattern VALID_NAMESPACE_PATTERN = Pattern.compile("^([a-z0-9_]{4,30})$"); + private static final Pattern RepositoryNameComponentAnchoredRegexp = Pattern.compile("^" + + RepositoryNameComponentRegexp.pattern() + "$"); - private static final Pattern VALID_REPO_PATTERN = Pattern.compile("^([a-z0-9-_.]+)$"); + // private static final Pattern RepositoryNameRegexp = Pattern.compile("(?:" + + // RepositoryNameComponentRegexp.pattern() + // + "/)*" + RepositoryNameComponentRegexp.pattern()); public static ReposTag parseRepositoryTag(String name) { int n = name.lastIndexOf(':'); @@ -36,30 +45,44 @@ public ReposTag(String repos, String tag) { this.repos = repos; this.tag = tag; } - } - public static void validateRepositoryName(String repositoryName) { - String name; - String namespace; - String[] nameParts = repositoryName.split("/", 2); - if (nameParts.length < 2) { - namespace = "library"; - name = nameParts[0]; - if (VALID_HEX_PATTERN.matcher(name).matches()) { - throw new InvalidRepositoryNameException(String.format( - "Invalid repository name (%s), cannot specify 64-byte hexadecimal strings", name)); + @Override + public boolean equals(Object obj) { + if (obj instanceof ReposTag) { + ReposTag other = (ReposTag) obj; + return new EqualsBuilder().append(repos, other.repos).append(tag, other.tag).isEquals(); + + } else { + return false; } - } else { - namespace = nameParts[0]; - name = nameParts[1]; } - if (!VALID_NAMESPACE_PATTERN.matcher(namespace).matches()) { - throw new InvalidRepositoryNameException(String.format( - "Invalid namespace name (%s), only [a-z0-9_] are allowed, size between 4 and 30", namespace)); + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE); } - if (!VALID_REPO_PATTERN.matcher(name).matches()) { - throw new InvalidRepositoryNameException(String.format( - "Invalid repository name (%s), only [a-z0-9-_.] are allowed", name)); + } + + /* + * see https://github.com/docker/distribution/blob/master/registry/api/v2/names.go + */ + public static void validateRepoName(String name) { + if (name.isEmpty()) { + throw new InvalidRepositoryNameException(String.format("Invalid empty repository name \"%s\"", name)); + } + + if (name.length() > RepositoryNameTotalLengthMax) { + throw new InvalidRepositoryNameException(String.format("Repository name \"%s\" is longer than " + + RepositoryNameTotalLengthMax, name)); + } + + String[] components = name.split("/"); + + for (String component : components) { + if (!RepositoryNameComponentAnchoredRegexp.matcher(component).matches()) { + throw new InvalidRepositoryNameException(String.format( + "Repository name \"%s\" is invalid. Component: %s", name, component)); + } } } @@ -82,7 +105,7 @@ public static HostnameReposName resolveRepositoryName(String reposName) { reposName)); } - validateRepositoryName(reposName); + validateRepoName(reposName); return new HostnameReposName(hostname, reposName); } @@ -96,5 +119,22 @@ public HostnameReposName(String hostname, String reposName) { this.reposName = reposName; } + @Override + public boolean equals(Object obj) { + if (obj instanceof HostnameReposName) { + HostnameReposName other = (HostnameReposName) obj; + return new EqualsBuilder().append(hostname, other.hostname).append(reposName, other.reposName) + .isEquals(); + + } else { + return false; + } + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE); + } + } } diff --git a/src/test/java/com/github/dockerjava/core/NameParserTest.java b/src/test/java/com/github/dockerjava/core/NameParserTest.java new file mode 100644 index 000000000..6b694753a --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/NameParserTest.java @@ -0,0 +1,126 @@ +/* + * Created on 17.08.2015 + */ +package com.github.dockerjava.core; + +import org.apache.commons.lang.StringUtils; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; + +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.core.NameParser.HostnameReposName; +import com.github.dockerjava.core.NameParser.ReposTag; + +/** + * + * + * @author marcus + * + */ +public class NameParserTest { + + @Test + public void testValidateRepoName() throws Exception { + NameParser.validateRepoName("repository"); + NameParser.validateRepoName("namespace/repository"); + NameParser.validateRepoName("namespace-with-dashes/repository"); + NameParser.validateRepoName("namespace/repository-with-dashes"); + NameParser.validateRepoName("namespace.with.dots/repository"); + NameParser.validateRepoName("namespace/repository.with.dots"); + NameParser.validateRepoName("namespace_with_underscores/repository"); + NameParser.validateRepoName("namespace/repository_with_underscores"); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testValidateRepoNameEmpty() throws Exception { + NameParser.validateRepoName(""); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testValidateRepoNameExceedsMaxLength() throws Exception { + NameParser.validateRepoName(StringUtils.repeat("repository", 255)); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testValidateRepoNameEndWithDash() throws Exception { + NameParser.validateRepoName("repository-"); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testValidateRepoNameStartWithDash() throws Exception { + NameParser.validateRepoName("-repository"); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testValidateRepoNameEndWithDot() throws Exception { + NameParser.validateRepoName("repository."); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testValidateRepoNameStartWithDot() throws Exception { + NameParser.validateRepoName(".repository"); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testValidateRepoNameEndWithUnderscore() throws Exception { + NameParser.validateRepoName("repository_"); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testValidateRepoNameStartWithUnderscore() throws Exception { + NameParser.validateRepoName("_repository"); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testValidateRepoNameWithColon() throws Exception { + NameParser.validateRepoName("repository:with:colon"); + } + + @Test + public void testResolveSimpleRepositoryName() throws Exception { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository"); + assertEquals(resolved, new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository")); + } + + @Test + public void testResolveRepositoryNameWithNamespace() throws Exception { + HostnameReposName resolved = NameParser.resolveRepositoryName("namespace/repository"); + assertEquals(resolved, new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "namespace/repository")); + } + + @Test + public void testResolveRepositoryNameWithNamespaceAndHostname() throws Exception { + HostnameReposName resolved = NameParser.resolveRepositoryName("localhost:5000/namespace/repository"); + assertEquals(resolved, new HostnameReposName("localhost:5000", "namespace/repository")); + } + + @Test(expectedExceptions = InvalidRepositoryNameException.class) + public void testResolveRepositoryNameWithIndex() throws Exception { + NameParser.resolveRepositoryName("index.docker.io/repository"); + } + + @Test + public void testResolveReposTagWithoutTagSimple() throws Exception { + ReposTag resolved = NameParser.parseRepositoryTag("repository"); + assertEquals(resolved, new ReposTag("repository", "")); + + resolved = NameParser.parseRepositoryTag("namespace/repository"); + assertEquals(resolved, new ReposTag("namespace/repository", "")); + + resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository"); + assertEquals(resolved, new ReposTag("localhost:5000/namespace/repository", "")); + } + + @Test + public void testResolveReposTagWithTag() throws Exception { + ReposTag resolved = NameParser.parseRepositoryTag("repository:tag"); + assertEquals(resolved, new ReposTag("repository", "tag")); + + resolved = NameParser.parseRepositoryTag("namespace/repository:tag"); + assertEquals(resolved, new ReposTag("namespace/repository", "tag")); + + resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository:tag"); + assertEquals(resolved, new ReposTag("localhost:5000/namespace/repository", "tag")); + } +} From 78f6caa85a39f92bfe69b649cc368e98c2182471 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 18 Aug 2015 22:41:01 +0200 Subject: [PATCH 0038/1124] Remove newlines --- src/main/java/com/github/dockerjava/core/NameParser.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/NameParser.java b/src/main/java/com/github/dockerjava/core/NameParser.java index bff61e75f..49a550b1d 100644 --- a/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/src/main/java/com/github/dockerjava/core/NameParser.java @@ -51,7 +51,6 @@ public boolean equals(Object obj) { if (obj instanceof ReposTag) { ReposTag other = (ReposTag) obj; return new EqualsBuilder().append(repos, other.repos).append(tag, other.tag).isEquals(); - } else { return false; } @@ -125,7 +124,6 @@ public boolean equals(Object obj) { HostnameReposName other = (HostnameReposName) obj; return new EqualsBuilder().append(hostname, other.hostname).append(reposName, other.reposName) .isEquals(); - } else { return false; } From ad2a58d7944da64a4e3ef3eef0d7ea70e3c3bc45 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 18 Aug 2015 22:53:31 +0200 Subject: [PATCH 0039/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66195fc81..00c58b963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log Latest SNAPSHOT --- +* [#298] (https://github.com/docker-java/docker-java/pull/298) Fix repository name validation errors * [#296] (https://github.com/docker-java/docker-java/pull/296) Fix Build FROM private registry broken with docker 1.7.x * [#295] (https://github.com/docker-java/docker-java/pull/295) Support certificate chains in cert.pem * [#287] (https://github.com/docker-java/docker-java/pull/287) Using the oomKillDisable flag throws a null pointer exception From ea52b1d08019fefa6ca8eab13b29bf1a0deb9537 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 18 Aug 2015 22:54:57 +0200 Subject: [PATCH 0040/1124] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c05fbc68..9b5191d32 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Developer forum for [docker-java](https://groups.google.com/forum/?hl=de#!forum/ * Java 1.7 * Maven 3.0.5 -* Docker daemon running +* Docker 1.7.x If you need SSL, then you'll need to put your `*.pem` file into `~/.docker/`, if you're using boot2docker, do this: From f215929a6ed0883b584ff798bfadf4d679dadf9e Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 19 Aug 2015 23:09:13 +0200 Subject: [PATCH 0041/1124] Fix issue #286 --- .../dockerjava/core/GoLangFileMatch.java | 19 ++++-- .../core/GoLangMatchFileFilter.java | 3 +- .../core/dockerfile/Dockerfile.java | 68 ++++++++++++++++--- .../core/dockerfile/DockerfileStatement.java | 2 +- .../core/command/BuildImageCmdImplTest.java | 8 +++ .../testDockerfileNotIgnored/.dockerignore | 2 + .../testDockerfileNotIgnored/Dockerfile | 9 +++ 7 files changed, 93 insertions(+), 18 deletions(-) create mode 100644 src/test/resources/testDockerfileNotIgnored/.dockerignore create mode 100644 src/test/resources/testDockerfileNotIgnored/Dockerfile diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index 469beb40b..3e2d57485 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -4,6 +4,7 @@ package com.github.dockerjava.core; import java.io.File; +import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; @@ -23,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. * @@ -45,20 +46,24 @@ public class GoLangFileMatch { public static final boolean IS_WINDOWS = File.separatorChar == '\\'; public static boolean match(List patterns, File file) { - return match(patterns, file.getPath()); + return !match(patterns, file.getPath()).isEmpty(); } public static boolean match(String pattern, File file) { return match(pattern, file.getPath()); } - public static boolean match(List patterns, String name) { + /** + * Returns the matching patterns for the given string + */ + public static List match(List patterns, String name) { + List matches = new ArrayList(); for (String pattern : patterns) { if (match(pattern, name)) { - return true; + matches.add(pattern); } } - return false; + return matches; } public static boolean match(String pattern, String name) { diff --git a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java index c8d8e1044..371c30fed 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java +++ b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java @@ -24,8 +24,7 @@ public GoLangMatchFileFilter(File base, List patterns) { public boolean accept(File file) { String relativePath = FilePathUtil.relativize(base, file); - boolean match = GoLangFileMatch.match(patterns, relativePath); - return !match; + return GoLangFileMatch.match(patterns, relativePath).isEmpty(); } } 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 9513678d7..4fe5ed466 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -10,6 +10,7 @@ import com.google.common.base.Objects; import com.google.common.base.Optional; import com.google.common.collect.Collections2; + import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; @@ -89,12 +90,6 @@ public List getIgnores() throws IOException { } pattern = FilenameUtils.normalize(pattern); try { - // validate pattern and make sure we aren't excluding Dockerfile - if (GoLangFileMatch.match(pattern, "Dockerfile")) { - throw new DockerClientException(String.format( - "Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", pattern, - lineNumber)); - } ignores.add(pattern); } catch (GoLangFileMatchException e) { throw new DockerClientException(String.format( @@ -169,7 +164,15 @@ public String toString() { public ScannedResult() throws IOException { ignores = getIgnores(); - filesToAdd.add(dockerFile); + + String matchingIgnorePattern = effectiveMatchingIgnorePattern(dockerFile); + + if (matchingIgnorePattern == null) { + filesToAdd.add(dockerFile); + } else { + throw new DockerClientException(String.format( + "Dockerfile is excluded by pattern '%s' in .dockerignore file", matchingIgnorePattern)); + } for (DockerfileStatement statement : getStatements()) { if (statement instanceof DockerfileStatement.Env) { @@ -180,6 +183,55 @@ public ScannedResult() throws IOException { } } + /** + * Returns all matching ignore patterns for the given file name. + */ + private List matchingIgnorePatterns(String fileName) { + List matches = new ArrayList(); + int lineNumber = 0; + for (String pattern : ignores) { + lineNumber++; + try { + if (GoLangFileMatch.match(pattern, fileName)) { + matches.add(pattern); + } + } catch (GoLangFileMatchException e) { + throw new DockerClientException(String.format( + "Invalid pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); + } + + } + return matches; + } + + /** + * 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); + + List matchingPattern = matchingIgnorePatterns(relativeFilename); + + if (matchingPattern.isEmpty()) + return null; + + String lastMatchingPattern = matchingPattern.get(matchingPattern.size() - 1); + + int lastMatchingPatternIndex = ignores.lastIndexOf(lastMatchingPattern); + + if(lastMatchingPatternIndex == ignores.size() - 1) return lastMatchingPattern; + + List remainingIgnorePattern = ignores.subList(lastMatchingPatternIndex + 1, ignores.size()); + + for (String ignorePattern : remainingIgnorePattern) { + if (ignorePattern.equals("!" + relativeFilename)) + return null; + } + + return lastMatchingPattern; + } + private void processAddStatement(DockerfileStatement.Add add) throws IOException { add = add.transform(environmentMap); @@ -202,7 +254,7 @@ private void processAddStatement(DockerfileStatement.Add add) throws IOException Collection files = FileUtils.listFiles(src, new GoLangMatchFileFilter(src, ignores), TrueFileFilter.INSTANCE); filesToAdd.addAll(files); - } else if (!GoLangFileMatch.match(ignores, FilePathUtil.relativize(dockerFolder, src))) { + } else if (effectiveMatchingIgnorePattern(src) == null) { filesToAdd.add(src); } else { throw new DockerClientException(String.format( 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 b37f5b4f7..2c06312a1 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -19,7 +19,7 @@ /** * A statement present in a dockerfile. */ -public abstract class DockerfileStatement { +public abstract class DockerfileStatement> { private DockerfileStatement() { } 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 2fb1c545b..22030cc9f 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -171,6 +171,14 @@ public void testDockerfileIgnored() throws Exception { dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); } + @Test + public void testDockerfileNotIgnored() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileNotIgnored") + .getFile()); + + dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); + } + @Test(expectedExceptions = { DockerClientException.class }) public void testInvalidDockerIgnorePattern() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() diff --git a/src/test/resources/testDockerfileNotIgnored/.dockerignore b/src/test/resources/testDockerfileNotIgnored/.dockerignore new file mode 100644 index 000000000..5c10f6256 --- /dev/null +++ b/src/test/resources/testDockerfileNotIgnored/.dockerignore @@ -0,0 +1,2 @@ +* +!Dockerfile \ No newline at end of file diff --git a/src/test/resources/testDockerfileNotIgnored/Dockerfile b/src/test/resources/testDockerfileNotIgnored/Dockerfile new file mode 100644 index 000000000..a50dffdd6 --- /dev/null +++ b/src/test/resources/testDockerfileNotIgnored/Dockerfile @@ -0,0 +1,9 @@ +FROM ubuntu:latest + +# Copy testrun.sh files into the container + +RUN echo "Successful executed testrun.sh" > /tmp/testrun.sh + +RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh + +CMD ["testrun.sh"] From b27aac38a2f4a780f2da96e49d64d358a33f5b21 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 19 Aug 2015 23:42:07 +0200 Subject: [PATCH 0042/1124] Fix Dockerfile --- src/test/resources/testDockerfileNotIgnored/Dockerfile | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/test/resources/testDockerfileNotIgnored/Dockerfile b/src/test/resources/testDockerfileNotIgnored/Dockerfile index a50dffdd6..6a8106b86 100644 --- a/src/test/resources/testDockerfileNotIgnored/Dockerfile +++ b/src/test/resources/testDockerfileNotIgnored/Dockerfile @@ -1,9 +1,3 @@ FROM ubuntu:latest -# Copy testrun.sh files into the container - -RUN echo "Successful executed testrun.sh" > /tmp/testrun.sh - -RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh - -CMD ["testrun.sh"] +CMD ["echo", "Success"] From 389a25ea7de0e2726db771ecc4ea1f1340134e39 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 19 Aug 2015 23:42:47 +0200 Subject: [PATCH 0043/1124] Beautify source --- .../com/github/dockerjava/core/dockerfile/Dockerfile.java | 6 ++---- 1 file changed, 2 insertions(+), 4 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 4fe5ed466..2e8ee8397 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -188,6 +188,7 @@ public ScannedResult() throws IOException { */ private List matchingIgnorePatterns(String fileName) { List matches = new ArrayList(); + int lineNumber = 0; for (String pattern : ignores) { lineNumber++; @@ -199,8 +200,8 @@ private List matchingIgnorePatterns(String fileName) { throw new DockerClientException(String.format( "Invalid pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); } - } + return matches; } @@ -286,10 +287,7 @@ private Collection resolveWildcards(File file, List ignores) { } private void processEnvStatement(DockerfileStatement.Env env) { - environmentMap.put(env.variable, env.value); } - } - } From c963c1fa9e85a49d43fb0987f6f8365b68162b3e Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 19 Aug 2015 04:08:32 +0300 Subject: [PATCH 0044/1124] Add FindBugs annotations --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index a6c343ce6..e0edc4943 100644 --- a/pom.xml +++ b/pom.xml @@ -194,6 +194,13 @@ ${hamcrest.jpa-matchers} test + + + com.google.code.findbugs + annotations + 3.0.0 + provided + From 920dfe97cfd0cb64762ae31c706919b71f8752bf Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Wed, 19 Aug 2015 04:09:38 +0300 Subject: [PATCH 0045/1124] BuildImage sync to 1.20 API Reordered fields according to 1.20 API for easier tracking --- .../dockerjava/api/command/BuildImageCmd.java | 99 +++++++- .../core/command/BuildImageCmdImpl.java | 223 ++++++++++++++---- .../dockerjava/jaxrs/BuildImageCmdExec.java | 30 ++- 3 files changed, 286 insertions(+), 66 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 5a41a61fb..5a2fdc7c7 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -1,44 +1,101 @@ package com.github.dockerjava.api.command; -import java.io.File; -import java.io.InputStream; - import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.BuildResponseItem; +import javax.annotation.CheckForNull; +import java.io.File; +import java.io.InputStream; +import java.net.URI; + /** - * * Build an image from Dockerfile. - * + *

* TODO: http://docs.docker.com/reference/builder/#dockerignore * + * @see build-image-from-a-dockerfile */ public interface BuildImageCmd extends AsyncDockerCmd { - public BuildImageCmd withTag(String tag); +// lib specific public InputStream getTarInputStream(); - public String getTag(); + public AuthConfigurations getBuildAuthConfigs(); - public boolean hasNoCacheEnabled(); +// getters - public boolean hasRemoveEnabled(); + /** + * "t" in API + */ + @CheckForNull + public String getTag(); + /** + * "remote" in API + */ + @CheckForNull + public URI getRemote(); + + /** + * "nocache" in API + */ + @CheckForNull + public Boolean hasNoCacheEnabled(); + + /** + * "rm" in API + */ + @CheckForNull + public Boolean hasRemoveEnabled(); + + /** + * "forcerm" in API + */ + public boolean isForcerm(); + + @CheckForNull + public Boolean getForcerm(); + + /** + * "q" in API + */ public boolean isQuiet(); - public boolean hasPullEnabled(); + @CheckForNull + public Boolean getQuiet(); + /** + * "pull" in API + */ + @CheckForNull + public Boolean hasPullEnabled(); + + @CheckForNull public String getPathToDockerfile(); - public AuthConfigurations getBuildAuthConfigs(); + @CheckForNull + public Long getMemory(); + + @CheckForNull + public Long getMemswap(); + + @CheckForNull + public String getCpushares(); + + @CheckForNull + public String getCpusetcpus(); + +// setters + + public BuildImageCmd withTag(String tag); + + public BuildImageCmd withRemote(URI remote); public BuildImageCmd withBaseDirectory(File baseDirectory); public BuildImageCmd withDockerfile(File dockerfile); - public BuildImageCmd withTarInputStream(InputStream tarInputStream); - public BuildImageCmd withNoCache(); public BuildImageCmd withNoCache(boolean noCache); @@ -47,6 +104,10 @@ public interface BuildImageCmd extends AsyncDockerCmd { } 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 56ce8f78f..e270e1c55 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -5,6 +5,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; @@ -12,6 +13,8 @@ import com.github.dockerjava.core.FilePathUtil; import com.github.dockerjava.core.dockerfile.Dockerfile; +import javax.annotation.CheckForNull; + /** * * Build an image from Dockerfile. @@ -19,24 +22,51 @@ */ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd implements BuildImageCmd { - private InputStream tarInputStream = null; + @CheckForNull + private InputStream tarInputStream; + @CheckForNull private String tag; - private boolean noCache; + @CheckForNull + private Boolean noCache; - private boolean remove = true; + @CheckForNull + private Boolean remove = true; - private boolean quiet; + @CheckForNull + private Boolean quiet; - private boolean pull; + @CheckForNull + private Boolean pull; + @CheckForNull private AuthConfigurations buildAuthConfigs; + @CheckForNull private File dockerFile; + @CheckForNull private File baseDirectory; + @CheckForNull + private String cpusetcpus; + + @CheckForNull + private Long memory; + + @CheckForNull + private String cpushares; + + @CheckForNull + private Boolean forcerm; + + @CheckForNull + private Long memswap; + + @CheckForNull + private URI remote; + public BuildImageCmdImpl(BuildImageCmd.Exec exec) { super(exec); } @@ -59,69 +89,50 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { withTarInputStream(tarInputStream); } +// getters API + @Override - public InputStream getTarInputStream() { - return tarInputStream; + public String getTag() { + return tag; } @Override - public BuildImageCmdImpl withDockerfile(File dockerfile) { - checkNotNull(dockerfile); - if (!dockerfile.exists()) - throw new IllegalArgumentException("Dockerfile does not exist"); - if (!dockerfile.isFile()) - throw new IllegalArgumentException("Not a directory"); - - if (baseDirectory == null) - withBaseDirectory(dockerfile.getParentFile()); - - this.dockerFile = dockerfile; - - try { - withTarInputStream(new Dockerfile(dockerfile).parse().buildDockerFolderTar(baseDirectory)); - } catch (IOException e) { - // we just created the file this should never happen. - throw new RuntimeException(e); - } - return this; + public URI getRemote() { + return remote; } @Override - public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { - checkNotNull(tarInputStream, "tarInputStream is null"); - this.tarInputStream = tarInputStream; - return this; + public Boolean hasNoCacheEnabled() { + return noCache; } @Override - public BuildImageCmdImpl withTag(String tag) { - checkNotNull(tag, "Tag is null"); - this.tag = tag; - return this; + public Boolean hasRemoveEnabled() { + return remove; } @Override - public String getTag() { - return tag; + public boolean isForcerm() { + return forcerm != null && forcerm; } @Override - public boolean hasNoCacheEnabled() { - return noCache; + public Boolean getForcerm() { + return forcerm; } @Override - public boolean hasRemoveEnabled() { - return remove; + public boolean isQuiet() { + return quiet != null && quiet; } @Override - public boolean isQuiet() { + public Boolean getQuiet() { return quiet; } @Override - public boolean hasPullEnabled() { + public Boolean hasPullEnabled() { return pull; } @@ -134,14 +145,50 @@ public String getPathToDockerfile() { } } + @Override + public Long getMemory() { + return memory; + } + + @Override + public Long getMemswap() { + return memswap; + } + + @Override + public String getCpushares() { + return cpushares; + } + + @Override + public String getCpusetcpus() { + return cpusetcpus; + } + +// getter lib specific + @Override public AuthConfigurations getBuildAuthConfigs() { return buildAuthConfigs; } @Override - public BuildImageCmd withBaseDirectory(File baseDirectory) { - this.baseDirectory = baseDirectory; + public InputStream getTarInputStream() { + return tarInputStream; + } + +// setters + + @Override + public BuildImageCmdImpl withTag(String tag) { + checkNotNull(tag, "Tag is null"); + this.tag = tag; + return this; + } + + @Override + public BuildImageCmd withRemote(URI remote) { + this.remote = remote; return this; } @@ -167,6 +214,17 @@ public BuildImageCmdImpl withRemove(boolean rm) { return this; } + @Override + public BuildImageCmd withForcerm() { + return withForcerm(true); + } + + @Override + public BuildImageCmd withForcerm(boolean forcerm) { + this.forcerm = forcerm; + return this; + } + @Override public BuildImageCmdImpl withQuiet() { return withQuiet(true); @@ -189,6 +247,67 @@ public BuildImageCmdImpl withPull(boolean pull) { return this; } + @Override + public BuildImageCmd withMemory(long memory) { + this.memory = memory; + return this; + } + + @Override + public BuildImageCmd withMemswap(long memswap) { + this.memswap = memswap; + return this; + } + + @Override + public BuildImageCmd withCpushares(String cpushares) { + this.cpushares = cpushares; + return this; + } + + @Override + public BuildImageCmd withCpusetcpus(String cpusetcpus) { + this.cpusetcpus = cpusetcpus; + return this; + } + +// lib specific + + @Override + public BuildImageCmd withBaseDirectory(File baseDirectory) { + this.baseDirectory = baseDirectory; + return this; + } + + @Override + public BuildImageCmdImpl withDockerfile(File dockerfile) { + checkNotNull(dockerfile); + if (!dockerfile.exists()) + throw new IllegalArgumentException("Dockerfile does not exist"); + if (!dockerfile.isFile()) + throw new IllegalArgumentException("Not a directory"); + + if (baseDirectory == null) + withBaseDirectory(dockerfile.getParentFile()); + + this.dockerFile = dockerfile; + + try { + withTarInputStream(new Dockerfile(dockerfile).parse().buildDockerFolderTar(baseDirectory)); + } catch (IOException e) { + // we just created the file this should never happen. + throw new RuntimeException(e); + } + return this; + } + + @Override + public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { + checkNotNull(tarInputStream, "tarInputStream is null"); + this.tarInputStream = tarInputStream; + return this; + } + @Override public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfigs) { checkNotNull(authConfigs, "authConfig is null"); @@ -205,9 +324,19 @@ public void close() throws IOException { @Override public String toString() { - return new StringBuilder("build ").append(tag != null ? "-t " + tag + " " : "") - .append(noCache ? "--nocache=true " : "").append(quiet ? "--quiet=true " : "") - .append(!remove ? "--rm=false " : "").toString(); + return new StringBuilder("build ") + .append(tag != null ? "-t " + tag + " " : "") + .append(remote != null ? "--remote=" + remote.toString() + " " : "") + .append((quiet != null && quiet) ? "--quiet=true " : "") + .append((noCache != null && noCache) ? "--nocache=true " : "") + .append((pull != null && pull) ? "--pull=true" : "") + .append((remove != null && !remove) ? "--rm=false " : "") + .append((forcerm != null && forcerm) ? "--forcerm=true " : " ") + .append(memory != null ? "--memory=" + memory + " " : "") + .append(memswap != null ? "--memswap=" + memswap + " " : "") + .append(cpushares != null ? "--cpushares=" + cpushares + " " : "") + .append(cpusetcpus != null ? "--cpusetcpus=" + cpusetcpus + " " : "") + .toString(); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 7a259b5a1..b28cec35c 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -43,23 +43,41 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag 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()); + } + 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 = webTarget.queryParam("rm", "false"); } - if (command.isQuiet()) { - webTarget = webTarget.queryParam("q", "true"); + if (command.isForcerm()) { + webTarget = webTarget.queryParam("forcerm", "true"); } - if (command.hasPullEnabled()) { - webTarget = webTarget.queryParam("pull", "true"); + if (command.getMemory() != null) { + webTarget = webTarget.queryParam("memory", command.getMemory()); } - if (dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { - webTarget = webTarget.queryParam("dockerfile", dockerFilePath); + 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()); } webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); From 67f1258411c8cd0dd2e4e8408caad170e7839651 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 20 Aug 2015 00:30:14 +0300 Subject: [PATCH 0046/1124] Diamonds <> --- .../com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index b28cec35c..465cd2869 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -85,8 +85,11 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag LOGGER.trace("POST: {}", webTarget); - return new POSTCallbackNotifier(new JsonStreamProcessor( - BuildResponseItem.class), resultCallback, resourceWithOptionalAuthConfig(command, webTarget.request()) - .accept(MediaType.TEXT_PLAIN), entity(command.getTarInputStream(), "application/tar")); + return new POSTCallbackNotifier<>(new JsonStreamProcessor<>(BuildResponseItem.class), + resultCallback, + resourceWithOptionalAuthConfig(command, webTarget.request()) + .accept(MediaType.TEXT_PLAIN), + entity(command.getTarInputStream(), "application/tar") + ); } } From 3ceac6135f6518577c9f17262ee8610426dec068 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 20 Aug 2015 00:30:37 +0300 Subject: [PATCH 0047/1124] Replace with auto-generated toString() --- .../core/command/BuildImageCmdImpl.java | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) 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 e270e1c55..3cd6bc755 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -12,6 +12,8 @@ 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; @@ -324,19 +326,6 @@ public void close() throws IOException { @Override public String toString() { - return new StringBuilder("build ") - .append(tag != null ? "-t " + tag + " " : "") - .append(remote != null ? "--remote=" + remote.toString() + " " : "") - .append((quiet != null && quiet) ? "--quiet=true " : "") - .append((noCache != null && noCache) ? "--nocache=true " : "") - .append((pull != null && pull) ? "--pull=true" : "") - .append((remove != null && !remove) ? "--rm=false " : "") - .append((forcerm != null && forcerm) ? "--forcerm=true " : " ") - .append(memory != null ? "--memory=" + memory + " " : "") - .append(memswap != null ? "--memswap=" + memswap + " " : "") - .append(cpushares != null ? "--cpushares=" + cpushares + " " : "") - .append(cpusetcpus != null ? "--cpusetcpus=" + cpusetcpus + " " : "") - .toString(); + return ReflectionToStringBuilder.toString(this, ToStringStyle.SIMPLE_STYLE); } - } From 18a0febdc16a1f7e9d26bf946994540af179c171 Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Thu, 20 Aug 2015 00:31:28 +0300 Subject: [PATCH 0048/1124] Place logicaly linked words on new line --- .../java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 465cd2869..53c3c5de0 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -19,9 +19,8 @@ import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; -public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements - BuildImageCmd.Exec { - +public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec + implements BuildImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); public BuildImageCmdExec(WebTarget baseResource) { From 33fdd7125f3be5aef33f12ca94df9ca28271d120 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 19 Aug 2015 23:46:03 +0200 Subject: [PATCH 0049/1124] Fix issue #286 --- .../dockerjava/core/GoLangFileMatch.java | 19 +++-- .../core/GoLangMatchFileFilter.java | 3 +- .../core/dockerfile/Dockerfile.java | 72 ++++++++++++++++--- .../core/dockerfile/DockerfileStatement.java | 2 +- .../core/command/BuildImageCmdImplTest.java | 8 +++ .../testDockerfileNotIgnored/.dockerignore | 2 + .../testDockerfileNotIgnored/Dockerfile | 3 + 7 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 src/test/resources/testDockerfileNotIgnored/.dockerignore create mode 100644 src/test/resources/testDockerfileNotIgnored/Dockerfile diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index 469beb40b..3e2d57485 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -4,6 +4,7 @@ package com.github.dockerjava.core; import java.io.File; +import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; @@ -23,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. * @@ -45,20 +46,24 @@ public class GoLangFileMatch { public static final boolean IS_WINDOWS = File.separatorChar == '\\'; public static boolean match(List patterns, File file) { - return match(patterns, file.getPath()); + return !match(patterns, file.getPath()).isEmpty(); } public static boolean match(String pattern, File file) { return match(pattern, file.getPath()); } - public static boolean match(List patterns, String name) { + /** + * Returns the matching patterns for the given string + */ + public static List match(List patterns, String name) { + List matches = new ArrayList(); for (String pattern : patterns) { if (match(pattern, name)) { - return true; + matches.add(pattern); } } - return false; + return matches; } public static boolean match(String pattern, String name) { diff --git a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java index c8d8e1044..371c30fed 100644 --- a/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java +++ b/src/main/java/com/github/dockerjava/core/GoLangMatchFileFilter.java @@ -24,8 +24,7 @@ public GoLangMatchFileFilter(File base, List patterns) { public boolean accept(File file) { String relativePath = FilePathUtil.relativize(base, file); - boolean match = GoLangFileMatch.match(patterns, relativePath); - return !match; + return GoLangFileMatch.match(patterns, relativePath).isEmpty(); } } 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 9513678d7..2e8ee8397 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -10,6 +10,7 @@ import com.google.common.base.Objects; import com.google.common.base.Optional; import com.google.common.collect.Collections2; + import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; @@ -89,12 +90,6 @@ public List getIgnores() throws IOException { } pattern = FilenameUtils.normalize(pattern); try { - // validate pattern and make sure we aren't excluding Dockerfile - if (GoLangFileMatch.match(pattern, "Dockerfile")) { - throw new DockerClientException(String.format( - "Dockerfile is excluded by pattern '%s' on line %s in .dockerignore file", pattern, - lineNumber)); - } ignores.add(pattern); } catch (GoLangFileMatchException e) { throw new DockerClientException(String.format( @@ -169,7 +164,15 @@ public String toString() { public ScannedResult() throws IOException { ignores = getIgnores(); - filesToAdd.add(dockerFile); + + String matchingIgnorePattern = effectiveMatchingIgnorePattern(dockerFile); + + if (matchingIgnorePattern == null) { + filesToAdd.add(dockerFile); + } else { + throw new DockerClientException(String.format( + "Dockerfile is excluded by pattern '%s' in .dockerignore file", matchingIgnorePattern)); + } for (DockerfileStatement statement : getStatements()) { if (statement instanceof DockerfileStatement.Env) { @@ -180,6 +183,56 @@ public ScannedResult() throws IOException { } } + /** + * Returns all matching ignore patterns for the given file name. + */ + private List matchingIgnorePatterns(String fileName) { + List matches = new ArrayList(); + + int lineNumber = 0; + for (String pattern : ignores) { + lineNumber++; + try { + if (GoLangFileMatch.match(pattern, fileName)) { + matches.add(pattern); + } + } catch (GoLangFileMatchException e) { + throw new DockerClientException(String.format( + "Invalid pattern '%s' on line %s in .dockerignore file", pattern, lineNumber)); + } + } + + return matches; + } + + /** + * 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); + + List matchingPattern = matchingIgnorePatterns(relativeFilename); + + if (matchingPattern.isEmpty()) + return null; + + String lastMatchingPattern = matchingPattern.get(matchingPattern.size() - 1); + + int lastMatchingPatternIndex = ignores.lastIndexOf(lastMatchingPattern); + + if(lastMatchingPatternIndex == ignores.size() - 1) return lastMatchingPattern; + + List remainingIgnorePattern = ignores.subList(lastMatchingPatternIndex + 1, ignores.size()); + + for (String ignorePattern : remainingIgnorePattern) { + if (ignorePattern.equals("!" + relativeFilename)) + return null; + } + + return lastMatchingPattern; + } + private void processAddStatement(DockerfileStatement.Add add) throws IOException { add = add.transform(environmentMap); @@ -202,7 +255,7 @@ private void processAddStatement(DockerfileStatement.Add add) throws IOException Collection files = FileUtils.listFiles(src, new GoLangMatchFileFilter(src, ignores), TrueFileFilter.INSTANCE); filesToAdd.addAll(files); - } else if (!GoLangFileMatch.match(ignores, FilePathUtil.relativize(dockerFolder, src))) { + } else if (effectiveMatchingIgnorePattern(src) == null) { filesToAdd.add(src); } else { throw new DockerClientException(String.format( @@ -234,10 +287,7 @@ private Collection resolveWildcards(File file, List ignores) { } private void processEnvStatement(DockerfileStatement.Env env) { - environmentMap.put(env.variable, env.value); } - } - } 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 b37f5b4f7..2c06312a1 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/DockerfileStatement.java @@ -19,7 +19,7 @@ /** * A statement present in a dockerfile. */ -public abstract class DockerfileStatement { +public abstract class DockerfileStatement> { private DockerfileStatement() { } 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 2fb1c545b..22030cc9f 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -171,6 +171,14 @@ public void testDockerfileIgnored() throws Exception { dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); } + @Test + public void testDockerfileNotIgnored() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testDockerfileNotIgnored") + .getFile()); + + dockerClient.buildImageCmd(baseDir).withNoCache().exec(new BuildImageResultCallback()).awaitImageId(); + } + @Test(expectedExceptions = { DockerClientException.class }) public void testInvalidDockerIgnorePattern() throws Exception { File baseDir = new File(Thread.currentThread().getContextClassLoader() diff --git a/src/test/resources/testDockerfileNotIgnored/.dockerignore b/src/test/resources/testDockerfileNotIgnored/.dockerignore new file mode 100644 index 000000000..5c10f6256 --- /dev/null +++ b/src/test/resources/testDockerfileNotIgnored/.dockerignore @@ -0,0 +1,2 @@ +* +!Dockerfile \ No newline at end of file diff --git a/src/test/resources/testDockerfileNotIgnored/Dockerfile b/src/test/resources/testDockerfileNotIgnored/Dockerfile new file mode 100644 index 000000000..6a8106b86 --- /dev/null +++ b/src/test/resources/testDockerfileNotIgnored/Dockerfile @@ -0,0 +1,3 @@ +FROM ubuntu:latest + +CMD ["echo", "Success"] From 96109c4cea8ccc2d31e8e833fc44f9aae8afb789 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 20 Aug 2015 00:09:19 +0200 Subject: [PATCH 0050/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00c58b963..c5fa79965 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log Latest SNAPSHOT --- +* [#301] (https://github.com/docker-java/docker-java/pull/301) Respect exception rules in .dockerignore file while build images * [#298] (https://github.com/docker-java/docker-java/pull/298) Fix repository name validation errors * [#296] (https://github.com/docker-java/docker-java/pull/296) Fix Build FROM private registry broken with docker 1.7.x * [#295] (https://github.com/docker-java/docker-java/pull/295) Support certificate chains in cert.pem From 8184a90038a1e0c8f93b43fcd5054aa0c65f5d81 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 20 Aug 2015 21:53:52 +0200 Subject: [PATCH 0051/1124] [maven-release-plugin] prepare release docker-java-2.0.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a6c343ce6..52b54a592 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.0.1-SNAPSHOT + 2.0.1 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.0.1 From b7787ac858c8ade0ea35b69e0c3b3529c1357ff3 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 20 Aug 2015 21:53:55 +0200 Subject: [PATCH 0052/1124] [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 52b54a592..578953d9d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.0.1 + 2.0.2-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.0.1 + HEAD From 2fe6186890a4bd54526414885d3db66b1c1a2f59 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 20 Aug 2015 21:59:39 +0200 Subject: [PATCH 0053/1124] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b5191d32..4a89ab63d 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Run build without integration tests: com.github.docker-java docker-java - 2.0.0 + 2.0.1 ### 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.0.1-SNAPSHOT + 2.0.2-SNAPSHOT ## Documentation From 41531ee9b5bdf0f44b67bd8ccdaf8fde70e50370 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 20 Aug 2015 22:23:00 +0200 Subject: [PATCH 0054/1124] Update CHANGELOG.md --- CHANGELOG.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5fa79965..a0cdb62d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,20 @@ Change Log === -Latest SNAPSHOT +v2.0.1 --- +Release notes +* This is a bugfix release. With this release docker >= v1.7.0 is recommended. + +All changes + * [#301] (https://github.com/docker-java/docker-java/pull/301) Respect exception rules in .dockerignore file while build images * [#298] (https://github.com/docker-java/docker-java/pull/298) Fix repository name validation errors * [#296] (https://github.com/docker-java/docker-java/pull/296) Fix Build FROM private registry broken with docker 1.7.x * [#295] (https://github.com/docker-java/docker-java/pull/295) Support certificate chains in cert.pem * [#287] (https://github.com/docker-java/docker-java/pull/287) Using the oomKillDisable flag throws a null pointer exception -v.2.0.0 +v2.0.0 --- Release notes @@ -31,7 +36,7 @@ All changes * [#262](https://github.com/docker-java/docker-java/pull/262) Accept filters in list containers * [#260](https://github.com/docker-java/docker-java/pull/260) Add labels to create and inspect container -v.1.4.0 +v1.4.0 --- * [#248](https://github.com/docker-java/docker-java/pull/248) Removed deprecated start options * [#247](https://github.com/docker-java/docker-java/pull/247) Add Domainname attribute on create command From 32d0f93d14b84243cf67b16cdb9cf532287052ae Mon Sep 17 00:00:00 2001 From: Kanstantsin Shautsou Date: Fri, 21 Aug 2015 02:04:59 +0300 Subject: [PATCH 0055/1124] Restore backward compatibility --- .../dockerjava/api/command/BuildImageCmd.java | 14 +++-------- .../core/command/BuildImageCmdImpl.java | 25 ++++++------------- 2 files changed, 12 insertions(+), 27 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 5a2fdc7c7..c737501fa 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -40,14 +40,12 @@ public interface BuildImageCmd extends AsyncDockerCmd Date: Sun, 23 Aug 2015 08:31:35 +0200 Subject: [PATCH 0056/1124] chore(core): do not expect default DockerCmdExecFactory service Only fail for missing `DockerCmdExecFactory` service if `getDefaultDockerCmdExecFactory` is called. Otherwise `DockerClientBuilder` can't be used without a `DockerCmdExecFactory` service on classpath. --- .../github/dockerjava/core/DockerClientBuilder.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java index 51f8c4dc7..f9fd4f2de 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java @@ -16,12 +16,9 @@ public class DockerClientBuilder { static { serviceLoader.reload(); Iterator iterator = serviceLoader.iterator(); - if (!iterator.hasNext()) { - throw new RuntimeException("Fatal: Can't find any implementation of '" - + DockerCmdExecFactory.class.getName() + "' in the current classpath."); + if (iterator.hasNext()) { + factoryClass = iterator.next().getClass(); } - - factoryClass = iterator.next().getClass(); } private DockerClientImpl dockerClient = null; @@ -49,6 +46,11 @@ 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) { From 69221fe9bc12d35d95f0d3fdd5b7224c53f352fc Mon Sep 17 00:00:00 2001 From: Sebastian Menski Date: Sun, 23 Aug 2015 09:45:13 +0200 Subject: [PATCH 0057/1124] fix(core): fix NPE if latestItem is null in result callback --- .../dockerjava/core/command/BuildImageResultCallback.java | 4 +++- .../dockerjava/core/command/PullImageResultCallback.java | 4 +++- .../dockerjava/core/command/PushImageResultCallback.java | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java index 4de6e280e..ae36a63d7 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageResultCallback.java @@ -62,7 +62,9 @@ public String awaitImageId(long timeout, TimeUnit timeUnit) { } private String getImageId() { - if (latestItem == null || !latestItem.isBuildSuccessIndicated()) { + if (latestItem == null) { + throw new DockerClientException("Could not build image"); + } else if (!latestItem.isBuildSuccessIndicated()) { throw new DockerClientException("Could not build image: " + latestItem.getError()); } else { return latestItem.getImageId(); 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 18c33f885..1924759bd 100644 --- a/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/PullImageResultCallback.java @@ -40,7 +40,9 @@ public void awaitSuccess() { throw new DockerClientException("", e); } - if (latestItem == null || !latestItem.isPullSuccessIndicated()) { + if (latestItem == null) { + throw new DockerClientException("Could not pull image"); + } else if (!latestItem.isPullSuccessIndicated()) { throw new DockerClientException("Could not pull image: " + latestItem.getError()); } } 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 afcd16389..2b80a244e 100644 --- a/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java +++ b/src/main/java/com/github/dockerjava/core/command/PushImageResultCallback.java @@ -40,7 +40,9 @@ public void awaitSuccess() { throw new DockerClientException("", e); } - if (latestItem == null || latestItem.isErrorIndicated()) { + if (latestItem == null) { + throw new DockerClientException("Could not push image"); + } else if (latestItem.isErrorIndicated()) { throw new DockerClientException("Could not push image: " + latestItem.getError()); } } From c231b8d09fa36a16d275df9b8432300301974224 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 21 Aug 2015 20:50:46 +0200 Subject: [PATCH 0058/1124] fix issue #303 --- .../dockerjava/api/command/DockerCmd.java | 3 +++ .../core/command/AbstrAsyncDockerCmd.java | 2 +- .../core/command/AbstrDockerCmd.java | 2 +- .../core/command/BuildImageCmdImpl.java | 8 +++++-- .../jaxrs/AbstrAsyncDockerCmdExec.java | 6 +---- .../jaxrs/AbstrSyncDockerCmdExec.java | 24 +++++++------------ 6 files changed, 20 insertions(+), 25 deletions(-) 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 a4e7e3a5e..eafe34ae5 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java @@ -4,4 +4,7 @@ public interface DockerCmd extends Closeable { + @Override + public void close(); + } \ No newline at end of file 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 04311e8c1..c49c0404c 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java @@ -25,7 +25,7 @@ public > T exec(T resultCallback) { } @Override - public void close() throws IOException { + public void close() { } } 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 c4fedac58..3594f960f 100644 --- a/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -34,7 +34,7 @@ public RES_T exec() throws DockerException { } @Override - public void close() throws IOException { + public void close() { } protected String registryAuth(AuthConfig authConfig) { 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 56ce8f78f..30857485b 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -197,10 +197,14 @@ public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfigs) { } @Override - public void close() throws IOException { + public void close() { super.close(); - tarInputStream.close(); + try { + tarInputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } } @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java index cb91a56e7..c8cc954f3 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrAsyncDockerCmdExec.java @@ -50,11 +50,7 @@ public void onError(Throwable throwable) { @Override public void onComplete() { resultCallback.onComplete(); - try { - command.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } + command.close(); } }; diff --git a/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java index 7e26c519e..016184053 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/AbstrSyncDockerCmdExec.java @@ -19,25 +19,17 @@ public AbstrSyncDockerCmdExec(WebTarget baseResource) { @Override public RES_T exec(CMD_T command) { // this hack works because of ResponseStatusExceptionFilter - RES_T result; - try { - result = execute(command); - - } catch (ProcessingException e) { - if (e.getCause() instanceof DockerException) { - throw (DockerException) e.getCause(); - } else { - throw e; - } - } finally { + try (CMD_T cmd = command) { try { - command.close(); - } catch (IOException e) { - throw new RuntimeException(e); + return execute(cmd); + } catch (ProcessingException e) { + if (e.getCause() instanceof DockerException) { + throw (DockerException) e.getCause(); + } else { + throw e; + } } } - - return result; } protected abstract RES_T execute(CMD_T command); From 10c104036169d595386ee50262aa26aa3f4d3f5e Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Mon, 24 Aug 2015 21:53:54 +0200 Subject: [PATCH 0059/1124] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0cdb62d0..1d39620af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change Log === +Latest SNAPSHOT +--- +* [#304] (https://github.com/docker-java/docker-java/pull/304) Throw original exception when command.close() throws Exception too + v2.0.1 --- Release notes From e3e0ed5d980987caf75d0f57df07fc2f0c071a60 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 24 Aug 2015 22:13:24 +0200 Subject: [PATCH 0060/1124] Format source --- .../java/com/github/dockerjava/core/GoLangFileMatch.java | 6 +++--- .../com/github/dockerjava/core/dockerfile/Dockerfile.java | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index 3e2d57485..afe4b9843 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/dockerfile/Dockerfile.java b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java index 2e8ee8397..9c8ef428d 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -206,8 +206,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); @@ -221,7 +221,8 @@ private String effectiveMatchingIgnorePattern(File file) { int lastMatchingPatternIndex = ignores.lastIndexOf(lastMatchingPattern); - if(lastMatchingPatternIndex == ignores.size() - 1) return lastMatchingPattern; + if (lastMatchingPatternIndex == ignores.size() - 1) + return lastMatchingPattern; List remainingIgnorePattern = ignores.subList(lastMatchingPatternIndex + 1, ignores.size()); From 8ac9d443aacd09e305daadafce6f861aa27cd2d6 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Mon, 24 Aug 2015 22:16:35 +0200 Subject: [PATCH 0061/1124] Format sources --- .../java/com/github/dockerjava/core/DockerClientBuilder.java | 2 +- .../com/github/dockerjava/core/command/BuildImageCmdImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java index f9fd4f2de..28c84cab5 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java @@ -48,7 +48,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."); + + DockerCmdExecFactory.class.getName() + "' in the current classpath."); } try { 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 30857485b..e6f3a909e 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -203,7 +203,7 @@ public void close() { try { tarInputStream.close(); } catch (IOException e) { - throw new RuntimeException(e); + throw new RuntimeException(e); } } From 11f5c7f07b1feef2f568c2b04b42c2ab66069d22 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Mon, 24 Aug 2015 22:33:51 +0200 Subject: [PATCH 0062/1124] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d39620af..84733d058 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Change Log 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 v2.0.1 From aa4fd08213528d61107246896ba01249ca433c58 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Tue, 25 Aug 2015 21:27:39 +0200 Subject: [PATCH 0063/1124] Format sources --- .../dockerjava/api/command/BuildImageCmd.java | 11 ++++++----- .../dockerjava/core/command/BuildImageCmdImpl.java | 8 ++++---- .../github/dockerjava/jaxrs/BuildImageCmdExec.java | 13 +++++-------- 3 files changed, 15 insertions(+), 17 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 c737501fa..dadaac4c5 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -13,17 +13,18 @@ *

* TODO: http://docs.docker.com/reference/builder/#dockerignore * - * @see build-image-from-a-dockerfile + * @see build-image-from-a-dockerfile */ public interface BuildImageCmd extends AsyncDockerCmd { -// lib specific + // lib specific public InputStream getTarInputStream(); public AuthConfigurations getBuildAuthConfigs(); -// getters + // getters /** * "t" in API @@ -80,7 +81,7 @@ public interface BuildImageCmd extends AsyncDockerCmd - implements BuildImageCmd.Exec { +public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements + BuildImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); public BuildImageCmdExec(WebTarget baseResource) { @@ -84,11 +84,8 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag LOGGER.trace("POST: {}", webTarget); - return new POSTCallbackNotifier<>(new JsonStreamProcessor<>(BuildResponseItem.class), - resultCallback, - resourceWithOptionalAuthConfig(command, webTarget.request()) - .accept(MediaType.TEXT_PLAIN), - entity(command.getTarInputStream(), "application/tar") - ); + return new POSTCallbackNotifier<>(new JsonStreamProcessor<>(BuildResponseItem.class), resultCallback, + resourceWithOptionalAuthConfig(command, webTarget.request()).accept(MediaType.TEXT_PLAIN), entity( + command.getTarInputStream(), "application/tar")); } } From b82273e2e275608251e11a74f7c60456cc18cf44 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Tue, 25 Aug 2015 21:29:26 +0200 Subject: [PATCH 0064/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84733d058..6eb055b5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ 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 v2.0.1 --- From 40089908ca1b0fe1cc2bf0c296c4e9a199920df9 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Wed, 26 Aug 2015 23:51:22 +0200 Subject: [PATCH 0065/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eb055b5f..270f12d37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Latest SNAPSHOT * [#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 --- From 73b79961c9b48702f0b2d747fbd44a90fe9088c0 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 27 Aug 2015 21:23:20 +0200 Subject: [PATCH 0066/1124] Don't use AutoCloseable as Closeable already inherits it --- src/main/java/com/github/dockerjava/core/DockerClientImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 60776fda2..206ce26fd 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -90,7 +90,7 @@ * * @see "https://github.com/docker/docker/blob/master/api/client/commands.go" */ -public class DockerClientImpl implements Closeable, AutoCloseable, DockerClient { +public class DockerClientImpl implements Closeable, DockerClient { private final DockerClientConfig dockerClientConfig; From f0f8eb3a9eb5d5c6e598b0507cc97a01ed8ddfbc Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 27 Aug 2015 21:45:00 +0200 Subject: [PATCH 0067/1124] Prepare 2.1.0 release --- CHANGELOG.md | 2 +- README.md | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 270f12d37..149cad945 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Change Log === -Latest SNAPSHOT +v2.1.0 --- * [#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 diff --git a/README.md b/README.md index 4a89ab63d..770f0154e 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.0.2-SNAPSHOT + 2.1.0-SNAPSHOT ## Documentation diff --git a/pom.xml b/pom.xml index edca264e7..ad712522e 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.0.2-SNAPSHOT + 2.1.0-SNAPSHOT docker-java https://github.com/docker-java/docker-java From e2cce7646efdc8f06f55323117c80713316d31e5 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 27 Aug 2015 21:47:50 +0200 Subject: [PATCH 0068/1124] [maven-release-plugin] prepare release docker-java-2.1.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ad712522e..c238a3e2b 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.1.0-SNAPSHOT + 2.1.0 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.0 From cb73e57eede629623c0a0cf6522eef72d6b325f2 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 27 Aug 2015 21:47:54 +0200 Subject: [PATCH 0069/1124] [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 c238a3e2b..75748be1a 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.1.0 + 2.1.1-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.0 + HEAD From ee570eda20e4a278b082261a211b046913bd6a92 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 27 Aug 2015 21:50:49 +0200 Subject: [PATCH 0070/1124] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 770f0154e..a39363cb1 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Run build without integration tests: com.github.docker-java docker-java - 2.0.1 + 2.1.0 ### 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.0-SNAPSHOT + 2.1.1-SNAPSHOT ## Documentation From cea03a6c6c013d90f71694c6f49f01ca65ab4b7b Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Wed, 26 Aug 2015 23:49:41 +0200 Subject: [PATCH 0071/1124] 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 c9618782d0c89e5f80c105f068c56d8028b56123 Mon Sep 17 00:00:00 2001 From: Marco Lotz Date: Tue, 1 Sep 2015 16:24:29 +0100 Subject: [PATCH 0072/1124] Link sent to a German Version of dev group. Modified to English address. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4a89ab63d..60eeca79b 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Supports a subset of the Docker Remote API [v1.19](https://github.com/docker/doc The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries! -Developer forum for [docker-java](https://groups.google.com/forum/?hl=de#!forum/docker-java-dev "docker-java") +Developer forum for [docker-java](https://groups.google.com/forum/?#!forum/docker-java-dev "docker-java") ## Build with Maven From ee0b7db93537bfaf26983d02ea4fed4a1608e217 Mon Sep 17 00:00:00 2001 From: Yongxing Wang Date: Thu, 10 Sep 2015 17:42:51 -0700 Subject: [PATCH 0073/1124] This add the support for "since" field for logs command. --- .../dockerjava/api/command/LogContainerCmd.java | 6 ++++++ .../core/command/LogContainerCmdImpl.java | 17 ++++++++++++++++- .../dockerjava/jaxrs/LogContainerCmdExec.java | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) 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..b1c22283c 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -18,6 +18,8 @@ * - true or false, if true, print timestamps for every log line. Defaults to false. * @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) */ public interface LogContainerCmd extends AsyncDockerCmd { @@ -33,6 +35,8 @@ public interface LogContainerCmd extends AsyncDockerCmd public boolean hasStderrEnabled(); + public int getSince(); + public LogContainerCmd withContainerId(String containerId); /** @@ -63,6 +67,8 @@ public interface LogContainerCmd extends AsyncDockerCmd public LogContainerCmd withTail(int tail); + public LogContainerCmd withSince(int since); + public static interface Exec extends DockerCmdAsyncExec { } 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..afc6a0754 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -18,6 +18,8 @@ * - true or false, if true, print timestamps for every log line. Defaults to false. * @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) */ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd implements LogContainerCmd { @@ -27,6 +29,8 @@ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd 0 ? "--since=" + since : "") + .append(containerId).toString(); } } diff --git a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java index 0ab3da7a5..b2c1691b6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/LogContainerCmdExec.java @@ -31,6 +31,7 @@ protected AbstractCallbackNotifier callbackNotifier(LogContainerCmd comma .queryParam("stdout", command.hasStdoutEnabled() ? "1" : "0") .queryParam("stderr", command.hasStderrEnabled() ? "1" : "0") .queryParam("follow", command.hasFollowStreamEnabled() ? "1" : "0") + .queryParam("since", command.getSince()) .queryParam("tail", command.getTail() < 0 ? "all" : "" + command.getTail()); LOGGER.trace("GET: {}", webTarget); From 2625bca90566801cb64557755728cf525892c5b8 Mon Sep 17 00:00:00 2001 From: Yongxing Wang Date: Thu, 10 Sep 2015 23:33:29 -0700 Subject: [PATCH 0074/1124] add a test for the since field --- .../core/command/LogContainerCmdImplTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) 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 2e2dedb45..16b0266ac 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -62,6 +62,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); loggingCallback.awaitCompletion(); @@ -69,6 +70,8 @@ public void asyncLogContainer() throws Exception { assertTrue(loggingCallback.toString().contains(snippet)); } + + @Test public void asyncLogNonExistingContainer() throws Exception { @@ -135,4 +138,30 @@ public void asyncMultipleLogContainer() throws Exception { 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())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + int exitCode = dockerClient.waitContainerCmd(container.getId()).exec(); + + assertThat(exitCode, equalTo(0)); + + LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); + + int oneMinuteIntoFuture = (int)(System.currentTimeMillis()/1000) + 60; + dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().withSince(oneMinuteIntoFuture).exec(loggingCallback); + + loggingCallback.awaitCompletion(); + + assertFalse(loggingCallback.toString().contains(snippet)); + } + } From 1d38e935efe47c2b316b083358af78f141c68d27 Mon Sep 17 00:00:00 2001 From: Richard Lee Date: Tue, 15 Sep 2015 13:29:54 -0700 Subject: [PATCH 0075/1124] Add all missing fields to ResponseItem and related classes. Fix types to match Go code. --- .../api/model/BuildResponseItem.java | 7 --- .../api/model/PushResponseItem.java | 2 +- .../dockerjava/api/model/ResponseItem.java | 56 ++++++++++++++----- 3 files changed, 42 insertions(+), 23 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 37fae34e7..f2ede94cc 100644 --- a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -14,13 +14,6 @@ public class BuildResponseItem extends ResponseItem { private static final String BUILD_SUCCESS = "Successfully built"; - @JsonProperty("stream") - private String stream; - - public String getStream() { - return stream; - } - /** * Returns whether the stream field indicates a successful build operation */ 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..e45fac17c 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java @@ -18,7 +18,7 @@ public class PushResponseItem extends ResponseItem { */ @JsonIgnore public boolean isErrorIndicated() { - if (getError() == null) + if (getError() == null && getErrorDetail() == null) return false; return true; 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..c9e6c6bec 100644 --- a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java @@ -16,57 +16,83 @@ public class ResponseItem implements Serializable { private static final long serialVersionUID = -5187169652557467828L; + @JsonProperty("stream") + private String stream; + @JsonProperty("status") private String status; + @JsonProperty("progressDetail") + private ProgressDetail progressDetail; + @JsonProperty("progress") private String progress; - @JsonProperty("progressDetail") - private ProgressDetail progressDetail; + @JsonProperty("id") + private String id; - @JsonProperty("error") - private String error; + @JsonProperty("from") + private String from; + + @JsonProperty("time") + private long time; @JsonProperty("errorDetail") private ErrorDetail errorDetail; - @JsonProperty("id") - private String id; + @JsonProperty("error") + private String error; - public String getStatus() { - return status; + public String getStream() { + return stream; } - public String getProgress() { - return progress; + public String getStatus() { + return status; } public ProgressDetail getProgressDetail() { return progressDetail; } + @Deprecated + public String getProgress() { + return progress; + } + public String getId() { return id; } - public String getError() { - return error; + public String getFrom() { + return from; + } + + public long getTime() { + return time; } public ErrorDetail getErrorDetail() { return errorDetail; } + @Deprecated + public String getError() { + return error; + } + @JsonIgnoreProperties(ignoreUnknown = false) public static class ProgressDetail implements Serializable { private static final long serialVersionUID = -1954994695645715264L; @JsonProperty("current") - int current; + long current; @JsonProperty("total") - int total; + long total; + + @JsonProperty("start") + long start; @Override public String toString() { @@ -79,7 +105,7 @@ public static class ErrorDetail implements Serializable { private static final long serialVersionUID = -9136704865403084083L; @JsonProperty("code") - String code; + int code; @JsonProperty("message") String message; From 7ff167043548c98a26a507462c51f1529f0b8344 Mon Sep 17 00:00:00 2001 From: Richard Lee Date: Thu, 17 Sep 2015 08:44:44 -0700 Subject: [PATCH 0076/1124] Minor refactoring of error method --- .../dockerjava/api/model/BuildResponseItem.java | 6 ++++-- .../dockerjava/api/model/PullResponseItem.java | 3 ++- .../dockerjava/api/model/PushResponseItem.java | 12 ------------ .../github/dockerjava/api/model/ResponseItem.java | 14 ++++++++++++++ 4 files changed, 20 insertions(+), 15 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 f2ede94cc..348a4c8f5 100644 --- a/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -19,16 +19,18 @@ public class BuildResponseItem extends ResponseItem { */ @JsonIgnore public boolean isBuildSuccessIndicated() { - if (getStream() == null) + if (isErrorIndicated() || getStream() == null) { return false; + } return getStream().contains(BUILD_SUCCESS); } @JsonIgnore public String getImageId() { - if (!isBuildSuccessIndicated()) + if (!isBuildSuccessIndicated()) { return null; + } return getStream().replaceFirst(BUILD_SUCCESS, "").trim(); } 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..834060b99 100644 --- a/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -18,8 +18,9 @@ public class PullResponseItem extends ResponseItem { */ @JsonIgnore public boolean isPullSuccessIndicated() { - if (getStatus() == null) + if (isErrorIndicated() || getStatus() == null) { return false; + } return (getStatus().contains("Download complete") || getStatus().contains("Image is up to date") || getStatus() .contains("Downloaded newer image")); 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 e45fac17c..31a2329d8 100644 --- a/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/PushResponseItem.java @@ -11,16 +11,4 @@ public class PushResponseItem extends ResponseItem { private static final long serialVersionUID = 8256977108011295857L; - /** - * Returns whether the error field indicates an error - * - * @returns true: the error field indicates an error, false: the error field doesn't indicate an error - */ - @JsonIgnore - public boolean isErrorIndicated() { - if (getError() == null && getErrorDetail() == null) - return false; - - return true; - } } 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 c9e6c6bec..ea16c0801 100644 --- a/src/main/java/com/github/dockerjava/api/model/ResponseItem.java +++ b/src/main/java/com/github/dockerjava/api/model/ResponseItem.java @@ -2,6 +2,7 @@ import java.io.Serializable; +import com.fasterxml.jackson.annotation.JsonIgnore; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; @@ -25,6 +26,7 @@ public class ResponseItem implements Serializable { @JsonProperty("progressDetail") private ProgressDetail progressDetail; + @Deprecated @JsonProperty("progress") private String progress; @@ -40,6 +42,7 @@ public class ResponseItem implements Serializable { @JsonProperty("errorDetail") private ErrorDetail errorDetail; + @Deprecated @JsonProperty("error") private String error; @@ -81,6 +84,17 @@ public String getError() { return error; } + /** + * Returns whether the error field indicates an error + * + * @returns true: the error field indicates an error, false: the error field doesn't indicate an error + */ + @JsonIgnore + public boolean isErrorIndicated() { + // check both the deprecated and current error fields, just in case + return getError() != null || getErrorDetail() != null; + } + @JsonIgnoreProperties(ignoreUnknown = false) public static class ProgressDetail implements Serializable { private static final long serialVersionUID = -1954994695645715264L; From e12e3b6f32ba04c113dd0b74e1bf011871491e9f Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 17 Sep 2015 21:03:29 +0200 Subject: [PATCH 0077/1124] Fix test --- .../core/command/LogContainerCmdImplTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 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 16b0266ac..c3f6ab01c 100644 --- a/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/LogContainerCmdImplTest.java @@ -62,7 +62,7 @@ public void asyncLogContainer() throws Exception { LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); - //this essentially test the since=0 case + // this essentially test the since=0 case dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().exec(loggingCallback); loggingCallback.awaitCompletion(); @@ -70,8 +70,6 @@ public void asyncLogContainer() throws Exception { assertTrue(loggingCallback.toString().contains(snippet)); } - - @Test public void asyncLogNonExistingContainer() throws Exception { @@ -148,6 +146,8 @@ public void asyncLogContainerWithSince() throws Exception { 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(); @@ -156,8 +156,8 @@ public void asyncLogContainerWithSince() throws Exception { LogContainerTestCallback loggingCallback = new LogContainerTestCallback(); - int oneMinuteIntoFuture = (int)(System.currentTimeMillis()/1000) + 60; - dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().withSince(oneMinuteIntoFuture).exec(loggingCallback); + dockerClient.logContainerCmd(container.getId()).withStdErr().withStdOut().withSince(timestamp) + .exec(loggingCallback); loggingCallback.awaitCompletion(); From 3973912162054ac2e070088e6bcb2627a5c5bbe4 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 17 Sep 2015 21:03:42 +0200 Subject: [PATCH 0078/1124] Format sources --- .../github/dockerjava/api/command/LogContainerCmd.java | 3 ++- .../dockerjava/core/command/LogContainerCmdImpl.java | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) 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 b1c22283c..4c09d1f44 100644 --- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -19,7 +19,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 { 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 afc6a0754..d9b34e7fb 100644 --- a/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -19,7 +19,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 { @@ -67,7 +68,9 @@ public boolean hasStderrEnabled() { } @Override - public int getSince() {return since; } + public int getSince() { + return since; + } @Override public LogContainerCmd withContainerId(String containerId) { @@ -141,8 +144,7 @@ public LogContainerCmd withSince(int since) { @Override public String toString() { return new StringBuilder("logs ").append(followStream ? "--follow=true" : "") - .append(timestamps ? "--timestamps=true" : "") - .append(since > 0 ? "--since=" + since : "") + .append(timestamps ? "--timestamps=true" : "").append(since > 0 ? "--since=" + since : "") .append(containerId).toString(); } From 62306da1cb857654a4fea38fc15b906a580cbe8c Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 17 Sep 2015 21:06:00 +0200 Subject: [PATCH 0079/1124] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 149cad945..7f1e11bc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change Log === +Latest SNAPSHOT version +--- +* [#320] (https://github.com/docker-java/docker-java/pull/320) Support "since" field for logs command + v2.1.0 --- * [#306] (https://github.com/docker-java/docker-java/pull/306) fix(core): fix NPE if latestItem is null in result callback From 8893e8f346d9db72d02787e95e76be2ba2116d8e Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Thu, 17 Sep 2015 21:22:02 +0200 Subject: [PATCH 0080/1124] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f1e11bc4..1e9c77866 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Change Log Latest SNAPSHOT version --- +* [#326] (https://github.com/docker-java/docker-java/pull/326) Add all missing fields to ResponseItem and related classes * [#320] (https://github.com/docker-java/docker-java/pull/320) Support "since" field for logs command v2.1.0 From ae29bf7fe7db0907b95da7c7f9db7bead3b25836 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 18 Sep 2015 07:15:58 +0200 Subject: [PATCH 0081/1124] 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 537c26eeb3331ea84d6543bffa0b3885f5cdb5e1 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 18 Sep 2015 07:17:39 +0200 Subject: [PATCH 0082/1124] [maven-release-plugin] prepare release docker-java-2.1.1 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 75748be1a..1a18a7d86 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.1.1-SNAPSHOT + 2.1.1 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.1 From c11bf430f46dfaef7f414264c966268a6e229a5a Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Fri, 18 Sep 2015 07:17:43 +0200 Subject: [PATCH 0083/1124] [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 1a18a7d86..d30c04212 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.github.docker-java docker-java jar - 2.1.1 + 2.1.2-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.1 + HEAD From 1134e2d39fad4543e9c770718ff1812ae571986f Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 18 Sep 2015 07:20:35 +0200 Subject: [PATCH 0084/1124] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ecb84295e..fc86bd39c 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Run build without integration tests: com.github.docker-java docker-java - 2.1.0 + 2.1.1 ### 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.1-SNAPSHOT + 2.1.2-SNAPSHOT ## Documentation From a4670eefc93c76dbed3f6ecf962f4f9362f5e732 Mon Sep 17 00:00:00 2001 From: marcuslinke Date: Fri, 18 Sep 2015 07:21:22 +0200 Subject: [PATCH 0085/1124] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e9c77866..dd6e676c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Change Log === -Latest SNAPSHOT version +v2.1.1 --- * [#326] (https://github.com/docker-java/docker-java/pull/326) Add all missing fields to ResponseItem and related classes * [#320] (https://github.com/docker-java/docker-java/pull/320) Support "since" field for logs command From 561f9d06f1f840861857f735cb567da8aad29bd7 Mon Sep 17 00:00:00 2001 From: Marcus Linke Date: Thu, 24 Sep 2015 22:03:05 +0200 Subject: [PATCH 0086/1124] 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 0087/1124] 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 0088/1124] 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 db8cc70815331347dbac4dad06671dc4f43739fe Mon Sep 17 00:00:00 2001 From: Aleksandr Guljajev Date: Mon, 28 Sep 2015 17:04:40 +0200 Subject: [PATCH 0089/1124] Adding support for withPidMode #332 --- .../api/command/CreateContainerCmd.java | 3 + .../dockerjava/api/model/HostConfig.java | 10 +++- .../core/command/CreateContainerCmdImpl.java | 24 ++++++-- .../command/CreateContainerCmdImplTest.java | 55 ++++++++++--------- 4 files changed, 60 insertions(+), 32 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 638331240..0fd89a44e 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -134,6 +134,8 @@ public static interface Exec extends DockerCmdSyncExec Date: Mon, 28 Sep 2015 17:12:49 +0200 Subject: [PATCH 0090/1124] Style fixes --- .../java/com/github/dockerjava/api/model/HostConfig.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 d91118afe..0e3a835ee 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -84,7 +84,8 @@ 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, String pidMode) { + RestartPolicy restartPolicy, String networkMode, Device[] devices, String[] extraHosts, Ulimit[] ulimits, + String pidMode) { this.binds = new Binds(binds); this.links = new Links(links); this.lxcConf = lxcConf; @@ -198,7 +199,9 @@ public int getCpuShares() { return cpuShares; } - public String getPidMode() { return pidMode; } + public String getPidMode() { + return pidMode; + } @JsonIgnore public void setBinds(Bind... binds) { From 4b543c33db68959a43ce43b5d08039b8d324dfb9 Mon Sep 17 00:00:00 2001 From: Aleksandr Guljajev Date: Mon, 28 Sep 2015 17:25:21 +0200 Subject: [PATCH 0091/1124] Style fixes; * imports fixed --- .../api/command/CreateContainerCmd.java | 3 +++ .../dockerjava/api/model/HostConfig.java | 4 +++- .../dockerjava/jaxrs/EventsCmdExec.java | 4 ++-- .../command/CreateContainerCmdImplTest.java | 22 ++++++++++++++----- 4 files changed, 25 insertions(+), 8 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 0fd89a44e..ea7691446 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -18,6 +18,8 @@ import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.VolumesFrom; +import javax.annotation.CheckForNull; + public interface CreateContainerCmd extends SyncDockerCmd { public static interface Exec extends DockerCmdSyncExec { @@ -134,6 +136,7 @@ public static interface Exec extends DockerCmdSyncExec implements EventsCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class); 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 b290a618c..a939bcbd9 100644 --- a/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CreateContainerCmdImplTest.java @@ -4,10 +4,25 @@ 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.*; +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.*; +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; @@ -33,7 +48,6 @@ 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.*; @Test(groups = "integration") public class CreateContainerCmdImplTest extends AbstractDockerClientTest { @@ -546,6 +560,4 @@ public void createContainerWithLogConfig() throws DockerException { // null becomes empty string assertEquals(inspectContainerResponse.getHostConfig().getLogConfig().type, logConfig.type); } - - } From 6df5a7fa314396fa56ef2b112f6d663e6fcc0d52 Mon Sep 17 00:00:00 2001 From: Aleksandr Guljajev Date: Tue, 29 Sep 2015 09:51:31 +0200 Subject: [PATCH 0092/1124] Adding checkfornull annotation --- src/main/java/com/github/dockerjava/api/model/HostConfig.java | 3 +++ 1 file changed, 3 insertions(+) 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 4ab1cf76f..cbb6e84de 100644 --- a/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -6,6 +6,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import javax.annotation.CheckForNull; + @JsonIgnoreProperties(ignoreUnknown = true) public class HostConfig { @@ -199,6 +201,7 @@ public int getCpuShares() { return cpuShares; } + @CheckForNull public String getPidMode() { return pidMode; } From 4f094c1128a5c4b4974a51d7de446eb24f5350dc Mon Sep 17 00:00:00 2001 From: Aleksandr Guljajev Date: Tue, 29 Sep 2015 10:53:03 +0200 Subject: [PATCH 0093/1124] Renaming withPidMode to withPid (consistency) --- .../com/github/dockerjava/api/command/CreateContainerCmd.java | 2 +- .../github/dockerjava/core/command/CreateContainerCmdImpl.java | 2 +- .../dockerjava/core/command/CreateContainerCmdImplTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index ea7691446..46e099908 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -296,7 +296,7 @@ public static interface Exec extends DockerCmdSyncExec Date: Tue, 29 Sep 2015 21:21:54 +0200 Subject: [PATCH 0094/1124] Renamed method --- .../github/dockerjava/api/command/CreateContainerCmd.java | 7 ++++++- .../dockerjava/core/command/CreateContainerCmdImpl.java | 2 +- .../core/command/CreateContainerCmdImplTest.java | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index 46e099908..e3ffa4996 100644 --- a/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -296,7 +296,12 @@ public static interface Exec extends DockerCmdSyncExec Date: Tue, 29 Sep 2015 21:24:03 +0200 Subject: [PATCH 0095/1124] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd6e676c5..7738add8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ Change Log === +Latest SNAPSHOT version +--- +* [#333] (https://github.com/docker-java/docker-java/pull/333) Adding support for withPidMode v2.1.1 --- From 1e13c8985cd6c1fdaa25ee595b11048a53b3b79a Mon Sep 17 00:00:00 2001 From: Marcus Thiesen Date: Sun, 4 Oct 2015 21:06:34 +0200 Subject: [PATCH 0096/1124] 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 0097/1124] 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 0098/1124] 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 0099/1124] 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 0100/1124] 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 0101/1124] 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 0102/1124] =?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 0103/1124] 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 0104/1124] 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 0105/1124] 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 0106/1124] 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 0107/1124] 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 0108/1124] 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 0109/1124] 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 0110/1124] 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 0111/1124] 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 0112/1124] 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 0113/1124] 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 0114/1124] 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 0115/1124] 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 0116/1124] 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 0117/1124] 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 0118/1124] [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 0119/1124] [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 0120/1124] 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 0121/1124] 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 0122/1124] 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 0123/1124] 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 0124/1124] 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 0125/1124] 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 0126/1124] 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 0127/1124] 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 0128/1124] 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 0129/1124] 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 0130/1124] 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 0131/1124] 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 0132/1124] 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 0133/1124] 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 0134/1124] 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 0135/1124] 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 0136/1124] 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 0137/1124] 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 0138/1124] 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 0139/1124] 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 0140/1124] 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 0141/1124] 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 0142/1124] 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 0143/1124] 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 0144/1124] 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 0145/1124] 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 0146/1124] 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 0147/1124] 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 0148/1124] 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 0149/1124] 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 0150/1124] 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 0151/1124] 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 0152/1124] 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 0153/1124] 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 0154/1124] 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 0155/1124] 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 0156/1124] 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 0157/1124] 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 0158/1124] 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 0159/1124] 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 0160/1124] 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 0161/1124] 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 0162/1124] 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 0163/1124] 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 0164/1124] 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 0165/1124] 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 0166/1124] 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 0167/1124] 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 0168/1124] 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 0169/1124] 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 0170/1124] 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 0171/1124] 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 0172/1124] 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 0173/1124] 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 0174/1124] 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 0175/1124] 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 0176/1124] 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 0177/1124] 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 0178/1124] 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 0179/1124] 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 0180/1124] 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 0181/1124] 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 0182/1124] 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 0183/1124] [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 0184/1124] [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 0185/1124] 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 0186/1124] 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 0187/1124] 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 0188/1124] 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 0189/1124] 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 0190/1124] 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 0191/1124] 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 0192/1124] 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 0193/1124] 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 0194/1124] 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 0195/1124] 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 0196/1124] 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 0197/1124] 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 0198/1124] 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 0199/1124] 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 0200/1124] 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 0201/1124] 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 0202/1124] 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 0203/1124] 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 0204/1124] 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 0205/1124] 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 0206/1124] 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 0207/1124] 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 0208/1124] 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 0209/1124] 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 0210/1124] 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 0211/1124] 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 0212/1124] 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 0213/1124] 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 0214/1124] 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 0215/1124] 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 0216/1124] 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 0217/1124] 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 0218/1124] 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 0219/1124] 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 0220/1124] 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 0221/1124] 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 0222/1124] 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 0223/1124] 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 0224/1124] 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 0225/1124] 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 0226/1124] 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 0227/1124] 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 0228/1124] 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 0229/1124] 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 0230/1124] 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 0231/1124] 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 0232/1124] 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 0233/1124] 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 0234/1124] 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 0235/1124] 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 0236/1124] 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 0237/1124] 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 0238/1124] 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 0239/1124] 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 0240/1124] 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 0241/1124] 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 0242/1124] 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 0243/1124] 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 0244/1124] 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 0245/1124] 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 0246/1124] 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 0247/1124] 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 0248/1124] 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 0249/1124] 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 0250/1124] 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 0251/1124] 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 0252/1124] 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 0253/1124] 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=