diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..9a39f917
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,17 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Unix shell files use Unix line endings
+*.sh text eol=lf
+
+# Standard to msysgit
+*.doc diff=astextplain
+*.DOC diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot diff=astextplain
+*.DOT diff=astextplain
+*.pdf diff=astextplain
+*.PDF diff=astextplain
+*.rtf diff=astextplain
+*.RTF diff=astextplain
diff --git a/.gitignore b/.gitignore
index 8f1fdc77..8e77a15b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,5 +20,8 @@ target
# Ignore all log files
*.log
+# Ignore all dot files
+.*
+
#Ignore Test Output
-test-output
\ No newline at end of file
+test-output
diff --git a/LICENSE b/LICENSE
index d6456956..38275f2f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -187,7 +187,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright [yyyy] [name of copyright owner]
+ Copyright [2013] [docker-java@googlegroups.com]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/README.md b/README.md
index 24cfc9ad..8eff82a2 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,10 @@
-# docker-java
+# docker-java
Java API client for [Docker](http://docs.docker.io/ "Docker")
-Supports a subset of the Docker Client API v1.11, Docker Server version 0.11
+Supports a subset of the Docker Client API v1.15, Docker Server version 1.3.0
+
+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")
@@ -10,136 +12,118 @@ Developer forum for [docker-java](https://groups.google.com/forum/?hl=de#!forum/
###### Prerequisites:
-* Java 1.6+
+* Java 1.6
* Maven 3.0.5
* Docker daemon running
-Maven may run tests during build process but tests are disabled by default. The tests are using a localhost instance of Docker, make sure that you have Docker running for tests to work. To run the tests you have to provide your https://www.docker.io/account/login/ information:
+The Maven build includes integration tests which are using a localhost instance of Docker and require manual setup. Make sure you have a local Docker daemon running and then provide your https://registry.hub.docker.com/account/login/ information via system properties:
+
+ $ mvn clean install -Ddocker.io.username=... -Ddocker.io.password=... -Ddocker.io.email=...
+
+_If your Docker server is remote, add its URL like this: `-Ddocker.io.url=https://...:2376`._
- $ mvn clean install -DskipTests=false -Ddocker.io.username=... -Ddocker.io.password=... -Ddocker.io.email=...
+If you do not have access to a Docker server or just want to execute the build quickly, you can run the build without the integration tests:
+
+ $ mvn clean install -DskipITs
By default Docker server is using UNIX sockets for communication with the Docker client, however docker-java
client uses TCP/IP to connect to the Docker server, so you will need to make sure that your Docker server is
listening on TCP port. To allow Docker server to use TCP add the following line to /etc/default/docker
- DOCKER_OPTS="-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock"
+ DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"
-More details setting up docket server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/
+More details 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:
- $ docker -H tcp://127.0.0.1:4243 version
+ $ docker -H tcp://127.0.0.1:2375 version
+
+ Client version: 0.8.0
+ Go version (client): go1.2
+ Git commit (client): cc3a8c8
+ Server version: 1.2.0
+ Git commit (server): fa7b24f
+ Go version (server): go1.3.1
- Client version: 0.8.1
- Go version (client): go1.2
- Git commit (client): a1598d1
- Server version: 0.8.1
- Git commit (server): a1598d1
- Go version (server): go1.2
- Last stable version: 0.8.1
+Run build without integration tests:
-Run build with tests:
+ $ mvn clean install -DskipITs
- $ mvn clean install
+## Docker-Java maven dependencies
-## Docker-Java maven dependency:
+### Latest release version
- com.kpelykh
+ com.github.docker-javadocker-java
- 0.8.1
+ 0.10.2
+### Latest SNAPSHOT version
-## Example code snippets:
-
- DockerClient dockerClient = new DockerClient("http://localhost:4243");
-
-###### Get Docker info:
-
- Info info = dockerClient.info();
- System.out.print(info);
-
-###### Search Docker repository:
-
- List dockerSearch = dockerClient.search("busybox");
- System.out.println("Search returned" + dockerSearch.toString());
-
-###### Create new Docker container, wait for its start and stop it:
-
- ContainerConfig containerConfig = new ContainerConfig();
- containerConfig.setImage("busybox");
- containerConfig.setCmd(new String[] {"touch", "/test"});
- ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
-
- dockerClient.startContainer(container.id);
-
- dockerClient.waitContainer(container.id);
-
- dockerClient.stopContainer(container.id);
-
-
-##### Support for UNIX sockets:
-
- Support for UNIX socket should appear in docker-java pretty soon. I'm working on its integration.
-
-##### Docker Builder:
-
-To use Docker Builder, as described on page http://docs.docker.io/en/latest/use/builder/,
-user dockerClient.build(baseDir), where baseDir is a path to folder containing Dockerfile.
-
-
- File baseDir = new File("~/kpelykh/docker/netcat");
-
- ClientResponse response = dockerClient.build(baseDir);
-
- StringWriter logwriter = new StringWriter();
-
- try {
- LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8");
- while (itr.hasNext()) {
- String line = itr.next();
- logwriter.write(line);
- LOG.info(line);
- }
- } finally {
- IOUtils.closeQuietly(response.getEntityInputStream());
- }
+
+ com.github.docker-java
+ docker-java
+ 0.10.3-SNAPSHOT
+
+Latest SNAPSHOT is published to maven repo: https://oss.sonatype.org/content/groups/public via 
+## Documentation
-For additional examples, please look at [DockerClientTest.java](https://github.com/kpelykh/docker-java/blob/master/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java "DockerClientTest.java")
+For code examples, please look at the [Wiki](https://github.com/docker-java/docker-java/wiki) or [Test cases](https://github.com/docker-java/docker-java/tree/master/src/test/java/com/github/dockerjava/core/command "Test cases")
## Configuration
There are a couple of configuration items, all of which have sensible defaults:
-* `url` The Docker URL, e.g. `http://localhost:4243`.
-* `version` The API version, e.g. `1.11`.
+* `url` The Docker URL, e.g. `https://localhost:2376`.
+* `version` The API version, e.g. `1.15`.
* `username` Your repository username (required to push containers).
* `password` Your repository password.
* `email` Your repository email.
+* `dockerCertPath` Path to the docker certs.
There are three ways to configure, in descending order of precedence:
-##### Programatic:
+#### Programmatic:
In your application, e.g.
- DockerClient docker = new DockerClient("http://localhost:4243");
- docker.setCredentials("dockeruser", "ilovedocker", "dockeruser@github.com");`
+ DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder()
+ .withVersion("1.15")
+ .withUri("https://my-docker-host.tld:2376")
+ .withUsername("dockeruser")
+ .withPassword("ilovedocker")
+ .withEmail("dockeruser@github.com")
+ .withDockerCertPath("/home/user/.docker")
+ .build();
+ DockerClient docker = DockerClientBuilder.getInstance(config).build();
+
+#### Properties
+
+ docker.io.url=https://localhost:2376
+ docker.io.version=1.15
+ docker.io.username=dockeruser
+ docker.io.password=ilovedocker
+ docker.io.email=dockeruser@github.com
+ docker.io.dockerCertPath=/home/user/.docker
+
##### System Properties:
-E.g.
- java -Ddocker.io.username=kpelykh pkg.Main
+ java -Ddocker.io.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` is set, we switch to SSL.
##### File System
-In `$HOME/.docker.io.properties`, e.g.:
- docker.io.username=dockeruser
+In `$HOME/.docker.io.properties`
##### Class Path
-In the class path at `/docker.io.properties`, e.g.:
- docker.io.url=http://localhost:4243
- docker.io.version=1.11
+In the class path at `/docker.io.properties`
+
diff --git a/pom.xml b/pom.xml
index 3de239d1..9f4101bc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,305 +1,417 @@
-
- 4.0.0
-
-
- org.sonatype.oss
- oss-parent
- 7
-
-
- com.kpelykh
- docker-java
- jar
- 0.8.2-SNAPSHOT
-
- docker-java
- https://github.com/kpelykh/docker-java
- Java API Client for Docker
-
-
-
- The Apache Software License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
- repo
-
-
-
-
- scm:git:git@github.com:kpelykh/docker-java.git
- git@github.com:kpelykh/docker-java.git
- scm:git:git@github.com:kpelykh/docker-java.git
-
-
-
-
- kpelykh
- Konstantin Pelykh
- kpelykh@gmail.com
-
-
-
-
- true
-
- UTF-8
- true
- false
- 1.6
- 1.6
-
- 1.6.1
-
- 1.18
- 1.9
-
- 2.3.3
-
- 4.2.5
- 1.5
- 2.3
- 2.6
- 1.7.5
- 1.3.9
- 0.3
-
-
- 1.0.1
- 5.12.1
- 1.3
- 1.6
- 2.3.3
-
-
- 2.2
- 2.3.1
- 2.3.1
- 2.8.1
- 2.5.1
- 1.7
-
-
-
+
+ 4.0.0
+
+
+ org.sonatype.oss
+ oss-parent
+ 9
+
+
+ com.github.docker-java
+ docker-java
+ jar
+ 1.3
+
+ docker-java
+ https://github.com/docker-java/docker-java
+ Java API Client for Docker
+
+
+
+ The Apache Software License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+ 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
+
+
+
+
+ kpelykh
+ Konstantin Pelykh
+ kpelykh@gmail.com
+
+
+
+
+ UTF-8
+ UTF-8
+ true
+ false
+ 1.6
+ 1.6
+
+ 1.6.1
+
+ 2.6
+ 1.9
+
+ 2.3.3
+
+ 4.2.5
+ 1.5
+ 1.8
+ 2.3
+ 2.6
+ 1.7.5
+ 1.3.9
+ 0.3
+ 18.0
+ 1.51
+
+
+ 1.0.1
+ 5.12.1
+ 1.3
+ 1.6
+ 2.3.3
+
+
+ 2.2
+ 2.3.1
+ 2.3.1
+ 2.17
+ 2.17
+ 2.5.1
+ 1.7
+
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+ com.fasterxml.jackson.jaxrs
+ jackson-jaxrs-json-provider
+ ${jackson-jaxrs.version}
+
+
+
+
+
+
+
+ org.glassfish.jersey.core
+ jersey-client
+ ${jersey.version}
+
+
+
+ org.apache.commons
+ commons-compress
+ ${commons-compress.version}
+
- com.fasterxml.jackson.jaxrs
- jackson-jaxrs-json-provider
- ${jackson-jaxrs.version}
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
-
- com.sun.jersey
- jersey-core
- ${jersey.version}
-
-
- com.sun.jersey
- jersey-client
- ${jersey.version}
-
-
-
- com.sun.jersey.contribs
- jersey-multipart
- ${jersey.version}
-
-
- com.sun.jersey.contribs
- jersey-apache-client4
- ${jersey-apache-client4.version}
-
-
-
- org.apache.httpcomponents
- httpclient
- ${httpclient.version}
+
+ commons-lang
+ commons-lang
+ ${commons-lang.version}
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+ com.github.jnr
+ jnr-unixsocket
+ ${jnr.unixsocket.version}
+
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j-api.version}
+
+
+
+ org.slf4j
+ jul-to-slf4j
+ ${slf4j-api.version}
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
-
-
- org.apache.commons
- commons-compress
- ${commons-compress.version}
-
-
- commons-lang
- commons-lang
- ${commons-lang.version}
-
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
-
- com.github.jnr
- jnr-unixsocket
- ${jnr.unixsocket.version}
-
-
-
- org.slf4j
- slf4j-api
- ${slf4j-api.version}
-
-
-
- org.slf4j
- jul-to-slf4j
- ${slf4j-api.version}
-
-
-
-
- ch.qos.logback
- logback-core
- ${version.logback}
- test
-
-
-
- ch.qos.logback
- logback-classic
- ${version.logback}
- test
-
-
-
- org.testng
- testng
- ${version.testng}
- test
-
-
-
- org.hamcrest
- hamcrest-library
- ${hamcrest.library.version}
- test
-
-
-
- com.googlecode.lambdaj
- lambdaj
- ${lambdaj.version}
- test
-
-
- org.hamcrest
- hamcrest-all
-
-
-
-
+
- org.testinfected.hamcrest-matchers
- jpa-matchers
- ${hamcrest.jpa-matchers}
- test
+ org.bouncycastle
+ bcpkix-jdk15on
+ ${bouncycastle.version}
-
-
-
-
- com.github.jnr
- jffi
- 1.2.7
-
-
- com.github.jnr
- jffi
- native
- 1.2.7
-
-
-
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-release-plugin
- ${maven-release-plugin.version}
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${jdk.source}
- ${jdk.target}
- ISO-8859-1
- ${jdk.debug}
- ${jdk.optimize}
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- ${maven-jar-plugin.version}
-
-
-
- test-jar
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
- ${skipTests}
-
-
-
-
-
- org.codehaus.mojo
- cobertura-maven-plugin
- ${cobertura-maven-plugin.version}
-
-
-
- org.apache.maven.plugins
- maven-antrun-plugin
- ${maven-antrun-plugin.version}
-
-
- validate
-
- run
-
-
-
- *******************************************************************
- *******************************************************************
- [project.name] : ${project.name}
- [project.basedir] : ${project.basedir}
- [project.version] : ${project.version}
- [project.artifactId] ${project.artifactId}
- [project.build.directory] ${project.build.directory}
- [jdk.source] : ${jdk.source}
- [jdk.target] : ${jdk.target}
- [jdk.debug] : ${jdk.debug}
- [jdk.optimize] : ${jdk.optimize}
- [source encoding]: ${project.build.sourceEncoding}
- [LocalRepository] : ${settings.localRepository}
- *******************************************************************
- *******************************************************************
-
-
-
-
-
-
-
-
-
+
+
+ ch.qos.logback
+ logback-core
+ ${version.logback}
+ test
+
+
+
+ ch.qos.logback
+ logback-classic
+ ${version.logback}
+ test
+
+
+
+ org.testng
+ testng
+ ${version.testng}
+ test
+
+
+
+ org.hamcrest
+ hamcrest-library
+ ${hamcrest.library.version}
+ test
+
+
+
+ com.googlecode.lambdaj
+ lambdaj
+ ${lambdaj.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-all
+
+
+
+
+
+ org.testinfected.hamcrest-matchers
+ jpa-matchers
+ ${hamcrest.jpa-matchers}
+ test
+
+
+
+
+
+ com.github.jnr
+ jffi
+ 1.2.7
+
+
+ com.github.jnr
+ jffi
+ native
+ 1.2.7
+
+
+
+
+
+
+
+ ossrh
+ https://oss.sonatype.org/content/repositories/snapshots
+
+
+ ossrh
+ https://oss.sonatype.org/service/local/staging/deploy/maven2/
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ ${maven-release-plugin.version}
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${jdk.source}
+ ${jdk.target}
+ ${jdk.debug}
+ ${jdk.optimize}
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ test-jar
+
+
+
+
+
+
+ org.codehaus.mojo
+ cobertura-maven-plugin
+ ${cobertura-maven-plugin.version}
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ ${maven-antrun-plugin.version}
+
+
+ validate
+
+ run
+
+
+
+ *******************************************************************
+ *******************************************************************
+ [project.name] : ${project.name}
+ [project.basedir] : ${project.basedir}
+ [project.version] : ${project.version}
+ [project.artifactId] ${project.artifactId}
+ [project.build.directory] ${project.build.directory}
+ [jdk.source] : ${jdk.source}
+ [jdk.target] : ${jdk.target}
+ [jdk.debug] : ${jdk.debug}
+ [jdk.optimize] : ${jdk.optimize}
+ [source encoding]: ${project.build.sourceEncoding}
+ [LocalRepository] : ${settings.localRepository}
+ *******************************************************************
+ *******************************************************************
+
+
+
+
+
+
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ 1.6.2
+ true
+
+ ossrh
+ https://oss.sonatype.org/
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ 2.5
+
+ true
+ false
+ release
+ deploy nexus-staging:release
+
+
+
+
+
+
+
+
+ release
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 2.2.1
+
+
+ attach-sources
+
+ jar-no-fork
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 2.9.1
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/github/dockerjava/api/BadRequestException.java b/src/main/java/com/github/dockerjava/api/BadRequestException.java
new file mode 100644
index 00000000..1e04bcb3
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/BadRequestException.java
@@ -0,0 +1,23 @@
+package com.github.dockerjava.api;
+
+
+/**
+ *
+ */
+public class BadRequestException extends DockerException {
+
+ private static final long serialVersionUID = -2450396075981100160L;
+
+ public BadRequestException(String message, Throwable cause) {
+ super(message, 400, cause);
+ }
+
+ public BadRequestException(String message) {
+ this(message, null);
+ }
+
+ public BadRequestException(Throwable cause) {
+ this(cause.getMessage(), cause);
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/ConflictException.java b/src/main/java/com/github/dockerjava/api/ConflictException.java
new file mode 100644
index 00000000..bed2a375
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/ConflictException.java
@@ -0,0 +1,23 @@
+package com.github.dockerjava.api;
+
+
+/**
+ *
+ */
+public class ConflictException extends DockerException {
+
+ private static final long serialVersionUID = -290093024775500239L;
+
+ public ConflictException(String message, Throwable cause) {
+ super(message, 409, cause);
+ }
+
+ public ConflictException(String message) {
+ this(message, null);
+ }
+
+ public ConflictException(Throwable cause) {
+ this(cause.getMessage(), cause);
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/DeviceIsBusyException.java b/src/main/java/com/github/dockerjava/api/DeviceIsBusyException.java
new file mode 100644
index 00000000..38c2e2f6
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/DeviceIsBusyException.java
@@ -0,0 +1,21 @@
+package com.github.dockerjava.api;
+
+public class DeviceIsBusyException extends DockerException {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 8301793561056058849L;
+
+ public DeviceIsBusyException(String message, Throwable cause) {
+ super(message, 599, cause);
+ }
+
+ public DeviceIsBusyException(String message) {
+ this(message, null);
+ }
+
+ public DeviceIsBusyException(Throwable cause) {
+ this(cause.getMessage(), cause);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java
new file mode 100644
index 00000000..52323942
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -0,0 +1,123 @@
+package com.github.dockerjava.api;
+
+import java.io.*;
+
+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.EventCallback;
+import com.github.dockerjava.api.command.EventsCmd;
+import com.github.dockerjava.api.command.InfoCmd;
+import com.github.dockerjava.api.command.InspectContainerCmd;
+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.SearchImagesCmd;
+import com.github.dockerjava.api.command.StartContainerCmd;
+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.AuthConfig;
+
+// https://godoc.org/github.com/fsouza/go-dockerclient
+public interface DockerClient extends Closeable {
+
+ public AuthConfig authConfig() throws DockerException;
+
+ /**
+ * Authenticate with the server, useful for checking authentication.
+ */
+ public AuthCmd authCmd();
+
+ public InfoCmd infoCmd();
+
+ public PingCmd pingCmd();
+
+ public VersionCmd versionCmd();
+
+ /**
+ * * IMAGE API *
+ */
+
+ public PullImageCmd pullImageCmd(String repository);
+
+ public PushImageCmd pushImageCmd(String name);
+
+ public CreateImageCmd createImageCmd(String repository,
+ InputStream imageStream);
+
+ public SearchImagesCmd searchImagesCmd(String term);
+
+ public RemoveImageCmd removeImageCmd(String imageId);
+
+ public ListImagesCmd listImagesCmd();
+
+ public InspectImageCmd inspectImageCmd(String imageId);
+
+ /**
+ * * CONTAINER API *
+ */
+
+ public ListContainersCmd listContainersCmd();
+
+ public CreateContainerCmd createContainerCmd(String image);
+
+ public StartContainerCmd startContainerCmd(String containerId);
+
+ public InspectContainerCmd inspectContainerCmd(String containerId);
+
+ public RemoveContainerCmd removeContainerCmd(String containerId);
+
+ public WaitContainerCmd waitContainerCmd(String containerId);
+
+ public AttachContainerCmd attachContainerCmd(String containerId);
+
+ public LogContainerCmd logContainerCmd(String containerId);
+
+ public CopyFileFromContainerCmd copyFileFromContainerCmd(
+ String containerId, String resource);
+
+ public ContainerDiffCmd containerDiffCmd(String containerId);
+
+ public StopContainerCmd stopContainerCmd(String containerId);
+
+ public KillContainerCmd killContainerCmd(String containerId);
+
+ public RestartContainerCmd restartContainerCmd(String containerId);
+
+ public CommitCmd commitCmd(String containerId);
+
+ public BuildImageCmd buildImageCmd(File dockerFolder);
+
+ public BuildImageCmd buildImageCmd(InputStream tarInputStream);
+
+ public TopContainerCmd topContainerCmd(String containerId);
+
+ public TagImageCmd tagImageCmd(String imageId, String repository, String tag);
+
+ public PauseContainerCmd pauseContainerCmd(String containerId);
+
+ public UnpauseContainerCmd unpauseContainerCmd(String containerId);
+
+ public EventsCmd eventsCmd(EventCallback eventCallback);
+
+ public void close() throws IOException;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/DockerClientException.java b/src/main/java/com/github/dockerjava/api/DockerClientException.java
new file mode 100644
index 00000000..85efc349
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/DockerClientException.java
@@ -0,0 +1,18 @@
+package com.github.dockerjava.api;
+
+/**
+ *
+ *
+ */
+public class DockerClientException extends RuntimeException {
+
+private static final long serialVersionUID = 7667768099261650608L;
+
+ public DockerClientException(String message) {
+ super(message);
+ }
+
+ public DockerClientException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/DockerException.java b/src/main/java/com/github/dockerjava/api/DockerException.java
new file mode 100644
index 00000000..673bf2cc
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/DockerException.java
@@ -0,0 +1,30 @@
+package com.github.dockerjava.api;
+
+
+
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+
+public class DockerException extends RuntimeException {
+
+private static final long serialVersionUID = 7667768099261650608L;
+
+ private int httpStatus = 0;
+
+ public DockerException(String message, int httpStatus) {
+ super(message);
+ this.httpStatus = httpStatus;
+ }
+
+ public DockerException(String message, int httpStatus, Throwable cause) {
+ super(message, cause);
+ }
+
+ public int getHttpStatus() {
+ return httpStatus;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/EnhancedDockerClient.java b/src/main/java/com/github/dockerjava/api/EnhancedDockerClient.java
new file mode 100644
index 00000000..bcd19f26
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/EnhancedDockerClient.java
@@ -0,0 +1,36 @@
+package com.github.dockerjava.api;
+
+import com.github.dockerjava.api.command.CgroupContainerCmd;
+import com.github.dockerjava.api.command.CreateContainerCmd;
+import com.github.dockerjava.api.command.CreateExecCmd;
+import com.github.dockerjava.api.command.ExecContainerCmd;
+import com.github.dockerjava.api.command.LimitContainerCmd;
+import com.github.dockerjava.api.command.MetricContainerCmd;
+import com.github.dockerjava.api.command.StartContainerCmd;
+import com.github.dockerjava.api.command.StartExecCmd;
+import com.github.dockerjava.api.command.SweepContainerCmd;
+import com.github.dockerjava.api.model.CreateContainerConfig;
+import com.github.dockerjava.api.model.LimitationConfig;
+import com.github.dockerjava.api.model.StartContainerConfig;
+
+
+public interface EnhancedDockerClient extends DockerClient {
+
+ public CgroupContainerCmd cgroupContainerCmd(String containerId);
+
+ public SweepContainerCmd sweepContainerCmd(String containerId);
+
+ public MetricContainerCmd metricContainerCmd(String containerId);
+
+ public CreateExecCmd createExecCmd(String containerId);
+
+ public StartExecCmd startExecCmd(String execId);
+
+ public ExecContainerCmd execContainerCmd(String containerId);
+
+ public CreateContainerCmd createContainerCmd(CreateContainerConfig createContainerConfig);
+
+ public StartContainerCmd startContainerCmd(String containerId, StartContainerConfig startContainerConfig);
+
+ public LimitContainerCmd limitContainerCmd(LimitationConfig limitationConfig, String containerId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java b/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java
new file mode 100644
index 00000000..366484e5
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java
@@ -0,0 +1,22 @@
+package com.github.dockerjava.api;
+
+/**
+ *
+ */
+public class InternalServerErrorException extends DockerException {
+
+ private static final long serialVersionUID = -2450396075981100160L;
+
+ public InternalServerErrorException(String message, Throwable cause) {
+ super(message, 500, cause);
+ }
+
+ public InternalServerErrorException(String message) {
+ this(message, null);
+ }
+
+ public InternalServerErrorException(Throwable cause) {
+ this(cause.getMessage(), cause);
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java b/src/main/java/com/github/dockerjava/api/NotAcceptableException.java
new file mode 100644
index 00000000..affa4ce9
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/NotAcceptableException.java
@@ -0,0 +1,22 @@
+package com.github.dockerjava.api;
+
+/**
+ *
+ */
+public class NotAcceptableException extends DockerException {
+
+ private static final long serialVersionUID = -1771212181727204375L;
+
+ public NotAcceptableException(String message, Throwable cause) {
+ super(message, 406, cause);
+ }
+
+ public NotAcceptableException(String message) {
+ this(message, null);
+ }
+
+ public NotAcceptableException(Throwable cause) {
+ this(cause.getMessage(), cause);
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/NotFoundException.java b/src/main/java/com/github/dockerjava/api/NotFoundException.java
new file mode 100644
index 00000000..10f328cd
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/NotFoundException.java
@@ -0,0 +1,23 @@
+package com.github.dockerjava.api;
+
+/**
+ * Indicates that the given entity does not exist.
+ *
+ * @author Ryan Campbell ryan.campbell@gmail.com
+ */
+public class NotFoundException extends DockerException {
+
+ private static final long serialVersionUID = -2450396075981100160L;
+
+ public NotFoundException(String message, Throwable cause) {
+ super(message, 404, cause);
+ }
+
+ public NotFoundException(String message) {
+ this(message, null);
+ }
+
+ public NotFoundException(Throwable cause) {
+ this(cause.getMessage(), cause);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/NotModifiedException.java b/src/main/java/com/github/dockerjava/api/NotModifiedException.java
new file mode 100644
index 00000000..d521bae2
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/NotModifiedException.java
@@ -0,0 +1,22 @@
+package com.github.dockerjava.api;
+
+/**
+ *
+ */
+public class NotModifiedException extends DockerException {
+
+ private static final long serialVersionUID = -290093024775500239L;
+
+ public NotModifiedException(String message, Throwable cause) {
+ super(message, 304, cause);
+ }
+
+ public NotModifiedException(String message) {
+ this(message, null);
+ }
+
+ public NotModifiedException(Throwable cause) {
+ this(cause.getMessage(), cause);
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java b/src/main/java/com/github/dockerjava/api/UnauthorizedException.java
new file mode 100644
index 00000000..5d48d216
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/UnauthorizedException.java
@@ -0,0 +1,22 @@
+package com.github.dockerjava.api;
+
+/**
+ *
+ */
+public class UnauthorizedException extends DockerException {
+
+ private static final long serialVersionUID = 8257731964780578278L;
+
+ public UnauthorizedException(String message, Throwable cause) {
+ super(message, 401, cause);
+ }
+
+ public UnauthorizedException(String message) {
+ this(message, null);
+ }
+
+ public UnauthorizedException(Throwable cause) {
+ this(cause.getMessage(), cause);
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
new file mode 100644
index 00000000..8abbef72
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
@@ -0,0 +1,64 @@
+package com.github.dockerjava.api.command;
+
+import java.io.InputStream;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * Attach to container
+ *
+ * @param logs
+ * - true or false, includes logs. Defaults to false.
+ *
+ * @param followStream
+ * - true or false, return stream. Defaults to false.
+ * @param stdout
+ * - true or false, includes stdout log. Defaults to false.
+ * @param stderr
+ * - true or false, includes stderr log. Defaults to false.
+ * @param timestamps
+ * - true or false, if true, print timestamps for every log line.
+ * Defaults to false.
+ */
+public interface AttachContainerCmd extends DockerCmd{
+
+ public String getContainerId();
+
+ public boolean hasLogsEnabled();
+
+ public boolean hasFollowStreamEnabled();
+
+ public boolean hasTimestampsEnabled();
+
+ public boolean hasStdoutEnabled();
+
+ public boolean hasStderrEnabled();
+
+ public AttachContainerCmd withContainerId(String containerId);
+
+ public AttachContainerCmd withFollowStream();
+
+ public AttachContainerCmd withFollowStream(boolean followStream);
+
+ public AttachContainerCmd withTimestamps(boolean timestamps);
+
+ public AttachContainerCmd withStdOut();
+
+ public AttachContainerCmd withStdOut(boolean stdout);
+
+ public AttachContainerCmd withStdErr();
+
+ public AttachContainerCmd withStdErr(boolean stderr);
+
+ public AttachContainerCmd withLogs(boolean logs);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ @Override
+ public InputStream exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java
new file mode 100644
index 00000000..f71a132b
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/AuthCmd.java
@@ -0,0 +1,23 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.UnauthorizedException;
+import com.github.dockerjava.api.model.AuthConfig;
+
+/**
+ *
+ * Authenticate with the server, useful for checking authentication.
+ *
+ */
+public interface AuthCmd extends DockerCmd {
+
+ public AuthConfig getAuthConfig();
+
+ public AuthCmd withAuthConfig(AuthConfig authConfig);
+
+ @Override
+ public Void exec() throws UnauthorizedException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/BaseExecCmd.java b/src/main/java/com/github/dockerjava/api/command/BaseExecCmd.java
new file mode 100644
index 00000000..d57011eb
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/BaseExecCmd.java
@@ -0,0 +1,38 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.ExecConfig;
+
+public interface BaseExecCmd, RES_T> extends DockerCmd {
+
+ public String getContainerId();
+
+ public boolean isTty();
+
+ public boolean isAttachStdin();
+
+ public boolean isAttachStdout();
+
+ public boolean isAttachStderr();
+
+ public boolean isDetach();
+
+ public boolean isPrivileged();
+
+ public String[] getCmd();
+
+ public ExecConfig getExecConfig();
+
+ public CMD_T withContainerId(String containerId);
+
+ public CMD_T withTty(boolean tty);
+
+ public CMD_T withAttachStdin(boolean attachStdin);
+
+ public CMD_T withDetach(boolean detach);
+
+ public CMD_T withCmd(String... cmd);
+
+ public CMD_T withExecConfig(ExecConfig execConfig);
+
+ public CMD_T withPrivileged(boolean privileged);
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
new file mode 100644
index 00000000..7c2deb63
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
@@ -0,0 +1,43 @@
+package com.github.dockerjava.api.command;
+
+import java.io.InputStream;
+
+/**
+ *
+ * Build an image from Dockerfile.
+ *
+ * TODO: http://docs.docker.com/reference/builder/#dockerignore
+ *
+ */
+public interface BuildImageCmd extends DockerCmd{
+
+ public BuildImageCmd withTag(String tag);
+
+ public InputStream getTarInputStream();
+
+ public String getTag();
+
+ public boolean hasNoCacheEnabled();
+
+ public boolean hasRemoveEnabled();
+
+ public boolean isQuiet();
+
+ public BuildImageCmd withTarInputStream(InputStream tarInputStream);
+
+ public BuildImageCmd withNoCache();
+
+ public BuildImageCmd withNoCache(boolean noCache);
+
+ public BuildImageCmd withRemove();
+
+ public BuildImageCmd withRemove(boolean rm);
+
+ public BuildImageCmd withQuiet();
+
+ public BuildImageCmd withQuiet(boolean quiet);
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/CgroupContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/CgroupContainerCmd.java
new file mode 100644
index 00000000..cd022003
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/CgroupContainerCmd.java
@@ -0,0 +1,25 @@
+package com.github.dockerjava.api.command;
+
+import java.util.List;
+
+import com.github.dockerjava.api.model.Subsystem;
+import com.github.dockerjava.api.model.WriteSubsystem;
+
+public interface CgroupContainerCmd extends DockerCmd>{
+
+ public String getContainerId();
+
+ public List getReadSubsystem();
+
+ public List getWriteSubsystem();
+
+ public CgroupContainerCmd withContainerId(String containerId);
+
+ public CgroupContainerCmd withReadSubsystem(List toRead);
+
+ public CgroupContainerCmd withWriteSubsystem(List toWrite);
+
+ public static interface Exec extends DockerCmdExec> {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java
new file mode 100644
index 00000000..5eb5a3e8
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/CommitCmd.java
@@ -0,0 +1,114 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.model.ExposedPorts;
+import com.github.dockerjava.api.model.Volumes;
+
+/**
+*
+* Create a new image from a container's changes. Returns the new image ID.
+*
+*/
+public interface CommitCmd extends DockerCmd{
+
+ public String getContainerId();
+
+ public CommitCmd withContainerId(String containerId);
+
+ public String getRepository();
+
+ public String getTag();
+
+ public String getMessage();
+
+ public String getAuthor();
+
+ public boolean hasPauseEnabled();
+
+ public CommitCmd withAttachStderr(boolean attachStderr);
+
+ public CommitCmd withAttachStderr();
+
+ public CommitCmd withAttachStdin(boolean attachStdin);
+
+ public CommitCmd withAttachStdin();
+
+ public CommitCmd withAttachStdout(boolean attachStdout);
+
+ public CommitCmd withAttachStdout();
+
+ public CommitCmd withCmd(String... cmd);
+
+ public CommitCmd withDisableNetwork(boolean disableNetwork);
+
+ public CommitCmd withAuthor(String author);
+
+ public CommitCmd withMessage(String message);
+
+ public CommitCmd withTag(String tag);
+
+ public CommitCmd withRepository(String repository);
+
+ public CommitCmd withPause(boolean pause);
+
+ public String[] getEnv();
+
+ public CommitCmd withEnv(String... env);
+
+ public ExposedPorts getExposedPorts();
+
+ 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 withOpenStdin(boolean openStdin);
+
+ public String[] getPortSpecs();
+
+ public CommitCmd withPortSpecs(String... portSpecs);
+
+ public boolean isStdinOnce();
+
+ public CommitCmd withStdinOnce(boolean stdinOnce);
+
+ public CommitCmd withStdinOnce();
+
+ public boolean isTty();
+
+ 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);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public String exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..516ea365
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java
@@ -0,0 +1,28 @@
+package com.github.dockerjava.api.command;
+
+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.model.ChangeLog;
+
+public interface ContainerDiffCmd extends DockerCmd> {
+
+ public String getContainerId();
+
+ public ContainerDiffCmd withContainerId(String containerId);
+
+ public String toString();
+
+ /**
+ * @throws NotFoundException No such container
+ * @throws InternalServerErrorException server error
+ * @throws DockerException unexpected http status code
+ */
+ public List exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec> {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..0ebd3cc1
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java
@@ -0,0 +1,29 @@
+package com.github.dockerjava.api.command;
+
+import java.io.InputStream;
+
+import com.github.dockerjava.api.NotFoundException;
+
+public interface CopyFileFromContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public String getResource();
+
+ public CopyFileFromContainerCmd withContainerId(String containerId);
+
+ public CopyFileFromContainerCmd withResource(String resource);
+
+ public String getHostPath();
+
+ public CopyFileFromContainerCmd withHostPath(String hostPath);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public InputStream exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..ef4ad306
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -0,0 +1,118 @@
+ package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.ConflictException;
+import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.model.ExposedPort;
+import com.github.dockerjava.api.model.Volume;
+
+public interface CreateContainerCmd extends DockerCmd{
+
+ public CreateContainerCmd withName(String name);
+
+ public String getName();
+
+ public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts);
+
+ public ExposedPort[] getExposedPorts();
+
+ public boolean isDisableNetwork();
+
+ public String getWorkingDir();
+
+ public CreateContainerCmd withWorkingDir(String workingDir);
+
+ public String getHostName();
+
+ public CreateContainerCmd withDisableNetwork(boolean disableNetwork);
+
+ public CreateContainerCmd withHostName(String hostName);
+
+ public String[] getPortSpecs();
+
+ public CreateContainerCmd withPortSpecs(String... portSpecs);
+
+ public String getUser();
+
+ public CreateContainerCmd withUser(String user);
+
+ public boolean isTty();
+
+ public CreateContainerCmd withTty(boolean tty);
+
+ public boolean isStdinOpen();
+
+ public CreateContainerCmd withStdinOpen(boolean stdinOpen);
+
+ public boolean isStdInOnce();
+
+ public CreateContainerCmd withStdInOnce(boolean stdInOnce);
+
+ public long getMemoryLimit();
+
+ public CreateContainerCmd withMemoryLimit(long memoryLimit);
+
+ public long getMemorySwap();
+
+ public CreateContainerCmd withMemorySwap(long memorySwap);
+
+ public int getCpuShares();
+
+ public CreateContainerCmd withCpuShares(int cpuShares);
+
+ public String getCpuset();
+
+ public CreateContainerCmd withCpuset(String cpuset);
+
+ public boolean isAttachStdin();
+
+ public CreateContainerCmd withAttachStdin(boolean attachStdin);
+
+ public boolean isAttachStdout();
+
+ public CreateContainerCmd withAttachStdout(boolean attachStdout);
+
+ public boolean isAttachStderr();
+
+ public CreateContainerCmd withAttachStderr(boolean attachStderr);
+
+ public String[] getEnv();
+
+ public CreateContainerCmd withEnv(String... env);
+
+ public String[] getCmd();
+
+ public CreateContainerCmd withCmd(String... cmd);
+
+ public String[] getDns();
+
+ public CreateContainerCmd withDns(String... dns);
+
+ public String getImage();
+
+ public CreateContainerCmd withImage(String image);
+
+ public Volume[] getVolumes();
+
+ public CreateContainerCmd withVolumes(Volume... volumes);
+
+ public String[] getVolumesFrom();
+
+ public CreateContainerCmd withVolumesFrom(String... volumesFrom);
+
+ public String getIp();
+
+ public CreateContainerCmd withIp(String ip);
+
+
+ /**
+ * @throws NotFoundException No such container
+ * @throws ConflictException Named container already exists
+ */
+ @Override
+ public CreateContainerResponse exec() throws NotFoundException,
+ ConflictException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
diff --git a/src/main/java/com/kpelykh/docker/client/model/ContainerCreateResponse.java b/src/main/java/com/github/dockerjava/api/command/CreateContainerResponse.java
similarity index 67%
rename from src/main/java/com/kpelykh/docker/client/model/ContainerCreateResponse.java
rename to src/main/java/com/github/dockerjava/api/command/CreateContainerResponse.java
index 8f60ce15..5b0b5a53 100644
--- a/src/main/java/com/kpelykh/docker/client/model/ContainerCreateResponse.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateContainerResponse.java
@@ -1,45 +1,41 @@
-package com.kpelykh.docker.client.model;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import java.util.Arrays;
-
-/**
- *
- * @author Konstantin Pelykh (kpelykh@gmail.com)
- *
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ContainerCreateResponse {
-
- @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 "ContainerCreateResponse{" +
- "id='" + id + '\'' +
- ", warnings=" + Arrays.toString(warnings) +
- '}';
- }
-}
+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;
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class CreateContainerResponse {
+
+ @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/CreateExecCmd.java b/src/main/java/com/github/dockerjava/api/command/CreateExecCmd.java
new file mode 100644
index 00000000..c576e1f0
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/CreateExecCmd.java
@@ -0,0 +1,12 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+public interface CreateExecCmd extends BaseExecCmd {
+
+ @Override
+ public CreateExecResponse exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateExecResponse.java b/src/main/java/com/github/dockerjava/api/command/CreateExecResponse.java
new file mode 100644
index 00000000..73fad01c
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/CreateExecResponse.java
@@ -0,0 +1,26 @@
+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;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class CreateExecResponse {
+
+ @JsonProperty("Id")
+ private String id;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
\ 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
new file mode 100644
index 00000000..d2682471
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java
@@ -0,0 +1,34 @@
+package com.github.dockerjava.api.command;
+
+import java.io.InputStream;
+
+public interface CreateImageCmd extends DockerCmd {
+
+ public String getRepository();
+
+ // TODO remove method
+ public String getTag();
+
+ public InputStream getImageStream();
+
+ /**
+ * @param repository the repository to import to
+ */
+ public CreateImageCmd withRepository(String repository);
+
+ /**
+ * @param imageStream the InputStream of the tar file
+ */
+ public CreateImageCmd withImageStream(InputStream imageStream);
+
+ /**
+ * @param tag any tag for this image
+ * @deprecated use repo:tag format for repository
+ */
+ public CreateImageCmd withTag(String tag);
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/kpelykh/docker/client/model/ImageCreateResponse.java b/src/main/java/com/github/dockerjava/api/command/CreateImageResponse.java
similarity index 66%
rename from src/main/java/com/kpelykh/docker/client/model/ImageCreateResponse.java
rename to src/main/java/com/github/dockerjava/api/command/CreateImageResponse.java
index 21545a2d..43731703 100644
--- a/src/main/java/com/kpelykh/docker/client/model/ImageCreateResponse.java
+++ b/src/main/java/com/github/dockerjava/api/command/CreateImageResponse.java
@@ -1,30 +1,27 @@
-package com.kpelykh.docker.client.model;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * Parse reponses from /images/create
- *
- * @author Ryan Campbell (ryan.campbell@gmail.com)
- *
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ImageCreateResponse {
-
- @JsonProperty("status")
- private String id;
-
-
- public String getId() {
- return id;
- }
-
-
- @Override
- public String toString() {
- return "ContainerCreateResponse{" +
- "id='" + id + '\'' +
- '}';
- }
-}
+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;
+
+/**
+ * Parse reponses from /images/create
+ *
+ * @author Ryan Campbell (ryan.campbell@gmail.com)
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class CreateImageResponse {
+
+ @JsonProperty("status")
+ private String id;
+
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java
new file mode 100644
index 00000000..4c30382b
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/DockerCmd.java
@@ -0,0 +1,7 @@
+package com.github.dockerjava.api.command;
+
+public interface DockerCmd {
+
+ public RES_T exec();
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java
new file mode 100644
index 00000000..8cf13e7b
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExec.java
@@ -0,0 +1,7 @@
+package com.github.dockerjava.api.command;
+
+public interface DockerCmdExec, RES_T> {
+
+ public RES_T exec(CMD_T command);
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
new file mode 100644
index 00000000..f4866643
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
@@ -0,0 +1,90 @@
+package com.github.dockerjava.api.command;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+import com.github.dockerjava.core.DockerClientConfig;
+
+public interface DockerCmdExecFactory extends Closeable {
+
+ public void init(DockerClientConfig dockerClientConfig);
+
+ public AuthCmd.Exec createAuthCmdExec();
+
+ public InfoCmd.Exec createInfoCmdExec();
+
+ public PingCmd.Exec createPingCmdExec();
+
+ public VersionCmd.Exec createVersionCmdExec();
+
+ public PullImageCmd.Exec createPullImageCmdExec();
+
+ public PushImageCmd.Exec createPushImageCmdExec();
+
+ public CreateImageCmd.Exec createCreateImageCmdExec();
+
+ public SearchImagesCmd.Exec createSearchImagesCmdExec();
+
+ public RemoveImageCmd.Exec createRemoveImageCmdExec();
+
+ public ListImagesCmd.Exec createListImagesCmdExec();
+
+ public InspectImageCmd.Exec createInspectImageCmdExec();
+
+ public ListContainersCmd.Exec createListContainersCmdExec();
+
+ public CreateContainerCmd.Exec createCreateContainerCmdExec();
+
+ public StartContainerCmd.Exec createStartContainerCmdExec();
+
+ public InspectContainerCmd.Exec createInspectContainerCmdExec();
+
+ public RemoveContainerCmd.Exec createRemoveContainerCmdExec();
+
+ public WaitContainerCmd.Exec createWaitContainerCmdExec();
+
+ public AttachContainerCmd.Exec createAttachContainerCmdExec();
+
+ public LogContainerCmd.Exec createLogContainerCmdExec();
+
+ public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec();
+
+ public StopContainerCmd.Exec createStopContainerCmdExec();
+
+ public ContainerDiffCmd.Exec createContainerDiffCmdExec();
+
+ public KillContainerCmd.Exec createKillContainerCmdExec();
+
+ public RestartContainerCmd.Exec createRestartContainerCmdExec();
+
+ public CommitCmd.Exec createCommitCmdExec();
+
+ public BuildImageCmd.Exec createBuildImageCmdExec();
+
+ public TopContainerCmd.Exec createTopContainerCmdExec();
+
+ public TagImageCmd.Exec createTagImageCmdExec();
+
+ public PauseContainerCmd.Exec createPauseContainerCmdExec();
+
+ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec();
+
+ public EventsCmd.Exec createEventsCmdExec();
+
+ public CgroupContainerCmd.Exec createCgroupContainerCmdExec();
+
+ public SweepContainerCmd.Exec createSweepContainerCmdExec();
+
+ public MetricContainerCmd.Exec createMetricContainerCmdExec();
+
+ public CreateExecCmd.Exec createCreateExecCmdExec();
+
+ public StartExecCmd.Exec createStartExecCmdExec();
+
+ public ExecContainerCmd.Exec createExecContainerCmdExec(CreateExecCmd createExecCmd, StartExecCmd startExecCmd);
+
+ public LimitContainerCmd.Exec createLimitContainerCmdExec();
+
+ public void close() throws IOException;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/EventCallback.java b/src/main/java/com/github/dockerjava/api/command/EventCallback.java
new file mode 100644
index 00000000..45ac34dc
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/EventCallback.java
@@ -0,0 +1,12 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.Event;
+
+/**
+ * Event callback
+ */
+public interface EventCallback {
+ public void onEvent(Event event);
+ public void onException(Throwable throwable);
+ public void onCompletion(int numEvents);
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java
new file mode 100644
index 00000000..cfdb23a6
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/EventsCmd.java
@@ -0,0 +1,27 @@
+package com.github.dockerjava.api.command;
+
+import java.util.concurrent.ExecutorService;
+
+
+/**
+ * Get events
+ *
+ * @param since - Show all events created since timestamp
+ * @param until - Stream events until this timestamp
+ */
+public interface EventsCmd extends DockerCmd {
+ public EventsCmd withSince(String since);
+
+ public EventsCmd withUntil(String until);
+
+ public String getSince();
+
+ public String getUntil();
+
+ public EventCallback getEventCallback();
+
+ public EventsCmd withEventCallback(EventCallback eventCallback);
+
+ public static interface Exec extends DockerCmdExec {
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/ExecContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecContainerCmd.java
new file mode 100644
index 00000000..eb63faa7
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/ExecContainerCmd.java
@@ -0,0 +1,13 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+public interface ExecContainerCmd extends BaseExecCmd {
+
+ @Override
+ public String exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java
new file mode 100644
index 00000000..d340fe26
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/InfoCmd.java
@@ -0,0 +1,10 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.Info;
+
+public interface InfoCmd extends DockerCmd {
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..ca6a9a69
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java
@@ -0,0 +1,19 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+public interface InspectContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public InspectContainerCmd withContainerId(String containerId);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public InspectContainerResponse exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
new file mode 100644
index 00000000..32156745
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
@@ -0,0 +1,354 @@
+package com.github.dockerjava.api.command;
+
+
+import java.util.Map;
+
+import com.github.dockerjava.api.model.*;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class InspectContainerResponse {
+
+ @JsonProperty("Args")
+ private String[] args;
+
+ @JsonProperty("Config")
+ private ContainerConfig config;
+
+ @JsonProperty("Created")
+ private String created;
+
+ @JsonProperty("Driver")
+ private String driver;
+
+ @JsonProperty("ExecDriver")
+ private String execDriver;
+
+ @JsonProperty("HostConfig")
+ private HostConfig hostConfig;
+
+ @JsonProperty("HostnamePath")
+ private String hostnamePath;
+
+ @JsonProperty("HostsPath")
+ private String hostsPath;
+
+ @JsonProperty("Id")
+ private String id;
+
+ @JsonProperty("Image")
+ private String imageId;
+
+ @JsonProperty("MountLabel")
+ private String mountLabel;
+
+ @JsonProperty("Name")
+ private String name;
+
+ @JsonProperty("NetworkSettings")
+ private NetworkSettings networkSettings;
+
+ @JsonProperty("Path")
+ private String path;
+
+ @JsonProperty("ProcessLabel")
+ private String processLabel;
+
+ @JsonProperty("ResolvConfPath")
+ private String resolvConfPath;
+
+ @JsonProperty("State")
+ private ContainerState state;
+
+ @JsonProperty("Volumes")
+ private VolumeBinds volumes;
+
+ @JsonProperty("VolumesRW")
+ private Volumes volumesRW;
+
+ public String getId() {
+ return id;
+ }
+
+ public String getCreated() {
+ return created;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public String getProcessLabel() {
+ return processLabel;
+ }
+
+ public String[] getArgs() {
+ return args;
+ }
+
+ public ContainerConfig getConfig() {
+ return config;
+ }
+
+ public ContainerState getState() {
+ return state;
+ }
+
+ public String getImageId() {
+ return imageId;
+ }
+
+ public NetworkSettings getNetworkSettings() {
+ return networkSettings;
+ }
+
+ public String getResolvConfPath() {
+ return resolvConfPath;
+ }
+
+ @JsonIgnore
+ public VolumeBind[] getVolumes() {
+ return volumes.getBinds();
+ }
+
+ @JsonIgnore
+ public Volume[] getVolumesRW() {
+ return volumesRW.getVolumes();
+ }
+
+ public String getHostnamePath() {
+ return hostnamePath;
+ }
+
+ public String getHostsPath() {
+ return hostsPath;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+ public HostConfig getHostConfig() {
+ return hostConfig;
+ }
+
+ public String getExecDriver() {
+ return execDriver;
+ }
+
+ public String getMountLabel() {
+ return mountLabel;
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public class NetworkSettings {
+
+ @JsonProperty("IPAddress") private String ipAddress;
+ @JsonProperty("IPPrefixLen") private int 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 int 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 {
+
+ @JsonProperty("Running") private boolean running;
+ @JsonProperty("Paused") private boolean paused;
+ @JsonProperty("Pid") private int pid;
+ @JsonProperty("ExitCode") private int exitCode;
+ @JsonProperty("StartedAt") private String startedAt;
+ @JsonProperty("FinishedAt") private String finishedAt;
+
+ public boolean isRunning() {
+ return running;
+ }
+
+ public boolean isPaused() {
+ return paused;
+ }
+
+ public int getPid() {
+ return pid;
+ }
+
+ public int getExitCode() {
+ return exitCode;
+ }
+
+ public String getStartedAt() {
+ return startedAt;
+ }
+
+ public String getFinishedAt() {
+ return finishedAt;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public class HostConfig {
+
+ @JsonProperty("Binds")
+ private String[] binds;
+
+ @JsonProperty("LxcConf")
+ private LxcConf[] lxcConf;
+
+ @JsonProperty("PortBindings")
+ private Ports portBindings;
+
+ @JsonProperty("PublishAllPorts")
+ private boolean publishAllPorts;
+
+ @JsonProperty("Privileged")
+ private boolean privileged;
+
+ @JsonProperty("Dns")
+ private String[] dns;
+
+ @JsonProperty("DnsSearch")
+ private String[] dnsSearch;
+
+ @JsonProperty("VolumesFrom")
+ private String[] volumesFrom;
+
+ @JsonProperty("ContainerIDFile")
+ private String containerIDFile;
+
+ // TODO: use Links class here?
+ @JsonProperty("Links")
+ private String[] links;
+
+ @JsonProperty("NetworkMode")
+ private String networkMode;
+
+ @JsonProperty("Devices")
+ private Device[] devices;
+
+ @JsonProperty("RestartPolicy")
+ private RestartPolicy restartPolicy;
+
+ @JsonProperty("CapAdd")
+ private String[] capAdd;
+
+ @JsonProperty("CapDrop")
+ private String[] capDrop;
+
+ public String[] getBinds() {
+ return binds;
+ }
+
+ public LxcConf[] getLxcConf() {
+ return lxcConf;
+ }
+
+ public Ports getPortBindings() {
+ return portBindings;
+ }
+
+ public boolean isPublishAllPorts() {
+ return publishAllPorts;
+ }
+
+ public boolean isPrivileged() {
+ return privileged;
+ }
+
+ public String[] getDns() {
+ return dns;
+ }
+
+ public String[] getVolumesFrom() {
+ return volumesFrom;
+ }
+
+ public String getContainerIDFile() {
+ return containerIDFile;
+ }
+
+ public String[] getDnsSearch() {
+ return dnsSearch;
+ }
+
+ public String[] getLinks() {
+ return links;
+ }
+
+ public String getNetworkMode() {
+ return networkMode;
+ }
+
+ public Device[] getDevices() {
+ return devices;
+ }
+
+ public RestartPolicy getRestartPolicy() {
+ return restartPolicy;
+ }
+
+ public String[] getCapAdd() {
+ return capAdd;
+ }
+
+ public String[] getCapDrop() {
+ return capDrop;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+
+ }
+
+}
+
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java
new file mode 100644
index 00000000..f2523487
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java
@@ -0,0 +1,22 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * Inspect the details of an image.
+ */
+public interface InspectImageCmd extends DockerCmd{
+
+ public String getImageId();
+
+ public InspectImageCmd withImageId(String imageId);
+
+ /**
+ * @throws NotFoundException No such image
+ */
+ public InspectImageResponse exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java b/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java
new file mode 100644
index 00000000..b5b6432d
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java
@@ -0,0 +1,105 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.ContainerConfig;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class InspectImageResponse {
+
+ @JsonProperty("Architecture")
+ private String arch;
+
+ @JsonProperty("Author")
+ private String author;
+
+ @JsonProperty("Comment")
+ private String comment;
+
+ @JsonProperty("Config")
+ private ContainerConfig config;
+
+ @JsonProperty("Container")
+ private String container;
+
+ @JsonProperty("ContainerConfig")
+ private ContainerConfig containerConfig;
+
+ @JsonProperty("Created")
+ private String created;
+
+ @JsonProperty("DockerVersion")
+ private String dockerVersion;
+
+ @JsonProperty("Id")
+ private String id;
+
+ @JsonProperty("Os")
+ private String os;
+
+ @JsonProperty("Parent")
+ private String parent;
+
+ @JsonProperty("Size")
+ private long size;
+
+ public String getId() {
+ return id;
+ }
+
+ public String getParent() {
+ return parent;
+ }
+
+ public String getCreated() {
+ return created;
+ }
+
+ public String getContainer() {
+ return container;
+ }
+
+ public ContainerConfig getContainerConfig() {
+ return containerConfig;
+ }
+
+ public long getSize() {
+ return size;
+ }
+
+ public String getDockerVersion() {
+ return dockerVersion;
+ }
+
+ public ContainerConfig getConfig() {
+ return config;
+ }
+
+ public String getArch() {
+ return arch;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public String getOs() {
+ return os;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java
new file mode 100644
index 00000000..aff39f9e
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java
@@ -0,0 +1,26 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * Kill a running container.
+ */
+public interface KillContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public String getSignal();
+
+ public KillContainerCmd withContainerId(String containerId);
+
+ public KillContainerCmd withSignal(String signal);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public Void exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/LimitContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LimitContainerCmd.java
new file mode 100644
index 00000000..bd6e5e2c
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/LimitContainerCmd.java
@@ -0,0 +1,36 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.model.LimitationConfig;
+
+public interface LimitContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public long getMemoryLimit();
+
+ public int getCpuShares();
+
+ public String getCpuset();
+
+ public boolean isSaveChanges();
+
+ public LimitationConfig getLimitationConfig();
+
+ public LimitContainerCmd withCpuShares(int cpuShares);
+
+ public LimitContainerCmd withCpuset(String cpuset);
+
+ public LimitContainerCmd withMemoryLimit(long memoryLimit);
+
+ public LimitContainerCmd withContainerId(String containerId);
+
+ public LimitContainerCmd withSaveChanges(boolean saveChanges);
+
+ public LimitContainerCmd withLimitationConfig(LimitationConfig limitationConfig);
+
+ public Void exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java
new file mode 100644
index 00000000..ed457dab
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java
@@ -0,0 +1,42 @@
+package com.github.dockerjava.api.command;
+
+import java.util.List;
+
+import com.github.dockerjava.api.model.Container;
+
+/**
+ * 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 DockerCmd>{
+
+ public int getLimit();
+
+ public boolean hasShowSizeEnabled();
+
+ public boolean hasShowAllEnabled();
+
+ public String getSinceId();
+
+ public String getBeforeId();
+
+ public ListContainersCmd withShowAll(boolean showAll);
+
+ public ListContainersCmd withShowSize(boolean showSize);
+
+ public ListContainersCmd withLimit(int limit);
+
+ public ListContainersCmd withSince(String since);
+
+ public ListContainersCmd withBefore(String before);
+
+ public static interface Exec extends DockerCmdExec> {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..502af84c
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java
@@ -0,0 +1,26 @@
+package com.github.dockerjava.api.command;
+
+import java.util.List;
+
+import com.github.dockerjava.api.model.Image;
+
+/**
+ * List images
+ *
+ * @param showAll - Show all images (by default filter out the intermediate images used to build)
+ * @param filter - TODO: undocumented in docker remote api reference
+ */
+public interface ListImagesCmd extends DockerCmd> {
+
+ public String getFilter();
+
+ public boolean hasShowAllEnabled();
+
+ public ListImagesCmd withShowAll(boolean showAll);
+
+ public ListImagesCmd withFilter(String filter);
+
+ public static interface Exec extends DockerCmdExec> {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
new file mode 100644
index 00000000..e0f20f9a
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
@@ -0,0 +1,67 @@
+package com.github.dockerjava.api.command;
+
+import java.io.InputStream;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * Get container logs
+ *
+ * @param followStream
+ * - true or false, return stream. Defaults to false.
+ * @param stdout
+ * - true or false, includes stdout log. Defaults to false.
+ * @param stderr
+ * - true or false, includes stderr log. Defaults to false.
+ * @param timestamps
+ * - 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
+ */
+public interface LogContainerCmd extends DockerCmd{
+
+ public String getContainerId();
+
+ public int getTail();
+
+ public boolean hasFollowStreamEnabled();
+
+ public boolean hasTimestampsEnabled();
+
+ public boolean hasStdoutEnabled();
+
+ public boolean hasStderrEnabled();
+
+ public LogContainerCmd withContainerId(String containerId);
+
+ public LogContainerCmd withFollowStream();
+
+ 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();
+
+ public LogContainerCmd withTail(int tail);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public InputStream exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/MetricContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/MetricContainerCmd.java
new file mode 100644
index 00000000..f6fc2ca1
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/MetricContainerCmd.java
@@ -0,0 +1,16 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.model.metric.Metric;
+
+public interface MetricContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public MetricContainerCmd withContainerId(String containerId);
+
+ public Metric exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java
new file mode 100644
index 00000000..a05733f9
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java
@@ -0,0 +1,25 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * Pause a container.
+ *
+ * @param containerId - Id of the container
+ *
+ */
+public interface PauseContainerCmd extends DockerCmd{
+
+ public String getContainerId();
+
+ public PauseContainerCmd withContainerId(String containerId);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public Void exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..7d5af1e3
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/PingCmd.java
@@ -0,0 +1,13 @@
+package com.github.dockerjava.api.command;
+
+
+/**
+ * Ping the Docker server
+ *
+ */
+public interface PingCmd extends DockerCmd {
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..f938542d
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java
@@ -0,0 +1,27 @@
+package com.github.dockerjava.api.command;
+
+import java.io.InputStream;
+
+/**
+*
+* Pull image from repository.
+*
+*/
+public interface PullImageCmd extends DockerCmd{
+
+ public String getRepository();
+
+ public String getTag();
+
+ public String getRegistry();
+
+ public PullImageCmd withRepository(String repository);
+
+ public PullImageCmd withTag(String tag);
+
+ public PullImageCmd withRegistry(String registry);
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..cd3e6681
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java
@@ -0,0 +1,34 @@
+package com.github.dockerjava.api.command;
+
+import java.io.InputStream;
+
+import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.model.AuthConfig;
+
+/**
+ * Push the latest image to the repository.
+ *
+ * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.
+ */
+public interface PushImageCmd extends DockerCmd{
+
+ public String getName();
+
+ /**
+ * @param name The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.
+ */
+ public PushImageCmd withName(String name);
+
+ public AuthConfig getAuthConfig();
+
+ public PushImageCmd withAuthConfig(AuthConfig authConfig);
+
+ /**
+ * @throws NotFoundException No such image
+ */
+ public InputStream exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..e6c13b20
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java
@@ -0,0 +1,41 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * Remove a container.
+ *
+ * @param removeVolumes - true or false, Remove the volumes associated to the container. Defaults to false
+ * @param force - true or false, Removes the container even if it was running. Defaults to false
+ */
+public interface RemoveContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public boolean hasRemoveVolumesEnabled();
+
+ public boolean hasForceEnabled();
+
+ public boolean hasCheckDevice();
+
+ public RemoveContainerCmd withContainerId(String containerId);
+
+ public RemoveContainerCmd withRemoveVolumes(boolean removeVolumes);
+
+ public RemoveContainerCmd withForce();
+
+ public RemoveContainerCmd withForce(boolean force);
+
+ public RemoveContainerCmd withCheckDevice();
+
+ public RemoveContainerCmd withCheckDevice(boolean checkDevice);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public Void exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..212c9290
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java
@@ -0,0 +1,49 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+*
+* Remove an image, deleting any tags it might have.
+*
+*/
+public interface RemoveImageCmd extends DockerCmd{
+
+ public String getImageId();
+
+ public boolean hasForceEnabled();
+
+ public boolean hasNoPruneEnabled();
+
+ public RemoveImageCmd withImageId(String imageId);
+
+ /**
+ * force delete of an image, even if it's tagged in multiple repositories
+ */
+ public RemoveImageCmd withForce();
+
+ /**
+ * 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
+ *
+ */
+ public RemoveImageCmd withNoPrune(boolean noPrune);
+
+ /**
+ * @throws NotFoundException No such image
+ */
+ public Void exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..793919c2
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java
@@ -0,0 +1,29 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * Restart a running container.
+ *
+ * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds.
+ *
+ */
+public interface RestartContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public int getTimeout();
+
+ public RestartContainerCmd withContainerId(String containerId);
+
+ public RestartContainerCmd withtTimeout(int timeout);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public Void exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..c609e6e8
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java
@@ -0,0 +1,22 @@
+package com.github.dockerjava.api.command;
+
+import java.util.List;
+
+import com.github.dockerjava.api.model.SearchItem;
+
+/**
+ * Search images
+ *
+ * @param term - search term
+ *
+ */
+public interface SearchImagesCmd extends DockerCmd> {
+
+ public String getTerm();
+
+ public SearchImagesCmd withTerm(String term);
+
+ public static interface Exec extends DockerCmdExec> {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
new file mode 100644
index 00000000..56dd3340
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
@@ -0,0 +1,128 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.NotModifiedException;
+import com.github.dockerjava.api.model.Bind;
+import com.github.dockerjava.api.model.Device;
+import com.github.dockerjava.api.model.Link;
+import com.github.dockerjava.api.model.LxcConf;
+import com.github.dockerjava.api.model.Ports;
+import com.github.dockerjava.api.model.RestartPolicy;
+
+/**
+ * Start a container
+ */
+public interface StartContainerCmd extends DockerCmd {
+
+ public Bind[] getBinds();
+
+ public Link[] getLinks();
+
+ public LxcConf[] getLxcConf();
+
+ public Ports getPortBindings();
+
+ public boolean isPublishAllPorts();
+
+ public boolean isPrivileged();
+
+ public String[] getDns();
+
+ public String[] getDnsSearch();
+
+ public String[] getVolumesFrom();
+
+ public String getContainerId();
+
+ public String getNetworkMode();
+
+ public Device[] getDevices();
+
+ public RestartPolicy getRestartPolicy();
+
+ public String[] getCapAdd();
+
+ public String[] getCapDrop();
+
+ public StartContainerCmd withBinds(Bind... binds);
+
+ /**
+ * Add link to another container.
+ */
+ public StartContainerCmd withLinks(Link... links);
+
+ public StartContainerCmd withLxcConf(LxcConf... lxcConf);
+
+ public StartContainerCmd withPortBindings(Ports portBindings);
+
+ public StartContainerCmd withPrivileged(boolean privileged);
+
+ public StartContainerCmd withPublishAllPorts(boolean publishAllPorts);
+
+ /**
+ * Set custom DNS servers
+ */
+ public StartContainerCmd withDns(String... dns);
+
+ /**
+ * Set custom DNS search domains
+ */
+ public StartContainerCmd withDnsSearch(String... dnsSearch);
+
+ public StartContainerCmd withVolumesFrom(String... volumesFrom);
+
+ public StartContainerCmd withContainerId(String containerId);
+
+ /**
+ * 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.
+ *
+ */
+ public StartContainerCmd withNetworkMode(String networkMode);
+
+ /**
+ * Add host devices to the container
+ */
+ public StartContainerCmd withDevices(Device... devices);
+
+ /**
+ * Set custom {@link RestartPolicy} for the container. Defaults to
+ * {@link RestartPolicy#noRestart()}
+ */
+ public StartContainerCmd withRestartPolicy(RestartPolicy restartPolicy);
+
+ /**
+ * Add linux kernel
+ * capability to the container. For example: adding capability "MKNOD"
+ * allows the container to create special files using the 'mknod' command.
+ */
+ public StartContainerCmd withCapAdd(String... capAdd);
+
+ /**
+ * Drop linux kernel
+ * capability from the container. For example: dropping capability
+ * "CHOWN" prevents the container from changing the owner of any files.
+ */
+ public StartContainerCmd withCapDrop(String... capDrop);
+
+ /**
+ * @throws NotFoundException
+ * No such container
+ * @throws NotModifiedException
+ * Container already started
+ */
+ public Void exec() throws NotFoundException, NotModifiedException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/StartExecCmd.java b/src/main/java/com/github/dockerjava/api/command/StartExecCmd.java
new file mode 100644
index 00000000..b8552feb
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/StartExecCmd.java
@@ -0,0 +1,17 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+public interface StartExecCmd extends BaseExecCmd {
+
+ public String getExecId();
+
+ public StartExecCmd withExecId(String execId);
+
+ @Override
+ public String exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java
new file mode 100644
index 00000000..7e706c06
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java
@@ -0,0 +1,32 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+import com.github.dockerjava.api.NotModifiedException;
+
+/**
+ * Stop a running container.
+ *
+ * @param containerId - Id of the container
+ * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds.
+ *
+ */
+public interface StopContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public int getTimeout();
+
+ public StopContainerCmd withContainerId(String containerId);
+
+ public StopContainerCmd withTimeout(int timeout);
+
+ /**
+ * @throws NotFoundException No such container
+ * @throws NotModifiedException Container already stopped
+ */
+ public Void exec() throws NotFoundException, NotModifiedException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/SweepContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/SweepContainerCmd.java
new file mode 100644
index 00000000..f53ddf2a
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/SweepContainerCmd.java
@@ -0,0 +1,18 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+public interface SweepContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public SweepContainerCmd withContainerId(String containerId);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public Void exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java
new file mode 100644
index 00000000..ace84996
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java
@@ -0,0 +1,35 @@
+package com.github.dockerjava.api.command;
+
+
+/**
+ * Tag an image into a repository
+ *
+ * @param image The local image to tag (either a name or an id)
+ * @param repository The repository to tag in
+ * @param force (not documented)
+ *
+ */
+public interface TagImageCmd extends DockerCmd {
+
+ public String getImageId();
+
+ public String getRepository();
+
+ public String getTag();
+
+ public boolean hasForceEnabled();
+
+ public TagImageCmd withImageId(String imageId);
+
+ public TagImageCmd withRepository(String repository);
+
+ public TagImageCmd withTag(String tag);
+
+ public TagImageCmd withForce();
+
+ public TagImageCmd withForce(boolean force);
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..c7818a79
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java
@@ -0,0 +1,26 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * List processes running inside a container
+ */
+public interface TopContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public String getPsArgs();
+
+ public TopContainerCmd withContainerId(String containerId);
+
+ public TopContainerCmd withPsArgs(String psArgs);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public TopContainerResponse exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java
new file mode 100644
index 00000000..e479b269
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java
@@ -0,0 +1,45 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.Joiner;
+
+/**
+ *
+ * @author marcus
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class TopContainerResponse {
+
+ @JsonProperty("Titles")
+ private String[] titles;
+
+ @JsonProperty("Processes")
+ private String[][] processes;
+
+ public String[] getTitles() {
+ return titles;
+ }
+
+ public String[][] getProcesses() {
+ return processes;
+ }
+
+ @Override
+ public String toString() {
+ Joiner joiner = Joiner.on("; ").skipNulls();
+
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("[");
+ for(String[] fields: processes) {
+ buffer.append("[" + joiner.join(fields) + "]");
+ }
+ buffer.append("]");
+
+ return "TopContainerResponse{" +
+ "titles=" + joiner.join(titles) +
+ ", processes=" + buffer.toString() +
+ '}';
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java
new file mode 100644
index 00000000..e74df14c
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java
@@ -0,0 +1,25 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * Unpause a container.
+ *
+ * @param containerId - Id of the container
+ *
+ */
+public interface UnpauseContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public UnpauseContainerCmd withContainerId(String containerId);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ public Void exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ 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
new file mode 100644
index 00000000..740a335e
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/VersionCmd.java
@@ -0,0 +1,13 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.Version;
+
+/**
+ * Returns the Docker version info.
+ */
+public interface VersionCmd extends DockerCmd {
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java
new file mode 100644
index 00000000..e7183155
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java
@@ -0,0 +1,25 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.NotFoundException;
+
+/**
+ * Wait a container
+ *
+ * Block until container stops, then returns its exit code
+ */
+public interface WaitContainerCmd extends DockerCmd {
+
+ public String getContainerId();
+
+ public WaitContainerCmd withContainerId(String containerId);
+
+ /**
+ * @throws NotFoundException container not found
+ */
+ @Override
+ public Integer exec() throws NotFoundException;
+
+ public static interface Exec extends DockerCmdExec {
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/model/AccessMode.java b/src/main/java/com/github/dockerjava/api/model/AccessMode.java
new file mode 100644
index 00000000..e0106536
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/AccessMode.java
@@ -0,0 +1,19 @@
+package com.github.dockerjava.api.model;
+
+/**
+ * The access mode of a file system or file: read-write
+ * or read-only.
+ */
+public enum AccessMode {
+ /** read-write */
+ rw,
+
+ /** read-only */
+ ro;
+
+ /**
+ * The default {@link AccessMode}: {@link #rw}
+ */
+ public static final AccessMode DEFAULT = rw;
+
+}
diff --git a/src/main/java/com/kpelykh/docker/client/model/AuthConfig.java b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java
similarity index 87%
rename from src/main/java/com/kpelykh/docker/client/model/AuthConfig.java
rename to src/main/java/com/github/dockerjava/api/model/AuthConfig.java
index 514e79be..7212d823 100644
--- a/src/main/java/com/kpelykh/docker/client/model/AuthConfig.java
+++ b/src/main/java/com/github/dockerjava/api/model/AuthConfig.java
@@ -1,16 +1,18 @@
-package com.kpelykh.docker.client.model;
+package com.github.dockerjava.api.model;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
-@JsonIgnoreProperties(ignoreUnknown = true)
public class AuthConfig {
+
@JsonProperty
private String username;
+
@JsonProperty
private String password;
+
@JsonProperty
private String email;
+
@JsonProperty("serveraddress")
private String serverAddress = "https://index.docker.io/v1/";
diff --git a/src/main/java/com/github/dockerjava/api/model/Bind.java b/src/main/java/com/github/dockerjava/api/model/Bind.java
new file mode 100644
index 00000000..2a838c27
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Bind.java
@@ -0,0 +1,118 @@
+package com.github.dockerjava.api.model;
+
+import static com.github.dockerjava.api.model.AccessMode.ro;
+import static com.github.dockerjava.api.model.AccessMode.rw;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+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.
+ */
+public class Bind {
+
+ private String path;
+
+ private Volume volume;
+
+ private AccessMode accessMode;
+
+ public Bind(String path, Volume volume) {
+ this(path, volume, AccessMode.DEFAULT);
+ }
+
+ public Bind(String path, Volume volume, AccessMode accessMode) {
+ this.path = path;
+ this.volume = volume;
+ this.accessMode = accessMode;
+ }
+
+ /**
+ * @deprecated use {@link #Bind(String, Volume, AccessMode)}
+ */
+ @Deprecated
+ public Bind(String path, Volume volume, boolean readOnly) {
+ this(path, volume, readOnly ? ro : rw);
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public Volume getVolume() {
+ return volume;
+ }
+
+ public AccessMode getAccessMode() {
+ return accessMode;
+ }
+
+ /**
+ * @deprecated use {@link #getAccessMode()}
+ */
+ @Deprecated
+ public boolean isReadOnly() {
+ return ro.equals(accessMode);
+ }
+
+ /**
+ * 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
+ * @throws IllegalArgumentException if the specification cannot be parsed
+ */
+ public static Bind parse(String serialized) {
+ try {
+ String[] parts = serialized.split(":");
+ switch (parts.length) {
+ case 2: {
+ return new Bind(parts[0], Volume.parse(parts[1]));
+ }
+ case 3: {
+ AccessMode accessMode = AccessMode.valueOf(parts[2].toLowerCase());
+ return new Bind(parts[0], Volume.parse(parts[1]), accessMode);
+ }
+ default: {
+ throw new IllegalArgumentException();
+ }
+ }
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Error parsing Bind '" + serialized
+ + "'");
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Bind) {
+ Bind other = (Bind) obj;
+ return new EqualsBuilder().append(path, other.getPath())
+ .append(volume, other.getVolume())
+ .append(accessMode, other.getAccessMode()).isEquals();
+ } else
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().append(path).append(volume)
+ .append(accessMode).toHashCode();
+ }
+
+ /**
+ * 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
+ public String toString() {
+ return path + ":" + volume.toString() + ":" + accessMode.toString();
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/Binds.java b/src/main/java/com/github/dockerjava/api/model/Binds.java
new file mode 100644
index 00000000..bfc8dbf2
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Binds.java
@@ -0,0 +1,73 @@
+package com.github.dockerjava.api.model;
+
+import java.io.IOException;
+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;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.JsonSerializer;
+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)
+public class Binds {
+
+ private Bind[] binds;
+
+ public Binds(Bind... binds) {
+ this.binds = binds;
+ }
+
+ public Bind[] getBinds() {
+ return binds;
+ }
+
+ public static class Serializer extends JsonSerializer {
+
+ @Override
+ public void serialize(Binds binds, JsonGenerator jsonGen,
+ SerializerProvider serProvider) throws IOException,
+ JsonProcessingException {
+
+ //
+ jsonGen.writeStartArray();
+ for (Bind bind : binds.getBinds()) {
+ jsonGen.writeString(bind.toString());
+ }
+ jsonGen.writeEndArray();
+ //
+ }
+
+ }
+
+ public static class Deserializer extends JsonDeserializer {
+ @Override
+ public Binds deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+
+ List binds = new ArrayList();
+ ObjectCodec oc = jsonParser.getCodec();
+ JsonNode node = oc.readTree(jsonParser);
+ for (Iterator> it = node.fields(); it.hasNext();) {
+
+ 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/kpelykh/docker/client/model/ChangeLog.java b/src/main/java/com/github/dockerjava/api/model/ChangeLog.java
similarity index 71%
rename from src/main/java/com/kpelykh/docker/client/model/ChangeLog.java
rename to src/main/java/com/github/dockerjava/api/model/ChangeLog.java
index 50fdab4a..9bc91069 100644
--- a/src/main/java/com/kpelykh/docker/client/model/ChangeLog.java
+++ b/src/main/java/com/github/dockerjava/api/model/ChangeLog.java
@@ -1,35 +1,33 @@
-package com.kpelykh.docker.client.model;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- *
- * @author Konstantin Pelykh (kpelykh@gmail.com)
- *
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ChangeLog {
-
- @JsonProperty("Path")
- private String path;
-
- @JsonProperty("Kind")
- private int kind;
-
- public String getPath() {
- return path;
- }
-
- public int getKind() {
- return kind;
- }
-
- @Override
- public String toString() {
- return "ChangeLog{" +
- "path='" + path + '\'' +
- ", kind=" + kind +
- '}';
- }
-}
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChangeLog {
+
+ @JsonProperty("Path")
+ private String path;
+
+ @JsonProperty("Kind")
+ private int kind;
+
+ public String getPath() {
+ return path;
+ }
+
+ public int getKind() {
+ return kind;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/Container.java b/src/main/java/com/github/dockerjava/api/model/Container.java
new file mode 100644
index 00000000..5b38ce48
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Container.java
@@ -0,0 +1,107 @@
+package com.github.dockerjava.api.model;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown=true)
+public class Container {
+
+ @JsonProperty("Command")
+ private String command;
+
+ @JsonProperty("Created")
+ private long created;
+
+ @JsonProperty("Id")
+ private String id;
+
+ @JsonProperty("Image")
+ private String image;
+
+ @JsonProperty("Names")
+ private String[] names;
+
+ @JsonProperty("Ports")
+ public Port[] ports;
+
+ @JsonProperty("Status")
+ private String status;
+
+ public String getId() {
+ return id;
+ }
+
+ public String getCommand() {
+ return command;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ public long getCreated() {
+ return created;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public Port[] getPorts() {
+ return ports;
+ }
+
+ public String[] getNames() {
+ return names;
+ }
+
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static class Port {
+
+ @JsonProperty("IP")
+ private String ip;
+
+ @JsonProperty("PrivatePort")
+ private Integer privatePort;
+
+ @JsonProperty("PublicPort")
+ private Integer publicPort;
+
+ @JsonProperty("Type")
+ private String type;
+
+ public String getIp() {
+ return ip;
+ }
+
+ public Integer getPrivatePort() {
+ return privatePort;
+ }
+
+ public Integer getPublicPort() {
+ return publicPort;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
new file mode 100644
index 00000000..c28d024a
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
@@ -0,0 +1,191 @@
+package com.github.dockerjava.api.model;
+
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ContainerConfig {
+
+ @JsonProperty("AttachStderr")
+ private boolean attachStderr = false;
+
+ @JsonProperty("AttachStdin")
+ private boolean attachStdin = false;
+
+ @JsonProperty("AttachStdout")
+ private boolean attachStdout = false;
+
+ @JsonProperty("Cmd")
+ private String[] cmd;
+
+ @JsonProperty("CpuShares")
+ private int cpuShares = 0;
+
+ @JsonProperty("Cpuset")
+ private String cpuset = "";
+
+ @JsonProperty("Domainname")
+ private String domainName = "";
+
+ @JsonProperty("Entrypoint")
+ private String[] entrypoint = new String[] {};
+
+ @JsonProperty("Env")
+ private String[] env;
+
+ @JsonProperty("ExposedPorts")
+ private ExposedPorts exposedPorts;
+
+ @JsonProperty("Hostname")
+ private String hostName = "";
+
+ @JsonProperty("Image")
+ private String image;
+
+ @JsonProperty("Memory")
+ private long memoryLimit = 0;
+
+ @JsonProperty("MemorySwap")
+ private long memorySwap = 0;
+
+ @JsonProperty("NetworkDisabled")
+ private boolean networkDisabled = false;
+
+ @JsonProperty("OnBuild")
+ private int[] onBuild;
+
+ @JsonProperty("OpenStdin")
+ private boolean stdinOpen = false;
+
+ @JsonProperty("PortSpecs")
+ private String[] portSpecs;
+
+ @JsonProperty("StdinOnce")
+ private boolean stdInOnce = false;
+
+ @JsonProperty("Tty")
+ private boolean tty = false;
+
+ @JsonProperty("User")
+ private String user = "";
+
+ @JsonProperty("Volumes")
+ private Map volumes;
+
+ @JsonProperty("WorkingDir")
+ private String workingDir = "";
+
+ @JsonProperty("Ip")
+ private String ip = "";
+
+ @JsonIgnore
+ public ExposedPort[] getExposedPorts() {
+ return exposedPorts.getExposedPorts();
+ }
+
+ public boolean isNetworkDisabled() {
+ return networkDisabled;
+ }
+
+ public String getDomainName() {
+ return domainName;
+ }
+
+ public String getWorkingDir() {
+ return workingDir;
+ }
+
+ public String getHostName() {
+ return hostName;
+ }
+
+ public String[] getPortSpecs() {
+ return portSpecs;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public boolean isTty() {
+ return tty;
+ }
+
+ public boolean isStdinOpen() {
+ return stdinOpen;
+ }
+
+ public boolean isStdInOnce() {
+ return stdInOnce;
+ }
+
+ 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;
+ }
+
+ public boolean isAttachStdout() {
+ return attachStdout;
+ }
+
+ public boolean isAttachStderr() {
+ return attachStderr;
+ }
+
+ public String[] getEnv() {
+ return env;
+ }
+
+ public String[] getCmd() {
+ return cmd;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ public Map getVolumes() {
+ return volumes;
+ }
+
+ public String[] getEntrypoint() {
+ return entrypoint;
+ }
+
+ public int[] getOnBuild() {
+ return onBuild;
+ }
+
+ public String getIp() {
+ return ip;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/CreateContainerConfig.java b/src/main/java/com/github/dockerjava/api/model/CreateContainerConfig.java
new file mode 100644
index 00000000..601a6525
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/CreateContainerConfig.java
@@ -0,0 +1,251 @@
+package com.github.dockerjava.api.model;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class CreateContainerConfig {
+
+ @JsonProperty("Hostname") private String hostName = "";
+ @JsonProperty("User") private String user = "";
+ @JsonProperty("Memory") private long memoryLimit = 0;
+ @JsonProperty("MemorySwap") private long memorySwap = 0;
+ @JsonProperty("CpuShares") private int cpuShares = 0;
+ @JsonProperty("Cpuset") private String cpuset = "";
+ @JsonProperty("AttachStdin") private boolean attachStdin = false;
+ @JsonProperty("AttachStdout") private boolean attachStdout = false;
+ @JsonProperty("AttachStderr") private boolean attachStderr = false;
+ @JsonProperty("PortSpecs") private String[] portSpecs = new String[] {};
+ @JsonProperty("Tty") private boolean tty = false;
+ @JsonProperty("OpenStdin") private boolean stdinOpen = false;
+ @JsonProperty("StdinOnce") private boolean stdInOnce = false;
+ @JsonProperty("Env") private List env = new ArrayList();
+ @JsonProperty("Cmd") private String[] cmd = new String[] {};
+ @JsonProperty("Dns") private String[] dns = new String[] {};
+ @JsonProperty("Image") private String image;
+ @JsonProperty("Volumes") private Volumes volumes = new Volumes();
+ @JsonProperty("VolumesFrom") private String volumesFrom = "";
+ @JsonProperty("WorkingDir") private String workingDir = "";
+ @JsonProperty("DisableNetwork") private boolean disableNetwork = false;
+ @JsonProperty("ExposedPorts") private ExposedPorts exposedPorts = new ExposedPorts();
+ @JsonProperty("Ip") private String ip = "";
+
+ public CreateContainerConfig withExposedPorts(ExposedPort[] exposedPorts) {
+ this.exposedPorts = new ExposedPorts(exposedPorts);
+ return this;
+ }
+
+ @JsonIgnore
+ public ExposedPort[] getExposedPorts() {
+ return exposedPorts.getExposedPorts();
+ }
+
+ public boolean isDisableNetwork() {
+ return disableNetwork;
+ }
+
+ public String getWorkingDir() {
+ return workingDir;
+ }
+
+ public CreateContainerConfig withWorkingDir(String workingDir) {
+ this.workingDir = workingDir;
+ return this;
+ }
+
+ public String getHostName() {
+ return hostName;
+ }
+
+ public CreateContainerConfig withDisableNetwork(boolean disableNetwork) {
+ this.disableNetwork = disableNetwork;
+ return this;
+ }
+
+ public CreateContainerConfig withHostName(String hostName) {
+ this.hostName = hostName;
+ return this;
+ }
+
+ public String[] getPortSpecs() {
+ return portSpecs;
+ }
+
+ public CreateContainerConfig withPortSpecs(String[] portSpecs) {
+ this.portSpecs = portSpecs;
+ return this;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public CreateContainerConfig withUser(String user) {
+ this.user = user;
+ return this;
+ }
+
+ public boolean isTty() {
+ return tty;
+ }
+
+ public CreateContainerConfig withTty(boolean tty) {
+ this.tty = tty;
+ return this;
+ }
+
+ public boolean isStdinOpen() {
+ return stdinOpen;
+ }
+
+ public CreateContainerConfig withStdinOpen(boolean stdinOpen) {
+ this.stdinOpen = stdinOpen;
+ return this;
+ }
+
+ public boolean isStdInOnce() {
+ return stdInOnce;
+ }
+
+ public CreateContainerConfig withStdInOnce(boolean stdInOnce) {
+ this.stdInOnce = stdInOnce;
+ return this;
+ }
+
+ public long getMemoryLimit() {
+ return memoryLimit;
+ }
+
+ public CreateContainerConfig withMemoryLimit(long memoryLimit) {
+ this.memoryLimit = memoryLimit;
+ return this;
+ }
+
+ public long getMemorySwap() {
+ return memorySwap;
+ }
+
+ public CreateContainerConfig withMemorySwap(long memorySwap) {
+ this.memorySwap = memorySwap;
+ return this;
+ }
+
+ public boolean isAttachStdin() {
+ return attachStdin;
+ }
+
+ public CreateContainerConfig withAttachStdin(boolean attachStdin) {
+ this.attachStdin = attachStdin;
+ return this;
+ }
+
+ public boolean isAttachStdout() {
+ return attachStdout;
+ }
+
+ public CreateContainerConfig withAttachStdout(boolean attachStdout) {
+ this.attachStdout = attachStdout;
+ return this;
+ }
+
+ public boolean isAttachStderr() {
+ return attachStderr;
+ }
+
+ public CreateContainerConfig withAttachStderr(boolean attachStderr) {
+ this.attachStderr = attachStderr;
+ return this;
+ }
+
+ public List getEnv() {
+ return env;
+ }
+
+ public CreateContainerConfig withEnv(String[] env) {
+ this.env = Arrays.asList(env);
+ return this;
+ }
+
+ public String[] getCmd() {
+ return cmd;
+ }
+
+ public CreateContainerConfig withCmd(String[] cmd) {
+ this.cmd = cmd;
+ return this;
+ }
+
+ public String[] getDns() {
+ return dns;
+ }
+
+ public CreateContainerConfig withDns(String[] dns) {
+ this.dns = dns;
+ return this;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ public CreateContainerConfig withImage(String image) {
+ this.image = image;
+ return this;
+ }
+
+ public int getCpuShares() {
+ return cpuShares;
+ }
+
+ public String getCpuset() {
+ return cpuset;
+ }
+
+ public String getIp() {
+ return ip;
+ }
+
+ @JsonIgnore
+ public Volume[] getVolumes() {
+ return volumes.getVolumes();
+ }
+
+ public CreateContainerConfig withVolumes(Volume[] volumes) {
+ this.volumes = new Volumes(volumes);
+ return this;
+ }
+
+ public String getVolumesFrom() {
+ return volumesFrom;
+ }
+
+ public CreateContainerConfig withVolumesFrom(String volumesFrom) {
+ this.volumesFrom = volumesFrom;
+ return this;
+ }
+
+ public CreateContainerConfig withCpuset(String cpuset) {
+ this.cpuset = cpuset;
+ return this;
+ }
+
+ public CreateContainerConfig withCpuShare(int cpuShares) {
+ this.cpuShares = cpuShares;
+ return this;
+ }
+
+ public CreateContainerConfig withIp(String ip) {
+ this.ip = ip;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/dockerjava/api/model/Device.java b/src/main/java/com/github/dockerjava/api/model/Device.java
new file mode 100644
index 00000000..b0b32515
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Device.java
@@ -0,0 +1,64 @@
+package com.github.dockerjava.api.model;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.Preconditions;
+
+public class Device {
+
+ @JsonProperty("CgroupPermissions")
+ private String cGroupPermissions = "";
+
+ @JsonProperty("PathOnHost")
+ private String pathOnHost = null;
+
+ @JsonProperty("PathInContainer")
+ private String pathInContainer = null;
+
+ public Device() {
+ }
+
+ public Device(String cGroupPermissions, String pathInContainer,
+ String pathOnHost) {
+ Preconditions.checkNotNull(cGroupPermissions,
+ "cGroupPermissions is null");
+ Preconditions.checkNotNull(pathInContainer, "pathInContainer is null");
+ Preconditions.checkNotNull(pathOnHost, "pathOnHost is null");
+ this.cGroupPermissions = cGroupPermissions;
+ this.pathInContainer = pathInContainer;
+ this.pathOnHost = pathOnHost;
+ }
+
+ public String getcGroupPermissions() {
+ return cGroupPermissions;
+ }
+
+ public String getPathInContainer() {
+ return pathInContainer;
+ }
+
+ public String getPathOnHost() {
+ return pathOnHost;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Device) {
+ Device other = (Device) obj;
+ return new EqualsBuilder()
+ .append(cGroupPermissions, other.getcGroupPermissions())
+ .append(pathInContainer, other.getPathInContainer())
+ .append(pathOnHost, other.getPathOnHost()).isEquals();
+ } else
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().append(cGroupPermissions)
+ .append(pathInContainer).append(pathOnHost).toHashCode();
+ }
+
+}
diff --git a/src/main/java/com/kpelykh/docker/client/model/DriverStatus.java b/src/main/java/com/github/dockerjava/api/model/DriverStatus.java
similarity index 70%
rename from src/main/java/com/kpelykh/docker/client/model/DriverStatus.java
rename to src/main/java/com/github/dockerjava/api/model/DriverStatus.java
index 5421bc44..c1bb8b7d 100644
--- a/src/main/java/com/kpelykh/docker/client/model/DriverStatus.java
+++ b/src/main/java/com/github/dockerjava/api/model/DriverStatus.java
@@ -1,33 +1,31 @@
-package com.kpelykh.docker.client.model;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * Created by ben on 12/12/13.
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class DriverStatus {
-
- @JsonProperty("Root Dir")
- private String rootDir;
-
- @JsonProperty("Dirs")
- private int dirs;
-
- public String getRootDir() {
- return rootDir;
- }
-
- public int getDirs() {
- return dirs;
- }
-
- @Override
- public String toString() {
- return "DriverStatus{" +
- "rootDir='" + rootDir + '\'' +
- ", dirs=" + dirs +
- '}';
- }
-}
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+/**
+ * Created by ben on 12/12/13.
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class DriverStatus {
+
+ @JsonProperty("Root Dir")
+ private String rootDir;
+
+ @JsonProperty("Dirs")
+ private int dirs;
+
+ public String getRootDir() {
+ return rootDir;
+ }
+
+ public int getDirs() {
+ return dirs;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/Event.java b/src/main/java/com/github/dockerjava/api/model/Event.java
new file mode 100644
index 00000000..674cb66d
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Event.java
@@ -0,0 +1,37 @@
+package com.github.dockerjava.api.model;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+/**
+ * Representation of a Docker event.
+ */
+public class Event {
+ private String status;
+
+ private String id;
+
+ private String from;
+
+ private long time;
+
+ public String getStatus() {
+ return status;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getFrom() {
+ return from;
+ }
+
+ public long getTime() {
+ return time;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/ExecConfig.java b/src/main/java/com/github/dockerjava/api/model/ExecConfig.java
new file mode 100644
index 00000000..c101db5d
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/ExecConfig.java
@@ -0,0 +1,95 @@
+package com.github.dockerjava.api.model;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class ExecConfig {
+
+ @JsonProperty("User") private String user = "";
+ @JsonProperty("Privileged") private boolean privileged = false;
+ @JsonProperty("Tty") private boolean tty = false;
+ @JsonProperty("Container") private String containerId = "";
+ @JsonProperty("AttachStdin") private boolean attachStdin = false;
+ @JsonProperty("AttachStdout") private boolean attachStdout = true;
+ @JsonProperty("AttachStderr") private boolean attachStderr = true;
+ @JsonProperty("Detach") private boolean detach;
+ @JsonProperty("Cmd") private String[] cmd;
+
+ public String getUser() {
+ return user;
+ }
+
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+ public boolean isPrivileged() {
+ return privileged;
+ }
+
+ public void setPrivileged(boolean privileged) {
+ this.privileged = privileged;
+ }
+
+ public boolean isTty() {
+ return tty;
+ }
+
+ public void setTty(boolean tty) {
+ this.tty = tty;
+ }
+
+ public String getContainerId() {
+ return containerId;
+ }
+
+ public void setContainerId(String containerId) {
+ this.containerId = containerId;
+ }
+
+ public boolean isAttachStdin() {
+ return attachStdin;
+ }
+
+ public void setAttachStdin(boolean attachStdin) {
+ this.attachStdin = attachStdin;
+ }
+
+ public boolean isAttachStdout() {
+ return attachStdout;
+ }
+
+ public void setAttachStdout(boolean attachStdout) {
+ this.attachStdout = attachStdout;
+ }
+
+ public boolean isAttachStderr() {
+ return attachStderr;
+ }
+
+ public void setAttachStderr(boolean attachStderr) {
+ this.attachStderr = attachStderr;
+ }
+
+ public boolean isDetach() {
+ return detach;
+ }
+
+ public void setDetach(boolean detach) {
+ this.detach = detach;
+ }
+
+ public String[] getCmd() {
+ return cmd;
+ }
+
+ public void setCmd(String[] cmd) {
+ this.cmd = cmd;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/ExposedPort.java b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java
new file mode 100644
index 00000000..d19bfbf0
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/ExposedPort.java
@@ -0,0 +1,173 @@
+package com.github.dockerjava.api.model;
+
+import static com.github.dockerjava.api.model.InternetProtocol.TCP;
+import static com.github.dockerjava.api.model.InternetProtocol.UDP;
+
+import java.io.IOException;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.JsonSerializer;
+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;
+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}.
+ */
+@JsonDeserialize(using = ExposedPort.Deserializer.class)
+@JsonSerialize(using = ExposedPort.Serializer.class)
+public class ExposedPort {
+
+ private final InternetProtocol protocol;
+ private final int port;
+
+ /**
+ * Creates an {@link ExposedPort} for the given parameters.
+ *
+ * @param port the {@link #getPort() port number}
+ * @param protocol the {@link InternetProtocol}
+ */
+ public ExposedPort(int port, InternetProtocol protocol) {
+ this.port = port;
+ this.protocol = protocol;
+ }
+
+ /**
+ * Creates an {@link ExposedPort} for the given parameters.
+ *
+ * @param scheme the {@link #getScheme() scheme}, tcp or
+ * udp
+ * @param port the {@link #getPort() port number}
+ * @deprecated use {@link #ExposedPort(int, InternetProtocol)}
+ */
+ @Deprecated
+ public ExposedPort(String scheme, int port) {
+ this(port, InternetProtocol.valueOf(scheme));
+ }
+
+ /** @return the {@link InternetProtocol} */
+ public InternetProtocol getProtocol() {
+ return protocol;
+ }
+
+ /**
+ * @return the scheme (internet protocol), tcp or udp
+ * @deprecated use {@link #getProtocol()}
+ */
+ @Deprecated
+ public String getScheme() {
+ return protocol.toString();
+ }
+
+ /** @return the port number */
+ public int getPort() {
+ return port;
+ }
+
+ /**
+ * Creates an {@link ExposedPort} for {@link InternetProtocol#TCP}.
+ * This is a shortcut for new ExposedPort(port, {@link InternetProtocol#TCP})
+ */
+ public static ExposedPort tcp(int port) {
+ return new ExposedPort(port, TCP);
+ }
+
+ /**
+ * Creates an {@link ExposedPort} for {@link InternetProtocol#UDP}.
+ * This is a shortcut for new ExposedPort(port, {@link InternetProtocol#UDP})
+ */
+ public static ExposedPort udp(int port) {
+ return new ExposedPort(port, UDP);
+ }
+
+ /**
+ * 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
+ * @throws IllegalArgumentException if the specification cannot be parsed
+ */
+ public static ExposedPort parse(String serialized) throws IllegalArgumentException {
+ try {
+ String[] parts = serialized.split("/");
+ return new ExposedPort(Integer.valueOf(parts[0]), InternetProtocol.parse(parts[1]));
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Error parsing ExposedPort '" + serialized + "'");
+ }
+ }
+
+ /**
+ * 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
+ public String toString() {
+ return port + "/" + protocol.toString();
+ }
+
+ @Override
+ 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
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder().append(protocol).append(port).toHashCode();
+ }
+
+ public static class Deserializer extends JsonDeserializer {
+ @Override
+ public ExposedPort deserialize(JsonParser jsonParser,
+ DeserializationContext deserializationContext)
+ throws IOException, JsonProcessingException {
+ ObjectCodec oc = jsonParser.getCodec();
+ JsonNode node = oc.readTree(jsonParser);
+ if (!node.equals(NullNode.getInstance())) {
+ Entry field = node.fields().next();
+ return ExposedPort.parse(field.getKey());
+ } else {
+ return null;
+ }
+ }
+ }
+
+ public static class Serializer extends JsonSerializer {
+
+ @Override
+ public void serialize(ExposedPort exposedPort, JsonGenerator jsonGen,
+ SerializerProvider serProvider) throws IOException,
+ JsonProcessingException {
+
+ jsonGen.writeStartObject();
+ jsonGen.writeFieldName(exposedPort.toString());
+ jsonGen.writeEndObject();
+ }
+
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java
new file mode 100644
index 00000000..924d1300
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/ExposedPorts.java
@@ -0,0 +1,73 @@
+package com.github.dockerjava.api.model;
+
+import java.io.IOException;
+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;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.JsonSerializer;
+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 = ExposedPorts.Serializer.class)
+@JsonDeserialize(using = ExposedPorts.Deserializer.class)
+public class ExposedPorts {
+
+ private ExposedPort[] exposedPorts;
+
+ public ExposedPorts(ExposedPort... exposedPorts) {
+ this.exposedPorts = exposedPorts;
+ }
+
+ public ExposedPort[] getExposedPorts() {
+ return exposedPorts;
+ }
+
+ public static class Serializer extends JsonSerializer {
+
+ @Override
+ public void serialize(ExposedPorts exposedPorts, JsonGenerator jsonGen,
+ SerializerProvider serProvider) throws IOException,
+ JsonProcessingException {
+
+ jsonGen.writeStartObject();
+ for (ExposedPort exposedPort : exposedPorts.getExposedPorts()) {
+ jsonGen.writeFieldName(exposedPort.toString());
+ jsonGen.writeStartObject();
+ jsonGen.writeEndObject();
+ }
+ jsonGen.writeEndObject();
+ }
+
+ }
+
+ public static class Deserializer extends JsonDeserializer {
+ @Override
+ public ExposedPorts deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+
+ List exposedPorts = new ArrayList();
+ ObjectCodec oc = jsonParser.getCodec();
+ JsonNode node = oc.readTree(jsonParser);
+ for (Iterator> it = node.fields(); it.hasNext();) {
+
+ Map.Entry field = it.next();
+ if (!field.getValue().equals(NullNode.getInstance())) {
+ exposedPorts.add(ExposedPort.parse(field.getKey()));
+ }
+ }
+ return new ExposedPorts(exposedPorts.toArray(new ExposedPort[0]));
+ }
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/Image.java b/src/main/java/com/github/dockerjava/api/model/Image.java
new file mode 100644
index 00000000..8c694dab
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Image.java
@@ -0,0 +1,62 @@
+package com.github.dockerjava.api.model;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Image {
+
+ @JsonProperty("Created")
+ private long created;
+
+ @JsonProperty("Id")
+ private String id;
+
+ @JsonProperty("ParentId")
+ private String parentId;
+
+ @JsonProperty("RepoTags")
+ private String[] repoTags;
+
+ @JsonProperty("Size")
+ private long size;
+
+ @JsonProperty("VirtualSize")
+ private long virtualSize;
+
+ public String getId() {
+ return id;
+ }
+
+ public String[] getRepoTags() {
+ return repoTags;
+ }
+
+ public String getParentId() {
+ return parentId;
+ }
+
+ public long getCreated() {
+ return created;
+ }
+
+ public long getSize() {
+ return size;
+ }
+
+ public long getVirtualSize() {
+ return virtualSize;
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/Info.java b/src/main/java/com/github/dockerjava/api/model/Info.java
new file mode 100644
index 00000000..7fe6ae79
--- /dev/null
+++ b/src/main/java/com/github/dockerjava/api/model/Info.java
@@ -0,0 +1,146 @@
+package com.github.dockerjava.api.model;
+
+import java.util.List;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import 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;
+
+ @JsonProperty("Debug")
+ private boolean debug;
+
+ @JsonProperty("Driver")
+ private String driver;
+
+ @JsonProperty("DriverStatus")
+ private List