-
-
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index c0bce7084..000000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 000000000..b901097f2
--- /dev/null
+++ b/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ private static final String WRAPPER_VERSION = "0.5.6";
+ /**
+ * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+ */
+ private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+ /**
+ * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+ * use instead of the default one.
+ */
+ private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+ ".mvn/wrapper/maven-wrapper.properties";
+
+ /**
+ * Path where the maven-wrapper.jar will be saved to.
+ */
+ private static final String MAVEN_WRAPPER_JAR_PATH =
+ ".mvn/wrapper/maven-wrapper.jar";
+
+ /**
+ * Name of the property which should be used to override the default download url for the wrapper.
+ */
+ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+ public static void main(String args[]) {
+ System.out.println("- Downloader started");
+ File baseDirectory = new File(args[0]);
+ System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+ // If the maven-wrapper.properties exists, read it and check if it contains a custom
+ // wrapperUrl parameter.
+ File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+ String url = DEFAULT_DOWNLOAD_URL;
+ if(mavenWrapperPropertyFile.exists()) {
+ FileInputStream mavenWrapperPropertyFileInputStream = null;
+ try {
+ mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+ Properties mavenWrapperProperties = new Properties();
+ mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+ url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+ } catch (IOException e) {
+ System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+ } finally {
+ try {
+ if(mavenWrapperPropertyFileInputStream != null) {
+ mavenWrapperPropertyFileInputStream.close();
+ }
+ } catch (IOException e) {
+ // Ignore ...
+ }
+ }
+ }
+ System.out.println("- Downloading from: " + url);
+
+ File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+ if(!outputFile.getParentFile().exists()) {
+ if(!outputFile.getParentFile().mkdirs()) {
+ System.out.println(
+ "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+ }
+ }
+ System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+ try {
+ downloadFileFromURL(url, outputFile);
+ System.out.println("Done");
+ System.exit(0);
+ } catch (Throwable e) {
+ System.out.println("- Error downloading");
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+ if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+ String username = System.getenv("MVNW_USERNAME");
+ char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+ Authenticator.setDefault(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(username, password);
+ }
+ });
+ }
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 000000000..2cc7d4a55
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 000000000..642d572ce
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 35ce5e286..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,62 +0,0 @@
-sudo: required
-dist: trusty
-language: java
-
-services:
- - docker
-
-jdk:
- - oraclejdk8
-
-install: true
-
-env:
- global:
- - CODECOV=true
- - DOCKER_TLS_VERIFY=""
- # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
- # via the "travis encrypt" command using the project repo's public key
- - secure: "GonzmzvnXsTNQV+6sKtBSSPiwbpMZjxumNt5LFp1g77/afLxw9kl2EQOXbUe308vFOwRVqeY7drBvNJa8aJkTUClfMaGRjfZ9DUwm6doMKMUYrdEkYoQTcH7yDX5K5w9MT6m+Izj+BK2gB7nK3yFlYG6COeXCdFbQ4/cf3/xfRc="
- - COVERITY_SCAN_PROJECT_NAME="docker-java/docker-java"
- - COVERITY_SCAN_BRANCH_PATTERN="master"
- - COVERITY_SCAN_NOTIFICATION_EMAIL="kanstantsin.sha@gmail.com"
-
- matrix:
-# - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="17.09.0~ce-0~ubuntu-trusty"
-# - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="17.09.0~ce-0~ubuntu-trusty"
-# - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="17.06.2~ce-0~ubuntu-trusty" DEPLOY=true COVERITY=true
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="17.05.0~ce-0~ubuntu-trusty" DEPLOY=true COVERITY=true
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2377" DOCKER_VERSION="17.05.0~ce-0~ubuntu-trusty" SWARM_VERSION="1.2.8"
- - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="17.05.0~ce-0~ubuntu-trusty"
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2377" DOCKER_VERSION="1.13.1-0~ubuntu-trusty" SWARM_VERSION="1.2.8"
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.13.1-0~ubuntu-trusty"
- - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.13.1-0~ubuntu-trusty"
- - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.12.6-0~ubuntu-trusty"
- - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.12.6-0~ubuntu-trusty"
-# - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.11.2-0~trusty"
-# - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.11.2-0~trusty"
-# - repo="main" DOCKER_HOST="tcp://127.0.0.1:2375" DOCKER_VERSION="1.10.3-0~trusty"
-# - repo="main" DOCKER_HOST="unix:///var/run/docker.sock" DOCKER_VERSION="1.10.3-0~trusty"
-# - repo="testing" DOCKER_HOST="tcp://127.0.0.1:2375"
-# - repo="testing" DOCKER_HOST="unix:///var/run/docker.sock"
-# - repo="experimental" DOCKER_HOST="tcp://127.0.0.1:2375"
-# - repo="experimental" DOCKER_HOST="unix:///var/run/docker.sock"
-
-cache:
- directories:
- - $HOME/.travis_cache
- - /tmp/coverity-cache
- - $HOME/.m2 # install will pollute it
-
-before_install:
- - pip install --user codecov
- - ./.travis/travis-before-install.sh
-
-script:
- - ./.travis/travis-script.sh
-
-after_success:
- - ./.travis/travis-after-success.sh
-
-#after_script:
-# - sudo cat /var/log/upstart/docker.log
diff --git a/.travis/get-docker-com.sh b/.travis/get-docker-com.sh
deleted file mode 100755
index d9c0142a2..000000000
--- a/.travis/get-docker-com.sh
+++ /dev/null
@@ -1,313 +0,0 @@
-#!/bin/sh
-set -e
-#
-# This script is meant for quick & easy install via:
-# 'curl -sSL https://get.docker.com/ | sh'
-# or:
-# 'wget -qO- https://get.docker.com/ | sh'
-#
-# For test builds (ie. release candidates):
-# 'curl -fsSL https://test.docker.com/ | sh'
-# or:
-# 'wget -qO- https://test.docker.com/ | sh'
-#
-# For experimental builds:
-# 'curl -fsSL https://experimental.docker.com/ | sh'
-# or:
-# 'wget -qO- https://experimental.docker.com/ | sh'
-#
-# Docker Maintainers:
-# To update this script on https://get.docker.com,
-# use hack/release.sh during a normal release,
-# or the following one-liner for script hotfixes:
-# aws s3 cp --acl public-read hack/install.sh s3://get.docker.com/index
-#
-
-url="https://get.docker.com/"
-apt_url="https://apt.dockerproject.org"
-yum_url="https://yum.dockerproject.org"
-gpg_fingerprint="58118E89F3A912897C070ADBF76221572C52609D"
-
-key_servers="
-ha.pool.sks-keyservers.net
-pgp.mit.edu
-keyserver.ubuntu.com
-"
-
-command_exists() {
- command -v "$@" > /dev/null 2>&1
-}
-
-semverParse() {
- major="${1%%.*}"
- minor="${1#$major.}"
- minor="${minor%%.*}"
- patch="${1#$major.$minor.}"
- patch="${patch%%[-.]*}"
-}
-
-do_install() {
- case "$(uname -m)" in
- *64)
- ;;
- *)
- cat >&2 <<-'EOF'
- Error: you are not using a 64bit platform.
- Docker currently only supports 64bit platforms.
- EOF
- exit 1
- ;;
- esac
-
- user="$(id -un 2>/dev/null || true)"
-
- sh_c='sh -c'
- if [ "$user" != 'root' ]; then
- if command_exists sudo; then
- sh_c='sudo -E sh -c'
- elif command_exists su; then
- sh_c='su -c'
- else
- cat >&2 <<-'EOF'
- Error: this installer needs the ability to run commands as root.
- We are unable to find either "sudo" or "su" available to make this happen.
- EOF
- exit 1
- fi
- fi
-
- curl=''
- if command_exists curl; then
- curl='curl -sSL'
- elif command_exists wget; then
- curl='wget -qO-'
- elif command_exists busybox && busybox --list-modules | grep -q wget; then
- curl='busybox wget -qO-'
- fi
-
- # check to see which repo they are trying to install from
- if [ -z "$repo" ]; then
- repo='main'
- if [ "https://test.docker.com/" = "$url" ]; then
- repo='testing'
- elif [ "https://experimental.docker.com/" = "$url" ]; then
- repo='experimental'
- fi
- fi
-
- # perform some very rudimentary platform detection
- lsb_dist=''
- dist_version=''
- if command_exists lsb_release; then
- lsb_dist="$(lsb_release -si)"
- fi
- if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then
- lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")"
- fi
- if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then
- lsb_dist='debian'
- fi
- if [ -z "$lsb_dist" ] && [ -r /etc/fedora-release ]; then
- lsb_dist='fedora'
- fi
- if [ -z "$lsb_dist" ] && [ -r /etc/oracle-release ]; then
- lsb_dist='oracleserver'
- fi
- if [ -z "$lsb_dist" ]; then
- if [ -r /etc/centos-release ] || [ -r /etc/redhat-release ]; then
- lsb_dist='centos'
- fi
- fi
- if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then
- lsb_dist="$(. /etc/os-release && echo "$ID")"
- fi
-
- lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')"
-
- case "$lsb_dist" in
-
- ubuntu)
- if command_exists lsb_release; then
- dist_version="$(lsb_release --codename | cut -f2)"
- fi
- if [ -z "$dist_version" ] && [ -r /etc/lsb-release ]; then
- dist_version="$(. /etc/lsb-release && echo "$DISTRIB_CODENAME")"
- fi
- ;;
-
- debian)
- dist_version="$(cat /etc/debian_version | sed 's/\/.*//' | sed 's/\..*//')"
- case "$dist_version" in
- 8)
- dist_version="jessie"
- ;;
- 7)
- dist_version="wheezy"
- ;;
- esac
- ;;
-
- oracleserver)
- # need to switch lsb_dist to match yum repo URL
- lsb_dist="oraclelinux"
- dist_version="$(rpm -q --whatprovides redhat-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//')"
- ;;
-
- fedora|centos)
- dist_version="$(rpm -q --whatprovides redhat-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//')"
- ;;
-
- *)
- if command_exists lsb_release; then
- dist_version="$(lsb_release --codename | cut -f2)"
- fi
- if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then
- dist_version="$(. /etc/os-release && echo "$VERSION_ID")"
- fi
- ;;
-
-
- esac
-
-
- # Run setup for each distro accordingly
- case "$lsb_dist" in
- ubuntu|debian)
- export DEBIAN_FRONTEND=noninteractive
-
- did_apt_get_update=
- apt_get_update() {
- if [ -z "$did_apt_get_update" ]; then
- ( set -x; $sh_c 'sleep 3; apt-get update' )
- did_apt_get_update=1
- fi
- }
-
- # aufs is preferred over devicemapper; try to ensure the driver is available.
- if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then
- if uname -r | grep -q -- '-generic' && dpkg -l 'linux-image-*-generic' | grep -qE '^ii|^hi' 2>/dev/null; then
- kern_extras="linux-image-extra-$(uname -r) linux-image-extra-virtual"
-
- apt_get_update
- ( set -x; $sh_c 'sleep 3; apt-get install -y -q '"$kern_extras" ) || true
-
- if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then
- echo >&2 'Warning: tried to install '"$kern_extras"' (for AUFS)'
- echo >&2 ' but we still have no AUFS. Docker may not work. Proceeding anyways!'
- ( set -x; sleep 10 )
- fi
- else
- echo >&2 'Warning: current kernel is not supported by the linux-image-extra-virtual'
- echo >&2 ' package. We have no AUFS support. Consider installing the packages'
- echo >&2 ' linux-image-virtual kernel and linux-image-extra-virtual for AUFS support.'
- ( set -x; sleep 10 )
- fi
- fi
-
- # install apparmor utils if they're missing and apparmor is enabled in the kernel
- # otherwise Docker will fail to start
- if [ "$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null)" = 'Y' ]; then
- if command -v apparmor_parser >/dev/null 2>&1; then
- echo 'apparmor is enabled in the kernel and apparmor utils were already installed'
- else
- echo 'apparmor is enabled in the kernel, but apparmor_parser missing'
- apt_get_update
- ( set -x; $sh_c 'sleep 3; apt-get install -y -q apparmor' )
- fi
- fi
-
- if [ ! -e /usr/lib/apt/methods/https ]; then
- apt_get_update
- ( set -x; $sh_c 'sleep 3; apt-get install -y -q apt-transport-https ca-certificates' )
- fi
- if [ -z "$curl" ]; then
- apt_get_update
- ( set -x; $sh_c 'sleep 3; apt-get install -y -q curl ca-certificates' )
- curl='curl -sSL'
- fi
- (
- set -x
- for key_server in $key_servers ; do
- $sh_c "apt-key adv --keyserver hkp://${key_server}:80 --recv-keys ${gpg_fingerprint}" && break
- done
- $sh_c "apt-key adv -k ${gpg_fingerprint} >/dev/null"
- $sh_c "mkdir -p /etc/apt/sources.list.d"
- $sh_c "echo deb [arch=$(dpkg --print-architecture)] ${apt_url}/repo ${lsb_dist}-${dist_version} ${repo} > /etc/apt/sources.list.d/docker.list"
- $sh_c 'sleep 3; apt-get update'
- if [ -z "$DOCKER_VERSION" ]; then
- $sh_c 'apt-get -o Dpkg::Options::="--force-confnew" install -y -q docker-engine'
- else
- $sh_c "apt-get -o Dpkg::Options::=\"--force-confnew\" install -y -q docker-engine=$DOCKER_VERSION"
- fi
- )
- exit 0
- ;;
-
- fedora|centos|oraclelinux)
- $sh_c "cat >/etc/yum.repos.d/docker-${repo}.repo" <<-EOF
- [docker-${repo}-repo]
- name=Docker ${repo} Repository
- baseurl=${yum_url}/repo/${repo}/${lsb_dist}/${dist_version}
- enabled=1
- gpgcheck=1
- gpgkey=${yum_url}/gpg
- EOF
- if [ "$lsb_dist" = "fedora" ] && [ "$dist_version" -ge "22" ]; then
- (
- set -x
- $sh_c 'sleep 3; dnf -y -q install docker-engine'
- )
- else
- (
- set -x
- $sh_c 'sleep 3; yum -y -q install docker-engine'
- )
- fi
- exit 0
- ;;
- gentoo)
- if [ "$url" = "https://test.docker.com/" ]; then
- # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output
- cat >&2 <<-'EOF'
-
- You appear to be trying to install the latest nightly build in Gentoo.'
- The portage tree should contain the latest stable release of Docker, but'
- if you want something more recent, you can always use the live ebuild'
- provided in the "docker" overlay available via layman. For more'
- instructions, please see the following URL:'
-
- https://github.com/tianon/docker-overlay#using-this-overlay'
-
- After adding the "docker" overlay, you should be able to:'
-
- emerge -av =app-emulation/docker-9999'
-
- EOF
- exit 1
- fi
-
- (
- set -x
- $sh_c 'sleep 3; emerge app-emulation/docker'
- )
- exit 0
- ;;
- esac
-
- # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output
- cat >&2 <<-'EOF'
-
- Either your platform is not easily detectable, is not supported by this
- installer script (yet - PRs welcome! [hack/install.sh]), or does not yet have
- a package for Docker. Please visit the following URL for more detailed
- installation instructions:
-
- https://docs.docker.com/engine/installation/
-
- EOF
- exit 1
-}
-
-# wrapped up in a function so that we have some protection against only getting
-# half the file during "curl | sh"
-do_install
diff --git a/.travis/travis-after-success.sh b/.travis/travis-after-success.sh
deleted file mode 100755
index 695358122..000000000
--- a/.travis/travis-after-success.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env bash
-
-if [[ $CODECOV == "true" ]]; then
- codecov
-fi
-
-if [[ $TRAVIS_BRANCH == "master" ]] && [[ $TRAVIS_PULL_REQUEST == "false" ]] && [[ $DEPLOY == "true" ]];
-then
- cat <> ~/settings.xml
-
-
-
- ossrh
- \${env.OSSRH_USER}
- \${env.OSSRH_PASS}
-
-
-
-EOF
- mvn deploy -DskipITs --settings ~/settings.xml
- fi
diff --git a/.travis/travis-before-install.sh b/.travis/travis-before-install.sh
deleted file mode 100755
index e86654511..000000000
--- a/.travis/travis-before-install.sh
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env bash
-
-SWARM_VERSION="${SWARM_VERSION:-}"
-FAST_BUILD="${FAST_BUILD:-}"
-
-## fix coverity issue
-sudo apt-get install -y -q ca-certificates
-echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
-##
-
-if [ "$FAST_BUILD" == "true" ]; then
- echo "Fast build, skipping docker installations."
- exit 0
-fi
-
-set -exu
-
-sudo ip a ls
-sudo ip r ls
-sudo ss -antpl
-
-export HOST_PORT="2375"
-export SWARM_PORT="2377"
-export HOST_IP="$(ip a show dev eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)"
-# because of swarm use docker-engine directly
-export PRE_DOCKER_HOST="$DOCKER_HOST"
-export DOCKER_HOST="tcp://127.0.0.1:${HOST_PORT}"
-
-
-docker info
-docker version
-
-sudo -E apt-get update
-sudo -E apt-get install -q -y wget
-sudo -E apt-get -q -y --purge remove docker-engine
-sudo -E apt-cache policy docker-engine
-
-./.travis/get-docker-com.sh
-
-sudo -E stop docker
-
-#mkdir "${HOME}/.cache" || :
-#pushd "${HOME}/.cache"
-# wget -N "https://apt.dockerproject.org/repo/pool/main/d/docker-engine/docker-engine_${DOCKER_VERSION}_amd64.deb"
-# sudo apt-get -f install
-# sudo dpkg -i "$(ls *${DOCKER_VERSION}*)"
-#popd
-rm -f "src/test/resources/logback.xml"
-#rm -f "src/test/resources/travis-logback.xml"
-mv "src/test/resources/travis-logback.xml" "src/test/resources/logback-test.xml"
-
-# https://github.com/docker/docker/issues/18113
-sudo rm /var/lib/docker/network/files/local-kv.db
-
-sudo cat /etc/default/docker
-
-cat << EOF | sudo tee /etc/default/docker
-DOCKER_OPTS="\
---dns 8.8.8.8 \
---dns 8.8.4.4 \
--D \
--H=unix:///var/run/docker.sock \
--H=tcp://0.0.0.0:${HOST_PORT} \
---label=com.github.dockerjava.test=docker-java \
-"
-EOF
-
-sudo cat /etc/default/docker
-sudo bash -c ':> /var/log/upstart/docker.log'
-
-date
-sudo -E start docker
-
-tries=20
-sleep=5
-for i in $(seq 1 $tries); do
- if sudo grep "API listen on" /var/log/upstart/docker.log ; then
- echo "Docker started. Delay $(($i * $sleep))"
- break
- elif [[ $i -ge $tries ]]; then
- echo "Docker didn't start. Exiting!"
- sudo cat /var/log/upstart/docker.log
- exit 1
- else
- echo "Docker didn't start, sleeping for 5 secs..."
- sleep $sleep
- fi
-done
-
-
-sudo ss -antpl
-
-curl -V
-
-docker version || sudo cat /var/log/upstart/docker.log
-docker info
-
-set +u
-
-cat < "${HOME}/.docker-java.properties"
-registry.username=${registry_username}
-registry.password=${registry_password}
-registry.email=${registry_email}
-registry.url=https://index.docker.io/v1/
-
-EOF
-
-if [[ -n $SWARM_VERSION ]]; then
-# export SWARM_PORT="${PRE_DOCKER_HOST##*:}"
-
- docker pull swarm
-
-# # kv store https://docs.docker.com/v1.11/engine/userguide/networking/get-started-overlay/
-# docker run -d \
-# -p "8500:8500" \
-# -h "consul" \
-# --name=consul \
-# progrium/consul -server -bootstrap
-#
-# sleep 5
-
-# SWARM_TOKEN=$(docker run swarm c)
-
-# docker run \
-# -d \
-# --name=swarm_manager \
-# -p ${SWARM_PORT}:2375 \
-# "swarm:${SWARM_VERSION}" \
-# manage token://${SWARM_TOKEN}
-
- docker run \
- -d \
- -p ${SWARM_PORT}:2375 \
- --name=swarm_manager \
- swarm manage --engine-refresh-min-interval "3s" --engine-refresh-max-interval "6s" "nodes://${HOST_IP}:${HOST_PORT}"
-# swarm manage --engine-refresh-min-interval "3s" --engine-refresh-max-interval "6s" "consul://${HOST_IP}:8500"
-
- # join engine to swarm
- docker run \
- -d \
- "--name=swarm_join" \
- "swarm:${SWARM_VERSION}" \
- join --advertise="${HOST_IP}:${HOST_PORT}" --delay="0s" --heartbeat "5s" "nodes://${HOST_IP}:${HOST_PORT}"
-# join --advertise="${HOST_IP}:${HOST_PORT}" --delay="0s" --heartbeat "5s" "token://${SWARM_TOKEN}"
-
- docker run --rm \
- "swarm:${SWARM_VERSION}" list "nodes://${HOST_IP}:${HOST_PORT}"
-
- docker ps -a
- sudo ss -antpl
-
- sleep 30
-
- docker logs swarm_join
- docker logs swarm_manager
-# docker logs consul
-
- # switch to swarm connection
- DOCKER_HOST="$PRE_DOCKER_HOST"
-
- docker version
- docker info
-
- NODES=$(docker info | grep "Nodes:" | awk '{ print $2 }')
- if [[ $NODES -eq "0" ]]; then
- echo "Swarm didn't connect"
- exit 1
- fi
-
- # test via swarm
- docker pull busybox
-fi
diff --git a/.travis/travis-script.sh b/.travis/travis-script.sh
deleted file mode 100755
index 1cdc84fa5..000000000
--- a/.travis/travis-script.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env bash
-
-
-
-IS_COVERITY_SCAN_BRANCH=`ruby -e "puts '${TRAVIS_BRANCH}' =~ /\\A$COVERITY_SCAN_BRANCH_PATTERN\\z/ ? 1 : 0"`
-
-export COVERITY_ALLOWED=true
-# Verify upload is permitted
-AUTH_RES=`curl -s --form project="$COVERITY_SCAN_PROJECT_NAME" --form token="$COVERITY_SCAN_TOKEN" $SCAN_URL/api/upload_permitted`
-if [ "$AUTH_RES" = "Access denied" ]; then
- echo -e "\033[33;1mCoverity Scan API access denied. Check COVERITY_SCAN_PROJECT_NAME and COVERITY_SCAN_TOKEN.\033[0m"
- COVERITY_ALLOWED=false
-else
- AUTH=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['upload_permitted']"`
- if [ "$AUTH" = "true" ]; then
- echo -e "\033[33;1mCoverity Scan analysis authorized per quota.\033[0m"
- else
- WHEN=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['next_upload_permitted_at']"`
- echo -e "\033[33;1mCoverity Scan analysis NOT authorized until $WHEN.\033[0m"
-
- COVERITY_ALLOWED=false
- fi
-fi
-
-set -ex
-
-if [ "${FAST_BUILD}" == "true" ]; then
- if [ "$TRAVIS_PULL_REQUEST" == "false" ] &&
- [ "$COVERITY" == "true" ] &&
- [ "$IS_COVERITY_SCAN_BRANCH" = "1" ] &&
- [ "$COVERITY_ALLOWED" == "true" ]; then
- export COVERITY_SCAN_BUILD_COMMAND="mvn package"
- #curl -s "https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh" | bash
- ./.travis/travisci_build_coverity_scan.sh
- else
- mvn package
- fi
-else
- if [ "$TRAVIS_PULL_REQUEST" == "false" ] &&
- [ "$COVERITY" == "true" ] &&
- [ "$IS_COVERITY_SCAN_BRANCH" = "1" ] &&
- [ "$COVERITY_ALLOWED" == "true" ]; then
- export COVERITY_SCAN_BUILD_COMMAND="mvn verify"
- #curl -s "https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh" | bash
- ./.travis/travisci_build_coverity_scan.sh
- else
- mvn verify
- fi
-fi
diff --git a/.travis/travisci_build_coverity_scan.sh b/.travis/travisci_build_coverity_scan.sh
deleted file mode 100755
index 074d0a46f..000000000
--- a/.travis/travisci_build_coverity_scan.sh
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# Environment check
-echo -e "\033[33;1mNote: COVERITY_SCAN_PROJECT_NAME and COVERITY_SCAN_TOKEN are available on Project Settings page on scan.coverity.com\033[0m"
-[ -z "$COVERITY_SCAN_PROJECT_NAME" ] && echo "ERROR: COVERITY_SCAN_PROJECT_NAME must be set" && exit 1
-[ -z "$COVERITY_SCAN_NOTIFICATION_EMAIL" ] && echo "ERROR: COVERITY_SCAN_NOTIFICATION_EMAIL must be set" && exit 1
-[ -z "$COVERITY_SCAN_BRANCH_PATTERN" ] && echo "ERROR: COVERITY_SCAN_BRANCH_PATTERN must be set" && exit 1
-[ -z "$COVERITY_SCAN_BUILD_COMMAND" ] && echo "ERROR: COVERITY_SCAN_BUILD_COMMAND must be set" && exit 1
-[ -z "$COVERITY_SCAN_TOKEN" ] && echo "ERROR: COVERITY_SCAN_TOKEN must be set" && exit 1
-
-PLATFORM=`uname`
-TOOL_ARCHIVE=/tmp/coverity-cache/cov-analysis-${PLATFORM}.tgz
-TOOL_URL=https://scan.coverity.com/download/${PLATFORM}
-TOOL_BASE=/tmp/coverity-scan-analysis
-UPLOAD_URL="https://scan.coverity.com/builds"
-SCAN_URL="https://scan.coverity.com"
-
-# Do not run on pull requests
-if [ "${TRAVIS_PULL_REQUEST}" = "true" ]; then
- echo -e "\033[33;1mINFO: Skipping Coverity Analysis: branch is a pull request.\033[0m"
- exit 0
-fi
-
-# Verify this branch should run
-IS_COVERITY_SCAN_BRANCH=`ruby -e "puts '${TRAVIS_BRANCH}' =~ /\\A$COVERITY_SCAN_BRANCH_PATTERN\\z/ ? 1 : 0"`
-if [ "$IS_COVERITY_SCAN_BRANCH" = "1" ]; then
- echo -e "\033[33;1mCoverity Scan configured to run on branch ${TRAVIS_BRANCH}\033[0m"
-else
- echo -e "\033[33;1mCoverity Scan NOT configured to run on branch ${TRAVIS_BRANCH}\033[0m"
- exit 1
-fi
-
-# Verify upload is permitted
-AUTH_RES=`curl -s --form project="$COVERITY_SCAN_PROJECT_NAME" --form token="$COVERITY_SCAN_TOKEN" $SCAN_URL/api/upload_permitted`
-if [ "$AUTH_RES" = "Access denied" ]; then
- echo -e "\033[33;1mCoverity Scan API access denied. Check COVERITY_SCAN_PROJECT_NAME and COVERITY_SCAN_TOKEN.\033[0m"
- exit 1
-else
- AUTH=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['upload_permitted']"`
- if [ "$AUTH" = "true" ]; then
- echo -e "\033[33;1mCoverity Scan analysis authorized per quota.\033[0m"
- else
- WHEN=`echo $AUTH_RES | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['next_upload_permitted_at']"`
- echo -e "\033[33;1mCoverity Scan analysis NOT authorized until $WHEN.\033[0m"
-
- exit 1
- fi
-fi
-
-mkdir -p /tmp/coverity-cache || :
-
-if [ ! -d $TOOL_BASE ]; then
-
- # verify that binary is right
- if file $TOOL_ARCHIVE | grep HTML ; then
- echo "Removing $TOOL_ARCHIVE"
- rm -f $TOOL_ARCHIVE
- fi
-
- # Download Coverity Scan Analysis Tool
- if [ ! -e $TOOL_ARCHIVE ]; then
- echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m"
- wget -nv -N -O $TOOL_ARCHIVE $TOOL_URL --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=$COVERITY_SCAN_TOKEN"
- fi
-
- # Extract Coverity Scan Analysis Tool
- echo -e "\033[33;1mExtracting Coverity Scan Analysis Tool...\033[0m"
- mkdir -p $TOOL_BASE
- pushd $TOOL_BASE
- du -sh $TOOL_ARCHIVE
- file $TOOL_ARCHIVE
- file $TOOL_ARCHIVE | grep HTML && cat $TOOL_ARCHIVE || :
- ls -la $TOOL_ARCHIVE
- tar -xf $TOOL_ARCHIVE #|& grep -v "Ignoring unknown extended header keyword"
- popd
-fi
-
-TOOL_DIR=`find $TOOL_BASE -type d -name 'cov-analysis*'`
-export PATH=$TOOL_DIR/bin:$PATH
-
-# Build
-echo -e "\033[33;1mRunning Coverity Scan Analysis Tool...\033[0m"
-COV_BUILD_OPTIONS=""
-#COV_BUILD_OPTIONS="--return-emit-failures 8 --parse-error-threshold 85"
-RESULTS_DIR="cov-int"
-eval "${COVERITY_SCAN_BUILD_COMMAND_PREPEND}"
-COVERITY_UNSUPPORTED=1 cov-build --dir $RESULTS_DIR $COV_BUILD_OPTIONS $COVERITY_SCAN_BUILD_COMMAND
-cov-import-scm --dir $RESULTS_DIR --scm git --log $RESULTS_DIR/scm_log.txt 2>&1
-
-# Upload results
-echo -e "\033[33;1mTarring Coverity Scan Analysis results...\033[0m"
-RESULTS_ARCHIVE=analysis-results.tgz
-tar czf $RESULTS_ARCHIVE $RESULTS_DIR
-SHA=`git rev-parse --short HEAD`
-
-echo -e "\033[33;1mUploading Coverity Scan Analysis results...\033[0m"
-response=$(curl \
- --silent --write-out "\n%{http_code}\n" \
- --form project=$COVERITY_SCAN_PROJECT_NAME \
- --form token=$COVERITY_SCAN_TOKEN \
- --form email=$COVERITY_SCAN_NOTIFICATION_EMAIL \
- --form file=@$RESULTS_ARCHIVE \
- --form version=$SHA \
- --form description="Travis CI build" \
- $UPLOAD_URL)
-status_code=$(echo "$response" | sed -n '$p')
-if [ "$status_code" != "201" ]; then
- TEXT=$(echo "$response" | sed '$d')
- echo -e "\033[33;1mCoverity Scan upload failed: $TEXT.\033[0m"
- exit 1
-fi
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ab76bd2a..5d344d93b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,94 @@
Change Log
===
-## 3.1.0 WIP
+
+
+## 3.2.0
+- **Changelog is not maintained in this file. Please follow git diff or github releases.**
+- Library was split into multiple modules to get ability to choose transports.
+Okhttp was added (say thanks to @bsideup).
+- Various cleanup, tests de-duplication internally. Planned binary compatibility breakage was reverted by @testcontainers project, so migration should work smoothly. Please switch to non-deprecated methods.
+- Appeared various new commands and Fields(command options for existing commands).
+
+## 3.1.2
+- update unix-socket to 2.2.0
+- Remove `JacksonJaxbJsonProvider` from `FiltersEncoder`
+- BuildImageCmdImpl: Fix an exception message
+- Add support for target parameter in BuildImgCmd
+- Add prune operations
+- Updating Jackson due to CVEs
+- Make StatsConfig public
+- Set 3 mb as limit for json responce.
+
+## 3.1.1
+- Patch save image with tag
+- [api/healthcheck] startPeriod is now a long
+
+## 3.1.0
+- Release
+
+## 3.1.0-rc-8
+- Do awaitCompletion upon socket close exception
+- Fix `X-Registry-Auth` base64 encoding
+
+## 3.1.0-rc-7
+- Fix NPE when docker config file doesn't exist
+
+## 3.1.0-rc-6
+- Add resize feature to container and exec
+- Update part of apis to 1.37
+- Update dependencies
+- Fix No serializer found for class com.githubdockerjava.api.model.ServiceGlobalModeOptions
+- Add HostConfig.StorageOpt and ExecCreateCmd.Env
+- Added GCPLOGS enum LoggingType
+- Stop proxying HostConfig class (static helper provided)
+- Add ExecCreateCmd.Env
+- Add failcnt into memorystatsconfig
+- Support some missing Engine APIs
+- Added memory swappiness to create container command.
+- Fix for ignore all files except specified
+
+## 3.1.0-rc-5
+- Add missing properties in InspectContainer response
+- Add withFilter methods in ListNetworksCmd & ListVolumesCmd
+- Add WorkingDir property in containers exec
+- Add isolation property support in Info response
+- Support platform option in image build/create/pull commands
+- Add OSVersion and RootFS support in InspectImageResponse
+- Fix double-marshalling of cachefrom
+- make AuthConfig compatible with indentitytoken
+- Allow netty to handle compressed response bodies
+
+## 3.1.0-rc-4
+- Update deps
+- fix HTTP/1.1 compliance (missing Host header)
+- support rollback_completed value in ServiceUpdateState
+- Add Privileged property to ExecCreateCmd
+- Encode spaces as %20 rather than + in URL params
+- Add tmpfs mount support since v1.29
+- Add support for swarm service/task logs
+- Add mapping annotations to custom constructor
+- Support network mode as part of the docker build
+- support "rollback" as value for UpdateFailureAction
+- Add "Pid" field to InspectExecResponse
+- Add DiskQuota to HostConfig and CreateContainerCmd
+- Add AutoRemove to HostConfig
+- follow symbolic links when walking dir
+- Use path from the configured docker host instead of hardcoded "/var/run/docker.sock" in netty factory
+- Configure JerseyDockerCmdExecFactory to avoid chunked encoding
+
+## 3.1.0-rc-3
+- export TmpFs configuration for HostConfig and DockerClient
+- avoid double encoding for url query string
+
+## 3.1.0-rc-2
+- https://github.com/docker-java/docker-java/pulls?q=is%3Apr+milestone%3A3.1.0-rc-2+is%3Aclosed
+
+## 3.1.0-rc-1
+ A lot of changes...
- Swarm Mode support.
- Classic swarm support.
+- various netty improvements
+- Implement AbstractDockerCmdExecFactory
## 3.0.14
@@ -215,7 +301,7 @@ v2.0.0
Release notes
* Some commands APIs has been changed to be callback-driven now to simplify the processing of the result streams for the client application. This affects namely the events, stats, log, attach, build, push and pull commands. Look at the Wiki how to [process events](https://github.com/docker-java/docker-java/wiki#handle-events) or how to [build an image](https://github.com/docker-java/docker-java/wiki#build-image-from-dockerfile) from dockerfile for example.
-* The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmatically](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/master/src/test/resources/logback.xml) configuration file in the classpath.
+* The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmatically](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/main/src/test/resources/logback.xml) configuration file in the classpath.
All changes
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 000000000..5072b0864
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,58 @@
+# Build with Maven
+
+#### Prerequisites:
+
+* Java min 1.8
+* Maven 3
+
+Build and run integration tests as follows:
+
+ $ mvn clean install
+
+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 the docker engine is using local UNIX sockets for communication with the docker CLI so docker-java
+client also uses UNIX domain sockets to connect to the docker daemon by default. To make the docker daemon listening on a TCP (http/https) port you have to configure it by setting the DOCKER_OPTS environment variable to something like the following:
+
+ DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"
+
+More details about setting up Docker Engine can be found in the official documentation: https://docs.docker.com/engine/admin/
+
+To force docker-java to use TCP (http) configure the following (see [Configuration](https://github.com/docker-java/docker-java#configuration) for details):
+
+ DOCKER_HOST=tcp://127.0.0.1:2375
+
+For secure tls (https) communication:
+
+ DOCKER_HOST=tcp://127.0.0.1:2376
+ DOCKER_TLS_VERIFY=1
+ DOCKER_CERT_PATH=/Users/marcus/.docker/machine/machines/docker-1.11.2
+
+
+# Code Design
+ * Model is based on Objects and not primitives that allows nullify requests and have null values for data
+ that wasn't provided by docker daemon.
+ * For null safeness findbugs annotations are used.
+ ** Every method that may return `null` (and we are unsure in any fields as docker daemon may change something)
+ should be annotated with `@CheckForNull` return qualifier from `javax.annotation` package.
+ ** Methods that can't return `null` must be annotated with `@Nonnull`.
+ ** The same for Arguments.
+ ** `@Nullable` must be used only for changing inherited (other typed) qualifier.
+ * Setters in builder style must be prefixed with `withXX`.
+ * All classes should provide `toString()` `equals()` and `hashCode()` defined methods.
+ * Javadocs
+ ** Provide full information on field:
+ *** For models define API version with `@since {@link RemoteApiVersion#VERSION_1_X}`.
+ ** getters/setters should refernce to field `@see #$field`.
+ * If it is `Serializable` it shall have a `serialVersionUID` field. Unless code has shipped to users, the initial value of the `serialVersionUID` field shall be `1L`.
+
+# Coding style
+ * Some initial styling already enforced with checkstyle. Please aim for consistency with the existing code.
+
+# Testing
+ * Unit tests for serder (serialization-deserialization).
+ * Integration tests for commands.
+ * If model object has builders, then fill it with data and compare by `equals()` with expected response
+ from docker daemon. If failed, then some fields mappings are wrong.
\ No newline at end of file
diff --git a/README.md b/README.md
index c3dc39825..b1fa9c89e 100644
--- a/README.md
+++ b/README.md
@@ -1,142 +1,9 @@
[](https://gitter.im/docker-java/docker-java?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](https://mvnrepository.com/artifact/com.github.docker-java/docker-java)
-[](https://bintray.com/kostyasha/maven/com.github.docker-java%3Adocker-java/_latestVersion)
-[](https://www.versioneye.com/java/com.github.docker-java:docker-java/references)
-[](https://travis-ci.org/docker-java/docker-java)
-[](https://scan.coverity.com/projects/9177)
-[](http://codecov.io/github/docker-java/docker-java?branch=master)
-[](https://github.com/docker-java/docker-java/blob/master/LICENSE)
-
-
+[](http://codecov.io/github/docker-java/docker-java?branch=master)
+[](https://github.com/docker-java/docker-java/blob/main/LICENSE)
# docker-java
Java API client for [Docker](http://docs.docker.io/ "Docker")
-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/?#!forum/docker-java-dev "docker-java")
-
-[Changelog](https://github.com/docker-java/docker-java/blob/master/CHANGELOG.md)
-[Wiki](https://github.com/docker-java/docker-java/wiki)
-
-## Build with Maven
-
-###### Prerequisites:
-
-* Java min 1.7
-* Maven 3
-
-Build and run integration tests as follows:
-
- $ mvn clean install
-
-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 the docker engine is using local UNIX sockets for communication with the docker CLI so docker-java
-client also uses UNIX domain sockets to connect to the docker daemon by default. To make the docker daemon listening on a TCP (http/https) port you have to configure it by setting the DOCKER_OPTS environment variable to something like the following:
-
- DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"
-
-More details about setting up Docker Engine can be found in the official documentation: https://docs.docker.com/engine/admin/
-
-To force docker-java to use TCP (http) configure the following (see [Configuration](https://github.com/docker-java/docker-java#configuration) for details):
-
- DOCKER_HOST=tcp://127.0.0.1:2375
-
-For secure tls (https) communication:
-
- DOCKER_HOST=tcp://127.0.0.1:2376
- DOCKER_TLS_VERIFY=1
- DOCKER_CERT_PATH=/Users/marcus/.docker/machine/machines/docker-1.11.2
-
-### Latest release version
-Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/api/v1.23.md), Docker Server version 1.11.x
-
-
- com.github.docker-java
- docker-java
-
- 3.X.Y
-
-
-### Latest development version
-Supports a subset of the Docker Remote API [v1.23](https://github.com/docker/docker/blob/master/docs/api/v1.23.md), Docker Server version 1.11.x
-
-You can find the latest development version including javadoc and source files on [Sonatypes OSS repository](https://oss.sonatype.org/content/groups/public/com/github/docker-java/docker-java/).
-
-
- com.github.docker-java
- docker-java
- 3.X.Y-SNAPSHOT
-
-
-
-## Documentation
-
-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:
-
-* `DOCKER_HOST` The Docker Host URL, e.g. `tcp://localhost:2376` or `unix:///var/run/docker.sock`
-* `DOCKER_TLS_VERIFY` enable/disable TLS verification (switch between `http` and `https` protocol)
-* `DOCKER_CERT_PATH` Path to the certificates needed for TLS verification
-* `DOCKER_CONFIG` Path for additional docker configuration files (like `.dockercfg`)
-* `api.version` The API version, e.g. `1.23`.
-* `registry.url` Your registry's address.
-* `registry.username` Your registry username (required to push containers).
-* `registry.password` Your registry password.
-* `registry.email` Your registry email.
-
-There are three ways to configure, in descending order of precedence:
-
-#### Programmatic:
-In your application, e.g.
-
- DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
- .withDockerHost("tcp://my-docker-host.tld:2376")
- .withDockerTlsVerify(true)
- .withDockerCertPath("/home/user/.docker/certs")
- .withDockerConfig("/home/user/.docker")
- .withApiVersion("1.23")
- .withRegistryUrl("https://index.docker.io/v1/")
- .withRegistryUsername("dockeruser")
- .withRegistryPassword("ilovedocker")
- .withRegistryEmail("dockeruser@github.com")
- .build();
- DockerClient docker = DockerClientBuilder.getInstance(config).build();
-
-#### Properties (docker-java.properties)
-
- DOCKER_HOST=tcp://localhost:2376
- DOCKER_TLS_VERIFY=1
- DOCKER_CERT_PATH=/home/user/.docker/certs
- DOCKER_CONFIG=/home/user/.docker
- api.version=1.23
- registry.url=https://index.docker.io/v1/
- registry.username=dockeruser
- registry.password=ilovedocker
- registry.email=dockeruser@github.com
-
-##### System Properties:
-
- java -DDOCKER_HOST=tcp://localhost:2375 -Dregistry.username=dockeruser pkg.Main
-
-##### System Environment
-
- export DOCKER_HOST=tcp://localhost:2376
- export DOCKER_TLS_VERIFY=1
- export DOCKER_CERT_PATH=/home/user/.docker/certs
- export DOCKER_CONFIG=/home/user/.docker
-
-##### File System
-
-In `$HOME/.docker-java.properties`
-
-##### Class Path
-
-In the class path at `/docker-java.properties`
-
+# [Read the documentation here](docs/README.md)
diff --git a/circle.sh b/circle.sh
index c84ca3fe6..b5b7cdbb0 100755
--- a/circle.sh
+++ b/circle.sh
@@ -6,7 +6,7 @@ case "$1" in
mkdir .docker
cp $CIRCLE_PROJECT_REPONAME/etc/certs/* .docker
- # configure docker deamon to use SSL and provide the path to the certificates
+ # configure docker daemon to use SSL and provide the path to the certificates
docker_opts='DOCKER_OPTS="$DOCKER_OPTS -H tcp://127.0.0.1:2376 --tlsverify --tlscacert='$HOME'/.docker/ca.pem --tlscert='$HOME'/.docker/server-cert.pem --tlskey='$HOME'/.docker/server-key.pem"'
sudo sh -c "echo '$docker_opts' >> /etc/default/docker"
diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml
new file mode 100644
index 000000000..dda682ab1
--- /dev/null
+++ b/docker-java-api/pom.xml
@@ -0,0 +1,102 @@
+
+ 4.0.0
+
+
+ com.github.docker-java
+ docker-java-parent
+ 0-SNAPSHOT
+ ../pom.xml
+
+
+ docker-java-api
+ jar
+
+ docker-java-api
+ https://github.com/docker-java/docker-java
+ Java API Client for Docker
+
+
+ com.github.dockerjava.api
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.20
+
+
+
+ org.slf4j
+ slf4j-api
+ ${slf4j-api.version}
+
+
+
+ com.google.code.findbugs
+ annotations
+ 3.0.1u2
+ provided
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.38
+ provided
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.13.4
+ test
+
+
+
+ com.tngtech.archunit
+ archunit-junit5
+ 1.4.1
+ test
+
+
+
+ com.tngtech.archunit
+ archunit
+ 0.18.0
+ test
+
+
+
+
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ true
+
+
+ com.github.dockerjava.api.*
+
+
+
+
+ com.github.siom79.japicmp
+ japicmp-maven-plugin
+
+
+
+ com.github.dockerjava.api.command.UpdateContainerCmd#getCpuPeriod()
+ com.github.dockerjava.api.command.UpdateContainerCmd#withCpuPeriod(java.lang.Integer)
+ com.github.dockerjava.api.command.UpdateContainerCmd#getCpuQuota()
+ com.github.dockerjava.api.command.UpdateContainerCmd#withCpuQuota(java.lang.Integer)
+ com.github.dockerjava.api.command.InspectContainerResponse#getSizeRootFs()
+ com.github.dockerjava.api.command.InspectContainerResponse#getSizeRw()
+
+
+
+
+
+
+
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java
new file mode 100644
index 000000000..e5f57e1bb
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java
@@ -0,0 +1,500 @@
+package com.github.dockerjava.api;
+
+import com.github.dockerjava.api.command.AttachContainerCmd;
+import com.github.dockerjava.api.command.AuthCmd;
+import com.github.dockerjava.api.command.BuildImageCmd;
+import com.github.dockerjava.api.command.CommitCmd;
+import com.github.dockerjava.api.command.ConnectToNetworkCmd;
+import com.github.dockerjava.api.command.ContainerDiffCmd;
+import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
+import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
+import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
+import com.github.dockerjava.api.command.CreateConfigCmd;
+import com.github.dockerjava.api.command.CreateContainerCmd;
+import com.github.dockerjava.api.command.CreateImageCmd;
+import com.github.dockerjava.api.command.CreateNetworkCmd;
+import com.github.dockerjava.api.command.CreateSecretCmd;
+import com.github.dockerjava.api.command.CreateServiceCmd;
+import com.github.dockerjava.api.command.CreateVolumeCmd;
+import com.github.dockerjava.api.command.DisconnectFromNetworkCmd;
+import com.github.dockerjava.api.command.EventsCmd;
+import com.github.dockerjava.api.command.ExecCreateCmd;
+import com.github.dockerjava.api.command.ExecStartCmd;
+import com.github.dockerjava.api.command.InfoCmd;
+import com.github.dockerjava.api.command.InitializeSwarmCmd;
+import com.github.dockerjava.api.command.InspectConfigCmd;
+import com.github.dockerjava.api.command.InspectContainerCmd;
+import com.github.dockerjava.api.command.InspectExecCmd;
+import com.github.dockerjava.api.command.InspectImageCmd;
+import com.github.dockerjava.api.command.InspectNetworkCmd;
+import com.github.dockerjava.api.command.InspectServiceCmd;
+import com.github.dockerjava.api.command.InspectSwarmCmd;
+import com.github.dockerjava.api.command.InspectVolumeCmd;
+import com.github.dockerjava.api.command.JoinSwarmCmd;
+import com.github.dockerjava.api.command.KillContainerCmd;
+import com.github.dockerjava.api.command.LeaveSwarmCmd;
+import com.github.dockerjava.api.command.ListConfigsCmd;
+import com.github.dockerjava.api.command.ListContainersCmd;
+import com.github.dockerjava.api.command.ListImagesCmd;
+import com.github.dockerjava.api.command.ListNetworksCmd;
+import com.github.dockerjava.api.command.ListSecretsCmd;
+import com.github.dockerjava.api.command.ListServicesCmd;
+import com.github.dockerjava.api.command.ListSwarmNodesCmd;
+import com.github.dockerjava.api.command.ListTasksCmd;
+import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageAsyncCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
+import com.github.dockerjava.api.command.LogContainerCmd;
+import com.github.dockerjava.api.command.LogSwarmObjectCmd;
+import com.github.dockerjava.api.command.PauseContainerCmd;
+import com.github.dockerjava.api.command.PingCmd;
+import com.github.dockerjava.api.command.PruneCmd;
+import com.github.dockerjava.api.command.PullImageCmd;
+import com.github.dockerjava.api.command.PushImageCmd;
+import com.github.dockerjava.api.command.RemoveConfigCmd;
+import com.github.dockerjava.api.command.RemoveContainerCmd;
+import com.github.dockerjava.api.command.RemoveImageCmd;
+import com.github.dockerjava.api.command.RemoveNetworkCmd;
+import com.github.dockerjava.api.command.RemoveSecretCmd;
+import com.github.dockerjava.api.command.RemoveServiceCmd;
+import com.github.dockerjava.api.command.RemoveSwarmNodeCmd;
+import com.github.dockerjava.api.command.RemoveVolumeCmd;
+import com.github.dockerjava.api.command.RenameContainerCmd;
+import com.github.dockerjava.api.command.ResizeContainerCmd;
+import com.github.dockerjava.api.command.ResizeExecCmd;
+import com.github.dockerjava.api.command.RestartContainerCmd;
+import com.github.dockerjava.api.command.SaveImageCmd;
+import com.github.dockerjava.api.command.SaveImagesCmd;
+import com.github.dockerjava.api.command.SearchImagesCmd;
+import com.github.dockerjava.api.command.StartContainerCmd;
+import com.github.dockerjava.api.command.StatsCmd;
+import com.github.dockerjava.api.command.StopContainerCmd;
+import com.github.dockerjava.api.command.TagImageCmd;
+import com.github.dockerjava.api.command.TopContainerCmd;
+import com.github.dockerjava.api.command.UnpauseContainerCmd;
+import com.github.dockerjava.api.command.UpdateContainerCmd;
+import com.github.dockerjava.api.command.UpdateServiceCmd;
+import com.github.dockerjava.api.command.UpdateSwarmCmd;
+import com.github.dockerjava.api.command.UpdateSwarmNodeCmd;
+import com.github.dockerjava.api.command.VersionCmd;
+import com.github.dockerjava.api.command.WaitContainerCmd;
+import com.github.dockerjava.api.exception.DockerException;
+import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.Identifier;
+import com.github.dockerjava.api.model.PruneType;
+import com.github.dockerjava.api.model.SecretSpec;
+import com.github.dockerjava.api.model.ServiceSpec;
+import com.github.dockerjava.api.model.SwarmSpec;
+
+import javax.annotation.Nonnull;
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+// https://godoc.org/github.com/fsouza/go-dockerclient
+public interface DockerClient extends Closeable {
+
+ AuthConfig authConfig() throws DockerException;
+
+ /**
+ * Authenticate with the server, useful for checking authentication.
+ */
+ AuthCmd authCmd();
+
+ InfoCmd infoCmd();
+
+ PingCmd pingCmd();
+
+ VersionCmd versionCmd();
+
+ /**
+ * * IMAGE API *
+ */
+
+ PullImageCmd pullImageCmd(@Nonnull String repository);
+
+ PushImageCmd pushImageCmd(@Nonnull String name);
+
+ PushImageCmd pushImageCmd(@Nonnull Identifier identifier);
+
+ CreateImageCmd createImageCmd(@Nonnull String repository, @Nonnull InputStream imageStream);
+
+ /**
+ * Loads a tarball with a set of images and tags into a Docker repository.
+ *
+ * Corresponds to POST /images/load API endpoint.
+ *
+ * @param imageStream
+ * stream of the tarball file
+ * @return created command
+ * @since {@link RemoteApiVersion#VERSION_1_7}
+ */
+ LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream);
+
+ LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream);
+
+ SearchImagesCmd searchImagesCmd(@Nonnull String term);
+
+ RemoveImageCmd removeImageCmd(@Nonnull String imageId);
+
+ ListImagesCmd listImagesCmd();
+
+ InspectImageCmd inspectImageCmd(@Nonnull String imageId);
+
+ /**
+ * @param name
+ * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.
+ */
+ SaveImageCmd saveImageCmd(@Nonnull String name);
+
+ /**
+ * Command to download multiple images at once.
+ * @return command (builder)
+ */
+ SaveImagesCmd saveImagesCmd();
+
+ /**
+ * * CONTAINER API *
+ */
+
+ ListContainersCmd listContainersCmd();
+
+ CreateContainerCmd createContainerCmd(@Nonnull String image);
+
+ /**
+ * Creates a new {@link StartContainerCmd} for the container with the given ID. The command can then be further customized by using
+ * builder methods on it like {@link StartContainerCmd#withDns(String...)}.
+ *
+ * If you customize the command, any existing configuration of the target container will get reset to its default before applying the
+ * new configuration. To preserve the existing configuration, use an unconfigured {@link StartContainerCmd}.
+ *
+ * This command corresponds to the /containers/{id}/start endpoint of the Docker Remote API.
+ */
+ StartContainerCmd startContainerCmd(@Nonnull String containerId);
+
+ ExecCreateCmd execCreateCmd(@Nonnull String containerId);
+
+ ResizeExecCmd resizeExecCmd(@Nonnull String execId);
+
+ InspectContainerCmd inspectContainerCmd(@Nonnull String containerId);
+
+ RemoveContainerCmd removeContainerCmd(@Nonnull String containerId);
+
+ WaitContainerCmd waitContainerCmd(@Nonnull String containerId);
+
+ AttachContainerCmd attachContainerCmd(@Nonnull String containerId);
+
+ ExecStartCmd execStartCmd(@Nonnull String execId);
+
+ InspectExecCmd inspectExecCmd(@Nonnull String execId);
+
+ LogContainerCmd logContainerCmd(@Nonnull String containerId);
+
+ /**
+ * Copy resource from container to local machine.
+ *
+ * @param containerId
+ * id of the container
+ * @param resource
+ * path to container's resource
+ * @return created command
+ * @since {@link RemoteApiVersion#VERSION_1_20}
+ */
+ CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(@Nonnull String containerId, @Nonnull String resource);
+
+ /**
+ * Copy resource from container to local machine.
+ *
+ * @param containerId
+ * id of the container
+ * @param resource
+ * path to container's resource
+ * @return created command
+ * @see #copyArchiveFromContainerCmd(String, String)
+ * @deprecated since docker API version 1.20, replaced by {@link #copyArchiveFromContainerCmd(String, String)}
+ * since 1.24 fails.
+ */
+ @Deprecated
+ CopyFileFromContainerCmd copyFileFromContainerCmd(@Nonnull String containerId, @Nonnull String resource);
+
+ /**
+ * Copy archive from local machine to remote container
+ *
+ * @param containerId
+ * id of the container
+ * @return created command
+ * @since {@link RemoteApiVersion#VERSION_1_20}
+ */
+ CopyArchiveToContainerCmd copyArchiveToContainerCmd(@Nonnull String containerId);
+
+ ContainerDiffCmd containerDiffCmd(@Nonnull String containerId);
+
+ StopContainerCmd stopContainerCmd(@Nonnull String containerId);
+
+ KillContainerCmd killContainerCmd(@Nonnull String containerId);
+
+ /**
+ * Update container settings
+ *
+ * @param containerId id of the container
+ * @return command
+ * @since {@link RemoteApiVersion#VERSION_1_22}
+ */
+ UpdateContainerCmd updateContainerCmd(@Nonnull String containerId);
+
+ /**
+ * Rename container.
+ *
+ * @param containerId id of the container
+ * @return command
+ * @since {@link RemoteApiVersion#VERSION_1_17}
+ */
+ RenameContainerCmd renameContainerCmd(@Nonnull String containerId);
+
+ RestartContainerCmd restartContainerCmd(@Nonnull String containerId);
+
+ ResizeContainerCmd resizeContainerCmd(@Nonnull String containerId);
+
+ CommitCmd commitCmd(@Nonnull String containerId);
+
+ BuildImageCmd buildImageCmd();
+
+ BuildImageCmd buildImageCmd(File dockerFileOrFolder);
+
+ BuildImageCmd buildImageCmd(InputStream tarInputStream);
+
+ TopContainerCmd topContainerCmd(String containerId);
+
+ TagImageCmd tagImageCmd(String imageId, String imageNameWithRepository, String tag);
+
+ PauseContainerCmd pauseContainerCmd(String containerId);
+
+ UnpauseContainerCmd unpauseContainerCmd(String containerId);
+
+ EventsCmd eventsCmd();
+
+ StatsCmd statsCmd(String containerId);
+
+ CreateVolumeCmd createVolumeCmd();
+
+ InspectVolumeCmd inspectVolumeCmd(String name);
+
+ RemoveVolumeCmd removeVolumeCmd(String name);
+
+ ListVolumesCmd listVolumesCmd();
+
+ ListNetworksCmd listNetworksCmd();
+
+ InspectNetworkCmd inspectNetworkCmd();
+
+ CreateNetworkCmd createNetworkCmd();
+
+ RemoveNetworkCmd removeNetworkCmd(@Nonnull String networkId);
+
+ ConnectToNetworkCmd connectToNetworkCmd();
+
+ DisconnectFromNetworkCmd disconnectFromNetworkCmd();
+
+ /**
+ * Enables swarm mode for the docker engine and creates a new swarm cluster
+ *
+ * @since 1.24
+ * @param swarmSpec the specification for the swarm
+ * @return the command
+ */
+ InitializeSwarmCmd initializeSwarmCmd(SwarmSpec swarmSpec);
+
+ /**
+ * Gets information about the swarm the docker engine is currently in
+ *
+ * @since 1.24
+ * @return the command
+ */
+ InspectSwarmCmd inspectSwarmCmd();
+
+ /**
+ * Enables swarm mode for the docker engine and joins an existing swarm cluster
+ *
+ * @since 1.24
+ * @return the command
+ */
+ JoinSwarmCmd joinSwarmCmd();
+
+ /**
+ * Disables swarm node for the docker engine and leaves the swarm cluster
+ *
+ * @since 1.24
+ * @return the command
+ */
+ LeaveSwarmCmd leaveSwarmCmd();
+
+ /**
+ * Updates the swarm specification
+ *
+ * @since 1.24
+ * @param swarmSpec the specification for the swarm
+ * @return the command
+ */
+ UpdateSwarmCmd updateSwarmCmd(SwarmSpec swarmSpec);
+
+ /**
+ * Updates the swarm node
+ *
+ * @return the command
+ * @since 1.24
+ */
+ UpdateSwarmNodeCmd updateSwarmNodeCmd();
+
+ /**
+ * Remove the swarm node
+ *
+ * @param swarmNodeId swarmNodeId
+ * @return the command
+ * @since 1.24
+ */
+ RemoveSwarmNodeCmd removeSwarmNodeCmd(String swarmNodeId);
+
+ /**
+ * List nodes in swarm
+ *
+ * @return the command
+ * @since 1.24
+ */
+ ListSwarmNodesCmd listSwarmNodesCmd();
+
+ /**
+ * Command to list all services in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ * @return command
+ */
+ ListServicesCmd listServicesCmd();
+
+ /**
+ * Command to create a service in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ * @param serviceSpec the service specification
+ * @return command
+ */
+ CreateServiceCmd createServiceCmd(ServiceSpec serviceSpec);
+
+ /**
+ * Command to inspect a service
+ * @param serviceId service id or service name
+ * @return command
+ */
+ InspectServiceCmd inspectServiceCmd(String serviceId);
+
+ /**
+ * Command to update a service specification
+ * @param serviceId service id
+ * @param serviceSpec the new service specification
+ * @return command
+ */
+ UpdateServiceCmd updateServiceCmd(String serviceId, ServiceSpec serviceSpec);
+
+ /**
+ * Command to remove a service
+ * @param serviceId service id or service name
+ * @return command
+ */
+ RemoveServiceCmd removeServiceCmd(String serviceId);
+
+ /**
+ * List tasks in the swarm cluster
+ *
+ * @return the command
+ * @since 1.24
+ */
+ ListTasksCmd listTasksCmd();
+
+ /**
+ * Command to get service log
+ *
+ * @return the command
+ * @since 1.29
+ */
+ LogSwarmObjectCmd logServiceCmd(String serviceId);
+
+ /**
+ * Command to get task log
+ *
+ * @return the command
+ * @since 1.29
+ */
+ LogSwarmObjectCmd logTaskCmd(String taskId);
+
+ /**
+ * Command to delete unused containers/images/networks/volumes
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ PruneCmd pruneCmd(PruneType pruneType);
+
+ /**
+ * Command to list all secrets. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ * @return command
+ */
+ ListSecretsCmd listSecretsCmd();
+
+ /**
+ * Command to create a secret in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ * @param secretSpec the secret specification
+ * @return command
+ */
+ CreateSecretCmd createSecretCmd(SecretSpec secretSpec);
+
+ /**
+ * Command to remove a secret
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ * @param secretId secret id or secret name
+ * @return command
+ */
+ RemoveSecretCmd removeSecretCmd(String secretId);
+
+
+ /**
+ * Command to list all configs. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ * @return command
+ */
+ ListConfigsCmd listConfigsCmd();
+
+ /**
+ * Command to create a config in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ * @return command
+ */
+ CreateConfigCmd createConfigCmd();
+
+ /**
+ * Command to inspect a service
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ * @param configId config id or config name
+ * @return command
+ */
+ InspectConfigCmd inspectConfigCmd(String configId);
+
+ /**
+ * Command to remove a config
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ * @param configId config id or config name
+ * @return command
+ */
+ RemoveConfigCmd removeConfigCmd(String configId);
+
+
+ @Override
+ void close() throws IOException;
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java
new file mode 100644
index 000000000..5de64641f
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java
@@ -0,0 +1,527 @@
+package com.github.dockerjava.api;
+
+import com.github.dockerjava.api.command.AttachContainerCmd;
+import com.github.dockerjava.api.command.AuthCmd;
+import com.github.dockerjava.api.command.BuildImageCmd;
+import com.github.dockerjava.api.command.CommitCmd;
+import com.github.dockerjava.api.command.ConnectToNetworkCmd;
+import com.github.dockerjava.api.command.ContainerDiffCmd;
+import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd;
+import com.github.dockerjava.api.command.CopyArchiveToContainerCmd;
+import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
+import com.github.dockerjava.api.command.CreateConfigCmd;
+import com.github.dockerjava.api.command.CreateContainerCmd;
+import com.github.dockerjava.api.command.CreateImageCmd;
+import com.github.dockerjava.api.command.CreateNetworkCmd;
+import com.github.dockerjava.api.command.CreateSecretCmd;
+import com.github.dockerjava.api.command.CreateServiceCmd;
+import com.github.dockerjava.api.command.CreateVolumeCmd;
+import com.github.dockerjava.api.command.DisconnectFromNetworkCmd;
+import com.github.dockerjava.api.command.EventsCmd;
+import com.github.dockerjava.api.command.ExecCreateCmd;
+import com.github.dockerjava.api.command.ExecStartCmd;
+import com.github.dockerjava.api.command.InfoCmd;
+import com.github.dockerjava.api.command.InitializeSwarmCmd;
+import com.github.dockerjava.api.command.InspectConfigCmd;
+import com.github.dockerjava.api.command.InspectContainerCmd;
+import com.github.dockerjava.api.command.InspectExecCmd;
+import com.github.dockerjava.api.command.InspectImageCmd;
+import com.github.dockerjava.api.command.InspectNetworkCmd;
+import com.github.dockerjava.api.command.InspectServiceCmd;
+import com.github.dockerjava.api.command.InspectSwarmCmd;
+import com.github.dockerjava.api.command.InspectVolumeCmd;
+import com.github.dockerjava.api.command.JoinSwarmCmd;
+import com.github.dockerjava.api.command.KillContainerCmd;
+import com.github.dockerjava.api.command.LeaveSwarmCmd;
+import com.github.dockerjava.api.command.ListConfigsCmd;
+import com.github.dockerjava.api.command.ListContainersCmd;
+import com.github.dockerjava.api.command.ListImagesCmd;
+import com.github.dockerjava.api.command.ListNetworksCmd;
+import com.github.dockerjava.api.command.ListSecretsCmd;
+import com.github.dockerjava.api.command.ListServicesCmd;
+import com.github.dockerjava.api.command.ListSwarmNodesCmd;
+import com.github.dockerjava.api.command.ListTasksCmd;
+import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageAsyncCmd;
+import com.github.dockerjava.api.command.LoadImageCmd;
+import com.github.dockerjava.api.command.LogContainerCmd;
+import com.github.dockerjava.api.command.LogSwarmObjectCmd;
+import com.github.dockerjava.api.command.PauseContainerCmd;
+import com.github.dockerjava.api.command.PingCmd;
+import com.github.dockerjava.api.command.PruneCmd;
+import com.github.dockerjava.api.command.PullImageCmd;
+import com.github.dockerjava.api.command.PushImageCmd;
+import com.github.dockerjava.api.command.RemoveConfigCmd;
+import com.github.dockerjava.api.command.RemoveContainerCmd;
+import com.github.dockerjava.api.command.RemoveImageCmd;
+import com.github.dockerjava.api.command.RemoveNetworkCmd;
+import com.github.dockerjava.api.command.RemoveSecretCmd;
+import com.github.dockerjava.api.command.RemoveServiceCmd;
+import com.github.dockerjava.api.command.RemoveSwarmNodeCmd;
+import com.github.dockerjava.api.command.RemoveVolumeCmd;
+import com.github.dockerjava.api.command.RenameContainerCmd;
+import com.github.dockerjava.api.command.ResizeContainerCmd;
+import com.github.dockerjava.api.command.ResizeExecCmd;
+import com.github.dockerjava.api.command.RestartContainerCmd;
+import com.github.dockerjava.api.command.SaveImageCmd;
+import com.github.dockerjava.api.command.SaveImagesCmd;
+import com.github.dockerjava.api.command.SearchImagesCmd;
+import com.github.dockerjava.api.command.StartContainerCmd;
+import com.github.dockerjava.api.command.StatsCmd;
+import com.github.dockerjava.api.command.StopContainerCmd;
+import com.github.dockerjava.api.command.TagImageCmd;
+import com.github.dockerjava.api.command.TopContainerCmd;
+import com.github.dockerjava.api.command.UnpauseContainerCmd;
+import com.github.dockerjava.api.command.UpdateContainerCmd;
+import com.github.dockerjava.api.command.UpdateServiceCmd;
+import com.github.dockerjava.api.command.UpdateSwarmCmd;
+import com.github.dockerjava.api.command.UpdateSwarmNodeCmd;
+import com.github.dockerjava.api.command.VersionCmd;
+import com.github.dockerjava.api.command.WaitContainerCmd;
+import com.github.dockerjava.api.exception.DockerException;
+import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.Identifier;
+import com.github.dockerjava.api.model.PruneType;
+import com.github.dockerjava.api.model.SecretSpec;
+import com.github.dockerjava.api.model.ServiceSpec;
+import com.github.dockerjava.api.model.SwarmSpec;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @apiNote implementations MUST override {{@link #getDockerClient()}}
+ * @implNote We're not using an abstract class here because we want
+ * Java compiler to force us to implement every {@link DockerClient}'s method,
+ * especially when new methods are added
+ */
+@SuppressWarnings("unused")
+public class DockerClientDelegate implements DockerClient {
+
+ protected DockerClient getDockerClient() {
+ throw new IllegalStateException("Implement me!");
+ }
+
+ @Override
+ public AuthConfig authConfig() throws DockerException {
+ return getDockerClient().authConfig();
+ }
+
+ @Override
+ public AuthCmd authCmd() {
+ return getDockerClient().authCmd();
+ }
+
+ @Override
+ public InfoCmd infoCmd() {
+ return getDockerClient().infoCmd();
+ }
+
+ @Override
+ public PingCmd pingCmd() {
+ return getDockerClient().pingCmd();
+ }
+
+ @Override
+ public VersionCmd versionCmd() {
+ return getDockerClient().versionCmd();
+ }
+
+ @Override
+ public PullImageCmd pullImageCmd(@Nonnull String repository) {
+ return getDockerClient().pullImageCmd(repository);
+ }
+
+ @Override
+ public PushImageCmd pushImageCmd(@Nonnull String name) {
+ return getDockerClient().pushImageCmd(name);
+ }
+
+ @Override
+ public PushImageCmd pushImageCmd(@Nonnull Identifier identifier) {
+ return getDockerClient().pushImageCmd(identifier);
+ }
+
+ @Override
+ public CreateImageCmd createImageCmd(@Nonnull String repository, @Nonnull InputStream imageStream) {
+ return getDockerClient().createImageCmd(repository, imageStream);
+ }
+
+ @Override
+ public LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream) {
+ return getDockerClient().loadImageCmd(imageStream);
+ }
+
+ @Override
+ public LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream) {
+ return getDockerClient().loadImageAsyncCmd(imageStream);
+ }
+
+ @Override
+ public SearchImagesCmd searchImagesCmd(@Nonnull String term) {
+ return getDockerClient().searchImagesCmd(term);
+ }
+
+ @Override
+ public RemoveImageCmd removeImageCmd(@Nonnull String imageId) {
+ return getDockerClient().removeImageCmd(imageId);
+ }
+
+ @Override
+ public ListImagesCmd listImagesCmd() {
+ return getDockerClient().listImagesCmd();
+ }
+
+ @Override
+ public InspectImageCmd inspectImageCmd(@Nonnull String imageId) {
+ return getDockerClient().inspectImageCmd(imageId);
+ }
+
+ @Override
+ public SaveImageCmd saveImageCmd(@Nonnull String name) {
+ return getDockerClient().saveImageCmd(name);
+ }
+
+ @Override
+ public SaveImagesCmd saveImagesCmd() {
+ return getDockerClient().saveImagesCmd();
+ }
+
+ @Override
+ public ListContainersCmd listContainersCmd() {
+ return getDockerClient().listContainersCmd();
+ }
+
+ @Override
+ public CreateContainerCmd createContainerCmd(@Nonnull String image) {
+ return getDockerClient().createContainerCmd(image);
+ }
+
+ @Override
+ public StartContainerCmd startContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().startContainerCmd(containerId);
+ }
+
+ @Override
+ public ExecCreateCmd execCreateCmd(@Nonnull String containerId) {
+ return getDockerClient().execCreateCmd(containerId);
+ }
+
+ @Override
+ public ResizeExecCmd resizeExecCmd(@Nonnull String execId) {
+ return getDockerClient().resizeExecCmd(execId);
+ }
+
+ @Override
+ public InspectContainerCmd inspectContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().inspectContainerCmd(containerId);
+ }
+
+ @Override
+ public RemoveContainerCmd removeContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().removeContainerCmd(containerId);
+ }
+
+ @Override
+ public WaitContainerCmd waitContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().waitContainerCmd(containerId);
+ }
+
+ @Override
+ public AttachContainerCmd attachContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().attachContainerCmd(containerId);
+ }
+
+ @Override
+ public ExecStartCmd execStartCmd(@Nonnull String execId) {
+ return getDockerClient().execStartCmd(execId);
+ }
+
+ @Override
+ public InspectExecCmd inspectExecCmd(@Nonnull String execId) {
+ return getDockerClient().inspectExecCmd(execId);
+ }
+
+ @Override
+ public LogContainerCmd logContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().logContainerCmd(containerId);
+ }
+
+ @Override
+ public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(@Nonnull String containerId, @Nonnull String resource) {
+ return getDockerClient().copyArchiveFromContainerCmd(containerId, resource);
+ }
+
+ @Override
+ @Deprecated
+ public CopyFileFromContainerCmd copyFileFromContainerCmd(@Nonnull String containerId, @Nonnull String resource) {
+ return getDockerClient().copyFileFromContainerCmd(containerId, resource);
+ }
+
+ @Override
+ public CopyArchiveToContainerCmd copyArchiveToContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().copyArchiveToContainerCmd(containerId);
+ }
+
+ @Override
+ public ContainerDiffCmd containerDiffCmd(@Nonnull String containerId) {
+ return getDockerClient().containerDiffCmd(containerId);
+ }
+
+ @Override
+ public StopContainerCmd stopContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().stopContainerCmd(containerId);
+ }
+
+ @Override
+ public KillContainerCmd killContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().killContainerCmd(containerId);
+ }
+
+ @Override
+ public UpdateContainerCmd updateContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().updateContainerCmd(containerId);
+ }
+
+ @Override
+ public RenameContainerCmd renameContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().renameContainerCmd(containerId);
+ }
+
+ @Override
+ public RestartContainerCmd restartContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().restartContainerCmd(containerId);
+ }
+
+ @Override
+ public ResizeContainerCmd resizeContainerCmd(@Nonnull String containerId) {
+ return getDockerClient().resizeContainerCmd(containerId);
+ }
+
+ @Override
+ public CommitCmd commitCmd(@Nonnull String containerId) {
+ return getDockerClient().commitCmd(containerId);
+ }
+
+ @Override
+ public BuildImageCmd buildImageCmd() {
+ return getDockerClient().buildImageCmd();
+ }
+
+ @Override
+ public BuildImageCmd buildImageCmd(File dockerFileOrFolder) {
+ return getDockerClient().buildImageCmd(dockerFileOrFolder);
+ }
+
+ @Override
+ public BuildImageCmd buildImageCmd(InputStream tarInputStream) {
+ return getDockerClient().buildImageCmd(tarInputStream);
+ }
+
+ @Override
+ public TopContainerCmd topContainerCmd(String containerId) {
+ return getDockerClient().topContainerCmd(containerId);
+ }
+
+ @Override
+ public TagImageCmd tagImageCmd(String imageId, String imageNameWithRepository, String tag) {
+ return getDockerClient().tagImageCmd(imageId, imageNameWithRepository, tag);
+ }
+
+ @Override
+ public PauseContainerCmd pauseContainerCmd(String containerId) {
+ return getDockerClient().pauseContainerCmd(containerId);
+ }
+
+ @Override
+ public UnpauseContainerCmd unpauseContainerCmd(String containerId) {
+ return getDockerClient().unpauseContainerCmd(containerId);
+ }
+
+ @Override
+ public EventsCmd eventsCmd() {
+ return getDockerClient().eventsCmd();
+ }
+
+ @Override
+ public StatsCmd statsCmd(String containerId) {
+ return getDockerClient().statsCmd(containerId);
+ }
+
+ @Override
+ public CreateVolumeCmd createVolumeCmd() {
+ return getDockerClient().createVolumeCmd();
+ }
+
+ @Override
+ public InspectVolumeCmd inspectVolumeCmd(String name) {
+ return getDockerClient().inspectVolumeCmd(name);
+ }
+
+ @Override
+ public RemoveVolumeCmd removeVolumeCmd(String name) {
+ return getDockerClient().removeVolumeCmd(name);
+ }
+
+ @Override
+ public ListVolumesCmd listVolumesCmd() {
+ return getDockerClient().listVolumesCmd();
+ }
+
+ @Override
+ public ListNetworksCmd listNetworksCmd() {
+ return getDockerClient().listNetworksCmd();
+ }
+
+ @Override
+ public InspectNetworkCmd inspectNetworkCmd() {
+ return getDockerClient().inspectNetworkCmd();
+ }
+
+ @Override
+ public CreateNetworkCmd createNetworkCmd() {
+ return getDockerClient().createNetworkCmd();
+ }
+
+ @Override
+ public RemoveNetworkCmd removeNetworkCmd(@Nonnull String networkId) {
+ return getDockerClient().removeNetworkCmd(networkId);
+ }
+
+ @Override
+ public ConnectToNetworkCmd connectToNetworkCmd() {
+ return getDockerClient().connectToNetworkCmd();
+ }
+
+ @Override
+ public DisconnectFromNetworkCmd disconnectFromNetworkCmd() {
+ return getDockerClient().disconnectFromNetworkCmd();
+ }
+
+ @Override
+ public InitializeSwarmCmd initializeSwarmCmd(SwarmSpec swarmSpec) {
+ return getDockerClient().initializeSwarmCmd(swarmSpec);
+ }
+
+ @Override
+ public InspectSwarmCmd inspectSwarmCmd() {
+ return getDockerClient().inspectSwarmCmd();
+ }
+
+ @Override
+ public JoinSwarmCmd joinSwarmCmd() {
+ return getDockerClient().joinSwarmCmd();
+ }
+
+ @Override
+ public LeaveSwarmCmd leaveSwarmCmd() {
+ return getDockerClient().leaveSwarmCmd();
+ }
+
+ @Override
+ public UpdateSwarmCmd updateSwarmCmd(SwarmSpec swarmSpec) {
+ return getDockerClient().updateSwarmCmd(swarmSpec);
+ }
+
+ @Override
+ public UpdateSwarmNodeCmd updateSwarmNodeCmd() {
+ return getDockerClient().updateSwarmNodeCmd();
+ }
+
+ @Override
+ public RemoveSwarmNodeCmd removeSwarmNodeCmd(String swarmNodeId) {
+ return getDockerClient().removeSwarmNodeCmd(swarmNodeId);
+ }
+
+ @Override
+ public ListSwarmNodesCmd listSwarmNodesCmd() {
+ return getDockerClient().listSwarmNodesCmd();
+ }
+
+ @Override
+ public ListServicesCmd listServicesCmd() {
+ return getDockerClient().listServicesCmd();
+ }
+
+ @Override
+ public CreateServiceCmd createServiceCmd(ServiceSpec serviceSpec) {
+ return getDockerClient().createServiceCmd(serviceSpec);
+ }
+
+ @Override
+ public InspectServiceCmd inspectServiceCmd(String serviceId) {
+ return getDockerClient().inspectServiceCmd(serviceId);
+ }
+
+ @Override
+ public UpdateServiceCmd updateServiceCmd(String serviceId, ServiceSpec serviceSpec) {
+ return getDockerClient().updateServiceCmd(serviceId, serviceSpec);
+ }
+
+ @Override
+ public RemoveServiceCmd removeServiceCmd(String serviceId) {
+ return getDockerClient().removeServiceCmd(serviceId);
+ }
+
+ @Override
+ public ListTasksCmd listTasksCmd() {
+ return getDockerClient().listTasksCmd();
+ }
+
+ @Override
+ public LogSwarmObjectCmd logServiceCmd(String serviceId) {
+ return getDockerClient().logServiceCmd(serviceId);
+ }
+
+ @Override
+ public LogSwarmObjectCmd logTaskCmd(String taskId) {
+ return getDockerClient().logTaskCmd(taskId);
+ }
+
+ @Override
+ public PruneCmd pruneCmd(PruneType pruneType) {
+ return getDockerClient().pruneCmd(pruneType);
+ }
+
+ @Override
+ public ListSecretsCmd listSecretsCmd() {
+ return getDockerClient().listSecretsCmd();
+ }
+
+ @Override
+ public CreateSecretCmd createSecretCmd(SecretSpec secretSpec) {
+ return getDockerClient().createSecretCmd(secretSpec);
+ }
+
+ @Override
+ public RemoveSecretCmd removeSecretCmd(String secretId) {
+ return getDockerClient().removeSecretCmd(secretId);
+ }
+
+ @Override
+ public ListConfigsCmd listConfigsCmd() {
+ return getDockerClient().listConfigsCmd();
+ }
+
+ @Override
+ public CreateConfigCmd createConfigCmd() {
+ return getDockerClient().createConfigCmd();
+ }
+
+ @Override
+ public InspectConfigCmd inspectConfigCmd(String configId) {
+ return getDockerClient().inspectConfigCmd(configId);
+ }
+
+ @Override
+ public RemoveConfigCmd removeConfigCmd(String configId) {
+ return getDockerClient().removeConfigCmd(configId);
+ }
+
+ @Override
+ public void close() throws IOException {
+ getDockerClient().close();
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallback.java
similarity index 80%
rename from src/main/java/com/github/dockerjava/api/async/ResultCallback.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallback.java
index 5b9fdb81c..6a244d620 100644
--- a/src/main/java/com/github/dockerjava/api/async/ResultCallback.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallback.java
@@ -6,6 +6,14 @@
* Result callback
*/
public interface ResultCallback extends Closeable {
+
+ class Adapter extends ResultCallbackTemplate, A_RES_T> {
+ @Override
+ public void onNext(A_RES_T object) {
+
+ }
+ }
+
/**
* Called when the async processing starts respectively when the response arrives from the server. The passed {@link Closeable} can be
* used to close/interrupt the processing.
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallbackTemplate.java b/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallbackTemplate.java
new file mode 100644
index 000000000..911e67826
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallbackTemplate.java
@@ -0,0 +1,161 @@
+/*
+ * Created on 16.06.2015
+ */
+package com.github.dockerjava.api.async;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Abstract template implementation of {@link ResultCallback}
+ *
+ * @author Marcus Linke
+ *
+ */
+public abstract class ResultCallbackTemplate, A_RES_T> implements
+ ResultCallback {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ResultCallbackTemplate.class);
+
+ private final CountDownLatch started = new CountDownLatch(1);
+
+ private final CountDownLatch completed = new CountDownLatch(1);
+
+ private Closeable stream;
+
+ private boolean closed = false;
+
+ private Throwable firstError = null;
+
+ @Override
+ public void onStart(Closeable stream) {
+ this.stream = stream;
+ this.closed = false;
+ started.countDown();
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+
+ if (closed) return;
+
+ if (this.firstError == null) {
+ this.firstError = throwable;
+ }
+
+ try {
+ LOGGER.error("Error during callback", throwable);
+ } finally {
+ try {
+ close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ @Override
+ public void onComplete() {
+ try {
+ close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (!closed) {
+ closed = true;
+ try {
+ if (stream != null) {
+ stream.close();
+ }
+ } finally {
+ completed.countDown();
+ }
+ }
+ }
+
+ /**
+ * Blocks until {@link ResultCallback#onComplete()} was called
+ */
+ @SuppressWarnings("unchecked")
+ public RC_T awaitCompletion() throws InterruptedException {
+ try {
+ completed.await();
+ // eventually (re)throws RuntimeException
+ throwFirstError();
+ return (RC_T) this;
+ } finally {
+ try {
+ close();
+ } catch (IOException e) {
+ LOGGER.debug("Failed to close", e);
+ }
+ }
+ }
+
+ /**
+ * Blocks until {@link ResultCallback#onComplete()} was called or the given timeout occurs
+ * @return {@code true} if completed and {@code false} if the waiting time elapsed
+ * before {@link ResultCallback#onComplete()} was called.
+ */
+ public boolean awaitCompletion(long timeout, TimeUnit timeUnit) throws InterruptedException {
+ try {
+ boolean result = completed.await(timeout, timeUnit);
+ throwFirstError();
+ return result;
+ } finally {
+ try {
+ close();
+ } catch (IOException e) {
+ LOGGER.debug("Failed to close", e);
+ }
+ }
+ }
+
+ /**
+ * Blocks until {@link ResultCallback#onStart(Closeable)} was called.
+ * {@link ResultCallback#onStart(Closeable)} is called when the request was processed on the server
+ * side and the response is incoming.
+ */
+ @SuppressWarnings("unchecked")
+ public RC_T awaitStarted() throws InterruptedException {
+ started.await();
+ return (RC_T) this;
+ }
+
+ /**
+ * Blocks until {@link ResultCallback#onStart(Closeable)} was called or the given timeout occurs.
+ * {@link ResultCallback#onStart(Closeable)} is called when the request was processed on the server side
+ * and the response is incoming.
+ * @return {@code true} if started and {@code false} if the waiting time elapsed
+ * before {@link ResultCallback#onStart(Closeable)} was called.
+ */
+ public boolean awaitStarted(long timeout, TimeUnit timeUnit) throws InterruptedException {
+ return started.await(timeout, timeUnit);
+ }
+
+ /**
+ * Throws the first occurred error as a runtime exception
+ * @throws com.github.dockerjava.api.exception.DockerException The first docker based Error
+ * @throws RuntimeException on any other occurred error
+ */
+ protected void throwFirstError() {
+ if (firstError != null) {
+ if (firstError instanceof Error) {
+ throw (Error) firstError;
+ }
+ if (firstError instanceof RuntimeException) {
+ throw (RuntimeException) firstError;
+ }
+ throw new RuntimeException(firstError);
+ }
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java
new file mode 100644
index 000000000..b2f287cc2
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java
@@ -0,0 +1,22 @@
+/*
+ * Created on 17.06.2015
+ */
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.async.ResultCallbackTemplate;
+
+/**
+ *
+ *
+ * @author Marcus Linke
+ *
+ */
+public interface AsyncDockerCmd, A_RES_T> extends DockerCmd {
+
+ > T exec(T resultCallback);
+
+ default ResultCallbackTemplate, A_RES_T> start() {
+ return exec(new ResultCallback.Adapter<>());
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AuthCmd.java
similarity index 91%
rename from src/main/java/com/github/dockerjava/api/command/AuthCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/AuthCmd.java
index a92b1593b..f9ffbf859 100644
--- a/src/main/java/com/github/dockerjava/api/command/AuthCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AuthCmd.java
@@ -1,12 +1,11 @@
package com.github.dockerjava.api.command;
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnull;
-
import com.github.dockerjava.api.exception.UnauthorizedException;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.AuthResponse;
+import javax.annotation.CheckForNull;
+
/**
*
* Authenticate with the server, useful for checking authentication.
@@ -17,7 +16,7 @@ public interface AuthCmd extends SyncDockerCmd {
@CheckForNull
AuthConfig getAuthConfig();
- AuthCmd withAuthConfig(@Nonnull AuthConfig authConfig);
+ AuthCmd withAuthConfig(AuthConfig authConfig);
/**
* @return The status. Based on it's value you may mean you need to authorise your account, e.g.: "Account created. Please see the
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
new file mode 100644
index 000000000..1b7b76a67
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java
@@ -0,0 +1,244 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.AuthConfigurations;
+import com.github.dockerjava.api.model.BuildResponseItem;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Build an image from Dockerfile.
+ *
+ * TODO: http://docs.docker.com/reference/builder/#dockerignore
+ *
+ * @see build-image-from-a-dockerfile
+ */
+public interface BuildImageCmd extends AsyncDockerCmd {
+
+ // lib specific
+
+ @CheckForNull
+ InputStream getTarInputStream();
+
+ @CheckForNull
+ AuthConfigurations getBuildAuthConfigs();
+
+ // getters
+
+ /**
+ * "t" in API
+ *
+ * @deprecated since docker API version 1.21 there can be multiple tags
+ * specified so use {@link #getTags()}
+ */
+ @CheckForNull
+ @Deprecated
+ String getTag();
+
+ /**
+ * Multple "t" tags.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_21}
+ */
+ @CheckForNull
+ Set getTags();
+
+ /**
+ * "Cache-from" in API
+ */
+ @CheckForNull
+ Set getCacheFrom();
+
+ /**
+ * "remote" in API
+ */
+ @CheckForNull
+ URI getRemote();
+
+ /**
+ * "nocache" in API
+ */
+ @CheckForNull
+ Boolean hasNoCacheEnabled();
+
+ /**
+ * "rm" in API
+ */
+ @CheckForNull
+ Boolean hasRemoveEnabled();
+
+ /**
+ * "forcerm" in API
+ */
+ @CheckForNull
+ Boolean isForcerm();
+
+ /**
+ * "q" in API
+ */
+ @CheckForNull
+ Boolean isQuiet();
+
+ /**
+ * "pull" in API
+ */
+ @CheckForNull
+ Boolean hasPullEnabled();
+
+ @CheckForNull
+ String getPathToDockerfile();
+
+ @CheckForNull
+ Long getMemory();
+
+ @CheckForNull
+ Long getMemswap();
+
+ @CheckForNull
+ String getCpushares();
+
+ @CheckForNull
+ String getCpusetcpus();
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_21}
+ */
+ @CheckForNull
+ Map getBuildArgs();
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_22}
+ */
+ @CheckForNull
+ Long getShmsize();
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_23}
+ */
+ @CheckForNull
+ Map getLabels();
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ @CheckForNull
+ String getNetworkMode();
+
+ /**
+ * "platform" in API
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_32}
+ */
+ @CheckForNull
+ String getPlatform();
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_38}
+ */
+ @CheckForNull
+ String getTarget();
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_28}
+ */
+ @CheckForNull
+ Set getExtraHosts();
+
+ // setters
+
+ /**
+ * @deprecated since docker API version 1.21 there can be multiple tags
+ * specified so use {@link BuildImageCmd#withTags(java.util.Set)}
+ */
+ @Deprecated
+ BuildImageCmd withTag(String tag);
+
+ BuildImageCmd withTags(Set tags);
+
+ /*
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ BuildImageCmd withCacheFrom(Set cacheFrom);
+
+ BuildImageCmd withRemote(URI remote);
+
+ BuildImageCmd withBaseDirectory(File baseDirectory);
+
+ BuildImageCmd withDockerfile(File dockerfile);
+
+ BuildImageCmd withDockerfilePath(String dockerfilePath);
+
+ BuildImageCmd withNoCache(Boolean noCache);
+
+ BuildImageCmd withRemove(Boolean rm);
+
+ BuildImageCmd withForcerm(Boolean forcerm);
+
+ BuildImageCmd withQuiet(Boolean quiet);
+
+ BuildImageCmd withPull(Boolean pull);
+
+ BuildImageCmd withMemory(Long memory);
+
+ BuildImageCmd withMemswap(Long memswap);
+
+ BuildImageCmd withCpushares(String cpushares);
+
+ BuildImageCmd withCpusetcpus(String cpusetcpus);
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_21}
+ */
+ BuildImageCmd withBuildArg(String key, String value);
+
+ // setters lib specific
+
+ BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig);
+
+ BuildImageCmd withTarInputStream(@Nonnull InputStream tarInputStream);
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_22}
+ */
+ BuildImageCmd withShmsize(Long shmsize);
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_23}
+ */
+ BuildImageCmd withLabels(Map labels);
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ BuildImageCmd withNetworkMode(String networkMode);
+
+ /**
+ *@since {@link RemoteApiVersion#VERSION_1_32}
+ */
+ BuildImageCmd withPlatform(String platform);
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_38}
+ */
+ BuildImageCmd withTarget(String target);
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_28}
+ */
+ BuildImageCmd withExtraHosts(Set extraHosts);
+
+ @Override
+ default BuildImageResultCallback start() {
+ return exec(new BuildImageResultCallback());
+ }
+
+ interface Exec extends DockerCmdAsyncExec {
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java
new file mode 100644
index 000000000..9db21a6c4
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java
@@ -0,0 +1,80 @@
+/*
+ * Created on 21.07.2015
+ */
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.async.ResultCallbackTemplate;
+import com.github.dockerjava.api.exception.DockerClientException;
+import com.github.dockerjava.api.model.BuildResponseItem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ *
+ * @author Marcus Linke
+ *
+ */
+public class BuildImageResultCallback extends ResultCallbackTemplate {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageResultCallback.class);
+
+ private String imageId;
+
+ private String error;
+
+ @Override
+ public void onNext(BuildResponseItem item) {
+ if (item.isBuildSuccessIndicated()) {
+ this.imageId = item.getImageId();
+ } else if (item.isErrorIndicated()) {
+ this.error = item.getError();
+ }
+ LOGGER.debug("{}", item);
+ }
+
+ /**
+ * Awaits the image id from the response stream.
+ *
+ * @throws DockerClientException
+ * if the build fails.
+ */
+ public String awaitImageId() {
+ try {
+ awaitCompletion();
+ } catch (InterruptedException e) {
+ throw new DockerClientException("", e);
+ }
+
+ return getImageId();
+ }
+
+ /**
+ * Awaits the image id from the response stream.
+ *
+ * @throws DockerClientException
+ * if the build fails or the timeout occurs.
+ */
+ public String awaitImageId(long timeout, TimeUnit timeUnit) {
+ try {
+ awaitCompletion(timeout, timeUnit);
+ } catch (InterruptedException e) {
+ throw new DockerClientException("Awaiting image id interrupted: ", e);
+ }
+
+ return getImageId();
+ }
+
+ private String getImageId() {
+ if (error != null) {
+ throw new DockerClientException("Could not build image: " + error);
+ }
+
+ if (imageId != null) {
+ return imageId;
+ }
+
+ throw new DockerClientException("Could not build image");
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CommitCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/CommitCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/CommitCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java
similarity index 93%
rename from src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java
index 0f384e043..e6868fd7d 100644
--- a/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java
@@ -1,7 +1,6 @@
package com.github.dockerjava.api.command;
import com.github.dockerjava.api.model.ContainerNetwork;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
diff --git a/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java
similarity index 87%
rename from src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java
index a4dfb5c03..19b3c3843 100644
--- a/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java
@@ -16,6 +16,7 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd {
boolean isDirChildrenOnly();
+ boolean isCopyUIDGID();
/**
* Set container's id
*
@@ -49,6 +50,14 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd {
*/
CopyArchiveToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir);
+ /**
+ * If set to true then ownership is set to the user and primary group at the destination
+ *
+ * @param copyUIDGID
+ * flag to know if ownership should be set to the user and primary group at the destination
+ */
+ CopyArchiveToContainerCmd withCopyUIDGID(boolean copyUIDGID);
+
/**
* If this flag is set to true, all children of the local directory will be copied to the remote without the root directory. For ex: if
* I have root/titi and root/tata and the remote path is /var/data. dirChildrenOnly = true will create /var/data/titi and /var/data/tata
diff --git a/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigCmd.java
new file mode 100644
index 000000000..205bc7a7d
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigCmd.java
@@ -0,0 +1,51 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.ConflictException;
+
+import javax.annotation.CheckForNull;
+import java.util.Map;
+
+/**
+ * Command to create a new config
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+public interface CreateConfigCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ String getName();
+
+ @CheckForNull
+ String getData();
+
+ @CheckForNull
+ Map getLabels();
+
+ /**
+ * @param name
+ * - The new config name.
+ */
+ CreateConfigCmd withName(String name);
+
+ /**
+ * @param data
+ * - The new config data.
+ */
+ CreateConfigCmd withData(byte[] data);
+
+ /**
+ * @param labels
+ * - A mapping of labels keys and values. Labels are a mechanism for applying metadata to Docker objects.
+ */
+ CreateConfigCmd withLabels(Map labels);
+
+ /**
+ * @throws ConflictException Named config already exists
+ */
+ @Override
+ CreateConfigResponse exec() throws ConflictException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigResponse.java
new file mode 100644
index 000000000..5836275ff
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigResponse.java
@@ -0,0 +1,20 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * The response of a {@link CreateConfigCmd}
+ */
+@EqualsAndHashCode
+@ToString
+public class CreateConfigResponse extends DockerObject {
+ @JsonProperty("ID")
+ private String id;
+
+ public String getId() {
+ return id;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
new file mode 100644
index 000000000..fba83f50c
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java
@@ -0,0 +1,1025 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.github.dockerjava.api.exception.ConflictException;
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.Bind;
+import com.github.dockerjava.api.model.Capability;
+import com.github.dockerjava.api.model.Device;
+import com.github.dockerjava.api.model.ExposedPort;
+import com.github.dockerjava.api.model.HealthCheck;
+import com.github.dockerjava.api.model.HostConfig;
+import com.github.dockerjava.api.model.Link;
+import com.github.dockerjava.api.model.LogConfig;
+import com.github.dockerjava.api.model.LxcConf;
+import com.github.dockerjava.api.model.PortBinding;
+import com.github.dockerjava.api.model.Ports;
+import com.github.dockerjava.api.model.RestartPolicy;
+import com.github.dockerjava.api.model.Ulimit;
+import com.github.dockerjava.api.model.Volume;
+import com.github.dockerjava.api.model.VolumesFrom;
+
+import javax.annotation.CheckForNull;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import static java.util.Objects.requireNonNull;
+
+public interface CreateContainerCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ AuthConfig getAuthConfig();
+
+ /**
+ * While using swarm classic, you can provide an optional auth config which will be used to pull images from a private registry,
+ * if the swarm node does not already have the docker image.
+ * Note: This option does not have any effect in normal docker
+ *
+ * @param authConfig The optional auth config
+ */
+ CreateContainerCmd withAuthConfig(AuthConfig authConfig);
+
+ @CheckForNull
+ List getAliases();
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Bind[] getBinds() {
+ return getHostConfig().getBinds();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withBinds(Bind... binds) {
+ Objects.requireNonNull(binds, "binds was not specified");
+ getHostConfig().setBinds(binds);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withBinds(List binds) {
+ Objects.requireNonNull(binds, "binds was not specified");
+ return withBinds(binds.toArray(new Bind[binds.size()]));
+ }
+
+ /**
+ * Add network-scoped alias for the container
+ *
+ * @param aliases on ore more aliases
+ */
+ CreateContainerCmd withAliases(List aliases);
+
+ /**
+ * Add network-scoped alias for the container
+ *
+ * @param aliases on ore more aliases
+ */
+ CreateContainerCmd withAliases(String... aliases);
+
+ @CheckForNull
+ String[] getCmd();
+
+ CreateContainerCmd withCmd(String... cmd);
+
+ CreateContainerCmd withCmd(List cmd);
+
+ @CheckForNull
+ HealthCheck getHealthcheck();
+
+ CreateContainerCmd withHealthcheck(HealthCheck healthCheck);
+
+ @CheckForNull
+ Boolean getArgsEscaped();
+
+ CreateContainerCmd withArgsEscaped(Boolean argsEscaped);
+
+ @CheckForNull
+ String getDomainName();
+
+ CreateContainerCmd withDomainName(String domainName);
+
+ @CheckForNull
+ String[] getEntrypoint();
+
+ CreateContainerCmd withEntrypoint(String... entrypoint);
+
+ CreateContainerCmd withEntrypoint(List entrypoint);
+
+ @CheckForNull
+ String[] getEnv();
+
+ /**
+ * Adds environment-variables. NB: Not additive, i.e. in case of multiple calls to the method, only the most recent
+ * values will be injected. Prior env-variables will be deleted.
+ *
+ * @param env the String(s) to set as ENV in the container
+ */
+ CreateContainerCmd withEnv(String... env);
+
+ /**
+ * Adds environment-variables. NB: Not additive, i.e. in case of multiple calls to the method, only the most recent
+ * values will be injected. Prior env-variables will be deleted.
+ *
+ * @param env the list of Strings to set as ENV in the container
+ */
+ CreateContainerCmd withEnv(List env);
+
+ @CheckForNull
+ ExposedPort[] getExposedPorts();
+
+ CreateContainerCmd withExposedPorts(List exposedPorts);
+
+ CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts);
+
+ @CheckForNull
+ String getStopSignal();
+
+ CreateContainerCmd withStopSignal(String stopSignal);
+
+ @CheckForNull
+ Integer getStopTimeout();
+
+ CreateContainerCmd withStopTimeout(Integer stopTimeout);
+
+ @CheckForNull
+ String getHostName();
+
+ CreateContainerCmd withHostName(String hostName);
+
+ @CheckForNull
+ String getImage();
+
+ CreateContainerCmd withImage(String image);
+
+ @CheckForNull
+ String getIpv4Address();
+
+ CreateContainerCmd withIpv4Address(String ipv4Address);
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Link[] getLinks() {
+ return getHostConfig().getLinks();
+ }
+
+ /**
+ * Add link to another container.
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withLinks(Link... links) {
+ requireNonNull(links, "links was not specified");
+ getHostConfig().setLinks(links);
+ return this;
+ }
+
+ /**
+ * Add link to another container.
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withLinks(List links) {
+ requireNonNull(links, "links was not specified");
+ return withLinks(links.toArray(new Link[links.size()]));
+ }
+
+ @CheckForNull
+ String getIpv6Address();
+
+ CreateContainerCmd withIpv6Address(String ipv6Address);
+
+ @CheckForNull
+ Map getLabels();
+
+ CreateContainerCmd withLabels(Map labels);
+
+ @CheckForNull
+ String getMacAddress();
+
+ CreateContainerCmd withMacAddress(String macAddress);
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Long getMemory() {
+ return getHostConfig().getMemory();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withMemory(Long memory) {
+ Objects.requireNonNull(memory, "memory was not specified");
+ getHostConfig().withMemory(memory);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Long getMemorySwap() {
+ return getHostConfig().getMemorySwap();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withMemorySwap(Long memorySwap) {
+ Objects.requireNonNull(memorySwap, "memorySwap was not specified");
+ getHostConfig().withMemorySwap(memorySwap);
+ return this;
+ }
+
+ @CheckForNull
+ String getName();
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default String getNetworkMode() {
+ return getHostConfig().getNetworkMode();
+ }
+
+ /**
+ * 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.
+ *
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withNetworkMode(String networkMode) {
+ Objects.requireNonNull(networkMode, "networkMode was not specified");
+ getHostConfig().withNetworkMode(networkMode);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Ports getPortBindings() {
+ return getHostConfig().getPortBindings();
+ }
+
+ /**
+ * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of the
+ * docker run CLI command.
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withPortBindings(PortBinding... portBindings) {
+ Objects.requireNonNull(portBindings, "portBindings was not specified");
+ getHostConfig().withPortBindings(new Ports(portBindings));
+ return this;
+ }
+
+ /**
+ * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of the
+ * docker run CLI command.
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withPortBindings(List portBindings) {
+ Objects.requireNonNull(portBindings, "portBindings was not specified");
+ return withPortBindings(portBindings.toArray(new PortBinding[0]));
+ }
+
+ /**
+ * Add the port bindings that are contained in the given {@link Ports} object.
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withPortBindings(Ports portBindings) {
+ Objects.requireNonNull(portBindings, "portBindings was not specified");
+ getHostConfig().withPortBindings(portBindings);
+ return this;
+ }
+
+ CreateContainerCmd withName(String name);
+
+ @CheckForNull
+ String[] getPortSpecs();
+
+ CreateContainerCmd withPortSpecs(String... portSpecs);
+
+ CreateContainerCmd withPortSpecs(List portSpecs);
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Boolean getPrivileged() {
+ return getHostConfig().getPrivileged();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withPrivileged(Boolean privileged) {
+ Objects.requireNonNull(privileged, "no privileged was specified");
+ getHostConfig().withPrivileged(privileged);
+ return this;
+ }
+
+ @CheckForNull
+ String getUser();
+
+ CreateContainerCmd withUser(String user);
+
+ @CheckForNull
+ Volume[] getVolumes();
+
+ CreateContainerCmd withVolumes(Volume... volumes);
+
+ CreateContainerCmd withVolumes(List volumes);
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default VolumesFrom[] getVolumesFrom() {
+ return getHostConfig().getVolumesFrom();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom) {
+ Objects.requireNonNull(volumesFrom, "volumesFrom was not specified");
+ getHostConfig().withVolumesFrom(volumesFrom);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withVolumesFrom(List volumesFrom) {
+ requireNonNull(volumesFrom, "volumesFrom was not specified");
+ return withVolumesFrom(volumesFrom.toArray(new VolumesFrom[volumesFrom.size()]));
+ }
+
+ @CheckForNull
+ String getWorkingDir();
+
+ CreateContainerCmd withWorkingDir(String workingDir);
+
+ @CheckForNull
+ Boolean isAttachStderr();
+
+ CreateContainerCmd withAttachStderr(Boolean attachStderr);
+
+ @CheckForNull
+ Boolean isAttachStdin();
+
+ CreateContainerCmd withAttachStdin(Boolean attachStdin);
+
+ @CheckForNull
+ Boolean isAttachStdout();
+
+ CreateContainerCmd withAttachStdout(Boolean attachStdout);
+
+ @CheckForNull
+ Boolean isNetworkDisabled();
+
+ CreateContainerCmd withNetworkDisabled(Boolean disableNetwork);
+
+ @CheckForNull
+ Boolean isStdInOnce();
+
+ CreateContainerCmd withStdInOnce(Boolean stdInOnce);
+
+ @CheckForNull
+ Boolean isStdinOpen();
+
+ CreateContainerCmd withStdinOpen(Boolean stdinOpen);
+
+ @CheckForNull
+ Boolean isTty();
+
+ CreateContainerCmd withTty(Boolean tty);
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Boolean getPublishAllPorts() {
+ return getHostConfig().getPublishAllPorts();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withPublishAllPorts(Boolean publishAllPorts) {
+ requireNonNull(publishAllPorts, "no publishAllPorts was specified");
+ getHostConfig().withPublishAllPorts(publishAllPorts);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @CheckForNull
+ @Deprecated
+ @JsonIgnore
+ default String[] getExtraHosts() {
+ return getHostConfig().getExtraHosts();
+ }
+
+ /**
+ * Add hostnames to /etc/hosts in the container
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withExtraHosts(String... extraHosts) {
+ requireNonNull(extraHosts, "extraHosts was not specified");
+ getHostConfig().withExtraHosts(extraHosts);
+ return this;
+ }
+
+ /**
+ * Add hostnames to /etc/hosts in the container
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withExtraHosts(List extraHosts) {
+ requireNonNull(extraHosts, "extraHosts was not specified");
+ return withExtraHosts(extraHosts.toArray(new String[extraHosts.size()]));
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @CheckForNull
+ @Deprecated
+ @JsonIgnore
+ default Capability[] getCapAdd() {
+ return getHostConfig().getCapAdd();
+ }
+
+ /**
+ * Add linux kernel capability to the container. For example:
+ * adding {@link Capability#MKNOD} allows the container to create special files using the 'mknod' command.
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withCapAdd(Capability... capAdd) {
+ requireNonNull(capAdd, "capAdd was not specified");
+ getHostConfig().withCapAdd(capAdd);
+ return this;
+ }
+
+ /**
+ * Add linux kernel capability to the container. For example:
+ * adding {@link Capability#MKNOD} allows the container to create special files using the 'mknod' command.
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withCapAdd(List capAdd) {
+ requireNonNull(capAdd, "capAdd was not specified");
+ return withCapAdd(capAdd.toArray(new Capability[capAdd.size()]));
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @CheckForNull
+ @Deprecated
+ @JsonIgnore
+ default Capability[] getCapDrop() {
+ return getHostConfig().getCapDrop();
+ }
+
+ /**
+ * Drop linux kernel capability from the container. For example:
+ * dropping {@link Capability#CHOWN} prevents the container from changing the owner of any files.
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withCapDrop(Capability... capDrop) {
+ requireNonNull(capDrop, "capDrop was not specified");
+ getHostConfig().withCapDrop(capDrop);
+ return this;
+ }
+
+ /**
+ * Drop linux kernel capability from the container. For example:
+ * dropping {@link Capability#CHOWN} prevents the container from changing the owner of any files.
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withCapDrop(List capDrop) {
+ requireNonNull(capDrop, "capDrop was not specified");
+ return withCapDrop(capDrop.toArray(new Capability[capDrop.size()]));
+ }
+
+
+ @CheckForNull
+ List getOnBuild();
+
+ CreateContainerCmd withOnBuild(List onBuild);
+
+ @CheckForNull
+ HostConfig getHostConfig();
+
+ CreateContainerCmd withHostConfig(HostConfig hostConfig);
+
+ // The following methods are deprecated and should be set on {@link #getHostConfig()} instead.
+ // TODO remove in the next big release
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Integer getBlkioWeight() {
+ return getHostConfig().getBlkioWeight();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @CheckForNull
+ @Deprecated
+ @JsonIgnore
+ default String getCgroupParent() {
+ return getHostConfig().getCgroupParent();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Integer getCpuPeriod() {
+ Long result = getHostConfig().getCpuPeriod();
+ return result != null ? result.intValue() : null;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Integer getCpuShares() {
+ return getHostConfig().getCpuShares();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default String getCpusetCpus() {
+ return getHostConfig().getCpusetCpus();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default String getCpusetMems() {
+ return getHostConfig().getCpusetMems();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Device[] getDevices() {
+ return getHostConfig().getDevices();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default String[] getDns() {
+ return getHostConfig().getDns();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default String[] getDnsSearch() {
+ return getHostConfig().getDnsSearch();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default LogConfig getLogConfig() {
+ return getHostConfig().getLogConfig();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default LxcConf[] getLxcConf() {
+ return getHostConfig().getLxcConf();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Boolean getOomKillDisable() {
+ return getHostConfig().getOomKillDisable();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default String getPidMode() {
+ return getHostConfig().getPidMode();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Boolean getReadonlyRootfs() {
+ return getHostConfig().getReadonlyRootfs();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default RestartPolicy getRestartPolicy() {
+ return getHostConfig().getRestartPolicy();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @CheckForNull
+ @JsonIgnore
+ default Ulimit[] getUlimits() {
+ return getHostConfig().getUlimits();
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withBlkioWeight(Integer blkioWeight) {
+ getHostConfig().withBlkioWeight(blkioWeight);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withCgroupParent(String cgroupParent) {
+ getHostConfig().withCgroupParent(cgroupParent);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withContainerIDFile(String containerIDFile) {
+ getHostConfig().withContainerIDFile(containerIDFile);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withCpuPeriod(Integer cpuPeriod) {
+ getHostConfig().withCpuPeriod(cpuPeriod != null ? cpuPeriod.longValue() : null);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withCpuShares(Integer cpuShares) {
+ getHostConfig().withCpuShares(cpuShares);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withCpusetCpus(String cpusetCpus) {
+ getHostConfig().withCpusetCpus(cpusetCpus);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withCpusetMems(String cpusetMems) {
+ getHostConfig().withCpusetMems(cpusetMems);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withDevices(Device... devices) {
+ getHostConfig().withDevices(devices);
+ return this;
+ }
+
+ /**
+ * Add host devices to the container
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withDevices(List devices) {
+ getHostConfig().withDevices(devices);
+ return this;
+ }
+
+ /**
+ * Set custom DNS servers
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withDns(String... dns) {
+ getHostConfig().withDns(dns);
+ return this;
+ }
+
+ /**
+ * Set custom DNS servers
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withDns(List dns) {
+ getHostConfig().withDns(dns);
+ return this;
+ }
+
+ /**
+ * Set custom DNS search domains
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withDnsSearch(String... dnsSearch) {
+ getHostConfig().withDnsSearch(dnsSearch);
+ return this;
+ }
+
+ /**
+ * Set custom DNS search domains
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withDnsSearch(List dnsSearch) {
+ getHostConfig().withDnsSearch(dnsSearch);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withLogConfig(LogConfig logConfig) {
+ getHostConfig().withLogConfig(logConfig);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withLxcConf(LxcConf... lxcConf) {
+ getHostConfig().withLxcConf(lxcConf);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withLxcConf(List lxcConf) {
+ getHostConfig().withLxcConf(lxcConf.toArray(new LxcConf[0]));
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withOomKillDisable(Boolean oomKillDisable) {
+ getHostConfig().withOomKillDisable(oomKillDisable);
+ return this;
+ }
+
+ /**
+ * Set the PID (Process) Namespace mode for the container, 'host': use the host's PID namespace inside the container
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withPidMode(String pidMode) {
+ getHostConfig().withPidMode(pidMode);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withReadonlyRootfs(Boolean readonlyRootfs) {
+ getHostConfig().withReadonlyRootfs(readonlyRootfs);
+ return this;
+ }
+
+ /**
+ * Set custom {@link RestartPolicy} for the container. Defaults to {@link RestartPolicy#noRestart()}
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) {
+ getHostConfig().withRestartPolicy(restartPolicy);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ @JsonIgnore
+ default CreateContainerCmd withUlimits(Ulimit... ulimits) {
+ getHostConfig().withUlimits(ulimits);
+ return this;
+ }
+
+ /**
+ *
+ * @deprecated see {@link #getHostConfig()}
+ */
+ @Deprecated
+ default CreateContainerCmd withUlimits(List ulimits) {
+ getHostConfig().withUlimits(ulimits);
+ return this;
+ }
+
+ @CheckForNull
+ default String getPlatform() {
+ return null;
+ }
+
+ CreateContainerCmd withPlatform(String platform);
+
+ /**
+ * @throws NotFoundException No such container
+ * @throws ConflictException Named container already exists
+ */
+ @Override
+ CreateContainerResponse exec() throws NotFoundException, ConflictException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerResponse.java
new file mode 100644
index 000000000..ad24d7ec8
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerResponse.java
@@ -0,0 +1,38 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+@EqualsAndHashCode
+@ToString
+public class CreateContainerResponse extends DockerObject {
+
+ @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;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java
similarity index 83%
rename from src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java
index 86935cd10..4e78dd5e0 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java
@@ -13,6 +13,9 @@ public interface CreateImageCmd extends SyncDockerCmd {
@CheckForNull
String getTag();
+ @CheckForNull
+ String getPlatform();
+
@CheckForNull
InputStream getImageStream();
@@ -35,6 +38,12 @@ public interface CreateImageCmd extends SyncDockerCmd {
*/
CreateImageCmd withTag(String tag);
+ /**
+ * @param platform
+ * the platform for this image
+ */
+ CreateImageCmd withPlatform(String platform);
+
interface Exec extends DockerCmdSyncExec {
}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageResponse.java
new file mode 100644
index 000000000..53b2b5367
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageResponse.java
@@ -0,0 +1,24 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * Parse reponses from /images/create
+ *
+ * @author Ryan Campbell (ryan.campbell@gmail.com)
+ *
+ */
+@EqualsAndHashCode
+@ToString
+public class CreateImageResponse extends DockerObject {
+
+ @JsonProperty("status")
+ private String id;
+
+ public String getId() {
+ return id;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
similarity index 94%
rename from src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
index 298e05aca..56b9df17a 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java
@@ -2,7 +2,6 @@
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.api.model.Network.Ipam;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
@@ -48,7 +47,7 @@ public interface CreateNetworkCmd extends SyncDockerCmd {
/** Name of the network driver to use. Defaults to bridge. */
CreateNetworkCmd withDriver(String driver);
- /** Ipam config, such es subnet, gateway and ip range of the network */
+ /** Ipam config, such as subnet, gateway and ip range of the network */
CreateNetworkCmd withIpam(Ipam ipam);
/** Driver specific options */
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java
new file mode 100644
index 000000000..3f6f219e1
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java
@@ -0,0 +1,33 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@EqualsAndHashCode
+@ToString
+public class CreateNetworkResponse extends DockerObject {
+
+ @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;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretCmd.java
new file mode 100644
index 000000000..c27e42317
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretCmd.java
@@ -0,0 +1,29 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.ConflictException;
+import com.github.dockerjava.api.model.SecretSpec;
+
+import javax.annotation.CheckForNull;
+
+/**
+ * Command to create a new secret
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+public interface CreateSecretCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ SecretSpec getSecretSpec();
+
+ CreateSecretCmd withSecretSpec(SecretSpec secretSpec);
+
+ /**
+ * @throws ConflictException Named secret already exists
+ */
+ @Override
+ CreateSecretResponse exec() throws ConflictException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretResponse.java
new file mode 100644
index 000000000..2c1b6f11b
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretResponse.java
@@ -0,0 +1,20 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * The response of a {@link CreateSecretCmd}
+ */
+@EqualsAndHashCode
+@ToString
+public class CreateSecretResponse extends DockerObject {
+ @JsonProperty("ID")
+ private String id;
+
+ public String getId() {
+ return id;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateServiceCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceCmd.java
similarity index 82%
rename from src/main/java/com/github/dockerjava/api/command/CreateServiceCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceCmd.java
index d8c2bc5e3..bfcce27ad 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateServiceCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceCmd.java
@@ -1,8 +1,8 @@
package com.github.dockerjava.api.command;
import com.github.dockerjava.api.exception.ConflictException;
+import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.ServiceSpec;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
@@ -16,8 +16,13 @@ public interface CreateServiceCmd extends SyncDockerCmd {
@CheckForNull
ServiceSpec getServiceSpec();
+ @CheckForNull
+ AuthConfig getAuthConfig();
+
CreateServiceCmd withServiceSpec(ServiceSpec serviceSpec);
+ CreateServiceCmd withAuthConfig(AuthConfig authConfig);
+
/**
* @throws ConflictException
* Named service already exists
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceResponse.java
new file mode 100644
index 000000000..b68343f55
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceResponse.java
@@ -0,0 +1,20 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * The response of a {@link CreateServiceCmd}
+ */
+@EqualsAndHashCode
+@ToString
+public class CreateServiceResponse extends DockerObject {
+ @JsonProperty("ID")
+ private String id;
+
+ public String getId() {
+ return id;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java
similarity index 78%
rename from src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java
index 3d052033f..4a3ef9819 100644
--- a/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java
@@ -9,6 +9,9 @@ public interface CreateVolumeCmd extends SyncDockerCmd {
@CheckForNull
String getName();
+ @CheckForNull
+ Map getLabels();
+
@CheckForNull
String getDriver();
@@ -21,6 +24,12 @@ public interface CreateVolumeCmd extends SyncDockerCmd {
*/
CreateVolumeCmd withName(String name);
+ /**
+ * @param labels
+ * - A mapping of labels keys and values. Labels are a mechanism for applying metadata to Docker objects.
+ */
+ CreateVolumeCmd withLabels(Map labels);
+
/**
* @param driver
* - Name of the volume driver to use. Defaults to local for the name.
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java
new file mode 100644
index 000000000..4afc6f6ba
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java
@@ -0,0 +1,45 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Marcus Linke
+ */
+@EqualsAndHashCode
+@ToString
+public class CreateVolumeResponse extends DockerObject {
+
+ @JsonProperty("Name")
+ private String name;
+
+ @JsonProperty("Labels")
+ private Map labels;
+
+ @JsonProperty("Driver")
+ private String driver;
+
+ @JsonProperty("Mountpoint")
+ private String mountpoint;
+
+ public String getName() {
+ return name;
+ }
+
+ public Map getLabels() {
+ return labels;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+ public String getMountpoint() {
+ return mountpoint;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java
new file mode 100644
index 000000000..161ff2c29
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java
@@ -0,0 +1,412 @@
+package com.github.dockerjava.api.command;
+
+import java.io.IOException;
+
+public class DelegatingDockerCmdExecFactory implements DockerCmdExecFactory {
+
+ // We're not using abstract class because we want
+ // the compiler to force us to implement new DockerCmdExecFactory when added
+ public DockerCmdExecFactory getDockerCmdExecFactory() {
+ throw new IllegalStateException("Implement me!");
+ }
+
+ @Override
+ public AuthCmd.Exec createAuthCmdExec() {
+ return getDockerCmdExecFactory().createAuthCmdExec();
+ }
+
+ @Override
+ public InfoCmd.Exec createInfoCmdExec() {
+ return getDockerCmdExecFactory().createInfoCmdExec();
+ }
+
+ @Override
+ public PingCmd.Exec createPingCmdExec() {
+ return getDockerCmdExecFactory().createPingCmdExec();
+ }
+
+ @Override
+ public ResizeContainerCmd.Exec createResizeContainerCmdExec() {
+ return getDockerCmdExecFactory().createResizeContainerCmdExec();
+ }
+
+ @Override
+ public ExecCreateCmd.Exec createExecCmdExec() {
+ return getDockerCmdExecFactory().createExecCmdExec();
+ }
+
+ @Override
+ public ResizeExecCmd.Exec createResizeExecCmdExec() {
+ return getDockerCmdExecFactory().createResizeExecCmdExec();
+ }
+
+ @Override
+ public VersionCmd.Exec createVersionCmdExec() {
+ return getDockerCmdExecFactory().createVersionCmdExec();
+ }
+
+ @Override
+ public PullImageCmd.Exec createPullImageCmdExec() {
+ return getDockerCmdExecFactory().createPullImageCmdExec();
+ }
+
+ @Override
+ public PushImageCmd.Exec createPushImageCmdExec() {
+ return getDockerCmdExecFactory().createPushImageCmdExec();
+ }
+
+ @Override
+ public SaveImageCmd.Exec createSaveImageCmdExec() {
+ return getDockerCmdExecFactory().createSaveImageCmdExec();
+ }
+
+ @Override
+ public SaveImagesCmd.Exec createSaveImagesCmdExec() {
+ return getDockerCmdExecFactory().createSaveImagesCmdExec();
+ }
+
+ @Override
+ public CreateImageCmd.Exec createCreateImageCmdExec() {
+ return getDockerCmdExecFactory().createCreateImageCmdExec();
+ }
+
+ @Override
+ public LoadImageCmd.Exec createLoadImageCmdExec() {
+ return getDockerCmdExecFactory().createLoadImageCmdExec();
+ }
+
+ @Override
+ public LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec() {
+ return getDockerCmdExecFactory().createLoadImageAsyncCmdExec();
+ }
+
+ @Override
+ public SearchImagesCmd.Exec createSearchImagesCmdExec() {
+ return getDockerCmdExecFactory().createSearchImagesCmdExec();
+ }
+
+ @Override
+ public RemoveImageCmd.Exec createRemoveImageCmdExec() {
+ return getDockerCmdExecFactory().createRemoveImageCmdExec();
+ }
+
+ @Override
+ public ListImagesCmd.Exec createListImagesCmdExec() {
+ return getDockerCmdExecFactory().createListImagesCmdExec();
+ }
+
+ @Override
+ public InspectImageCmd.Exec createInspectImageCmdExec() {
+ return getDockerCmdExecFactory().createInspectImageCmdExec();
+ }
+
+ @Override
+ public ListContainersCmd.Exec createListContainersCmdExec() {
+ return getDockerCmdExecFactory().createListContainersCmdExec();
+ }
+
+ @Override
+ public CreateContainerCmd.Exec createCreateContainerCmdExec() {
+ return getDockerCmdExecFactory().createCreateContainerCmdExec();
+ }
+
+ @Override
+ public StartContainerCmd.Exec createStartContainerCmdExec() {
+ return getDockerCmdExecFactory().createStartContainerCmdExec();
+ }
+
+ @Override
+ public InspectContainerCmd.Exec createInspectContainerCmdExec() {
+ return getDockerCmdExecFactory().createInspectContainerCmdExec();
+ }
+
+ @Override
+ public RemoveContainerCmd.Exec createRemoveContainerCmdExec() {
+ return getDockerCmdExecFactory().createRemoveContainerCmdExec();
+ }
+
+ @Override
+ public WaitContainerCmd.Exec createWaitContainerCmdExec() {
+ return getDockerCmdExecFactory().createWaitContainerCmdExec();
+ }
+
+ @Override
+ public AttachContainerCmd.Exec createAttachContainerCmdExec() {
+ return getDockerCmdExecFactory().createAttachContainerCmdExec();
+ }
+
+ @Override
+ public ExecStartCmd.Exec createExecStartCmdExec() {
+ return getDockerCmdExecFactory().createExecStartCmdExec();
+ }
+
+ @Override
+ public InspectExecCmd.Exec createInspectExecCmdExec() {
+ return getDockerCmdExecFactory().createInspectExecCmdExec();
+ }
+
+ @Override
+ public LogContainerCmd.Exec createLogContainerCmdExec() {
+ return getDockerCmdExecFactory().createLogContainerCmdExec();
+ }
+
+ @Override
+ public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() {
+ return getDockerCmdExecFactory().createCopyFileFromContainerCmdExec();
+ }
+
+ @Override
+ public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() {
+ return getDockerCmdExecFactory().createCopyArchiveFromContainerCmdExec();
+ }
+
+ @Override
+ public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() {
+ return getDockerCmdExecFactory().createCopyArchiveToContainerCmdExec();
+ }
+
+ @Override
+ public StopContainerCmd.Exec createStopContainerCmdExec() {
+ return getDockerCmdExecFactory().createStopContainerCmdExec();
+ }
+
+ @Override
+ public ContainerDiffCmd.Exec createContainerDiffCmdExec() {
+ return getDockerCmdExecFactory().createContainerDiffCmdExec();
+ }
+
+ @Override
+ public KillContainerCmd.Exec createKillContainerCmdExec() {
+ return getDockerCmdExecFactory().createKillContainerCmdExec();
+ }
+
+ @Override
+ public UpdateContainerCmd.Exec createUpdateContainerCmdExec() {
+ return getDockerCmdExecFactory().createUpdateContainerCmdExec();
+ }
+
+ @Override
+ public RenameContainerCmd.Exec createRenameContainerCmdExec() {
+ return getDockerCmdExecFactory().createRenameContainerCmdExec();
+ }
+
+ @Override
+ public RestartContainerCmd.Exec createRestartContainerCmdExec() {
+ return getDockerCmdExecFactory().createRestartContainerCmdExec();
+ }
+
+ @Override
+ public CommitCmd.Exec createCommitCmdExec() {
+ return getDockerCmdExecFactory().createCommitCmdExec();
+ }
+
+ @Override
+ public BuildImageCmd.Exec createBuildImageCmdExec() {
+ return getDockerCmdExecFactory().createBuildImageCmdExec();
+ }
+
+ @Override
+ public TopContainerCmd.Exec createTopContainerCmdExec() {
+ return getDockerCmdExecFactory().createTopContainerCmdExec();
+ }
+
+ @Override
+ public TagImageCmd.Exec createTagImageCmdExec() {
+ return getDockerCmdExecFactory().createTagImageCmdExec();
+ }
+
+ @Override
+ public PauseContainerCmd.Exec createPauseContainerCmdExec() {
+ return getDockerCmdExecFactory().createPauseContainerCmdExec();
+ }
+
+ @Override
+ public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() {
+ return getDockerCmdExecFactory().createUnpauseContainerCmdExec();
+ }
+
+ @Override
+ public EventsCmd.Exec createEventsCmdExec() {
+ return getDockerCmdExecFactory().createEventsCmdExec();
+ }
+
+ @Override
+ public StatsCmd.Exec createStatsCmdExec() {
+ return getDockerCmdExecFactory().createStatsCmdExec();
+ }
+
+ @Override
+ public CreateVolumeCmd.Exec createCreateVolumeCmdExec() {
+ return getDockerCmdExecFactory().createCreateVolumeCmdExec();
+ }
+
+ @Override
+ public InspectVolumeCmd.Exec createInspectVolumeCmdExec() {
+ return getDockerCmdExecFactory().createInspectVolumeCmdExec();
+ }
+
+ @Override
+ public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() {
+ return getDockerCmdExecFactory().createRemoveVolumeCmdExec();
+ }
+
+ @Override
+ public ListVolumesCmd.Exec createListVolumesCmdExec() {
+ return getDockerCmdExecFactory().createListVolumesCmdExec();
+ }
+
+ @Override
+ public ListNetworksCmd.Exec createListNetworksCmdExec() {
+ return getDockerCmdExecFactory().createListNetworksCmdExec();
+ }
+
+ @Override
+ public InspectNetworkCmd.Exec createInspectNetworkCmdExec() {
+ return getDockerCmdExecFactory().createInspectNetworkCmdExec();
+ }
+
+ @Override
+ public CreateNetworkCmd.Exec createCreateNetworkCmdExec() {
+ return getDockerCmdExecFactory().createCreateNetworkCmdExec();
+ }
+
+ @Override
+ public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() {
+ return getDockerCmdExecFactory().createRemoveNetworkCmdExec();
+ }
+
+ @Override
+ public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() {
+ return getDockerCmdExecFactory().createConnectToNetworkCmdExec();
+ }
+
+ @Override
+ public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() {
+ return getDockerCmdExecFactory().createDisconnectFromNetworkCmdExec();
+ }
+
+ @Override
+ public InitializeSwarmCmd.Exec createInitializeSwarmCmdExec() {
+ return getDockerCmdExecFactory().createInitializeSwarmCmdExec();
+ }
+
+ @Override
+ public InspectSwarmCmd.Exec createInspectSwarmCmdExec() {
+ return getDockerCmdExecFactory().createInspectSwarmCmdExec();
+ }
+
+ @Override
+ public JoinSwarmCmd.Exec createJoinSwarmCmdExec() {
+ return getDockerCmdExecFactory().createJoinSwarmCmdExec();
+ }
+
+ @Override
+ public LeaveSwarmCmd.Exec createLeaveSwarmCmdExec() {
+ return getDockerCmdExecFactory().createLeaveSwarmCmdExec();
+ }
+
+ @Override
+ public UpdateSwarmCmd.Exec createUpdateSwarmCmdExec() {
+ return getDockerCmdExecFactory().createUpdateSwarmCmdExec();
+ }
+
+ @Override
+ public ListServicesCmd.Exec createListServicesCmdExec() {
+ return getDockerCmdExecFactory().createListServicesCmdExec();
+ }
+
+ @Override
+ public CreateServiceCmd.Exec createCreateServiceCmdExec() {
+ return getDockerCmdExecFactory().createCreateServiceCmdExec();
+ }
+
+ @Override
+ public InspectServiceCmd.Exec createInspectServiceCmdExec() {
+ return getDockerCmdExecFactory().createInspectServiceCmdExec();
+ }
+
+ @Override
+ public UpdateServiceCmd.Exec createUpdateServiceCmdExec() {
+ return getDockerCmdExecFactory().createUpdateServiceCmdExec();
+ }
+
+ @Override
+ public RemoveServiceCmd.Exec createRemoveServiceCmdExec() {
+ return getDockerCmdExecFactory().createRemoveServiceCmdExec();
+ }
+
+ @Override
+ public LogSwarmObjectCmd.Exec logSwarmObjectExec(String endpoint) {
+ return getDockerCmdExecFactory().logSwarmObjectExec(endpoint);
+ }
+
+ @Override
+ public ListSwarmNodesCmd.Exec listSwarmNodeCmdExec() {
+ return getDockerCmdExecFactory().listSwarmNodeCmdExec();
+ }
+
+ @Override
+ public InspectSwarmNodeCmd.Exec inspectSwarmNodeCmdExec() {
+ return getDockerCmdExecFactory().inspectSwarmNodeCmdExec();
+ }
+
+ @Override
+ public RemoveSwarmNodeCmd.Exec removeSwarmNodeCmdExec() {
+ return getDockerCmdExecFactory().removeSwarmNodeCmdExec();
+ }
+
+ @Override
+ public UpdateSwarmNodeCmd.Exec updateSwarmNodeCmdExec() {
+ return getDockerCmdExecFactory().updateSwarmNodeCmdExec();
+ }
+
+ @Override
+ public ListTasksCmd.Exec listTasksCmdExec() {
+ return getDockerCmdExecFactory().listTasksCmdExec();
+ }
+
+ @Override
+ public PruneCmd.Exec pruneCmdExec() {
+ return getDockerCmdExecFactory().pruneCmdExec();
+ }
+
+ @Override
+ public ListSecretsCmd.Exec createListSecretsCmdExec() {
+ return getDockerCmdExecFactory().createListSecretsCmdExec();
+ }
+
+ @Override
+ public CreateSecretCmd.Exec createCreateSecretCmdExec() {
+ return getDockerCmdExecFactory().createCreateSecretCmdExec();
+ }
+
+ @Override
+ public RemoveSecretCmd.Exec createRemoveSecretCmdExec() {
+ return getDockerCmdExecFactory().createRemoveSecretCmdExec();
+ }
+
+ @Override
+ public ListConfigsCmd.Exec createListConfigsCmdExec() {
+ return getDockerCmdExecFactory().createListConfigsCmdExec();
+ }
+
+ @Override
+ public CreateConfigCmd.Exec createCreateConfigCmdExec() {
+ return getDockerCmdExecFactory().createCreateConfigCmdExec();
+ }
+
+ @Override
+ public InspectConfigCmd.Exec createInspectConfigCmdExec() {
+ return getDockerCmdExecFactory().createInspectConfigCmdExec();
+ }
+
+ @Override
+ public RemoveConfigCmd.Exec createRemoveConfigCmdExec() {
+ return getDockerCmdExecFactory().createRemoveConfigCmdExec();
+ }
+
+ @Override
+ public void close() throws IOException {
+ getDockerCmdExecFactory().close();
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java
similarity index 93%
rename from src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java
index ce75172b4..07dadec1e 100644
--- a/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java
@@ -1,7 +1,5 @@
package com.github.dockerjava.api.command;
-import com.github.dockerjava.core.RemoteApiVersion;
-
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/DockerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
new file mode 100644
index 000000000..cedf6d40d
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java
@@ -0,0 +1,273 @@
+package com.github.dockerjava.api.command;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+public interface DockerCmdExecFactory extends Closeable {
+
+ AuthCmd.Exec createAuthCmdExec();
+
+ InfoCmd.Exec createInfoCmdExec();
+
+ PingCmd.Exec createPingCmdExec();
+
+ ExecCreateCmd.Exec createExecCmdExec();
+
+ VersionCmd.Exec createVersionCmdExec();
+
+ PullImageCmd.Exec createPullImageCmdExec();
+
+ PushImageCmd.Exec createPushImageCmdExec();
+
+ SaveImageCmd.Exec createSaveImageCmdExec();
+
+ SaveImagesCmd.Exec createSaveImagesCmdExec();
+
+ CreateImageCmd.Exec createCreateImageCmdExec();
+
+ LoadImageCmd.Exec createLoadImageCmdExec();
+
+ LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec();
+
+ SearchImagesCmd.Exec createSearchImagesCmdExec();
+
+ RemoveImageCmd.Exec createRemoveImageCmdExec();
+
+ ListImagesCmd.Exec createListImagesCmdExec();
+
+ InspectImageCmd.Exec createInspectImageCmdExec();
+
+ ListContainersCmd.Exec createListContainersCmdExec();
+
+ CreateContainerCmd.Exec createCreateContainerCmdExec();
+
+ StartContainerCmd.Exec createStartContainerCmdExec();
+
+ InspectContainerCmd.Exec createInspectContainerCmdExec();
+
+ RemoveContainerCmd.Exec createRemoveContainerCmdExec();
+
+ WaitContainerCmd.Exec createWaitContainerCmdExec();
+
+ AttachContainerCmd.Exec createAttachContainerCmdExec();
+
+ ResizeContainerCmd.Exec createResizeContainerCmdExec();
+
+ ExecStartCmd.Exec createExecStartCmdExec();
+
+ ResizeExecCmd.Exec createResizeExecCmdExec();
+
+ InspectExecCmd.Exec createInspectExecCmdExec();
+
+ LogContainerCmd.Exec createLogContainerCmdExec();
+
+ CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec();
+
+ CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec();
+
+ CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec();
+
+ StopContainerCmd.Exec createStopContainerCmdExec();
+
+ ContainerDiffCmd.Exec createContainerDiffCmdExec();
+
+ KillContainerCmd.Exec createKillContainerCmdExec();
+
+ UpdateContainerCmd.Exec createUpdateContainerCmdExec();
+
+ /**
+ * Rename container.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_17}
+ */
+ RenameContainerCmd.Exec createRenameContainerCmdExec();
+
+ RestartContainerCmd.Exec createRestartContainerCmdExec();
+
+ CommitCmd.Exec createCommitCmdExec();
+
+ BuildImageCmd.Exec createBuildImageCmdExec();
+
+ TopContainerCmd.Exec createTopContainerCmdExec();
+
+ TagImageCmd.Exec createTagImageCmdExec();
+
+ PauseContainerCmd.Exec createPauseContainerCmdExec();
+
+ UnpauseContainerCmd.Exec createUnpauseContainerCmdExec();
+
+ EventsCmd.Exec createEventsCmdExec();
+
+ StatsCmd.Exec createStatsCmdExec();
+
+ CreateVolumeCmd.Exec createCreateVolumeCmdExec();
+
+ InspectVolumeCmd.Exec createInspectVolumeCmdExec();
+
+ RemoveVolumeCmd.Exec createRemoveVolumeCmdExec();
+
+ ListVolumesCmd.Exec createListVolumesCmdExec();
+
+ ListNetworksCmd.Exec createListNetworksCmdExec();
+
+ InspectNetworkCmd.Exec createInspectNetworkCmdExec();
+
+ CreateNetworkCmd.Exec createCreateNetworkCmdExec();
+
+ RemoveNetworkCmd.Exec createRemoveNetworkCmdExec();
+
+ ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec();
+
+ DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec();
+
+ // swarm
+ InitializeSwarmCmd.Exec createInitializeSwarmCmdExec();
+
+ InspectSwarmCmd.Exec createInspectSwarmCmdExec();
+
+ JoinSwarmCmd.Exec createJoinSwarmCmdExec();
+
+ LeaveSwarmCmd.Exec createLeaveSwarmCmdExec();
+
+ UpdateSwarmCmd.Exec createUpdateSwarmCmdExec();
+
+ /**
+ * Command to list all services in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ ListServicesCmd.Exec createListServicesCmdExec();
+
+ /**
+ * Command to create a new service in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ CreateServiceCmd.Exec createCreateServiceCmdExec();
+
+ /**
+ * Command to inspect a service in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ InspectServiceCmd.Exec createInspectServiceCmdExec();
+
+ /**
+ * Command to update a service specification in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ UpdateServiceCmd.Exec createUpdateServiceCmdExec();
+
+ /**
+ * Command to remove a service in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ RemoveServiceCmd.Exec createRemoveServiceCmdExec();
+
+ /**
+ * @param endpoint endpoint name to tail logs
+ * @return
+ * @since {@link RemoteApiVersion#VERSION_1_29}
+ */
+ LogSwarmObjectCmd.Exec logSwarmObjectExec(String endpoint);
+
+ // nodes
+
+ /**
+ * List all nodes. Node operations require the engine to be part of a swarm
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ ListSwarmNodesCmd.Exec listSwarmNodeCmdExec();
+
+ /**
+ * Return low-level information on the node. Node operations require the engine to be part of a swarm
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ InspectSwarmNodeCmd.Exec inspectSwarmNodeCmdExec();
+
+ /**
+ * Remove a node from the swarm. Node operations require the engine to be part of a swarm
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ RemoveSwarmNodeCmd.Exec removeSwarmNodeCmdExec();
+
+ /**
+ * Update a node. Node operations require the engine to be part of a swarm
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ UpdateSwarmNodeCmd.Exec updateSwarmNodeCmdExec();
+
+ /**
+ * Update a node. Node operations require the engine to be part of a swarm
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+ ListTasksCmd.Exec listTasksCmdExec();
+
+ /**
+ * Delete unused content (containers, images, volumes, networks, build relicts)
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ PruneCmd.Exec pruneCmdExec();
+
+ /**
+ * Command to list all secrets.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ ListSecretsCmd.Exec createListSecretsCmdExec();
+
+ /**
+ * Command to create a new secret in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ CreateSecretCmd.Exec createCreateSecretCmdExec();
+
+ /**
+ * Command to remove a secret in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ RemoveSecretCmd.Exec createRemoveSecretCmdExec();
+
+ /**
+ * Command to list all configs.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+ ListConfigsCmd.Exec createListConfigsCmdExec();
+
+ /**
+ * Command to inspect a config in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+ InspectConfigCmd.Exec createInspectConfigCmdExec();
+
+ /**
+ * Command to create a new config in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+ CreateConfigCmd.Exec createCreateConfigCmdExec();
+
+ /**
+ * Command to remove a config in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+ RemoveConfigCmd.Exec createRemoveConfigCmdExec();
+
+
+ @Override
+ void close() throws IOException;
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java
new file mode 100644
index 000000000..34a0c5ad5
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java
@@ -0,0 +1,88 @@
+package com.github.dockerjava.api.command;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import javax.annotation.CheckForNull;
+
+import com.github.dockerjava.api.model.Event;
+import com.github.dockerjava.api.model.EventType;
+
+/**
+ * Get events
+ */
+public interface EventsCmd extends AsyncDockerCmd {
+
+ @CheckForNull
+ Map> getFilters();
+
+ @CheckForNull
+ String getSince();
+
+ @CheckForNull
+ String getUntil();
+
+ /**
+ * @param container
+ * - container to filter
+ */
+ EventsCmd withContainerFilter(String... container);
+
+ /**
+ * @param event
+ * - event to filter (pull | create | attach | start | stop | kill)
+ */
+ EventsCmd withEventFilter(String... event);
+
+ /**
+ * @param eventTypes event types to filter
+ */
+ EventsCmd withEventTypeFilter(String... eventTypes);
+
+ /**
+ * This provides a type safe version of {@link #withEventTypeFilter(String...)}.
+ *
+ * @param eventTypes event types to filter
+ */
+ default EventsCmd withEventTypeFilter(EventType... eventTypes) {
+ return withEventTypeFilter(
+ Stream.of(eventTypes)
+ .map(EventType::getValue)
+ .toArray(String[]::new)
+ );
+ }
+
+ /**
+ * @param image
+ * - image to filter
+ */
+ EventsCmd withImageFilter(String... image);
+
+ /**
+ * @param label
+ * - label to filter
+ */
+ EventsCmd withLabelFilter(String... label);
+
+ /**
+ * @param labels
+ * - labels to filter (map of names and values)
+ */
+ EventsCmd withLabelFilter(Map labels);
+
+ /**
+ * @param since
+ * - Show all events created since timestamp
+ */
+ EventsCmd withSince(String since);
+
+ /**
+ * @param until
+ * - Show all events created until timestamp
+ */
+ EventsCmd withUntil(String until);
+
+ interface Exec extends DockerCmdAsyncExec {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java
new file mode 100644
index 000000000..c03a6334a
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java
@@ -0,0 +1,60 @@
+package com.github.dockerjava.api.command;
+
+import java.util.List;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+public interface ExecCreateCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ String getContainerId();
+
+ @CheckForNull
+ Boolean hasAttachStderrEnabled();
+
+ @CheckForNull
+ Boolean hasAttachStdinEnabled();
+
+ @CheckForNull
+ Boolean hasAttachStdoutEnabled();
+
+ @CheckForNull
+ Boolean hasTtyEnabled();
+
+ @CheckForNull
+ List getEnv();
+
+ @CheckForNull
+ String getUser();
+
+ @CheckForNull
+ Boolean getPrivileged();
+
+ @CheckForNull
+ String getWorkingDir();
+
+ ExecCreateCmd withAttachStderr(Boolean attachStderr);
+
+ ExecCreateCmd withAttachStdin(Boolean attachStdin);
+
+ ExecCreateCmd withAttachStdout(Boolean attachStdout);
+
+ ExecCreateCmd withCmd(String... cmd);
+
+ ExecCreateCmd withEnv(List env);
+
+ ExecCreateCmd withContainerId(@Nonnull String containerId);
+
+ ExecCreateCmd withTty(Boolean tty);
+
+ ExecCreateCmd withUser(String user);
+
+ ExecCreateCmd withPrivileged(Boolean isPrivileged);
+
+ ExecCreateCmd withWorkingDir(String workingDir);
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java
new file mode 100644
index 000000000..449803236
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java
@@ -0,0 +1,18 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@EqualsAndHashCode
+@ToString
+public class ExecCreateCmdResponse extends DockerObject {
+
+ @JsonProperty("Id")
+ private String id;
+
+ public String getId() {
+ return id;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphData.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphData.java
new file mode 100644
index 000000000..44abc176d
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphData.java
@@ -0,0 +1,112 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.annotation.CheckForNull;
+
+/**
+ * part of {@link GraphDriver}
+ * @author Kanstantsin Shautsou
+ */
+@EqualsAndHashCode
+@ToString
+public class GraphData extends DockerObject {
+
+ @JsonProperty("RootDir")
+ private String rootDir;
+
+ @JsonProperty("DeviceId")
+ private String deviceId;
+
+ @JsonProperty("DeviceName")
+ private String deviceName;
+
+ @JsonProperty("DeviceSize")
+ private String deviceSize;
+
+ @JsonProperty("dir")
+ private String dir;
+
+ /**
+ * @see #rootDir
+ */
+ @CheckForNull
+ public String getRootDir() {
+ return rootDir;
+ }
+
+ /**
+ * @see #rootDir
+ */
+ public GraphData withRootDir(String rootDir) {
+ this.rootDir = rootDir;
+ return this;
+ }
+
+ /**
+ * @see #deviceId
+ */
+ @CheckForNull
+ public String getDeviceId() {
+ return deviceId;
+ }
+
+ /**
+ * @see #deviceId
+ */
+ public GraphData withDeviceId(String deviceId) {
+ this.deviceId = deviceId;
+ return this;
+ }
+
+ /**
+ * @see #deviceName
+ */
+ @CheckForNull
+ public String getDeviceName() {
+ return deviceName;
+ }
+
+ /**
+ * @see #deviceName
+ */
+ public GraphData withDeviceName(String deviceName) {
+ this.deviceName = deviceName;
+ return this;
+ }
+
+ /**
+ * @see #deviceSize
+ */
+ @CheckForNull
+ public String getDeviceSize() {
+ return deviceSize;
+ }
+
+ /**
+ * @see #deviceSize
+ */
+ public GraphData withDeviceSize(String deviceSize) {
+ this.deviceSize = deviceSize;
+ return this;
+ }
+
+ /**
+ * @see #dir
+ */
+ @CheckForNull
+ public String getDir() {
+ return dir;
+ }
+
+ /**
+ * @see #dir
+ */
+ public GraphData withDir(String dir) {
+ this.dir = dir;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphDriver.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphDriver.java
new file mode 100644
index 000000000..4d6679416
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphDriver.java
@@ -0,0 +1,63 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.annotation.CheckForNull;
+
+/**
+ * Part of {@link InspectImageResponse} and {@link InspectContainerResponse}
+ *
+ * @author Kanstantsin Shautsou
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21}
+ */
+@EqualsAndHashCode
+@ToString
+public class GraphDriver extends DockerObject {
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21}
+ */
+ @JsonProperty("Name")
+ private String name;
+
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21}
+ */
+ @JsonProperty("Data")
+ private GraphData data;
+
+
+ /**
+ * @see #data
+ */
+ @CheckForNull
+ public GraphData getData() {
+ return data;
+ }
+
+ /**
+ * @see #data
+ */
+ public GraphDriver withData(GraphData data) {
+ this.data = data;
+ return this;
+ }
+
+ /**
+ * @see #name
+ */
+ @CheckForNull
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @see #name
+ */
+ public GraphDriver withName(String name) {
+ this.name = name;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthState.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthState.java
new file mode 100644
index 000000000..0d8e399c1
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthState.java
@@ -0,0 +1,34 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+
+@EqualsAndHashCode
+@ToString
+public class HealthState extends DockerObject {
+
+ @JsonProperty("Status")
+ private String status;
+
+ @JsonProperty("FailingStreak")
+ private Integer failingStreak;
+
+ @JsonProperty("Log")
+ private List log;
+
+ public String getStatus() {
+ return status;
+ }
+
+ public Integer getFailingStreak() {
+ return failingStreak;
+ }
+
+ public List getLog() {
+ return log;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthStateLog.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthStateLog.java
new file mode 100644
index 000000000..71939f872
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthStateLog.java
@@ -0,0 +1,48 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@EqualsAndHashCode
+@ToString
+public class HealthStateLog extends DockerObject {
+
+ @JsonProperty("Start")
+ private String start;
+
+ @JsonProperty("End")
+ private String end;
+
+ @JsonProperty("ExitCode")
+ private Long exitCode;
+
+ @JsonProperty("Output")
+ private String output;
+
+ public String getStart() {
+ return start;
+ }
+
+ public String getEnd() {
+ return end;
+ }
+
+ /**
+ *
+ * @deprecated use {@link #getExitCodeLong()}
+ */
+ @Deprecated
+ public Integer getExitCode() {
+ return exitCode != null ? exitCode.intValue() : null;
+ }
+
+ public Long getExitCodeLong() {
+ return exitCode;
+ }
+
+ public String getOutput() {
+ return output;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/InfoCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InfoCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/InfoCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InfoCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/InitializeSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InitializeSwarmCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/InitializeSwarmCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InitializeSwarmCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectConfigCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectConfigCmd.java
new file mode 100644
index 000000000..96374d795
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectConfigCmd.java
@@ -0,0 +1,25 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.api.model.Config;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+public interface InspectConfigCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ String getConfigId();
+
+ InspectConfigCmd withConfigId(@Nonnull String configId);
+
+ /**
+ * @throws NotFoundException
+ * No such config
+ */
+ @Override
+ Config exec() throws NotFoundException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
similarity index 87%
rename from src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
index 7e60b0be3..f06bd4ed9 100644
--- a/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
@@ -1,9 +1,9 @@
package com.github.dockerjava.api.command;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.github.dockerjava.api.model.ContainerConfig;
+import com.github.dockerjava.api.model.DockerObject;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.NetworkSettings;
import com.github.dockerjava.api.model.Volume;
@@ -11,11 +11,8 @@
import com.github.dockerjava.api.model.VolumeBinds;
import com.github.dockerjava.api.model.VolumeRW;
import com.github.dockerjava.api.model.VolumesRW;
-import com.github.dockerjava.core.RemoteApiVersion;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ToStringBuilder;
-import org.apache.commons.lang.builder.ToStringStyle;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import javax.annotation.CheckForNull;
import java.util.List;
@@ -26,8 +23,9 @@
* @author Konstantin Pelykh (kpelykh@gmail.com)
*
*/
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class InspectContainerResponse {
+@EqualsAndHashCode
+@ToString
+public class InspectContainerResponse extends DockerObject {
@JsonProperty("Args")
private String[] args;
@@ -63,7 +61,10 @@ public class InspectContainerResponse {
private String id;
@JsonProperty("SizeRootFs")
- private Integer sizeRootFs;
+ private Long sizeRootFs;
+
+ @JsonProperty("SizeRw")
+ private Long sizeRw;
@JsonProperty("Image")
private String imageId;
@@ -110,14 +111,27 @@ public class InspectContainerResponse {
@JsonProperty("Mounts")
private List mounts;
+ @JsonProperty("GraphDriver")
+ private GraphDriver graphDriver;
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+ @JsonProperty("Platform")
+ private String platform;
+
public String getId() {
return id;
}
- public Integer getSizeRootFs() {
+ public Long getSizeRootFs() {
return sizeRootFs;
}
+ public Long getSizeRw() {
+ return sizeRw;
+ }
+
public String getCreated() {
return created;
}
@@ -227,13 +241,25 @@ public Node getNode() {
return node;
}
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+ /**
+ * @see #graphDriver
+ */
+ @CheckForNull
+ public GraphDriver getGraphDriver() {
+ return graphDriver;
+ }
+
+ /**
+ * @see #platform
+ */
+ @CheckForNull
+ public String getPlatform() {
+ return platform;
}
- @JsonIgnoreProperties(ignoreUnknown = true)
- public class ContainerState {
+ @EqualsAndHashCode
+ @ToString
+ public class ContainerState extends DockerObject {
/**
* @since {@link RemoteApiVersion#VERSION_1_20}
@@ -284,14 +310,14 @@ public class ContainerState {
*/
@CheckForNull
@JsonProperty("Pid")
- private Integer pid;
+ private Long pid;
/**
* @since < {@link RemoteApiVersion#VERSION_1_16}
*/
@CheckForNull
@JsonProperty("ExitCode")
- private Integer exitCode;
+ private Long exitCode;
/**
* @since {@link RemoteApiVersion#VERSION_1_17}
@@ -371,17 +397,39 @@ public Boolean getDead() {
/**
* See {@link #pid}
+ *
+ * @deprecated use {@link #getPidLong()}
*/
+ @Deprecated
@CheckForNull
public Integer getPid() {
+ return pid != null ? pid.intValue() : null;
+ }
+
+ /**
+ * See {@link #pid}
+ */
+ @CheckForNull
+ public Long getPidLong() {
return pid;
}
/**
* See {@link #exitCode}
+ *
+ * @deprecated use {@link #getExitCodeLong()}
*/
+ @Deprecated
@CheckForNull
public Integer getExitCode() {
+ return exitCode != null ? exitCode.intValue() : null;
+ }
+
+ /**
+ * See {@link #exitCode}
+ */
+ @CheckForNull
+ public Long getExitCodeLong() {
return exitCode;
}
@@ -412,25 +460,11 @@ public String getFinishedAt() {
public HealthState getHealth() {
return health;
}
-
- @Override
- public boolean equals(Object o) {
- return EqualsBuilder.reflectionEquals(this, o);
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
}
- @JsonIgnoreProperties(ignoreUnknown = true)
- public static class Mount {
+ @EqualsAndHashCode
+ @ToString
+ public static class Mount extends DockerObject {
/**
* @since {@link RemoteApiVersion#VERSION_1_20}
@@ -551,25 +585,11 @@ public Mount withSource(String source) {
this.source = source;
return this;
}
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
-
- @Override
- public boolean equals(Object o) {
- return EqualsBuilder.reflectionEquals(this, o);
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
}
- @JsonIgnoreProperties(ignoreUnknown = true)
- public class Node {
+ @EqualsAndHashCode
+ @ToString
+ public class Node extends DockerObject {
@JsonProperty("ID")
private String id;
@@ -619,10 +639,5 @@ public Long getMemory() {
public Map getLabels() {
return labels;
}
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
}
}
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java
similarity index 76%
rename from src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java
index 2833a5ade..307fdd873 100644
--- a/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java
@@ -2,17 +2,17 @@
import java.util.List;
-import org.apache.commons.lang.builder.ToStringBuilder;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
import com.github.dockerjava.api.model.NetworkSettings;
-import com.github.dockerjava.core.RemoteApiVersion;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import javax.annotation.CheckForNull;
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class InspectExecResponse {
+@EqualsAndHashCode
+@ToString
+public class InspectExecResponse extends DockerObject {
@JsonProperty("ID")
private String id;
@@ -35,7 +35,7 @@ public class InspectExecResponse {
private Boolean canRemove;
@JsonProperty("ExitCode")
- private Integer exitCode;
+ private Long exitCode;
@JsonProperty("ProcessConfig")
private ProcessConfig processConfig;
@@ -59,6 +59,12 @@ public class InspectExecResponse {
@JsonProperty("DetachKeys")
private String detachKeys;
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+ @JsonProperty("Pid")
+ private Long pid;
+
public String getId() {
return id;
}
@@ -79,7 +85,15 @@ public Boolean isRunning() {
return running;
}
+ /**
+ * @deprecated use {@link #getExitCodeLong()}
+ */
+ @Deprecated
public Integer getExitCode() {
+ return exitCode != null ? exitCode.intValue() : null;
+ }
+
+ public Long getExitCodeLong() {
return exitCode;
}
@@ -119,13 +133,27 @@ public String getDetachKeys() {
return detachKeys;
}
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
+ /**
+ * @see #pid
+ * @deprecated use {@link #getPidLong()}
+ */
+ @CheckForNull
+ @Deprecated
+ public Integer getPid() {
+ return pid != null ? pid.intValue() : null;
+ }
+
+ /**
+ * @see #pid
+ */
+ @CheckForNull
+ public Long getPidLong() {
+ return pid;
}
- @JsonIgnoreProperties(ignoreUnknown = true)
- public class ProcessConfig {
+ @EqualsAndHashCode
+ @ToString
+ public class ProcessConfig extends DockerObject {
@JsonProperty("arguments")
private List arguments;
@@ -161,15 +189,11 @@ public Boolean isTty() {
public String getUser() {
return user;
}
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
}
- @JsonIgnoreProperties(ignoreUnknown = true)
- public class Container {
+ @EqualsAndHashCode
+ @ToString
+ public class Container extends DockerObject {
@JsonProperty("NetworkSettings")
private NetworkSettings networkSettings;
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java
similarity index 86%
rename from src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java
index c1967e384..bf48ba8f0 100644
--- a/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java
@@ -1,12 +1,10 @@
package com.github.dockerjava.api.command;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ToStringBuilder;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.github.dockerjava.api.model.ContainerConfig;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import javax.annotation.CheckForNull;
import java.util.List;
@@ -16,8 +14,9 @@
* @author Konstantin Pelykh (kpelykh@gmail.com)
*
*/
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class InspectImageResponse {
+@EqualsAndHashCode
+@ToString
+public class InspectImageResponse extends DockerObject {
@JsonProperty("Architecture")
private String arch;
@@ -49,6 +48,12 @@ public class InspectImageResponse {
@JsonProperty("Os")
private String os;
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_25}
+ */
+ @JsonProperty("OsVersion")
+ private String osVersion;
+
@JsonProperty("Parent")
private String parent;
@@ -73,6 +78,9 @@ public class InspectImageResponse {
@JsonProperty("GraphDriver")
private GraphDriver graphDriver;
+ @JsonProperty("RootFS")
+ private RootFS rootFS;
+
/**
* @see #arch
*/
@@ -236,6 +244,22 @@ public InspectImageResponse withOs(String os) {
return this;
}
+ /**
+ * @see #osVersion
+ */
+ @CheckForNull
+ public String getOsVersion() {
+ return osVersion;
+ }
+
+ /**
+ * @see #osVersion
+ */
+ public InspectImageResponse withOsVersion(String osVersion) {
+ this.osVersion = osVersion;
+ return this;
+ }
+
/**
* @see #parent
*/
@@ -332,18 +356,19 @@ public InspectImageResponse withVirtualSize(Long virtualSize) {
return this;
}
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
-
- @Override
- public boolean equals(Object o) {
- return EqualsBuilder.reflectionEquals(this, o);
+ /**
+ * @see #rootFS
+ */
+ @CheckForNull
+ public RootFS getRootFS() {
+ return rootFS;
}
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
+ /**
+ * @see #rootFS
+ */
+ public InspectImageResponse withRootFS(RootFS rootFS) {
+ this.rootFS = rootFS;
+ return this;
}
}
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java
similarity index 93%
rename from src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java
index 2e5536731..9dd462ac4 100644
--- a/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java
@@ -2,7 +2,6 @@
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.Network;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectServiceCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectServiceCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/InspectServiceCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectServiceCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/InspectSwarmCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectSwarmNodeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmNodeCmd.java
similarity index 93%
rename from src/main/java/com/github/dockerjava/api/command/InspectSwarmNodeCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmNodeCmd.java
index 13dacdd6a..07750f09e 100644
--- a/src/main/java/com/github/dockerjava/api/command/InspectSwarmNodeCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmNodeCmd.java
@@ -3,7 +3,6 @@
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.SwarmNode;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectTaskCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectTaskCmd.java
new file mode 100644
index 000000000..118910eee
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectTaskCmd.java
@@ -0,0 +1,19 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.api.model.Task;
+
+import javax.annotation.CheckForNull;
+
+public interface InspectTaskCmd extends SyncDockerCmd {
+ @CheckForNull
+ String getTaskId();
+
+ InspectTaskCmd withTaskId();
+
+ @Override
+ Task exec() throws NotFoundException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java
new file mode 100644
index 000000000..bc0008817
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java
@@ -0,0 +1,53 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.Map;
+
+/**
+ *
+ * @author Marcus Linke
+ */
+@EqualsAndHashCode
+@ToString
+public class InspectVolumeResponse extends DockerObject {
+
+ @JsonProperty("Name")
+ private String name;
+
+ @JsonProperty("Labels")
+ private Map labels;
+
+ @JsonProperty("Driver")
+ private String driver;
+
+ @JsonProperty("Mountpoint")
+ private String mountpoint;
+
+ @JsonProperty("Options")
+ private Map options;
+
+ public String getName() {
+ return name;
+ }
+
+ public Map getLabels() {
+ return labels;
+ }
+
+ public String getDriver() {
+ return driver;
+ }
+
+ public String getMountpoint() {
+ return mountpoint;
+ }
+
+ public Map getOptions() {
+ return options;
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/JoinSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/JoinSwarmCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/JoinSwarmCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/JoinSwarmCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/LeaveSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LeaveSwarmCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/LeaveSwarmCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/LeaveSwarmCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListConfigsCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListConfigsCmd.java
new file mode 100644
index 000000000..38d34816a
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListConfigsCmd.java
@@ -0,0 +1,21 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.Config;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Command to list all configs in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+public interface ListConfigsCmd extends SyncDockerCmd> {
+
+ Map> getFilters();
+
+ ListConfigsCmd withFilters(Map> filters);
+
+ interface Exec extends DockerCmdSyncExec> {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java
new file mode 100644
index 000000000..879ec711c
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java
@@ -0,0 +1,128 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.Container;
+
+import javax.annotation.CheckForNull;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * List containers
+ *
+ */
+public interface ListContainersCmd extends SyncDockerCmd> {
+
+ @CheckForNull
+ String getBeforeId();
+
+ @CheckForNull
+ Map> getFilters();
+
+ @CheckForNull
+ Integer getLimit();
+
+ @CheckForNull
+ String getSinceId();
+
+ @CheckForNull
+ Boolean hasShowAllEnabled();
+
+ @CheckForNull
+ Boolean hasShowSizeEnabled();
+
+ /**
+ * @param before
+ * - Show only containers created before Id, include non-running ones.
+ */
+ ListContainersCmd withBefore(String before);
+
+ /**
+ * @param name
+ * - Show only containers that has the container's name
+ */
+ ListContainersCmd withNameFilter(Collection name);
+
+ /**
+ * @param id
+ * - Show only containers that has the container's id
+ */
+ ListContainersCmd withIdFilter(Collection id);
+
+ /**
+ * @param ancestor
+ * - Show only containers created from an image or a descendant.
+ */
+ ListContainersCmd withAncestorFilter(Collection ancestor);
+
+ /**
+ * @param volume
+ * - Show only containers with volume name or mount point destination
+ */
+ ListContainersCmd withVolumeFilter(Collection volume);
+
+ /**
+ * @param network
+ * - Show only containers with network id or network name
+ */
+ ListContainersCmd withNetworkFilter(Collection network);
+
+ /**
+ * @param exited
+ * - Show only containers that exited with the passed exitcode.
+ */
+ ListContainersCmd withExitedFilter(Integer exited);
+
+ /**
+ * @param status
+ * - Show only containers with the passed status (created|restarting|running|paused|exited).
+ */
+ ListContainersCmd withStatusFilter(Collection status);
+
+ /**
+ * @param labels
+ * - Show only containers with the passed labels.
+ */
+ ListContainersCmd withLabelFilter(Collection labels);
+
+ /**
+ * @param labels
+ * - Show only containers with the passed labels. Labels is a {@link Map} that contains label keys and values
+ */
+ ListContainersCmd withLabelFilter(Map labels);
+
+ /**
+ * @param limit
+ * - Show `limit` last created containers, include non-running ones. There is no limit by default.
+ */
+ ListContainersCmd withLimit(Integer limit);
+
+ /**
+ * @param showAll
+ * - Show all containers. Only running containers are shown by default.
+ */
+ ListContainersCmd withShowAll(Boolean showAll);
+
+ /**
+ * @param showSize
+ * - Show the containers sizes. This is false by default.
+ */
+ ListContainersCmd withShowSize(Boolean showSize);
+
+ /**
+ * @param since
+ * - Show only containers created since Id, include non-running ones.
+ */
+ ListContainersCmd withSince(String since);
+
+ /**
+ * @param filterName
+ * @param filterValues
+ * - Show only containers where the filter matches the given values
+ */
+ ListContainersCmd withFilter(String filterName, Collection filterValues);
+
+ interface Exec extends DockerCmdSyncExec> {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java
similarity index 80%
rename from src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java
index 7741df743..cc60a5bcc 100644
--- a/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java
@@ -1,5 +1,6 @@
package com.github.dockerjava.api.command;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -44,6 +45,15 @@ public interface ListImagesCmd extends SyncDockerCmd> {
*/
ListImagesCmd withLabelFilter(Map labels);
+ /**
+ * Filter images by reference
+ *
+ * @param reference string in the form {@code [:]}
+ */
+ ListImagesCmd withReferenceFilter(String reference);
+
+ ListImagesCmd withFilter(String key, Collection values);
+
interface Exec extends DockerCmdSyncExec> {
}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java
new file mode 100644
index 000000000..a7921824d
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java
@@ -0,0 +1,34 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.Network;
+
+import javax.annotation.CheckForNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * List networks.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_21}
+ */
+public interface ListNetworksCmd extends SyncDockerCmd> {
+
+ @CheckForNull
+ Map> getFilters();
+
+ ListNetworksCmd withNameFilter(String... networkName);
+
+ ListNetworksCmd withIdFilter(String... networkId);
+
+ /**
+ * @param filterName
+ * @param filterValues
+ * - Show only networks where the filter matches the given values
+ */
+ ListNetworksCmd withFilter(String filterName, Collection filterValues);
+
+ interface Exec extends DockerCmdSyncExec> {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSecretsCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSecretsCmd.java
new file mode 100644
index 000000000..959d68831
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSecretsCmd.java
@@ -0,0 +1,34 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.Secret;
+
+import javax.annotation.CheckForNull;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * List secrets
+ */
+public interface ListSecretsCmd extends SyncDockerCmd> {
+
+ @CheckForNull
+ Map> getFilters();
+
+ /**
+ * @param ids - Show only secrets with the given ids
+ */
+ ListSecretsCmd withIdFilter(List ids);
+
+ /**
+ * @param names - Show only secrets with the given names
+ */
+ ListSecretsCmd withNameFilter(List names);
+
+ /**
+ * @param labels - Show only secrets with the passed labels. Labels is a {@link Map} that contains label keys and values
+ */
+ ListSecretsCmd withLabelFilter(Map labels);
+
+ interface Exec extends DockerCmdSyncExec> {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListServicesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListServicesCmd.java
new file mode 100644
index 000000000..5926add1e
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListServicesCmd.java
@@ -0,0 +1,37 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.Service;
+
+import javax.annotation.CheckForNull;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Command to list all services in a docker swarm. Only applicable if docker runs in swarm mode.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+public interface ListServicesCmd extends SyncDockerCmd> {
+
+ @CheckForNull
+ Map> getFilters();
+
+ /**
+ * @param ids - Show only services with the given ids
+ */
+ ListServicesCmd withIdFilter(List ids);
+
+ /**
+ * @param names - Show only services with the given names
+ */
+ ListServicesCmd withNameFilter(List names);
+
+ /**
+ * @param labels - Show only services with the passed labels. Labels is a {@link Map} that contains label keys and values
+ */
+ ListServicesCmd withLabelFilter(Map labels);
+
+ interface Exec extends DockerCmdSyncExec> {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/ListSwarmNodesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSwarmNodesCmd.java
similarity index 95%
rename from src/main/java/com/github/dockerjava/api/command/ListSwarmNodesCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSwarmNodesCmd.java
index 9aaac1e98..6ad0205d3 100644
--- a/src/main/java/com/github/dockerjava/api/command/ListSwarmNodesCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSwarmNodesCmd.java
@@ -1,7 +1,6 @@
package com.github.dockerjava.api.command;
import com.github.dockerjava.api.model.SwarmNode;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import java.util.List;
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListTasksCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListTasksCmd.java
new file mode 100644
index 000000000..8037ded5d
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListTasksCmd.java
@@ -0,0 +1,56 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.api.model.Task;
+import com.github.dockerjava.api.model.TaskState;
+
+import javax.annotation.CheckForNull;
+import java.util.List;
+import java.util.Map;
+
+public interface ListTasksCmd extends SyncDockerCmd> {
+ @CheckForNull
+ Map> getFilters();
+
+ /**
+ * @param labels - Show only tasks with the passed labels.
+ * Labels is a {@link Map} that contains label keys and values
+ */
+ ListTasksCmd withLabelFilter(Map labels);
+
+ /**
+ * @param labels - Show only tasks with the passed labels.
+ */
+ ListTasksCmd withLabelFilter(String... labels);
+
+ /**
+ * @param ids Task id(s)
+ */
+ ListTasksCmd withIdFilter(String... ids);
+
+ /**
+ * @param names Task name(s)
+ */
+ ListTasksCmd withNameFilter(String... names);
+
+ /**
+ * @param nodeNames Node id(s) or name(s)
+ */
+ ListTasksCmd withNodeFilter(String... nodeNames);
+
+ /**
+ * @param serviceNames Service name(s)
+ */
+ ListTasksCmd withServiceFilter(String... serviceNames);
+
+ /**
+ * @param desiredState The desired-state filter can take the values running, shutdown, or accepted.
+ */
+ ListTasksCmd withStateFilter(TaskState... desiredState);
+
+ @Override
+ List exec() throws NotFoundException;
+
+ interface Exec extends DockerCmdSyncExec> {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java
new file mode 100644
index 000000000..bd66653eb
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java
@@ -0,0 +1,34 @@
+package com.github.dockerjava.api.command;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+
+/**
+ * List volumes.
+ *
+ * @author Marcus Linke
+ */
+public interface ListVolumesCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ Map> getFilters();
+
+ /**
+ * @param dangling
+ * - Show dangling volumes filter
+ */
+ ListVolumesCmd withDanglingFilter(Boolean dangling);
+
+ /**
+ * @param filterName
+ * @param filterValues
+ * - Show only volumes where the filter matches the given values
+ */
+ ListVolumesCmd withFilter(String filterName, Collection filterValues);
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java
new file mode 100644
index 000000000..7c434a48d
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java
@@ -0,0 +1,24 @@
+package com.github.dockerjava.api.command;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ *
+ * @author Marcus Linke
+ */
+@EqualsAndHashCode
+@ToString
+public class ListVolumesResponse extends DockerObject {
+
+ @JsonProperty("Volumes")
+ private List volumes;
+
+ public List getVolumes() {
+ return volumes;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageAsyncCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageAsyncCmd.java
new file mode 100644
index 000000000..4f054db22
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageAsyncCmd.java
@@ -0,0 +1,22 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.LoadResponseItem;
+
+import java.io.InputStream;
+
+public interface LoadImageAsyncCmd extends AsyncDockerCmd {
+ InputStream getImageStream();
+
+ /**
+ * @param imageStream the InputStream of the tar file
+ */
+ LoadImageAsyncCmd withImageStream(InputStream imageStream);
+
+ @Override
+ default LoadImageCallback start() {
+ return exec(new LoadImageCallback());
+ }
+
+ interface Exec extends DockerCmdAsyncExec {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java
new file mode 100644
index 000000000..80cca18de
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java
@@ -0,0 +1,49 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.async.ResultCallbackTemplate;
+import com.github.dockerjava.api.exception.DockerClientException;
+import com.github.dockerjava.api.model.LoadResponseItem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LoadImageCallback extends ResultCallbackTemplate {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageCallback.class);
+
+ private String message;
+
+ private String error;
+
+ @Override
+ public void onNext(LoadResponseItem item) {
+ if (item.isBuildSuccessIndicated()) {
+ this.message = item.getMessage();
+ } else if (item.isErrorIndicated()) {
+ this.error = item.getError();
+ }
+
+ LOGGER.debug("{}", item);
+ }
+
+ public String awaitMessage() {
+ try {
+ awaitCompletion();
+ } catch (InterruptedException e) {
+ throw new DockerClientException("", e);
+ }
+
+ return getMessage();
+ }
+
+ private String getMessage() {
+ if (this.message != null) {
+ return this.message;
+ }
+
+ if (this.error == null) {
+ throw new DockerClientException("Could not build image");
+ }
+
+ throw new DockerClientException("Could not build image: " + this.error);
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
similarity index 92%
rename from src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
index 53674cbaa..29c4516cd 100644
--- a/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java
@@ -25,6 +25,8 @@
* @param since
* - UNIX timestamp (integer) to filter logs. Specifying a timestamp will only output log-entries since that timestamp. Default:
* 0 (unfiltered)
+ * @param until
+ * - Only return logs before this time, as a UNIX timestamp. Default: 0
*/
public interface LogContainerCmd extends AsyncDockerCmd {
@@ -49,6 +51,9 @@ public interface LogContainerCmd extends AsyncDockerCmd
@CheckForNull
Integer getSince();
+ @CheckForNull
+ Integer getUntil();
+
LogContainerCmd withContainerId(@Nonnull String containerId);
/**
@@ -69,6 +74,8 @@ public interface LogContainerCmd extends AsyncDockerCmd
LogContainerCmd withSince(Integer since);
+ LogContainerCmd withUntil(Integer until);
+
/**
* @throws com.github.dockerjava.api.NotFoundException
* No such container
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogSwarmObjectCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogSwarmObjectCmd.java
new file mode 100644
index 000000000..f5e738518
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogSwarmObjectCmd.java
@@ -0,0 +1,94 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.model.Frame;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+/**
+ * Get docker service/task stdout/stderr logs
+ */
+public interface LogSwarmObjectCmd extends AsyncDockerCmd {
+ /**
+ * @param id ID or name of the service
+ * @return self
+ */
+ LogSwarmObjectCmd withId(@Nonnull String id);
+
+ /**
+ * @param follow Return the logs as a raw stream.
+ * @return self
+ */
+ LogSwarmObjectCmd withFollow(Boolean follow);
+
+ /**
+ * @param timestamps Add timestamps to every log line
+ * @return self
+ */
+ LogSwarmObjectCmd withTimestamps(Boolean timestamps);
+
+ /**
+ * @param stdout Return logs from stdout
+ * @return self
+ */
+ LogSwarmObjectCmd withStdout(Boolean stdout);
+
+ /**
+ * @param stderr Return logs from stderr
+ * @return self
+ */
+ LogSwarmObjectCmd withStderr(Boolean stderr);
+
+ /**
+ * @param tail only return this number of log lines from the end of the logs.
+ * @return self
+ */
+ LogSwarmObjectCmd withTail(Integer tail);
+
+ /**
+ * @param since Only return logs since this time, as a UNIX timestamp
+ * @return self
+ */
+ LogSwarmObjectCmd withSince(Integer since);
+
+ /**
+ * @param details Show service context and extra details provided to logs.
+ * @return
+ */
+ LogSwarmObjectCmd withDetails(Boolean details);
+
+ @CheckForNull
+ String getId();
+
+ @CheckForNull
+ Integer getTail();
+
+ @CheckForNull
+ Boolean getFollow();
+
+ @CheckForNull
+ Boolean getTimestamps();
+
+ @CheckForNull
+ Boolean getStdout();
+
+ @CheckForNull
+ Boolean getStderr();
+
+ @CheckForNull
+ Integer getSince();
+
+ @CheckForNull
+ Boolean getDetails();
+
+ /**
+ * @throws com.github.dockerjava.api.exception.NotFoundException no such service
+ */
+ @Override
+ > T exec(T resultCallback);
+
+ interface Exec extends DockerCmdAsyncExec {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/PingCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PingCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/PingCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/PingCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PruneCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PruneCmd.java
new file mode 100644
index 000000000..89a082eaf
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PruneCmd.java
@@ -0,0 +1,53 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.PruneResponse;
+import com.github.dockerjava.api.model.PruneType;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Delete unused content (containers, images, volumes, networks, build relicts)
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+public interface PruneCmd extends SyncDockerCmd {
+
+ @Nonnull
+ PruneType getPruneType();
+
+ @Nonnull
+ String getApiPath();
+
+ @CheckForNull
+ Map> getFilters();
+
+ PruneCmd withPruneType(final PruneType pruneType);
+ /**
+ * Prune containers created before this timestamp
+ * Meaningful only for CONTAINERS and IMAGES prune type
+ * @param until Can be Unix timestamps, date formatted timestamps,
+ * or Go duration strings (e.g. 10m, 1h30m) computed relative to the daemon machine’s time.
+ */
+ PruneCmd withUntilFilter(String until);
+
+ /**
+ * When set to true, prune only unused and untagged images. When set to false, all unused images are pruned.
+ * Meaningful only for IMAGES prune type
+ */
+ PruneCmd withDangling(Boolean dangling);
+
+ /**
+ * Prune containers with the specified labels
+ */
+ PruneCmd withLabelFilter(String... label);
+
+ @Override
+ PruneResponse exec();
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java
new file mode 100644
index 000000000..d86bddfe3
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java
@@ -0,0 +1,52 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.PullResponseItem;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+/**
+ *
+ * Pull image from repository.
+ *
+ */
+public interface PullImageCmd extends AsyncDockerCmd {
+
+ @CheckForNull
+ String getRepository();
+
+ @CheckForNull
+ String getTag();
+
+ @CheckForNull
+ String getPlatform();
+
+ @CheckForNull
+ String getRegistry();
+
+ @CheckForNull
+ AuthConfig getAuthConfig();
+
+ PullImageCmd withRepository(@Nonnull String repository);
+
+ PullImageCmd withTag(String tag);
+
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_32}
+ */
+ PullImageCmd withPlatform(String tag);
+
+ PullImageCmd withRegistry(String registry);
+
+ PullImageCmd withAuthConfig(AuthConfig authConfig);
+
+ @Override
+ default ResultCallback.Adapter start() {
+ return exec(new PullImageResultCallback());
+ }
+
+ interface Exec extends DockerCmdAsyncExec {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java
new file mode 100644
index 000000000..5980ce3df
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java
@@ -0,0 +1,115 @@
+/*
+ * Created on 21.07.2015
+ */
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.exception.DockerClientException;
+import com.github.dockerjava.api.model.PullResponseItem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.CheckForNull;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *
+ * @author Marcus Linke
+ *
+ */
+public class PullImageResultCallback extends ResultCallback.Adapter {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(PullImageResultCallback.class);
+
+ private boolean isSwarm = false;
+ private Map results = null;
+
+ @CheckForNull
+ private PullResponseItem latestItem = null;
+
+ @Override
+ public void onNext(PullResponseItem item) {
+ // only do it once
+ if (results == null && latestItem == null) {
+ checkForDockerSwarmResponse(item);
+ }
+
+ if (isSwarm) {
+ handleDockerSwarmResponse(item);
+ } else {
+ handleDockerClientResponse(item);
+ }
+
+ LOGGER.debug("{}", item);
+ }
+
+ private void checkForDockerSwarmResponse(PullResponseItem item) {
+ if (item.getStatus().matches("Pulling\\s.+\\.{3}$")) {
+ isSwarm = true;
+ LOGGER.debug("Communicating with Docker Swarm.");
+ }
+ }
+
+ private void handleDockerSwarmResponse(final PullResponseItem item) {
+ if (results == null) {
+ results = new HashMap<>();
+ }
+
+ // Swarm terminates a pull sometimes with an empty line.
+ // Therefore keep first success message
+ PullResponseItem currentItem = results.get(item.getId());
+ if (currentItem == null || !currentItem.isPullSuccessIndicated()) {
+ results.put(item.getId(), item);
+ }
+ }
+
+ private void handleDockerClientResponse(PullResponseItem item) {
+ latestItem = item;
+ }
+
+ private void checkDockerSwarmPullSuccessful() {
+ if (results.isEmpty()) {
+ throw new DockerClientException("Could not pull image through Docker Swarm");
+ } else {
+ boolean pullFailed = false;
+ StringBuilder sb = new StringBuilder();
+
+ for (PullResponseItem pullResponseItem : results.values()) {
+ if (!pullResponseItem.isPullSuccessIndicated()) {
+ pullFailed = true;
+ sb.append("[" + pullResponseItem.getId() + ":" + messageFromPullResult(pullResponseItem) + "]");
+ }
+ }
+
+ if (pullFailed) {
+ throw new DockerClientException("Could not pull image: " + sb.toString());
+ }
+ }
+ }
+
+ private void checkDockerClientPullSuccessful() {
+ if (latestItem == null) {
+ return;
+ }
+
+ if (!latestItem.isPullSuccessIndicated()) {
+ throw new DockerClientException("Could not pull image: " + messageFromPullResult(latestItem));
+ }
+ }
+
+ private String messageFromPullResult(PullResponseItem pullResponseItem) {
+ return (pullResponseItem.getError() != null) ? pullResponseItem.getError() : pullResponseItem.getStatus();
+ }
+
+ @Override
+ protected void throwFirstError() {
+ super.throwFirstError();
+
+ if (isSwarm) {
+ checkDockerSwarmPullSuccessful();
+ } else {
+ checkDockerClientPullSuccessful();
+ }
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java
new file mode 100644
index 000000000..01f9d0567
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java
@@ -0,0 +1,78 @@
+package com.github.dockerjava.api.command;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.exception.DockerClientException;
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.PushResponseItem;
+
+/**
+ * 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 AsyncDockerCmd {
+
+ @CheckForNull
+ AuthConfig getAuthConfig();
+
+ @CheckForNull
+ String getName();
+
+ @CheckForNull
+ String getTag();
+
+ /**
+ * @param name
+ * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.
+ */
+ PushImageCmd withName(@Nonnull String name);
+
+ /**
+ * @param tag
+ * The image's tag. Not null.
+ */
+ PushImageCmd withTag(String tag);
+
+ PushImageCmd withAuthConfig(AuthConfig authConfig);
+
+ /**
+ * @throws NotFoundException
+ * No such image
+ */
+ @Override
+ > T exec(T resultCallback);
+
+ @Override
+ default ResultCallback.Adapter start() {
+ return exec(new ResultCallback.Adapter() {
+
+ @Nullable
+ private PushResponseItem latestItem = null;
+
+ @Override
+ public void onNext(PushResponseItem item) {
+ this.latestItem = item;
+ }
+
+ @Override
+ protected void throwFirstError() {
+ super.throwFirstError();
+
+ if (latestItem == null) {
+ throw new DockerClientException("Could not push image");
+ } else if (latestItem.isErrorIndicated()) {
+ throw new DockerClientException("Could not push image: " + latestItem.getError());
+ }
+ }
+ });
+ }
+
+ interface Exec extends DockerCmdAsyncExec {
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveConfigCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveConfigCmd.java
new file mode 100644
index 000000000..741fe32c0
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveConfigCmd.java
@@ -0,0 +1,28 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+/**
+ * Remove a config.
+ */
+public interface RemoveConfigCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ String getConfigId();
+
+ RemoveConfigCmd withConfigId(@Nonnull String secretId);
+
+ /**
+ * @throws NotFoundException
+ * No such config
+ */
+ @Override
+ Void exec() throws NotFoundException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java
similarity index 92%
rename from src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java
index b6ad0e652..1466fd3e4 100644
--- a/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java
@@ -1,7 +1,6 @@
package com.github.dockerjava.api.command;
import com.github.dockerjava.api.exception.NotFoundException;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSecretCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSecretCmd.java
new file mode 100644
index 000000000..28476da1d
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSecretCmd.java
@@ -0,0 +1,28 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+/**
+ * Remove a secret.
+ */
+public interface RemoveSecretCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ String getSecretId();
+
+ RemoveSecretCmd withSecretId(@Nonnull String secretId);
+
+ /**
+ * @throws NotFoundException
+ * No such secret
+ */
+ @Override
+ Void exec() throws NotFoundException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveServiceCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveServiceCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/RemoveServiceCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveServiceCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java
similarity index 85%
rename from src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java
index 27a815bf0..603c610b3 100644
--- a/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java
@@ -1,7 +1,6 @@
package com.github.dockerjava.api.command;
import com.github.dockerjava.api.exception.NotFoundException;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
@@ -19,7 +18,7 @@ public interface RemoveSwarmNodeCmd extends SyncDockerCmd {
@CheckForNull
Boolean hasForceEnabled();
- RemoveSwarmNodeCmd withContainerId(@Nonnull String containerId);
+ RemoveSwarmNodeCmd withSwarmNodeId(@Nonnull String swarmNodeId);
RemoveSwarmNodeCmd withForce(Boolean force);
diff --git a/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/RenameContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RenameContainerCmd.java
similarity index 93%
rename from src/main/java/com/github/dockerjava/api/command/RenameContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/RenameContainerCmd.java
index bce20251f..a69ba2a3f 100644
--- a/src/main/java/com/github/dockerjava/api/command/RenameContainerCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RenameContainerCmd.java
@@ -1,7 +1,6 @@
package com.github.dockerjava.api.command;
import com.github.dockerjava.api.exception.NotFoundException;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java
new file mode 100644
index 000000000..fef0087ed
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java
@@ -0,0 +1,30 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+public interface ResizeContainerCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ String getContainerId();
+
+ Integer getHeight();
+
+ Integer getWidth();
+
+ ResizeContainerCmd withContainerId(@Nonnull String execId);
+
+ ResizeContainerCmd withSize(int height, int width);
+
+ /**
+ * @throws NotFoundException no such container instance
+ */
+ @Override
+ Void exec() throws NotFoundException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java
new file mode 100644
index 000000000..5910705e0
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java
@@ -0,0 +1,29 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+public interface ResizeExecCmd extends SyncDockerCmd {
+ @CheckForNull
+ String getExecId();
+
+ Integer getHeight();
+
+ Integer getWidth();
+
+ ResizeExecCmd withExecId(@Nonnull String execId);
+
+ ResizeExecCmd withSize(int height, int width);
+
+ /**
+ * @throws NotFoundException no such exec instance
+ */
+ @Override
+ Void exec() throws NotFoundException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java
new file mode 100644
index 000000000..372456813
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java
@@ -0,0 +1,51 @@
+package com.github.dockerjava.api.command;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+
+/**
+ * Restart a running container.
+ *
+ * @param signal - Signal to send to the container as an integer or string (e.g. SIGINT).
+ * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds.
+ */
+public interface RestartContainerCmd extends SyncDockerCmd {
+
+ @CheckForNull
+ String getContainerId();
+
+ @CheckForNull
+ Integer getTimeout();
+
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_42}
+ */
+ @CheckForNull
+ String getSignal();
+
+ RestartContainerCmd withContainerId(@Nonnull String containerId);
+
+ /**
+ * @deprecated wrong name, use {@link #withTimeout(Integer)}
+ */
+ @Deprecated
+ default RestartContainerCmd withtTimeout(Integer timeout) {
+ return withTimeout(timeout);
+ }
+
+ RestartContainerCmd withTimeout(Integer timeout);
+
+ RestartContainerCmd withSignal(String signal);
+
+ /**
+ * @throws NotFoundException No such container
+ */
+ @Override
+ Void exec() throws NotFoundException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RootFS.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RootFS.java
new file mode 100644
index 000000000..c190852af
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RootFS.java
@@ -0,0 +1,57 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.annotation.CheckForNull;
+import java.util.List;
+
+/**
+ * Part of {@link InspectImageResponse}
+ *
+ * @author Dmitry Tretyakov
+ */
+@EqualsAndHashCode
+@ToString
+public class RootFS extends DockerObject {
+
+ @JsonProperty("Type")
+ private String type;
+
+ @JsonProperty("Layers")
+ private List layers;
+
+ /**
+ * @see #type
+ */
+ @CheckForNull
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @see #type
+ */
+ public RootFS withType(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * @see #layers
+ */
+ @CheckForNull
+ public List getLayers() {
+ return layers;
+ }
+
+ /**
+ * @see #layers
+ */
+ public RootFS withLayers(List layers) {
+ this.layers = layers;
+ return this;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImagesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImagesCmd.java
new file mode 100644
index 000000000..1dd504434
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImagesCmd.java
@@ -0,0 +1,47 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.exception.NotFoundException;
+
+import javax.annotation.Nonnull;
+import java.io.InputStream;
+import java.util.List;
+
+/** Command for downloading multiple images at once. */
+public interface SaveImagesCmd extends SyncDockerCmd {
+
+ /** Image name and tag. */
+ interface TaggedImage {
+
+ /**
+ * The (tagged) image name.
+ * @return "name:tag" if a tag was specified, otherwise "name"
+ */
+ String asString();
+ }
+
+ /**
+ * Adds an image to the list of images to download.
+ * @param name image name (not null)
+ * @param tag tag
+ * @return this
+ */
+ SaveImagesCmd withImage(@Nonnull String name, @Nonnull String tag);
+
+
+ /**
+ * Gets the images that were added by {@link #withImage(String, String)}.
+ * @return images to be downloaded
+ */
+ List getImages();
+
+ /**
+ * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks.
+ *
+ * @throws NotFoundException no such image
+ */
+ InputStream exec() throws NotFoundException;
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java
similarity index 86%
rename from src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java
index 2bc87cc73..8dc38ee3e 100644
--- a/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java
@@ -18,8 +18,10 @@ public interface SearchImagesCmd extends SyncDockerCmd> {
@CheckForNull
String getTerm();
+ Integer getLimit();
SearchImagesCmd withTerm(@Nonnull String term);
+ SearchImagesCmd withLimit(@Nonnull Integer limit);
interface Exec extends DockerCmdSyncExec> {
}
diff --git a/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StatsCmd.java
similarity index 87%
rename from src/main/java/com/github/dockerjava/api/command/StatsCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/StatsCmd.java
index 6085a810b..c85ca2b2f 100644
--- a/src/main/java/com/github/dockerjava/api/command/StatsCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StatsCmd.java
@@ -16,6 +16,11 @@ public interface StatsCmd extends AsyncDockerCmd {
StatsCmd withContainerId(@Nonnull String containerId);
+ @CheckForNull
+ Boolean hasNoStream();
+
+ StatsCmd withNoStream(boolean noStream);
+
interface Exec extends DockerCmdAsyncExec {
}
}
diff --git a/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/TagImageCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java
new file mode 100644
index 000000000..e604c20ae
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java
@@ -0,0 +1,30 @@
+package com.github.dockerjava.api.command;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.dockerjava.api.model.DockerObject;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ *
+ * @author Marcus Linke
+ *
+ */
+@EqualsAndHashCode
+@ToString
+public class TopContainerResponse extends DockerObject {
+
+ @JsonProperty("Titles")
+ private String[] titles;
+
+ @JsonProperty("Processes")
+ private String[][] processes;
+
+ public String[] getTitles() {
+ return titles;
+ }
+
+ public String[][] getProcesses() {
+ return processes;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java
new file mode 100644
index 000000000..d53bcdcdf
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java
@@ -0,0 +1,157 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.BlkioRateDevice;
+import com.github.dockerjava.api.model.BlkioWeightDevice;
+import com.github.dockerjava.api.model.Device;
+import com.github.dockerjava.api.model.DeviceRequest;
+import com.github.dockerjava.api.model.RestartPolicy;
+import com.github.dockerjava.api.model.Ulimit;
+import com.github.dockerjava.api.model.UpdateContainerResponse;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import java.util.List;
+
+/**
+ * @author Kanstantsin Shautsou
+ * @since {@link RemoteApiVersion#VERSION_1_22}
+ */
+public interface UpdateContainerCmd extends SyncDockerCmd {
+ @CheckForNull
+ String getContainerId();
+
+ UpdateContainerCmd withContainerId(@Nonnull String containerId);
+
+ @CheckForNull
+ Integer getBlkioWeight();
+
+ UpdateContainerCmd withBlkioWeight(Integer blkioWeight);
+
+ @CheckForNull
+ List getBlkioWeightDevice();
+
+ UpdateContainerCmd withBlkioWeightDevice(List blkioWeightDevice);
+
+ @CheckForNull
+ List getBlkioDeviceReadBps();
+
+ UpdateContainerCmd withBlkioDeviceReadBps(List blkioDeviceReadBps);
+
+ @CheckForNull
+ List getBlkioDeviceWriteBps();
+
+ UpdateContainerCmd withBlkioDeviceWriteBps(List blkioDeviceWriteBps);
+
+ @CheckForNull
+ List getBlkioDeviceReadIOps();
+
+ UpdateContainerCmd withBlkioDeviceReadIOps(List blkioDeviceReadIOps);
+
+ @CheckForNull
+ List getBlkioDeviceWriteIOps();
+
+ UpdateContainerCmd withBlkioDeviceWriteIOps(List blkioDeviceWriteIOps);
+
+ @CheckForNull
+ Long getCpuPeriod();
+
+ UpdateContainerCmd withCpuPeriod(Long cpuPeriod);
+
+ @CheckForNull
+ Long getCpuQuota();
+
+ UpdateContainerCmd withCpuQuota(Long cpuQuota);
+
+ @CheckForNull
+ String getCpusetCpus();
+
+ UpdateContainerCmd withCpusetCpus(String cpusetCpus);
+
+ @CheckForNull
+ String getCpusetMems();
+
+ UpdateContainerCmd withCpusetMems(String cpusetMems);
+
+ @CheckForNull
+ Integer getCpuShares();
+
+ UpdateContainerCmd withCpuShares(Integer cpuShares);
+
+ @CheckForNull
+ Long getCpuRealtimePeriod();
+
+ UpdateContainerCmd withCpuRealtimePeriod(Long cpuRealtimePeriod);
+
+ @CheckForNull
+ Long getCpuRealtimeRuntime();
+
+ UpdateContainerCmd withCpuRealtimeRuntime(Long cpuRealtimeRuntime);
+
+ @CheckForNull
+ List getDevices();
+
+ UpdateContainerCmd withDevices(List devices);
+
+ @CheckForNull
+ List getDeviceCgroupRules();
+
+ UpdateContainerCmd withDeviceCgroupRules(List deviceCgroupRules);
+
+ @CheckForNull
+ List getDeviceRequests();
+
+ UpdateContainerCmd withDeviceRequests(List deviceRequests);
+
+ @CheckForNull
+ Long getKernelMemory();
+
+ UpdateContainerCmd withKernelMemory(Long kernelMemory);
+
+ @CheckForNull
+ Long getMemory();
+
+ UpdateContainerCmd withMemory(Long memory);
+
+ @CheckForNull
+ Long getMemoryReservation();
+
+ UpdateContainerCmd withMemoryReservation(Long memoryReservation);
+
+ @CheckForNull
+ Long getMemorySwap();
+
+ UpdateContainerCmd withMemorySwap(Long memorySwap);
+
+ @CheckForNull
+ Long getNanoCPUs();
+
+ UpdateContainerCmd withNanoCPUs(Long nanoCPUs);
+
+ @CheckForNull
+ Boolean getOomKillDisable();
+
+ UpdateContainerCmd withOomKillDisable(Boolean oomKillDisable);
+
+ @CheckForNull
+ Boolean getInit();
+
+ UpdateContainerCmd withInit(Boolean init);
+
+ @CheckForNull
+ Long getPidsLimit();
+
+ UpdateContainerCmd withPidsLimit(Long pidsLimit);
+
+ @CheckForNull
+ List getUlimits();
+
+ UpdateContainerCmd withUlimits(List ulimits);
+
+ @CheckForNull
+ RestartPolicy getRestartPolicy();
+
+ UpdateContainerCmd withRestartPolicy(RestartPolicy restartPolicy);
+
+ interface Exec extends DockerCmdSyncExec {
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/command/UpdateServiceCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateServiceCmd.java
similarity index 92%
rename from src/main/java/com/github/dockerjava/api/command/UpdateServiceCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateServiceCmd.java
index fb025ea76..da4b78387 100644
--- a/src/main/java/com/github/dockerjava/api/command/UpdateServiceCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateServiceCmd.java
@@ -1,7 +1,6 @@
package com.github.dockerjava.api.command;
import com.github.dockerjava.api.model.ServiceSpec;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
diff --git a/src/main/java/com/github/dockerjava/api/command/UpdateSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/UpdateSwarmCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmCmd.java
diff --git a/src/main/java/com/github/dockerjava/api/command/UpdateSwarmNodeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmNodeCmd.java
similarity index 86%
rename from src/main/java/com/github/dockerjava/api/command/UpdateSwarmNodeCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmNodeCmd.java
index 84d069aaf..f535d2b7f 100644
--- a/src/main/java/com/github/dockerjava/api/command/UpdateSwarmNodeCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmNodeCmd.java
@@ -1,7 +1,6 @@
package com.github.dockerjava.api.command;
import com.github.dockerjava.api.model.SwarmNodeSpec;
-import com.github.dockerjava.core.RemoteApiVersion;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
@@ -23,6 +22,11 @@ public interface UpdateSwarmNodeCmd extends SyncDockerCmd {
UpdateSwarmNodeCmd withSwarmNodeSpec(SwarmNodeSpec swarmNodeSpec);
+ UpdateSwarmNodeCmd withVersion(@Nonnull Long versionId);
+
+ @CheckForNull
+ Long getVersion();
+
interface Exec extends DockerCmdSyncExec {
}
}
diff --git a/src/main/java/com/github/dockerjava/api/command/VersionCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/VersionCmd.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/command/VersionCmd.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/VersionCmd.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java
new file mode 100644
index 000000000..7b910cd69
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java
@@ -0,0 +1,51 @@
+package com.github.dockerjava.api.command;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.github.dockerjava.api.async.ResultCallback;
+import com.github.dockerjava.api.exception.NotFoundException;
+import com.github.dockerjava.api.model.WaitContainerCondition;
+import com.github.dockerjava.api.model.WaitResponse;
+
+/**
+ * Wait a container
+ *
+ * Block until container stops, then returns its exit code
+ */
+public interface WaitContainerCmd extends AsyncDockerCmd {
+
+ @CheckForNull
+ String getContainerId();
+
+ WaitContainerCmd withContainerId(@Nonnull String containerId);
+
+ /**
+ * Defaults to {@link WaitContainerCondition#NOT_RUNNING} if omitted or empty.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+ @Nullable
+ WaitContainerCondition getCondition();
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+ WaitContainerCmd withCondition(@Nullable WaitContainerCondition condition);
+
+ /**
+ * @throws NotFoundException container not found
+ */
+ @Override
+ > T exec(T resultCallback);
+
+ @Override
+ default WaitContainerResultCallback start() {
+ return exec(new WaitContainerResultCallback());
+ }
+
+ interface Exec extends DockerCmdAsyncExec {
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java
new file mode 100644
index 000000000..6cb160151
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java
@@ -0,0 +1,74 @@
+/*
+ * Created on 21.07.2015
+ */
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.async.ResultCallbackTemplate;
+import com.github.dockerjava.api.exception.DockerClientException;
+import com.github.dockerjava.api.model.WaitResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.CheckForNull;
+import java.util.concurrent.TimeUnit;
+
+/**
+ *
+ * @author Marcus Linke
+ *
+ */
+public class WaitContainerResultCallback extends ResultCallbackTemplate {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(WaitContainerResultCallback.class);
+
+ @CheckForNull
+ private WaitResponse waitResponse = null;
+
+ @Override
+ public void onNext(WaitResponse waitResponse) {
+ this.waitResponse = waitResponse;
+ LOGGER.debug("{}", waitResponse);
+ }
+
+ /**
+ * Awaits the status code from the container.
+ *
+ * @throws DockerClientException
+ * if the wait operation fails.
+ */
+ public Integer awaitStatusCode() {
+ try {
+ awaitCompletion();
+ } catch (InterruptedException e) {
+ throw new DockerClientException("", e);
+ }
+
+ return getStatusCode();
+ }
+
+ /**
+ * Awaits the status code from the container.
+ *
+ * @throws DockerClientException
+ * if the wait operation fails.
+ */
+ public Integer awaitStatusCode(long timeout, TimeUnit timeUnit) {
+ try {
+ if (!awaitCompletion(timeout, timeUnit)) {
+ throw new DockerClientException("Awaiting status code timeout.");
+ }
+ } catch (InterruptedException e) {
+ throw new DockerClientException("Awaiting status code interrupted: ", e);
+ }
+
+ return getStatusCode();
+ }
+
+ private Integer getStatusCode() {
+ if (waitResponse == null) {
+ throw new DockerClientException("Error while wait container");
+ } else {
+ return waitResponse.getStatusCode();
+ }
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/exception/BadRequestException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/BadRequestException.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/exception/BadRequestException.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/BadRequestException.java
diff --git a/src/main/java/com/github/dockerjava/api/exception/ConflictException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/ConflictException.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/exception/ConflictException.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/ConflictException.java
diff --git a/src/main/java/com/github/dockerjava/api/exception/DockerClientException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerClientException.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/exception/DockerClientException.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerClientException.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerException.java
new file mode 100644
index 000000000..69baf047e
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerException.java
@@ -0,0 +1,28 @@
+package com.github.dockerjava.api.exception;
+
+/**
+ *
+ * @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(String.format("Status %d: %s", httpStatus, message));
+ this.httpStatus = httpStatus;
+ }
+
+ public DockerException(String message, int httpStatus, Throwable cause) {
+ super(String.format("Status %d: %s", httpStatus, message), cause);
+ this.httpStatus = httpStatus;
+ }
+
+ public int getHttpStatus() {
+ return httpStatus;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java
diff --git a/src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java
diff --git a/src/main/java/com/github/dockerjava/api/exception/NotFoundException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotFoundException.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/exception/NotFoundException.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotFoundException.java
diff --git a/src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java
diff --git a/src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java
diff --git a/src/main/java/com/github/dockerjava/api/model/AccessMode.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AccessMode.java
similarity index 100%
rename from src/main/java/com/github/dockerjava/api/model/AccessMode.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/AccessMode.java
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfig.java
new file mode 100644
index 000000000..cbb108571
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfig.java
@@ -0,0 +1,147 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.annotation.CheckForNull;
+import java.io.Serializable;
+
+@EqualsAndHashCode
+@ToString(onlyExplicitlyIncluded = true)
+public class AuthConfig extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * For backwards compatibility. Make sure you update the properties if you change this.
+ *
+ * @see "/docker.io.properties"
+ */
+ public static final String DEFAULT_SERVER_ADDRESS = "https://index.docker.io/v1/";
+
+ @JsonProperty("username")
+ @ToString.Include
+ private String username;
+
+ @JsonProperty("password")
+ private String password;
+
+ @JsonProperty("email")
+ @ToString.Include
+ private String email;
+
+ @JsonProperty("serveraddress")
+ @ToString.Include
+ private String registryAddress = DEFAULT_SERVER_ADDRESS;
+
+ @JsonProperty("auth")
+ private String auth;
+
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22}
+ */
+ @JsonProperty("registrytoken")
+ private String registrytoken;
+
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_23}
+ */
+ @JsonProperty("identitytoken")
+ private String identitytoken;
+
+ /**
+ * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_25}
+ */
+ @JsonProperty("stackOrchestrator")
+ @ToString.Include
+ private String stackOrchestrator;
+
+ public String getUsername() {
+ return username;
+ }
+
+ public AuthConfig withUsername(String username) {
+ this.username = username;
+ return this;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public AuthConfig withPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public AuthConfig withEmail(String email) {
+ this.email = email;
+ return this;
+ }
+
+ public String getRegistryAddress() {
+ return registryAddress;
+ }
+
+ public AuthConfig withRegistryAddress(String registryAddress) {
+ this.registryAddress = registryAddress;
+ return this;
+ }
+
+ public String getAuth() {
+ return auth;
+ }
+
+ public AuthConfig withAuth(String auth) {
+ this.auth = auth;
+ return this;
+ }
+
+ /**
+ * @see #identitytoken
+ */
+ public String getIdentitytoken() {
+ return identitytoken;
+ }
+ /**
+ * @see #identitytoken
+ */
+ public AuthConfig withIdentityToken(String identitytoken) {
+ this.identitytoken = identitytoken;
+ return this;
+ }
+
+ /**
+ * @see #registrytoken
+ */
+ @CheckForNull
+ public String getRegistrytoken() {
+ return registrytoken;
+ }
+
+ /**
+ * @see #registrytoken
+ */
+ public AuthConfig withRegistrytoken(String registrytoken) {
+ this.registrytoken = registrytoken;
+ return this;
+ }
+
+ /**
+ * @see #stackOrchestrator
+ */
+ public String getStackOrchestrator() {
+ return stackOrchestrator;
+ }
+
+ /**
+ * @see #stackOrchestrator
+ */
+ public void setStackOrchestrator(String stackOrchestrator) {
+ this.stackOrchestrator = stackOrchestrator;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java
similarity index 76%
rename from src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java
index baa8fc0b4..cbb7240f4 100644
--- a/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java
@@ -5,8 +5,12 @@
import java.util.TreeMap;
import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
-public class AuthConfigurations implements Serializable {
+@EqualsAndHashCode
+@ToString
+public class AuthConfigurations extends DockerObject implements Serializable {
private static final long serialVersionUID = 1L;
@JsonProperty("configs")
diff --git a/src/main/java/com/github/dockerjava/api/model/AuthResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
similarity index 76%
rename from src/main/java/com/github/dockerjava/api/model/AuthResponse.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
index 821d4c4ac..0703cab68 100644
--- a/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthResponse.java
@@ -1,20 +1,23 @@
package com.github.dockerjava.api.model;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import java.io.Serializable;
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class AuthResponse implements Serializable {
+@EqualsAndHashCode
+@ToString(onlyExplicitlyIncluded = true)
+public class AuthResponse extends DockerObject implements Serializable {
private static final long serialVersionUID = 1L;
/**
* @since 1.23
*/
@JsonProperty("Status")
+ @ToString.Include
private String status;
/**
diff --git a/src/main/java/com/github/dockerjava/api/model/Bind.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java
similarity index 81%
rename from src/main/java/com/github/dockerjava/api/model/Bind.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java
index 9a7ebf18d..ea7c22e69 100644
--- a/src/main/java/com/github/dockerjava/api/model/Bind.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java
@@ -1,7 +1,7 @@
package com.github.dockerjava.api.model;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import java.io.Serializable;
@@ -9,7 +9,9 @@
* 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 implements Serializable {
+@EqualsAndHashCode
+@ToString
+public class Bind extends DockerObject implements Serializable {
private static final long serialVersionUID = 1L;
private String path;
@@ -97,7 +99,8 @@ public PropagationMode getPropagationMode() {
*/
public static Bind parse(String serialized) {
try {
- String[] parts = serialized.split(":");
+ // Split by ':' but not ':\' (Windows-style path)
+ String[] parts = serialized.split(":(?!\\\\)");
switch (parts.length) {
case 2: {
return new Bind(parts[0], new Volume(parts[1]));
@@ -115,10 +118,16 @@ public static Bind parse(String serialized) {
nocopy = true;
} else if (PropagationMode.SHARED.toString().equals(p)) {
propagationMode = PropagationMode.SHARED;
+ } else if (PropagationMode.RSHARED.toString().equals(p)) {
+ propagationMode = PropagationMode.RSHARED;
} else if (PropagationMode.SLAVE.toString().equals(p)) {
propagationMode = PropagationMode.SLAVE;
+ } else if (PropagationMode.RSLAVE.toString().equals(p)) {
+ propagationMode = PropagationMode.RSLAVE;
} else if (PropagationMode.PRIVATE.toString().equals(p)) {
propagationMode = PropagationMode.PRIVATE;
+ } else if (PropagationMode.RPRIVATE.toString().equals(p)) {
+ propagationMode = PropagationMode.RPRIVATE;
} else {
seMode = SELContext.fromString(p);
}
@@ -135,35 +144,6 @@ public static Bind parse(String 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())
- .append(secMode, other.getSecMode())
- .append(noCopy, other.getNoCopy())
- .append(propagationMode, other.getPropagationMode())
- .isEquals();
- } else {
- return super.equals(obj);
- }
- }
-
- @Override
- public int hashCode() {
- return new HashCodeBuilder()
- .append(path)
- .append(volume)
- .append(accessMode)
- .append(secMode)
- .append(noCopy)
- .append(propagationMode)
- .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>,
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindOptions.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindOptions.java
new file mode 100644
index 000000000..801e7719a
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindOptions.java
@@ -0,0 +1,37 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+@EqualsAndHashCode
+@ToString
+public class BindOptions extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Propagation")
+ BindPropagation propagation;
+
+ /**
+ * @see #propagation
+ */
+ public BindPropagation getPropagation() {
+ return propagation;
+ }
+
+ /**
+ * @see #propagation
+ */
+ public BindOptions withPropagation(BindPropagation propagation) {
+ this.propagation = propagation;
+ return this;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/BindPropagation.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindPropagation.java
similarity index 89%
rename from src/main/java/com/github/dockerjava/api/model/BindPropagation.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/BindPropagation.java
index c7c545e10..81a189e77 100644
--- a/src/main/java/com/github/dockerjava/api/model/BindPropagation.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindPropagation.java
@@ -1,7 +1,6 @@
package com.github.dockerjava.api.model;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.github.dockerjava.core.RemoteApiVersion;
/**
* @since {@link RemoteApiVersion#VERSION_1_24}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java
new file mode 100644
index 000000000..06aff4ecf
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java
@@ -0,0 +1,34 @@
+package com.github.dockerjava.api.model;
+
+import java.io.Serializable;
+import java.util.stream.Stream;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public class Binds implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private Bind[] binds;
+
+ public Binds(Bind... binds) {
+ this.binds = binds;
+ }
+
+ public Bind[] getBinds() {
+ return binds;
+ }
+
+ @JsonValue
+ public String[] toPrimitive() {
+ return Stream.of(binds).map(Bind::toString).toArray(String[]::new);
+ }
+
+ @JsonCreator
+ public static Binds fromPrimitive(String[] binds) {
+ return new Binds(
+ Stream.of(binds).map(Bind::parse).toArray(Bind[]::new)
+ );
+ }
+
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java
new file mode 100644
index 000000000..300bcbf24
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java
@@ -0,0 +1,37 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode
+@ToString
+public class BlkioRateDevice extends DockerObject implements Serializable {
+ public static final long serialVersionUID = 1L;
+
+ @JsonProperty("Path")
+ private String path;
+
+ @JsonProperty("Rate")
+ private Long rate;
+
+ public String getPath() {
+ return path;
+ }
+
+ public BlkioRateDevice withPath(String path) {
+ this.path = path;
+ return this;
+ }
+
+ public Long getRate() {
+ return rate;
+ }
+
+ public BlkioRateDevice withRate(Long rate) {
+ this.rate = rate;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatEntry.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatEntry.java
new file mode 100644
index 000000000..2fccabaa2
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatEntry.java
@@ -0,0 +1,61 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * BlkioStat is not documented in pubic docker swapper.yaml yet, reference:
+ * https://github.com/moby/moby/blob/master/api/types/stats.go
+ */
+@EqualsAndHashCode
+@ToString
+public class BlkioStatEntry extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+ @JsonProperty("major")
+ Long major;
+ @JsonProperty("minor")
+ Long minor;
+ @JsonProperty("op")
+ String op;
+ @JsonProperty("value")
+ Long value;
+
+ public Long getMajor() {
+ return major;
+ }
+
+ public BlkioStatEntry withMajor(Long major) {
+ this.major = major;
+ return this;
+ }
+
+ public Long getMinor() {
+ return minor;
+ }
+
+ public BlkioStatEntry withMinor(Long minor) {
+ this.minor = minor;
+ return this;
+ }
+
+ public String getOp() {
+ return op;
+ }
+
+ public BlkioStatEntry withOp(String op) {
+ this.op = op;
+ return this;
+ }
+
+ public Long getValue() {
+ return value;
+ }
+
+ public BlkioStatEntry withValue(Long value) {
+ this.value = value;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatsConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatsConfig.java
new file mode 100644
index 000000000..5a7db4d8b
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatsConfig.java
@@ -0,0 +1,108 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.annotation.CheckForNull;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Used in {@link Statistics}
+ *
+ * @author Yuting Liu
+ */
+@EqualsAndHashCode
+@ToString
+public class BlkioStatsConfig extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @JsonProperty("io_service_bytes_recursive")
+ private List ioServiceBytesRecursive;
+
+ @JsonProperty("io_serviced_recursive")
+ private List ioServicedRecursive;
+
+ @JsonProperty("io_queue_recursive")
+ private List ioQueueRecursive;
+
+ @JsonProperty("io_service_time_recursive")
+ private List ioServiceTimeRecursive;
+
+ @JsonProperty("io_wait_time_recursive")
+ private List ioWaitTimeRecursive;
+
+ @JsonProperty("io_merged_recursive")
+ private List ioMergedRecursive;
+
+ @JsonProperty("io_time_recursive")
+ private List ioTimeRecursive;
+
+ @JsonProperty("sectors_recursive")
+ private List sectorsRecursive;
+
+ /**
+ * @see #ioServiceBytesRecursive
+ */
+ @CheckForNull
+ public List getIoServiceBytesRecursive() {
+ return ioServiceBytesRecursive;
+ }
+
+ /**
+ * @see #ioServicedRecursive
+ */
+ @CheckForNull
+ public List getIoServicedRecursive() {
+ return ioServicedRecursive;
+ }
+
+ /**
+ * @see #ioQueueRecursive
+ */
+ @CheckForNull
+ public List getIoQueueRecursive() {
+ return ioQueueRecursive;
+ }
+
+ /**
+ * @see #ioServiceTimeRecursive
+ */
+ @CheckForNull
+ public List getIoServiceTimeRecursive() {
+ return ioServiceTimeRecursive;
+ }
+
+ /**
+ * @see #ioWaitTimeRecursive
+ */
+ @CheckForNull
+ public List getIoWaitTimeRecursive() {
+ return ioWaitTimeRecursive;
+ }
+
+ /**
+ * @see #ioMergedRecursive
+ */
+ @CheckForNull
+ public List getIoMergedRecursive() {
+ return ioMergedRecursive;
+ }
+
+ /**
+ * @see #ioTimeRecursive
+ */
+ @CheckForNull
+ public List getIoTimeRecursive() {
+ return ioTimeRecursive;
+ }
+
+ /**
+ * @see #sectorsRecursive
+ */
+ @CheckForNull
+ public List getSectorsRecursive() {
+ return sectorsRecursive;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java
new file mode 100644
index 000000000..3fd9704d8
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java
@@ -0,0 +1,37 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode
+@ToString
+public class BlkioWeightDevice extends DockerObject implements Serializable {
+ public static final long serialVersionUID = 1L;
+
+ @JsonProperty("Path")
+ private String path;
+
+ @JsonProperty("Weight")
+ private Integer weight;
+
+ public String getPath() {
+ return path;
+ }
+
+ public BlkioWeightDevice withPath(String path) {
+ this.path = path;
+ return this;
+ }
+
+ public Integer getWeight() {
+ return weight;
+ }
+
+ public BlkioWeightDevice withWeight(Integer weight) {
+ this.weight = weight;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java
new file mode 100644
index 000000000..80356e55c
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java
@@ -0,0 +1,42 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * Represents a build response stream item
+ */
+@EqualsAndHashCode
+@ToString
+public class BuildResponseItem extends ResponseItem {
+ private static final long serialVersionUID = -1252904184236343612L;
+
+ private static final String BUILD_SUCCESS = "Successfully built";
+ private static final String SHA256 = "sha256:";
+
+ /**
+ * Returns whether the stream field indicates a successful build operation
+ */
+ @JsonIgnore
+ public boolean isBuildSuccessIndicated() {
+ if (isErrorIndicated() || getStream() == null) {
+ return false;
+ }
+
+ return getStream().contains(BUILD_SUCCESS) || getStream().startsWith(SHA256);
+ }
+
+ @JsonIgnore
+ public String getImageId() {
+ if (!isBuildSuccessIndicated()) {
+ return null;
+ }
+
+ if (getStream().startsWith(SHA256)) {
+ return getStream().replaceFirst(SHA256, "").trim();
+ }
+
+ return getStream().replaceFirst(BUILD_SUCCESS, "").trim();
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/Capability.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java
similarity index 93%
rename from src/main/java/com/github/dockerjava/api/model/Capability.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java
index 6237a65ae..57fb97c7b 100644
--- a/src/main/java/com/github/dockerjava/api/model/Capability.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java
@@ -1,5 +1,7 @@
package com.github.dockerjava.api.model;
+import com.fasterxml.jackson.annotation.JsonCreator;
+
/**
* The Linux capabilities supported by Docker. The list of capabilities is defined in Docker's types.go, {@link #ALL} was added manually.
*
@@ -18,6 +20,10 @@ public enum Capability {
*
*/
AUDIT_CONTROL,
+ /**
+ * Allow reading the audit log via multicast netlink socket.
+ */
+ AUDIT_READ,
/**
* Write records to kernel auditing log.
*/
@@ -26,6 +32,14 @@ public enum Capability {
* Employ features that can block system suspend.
*/
BLOCK_SUSPEND,
+ /**
+ * Allow creating BPF maps, loading BPF Type Format (BTF) data, retrieve JITed code of BPF programs, and more.
+ */
+ BPF,
+ /**
+ * Allow checkpoint/restore related operations. Introduced in kernel 5.9.
+ */
+ CHECKPOINT_RESTORE,
/**
* Make arbitrary changes to file UIDs and GIDs (see chown(2)).
*/
@@ -120,6 +134,10 @@ public enum Capability {
*
*/
NET_RAW,
+ /**
+ * Allow system performance and observability privileged operations using perf_events, i915_perf and other kernel subsystems
+ */
+ PERFMON,
/**
* Set file capabilities.
*/
@@ -283,5 +301,11 @@ public enum Capability {
/**
* Trigger something that will wake up the system (set CLOCK_REALTIME_ALARM and CLOCK_BOOTTIME_ALARM timers).
*/
- WAKE_ALARM
+ WAKE_ALARM;
+
+ @JsonCreator
+ public static Capability fromValue(String cap) {
+ String result = !cap.startsWith("CAP_") ? cap : cap.split("_", 2)[1];
+ return Capability.valueOf(result);
+ }
}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ChangeLog.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ChangeLog.java
new file mode 100644
index 000000000..c8a5be890
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ChangeLog.java
@@ -0,0 +1,32 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ *
+ */
+@EqualsAndHashCode
+@ToString
+public class ChangeLog extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @JsonProperty("Path")
+ private String path;
+
+ @JsonProperty("Kind")
+ private Integer kind;
+
+ public String getPath() {
+ return path;
+ }
+
+ public Integer getKind() {
+ return kind;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ClusterInfo.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ClusterInfo.java
new file mode 100644
index 000000000..b6e1e5566
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ClusterInfo.java
@@ -0,0 +1,131 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.annotation.CheckForNull;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * Used for creating swarms.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+@EqualsAndHashCode
+@ToString
+public class ClusterInfo extends DockerObject implements Serializable {
+
+ public static final long serialVersionUID = 1L;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("CreatedAt")
+ private Date createdAt;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Spec")
+ private SwarmSpec spec;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("ID")
+ private String id;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("UpdatedAt")
+ private Date updatedAt;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Version")
+ private ResourceVersion version;
+
+ /**
+ * @see #createdAt
+ */
+ @CheckForNull
+ public Date getCreatedAt() {
+ return createdAt;
+ }
+
+ /**
+ * @see #createdAt
+ */
+ public ClusterInfo withCreatedAt(Date createdAt) {
+ this.createdAt = createdAt;
+ return this;
+ }
+
+ /**
+ * @see #spec
+ */
+ @CheckForNull
+ public SwarmSpec getSpec() {
+ return spec;
+ }
+
+ /**
+ * @see #spec
+ */
+ public ClusterInfo withSpec(SwarmSpec spec) {
+ this.spec = spec;
+ return this;
+ }
+ /**
+ * @see #id
+ */
+ @CheckForNull
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @see #id
+ */
+ public ClusterInfo withId(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * @see #updatedAt
+ */
+ @CheckForNull
+ public Date getUpdatedAt() {
+ return updatedAt;
+ }
+
+ /**
+ * @see #updatedAt
+ */
+ public ClusterInfo withUpdatedAt(Date updatedAt) {
+ this.updatedAt = updatedAt;
+ return this;
+ }
+
+ /**
+ * @see #version
+ */
+ @CheckForNull
+ public ResourceVersion getVersion() {
+ return version;
+ }
+
+ /**
+ * @see #version
+ */
+ public ClusterInfo withVersion(ResourceVersion version) {
+ this.version = version;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Config.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Config.java
new file mode 100644
index 000000000..2c5b87aa8
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Config.java
@@ -0,0 +1,90 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Used for Listing config.
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+@ToString
+@EqualsAndHashCode
+public class Config extends DockerObject implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @since 1.30
+ */
+ @JsonProperty("ID")
+ private String id;
+
+ /**
+ * @since 1.30
+ */
+ @JsonProperty("CreatedAt")
+ private Date createdAt;
+
+ /**
+ * @since 1.30
+ */
+ @JsonProperty("UpdatedAt")
+ private Date updatedAt;
+
+ /**
+ * @since 1.30
+ */
+ @JsonProperty("Spec")
+ private ConfigSpec spec;
+
+ /**
+ * @since 1.30
+ */
+ @JsonProperty("Version")
+ private ResourceVersion version;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Date getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(Date createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public Date getUpdatedAt() {
+ return updatedAt;
+ }
+
+ public void setUpdatedAt(Date updatedAt) {
+ this.updatedAt = updatedAt;
+ }
+
+ public ConfigSpec getSpec() {
+ return spec;
+ }
+
+ public void setSpec(ConfigSpec spec) {
+ this.spec = spec;
+ }
+
+ public ResourceVersion getVersion() {
+ return version;
+ }
+
+ public void setVersion(ResourceVersion version) {
+ this.version = version;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ConfigSpec.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ConfigSpec.java
new file mode 100644
index 000000000..62e525d0b
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ConfigSpec.java
@@ -0,0 +1,24 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * @since {@link RemoteApiVersion#VERSION_1_30}
+ */
+@EqualsAndHashCode
+@ToString
+public class ConfigSpec extends DockerObject implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @JsonProperty("Name")
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/Container.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Container.java
similarity index 77%
rename from src/main/java/com/github/dockerjava/api/model/Container.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/Container.java
index 9e04362ce..3b4bdf394 100644
--- a/src/main/java/com/github/dockerjava/api/model/Container.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Container.java
@@ -1,17 +1,13 @@
package com.github.dockerjava.api.model;
-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.github.dockerjava.api.command.ListContainersCmd;
-import com.github.dockerjava.core.RemoteApiVersion;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ToStringBuilder;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import javax.annotation.CheckForNull;
import java.io.Serializable;
+import java.util.List;
import java.util.Map;
/**
@@ -19,9 +15,9 @@
*
* @author Konstantin Pelykh (kpelykh@gmail.com)
*/
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonInclude(Include.NON_NULL)
-public class Container implements Serializable {
+@EqualsAndHashCode
+@ToString
+public class Container extends DockerObject implements Serializable {
private static final long serialVersionUID = 1L;
@JsonProperty("Command")
@@ -54,6 +50,12 @@ public class Container implements Serializable {
@JsonProperty("Status")
private String status;
+ /**
+ * @since ~{@link RemoteApiVersion#VERSION_1_23}
+ */
+ @JsonProperty("State")
+ private String state;
+
/**
* @since ~{@link RemoteApiVersion#VERSION_1_19}
*/
@@ -83,6 +85,12 @@ public class Container implements Serializable {
@JsonProperty("NetworkSettings")
private ContainerNetworkSettings networkSettings;
+ /**
+ * @since ~{@link RemoteApiVersion#VERSION_1_23}
+ */
+ @JsonProperty("Mounts")
+ private List mounts;
+
public String getId() {
return id;
}
@@ -108,6 +116,10 @@ public String getStatus() {
return status;
}
+ public String getState() {
+ return state;
+ }
+
public ContainerPort[] getPorts() {
return ports;
}
@@ -152,18 +164,7 @@ public ContainerHostConfig getHostConfig() {
return hostConfig;
}
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
-
- @Override
- public boolean equals(Object o) {
- return EqualsBuilder.reflectionEquals(this, o);
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
+ public List getMounts() {
+ return mounts;
}
}
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
similarity index 90%
rename from src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
index 6d3265afa..db5437220 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerConfig.java
@@ -1,13 +1,9 @@
package com.github.dockerjava.api.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ToStringBuilder;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import javax.annotation.CheckForNull;
import java.io.Serializable;
@@ -18,9 +14,9 @@
*
* @author Konstantin Pelykh (kpelykh@gmail.com)
*/
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonInclude(Include.NON_NULL)
-public class ContainerConfig implements Serializable {
+@EqualsAndHashCode
+@ToString
+public class ContainerConfig extends DockerObject implements Serializable {
private static final long serialVersionUID = 1L;
@JsonProperty("AttachStderr")
@@ -429,19 +425,4 @@ public ContainerConfig withWorkingDir(String workingDir) {
this.workingDir = workingDir;
return this;
}
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
-
- @Override
- public boolean equals(Object o) {
- return EqualsBuilder.reflectionEquals(this, o);
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerDNSConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerDNSConfig.java
new file mode 100644
index 000000000..63d3cae11
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerDNSConfig.java
@@ -0,0 +1,53 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Specification for DNS related configurations in resolver configuration file (`resolv.conf`).
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_25}
+ */
+@EqualsAndHashCode
+@ToString
+public class ContainerDNSConfig extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @JsonProperty("Nameservers")
+ private List nameservers;
+ @JsonProperty("Search")
+ private List search;
+ @JsonProperty("Options")
+ private List options;
+
+ public List getNameservers() {
+ return nameservers;
+ }
+
+ public ContainerDNSConfig withNameservers(List nameservers) {
+ this.nameservers = nameservers;
+ return this;
+ }
+
+ public List getSearch() {
+ return search;
+ }
+
+ public ContainerDNSConfig withSearch(List search) {
+ this.search = search;
+ return this;
+ }
+
+ public List getOptions() {
+ return options;
+ }
+
+ public ContainerDNSConfig withOptions(List options) {
+ this.options = options;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerHostConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerHostConfig.java
new file mode 100644
index 000000000..cdc446282
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerHostConfig.java
@@ -0,0 +1,34 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * Used in {@link Container}
+ *
+ * @see Container
+ * @author Kanstantsin Shautsou
+ */
+@EqualsAndHashCode
+@ToString
+public class ContainerHostConfig extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @JsonProperty("NetworkMode")
+ private String networkMode;
+
+ public String getNetworkMode() {
+ return networkMode;
+ }
+
+ /**
+ * @see #networkMode
+ */
+ public ContainerHostConfig withNetworkMode(String networkMode) {
+ this.networkMode = networkMode;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerMount.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerMount.java
new file mode 100644
index 000000000..a08a6ea3f
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerMount.java
@@ -0,0 +1,151 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.annotation.CheckForNull;
+import java.io.Serializable;
+
+/**
+ * @author Yuting Liu
+ * @see Container
+ */
+@EqualsAndHashCode
+@ToString
+public class ContainerMount extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @JsonProperty("Name")
+ String name;
+
+ @JsonProperty("Source")
+ String source;
+
+ @JsonProperty("Destination")
+ String destination;
+
+ @JsonProperty("Driver")
+ String driver;
+
+ @JsonProperty("Mode")
+ String mode;
+
+ @JsonProperty("RW")
+ boolean rw;
+
+ @JsonProperty("Propagation")
+ String propagation;
+
+ /**
+ * @see #name
+ */
+ @CheckForNull
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @see #name
+ */
+ public ContainerMount withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * @see #source
+ */
+ @CheckForNull
+ public String getSource() {
+ return source;
+ }
+
+ /**
+ * @see #source
+ */
+ public ContainerMount withSource(String source) {
+ this.source = source;
+ return this;
+ }
+
+ /**
+ * @see #destination
+ */
+ @CheckForNull
+ public String getDestination() {
+ return destination;
+ }
+
+ /**
+ * @see #destination
+ */
+ public ContainerMount withDestination(String destination) {
+ this.destination = destination;
+ return this;
+ }
+
+ /**
+ * @see #driver
+ */
+ @CheckForNull
+ public String getDriver() {
+ return driver;
+ }
+
+ /**
+ * @see #driver
+ */
+ public ContainerMount withDriver(String driver) {
+ this.driver = driver;
+ return this;
+ }
+
+ /**
+ * @see #mode
+ */
+ @CheckForNull
+ public String getMode() {
+ return mode;
+ }
+
+ /**
+ * @see #mode
+ */
+ public ContainerMount withMode(String mode) {
+ this.mode = mode;
+ return this;
+ }
+
+ /**
+ * @see #rw
+ */
+ @CheckForNull
+ public Boolean getRw() {
+ return rw;
+ }
+
+ /**
+ * @see #rw
+ */
+ public ContainerMount withRw(Boolean rw) {
+ this.rw = rw;
+ return this;
+ }
+
+ /**
+ * @see #propagation
+ */
+ @CheckForNull
+ public String getPropagation() {
+ return propagation;
+ }
+
+ /**
+ * @see #propagation
+ */
+ public ContainerMount withPropagation(String propagation) {
+ this.propagation = propagation;
+ return this;
+ }
+}
diff --git a/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
similarity index 89%
rename from src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
index bc7e12d33..823828900 100644
--- a/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerNetwork.java
@@ -1,12 +1,9 @@
package com.github.dockerjava.api.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.github.dockerjava.core.RemoteApiVersion;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ToStringBuilder;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
import javax.annotation.CheckForNull;
import java.io.Serializable;
@@ -21,8 +18,9 @@
* @see ContainerNetworkSettings
* @author Kanstantsin Shautsou
*/
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class ContainerNetwork implements Serializable {
+@EqualsAndHashCode
+@ToString
+public class ContainerNetwork extends DockerObject implements Serializable {
private static final long serialVersionUID = 1L;
/**
@@ -282,25 +280,13 @@ public ContainerNetwork withNetworkID(String networkID) {
return this;
}
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
-
- @Override
- public boolean equals(Object o) {
- return EqualsBuilder.reflectionEquals(this, o);
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
-
/**
* Docker named it EndpointIPAMConfig
*/
- public static class Ipam {
+ @EqualsAndHashCode
+ @ToString
+ public static class Ipam extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
@JsonProperty("IPv4Address")
private String ipv4Address;
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerNetworkSettings.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerNetworkSettings.java
new file mode 100644
index 000000000..9e8381500
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerNetworkSettings.java
@@ -0,0 +1,41 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * Sub-object in {@link Container}
+ *
+ * @see Container
+ * @since {@link RemoteApiVersion#VERSION_1_22}
+ */
+@EqualsAndHashCode
+@ToString
+public class ContainerNetworkSettings extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_22}
+ */
+ @JsonProperty("Networks")
+ private Map networks;
+
+ /**
+ * @see #networks
+ */
+ public Map getNetworks() {
+ return networks;
+ }
+
+ /**
+ * @see #networks
+ */
+ public ContainerNetworkSettings withNetworks(Map networks) {
+ this.networks = networks;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerPort.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerPort.java
new file mode 100644
index 000000000..35f9f6ab9
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerPort.java
@@ -0,0 +1,94 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.annotation.CheckForNull;
+import java.io.Serializable;
+
+/**
+ * @author Kanstantsin Shautsou
+ * @see Container
+ */
+@EqualsAndHashCode
+@ToString
+public class ContainerPort extends DockerObject implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @JsonProperty("IP")
+ private String ip;
+
+ @JsonProperty("PrivatePort")
+ private Integer privatePort;
+
+ @JsonProperty("PublicPort")
+ private Integer publicPort;
+
+ @JsonProperty("Type")
+ private String type;
+
+ /**
+ * @see #ip
+ */
+ @CheckForNull
+ public String getIp() {
+ return ip;
+ }
+
+ /**
+ * @see #ip
+ */
+ public ContainerPort withIp(String ip) {
+ this.ip = ip;
+ return this;
+ }
+
+ /**
+ * @see #privatePort
+ */
+ @CheckForNull
+ public Integer getPrivatePort() {
+ return privatePort;
+ }
+
+ /**
+ * @see #privatePort
+ */
+ public ContainerPort withPrivatePort(Integer privatePort) {
+ this.privatePort = privatePort;
+ return this;
+ }
+
+ /**
+ * @see #publicPort
+ */
+ @CheckForNull
+ public Integer getPublicPort() {
+ return publicPort;
+ }
+
+ /**
+ * @see #publicPort
+ */
+ public ContainerPort withPublicPort(Integer publicPort) {
+ this.publicPort = publicPort;
+ return this;
+ }
+
+ /**
+ * @see #type
+ */
+ @CheckForNull
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @see #type
+ */
+ public ContainerPort withType(String type) {
+ this.type = type;
+ return this;
+ }
+}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerSpec.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerSpec.java
new file mode 100644
index 000000000..0a26e54fd
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerSpec.java
@@ -0,0 +1,455 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.annotation.CheckForNull;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * The specification for containers as used in {@link TaskSpec}
+ *
+ * @since {@link RemoteApiVersion#VERSION_1_24}
+ */
+@EqualsAndHashCode
+@ToString
+public class ContainerSpec extends DockerObject implements Serializable {
+ public static final long serialVersionUID = 1L;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Image")
+ private String image;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Labels")
+ private Map labels;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Command")
+ private List command;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Args")
+ private List args;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Env")
+ private List env;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Dir")
+ private String dir;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("User")
+ private String user;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Groups")
+ private String groups;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("TTY")
+ private Boolean tty;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Mounts")
+ private List mounts;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("Duration")
+ private Long duration;
+
+ /**
+ * @since 1.24
+ */
+ @JsonProperty("StopGracePeriod")
+ private Long stopGracePeriod;
+
+ /**
+ * @since 1.25
+ * Specification for DNS related configurations in resolver configuration file
+ */
+ @JsonProperty("DNSConfig")
+ private ContainerDNSConfig dnsConfig;
+
+ /**
+ * @since 1.26
+ * Open stdin
+ */
+ @JsonProperty("OpenStdin")
+ private Boolean openStdin;
+
+ /**
+ * @since 1.26
+ * Mount the container's root filesystem as read only.
+ */
+ @JsonProperty("ReadOnly")
+ private Boolean readOnly;
+
+ /**
+ * @since 1.26
+ * A list of hostnames/IP mappings to add to the container's /etc/hosts file.
+ */
+ @JsonProperty("Hosts")
+ private List hosts;
+
+ /**
+ * @since 1.26
+ * The hostname to use for the container, as a valid RFC 1123 hostname
+ */
+ @JsonProperty("Hostname")
+ private String hostname;
+
+ /**
+ * @since 1.26
+ * Secrets contains references to zero or more secrets that will be exposed to the service.
+ */
+ @JsonProperty("Secrets")
+ private List secrets;
+
+ /**
+ * @since 1.26
+ * A test to perform to check that the container is healthy.
+ */
+ @JsonProperty("Healthcheck")
+ private HealthCheck healthCheck;
+
+ /**
+ * @since 1.28
+ * Signal to stop the container.
+ */
+ @JsonProperty("StopSignal")
+ private String stopSignal;
+
+ /**
+ * @since 1.29
+ * Security options for the container
+ */
+ @JsonProperty("Privileges")
+ private ContainerSpecPrivileges privileges;
+
+ /**
+ * @since 1.29
+ * Configs contains references to zero or more configs that will be exposed to the service.
+ */
+ @JsonProperty("Configs")
+ private List configs;
+
+ /**
+ * @since 1.38
+ * Run an init inside the container that forwards signals and reaps processes.
+ * This field is omitted if empty, and the default (as configured on the daemon) is used.
+ */
+ @JsonProperty("Init")
+ private Boolean init;
+
+ /**
+ * @see #image
+ */
+ @CheckForNull
+ public String getImage() {
+ return image;
+ }
+
+ /**
+ * @see #image
+ */
+ public ContainerSpec withImage(String image) {
+ this.image = image;
+ return this;
+ }
+
+ /**
+ * @see #labels
+ */
+ @CheckForNull
+ public Map getLabels() {
+ return labels;
+ }
+
+ /**
+ * @see #labels
+ */
+ public ContainerSpec withLabels(Map labels) {
+ this.labels = labels;
+ return this;
+ }
+
+ /**
+ * @see #command
+ */
+ @CheckForNull
+ public List getCommand() {
+ return command;
+ }
+
+ /**
+ * @see #command
+ */
+ public ContainerSpec withCommand(List command) {
+ this.command = command;
+ return this;
+ }
+
+ /**
+ * @see #args
+ */
+ @CheckForNull
+ public List getArgs() {
+ return args;
+ }
+
+ /**
+ * @see #args
+ */
+ public ContainerSpec withArgs(List args) {
+ this.args = args;
+ return this;
+ }
+
+ /**
+ * @see #env
+ */
+ @CheckForNull
+ public List getEnv() {
+ return env;
+ }
+
+ /**
+ * @see #env
+ */
+ public ContainerSpec withEnv(List env) {
+ this.env = env;
+ return this;
+ }
+
+ /**
+ * @see #dir
+ */
+ @CheckForNull
+ public String getDir() {
+ return dir;
+ }
+
+ /**
+ * @see #dir
+ */
+ public ContainerSpec withDir(String dir) {
+ this.dir = dir;
+ return this;
+ }
+
+ /**
+ * @see #user
+ */
+ @CheckForNull
+ public String getUser() {
+ return user;
+ }
+
+ /**
+ * @see #user
+ */
+ public ContainerSpec withUser(String user) {
+ this.user = user;
+ return this;
+ }
+
+ /**
+ * @see #groups
+ */
+ @CheckForNull
+ public String getGroups() {
+ return groups;
+ }
+
+ /**
+ * @see #groups
+ */
+ public ContainerSpec withGroups(String groups) {
+ this.groups = groups;
+ return this;
+ }
+
+ /**
+ * @see #tty
+ */
+ @CheckForNull
+ public Boolean getTty() {
+ return tty;
+ }
+
+ /**
+ * @see #tty
+ */
+ public ContainerSpec withTty(Boolean tty) {
+ this.tty = tty;
+ return this;
+ }
+
+ /**
+ * @see #mounts
+ */
+ @CheckForNull
+ public List