diff --git a/.ci/get-docker-com.sh b/.ci/get-docker-com.sh deleted file mode 100755 index d9c0142a2..000000000 --- a/.ci/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/.ci/setup_docker.sh b/.ci/setup_docker.sh deleted file mode 100755 index fd71ffd48..000000000 --- a/.ci/setup_docker.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -set -exu - -DOCKER_VERSION="${DOCKER_VERSION:-}" -DOCKER_HOST="${DOCKER_HOST:-}" - -if [[ -n $DOCKER_VERSION ]]; then - sudo -E apt-get -q -y --purge remove docker-engine docker-ce - - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" - sudo apt-get update - sudo apt-cache madison docker-ce - sudo apt-get install "docker-ce=$DOCKER_VERSION" -fi - -if [[ -n $DOCKER_HOST ]]; then - sudo mkdir -p /etc/systemd/system/docker.service.d/ - - echo " -[Service] -ExecStart= -ExecStart=/usr/bin/dockerd -H $DOCKER_HOST - " | sudo tee -a /etc/systemd/system/docker.service.d/override.conf - - sudo systemctl daemon-reload - sudo service docker restart || sudo journalctl -xe - sudo service docker status -fi - -while (! docker ps ); do - echo "Waiting for Docker to launch..." - sleep 1 -done -docker version -docker info - -docker run --rm hello-world diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..e5a6b0376 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +* @docker-java/team + diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7dec19aef..9bcef2d88 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,5 +4,13 @@ updates: directory: "/" schedule: interval: weekly + day: monday open-pull-requests-limit: 99 rebase-strategy: disabled + ignore: + - dependency-name: "org.glassfish.jersey.connectors:jersey-apache-connector" + update-types: [ "version-update:semver-major" ] + - dependency-name: "org.glassfish.jersey.core:jersey-client" + update-types: [ "version-update:semver-major" ] + - dependency-name: "org.glassfish.jersey.inject:jersey-hk2" + update-types: [ "version-update:semver-major" ] diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index d03b3f5f5..f570cce43 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -1,5 +1,5 @@ tag-template: $NEXT_PATCH_VERSION -name-template: '$NEXT_PATCH_VERSION 🌈' +name-template: '$NEXT_PATCH_VERSION' categories: - title: '🚀 Features' labels: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 73c35f57a..d7b105d1d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,41 +2,54 @@ name: CI on: pull_request: {} - push: { branches: [ master ] } + push: { branches: [ main ] } + workflow_dispatch: jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: include: - - { name: "default" } - - { name: "over TCP", dockerHost: "tcp://127.0.0.1:2375" } - - { name: "Docker 18.06.3", dockerVersion: "18.06.3~ce~3-0~ubuntu" } + - { name: "default", javaVersion: 8 } + - { name: "default", javaVersion: 17 } + - { name: "default", javaVersion: 21 } + steps: + - uses: actions/checkout@v4 + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: ${{matrix.javaVersion}} + distribution: temurin + cache: maven + - name: Configure Docker + id: setup_docker + uses: docker/setup-docker-action@v4 + with: + channel: stable + - name: Build with Maven + env: + DOCKER_HOST: ${{steps.setup_docker.outputs.sock}} + run: ./mvnw --no-transfer-progress verify + tcp: + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v2 - - name: Set up JDK 8 - uses: actions/setup-java@v1 + - uses: actions/checkout@v4 + - name: Set up JDK + uses: actions/setup-java@v4 with: java-version: 8 + distribution: temurin + cache: maven - name: Configure Docker - env: - DOCKER_VERSION: ${{matrix.dockerVersion}} - DOCKER_HOST: ${{matrix.dockerHost}} - run: .ci/setup_docker.sh + id: setup_docker + uses: docker/setup-docker-action@v4 + with: + channel: stable + tcp-port: 2375 - name: Build with Maven env: - DOCKER_HOST: ${{matrix.dockerHost}} + DOCKER_HOST: ${{steps.setup_docker.outputs.tcp}} run: ./mvnw --no-transfer-progress verify - - name: Aggregate test reports with ciMate - if: always() - continue-on-error: true - env: - CIMATE_PROJECT_ID: lodr9d83 - CIMATE_CI_KEY: "CI / ${{matrix.name}}" - run: | - wget -q https://get.cimate.io/release/linux/cimate - chmod +x cimate - ./cimate "**/TEST-*.xml" diff --git a/.github/workflows/main.yml b/.github/workflows/release-drafter.yml similarity index 96% rename from .github/workflows/main.yml rename to .github/workflows/release-drafter.yml index 2c30bcdb1..99cd01cfc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/release-drafter.yml @@ -4,7 +4,7 @@ on: push: # branches to consider in the event; optional, defaults to all branches: - - master + - main jobs: update_release_draft: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9f0acaa02..16777daa6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,17 +8,25 @@ on: jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4 - name: Set up JDK 8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: java-version: 8 + distribution: temurin + server-id: central + server-username: MAVEN_USERNAME + server-password: MAVEN_CENTRAL_TOKEN + gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Set version run: ./mvnw versions:set -DnewVersion="${{github.event.release.tag_name}}" - # TODO check master's CI status + # TODO check main's CI status - name: Deploy with Maven env: - MAVEN_DEPLOYMENT_REPOSITORY: ${{ secrets.MAVEN_DEPLOYMENT_REPOSITORY }} - run: ./mvnw deploy -DaltReleaseDeploymentRepository="$MAVEN_DEPLOYMENT_REPOSITORY" -DskipTests + MAVEN_USERNAME: ${{ secrets.SONATYPE_CENTRAL_USERNAME }} + MAVEN_CENTRAL_TOKEN: ${{ secrets.SONATYPE_CENTRAL_PASSWORD }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} + run: ./mvnw -Prelease deploy -DskipTests diff --git a/.gitignore b/.gitignore index 201acaa5f..006641e8c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ # Ignore all build/dist directories target +dependency-reduced-pom.xml # Ignore InteliJ Idea project files .idea/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ca44ee2e..5d344d93b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -301,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/README.md b/README.md index c60907548..b1fa9c89e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ [![Join the chat at https://gitter.im/docker-java/docker-java](https://badges.gitter.im/docker-java/docker-java.svg)](https://gitter.im/docker-java/docker-java?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Maven Central](https://img.shields.io/maven-central/v/com.github.docker-java/docker-java.svg)](https://mvnrepository.com/artifact/com.github.docker-java/docker-java) -[![codecov.io](http://codecov.io/github/docker-java/docker-java/coverage.svg?branch=master)](http://codecov.io/github/docker-java/docker-java?branch=master) -[![License](http://img.shields.io/:license-apache-blue.svg?style=flat)](https://github.com/docker-java/docker-java/blob/master/LICENSE) +[![codecov.io](http://codecov.io/github/docker-java/docker-java/coverage.svg?branch=main)](http://codecov.io/github/docker-java/docker-java?branch=master) +[![License](http://img.shields.io/:license-apache-blue.svg?style=flat)](https://github.com/docker-java/docker-java/blob/main/LICENSE) # docker-java Java API client for [Docker](http://docs.docker.io/ "Docker") -# [Read the documentation here](docs/README.md) \ No newline at end of file +# [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 index 92b46a613..dda682ab1 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -15,11 +15,15 @@ https://github.com/docker-java/docker-java Java API Client for Docker + + com.github.dockerjava.api + + com.fasterxml.jackson.core jackson-annotations - ${jackson.version} + 2.20 @@ -38,7 +42,7 @@ org.projectlombok lombok - 1.18.18 + 1.18.38 provided @@ -46,14 +50,14 @@ org.junit.jupiter junit-jupiter - 5.7.2 + 5.13.4 test com.tngtech.archunit archunit-junit5 - 0.18.0 + 1.4.1 test @@ -77,6 +81,22 @@ + + 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 index 7805300f5..e5f57e1bb 100644 --- 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 @@ -42,6 +42,7 @@ 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; @@ -56,6 +57,7 @@ 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; @@ -130,6 +132,8 @@ public interface DockerClient extends Closeable { */ LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream); + LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream); + SearchImagesCmd searchImagesCmd(@Nonnull String term); RemoveImageCmd removeImageCmd(@Nonnull String imageId); @@ -342,6 +346,15 @@ public interface DockerClient extends Closeable { */ UpdateSwarmNodeCmd updateSwarmNodeCmd(); + /** + * Remove the swarm node + * + * @param swarmNodeId swarmNodeId + * @return the command + * @since 1.24 + */ + RemoveSwarmNodeCmd removeSwarmNodeCmd(String swarmNodeId); + /** * List nodes in swarm * 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 index bb5db859e..5de64641f 100644 --- 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 @@ -42,6 +42,7 @@ 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; @@ -56,6 +57,7 @@ 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; @@ -152,6 +154,11 @@ 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); @@ -423,6 +430,11 @@ public UpdateSwarmNodeCmd updateSwarmNodeCmd() { return getDockerClient().updateSwarmNodeCmd(); } + @Override + public RemoveSwarmNodeCmd removeSwarmNodeCmd(String swarmNodeId) { + return getDockerClient().removeSwarmNodeCmd(swarmNodeId); + } + @Override public ListSwarmNodesCmd listSwarmNodesCmd() { return getDockerClient().listSwarmNodesCmd(); 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 index 0bb0f0884..9db21a6c4 100644 --- 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 @@ -31,7 +31,7 @@ public void onNext(BuildResponseItem item) { } else if (item.isErrorIndicated()) { this.error = item.getError(); } - LOGGER.debug(item.toString()); + LOGGER.debug("{}", item); } /** @@ -67,14 +67,14 @@ public String awaitImageId(long timeout, TimeUnit timeUnit) { } private String getImageId() { - if (imageId != null) { - return imageId; + if (error != null) { + throw new DockerClientException("Could not build image: " + error); } - if (error == null) { - throw new DockerClientException("Could not build image"); + if (imageId != null) { + return imageId; } - throw new DockerClientException("Could not build image: " + error); + throw new DockerClientException("Could not build image"); } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java index a4dfb5c03..19b3c3843 100644 --- a/docker-java-api/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/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 index 37639a072..161ff2c29 100644 --- 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 @@ -75,6 +75,11 @@ public LoadImageCmd.Exec createLoadImageCmdExec() { return getDockerCmdExecFactory().createLoadImageCmdExec(); } + @Override + public LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec() { + return getDockerCmdExecFactory().createLoadImageAsyncCmdExec(); + } + @Override public SearchImagesCmd.Exec createSearchImagesCmdExec() { return getDockerCmdExecFactory().createSearchImagesCmdExec(); 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 index d49606680..cedf6d40d 100644 --- 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 @@ -27,6 +27,8 @@ public interface DockerCmdExecFactory extends Closeable { LoadImageCmd.Exec createLoadImageCmdExec(); + LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec(); + SearchImagesCmd.Exec createSearchImagesCmdExec(); RemoveImageCmd.Exec createRemoveImageCmdExec(); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index 05492c51f..f06bd4ed9 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -61,7 +61,10 @@ public class InspectContainerResponse extends DockerObject { private String id; @JsonProperty("SizeRootFs") - private Integer sizeRootFs; + private Long sizeRootFs; + + @JsonProperty("SizeRw") + private Long sizeRw; @JsonProperty("Image") private String imageId; @@ -121,10 +124,14 @@ public String getId() { return id; } - public Integer getSizeRootFs() { + public Long getSizeRootFs() { return sizeRootFs; } + public Long getSizeRw() { + return sizeRw; + } + public String getCreated() { return created; } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index 7741df743..cc60a5bcc 100644 --- a/docker-java-api/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/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/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java index 53674cbaa..29c4516cd 100644 --- a/docker-java-api/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/PullImageResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java index a4e9e9f9b..5980ce3df 100644 --- 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 @@ -41,7 +41,7 @@ public void onNext(PullResponseItem item) { handleDockerClientResponse(item); } - LOGGER.debug(item.toString()); + LOGGER.debug("{}", item); } private void checkForDockerSwarmResponse(PullResponseItem item) { diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java index 198e7b8df..603c610b3 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java @@ -18,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/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 index 5dcc59c24..372456813 100644 --- 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 @@ -8,9 +8,8 @@ /** * Restart a running container. * - * @param timeout - * - Timeout in seconds before killing the container. Defaults to 10 seconds. - * + * @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 { @@ -20,13 +19,28 @@ public interface RestartContainerCmd extends SyncDockerCmd { @CheckForNull Integer getTimeout(); + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_42} + */ + @CheckForNull + String getSignal(); + RestartContainerCmd withContainerId(@Nonnull String containerId); - RestartContainerCmd withtTimeout(Integer timeout); + /** + * @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 + * @throws NotFoundException No such container */ @Override Void exec() throws NotFoundException; 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 index 82fbca5f8..d53bcdcdf 100644 --- 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 @@ -1,9 +1,16 @@ 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 @@ -13,22 +20,47 @@ public interface UpdateContainerCmd extends SyncDockerCmd getBlkioWeightDevice(); + + UpdateContainerCmd withBlkioWeightDevice(List blkioWeightDevice); @CheckForNull - Integer getCpuPeriod(); + List getBlkioDeviceReadBps(); - UpdateContainerCmd withCpuPeriod(Integer cpuPeriod); + UpdateContainerCmd withBlkioDeviceReadBps(List blkioDeviceReadBps); @CheckForNull - Integer getCpuQuota(); + List getBlkioDeviceWriteBps(); - UpdateContainerCmd withCpuQuota(Integer cpuQuota); + 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(); @@ -45,6 +77,31 @@ public interface UpdateContainerCmd extends SyncDockerCmd getDevices(); + + UpdateContainerCmd withDevices(List devices); + + @CheckForNull + List getDeviceCgroupRules(); + + UpdateContainerCmd withDeviceCgroupRules(List deviceCgroupRules); + + @CheckForNull + List getDeviceRequests(); + + UpdateContainerCmd withDeviceRequests(List deviceRequests); + @CheckForNull Long getKernelMemory(); @@ -65,6 +122,36 @@ public interface UpdateContainerCmd extends SyncDockerCmd getUlimits(); + + UpdateContainerCmd withUlimits(List ulimits); + + @CheckForNull + RestartPolicy getRestartPolicy(); + + UpdateContainerCmd withRestartPolicy(RestartPolicy restartPolicy); + interface Exec extends DockerCmdSyncExec { } } 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 index 3117cf7e4..7b910cd69 100644 --- 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 @@ -2,9 +2,11 @@ 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; /** @@ -20,8 +22,20 @@ public interface WaitContainerCmd extends AsyncDockerCmd> T exec(T resultCallback); 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 index b4a6d3cc6..6cb160151 100644 --- 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 @@ -27,7 +27,7 @@ public class WaitContainerResultCallback extends ResultCallbackTemplate */ 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/ContainerMount.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ContainerMount.java index b8e53ae3b..a08a6ea3f 100644 --- 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 @@ -106,7 +106,7 @@ public ContainerMount withDriver(String driver) { */ @CheckForNull public String getMode() { - return driver; + return mode; } /** 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 index d80d04316..0a26e54fd 100644 --- 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 @@ -161,6 +161,14 @@ public class ContainerSpec extends DockerObject implements Serializable { @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 */ @@ -435,4 +443,13 @@ public ContainerSpec withConfigs(List configs) { this.configs = configs; return this; } + + public Boolean getInit() { + return init; + } + + public ContainerSpec withInit(Boolean init) { + this.init = init; + return this; + } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java index 24873a74f..0e41b873f 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java @@ -55,6 +55,12 @@ public class HealthCheck extends DockerObject implements Serializable { @JsonProperty("StartPeriod") private Long startPeriod; + /** + * @since 1.44 + */ + @JsonProperty("StartInterval") + private Long startInterval; + public Long getInterval() { return interval; } @@ -63,11 +69,19 @@ public Long getTimeout() { return timeout; } + /** + * Set interval in nanoseconds + * @return this {@link HealthCheck} instance + */ public HealthCheck withInterval(Long interval) { this.interval = interval; return this; } + /** + * Set timeout in nanoseconds + * @return this {@link HealthCheck} instance + */ public HealthCheck withTimeout(Long timeout) { this.timeout = timeout; return this; @@ -95,8 +109,25 @@ public Long getStartPeriod() { return startPeriod; } + /** + * Set startPeriod in nanoseconds + * @return this {@link HealthCheck} instance + */ public HealthCheck withStartPeriod(Long startPeriod) { this.startPeriod = startPeriod; return this; } + + public Long getStartInterval() { + return startInterval; + } + + /** + * Set startInterval in nanoseconds + * @return this {@link HealthCheck} instance + */ + public HealthCheck withStartInterval(Long startInterval) { + this.startInterval = startInterval; + return this; + } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HostConfig.java index 974ac8920..603bc6347 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -73,6 +73,9 @@ public static HostConfig newHostConfig() { @JsonProperty("NanoCpus") private Long nanoCPUs; + @JsonProperty("Annotations") + private Map annotations; + @JsonProperty("CapAdd") private Capability[] capAdd; @@ -292,6 +295,9 @@ public static HostConfig newHostConfig() { @JsonProperty("ConsoleSize") private List consoleSize; + @JsonProperty("CgroupnsMode") + private String cgroupnsMode; + @JsonIgnore public Bind[] getBinds() { return (binds == null) ? new Bind[0] : binds.getBinds(); @@ -301,6 +307,11 @@ public Integer getBlkioWeight() { return blkioWeight; } + @CheckForNull + public Map getAnnotations() { + return annotations; + } + public Capability[] getCapAdd() { return capAdd; } @@ -633,6 +644,11 @@ public HostConfig withBlkioWeightDevice(List blkioWeightDevic return this; } + public HostConfig withAnnotations(Map annotations) { + this.annotations = annotations; + return this; + } + /** * @see #capAdd */ @@ -845,6 +861,7 @@ public HostConfig withMemorySwappiness(Long memorySwappiness) { *
  • '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.
  • * + * Any other value is interpreted as a custom network's name for this container to connect to. */ public HostConfig withNetworkMode(String networkMode) { this.networkMode = networkMode; @@ -1193,6 +1210,16 @@ public HostConfig withUsernsMode(String usernsMode) { return this; } + @CheckForNull + public String getCgroupnsMode() { + return cgroupnsMode; + } + + public HostConfig withCgroupnsMode(String cgroupnsMode) { + this.cgroupnsMode = cgroupnsMode; + return this; + } + @CheckForNull public Map getSysctls() { return sysctls; diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageOptions.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageOptions.java new file mode 100644 index 000000000..bc8b89acb --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageOptions.java @@ -0,0 +1,27 @@ +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_48} + */ +@EqualsAndHashCode +@ToString +public class ImageOptions extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + @JsonProperty("Subpath") + private String subpath; + + public String getSubpath() { + return subpath; + } + + public ImageOptions withSubpath(String subpath) { + this.subpath = subpath; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java index 0752778e3..67348b86b 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java @@ -97,6 +97,12 @@ public class Info extends DockerObject implements Serializable { @JsonProperty("LoggingDriver") private String loggingDriver; + @JsonProperty("CgroupDriver") + private String cGroupDriver; + + @JsonProperty("CgroupVersion") + private String cGroupVersion; + /** * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_20} */ @@ -235,6 +241,9 @@ public class Info extends DockerObject implements Serializable { @JsonProperty("SecurityOptions") private List securityOptions; + @JsonProperty("Runtimes") + private Map runtimes; + /** * @see #architecture */ @@ -483,6 +492,22 @@ public String getLoggingDriver() { return loggingDriver; } + /** + * @see #cGroupDriver + */ + @CheckForNull + public String getCGroupDriver() { + return cGroupDriver; + } + + /** + * @see #cGroupVersion + */ + @CheckForNull + public String getCGroupVersion() { + return cGroupVersion; + } + /** * @see #loggingDriver */ @@ -491,6 +516,22 @@ public Info withLoggingDriver(String loggingDriver) { return this; } + /** + * @see #cGroupDriver + */ + public Info withCGroupDriver(String cGroupDriver) { + this.cGroupDriver = cGroupDriver; + return this; + } + + /** + * @see #cGroupVersion + */ + public Info withCGroupVersion(String cGroupVersion) { + this.cGroupVersion = cGroupVersion; + return this; + } + /** * @see #experimentalBuild */ @@ -1067,7 +1108,33 @@ public Info withIsolation(String isolation) { return this; } + /** + * @see #securityOptions + */ public List getSecurityOptions() { return securityOptions; } + + /** + * @see #securityOptions + */ + public Info withSecurityOptions(List securityOptions) { + this.securityOptions = securityOptions; + return this; + } + + /** + * @see #runtimes + */ + public Map getRuntimes() { + return runtimes; + } + + /** + * @see #runtimes + */ + public Info withRuntimes(Map runtimes) { + this.runtimes = runtimes; + return this; + } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/LoadResponseItem.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/LoadResponseItem.java new file mode 100644 index 000000000..bf90c69bf --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/LoadResponseItem.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +public class LoadResponseItem extends ResponseItem { + + private static final long serialVersionUID = 1L; + + private static final String IMPORT_SUCCESS = "Loaded image:"; + + /** + * Returns whether the stream field indicates a successful build operation + */ + @JsonIgnore + public boolean isBuildSuccessIndicated() { + if (isErrorIndicated() || getStream() == null) { + return false; + } + + return getStream().contains(IMPORT_SUCCESS); + } + + @JsonIgnore + public String getMessage() { + if (!isBuildSuccessIndicated()) { + return null; + } else if (getStream().contains(IMPORT_SUCCESS)) { + return getStream(); + } + + return null; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Mount.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Mount.java index 9bfe9b16e..3f17343c3 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Mount.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Mount.java @@ -57,6 +57,12 @@ public class Mount extends DockerObject implements Serializable { @JsonProperty("TmpfsOptions") private TmpfsOptions tmpfsOptions; + /** + * @since 1.48 + */ + @JsonProperty("ImageOptions") + private ImageOptions imageOptions; + /** * @see #type */ @@ -177,4 +183,23 @@ public Mount withTmpfsOptions(TmpfsOptions tmpfsOptions) { } return this; } + + /** + * @see #imageOptions + */ + @CheckForNull + public ImageOptions getImageOptions() { + return imageOptions; + } + + /** + * @see #imageOptions + */ + public Mount withImageOptions(ImageOptions imageOptions) { + this.imageOptions = imageOptions; + if (imageOptions != null) { + this.type = MountType.IMAGE; + } + return this; + } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/MountType.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/MountType.java index 62557df47..b522c9612 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/MountType.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/MountType.java @@ -14,6 +14,14 @@ public enum MountType { //@since 1.29 @JsonProperty("tmpfs") - TMPFS + TMPFS, + + //@since 1.40 + @JsonProperty("npipe") + NPIPE, + + //@since 1.48 + @JsonProperty("image") + IMAGE, } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Network.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Network.java index f6d989d3f..7e9d3b2fd 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Network.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Network.java @@ -7,6 +7,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Map; @@ -18,6 +19,9 @@ public class Network extends DockerObject implements Serializable { @JsonProperty("Id") private String id; + @JsonProperty("Created") + private Date created; + @JsonProperty("Name") private String name; @@ -52,6 +56,10 @@ public String getId() { return id; } + public Date getCreated() { + return created; + } + public String getName() { return name; } @@ -97,6 +105,12 @@ public Map getLabels() { public static class ContainerNetworkConfig extends DockerObject implements Serializable { private static final long serialVersionUID = 1L; + /** + * @since {@link RemoteApiVersion#VERSION_1_22} + */ + @JsonProperty("Name") + private String name; + @JsonProperty("EndpointID") private String endpointId; @@ -109,6 +123,10 @@ public static class ContainerNetworkConfig extends DockerObject implements Seria @JsonProperty("IPv6Address") private String ipv6Address; + public String getName() { + return name; + } + public String getEndpointId() { return endpointId; } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java index 66a559934..1d3f33c8e 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -19,6 +19,8 @@ public class PullResponseItem extends ResponseItem { private static final String DOWNLOADED_SWARM = ": downloaded"; + private static final String ALREADY_EXISTS = "Already exists"; + /** * Returns whether the status indicates a successful pull operation * @@ -34,7 +36,8 @@ public boolean isPullSuccessIndicated() { getStatus().contains(IMAGE_UP_TO_DATE) || getStatus().contains(DOWNLOADED_NEWER_IMAGE) || getStatus().contains(LEGACY_REGISTRY) || - getStatus().contains(DOWNLOADED_SWARM) + getStatus().contains(DOWNLOADED_SWARM) || + getStatus().contains(ALREADY_EXISTS) ); } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/RuntimeInfo.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/RuntimeInfo.java new file mode 100644 index 000000000..c64511cda --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/RuntimeInfo.java @@ -0,0 +1,23 @@ +package com.github.dockerjava.api.model; + +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; + +@EqualsAndHashCode +@ToString +public class RuntimeInfo extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + + private String path; + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ServiceUpdateState.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ServiceUpdateState.java index e748bbd4a..d22f8999e 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ServiceUpdateState.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ServiceUpdateState.java @@ -6,6 +6,9 @@ * @since {@link RemoteApiVersion#VERSION_1_24} */ public enum ServiceUpdateState { + @JsonProperty("unknown") + UNKNOWN, + @JsonProperty("updating") UPDATING, @@ -15,6 +18,12 @@ public enum ServiceUpdateState { @JsonProperty("completed") COMPLETED, + @JsonProperty("rollback_started") + ROLLBACK_STARTED, + + @JsonProperty("rollback_paused") + ROLLBACK_PAUSED, + @JsonProperty("rollback_completed") ROLLBACK_COMPLETED } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/WaitContainerCondition.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/WaitContainerCondition.java new file mode 100644 index 000000000..8af0efa35 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/WaitContainerCondition.java @@ -0,0 +1,26 @@ +package com.github.dockerjava.api.model; + +import javax.annotation.Nonnull; + +/** + * Docker Engine API wait conditions (added in v1.30). + * + * @since {@link RemoteApiVersion#VERSION_1_30} + */ +public enum WaitContainerCondition { + NOT_RUNNING("not-running"), + NEXT_EXIT("next-exit"), + REMOVED("removed"); + + @Nonnull + private final String value; + + WaitContainerCondition(@Nonnull String value) { + this.value = value; + } + + @Nonnull + public String getValue() { + return value; + } +} diff --git a/docker-java-core/pom.xml b/docker-java-core/pom.xml index ef24fed34..89c72c024 100644 --- a/docker-java-core/pom.xml +++ b/docker-java-core/pom.xml @@ -15,6 +15,10 @@ https://github.com/docker-java/docker-java Java API Client for Docker + + com.github.dockerjava.core + + ${project.groupId} @@ -46,15 +50,15 @@ - commons-lang - commons-lang - ${commons-lang.version} + org.apache.commons + commons-lang3 + ${commons-lang3.version} com.fasterxml.jackson.core jackson-databind - ${jackson.version} + 2.20.1 @@ -65,7 +69,7 @@ org.bouncycastle - bcpkix-jdk15on + bcpkix-jdk18on ${bouncycastle.version} @@ -95,6 +99,7 @@ 8 8 + true diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java b/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java index 3e329911f..e04ab8e3e 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java @@ -1,5 +1,7 @@ package com.github.dockerjava.core; +import java.util.Objects; + import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.AuthCmd; import com.github.dockerjava.api.command.BuildImageCmd; @@ -44,6 +46,7 @@ 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; @@ -101,6 +104,7 @@ import com.github.dockerjava.core.exec.ExecStartCmdExec; import com.github.dockerjava.core.exec.InspectConfigCmdExec; import com.github.dockerjava.core.exec.ListConfigsCmdExec; +import com.github.dockerjava.core.exec.LoadImageAsyncCmdExec; import com.github.dockerjava.core.exec.RemoveConfigCmdExec; import com.github.dockerjava.core.exec.ResizeContainerCmdExec; import com.github.dockerjava.core.exec.ResizeExecCmdExec; @@ -158,8 +162,6 @@ import com.github.dockerjava.core.exec.VersionCmdExec; import com.github.dockerjava.core.exec.WaitContainerCmdExec; -import static com.google.common.base.Preconditions.checkNotNull; - public abstract class AbstractDockerCmdExecFactory implements DockerCmdExecFactory, DockerClientConfigAware { private DockerClientConfig dockerClientConfig; @@ -168,15 +170,14 @@ public abstract class AbstractDockerCmdExecFactory implements DockerCmdExecFacto protected Integer readTimeout; protected DockerClientConfig getDockerClientConfig() { - checkNotNull(dockerClientConfig, + Objects.requireNonNull(dockerClientConfig, "Factor not initialized, dockerClientConfig not set. You probably forgot to call init()!"); return dockerClientConfig; } @Override public void init(DockerClientConfig dockerClientConfig) { - checkNotNull(dockerClientConfig, "config was not specified"); - this.dockerClientConfig = dockerClientConfig; + this.dockerClientConfig = Objects.requireNonNull(dockerClientConfig, "config was not specified"); } @Override @@ -255,6 +256,11 @@ public LoadImageCmd.Exec createLoadImageCmdExec() { return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec() { + return new LoadImageAsyncCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public SearchImagesCmd.Exec createSearchImagesCmdExec() { return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig()); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java index d69de8334..dad75b360 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java @@ -5,12 +5,15 @@ import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.NameParser.HostnameReposName; import com.github.dockerjava.core.NameParser.ReposTag; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.SystemUtils; -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 java.util.Map.Entry; +import java.util.Optional; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -22,11 +25,11 @@ import java.net.URI; import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.Set; -import static com.google.common.base.Preconditions.checkNotNull; -import static org.apache.commons.lang.BooleanUtils.isTrue; +import static org.apache.commons.lang3.BooleanUtils.isTrue; /** * Respects some of the docker CLI options. See https://docs.docker.com/engine/reference/commandline/cli/#environment-variables @@ -37,6 +40,8 @@ public class DefaultDockerClientConfig implements Serializable, DockerClientConf public static final String DOCKER_HOST = "DOCKER_HOST"; + public static final String DOCKER_CONTEXT = "DOCKER_CONTEXT"; + public static final String DOCKER_TLS_VERIFY = "DOCKER_TLS_VERIFY"; public static final String DOCKER_CONFIG = "DOCKER_CONFIG"; @@ -87,11 +92,13 @@ public class DefaultDockerClientConfig implements Serializable, DockerClientConf private final RemoteApiVersion apiVersion; - private DockerConfigFile dockerConfig = null; + private final DockerConfigFile dockerConfig; - DefaultDockerClientConfig(URI dockerHost, String dockerConfigPath, String apiVersion, String registryUrl, - String registryUsername, String registryPassword, String registryEmail, SSLConfig sslConfig) { + DefaultDockerClientConfig(URI dockerHost, DockerConfigFile dockerConfigFile, String dockerConfigPath, String apiVersion, + String registryUrl, String registryUsername, String registryPassword, String registryEmail, + SSLConfig sslConfig) { this.dockerHost = checkDockerHostScheme(dockerHost); + this.dockerConfig = dockerConfigFile; this.dockerConfigPath = dockerConfigPath; this.apiVersion = RemoteApiVersion.parseConfigWithDefault(apiVersion); this.sslConfig = sslConfig; @@ -102,14 +109,10 @@ public class DefaultDockerClientConfig implements Serializable, DockerClientConf } private URI checkDockerHostScheme(URI dockerHost) { - switch (dockerHost.getScheme()) { - case "tcp": - case "unix": - case "npipe": - return dockerHost; - default: - throw new DockerClientException("Unsupported protocol scheme found: '" + dockerHost); + if (dockerHost == null) { + throw new DockerClientException("'dockerHost' is null"); } + return dockerHost; } private static Properties loadIncludedDockerProperties(Properties systemProperties) { @@ -127,9 +130,11 @@ private static Properties loadIncludedDockerProperties(Properties systemProperti } private static void replaceProperties(Properties properties, Properties replacements) { - for (Object objectKey : properties.keySet()) { - String key = objectKey.toString(); - properties.setProperty(key, replaceProperties(properties.getProperty(key), replacements)); + for (Entry entry : properties.entrySet()) { + final String key = entry.getKey().toString(); + // no entry.getValue here because it does not have the same semantics as getProperty (defaults handling) + final String value = properties.getProperty(key); + entry.setValue(replaceProperties(value, replacements)); } } @@ -178,6 +183,13 @@ private static Properties overrideDockerPropertiesWithEnv(Properties properties, } } + if (env.containsKey(DOCKER_CONTEXT)) { + String value = env.get(DOCKER_CONTEXT); + if (value != null && value.trim().length() != 0) { + overriddenProperties.setProperty(DOCKER_CONTEXT, value); + } + } + for (Map.Entry envEntry : env.entrySet()) { String envKey = envEntry.getKey(); if (CONFIG_KEYS.contains(envKey)) { @@ -262,13 +274,6 @@ public String getDockerConfigPath() { @Nonnull public DockerConfigFile getDockerConfig() { - if (dockerConfig == null) { - try { - dockerConfig = DockerConfigFile.loadConfig(getObjectMapper(), getDockerConfigPath()); - } catch (IOException e) { - throw new DockerClientException("Failed to parse docker configuration file", e); - } - } return dockerConfig; } @@ -329,7 +334,7 @@ public static class Builder { private URI dockerHost; private String apiVersion, registryUsername, registryPassword, registryEmail, registryUrl, dockerConfig, - dockerCertPath; + dockerCertPath, dockerContext; private Boolean dockerTlsVerify; @@ -347,6 +352,7 @@ public Builder withProperties(Properties p) { } return withDockerTlsVerify(p.getProperty(DOCKER_TLS_VERIFY)) + .withDockerContext(p.getProperty(DOCKER_CONTEXT)) .withDockerConfig(p.getProperty(DOCKER_CONFIG)) .withDockerCertPath(p.getProperty(DOCKER_CERT_PATH)) .withApiVersion(p.getProperty(API_VERSION)) @@ -360,7 +366,7 @@ public Builder withProperties(Properties p) { * configure DOCKER_HOST */ public final Builder withDockerHost(String dockerHost) { - checkNotNull(dockerHost, "uri was not specified"); + Objects.requireNonNull(dockerHost, "uri was not specified"); this.dockerHost = URI.create(dockerHost); return this; } @@ -405,6 +411,11 @@ public final Builder withDockerConfig(String dockerConfig) { return this; } + public final Builder withDockerContext(String dockerContext) { + this.dockerContext = dockerContext; + return this; + } + public final Builder withDockerTlsVerify(String dockerTlsVerify) { if (dockerTlsVerify != null) { String trimmed = dockerTlsVerify.trim(); @@ -434,7 +445,32 @@ public final Builder withCustomSslConfig(SSLConfig customSslConfig) { return this; } + private void applyContextConfiguration(final String context) { + final Optional dockerContextMetaFile = + Optional.ofNullable(context) + .flatMap(ctx -> DockerContextMetaFile.resolveContextMetaFile(DockerClientConfig.getDefaultObjectMapper(), + new File(this.dockerConfig), ctx)); + final Optional dockerContextTLSFile = + Optional.ofNullable(context) + .flatMap(ctx -> DockerContextMetaFile.resolveContextTLSFile(new File(this.dockerConfig), ctx)); + + if (dockerContextMetaFile.isPresent()) { + final Optional dockerEndpoint = + dockerContextMetaFile.map(metaFile -> metaFile.endpoints).map(endpoint -> endpoint.docker); + if (this.dockerHost == null) { + this.dockerHost = dockerEndpoint.map(endpoint -> endpoint.host).map(URI::create).orElse(null); + } + } + if (dockerContextTLSFile.isPresent() && this.dockerCertPath == null) { + this.dockerCertPath = dockerContextTLSFile.get().getAbsolutePath(); + this.dockerTlsVerify = true; + } + } + public DefaultDockerClientConfig build() { + final DockerConfigFile dockerConfigFile = readDockerConfig(); + final String context = (dockerContext != null) ? dockerContext : dockerConfigFile.getCurrentContext(); + applyContextConfiguration(context); SSLConfig sslConfig = null; @@ -451,14 +487,22 @@ public DefaultDockerClientConfig build() { ? dockerHost : URI.create(SystemUtils.IS_OS_WINDOWS ? WINDOWS_DEFAULT_DOCKER_HOST : DEFAULT_DOCKER_HOST); - return new DefaultDockerClientConfig(dockerHostUri, dockerConfig, apiVersion, registryUrl, registryUsername, + return new DefaultDockerClientConfig(dockerHostUri, dockerConfigFile, dockerConfig, apiVersion, registryUrl, registryUsername, registryPassword, registryEmail, sslConfig); } + private DockerConfigFile readDockerConfig() { + try { + return DockerConfigFile.loadConfig(DockerClientConfig.getDefaultObjectMapper(), dockerConfig); + } catch (IOException e) { + throw new DockerClientException("Failed to parse docker configuration file", e); + } + } + private String checkDockerCertPath(String dockerCertPath) { if (StringUtils.isEmpty(dockerCertPath)) { throw new DockerClientException( - "Enabled TLS verification (DOCKER_TLS_VERIFY=1) but certifate path (DOCKER_CERT_PATH) is not defined."); + "Enabled TLS verification (DOCKER_TLS_VERIFY=1) but certificate path (DOCKER_CERT_PATH) is not defined."); } File certPath = new File(dockerCertPath); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerCmdExecFactory.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerCmdExecFactory.java index 5376997bc..54722e6c7 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerCmdExecFactory.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerCmdExecFactory.java @@ -9,7 +9,7 @@ import com.google.common.collect.SetMultimap; import com.google.common.escape.Escaper; import com.google.common.net.UrlEscapers; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.util.Map; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 277dada80..55f530057 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -44,6 +44,7 @@ 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; @@ -58,6 +59,7 @@ 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; @@ -126,6 +128,7 @@ import com.github.dockerjava.core.command.ListSwarmNodesCmdImpl; import com.github.dockerjava.core.command.ListTasksCmdImpl; import com.github.dockerjava.core.command.ListVolumesCmdImpl; +import com.github.dockerjava.core.command.LoadImageAsyncCmdImpl; import com.github.dockerjava.core.command.LoadImageCmdImpl; import com.github.dockerjava.core.command.LogContainerCmdImpl; import com.github.dockerjava.core.command.LogSwarmObjectImpl; @@ -140,6 +143,7 @@ import com.github.dockerjava.core.command.RemoveNetworkCmdImpl; import com.github.dockerjava.core.command.RemoveSecretCmdImpl; import com.github.dockerjava.core.command.RemoveServiceCmdImpl; +import com.github.dockerjava.core.command.RemoveSwarmNodeCmdImpl; import com.github.dockerjava.core.command.RemoveVolumeCmdImpl; import com.github.dockerjava.core.command.RenameContainerCmdImpl; import com.github.dockerjava.core.command.ResizeContainerCmdImpl; @@ -168,8 +172,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; - -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; /** * @author Konstantin Pelykh (kpelykh@gmail.com) @@ -182,8 +185,7 @@ public class DockerClientImpl implements Closeable, DockerClient { DockerCmdExecFactory dockerCmdExecFactory; DockerClientImpl(DockerClientConfig dockerClientConfig) { - checkNotNull(dockerClientConfig, "config was not specified"); - this.dockerClientConfig = dockerClientConfig; + this.dockerClientConfig = Objects.requireNonNull(dockerClientConfig, "config was not specified"); } /** @@ -244,7 +246,7 @@ public DockerHttpClient getHttpClient() { */ @Deprecated public DockerClientImpl withDockerCmdExecFactory(DockerCmdExecFactory dockerCmdExecFactory) { - checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); + Objects.requireNonNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); this.dockerCmdExecFactory = dockerCmdExecFactory; if (dockerCmdExecFactory instanceof DockerClientConfigAware) { ((DockerClientConfigAware) dockerCmdExecFactory).init(dockerClientConfig); @@ -254,14 +256,14 @@ public DockerClientImpl withDockerCmdExecFactory(DockerCmdExecFactory dockerCmdE @Deprecated private DockerCmdExecFactory getDockerCmdExecFactory() { - checkNotNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); + Objects.requireNonNull(dockerCmdExecFactory, "dockerCmdExecFactory was not specified"); return dockerCmdExecFactory; } @Override public AuthConfig authConfig() { - checkNotNull(dockerClientConfig.getRegistryUsername(), "Configured username is null."); - checkNotNull(dockerClientConfig.getRegistryUrl(), "Configured serverAddress is null."); + Objects.requireNonNull(dockerClientConfig.getRegistryUsername(), "Configured username is null."); + Objects.requireNonNull(dockerClientConfig.getRegistryUrl(), "Configured serverAddress is null."); return new AuthConfig() .withUsername(dockerClientConfig.getRegistryUsername()) @@ -348,6 +350,11 @@ public LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream) { return new LoadImageCmdImpl(getDockerCmdExecFactory().createLoadImageCmdExec(), imageStream); } + @Override + public LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream) { + return new LoadImageAsyncCmdImpl(getDockerCmdExecFactory().createLoadImageAsyncCmdExec(), imageStream); + } + @Override public SearchImagesCmd searchImagesCmd(String term) { return new SearchImagesCmdImpl(getDockerCmdExecFactory().createSearchImagesCmdExec(), term); @@ -616,6 +623,11 @@ public UpdateSwarmNodeCmd updateSwarmNodeCmd() { return new UpdateSwarmNodeCmdImpl(getDockerCmdExecFactory().updateSwarmNodeCmdExec()); } + @Override + public RemoveSwarmNodeCmd removeSwarmNodeCmd(String swarmNodeId) { + return new RemoveSwarmNodeCmdImpl(getDockerCmdExecFactory().removeSwarmNodeCmdExec(), swarmNodeId); + } + @Override public ListSwarmNodesCmd listSwarmNodesCmd() { return new ListSwarmNodesCmdImpl(getDockerCmdExecFactory().listSwarmNodeCmdExec()); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerConfigFile.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerConfigFile.java index fd04a5aa6..39ef15271 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerConfigFile.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerConfigFile.java @@ -1,12 +1,14 @@ package com.github.dockerjava.core; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; +import java.util.Objects; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -27,7 +29,10 @@ public class DockerConfigFile { }; @JsonProperty - private final Map auths; + private Map auths; + + @JsonProperty + private String currentContext; public DockerConfigFile() { this(new HashMap<>()); @@ -42,10 +47,23 @@ public Map getAuths() { return auths; } + @JsonSetter + public void setAuths(Map authConfigMap) { + auths = (authConfigMap == null || authConfigMap.size() == 0) ? new HashMap<>() : authConfigMap; + } + void addAuthConfig(AuthConfig config) { auths.put(config.getRegistryAddress(), config); } + void setCurrentContext(String currentContext) { + this.currentContext = currentContext; + } + + public String getCurrentContext() { + return currentContext; + } + @CheckForNull public AuthConfig resolveAuthConfig(@CheckForNull String hostname) { if (StringUtils.isEmpty(hostname) || AuthConfig.DEFAULT_SERVER_ADDRESS.equals(hostname)) { @@ -104,6 +122,9 @@ public boolean equals(Object obj) { return false; } else if (!auths.equals(other.auths)) return false; + if (!Objects.equals(currentContext, other.currentContext)) { + return false; + } return true; } @@ -111,7 +132,7 @@ public boolean equals(Object obj) { @Override public String toString() { - return "DockerConfigFile [auths=" + auths + "]"; + return "DockerConfigFile [auths=" + auths + ", currentContext='" + currentContext + "']"; } @Nonnull diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerContextMetaFile.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerContextMetaFile.java new file mode 100644 index 000000000..e10db4498 --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerContextMetaFile.java @@ -0,0 +1,71 @@ +package com.github.dockerjava.core; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.hash.HashFunction; +import com.google.common.hash.Hashing; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Optional; + +public class DockerContextMetaFile { + private static HashFunction metaHashFunction = Hashing.sha256(); + + @JsonProperty("Name") + String name; + + @JsonProperty("Endpoints") + Endpoints endpoints; + + + public static class Endpoints { + @JsonProperty("docker") + Docker docker; + + public static class Docker { + @JsonProperty("Host") + String host; + + @JsonProperty("SkipTLSVerify") + boolean skipTLSVerify; + } + } + + + public static Optional resolveContextMetaFile(ObjectMapper objectMapper, File dockerConfigPath, String context) { + final File path = dockerConfigPath.toPath() + .resolve("contexts") + .resolve("meta") + .resolve(metaHashFunction.hashString(context, StandardCharsets.UTF_8).toString()) + .resolve("meta.json") + .toFile(); + return Optional.ofNullable(loadContextMetaFile(objectMapper, path)); + } + + public static Optional resolveContextTLSFile(File dockerConfigPath, String context) { + final File path = dockerConfigPath.toPath() + .resolve("contexts") + .resolve("tls") + .resolve(metaHashFunction.hashString(context, StandardCharsets.UTF_8).toString()) + .resolve("docker") + .toFile(); + return Optional.ofNullable(path).filter(File::exists); + } + + public static DockerContextMetaFile loadContextMetaFile(ObjectMapper objectMapper, File dockerContextMetaFile) { + try { + return parseContextMetaFile(objectMapper, dockerContextMetaFile); + } catch (Exception exception) { + return null; + } + } + + public static DockerContextMetaFile parseContextMetaFile(ObjectMapper objectMapper, File dockerContextMetaFile) throws IOException { + try { + return objectMapper.readValue(dockerContextMetaFile, DockerContextMetaFile.class); + } catch (IOException e) { + throw new IOException("Failed to parse docker context meta file " + dockerContextMetaFile, e); + } + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java b/docker-java-core/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java index 094834cfd..811b60ce5 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/GoLangFileMatch.java @@ -14,7 +14,7 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.util.concurrent.UncheckedExecutionException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.github.dockerjava.core.exception.GoLangFileMatchException; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java b/docker-java-core/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java index 43946a53b..73491bb43 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/KeystoreSSLConfig.java @@ -1,7 +1,5 @@ package com.github.dockerjava.core; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -14,6 +12,7 @@ import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; +import java.util.Objects; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; @@ -37,8 +36,7 @@ public class KeystoreSSLConfig implements SSLConfig, Serializable { */ public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { this.keystorePassword = keystorePassword; - checkNotNull(keystore); - this.keystore = keystore; + this.keystore = Objects.requireNonNull(keystore); } /** @@ -54,8 +52,8 @@ public KeystoreSSLConfig(KeyStore keystore, String keystorePassword) { */ public KeystoreSSLConfig(File pfxFile, String password) throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { - checkNotNull(pfxFile); - checkNotNull(password); + Objects.requireNonNull(pfxFile); + Objects.requireNonNull(password); keystore = KeyStore.getInstance("pkcs12"); try (FileInputStream fs = new FileInputStream(pfxFile)) { keystore.load(fs, password.toCharArray()); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/docker-java-core/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index 6e39f4f94..0f50f561d 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -1,7 +1,5 @@ package com.github.dockerjava.core; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.File; import java.io.Serializable; import java.nio.file.Files; @@ -9,6 +7,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.security.Security; +import java.util.Objects; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; @@ -29,8 +28,7 @@ public class LocalDirectorySSLConfig implements SSLConfig, Serializable { private final String dockerCertPath; public LocalDirectorySSLConfig(String dockerCertPath) { - checkNotNull(dockerCertPath); - this.dockerCertPath = dockerCertPath; + this.dockerCertPath = Objects.requireNonNull(dockerCertPath); } public String getDockerCertPath() { @@ -66,7 +64,8 @@ public SSLContext getSSLContext() { TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(tmfAlgorithm); trustManagerFactory.init(CertificateUtils.createTrustStore(capem)); - SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); + SSLContext sslContext = SSLContext.getInstance(AccessController.doPrivileged(getSystemProperty("ssl.protocol", + "TLSv1.2"))); sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); return sslContext; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java b/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java index ffadb6656..f06adb6d8 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java @@ -5,10 +5,10 @@ import java.util.regex.Pattern; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.ToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.core.exception.InvalidRepositoryNameException; @@ -22,6 +22,7 @@ private NameParser() { private static final int RepositoryNameTotalLengthMax = 255; private static final String SHA256_SEPARATOR = "@sha256:"; + private static final String COLON_SEPARATOR = ":"; private static final Pattern RepositoryNameComponentRegexp = Pattern.compile("[a-z0-9]+(?:[._-][a-z0-9]+)*"); @@ -106,6 +107,13 @@ public static HostnameReposName resolveRepositoryName(String reposName) { String[] nameParts = reposName.split("/", 2); if (nameParts.length == 1 || (!nameParts[0].contains(".") && !nameParts[0].contains(":") && !nameParts[0].equals("localhost"))) { + if (StringUtils.containsIgnoreCase(reposName, SHA256_SEPARATOR)) { + reposName = StringUtils.substringBeforeLast(reposName, SHA256_SEPARATOR); + } + + if (StringUtils.contains(reposName, COLON_SEPARATOR)) { + reposName = StringUtils.substringBeforeLast(reposName, COLON_SEPARATOR); + } return new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, reposName); } @@ -119,6 +127,10 @@ public static HostnameReposName resolveRepositoryName(String reposName) { reposName = StringUtils.substringBeforeLast(reposName, SHA256_SEPARATOR); } + if (StringUtils.contains(reposName, COLON_SEPARATOR)) { + reposName = StringUtils.substringBeforeLast(reposName, COLON_SEPARATOR); + } + validateRepoName(reposName); return new HostnameReposName(hostname, reposName); } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index a38930cb3..373a67332 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -91,6 +91,10 @@ public class RemoteApiVersion implements Serializable { public static final RemoteApiVersion VERSION_1_37 = RemoteApiVersion.create(1, 37); public static final RemoteApiVersion VERSION_1_38 = RemoteApiVersion.create(1, 38); public static final RemoteApiVersion VERSION_1_40 = RemoteApiVersion.create(1, 40); + public static final RemoteApiVersion VERSION_1_41 = RemoteApiVersion.create(1, 41); + public static final RemoteApiVersion VERSION_1_42 = RemoteApiVersion.create(1, 42); + public static final RemoteApiVersion VERSION_1_43 = RemoteApiVersion.create(1, 43); + public static final RemoteApiVersion VERSION_1_44 = RemoteApiVersion.create(1, 44); /** diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java index b576d7a05..9f83c0b4f 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrAsyncDockerCmd.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.command.AsyncDockerCmd; @@ -12,8 +12,7 @@ public abstract class AbstrAsyncDockerCmd execution; public AbstrAsyncDockerCmd(DockerCmdAsyncExec execution) { - checkNotNull(execution, "execution was not specified"); - this.execution = execution; + this.execution = Objects.requireNonNull(execution, "execution was not specified"); } @Override diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java index 10e6b5212..17ff9a88e 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AbstrDockerCmd.java @@ -1,12 +1,11 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.IOException; import java.util.Base64; +import java.util.Objects; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,8 +23,7 @@ public abstract class AbstrDockerCmd, RES_T> impl protected transient DockerCmdSyncExec execution; public AbstrDockerCmd(DockerCmdSyncExec execution) { - checkNotNull(execution, "execution was not specified"); - this.execution = execution; + this.execution = Objects.requireNonNull(execution, "execution was not specified"); } @Override diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java index 6c5103b27..30a411dba 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/AttachContainerCmdImpl.java @@ -1,8 +1,7 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.InputStream; +import java.util.Objects; import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.model.Frame; @@ -61,7 +60,7 @@ public InputStream getStdin() { @Override public AttachContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); + Objects.requireNonNull(containerId, "containerId was not specified"); this.containerId = containerId; return this; } @@ -92,8 +91,7 @@ public AttachContainerCmd withStdErr(Boolean stderr) { @Override public AttachContainerCmd withStdIn(InputStream stdin) { - checkNotNull(stdin, "stdin was not specified"); - this.stdin = stdin; + this.stdin = Objects.requireNonNull(stdin, "stdin was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index 1bd1af576..5d9e62909 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -13,10 +13,9 @@ import java.net.URI; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Set; -import static com.google.common.base.Preconditions.checkNotNull; - /** * Build an image from Dockerfile. */ @@ -79,7 +78,7 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec) { public BuildImageCmdImpl(BuildImageCmd.Exec exec, File dockerFileOrFolder) { super(exec); - checkNotNull(dockerFileOrFolder, "dockerFolder is null"); + Objects.requireNonNull(dockerFileOrFolder, "dockerFolder is null"); if (dockerFileOrFolder.isDirectory()) { withBaseDirectory(dockerFileOrFolder); @@ -91,7 +90,7 @@ public BuildImageCmdImpl(BuildImageCmd.Exec exec, File dockerFileOrFolder) { public BuildImageCmdImpl(BuildImageCmd.Exec exec, InputStream tarInputStream) { super(exec); - checkNotNull(tarInputStream, "tarInputStream is null"); + Objects.requireNonNull(tarInputStream, "tarInputStream is null"); withTarInputStream(tarInputStream); } @@ -232,8 +231,7 @@ public Set getExtraHosts() { @Deprecated @Override public BuildImageCmdImpl withTag(String tag) { - checkNotNull(tag, "Tag is null"); - this.tag = tag; + this.tag = Objects.requireNonNull(tag, "Tag is null"); return this; } @@ -328,7 +326,7 @@ public BuildImageCmd withBaseDirectory(File baseDirectory) { @Override public BuildImageCmdImpl withDockerfile(File dockerfile) { - checkNotNull(dockerfile); + Objects.requireNonNull(dockerfile); if (!dockerfile.exists()) { throw new IllegalArgumentException("Dockerfile does not exist"); } @@ -353,22 +351,19 @@ public BuildImageCmdImpl withDockerfile(File dockerfile) { @Override public BuildImageCmd withDockerfilePath(String dockerfilePath) { - checkNotNull(dockerfilePath, "dockerfilePath is null"); - this.dockerFilePath = dockerfilePath; + this.dockerFilePath = Objects.requireNonNull(dockerfilePath, "dockerfilePath is null"); return this; } @Override public BuildImageCmdImpl withTarInputStream(InputStream tarInputStream) { - checkNotNull(tarInputStream, "tarInputStream is null"); - this.tarInputStream = tarInputStream; + this.tarInputStream = Objects.requireNonNull(tarInputStream, "tarInputStream is null"); return this; } @Override public BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfigs) { - checkNotNull(authConfigs, "authConfig is null"); - this.buildAuthConfigs = authConfigs; + this.buildAuthConfigs = Objects.requireNonNull(authConfigs, "authConfig is null"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java index 1c8ad26a4..8458c7f7e 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CommitCmdImpl.java @@ -1,8 +1,7 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.util.Map; +import java.util.Objects; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.command.CommitCmd; @@ -90,8 +89,7 @@ public String getContainerId() { @Override public CommitCmdImpl withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } @@ -140,8 +138,7 @@ public CommitCmdImpl withAttachStdout(Boolean attachStdout) { @Override public CommitCmdImpl withCmd(String... cmd) { - checkNotNull(cmd, "cmd was not specified"); - this.cmd = cmd; + this.cmd = Objects.requireNonNull(cmd, "cmd was not specified"); return this; } @@ -153,29 +150,25 @@ public CommitCmdImpl withDisableNetwork(Boolean disableNetwork) { @Override public CommitCmdImpl withAuthor(String author) { - checkNotNull(author, "author was not specified"); - this.author = author; + this.author = Objects.requireNonNull(author, "author was not specified"); return this; } @Override public CommitCmdImpl withMessage(String message) { - checkNotNull(message, "message was not specified"); - this.message = message; + this.message = Objects.requireNonNull(message, "message was not specified"); return this; } @Override public CommitCmdImpl withTag(String tag) { - checkNotNull(tag, "tag was not specified"); - this.tag = tag; + this.tag = Objects.requireNonNull(tag, "tag was not specified"); return this; } @Override public CommitCmdImpl withRepository(String repository) { - checkNotNull(repository, "repository was not specified"); - this.repository = repository; + this.repository = Objects.requireNonNull(repository, "repository was not specified"); return this; } @@ -192,8 +185,7 @@ public String[] getEnv() { @Override public CommitCmdImpl withEnv(String... env) { - checkNotNull(env, "env was not specified"); - this.env = env; + this.env = Objects.requireNonNull(env, "env was not specified"); return this; } @@ -215,8 +207,7 @@ public ExposedPorts getExposedPorts() { @Override public CommitCmdImpl withExposedPorts(ExposedPorts exposedPorts) { - checkNotNull(exposedPorts, "exposedPorts was not specified"); - this.exposedPorts = exposedPorts; + this.exposedPorts = Objects.requireNonNull(exposedPorts, "exposedPorts was not specified"); return this; } @@ -227,8 +218,7 @@ public String getHostname() { @Override public CommitCmdImpl withHostname(String hostname) { - checkNotNull(hostname, "hostname was not specified"); - this.hostname = hostname; + this.hostname = Objects.requireNonNull(hostname, "hostname was not specified"); return this; } @@ -239,8 +229,7 @@ public Integer getMemory() { @Override public CommitCmdImpl withMemory(Integer memory) { - checkNotNull(memory, "memory was not specified"); - this.memory = memory; + this.memory = Objects.requireNonNull(memory, "memory was not specified"); return this; } @@ -251,8 +240,7 @@ public Integer getMemorySwap() { @Override public CommitCmdImpl withMemorySwap(Integer memorySwap) { - checkNotNull(memorySwap, "memorySwap was not specified"); - this.memorySwap = memorySwap; + this.memorySwap = Objects.requireNonNull(memorySwap, "memorySwap was not specified"); return this; } @@ -263,8 +251,7 @@ public Boolean isOpenStdin() { @Override public CommitCmdImpl withOpenStdin(Boolean openStdin) { - checkNotNull(openStdin, "openStdin was not specified"); - this.openStdin = openStdin; + this.openStdin = Objects.requireNonNull(openStdin, "openStdin was not specified"); return this; } @@ -275,8 +262,7 @@ public String[] getPortSpecs() { @Override public CommitCmdImpl withPortSpecs(String... portSpecs) { - checkNotNull(portSpecs, "portSpecs was not specified"); - this.portSpecs = portSpecs; + this.portSpecs = Objects.requireNonNull(portSpecs, "portSpecs was not specified"); return this; } @@ -309,8 +295,7 @@ public String getUser() { @Override public CommitCmdImpl withUser(String user) { - checkNotNull(user, "user was not specified"); - this.user = user; + this.user = Objects.requireNonNull(user, "user was not specified"); return this; } @@ -321,8 +306,7 @@ public Volumes getVolumes() { @Override public CommitCmdImpl withVolumes(Volumes volumes) { - checkNotNull(volumes, "volumes was not specified"); - this.volumes = volumes; + this.volumes = Objects.requireNonNull(volumes, "volumes was not specified"); return this; } @@ -333,8 +317,7 @@ public String getWorkingDir() { @Override public CommitCmdImpl withWorkingDir(String workingDir) { - checkNotNull(workingDir, "workingDir was not specified"); - this.workingDir = workingDir; + this.workingDir = Objects.requireNonNull(workingDir, "workingDir was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java index eb6baa5ab..14fc683ce 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ContainerDiffCmdImpl.java @@ -1,8 +1,7 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.util.List; +import java.util.Objects; import com.github.dockerjava.api.command.ContainerDiffCmd; import com.github.dockerjava.api.exception.DockerException; @@ -33,8 +32,7 @@ public String getContainerId() { @Override public ContainerDiffCmdImpl withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImpl.java index 8ca305616..e827b37c8 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CopyArchiveFromContainerCmdImpl.java @@ -1,8 +1,7 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.InputStream; +import java.util.Objects; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; @@ -37,15 +36,13 @@ public String getResource() { @Override public CopyArchiveFromContainerCmdImpl withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } @Override public CopyArchiveFromContainerCmdImpl withResource(String resource) { - checkNotNull(resource, "resource was not specified"); - this.resource = resource; + this.resource = Objects.requireNonNull(resource, "resource was not specified"); return this; } @@ -56,8 +53,7 @@ public String getHostPath() { @Override public CopyArchiveFromContainerCmdImpl withHostPath(String hostPath) { - checkNotNull(hostPath, "hostPath was not specified"); - this.hostPath = hostPath; + this.hostPath = Objects.requireNonNull(hostPath, "hostPath was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImpl.java index 2eb5f5835..a9b42e921 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImpl.java @@ -1,15 +1,14 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Objects; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.api.exception.DockerClientException; @@ -31,6 +30,8 @@ public class CopyArchiveToContainerCmdImpl extends AbstrDockerCmd labels) { - checkNotNull(labels, "labels was not specified"); - this.labels = labels; + this.labels = Objects.requireNonNull(labels, "labels was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index 040e716e1..9b7f8a8fe 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; @@ -14,22 +14,29 @@ import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.Volumes; -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.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import javax.annotation.CheckForNull; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Objects; -import static com.google.common.base.Preconditions.checkNotNull; import static java.util.Collections.singletonMap; /** * Creates a new container. * `/containers/create` */ +@JsonAutoDetect( + fieldVisibility = JsonAutoDetect.Visibility.NONE, + setterVisibility = JsonAutoDetect.Visibility.NONE, + getterVisibility = JsonAutoDetect.Visibility.NONE, + isGetterVisibility = JsonAutoDetect.Visibility.NONE, + creatorVisibility = JsonAutoDetect.Visibility.NONE +) public class CreateContainerCmdImpl extends AbstrDockerCmd implements CreateContainerCmd { @@ -122,13 +129,10 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd aliases = null; private AuthConfig authConfig; @@ -151,7 +155,6 @@ public CreateContainerCmd withAuthConfig(AuthConfig authConfig) { } @Override - @JsonIgnore public List getAliases() { return aliases; } @@ -164,7 +167,7 @@ public CreateContainerCmd withAliases(String... aliases) { @Override public CreateContainerCmd withAliases(List aliases) { - checkNotNull(aliases, "aliases was not specified"); + Objects.requireNonNull(aliases, "aliases was not specified"); this.aliases = aliases; return this; } @@ -177,14 +180,14 @@ public String[] getCmd() { @Override public CreateContainerCmd withCmd(String... cmd) { - checkNotNull(cmd, "cmd was not specified"); + Objects.requireNonNull(cmd, "cmd was not specified"); this.cmd = cmd; return this; } @Override public CreateContainerCmd withCmd(List cmd) { - checkNotNull(cmd, "cmd was not specified"); + Objects.requireNonNull(cmd, "cmd was not specified"); return withCmd(cmd.toArray(new String[0])); } @@ -214,7 +217,7 @@ public String getDomainName() { @Override public CreateContainerCmd withDomainName(String domainName) { - checkNotNull(domainName, "no domainName was specified"); + Objects.requireNonNull(domainName, "no domainName was specified"); this.domainName = domainName; return this; } @@ -226,14 +229,14 @@ public String[] getEntrypoint() { @Override public CreateContainerCmd withEntrypoint(String... entrypoint) { - checkNotNull(entrypoint, "entrypoint was not specified"); + Objects.requireNonNull(entrypoint, "entrypoint was not specified"); this.entrypoint = entrypoint; return this; } @Override public CreateContainerCmd withEntrypoint(List entrypoint) { - checkNotNull(entrypoint, "entrypoint was not specified"); + Objects.requireNonNull(entrypoint, "entrypoint was not specified"); return withEntrypoint(entrypoint.toArray(new String[0])); } @@ -244,40 +247,38 @@ public String[] getEnv() { @Override public CreateContainerCmd withEnv(String... env) { - checkNotNull(env, "env was not specified"); + Objects.requireNonNull(env, "env was not specified"); this.env = env; return this; } @Override public CreateContainerCmd withEnv(List env) { - checkNotNull(env, "env was not specified"); + Objects.requireNonNull(env, "env was not specified"); return withEnv(env.toArray(new String[0])); } @Override - @JsonIgnore public ExposedPort[] getExposedPorts() { return exposedPorts.getExposedPorts(); } @Override public CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts) { - checkNotNull(exposedPorts, "exposedPorts was not specified"); + Objects.requireNonNull(exposedPorts, "exposedPorts was not specified"); this.exposedPorts = new ExposedPorts(exposedPorts); return this; } @Override public CreateContainerCmd withExposedPorts(List exposedPorts) { - checkNotNull(exposedPorts, "exposedPorts was not specified"); + Objects.requireNonNull(exposedPorts, "exposedPorts was not specified"); return withExposedPorts(exposedPorts.toArray(new ExposedPort[0])); } /** * @see #stopSignal */ - @JsonIgnore @Override public String getStopSignal() { return stopSignal; @@ -285,7 +286,7 @@ public String getStopSignal() { @Override public CreateContainerCmd withStopSignal(String stopSignal) { - checkNotNull(stopSignal, "stopSignal wasn't specified."); + Objects.requireNonNull(stopSignal, "stopSignal wasn't specified."); this.stopSignal = stopSignal; return this; } @@ -308,7 +309,7 @@ public String getHostName() { @Override public CreateContainerCmd withHostName(String hostName) { - checkNotNull(hostName, "no hostName was specified"); + Objects.requireNonNull(hostName, "no hostName was specified"); this.hostName = hostName; return this; } @@ -320,20 +321,19 @@ public String getImage() { @Override public CreateContainerCmd withImage(String image) { - checkNotNull(image, "no image was specified"); + Objects.requireNonNull(image, "no image was specified"); this.image = image; return this; } @Override - @JsonIgnore public Map getLabels() { return labels; } @Override public CreateContainerCmd withLabels(Map labels) { - checkNotNull(labels, "labels was not specified"); + Objects.requireNonNull(labels, "labels was not specified"); this.labels = labels; return this; } @@ -345,7 +345,7 @@ public String getMacAddress() { @Override public CreateContainerCmd withMacAddress(String macAddress) { - checkNotNull(macAddress, "macAddress was not specified"); + Objects.requireNonNull(macAddress, "macAddress was not specified"); this.macAddress = macAddress; return this; } @@ -358,7 +358,7 @@ public String getName() { @Override public CreateContainerCmd withName(String name) { - checkNotNull(name, "name was not specified"); + Objects.requireNonNull(name, "name was not specified"); this.name = name; return this; } @@ -370,14 +370,14 @@ public String[] getPortSpecs() { @Override public CreateContainerCmd withPortSpecs(String... portSpecs) { - checkNotNull(portSpecs, "portSpecs was not specified"); + Objects.requireNonNull(portSpecs, "portSpecs was not specified"); this.portSpecs = portSpecs; return this; } @Override public CreateContainerCmd withPortSpecs(List portSpecs) { - checkNotNull(portSpecs, "portSpecs was not specified"); + Objects.requireNonNull(portSpecs, "portSpecs was not specified"); return withPortSpecs(portSpecs.toArray(new String[0])); } @@ -388,7 +388,7 @@ public String getUser() { @Override public CreateContainerCmd withUser(String user) { - checkNotNull(user, "user was not specified"); + Objects.requireNonNull(user, "user was not specified"); this.user = user; return this; } @@ -400,7 +400,7 @@ public Boolean isAttachStderr() { @Override public CreateContainerCmd withAttachStderr(Boolean attachStderr) { - checkNotNull(attachStderr, "attachStderr was not specified"); + Objects.requireNonNull(attachStderr, "attachStderr was not specified"); this.attachStderr = attachStderr; return this; } @@ -412,7 +412,7 @@ public Boolean isAttachStdin() { @Override public CreateContainerCmd withAttachStdin(Boolean attachStdin) { - checkNotNull(attachStdin, "attachStdin was not specified"); + Objects.requireNonNull(attachStdin, "attachStdin was not specified"); this.attachStdin = attachStdin; return this; } @@ -424,27 +424,26 @@ public Boolean isAttachStdout() { @Override public CreateContainerCmd withAttachStdout(Boolean attachStdout) { - checkNotNull(attachStdout, "attachStdout was not specified"); + Objects.requireNonNull(attachStdout, "attachStdout was not specified"); this.attachStdout = attachStdout; return this; } @Override - @JsonIgnore public Volume[] getVolumes() { return volumes.getVolumes(); } @Override public CreateContainerCmd withVolumes(Volume... volumes) { - checkNotNull(volumes, "volumes was not specified"); + Objects.requireNonNull(volumes, "volumes was not specified"); this.volumes = new Volumes(volumes); return this; } @Override public CreateContainerCmd withVolumes(List volumes) { - checkNotNull(volumes, "volumes was not specified"); + Objects.requireNonNull(volumes, "volumes was not specified"); return withVolumes(volumes.toArray(new Volume[0])); } @@ -455,7 +454,7 @@ public String getWorkingDir() { @Override public CreateContainerCmd withWorkingDir(String workingDir) { - checkNotNull(workingDir, "workingDir was not specified"); + Objects.requireNonNull(workingDir, "workingDir was not specified"); this.workingDir = workingDir; return this; } @@ -467,7 +466,7 @@ public Boolean isNetworkDisabled() { @Override public CreateContainerCmd withNetworkDisabled(Boolean disableNetwork) { - checkNotNull(disableNetwork, "disableNetwork was not specified"); + Objects.requireNonNull(disableNetwork, "disableNetwork was not specified"); this.networkDisabled = disableNetwork; return this; } @@ -480,7 +479,7 @@ public Boolean isStdInOnce() { @Override public CreateContainerCmd withStdInOnce(Boolean stdInOnce) { - checkNotNull(stdInOnce, "no stdInOnce was specified"); + Objects.requireNonNull(stdInOnce, "no stdInOnce was specified"); this.stdInOnce = stdInOnce; return this; } @@ -492,7 +491,7 @@ public Boolean isStdinOpen() { @Override public CreateContainerCmd withStdinOpen(Boolean stdinOpen) { - checkNotNull(stdinOpen, "no stdinOpen was specified"); + Objects.requireNonNull(stdinOpen, "no stdinOpen was specified"); this.stdinOpen = stdinOpen; return this; } @@ -505,7 +504,7 @@ public Boolean isTty() { @Override public CreateContainerCmd withTty(Boolean tty) { - checkNotNull(tty, "no tty was specified"); + Objects.requireNonNull(tty, "no tty was specified"); this.tty = tty; return this; } @@ -528,7 +527,7 @@ public String getIpv4Address() { @Override public CreateContainerCmd withIpv4Address(String ipv4Address) { - checkNotNull(ipv4Address, "no ipv4Address was specified"); + Objects.requireNonNull(ipv4Address, "no ipv4Address was specified"); this.ipv4Address = ipv4Address; return this; } @@ -540,7 +539,7 @@ public String getIpv6Address() { @Override public CreateContainerCmd withIpv6Address(String ipv6Address) { - checkNotNull(ipv6Address, "no ipv6Address was specified"); + Objects.requireNonNull(ipv6Address, "no ipv6Address was specified"); this.ipv6Address = ipv6Address; return this; } @@ -601,7 +600,7 @@ public CreateContainerResponse exec() throws NotFoundException, ConflictExceptio containerNetwork.withAliases(aliases); } - if (containerNetwork != null) { + if (containerNetwork != null && hostConfig.getNetworkMode() != null) { networkingConfig = new NetworkingConfig() .withEndpointsConfig(singletonMap(hostConfig.getNetworkMode(), containerNetwork)); } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java index 9ecf84430..cab9607d0 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateImageCmdImpl.java @@ -1,8 +1,7 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.InputStream; +import java.util.Objects; import com.github.dockerjava.api.command.CreateImageCmd; import com.github.dockerjava.api.command.CreateImageResponse; @@ -54,7 +53,7 @@ public InputStream getImageStream() { */ @Override public CreateImageCmdImpl withRepository(String repository) { - checkNotNull(repository, "repository was not specified"); + Objects.requireNonNull(repository, "repository was not specified"); this.repository = repository; return this; } @@ -65,7 +64,7 @@ public CreateImageCmdImpl withRepository(String repository) { */ @Override public CreateImageCmdImpl withImageStream(InputStream imageStream) { - checkNotNull(imageStream, "imageStream was not specified"); + Objects.requireNonNull(imageStream, "imageStream was not specified"); this.imageStream = imageStream; return this; } @@ -76,7 +75,7 @@ public CreateImageCmdImpl withImageStream(InputStream imageStream) { */ @Override public CreateImageCmdImpl withTag(String tag) { - checkNotNull(tag, "tag was not specified"); + Objects.requireNonNull(tag, "tag was not specified"); this.tag = tag; return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java index e6cff4c09..db2766796 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateNetworkCmdImpl.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Objects; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.command.CreateNetworkCmd; @@ -10,8 +11,6 @@ import com.github.dockerjava.api.model.Network; import com.github.dockerjava.api.model.Network.Ipam; -import static com.google.common.base.Preconditions.checkNotNull; - public class CreateNetworkCmdImpl extends AbstrDockerCmd implements CreateNetworkCmd { @@ -147,7 +146,7 @@ public Map getLabels() { */ @Override public CreateNetworkCmd withLabels(Map labels) { - checkNotNull(labels, "labels was not specified"); + Objects.requireNonNull(labels, "labels was not specified"); this.labels = labels; return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateSecretCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateSecretCmdImpl.java index d86b04855..19891325a 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateSecretCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateSecretCmdImpl.java @@ -4,7 +4,7 @@ import com.github.dockerjava.api.command.CreateSecretResponse; import com.github.dockerjava.api.model.SecretSpec; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; /** * Creates a new secret @@ -16,7 +16,7 @@ public class CreateSecretCmdImpl extends AbstrDockerCmd getDriverOpts() { @Override public CreateVolumeCmdImpl withName(String name) { - checkNotNull(name, "name was not specified"); + Objects.requireNonNull(name, "name was not specified"); this.name = name; return this; } @Override public CreateVolumeCmdImpl withLabels(Map labels) { - checkNotNull(labels, "labels was not specified"); + Objects.requireNonNull(labels, "labels was not specified"); this.labels = labels; return this; } @Override public CreateVolumeCmdImpl withDriver(String driver) { - checkNotNull(driver, "driver was not specified"); + Objects.requireNonNull(driver, "driver was not specified"); this.driver = driver; return this; } @Override public CreateVolumeCmd withDriverOpts(Map driverOpts) { - checkNotNull(driverOpts, "driverOpts was not specified"); + Objects.requireNonNull(driverOpts, "driverOpts was not specified"); this.driverOpts = driverOpts; return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java index d6cca6899..f578b3a19 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java @@ -1,9 +1,8 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.util.List; import java.util.Map; +import java.util.Objects; import com.github.dockerjava.api.command.EventsCmd; import com.github.dockerjava.api.model.Event; @@ -38,42 +37,42 @@ public EventsCmd withUntil(String until) { @Override public EventsCmd withContainerFilter(String... container) { - checkNotNull(container, "container have not been specified"); + Objects.requireNonNull(container, "container have not been specified"); this.filters.withContainers(container); return this; } @Override public EventsCmd withImageFilter(String... image) { - checkNotNull(image, "image have not been specified"); + Objects.requireNonNull(image, "image have not been specified"); this.filters.withImages(image); return this; } @Override public EventsCmd withEventFilter(String... event) { - checkNotNull(event, "event have not been specified"); + Objects.requireNonNull(event, "event have not been specified"); this.filters.withFilter("event", event); return this; } @Override public EventsCmd withEventTypeFilter(String... eventTypes) { - checkNotNull(eventTypes, "event types have not been specified"); + Objects.requireNonNull(eventTypes, "event types have not been specified"); this.filters.withEventTypes(eventTypes); return this; } @Override public EventsCmd withLabelFilter(String... label) { - checkNotNull(label, "label have not been specified"); + Objects.requireNonNull(label, "label have not been specified"); this.filters.withLabels(label); return this; } @Override public EventsCmd withLabelFilter(Map labels) { - checkNotNull(labels, "labels have not been specified"); + Objects.requireNonNull(labels, "labels have not been specified"); this.filters.withLabels(labels); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java index dc410f78b..8ea6e275f 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -1,8 +1,7 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.util.List; +import java.util.Objects; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.command.ExecCreateCmd; @@ -59,8 +58,7 @@ public ExecCreateCmdImpl(ExecCreateCmd.Exec exec, String containerId) { @Override public ExecCreateCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java index 9ab3bfb8e..d5990ef80 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -1,8 +1,7 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.InputStream; +import java.util.Objects; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; @@ -37,8 +36,7 @@ public String getExecId() { @Override public ExecStartCmd withExecId(String execId) { - checkNotNull(execId, "execId was not specified"); - this.execId = execId; + this.execId = Objects.requireNonNull(execId, "execId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InitializeSwarmCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InitializeSwarmCmdImpl.java index 6f81f1bf0..f13f307ad 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InitializeSwarmCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InitializeSwarmCmdImpl.java @@ -4,9 +4,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.command.InitializeSwarmCmd; import com.github.dockerjava.api.model.SwarmSpec; -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.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import javax.annotation.CheckForNull; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectConfigCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectConfigCmdImpl.java index 0fdef4a71..eff4170cb 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectConfigCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectConfigCmdImpl.java @@ -1,11 +1,11 @@ package com.github.dockerjava.core.command; +import java.util.Objects; + import com.github.dockerjava.api.command.InspectConfigCmd; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Config; -import static com.google.common.base.Preconditions.checkNotNull; - /** * Inspect the details of a config. */ @@ -25,8 +25,7 @@ public String getConfigId() { @Override public InspectConfigCmd withConfigId(String configId) { - checkNotNull(configId, "configId was not specified"); - this.configId = configId; + this.configId = Objects.requireNonNull(configId, "configId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java index ed3c01b00..ab8c2989a 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; @@ -27,8 +27,7 @@ public String getContainerId() { @Override public InspectContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java index 22d6d70f4..36ad73e28 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectExecCmdImpl.java @@ -1,9 +1,10 @@ package com.github.dockerjava.core.command; +import java.util.Objects; + import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectExecResponse; import com.github.dockerjava.api.exception.NotFoundException; -import com.google.common.base.Preconditions; public class InspectExecCmdImpl extends AbstrDockerCmd implements InspectExecCmd { private String execId; @@ -20,8 +21,7 @@ public String getExecId() { @Override public InspectExecCmd withExecId(String execId) { - Preconditions.checkNotNull(execId, "execId was not specified"); - this.execId = execId; + this.execId = Objects.requireNonNull(execId, "execId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java index 48dd30757..5ffa7c5d7 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.InspectImageCmd; import com.github.dockerjava.api.command.InspectImageResponse; @@ -26,8 +26,7 @@ public String getImageId() { @Override public InspectImageCmd withImageId(String imageId) { - checkNotNull(imageId, "imageId was not specified"); - this.imageId = imageId; + this.imageId = Objects.requireNonNull(imageId, "imageId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectServiceCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectServiceCmdImpl.java index 5b7dcd895..804710ce1 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectServiceCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectServiceCmdImpl.java @@ -1,11 +1,11 @@ package com.github.dockerjava.core.command; +import java.util.Objects; + import com.github.dockerjava.api.command.InspectServiceCmd; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Service; -import static com.google.common.base.Preconditions.checkNotNull; - /** * Inspect the details of a container. */ @@ -26,8 +26,7 @@ public String getServiceId() { @Override public InspectServiceCmd withServiceId(String serviceId) { - checkNotNull(serviceId, "serviceId was not specified"); - this.serviceId = serviceId; + this.serviceId = Objects.requireNonNull(serviceId, "serviceId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectSwarmNodeCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectSwarmNodeCmdImpl.java index bf5e5164f..9289878d1 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectSwarmNodeCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectSwarmNodeCmdImpl.java @@ -6,7 +6,7 @@ import javax.annotation.CheckForNull; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; /** * Inspect the details of a swarmNode. @@ -29,8 +29,7 @@ public String getSwarmNodeId() { @Override public InspectSwarmNodeCmd withSwarmNodeId(String swarmNodeId) { - checkNotNull(swarmNodeId, "swarmNodeId was not specified"); - this.swarmNodeId = swarmNodeId; + this.swarmNodeId = Objects.requireNonNull(swarmNodeId, "swarmNodeId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java index c789d91c9..5b76310db 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/InspectVolumeCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.InspectVolumeCmd; import com.github.dockerjava.api.command.InspectVolumeResponse; @@ -26,8 +26,7 @@ public String getName() { @Override public InspectVolumeCmd withName(String name) { - checkNotNull(name, "name was not specified"); - this.name = name; + this.name = Objects.requireNonNull(name, "name was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/JoinSwarmCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/JoinSwarmCmdImpl.java index 72a1cdb82..d19ed8ea2 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/JoinSwarmCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/JoinSwarmCmdImpl.java @@ -3,9 +3,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.command.JoinSwarmCmd; -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.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import javax.annotation.CheckForNull; import java.util.List; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java index a23d0caa5..bc7207829 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/KillContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.KillContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; @@ -29,15 +29,13 @@ public String getSignal() { @Override public KillContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } @Override public KillContainerCmd withSignal(String signal) { - checkNotNull(signal, "signal was not specified"); - this.signal = signal; + this.signal = Objects.requireNonNull(signal, "signal was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListConfigsCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListConfigsCmdImpl.java index 9cd48e9a7..f67dd30b8 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListConfigsCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListConfigsCmdImpl.java @@ -6,8 +6,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; /** * List configs. @@ -26,8 +25,7 @@ public Map> getFilters() { } public ListConfigsCmd withFilters(Map> filters) { - checkNotNull(filters, "filters was not specified"); - this.filters = filters; + this.filters = Objects.requireNonNull(filters, "filters was not specified"); return this; } } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java index 0d0323a65..94de5daff 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListContainersCmdImpl.java @@ -7,9 +7,9 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; /** * List containers. @@ -73,7 +73,7 @@ public ListContainersCmd withShowSize(Boolean showSize) { @Override public ListContainersCmd withLimit(Integer limit) { - checkNotNull(limit, "limit was not specified"); + Objects.requireNonNull(limit, "limit was not specified"); checkArgument(limit > 0, "limit must be greater 0"); this.limit = limit; return this; @@ -81,15 +81,13 @@ public ListContainersCmd withLimit(Integer limit) { @Override public ListContainersCmd withSince(String since) { - checkNotNull(since, "since was not specified"); - this.sinceId = since; + this.sinceId = Objects.requireNonNull(since, "since was not specified"); return this; } @Override public ListContainersCmd withBefore(String before) { - checkNotNull(before, "before was not specified"); - this.beforeId = before; + this.beforeId = Objects.requireNonNull(before, "before was not specified"); return this; } @@ -125,28 +123,28 @@ public ListContainersCmd withLabelFilter(Collection labels) { @Override public ListContainersCmd withLabelFilter(Map labels) { - checkNotNull(labels, "labels was not specified"); + Objects.requireNonNull(labels, "labels was not specified"); this.filters.withLabels(labels); return this; } @Override public ListContainersCmd withExitedFilter(Integer exited) { - checkNotNull(exited, "exited was not specified"); + Objects.requireNonNull(exited, "exited was not specified"); this.filters.withFilter("exited", exited.toString()); return this; } @Override public ListContainersCmd withFilter(String filterName, Collection filterValues) { - checkNotNull(filterValues, filterName + " was not specified"); + Objects.requireNonNull(filterValues, filterName + " was not specified"); this.filters.withFilter(filterName, filterValues); return this; } @Override public ListContainersCmd withStatusFilter(Collection status) { - checkNotNull(status, "status was not specified"); + Objects.requireNonNull(status, "status was not specified"); this.filters.withFilter("status", status); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java index 1033b43ec..40d378c8c 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListImagesCmdImpl.java @@ -1,12 +1,13 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.model.Image; @@ -45,32 +46,47 @@ public ListImagesCmd withShowAll(Boolean showAll) { @Override public ListImagesCmd withDanglingFilter(Boolean dangling) { - checkNotNull(dangling, "dangling have not been specified"); - filters.withFilter("dangling", dangling.toString()); + Objects.requireNonNull(dangling, "dangling have not been specified"); + withFilter("dangling", Collections.singletonList(dangling.toString())); return this; } @Override public ListImagesCmd withLabelFilter(String... labels) { - checkNotNull(labels, "labels have not been specified"); + Objects.requireNonNull(labels, "labels have not been specified"); filters.withLabels(labels); return this; } @Override public ListImagesCmd withLabelFilter(Map labels) { - checkNotNull(labels, "labels have not been specified"); + Objects.requireNonNull(labels, "labels have not been specified"); filters.withLabels(labels); return this; } @Override public ListImagesCmd withImageNameFilter(String imageNameFilter) { - checkNotNull(imageNameFilter, "image name filter not specified"); + Objects.requireNonNull(imageNameFilter, "image name filter not specified"); this.imageNameFilter = imageNameFilter; return this; } + @Override + public ListImagesCmd withReferenceFilter(String reference) { + Objects.requireNonNull(reference, "reference filter not specified"); + withFilter("reference", Collections.singletonList(reference)); + return this; + } + + @Override + public ListImagesCmd withFilter(String key, Collection values) { + Objects.requireNonNull(key, "key not specified"); + Objects.requireNonNull(values, "values not specified"); + filters.withFilter(key, values); + return this; + } + @Override public String getImageNameFilter() { return this.imageNameFilter; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java index 65c13e255..b3be94b8e 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListNetworksCmdImpl.java @@ -7,8 +7,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; public class ListNetworksCmdImpl extends AbstrDockerCmd> implements ListNetworksCmd { @@ -37,7 +36,7 @@ public ListNetworksCmd withNameFilter(String... networkName) { @Override public ListNetworksCmd withFilter(String filterName, Collection filterValues) { - checkNotNull(filterValues, filterName + " was not specified"); + Objects.requireNonNull(filterValues, filterName + " was not specified"); this.filtersBuilder.withFilter(filterName, filterValues); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListSecretsCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListSecretsCmdImpl.java index 5c11a7a19..bed3f9e51 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListSecretsCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListSecretsCmdImpl.java @@ -6,8 +6,7 @@ import java.util.List; import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; /** * List services. @@ -28,21 +27,21 @@ public Map> getFilters() { @Override public ListSecretsCmd withIdFilter(List ids) { - checkNotNull(ids, "ids was not specified"); + Objects.requireNonNull(ids, "ids was not specified"); this.filters.withFilter("id", ids); return this; } @Override public ListSecretsCmd withNameFilter(List names) { - checkNotNull(names, "names was not specified"); + Objects.requireNonNull(names, "names was not specified"); this.filters.withFilter("name", names); return this; } @Override public ListSecretsCmd withLabelFilter(Map labels) { - checkNotNull(labels, "labels was not specified"); + Objects.requireNonNull(labels, "labels was not specified"); this.filters.withLabels(labels); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListServicesCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListServicesCmdImpl.java index c68a0f6d7..1245d14b3 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListServicesCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListServicesCmdImpl.java @@ -6,8 +6,7 @@ import java.util.List; import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; /** * List services. @@ -28,21 +27,21 @@ public Map> getFilters() { @Override public ListServicesCmd withIdFilter(List ids) { - checkNotNull(ids, "ids was not specified"); + Objects.requireNonNull(ids, "ids was not specified"); this.filters.withFilter("id", ids); return this; } @Override public ListServicesCmd withNameFilter(List names) { - checkNotNull(names, "names was not specified"); + Objects.requireNonNull(names, "names was not specified"); this.filters.withFilter("name", names); return this; } @Override public ListServicesCmd withLabelFilter(Map labels) { - checkNotNull(labels, "labels was not specified"); + Objects.requireNonNull(labels, "labels was not specified"); this.filters.withLabels(labels); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListSwarmNodesCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListSwarmNodesCmdImpl.java index 88a06ae04..a35751627 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListSwarmNodesCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListSwarmNodesCmdImpl.java @@ -7,8 +7,7 @@ import java.util.List; import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; /** * List SwarmNodes @@ -29,28 +28,28 @@ public Map> getFilters() { @Override public ListSwarmNodesCmd withIdFilter(List ids) { - checkNotNull(ids, "ids was not specified"); + Objects.requireNonNull(ids, "ids was not specified"); this.filters.withIds(ids); return this; } @Override public ListSwarmNodesCmd withNameFilter(List names) { - checkNotNull(names, "names was not specified"); + Objects.requireNonNull(names, "names was not specified"); this.filters.withNames(names); return this; } @Override public ListSwarmNodesCmd withMembershipFilter(List memberships) { - checkNotNull(memberships, "memberships was not specified"); + Objects.requireNonNull(memberships, "memberships was not specified"); this.filters.withMemberships(memberships); return this; } @Override public ListSwarmNodesCmd withRoleFilter(List roles) { - checkNotNull(roles, "roles was not specified"); + Objects.requireNonNull(roles, "roles was not specified"); this.filters.withRoles(roles); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java index b3a18d776..78d39c2c7 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ListVolumesCmdImpl.java @@ -1,10 +1,9 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; import com.github.dockerjava.api.command.ListVolumesCmd; import com.github.dockerjava.api.command.ListVolumesResponse; @@ -30,14 +29,14 @@ public Map> getFilters() { @Override public ListVolumesCmd withDanglingFilter(Boolean dangling) { - checkNotNull(dangling, "dangling have not been specified"); + Objects.requireNonNull(dangling, "dangling have not been specified"); this.filters.withFilter("dangling", dangling.toString()); return this; } @Override public ListVolumesCmd withFilter(String filterName, Collection filterValues) { - checkNotNull(filterValues, filterName + " was not specified"); + Objects.requireNonNull(filterValues, filterName + " was not specified"); this.filters.withFilter(filterName, filterValues); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/LoadImageAsyncCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/LoadImageAsyncCmdImpl.java new file mode 100644 index 000000000..3de1dfa4d --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/LoadImageAsyncCmdImpl.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.command.LoadImageAsyncCmd; +import com.github.dockerjava.api.model.LoadResponseItem; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; + +public class LoadImageAsyncCmdImpl extends AbstrAsyncDockerCmd implements LoadImageAsyncCmd { + + private InputStream inputStream; + + public LoadImageAsyncCmdImpl(LoadImageAsyncCmd.Exec exec, InputStream inputStream) { + super(exec); + this.inputStream = inputStream; + } + + @Override + public InputStream getImageStream() { + return this.inputStream; + } + + @Override + public LoadImageAsyncCmd withImageStream(InputStream imageStream) { + Objects.requireNonNull(imageStream, "imageStream was not specified"); + this.inputStream = imageStream; + return this; + } + + @Override + public void close() { + super.close(); + + try { + this.inputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/LoadImageCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/LoadImageCmdImpl.java index 496ea3176..0b8cbea94 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/LoadImageCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/LoadImageCmdImpl.java @@ -1,8 +1,7 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.InputStream; +import java.util.Objects; import com.github.dockerjava.api.command.LoadImageCmd; @@ -32,8 +31,7 @@ public InputStream getImageStream() { */ @Override public LoadImageCmdImpl withImageStream(@Nonnull InputStream imageStream) { - checkNotNull(imageStream, "imageStream was not specified"); - this.imageStream = imageStream; + this.imageStream = Objects.requireNonNull(imageStream, "imageStream was not specified"); return this; } } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java index aa267fc8f..65321a318 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/LogContainerCmdImpl.java @@ -1,9 +1,9 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; -import org.apache.commons.lang.builder.ReflectionToStringBuilder; -import org.apache.commons.lang.builder.ToStringStyle; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.github.dockerjava.api.command.LogContainerCmd; import com.github.dockerjava.api.model.Frame; @@ -24,6 +24,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 class LogContainerCmdImpl extends AbstrAsyncDockerCmd implements LogContainerCmd { @@ -31,7 +33,7 @@ public class LogContainerCmdImpl extends AbstrAsyncDockerCmd> getFilters() { @Override public PruneCmd withPruneType(final PruneType pruneType) { - checkNotNull(pruneType, "pruneType has not been specified"); + Objects.requireNonNull(pruneType, "pruneType has not been specified"); this.pruneType = pruneType; return this; } @Override public PruneCmd withDangling(Boolean dangling) { - checkNotNull(dangling, "dangling has not been specified"); + Objects.requireNonNull(dangling, "dangling has not been specified"); filters.withFilter("dangling", dangling ? "1" : "0"); return this; } @Override public PruneCmd withUntilFilter(final String until) { - checkNotNull(until, "until has not been specified"); + Objects.requireNonNull(until, "until has not been specified"); filters.withUntil(until); return this; } @Override public PruneCmd withLabelFilter(final String... labels) { - checkNotNull(labels, "labels have not been specified"); + Objects.requireNonNull(labels, "labels have not been specified"); filters.withLabels(labels); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java index a3395c21b..7f70ac3b7 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/PullImageCmdImpl.java @@ -1,11 +1,11 @@ package com.github.dockerjava.core.command; +import java.util.Objects; + import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.PullResponseItem; -import static com.google.common.base.Preconditions.checkNotNull; - /** * * Pull image from repository. @@ -54,15 +54,13 @@ public String getRegistry() { @Override public PullImageCmd withRepository(String repository) { - checkNotNull(repository, "repository was not specified"); - this.repository = repository; + this.repository = Objects.requireNonNull(repository, "repository was not specified"); return this; } @Override public PullImageCmd withTag(String tag) { - checkNotNull(tag, "tag was not specified"); - this.tag = tag; + this.tag = Objects.requireNonNull(tag, "tag was not specified"); return this; } @@ -74,8 +72,7 @@ public PullImageCmd withPlatform(String platform) { @Override public PullImageCmd withRegistry(String registry) { - checkNotNull(registry, "registry was not specified"); - this.registry = registry; + this.registry = Objects.requireNonNull(registry, "registry was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java index b3026c841..8e1fa5cec 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/PushImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.PushImageCmd; import com.github.dockerjava.api.model.AuthConfig; @@ -42,8 +42,7 @@ public String getTag() { */ @Override public PushImageCmd withName(String name) { - checkNotNull(name, "name was not specified"); - this.name = name; + this.name = Objects.requireNonNull(name, "name was not specified"); return this; } @@ -53,8 +52,7 @@ public PushImageCmd withName(String name) { */ @Override public PushImageCmd withTag(String tag) { - checkNotNull(tag, "tag was not specified"); - this.tag = tag; + this.tag = Objects.requireNonNull(tag, "tag was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveConfigCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveConfigCmdImpl.java index 32203cfe2..e2e7d06fd 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveConfigCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveConfigCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import java.util.Objects; + import com.github.dockerjava.api.command.RemoveConfigCmd; import com.github.dockerjava.api.exception.NotFoundException; -import static com.google.common.base.Preconditions.checkNotNull; - /** * Remove a config. */ @@ -24,8 +24,7 @@ public String getConfigId() { @Override public RemoveConfigCmd withConfigId(String configId) { - checkNotNull(configId, "configId was not specified"); - this.configId = configId; + this.configId = Objects.requireNonNull(configId, "configId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java index 0fc2ab626..cd8f4a9f3 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.RemoveContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; @@ -41,8 +41,7 @@ public Boolean hasForceEnabled() { @Override public RemoveContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java index 038a27f2d..a77357b59 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.RemoveImageCmd; import com.github.dockerjava.api.exception.NotFoundException; @@ -38,8 +38,7 @@ public Boolean hasNoPruneEnabled() { @Override public RemoveImageCmd withImageId(String imageId) { - checkNotNull(imageId, "imageId was not specified"); - this.imageId = imageId; + this.imageId = Objects.requireNonNull(imageId, "imageId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveSecretCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveSecretCmdImpl.java index 6841d79bd..5c8d0e075 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveSecretCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveSecretCmdImpl.java @@ -3,7 +3,7 @@ import com.github.dockerjava.api.command.RemoveSecretCmd; import com.github.dockerjava.api.exception.NotFoundException; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; /** * Remove a secret. @@ -24,8 +24,7 @@ public String getSecretId() { @Override public RemoveSecretCmd withSecretId(String secretId) { - checkNotNull(secretId, "secretId was not specified"); - this.secretId = secretId; + this.secretId = Objects.requireNonNull(secretId, "secretId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveServiceCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveServiceCmdImpl.java index 9da85847a..6fed721c7 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveServiceCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveServiceCmdImpl.java @@ -3,7 +3,7 @@ import com.github.dockerjava.api.command.RemoveServiceCmd; import com.github.dockerjava.api.exception.NotFoundException; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; /** * Remove a service. @@ -24,8 +24,7 @@ public String getServiceId() { @Override public RemoveServiceCmd withServiceId(String serviceId) { - checkNotNull(serviceId, "serviceId was not specified"); - this.serviceId = serviceId; + this.serviceId = Objects.requireNonNull(serviceId, "serviceId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveSwarmNodeCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveSwarmNodeCmdImpl.java index bf9029e72..ef8a86943 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveSwarmNodeCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RemoveSwarmNodeCmdImpl.java @@ -3,11 +3,11 @@ import com.github.dockerjava.api.command.RemoveSwarmNodeCmd; import com.github.dockerjava.api.exception.NotFoundException; +import java.util.Objects; + import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import static com.google.common.base.Preconditions.checkNotNull; - /** * Remove a container. */ @@ -17,9 +17,9 @@ public class RemoveSwarmNodeCmdImpl extends AbstrDockerCmd implements RenameContainerCmd { @@ -30,15 +30,13 @@ public String getName() { @Override public RenameContainerCmd withContainerId(@Nonnull String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } @Override public RenameContainerCmd withName(@Nonnull String name) { - checkNotNull(name, "name was not specified"); - this.name = name; + this.name = Objects.requireNonNull(name, "name was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java index de1b6ac20..188802a41 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeContainerCmdImpl.java @@ -3,7 +3,7 @@ import com.github.dockerjava.api.command.ResizeContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; public class ResizeContainerCmdImpl extends AbstrDockerCmd implements ResizeContainerCmd { @@ -35,8 +35,7 @@ public Integer getWidth() { @Override public ResizeContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java index 80b1fef88..3aa02c7e9 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ResizeExecCmdImpl.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core.command; +import java.util.Objects; + import com.github.dockerjava.api.command.ResizeExecCmd; import com.github.dockerjava.api.exception.NotFoundException; -import static com.google.common.base.Preconditions.checkNotNull; - public class ResizeExecCmdImpl extends AbstrDockerCmd implements ResizeExecCmd { private String execId; @@ -35,8 +35,7 @@ public Integer getWidth() { @Override public ResizeExecCmd withExecId(String execId) { - checkNotNull(execId, "execId was not specified"); - this.execId = execId; + this.execId = Objects.requireNonNull(execId, "execId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index e3621af4f..3b1df465b 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -1,17 +1,19 @@ package com.github.dockerjava.core.command; import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Objects; import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; +import javax.annotation.CheckForNull; + /** * Restart a running container. * - * @param timeout - * - Timeout in seconds before killing the container. Defaults to 10 seconds. - * + * @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 class RestartContainerCmdImpl extends AbstrDockerCmd implements RestartContainerCmd { @@ -19,6 +21,8 @@ public class RestartContainerCmdImpl extends AbstrDockerCmd= 0, "timeout must be greater or equal 0"); this.timeout = timeout; return this; } + @Override + public RestartContainerCmd withSignal(String signal) { + Objects.requireNonNull(signal, "signal was not specified"); + this.signal = signal; + return this; + } + /** - * @throws NotFoundException - * No such container + * @throws NotFoundException No such container */ @Override public Void exec() throws NotFoundException { diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java index 333e32df7..0ec72bcc5 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/SaveImageCmdImpl.java @@ -1,8 +1,7 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; - import java.io.InputStream; +import java.util.Objects; import com.github.dockerjava.api.command.SaveImageCmd; import com.github.dockerjava.api.exception.NotFoundException; @@ -33,8 +32,7 @@ public String getTag() { */ @Override public SaveImageCmd withName(String name) { - checkNotNull(name, "name was not specified"); - this.name = name; + this.name = Objects.requireNonNull(name, "name was not specified"); return this; } @@ -44,8 +42,7 @@ public SaveImageCmd withName(String name) { */ @Override public SaveImageCmd withTag(String tag) { - checkNotNull(tag, "tag was not specified"); - this.tag = tag; + this.tag = Objects.requireNonNull(tag, "tag was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/SaveImagesCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/SaveImagesCmdImpl.java index 0563e16fe..43e11f609 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/SaveImagesCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/SaveImagesCmdImpl.java @@ -7,8 +7,7 @@ import javax.annotation.Nonnull; import java.io.InputStream; import java.util.List; - -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; public class SaveImagesCmdImpl extends AbstrDockerCmd implements SaveImagesCmd { @@ -17,10 +16,8 @@ private static class TaggedImageImpl implements TaggedImage { private final String tag; private TaggedImageImpl(String name, String tag) { - checkNotNull(name, "image name was not specified"); - checkNotNull(tag, "image tag was not specified"); - this.name = name; - this.tag = tag; + this.name = Objects.requireNonNull(name, "image name was not specified"); + this.tag = Objects.requireNonNull(tag, "image tag was not specified"); } @Override diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java index dab946b1c..41b8cc844 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/SearchImagesCmdImpl.java @@ -1,9 +1,9 @@ package com.github.dockerjava.core.command; import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; +import java.util.Objects; import com.github.dockerjava.api.command.SearchImagesCmd; import com.github.dockerjava.api.model.SearchItem; @@ -37,8 +37,7 @@ public String getTerm() { @Override public SearchImagesCmd withTerm(String term) { - checkNotNull(term, "term was not specified"); - this.term = term; + this.term = Objects.requireNonNull(term, "term was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java index c159c920e..2c0e2c2b8 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/StartContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.fasterxml.jackson.annotation.JsonIgnore; import com.github.dockerjava.api.command.StartContainerCmd; @@ -22,8 +22,7 @@ public StartContainerCmdImpl(StartContainerCmd.Exec exec, String containerId) { @Override public StartContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java index e1cc86e68..3e24bd5af 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/StatsCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.StatsCmd; import com.github.dockerjava.api.model.Statistics; @@ -21,8 +21,7 @@ public StatsCmdImpl(StatsCmd.Exec exec, String containerId) { @Override public StatsCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java index 7b1e165f5..2cf5e37ae 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/StopContainerCmdImpl.java @@ -1,7 +1,8 @@ package com.github.dockerjava.core.command; import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Objects; import com.github.dockerjava.api.command.StopContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; @@ -39,14 +40,13 @@ public Integer getTimeout() { @Override public StopContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } @Override public StopContainerCmd withTimeout(Integer timeout) { - checkNotNull(timeout, "timeout was not specified"); + Objects.requireNonNull(timeout, "timeout was not specified"); checkArgument(timeout >= 0, "timeout must be greater or equal 0"); this.timeout = timeout; return this; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java index c1337112d..f7eebb8a4 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/TagImageCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.TagImageCmd; @@ -50,22 +50,19 @@ public Boolean hasForceEnabled() { @Override public TagImageCmd withImageId(String imageId) { - checkNotNull(imageId, "imageId was not specified"); - this.imageId = imageId; + this.imageId = Objects.requireNonNull(imageId, "imageId was not specified"); return this; } @Override public TagImageCmd withRepository(String repository) { - checkNotNull(repository, "repository was not specified"); - this.repository = repository; + this.repository = Objects.requireNonNull(repository, "repository was not specified"); return this; } @Override public TagImageCmd withTag(String tag) { - checkNotNull(tag, "tag was not specified"); - this.tag = tag; + this.tag = Objects.requireNonNull(tag, "tag was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java index 19faed3f2..5f5eee8d0 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/TopContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.TopContainerCmd; import com.github.dockerjava.api.command.TopContainerResponse; @@ -33,15 +33,13 @@ public String getPsArgs() { @Override public TopContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } @Override public TopContainerCmd withPsArgs(String psArgs) { - checkNotNull(psArgs, "psArgs was not specified"); - this.psArgs = psArgs; + this.psArgs = Objects.requireNonNull(psArgs, "psArgs was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java index 26e9992b0..ef94c1979 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UnpauseContainerCmdImpl.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; import com.github.dockerjava.api.command.UnpauseContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; @@ -28,8 +28,7 @@ public String getContainerId() { @Override public UnpauseContainerCmd withContainerId(String containerId) { - checkNotNull(containerId, "containerId was not specified"); - this.containerId = containerId; + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); return this; } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateContainerCmdImpl.java index aad2b19e3..47ab710eb 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateContainerCmdImpl.java @@ -4,14 +4,21 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.command.UpdateContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; +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 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.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import java.util.List; /** * @author Kanstantsin Shautsou @@ -28,14 +35,38 @@ public class UpdateContainerCmdImpl extends AbstrDockerCmd blkioWeightDevice; + + @JsonProperty("BlkioDeviceReadBps") + private List blkioDeviceReadBps; + + @JsonProperty("BlkioDeviceWriteBps") + private List blkioDeviceWriteBps; + + @JsonProperty("BlkioDeviceReadIOps") + private List blkioDeviceReadIOps; + + @JsonProperty("BlkioDeviceWriteIOps") + private List blkioDeviceWriteIOps; + @JsonProperty("CpuShares") private Integer cpuShares; @JsonProperty("CpuPeriod") - private Integer cpuPeriod; + private Long cpuPeriod; @JsonProperty("CpuQuota") - private Integer cpuQuota; + private Long cpuQuota; + + @JsonProperty("CpuRealtimePeriod") + private Long cpuRealtimePeriod; + + @JsonProperty("CpuRealtimeRuntime") + private Long cpuRealtimeRuntime; + + @JsonProperty("NanoCpus") + private Long nanoCPUs; @JsonProperty("CpusetCpus") private String cpusetCpus; @@ -43,6 +74,18 @@ public class UpdateContainerCmdImpl extends AbstrDockerCmd devices; + + @JsonProperty("DeviceCgroupRules") + private List deviceCgroupRules; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_40} + */ + @JsonProperty("DeviceRequests") + private List deviceRequests; + @JsonProperty("Memory") private Long memory; @@ -55,11 +98,43 @@ public class UpdateContainerCmdImpl extends AbstrDockerCmd ulimits; + + @JsonProperty("RestartPolicy") + private RestartPolicy restartPolicy; + public UpdateContainerCmdImpl(UpdateContainerCmd.Exec exec, String containerId) { super(exec); withContainerId(containerId); } + /** + * @see #containerId + */ + @CheckForNull + @JsonIgnore + public String getContainerId() { + return containerId; + } + + /** + * @see #containerId + */ + public UpdateContainerCmd withContainerId(@Nonnull String containerId) { + this.containerId = containerId; + return this; + } + /** * @see #blkioWeight */ @@ -77,19 +152,68 @@ public UpdateContainerCmd withBlkioWeight(Integer blkioWeight) { } /** - * @see #containerId + * @see #blkioWeightDevice */ @CheckForNull - @JsonIgnore - public String getContainerId() { - return containerId; + public List getBlkioWeightDevice() { + return blkioWeightDevice; + } + + public UpdateContainerCmd withBlkioWeightDevice(List blkioWeightDevice) { + this.blkioWeightDevice = blkioWeightDevice; + return this; } /** - * @see #containerId + * @see #blkioDeviceReadBps */ - public UpdateContainerCmd withContainerId(@Nonnull String containerId) { - this.containerId = containerId; + @CheckForNull + public List getBlkioDeviceReadBps() { + return blkioDeviceReadBps; + } + + public UpdateContainerCmd withBlkioDeviceReadBps(List blkioDeviceReadBps) { + this.blkioDeviceReadBps = blkioDeviceReadBps; + return this; + } + + /** + * @see #blkioDeviceWriteBps + */ + @CheckForNull + public List getBlkioDeviceWriteBps() { + return blkioDeviceWriteBps; + } + + public UpdateContainerCmd withBlkioDeviceWriteBps(List blkioDeviceWriteBps) { + this.blkioDeviceWriteBps = blkioDeviceWriteBps; + return this; + } + + /** + * @see #blkioDeviceReadIOps + */ + @CheckForNull + public List getBlkioDeviceReadIOps() { + return blkioDeviceReadIOps; + } + + public UpdateContainerCmd withBlkioDeviceReadIOps(List blkioDeviceReadIOps) { + this.blkioDeviceReadIOps = blkioDeviceReadIOps; + return this; + } + + /** + * @see #blkioDeviceWriteIOps + */ + @CheckForNull + public List getBlkioDeviceWriteIOps() { + return blkioDeviceWriteIOps; + } + + @Override + public UpdateContainerCmd withBlkioDeviceWriteIOps(List blkioDeviceWriteIOps) { + this.blkioDeviceWriteIOps = blkioDeviceWriteIOps; return this; } @@ -97,14 +221,14 @@ public UpdateContainerCmd withContainerId(@Nonnull String containerId) { * @see #cpuPeriod */ @CheckForNull - public Integer getCpuPeriod() { + public Long getCpuPeriod() { return cpuPeriod; } /** * @see #cpuPeriod */ - public UpdateContainerCmd withCpuPeriod(Integer cpuPeriod) { + public UpdateContainerCmd withCpuPeriod(Long cpuPeriod) { this.cpuPeriod = cpuPeriod; return this; } @@ -113,14 +237,14 @@ public UpdateContainerCmd withCpuPeriod(Integer cpuPeriod) { * @see #cpuQuota */ @CheckForNull - public Integer getCpuQuota() { + public Long getCpuQuota() { return cpuQuota; } /** * @see #cpuQuota */ - public UpdateContainerCmd withCpuQuota(Integer cpuQuota) { + public UpdateContainerCmd withCpuQuota(Long cpuQuota) { this.cpuQuota = cpuQuota; return this; } @@ -173,6 +297,71 @@ public UpdateContainerCmd withCpuShares(Integer cpuShares) { return this; } + /** + * @see #cpuRealtimePeriod + */ + @CheckForNull + public Long getCpuRealtimePeriod() { + return cpuRealtimePeriod; + } + + public UpdateContainerCmd withCpuRealtimePeriod(Long cpuRealtimePeriod) { + this.cpuRealtimePeriod = cpuRealtimePeriod; + return this; + } + + /** + * @see #cpuRealtimeRuntime + */ + @CheckForNull + public Long getCpuRealtimeRuntime() { + return cpuRealtimeRuntime; + } + + public UpdateContainerCmd withCpuRealtimeRuntime(Long cpuRealtimeRuntime) { + this.cpuRealtimeRuntime = cpuRealtimeRuntime; + return this; + } + + /** + * @see #devices + */ + @CheckForNull + public List getDevices() { + return devices; + } + + public UpdateContainerCmd withDevices(List devices) { + this.devices = devices; + return this; + } + + /** + * @see #deviceCgroupRules + */ + @CheckForNull + public List getDeviceCgroupRules() { + return deviceCgroupRules; + } + + public UpdateContainerCmd withDeviceCgroupRules(List deviceCgroupRules) { + this.deviceCgroupRules = deviceCgroupRules; + return this; + } + + /** + * @see #deviceRequests + */ + @CheckForNull + public List getDeviceRequests() { + return deviceRequests; + } + + public UpdateContainerCmd withDeviceRequests(List deviceRequests) { + this.deviceRequests = deviceRequests; + return this; + } + /** * @see #kernelMemory */ @@ -237,6 +426,84 @@ public UpdateContainerCmd withMemorySwap(Long memorySwap) { return this; } + /** + * @see #nanoCPUs + */ + @CheckForNull + public Long getNanoCPUs() { + return nanoCPUs; + } + + public UpdateContainerCmd withNanoCPUs(Long nanoCPUs) { + this.nanoCPUs = nanoCPUs; + return this; + } + + /** + * @see #oomKillDisable + */ + @CheckForNull + public Boolean getOomKillDisable() { + return oomKillDisable; + } + + public UpdateContainerCmd withOomKillDisable(Boolean oomKillDisable) { + this.oomKillDisable = oomKillDisable; + return this; + } + + /** + * @see #init + */ + @CheckForNull + public Boolean getInit() { + return init; + } + + public UpdateContainerCmd withInit(Boolean init) { + this.init = init; + return this; + } + + /** + * @see #pidsLimit + */ + @CheckForNull + public Long getPidsLimit() { + return pidsLimit; + } + + public UpdateContainerCmd withPidsLimit(Long pidsLimit) { + this.pidsLimit = pidsLimit; + return this; + } + + /** + * @see #ulimits + */ + @CheckForNull + public List getUlimits() { + return ulimits; + } + + public UpdateContainerCmd withUlimits(List ulimits) { + this.ulimits = ulimits; + return this; + } + + /** + * @see #restartPolicy + */ + @CheckForNull + public RestartPolicy getRestartPolicy() { + return restartPolicy; + } + + public UpdateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { + this.restartPolicy = restartPolicy; + return this; + } + /** * @throws NotFoundException No such container */ diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateServiceCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateServiceCmdImpl.java index 664ffd997..7ff9412a9 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateServiceCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateServiceCmdImpl.java @@ -4,10 +4,10 @@ import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.ServiceSpec; 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 org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateSwarmCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateSwarmCmdImpl.java index d1eefcae2..372cd34ce 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateSwarmCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateSwarmCmdImpl.java @@ -1,11 +1,11 @@ package com.github.dockerjava.core.command; +import java.util.Objects; + import com.github.dockerjava.api.command.UpdateSwarmCmd; import com.github.dockerjava.api.model.SwarmSpec; -import static com.google.common.base.Preconditions.checkNotNull; - /** * Update a swarm. */ @@ -62,8 +62,7 @@ public SwarmSpec getSwarmSpec() { @Override public UpdateSwarmCmd withSwarmSpec(SwarmSpec swarmSpec) { - checkNotNull(swarmSpec, "swarmSpec was not specified"); - this.swarmSpec = swarmSpec; + this.swarmSpec = Objects.requireNonNull(swarmSpec, "swarmSpec was not specified"); return this; } } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateSwarmNodeCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateSwarmNodeCmdImpl.java index 278599641..a2f22fa14 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateSwarmNodeCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateSwarmNodeCmdImpl.java @@ -4,10 +4,10 @@ import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.SwarmNodeSpec; 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 org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index eeb05ff60..b627e2ccd 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -1,8 +1,11 @@ package com.github.dockerjava.core.command; -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Objects; + +import javax.annotation.Nullable; import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.api.model.WaitContainerCondition; import com.github.dockerjava.api.model.WaitResponse; /** @@ -15,6 +18,8 @@ public class WaitContainerCmdImpl extends AbstrAsyncDockerCmd implements BuildImageCmd.Exec { diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/CopyArchiveToContainerCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/CopyArchiveToContainerCmdExec.java index d1effbb3e..ea4a527b1 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/CopyArchiveToContainerCmdExec.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/CopyArchiveToContainerCmdExec.java @@ -28,7 +28,9 @@ protected Void execute(CopyArchiveToContainerCmd command) { InputStream streamToUpload = command.getTarInputStream(); webResource.queryParam("path", command.getRemotePath()) - .queryParam("noOverwriteDirNonDir", command.isNoOverwriteDirNonDir()).request() + .queryParam("noOverwriteDirNonDir", command.isNoOverwriteDirNonDir()) + .queryParam("copyUIDGID", command.isCopyUIDGID()) + .request() .put(streamToUpload, MediaType.APPLICATION_X_TAR); return null; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/LoadImageAsyncCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/LoadImageAsyncCmdExec.java new file mode 100644 index 000000000..47f1d52fc --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/LoadImageAsyncCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.core.exec; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.LoadImageAsyncCmd; +import com.github.dockerjava.api.model.LoadResponseItem; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.WebTarget; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LoadImageAsyncCmdExec extends AbstrAsyncDockerCmdExec implements LoadImageAsyncCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageAsyncCmdExec.class); + + public LoadImageAsyncCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected Void execute0(LoadImageAsyncCmd command, ResultCallback resultCallback) { + WebTarget webTarget = getBaseResource().path("/images/load"); + + LOGGER.trace("POST: {}", webTarget); + + webTarget.request().post(new TypeReference() { }, resultCallback, command.getImageStream()); + + return null; + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/LogContainerCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/LogContainerCmdExec.java index 54168bb5e..357af6d0e 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/LogContainerCmdExec.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/LogContainerCmdExec.java @@ -32,6 +32,10 @@ protected Void execute0(LogContainerCmd command, ResultCallback resultCal webTarget = webTarget.queryParam("since", command.getSince()); } + if (command.getUntil() != null) { + webTarget = webTarget.queryParam("until", command.getUntil()); + } + webTarget = booleanQueryParam(webTarget, "timestamps", command.hasTimestampsEnabled()); webTarget = booleanQueryParam(webTarget, "stdout", command.hasStdoutEnabled()); webTarget = booleanQueryParam(webTarget, "stderr", command.hasStderrEnabled()); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/RestartContainerCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/RestartContainerCmdExec.java index ecb317a34..42f2579e6 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/RestartContainerCmdExec.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/RestartContainerCmdExec.java @@ -24,6 +24,10 @@ protected Void execute(RestartContainerCmd command) { WebTarget webResource = getBaseResource().path("/containers/{id}/restart").resolveTemplate("id", command.getContainerId()); + if (command.getSignal() != null) { + webResource = webResource.queryParam("signal", command.getSignal()); + } + if (command.getTimeout() != null) { webResource = webResource.queryParam("t", String.valueOf(command.getTimeout())); } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/TopContainerCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/TopContainerCmdExec.java index c6fff7044..f0ce0f71a 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/TopContainerCmdExec.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/TopContainerCmdExec.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core.exec; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/WaitContainerCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/WaitContainerCmdExec.java index 57cc727fe..3d2b2fa8e 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/WaitContainerCmdExec.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/WaitContainerCmdExec.java @@ -1,5 +1,6 @@ package com.github.dockerjava.core.exec; +import com.github.dockerjava.api.model.WaitContainerCondition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,6 +26,11 @@ protected Void execute0(WaitContainerCmd command, ResultCallback r WebTarget webTarget = getBaseResource().path("/containers/{id}/wait").resolveTemplate("id", command.getContainerId()); + WaitContainerCondition condition = command.getCondition(); + if (condition != null) { + webTarget = webTarget.queryParam("condition", condition.getValue()); + } + LOGGER.trace("POST: {}", webTarget); webTarget.request().accept(MediaType.APPLICATION_JSON).post((Object) null, new TypeReference() { diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java b/docker-java-core/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java index 4590abb13..eb7b90aca 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java @@ -54,7 +54,8 @@ private static TarArchiveOutputStream buildTarStream(Path outputPath, boolean gZ outputStream = new GzipCompressorOutputStream(outputStream); } TarArchiveOutputStream tarArchiveOutputStream = new TarArchiveOutputStream(outputStream); - tarArchiveOutputStream.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); + tarArchiveOutputStream.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX); + tarArchiveOutputStream.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX); return tarArchiveOutputStream; } @@ -98,7 +99,8 @@ public static File archiveTARFiles(File base, Iterable files, String archi tarFile.deleteOnExit(); try (TarArchiveOutputStream tos = new TarArchiveOutputStream(new GZIPOutputStream(new BufferedOutputStream( new FileOutputStream(tarFile))))) { - tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); + tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX); + tos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX); for (File file : files) { // relativize with method using Path otherwise method with File resolves the symlinks // and this is not want we want. If the file is a symlink, the relativized path should diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index aff37f383..52cf66de2 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -15,6 +15,10 @@ https://github.com/docker-java/docker-java Java API Client for Docker + + com.github.dockerjava.transport.httpclient5 + + ${project.groupId} @@ -25,19 +29,20 @@ org.apache.httpcomponents.client5 httpclient5 - 5.0.3 - - - org.apache.httpcomponents.core5 - httpcore5-h2 - - + 5.5.1 net.java.dev.jna jna - 5.8.0 + 5.18.1 + + + + ${project.groupId} + docker-java-transport-tck + ${project.version} + test diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java index aaafd3d58..c97a2bc45 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java @@ -4,32 +4,36 @@ import com.github.dockerjava.transport.NamedPipeSocket; import com.github.dockerjava.transport.SSLConfig; import com.github.dockerjava.transport.UnixSocket; + +import org.apache.hc.client5.http.SystemDefaultDnsResolver; import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; +import org.apache.hc.client5.http.config.ConnectionConfig; import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.impl.DefaultSchemePortResolver; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator; import org.apache.hc.client5.http.impl.io.ManagedHttpClientConnectionFactory; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; -import org.apache.hc.client5.http.socket.ConnectionSocketFactory; -import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory; -import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.client5.http.io.HttpClientConnectionOperator; +import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy; +import org.apache.hc.client5.http.ssl.TlsSocketStrategy; +import org.apache.hc.core5.http.ClassicHttpResponse; import org.apache.hc.core5.http.ConnectionClosedException; import org.apache.hc.core5.http.ContentLengthStrategy; import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.HttpHeaders; import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.NameValuePair; -import org.apache.hc.core5.http.config.Registry; -import org.apache.hc.core5.http.config.RegistryBuilder; import org.apache.hc.core5.http.impl.DefaultContentLengthStrategy; -import org.apache.hc.core5.http.impl.io.EmptyInputStream; import org.apache.hc.core5.http.io.SocketConfig; import org.apache.hc.core5.http.io.entity.ByteArrayEntity; +import org.apache.hc.core5.http.io.entity.EmptyInputStream; import org.apache.hc.core5.http.io.entity.InputStreamEntity; -import org.apache.hc.core5.http.protocol.BasicHttpContext; import org.apache.hc.core5.http.protocol.HttpContext; +import org.apache.hc.core5.http.protocol.HttpCoreContext; import org.apache.hc.core5.net.URIAuthority; +import org.apache.hc.core5.util.TimeValue; import org.apache.hc.core5.util.Timeout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +54,7 @@ class ApacheDockerHttpClientImpl implements DockerHttpClient { private final CloseableHttpClient httpClient; private final HttpHost host; + private final String pathPrefix; protected ApacheDockerHttpClientImpl( URI dockerHost, @@ -58,26 +63,40 @@ protected ApacheDockerHttpClientImpl( Duration connectionTimeout, Duration responseTimeout ) { - Registry socketFactoryRegistry = createConnectionSocketFactoryRegistry(sslConfig, dockerHost); + SSLContext sslContext; + try { + sslContext = sslConfig != null ? sslConfig.getSSLContext() : null; + } catch (Exception e) { + throw new RuntimeException(e); + } + HttpClientConnectionOperator connectionOperator = createConnectionOperator(dockerHost, sslContext); switch (dockerHost.getScheme()) { case "unix": case "npipe": + pathPrefix = ""; host = new HttpHost(dockerHost.getScheme(), "localhost", 2375); break; case "tcp": + String rawPath = dockerHost.getRawPath(); + pathPrefix = rawPath.endsWith("/") + ? rawPath.substring(0, rawPath.length() - 1) + : rawPath; host = new HttpHost( - socketFactoryRegistry.lookup("https") != null ? "https" : "http", + sslContext != null ? "https" : "http", dockerHost.getHost(), dockerHost.getPort() ); break; default: - host = HttpHost.create(dockerHost); + throw new IllegalArgumentException("Unsupported protocol scheme: " + dockerHost); } PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager( - socketFactoryRegistry, + connectionOperator, + null, + null, + null, new ManagedHttpClientConnectionFactory( null, null, @@ -103,61 +122,48 @@ protected ApacheDockerHttpClientImpl( ); connectionManager.setMaxTotal(maxConnections); connectionManager.setDefaultMaxPerRoute(maxConnections); - RequestConfig.Builder defaultRequest = RequestConfig.custom(); - if (connectionTimeout != null) { - defaultRequest.setConnectTimeout(connectionTimeout.toNanos(), TimeUnit.NANOSECONDS); - } - if (responseTimeout != null) { - defaultRequest.setResponseTimeout(responseTimeout.toNanos(), TimeUnit.NANOSECONDS); - } + connectionManager.setDefaultConnectionConfig(ConnectionConfig.custom() + .setValidateAfterInactivity(TimeValue.NEG_ONE_SECOND) + .setConnectTimeout(connectionTimeout != null ? Timeout.of(connectionTimeout.toNanos(), TimeUnit.NANOSECONDS) : null) + .build()); httpClient = HttpClients.custom() .setRequestExecutor(new HijackingHttpRequestExecutor(null)) .setConnectionManager(connectionManager) - .setDefaultRequestConfig(defaultRequest.build()) + .setDefaultRequestConfig(RequestConfig.custom() + .setResponseTimeout(responseTimeout != null ? Timeout.of(responseTimeout.toNanos(), TimeUnit.NANOSECONDS) : null) + .build()) .disableConnectionState() .build(); } - private Registry createConnectionSocketFactoryRegistry( - SSLConfig sslConfig, - URI dockerHost + private HttpClientConnectionOperator createConnectionOperator( + URI dockerHost, + SSLContext sslContext ) { - RegistryBuilder socketFactoryRegistryBuilder = RegistryBuilder.create(); - - if (sslConfig != null) { - try { - SSLContext sslContext = sslConfig.getSSLContext(); - if (sslContext != null) { - socketFactoryRegistryBuilder.register("https", new SSLConnectionSocketFactory(sslContext)); + String dockerHostScheme = dockerHost.getScheme(); + String dockerHostPath = dockerHost.getPath(); + TlsSocketStrategy tlsSocketStrategy = sslContext != null ? + new DefaultClientTlsStrategy(sslContext) : DefaultClientTlsStrategy.createSystemDefault(); + return new DefaultHttpClientConnectionOperator( + socksProxy -> { + if ("unix".equalsIgnoreCase(dockerHostScheme)) { + return UnixSocket.get(dockerHostPath); + } else if ("npipe".equalsIgnoreCase(dockerHostScheme)) { + return new NamedPipeSocket(dockerHostPath); + } else { + return socksProxy == null ? new Socket() : new Socket(socksProxy); } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - return socketFactoryRegistryBuilder - .register("tcp", PlainConnectionSocketFactory.INSTANCE) - .register("http", PlainConnectionSocketFactory.INSTANCE) - .register("unix", new PlainConnectionSocketFactory() { - @Override - public Socket createSocket(HttpContext context) throws IOException { - return UnixSocket.get(dockerHost.getPath()); - } - }) - .register("npipe", new PlainConnectionSocketFactory() { - @Override - public Socket createSocket(HttpContext context) { - return new NamedPipeSocket(dockerHost.getPath()); - } - }) - .build(); + }, + DefaultSchemePortResolver.INSTANCE, + SystemDefaultDnsResolver.INSTANCE, + name -> "https".equalsIgnoreCase(name) ? tlsSocketStrategy : null); } @Override public Response execute(Request request) { - HttpContext context = new BasicHttpContext(); - HttpUriRequestBase httpUriRequest = new HttpUriRequestBase(request.method(), URI.create(request.path())); + HttpContext context = new HttpCoreContext(); + HttpUriRequestBase httpUriRequest = new HttpUriRequestBase(request.method(), URI.create(pathPrefix + request.path())); httpUriRequest.setScheme(host.getSchemeName()); httpUriRequest.setAuthority(new URIAuthority(host.getHostName(), host.getPort())); @@ -180,7 +186,7 @@ public Response execute(Request request) { } try { - CloseableHttpResponse response = httpClient.execute(host, httpUriRequest, context); + ClassicHttpResponse response = httpClient.executeOpen(host, httpUriRequest, context); return new ApacheResponse(httpUriRequest, response); } catch (IOException e) { @@ -199,9 +205,9 @@ static class ApacheResponse implements Response { private final HttpUriRequestBase request; - private final CloseableHttpResponse response; + private final ClassicHttpResponse response; - ApacheResponse(HttpUriRequestBase httpUriRequest, CloseableHttpResponse response) { + ApacheResponse(HttpUriRequestBase httpUriRequest, ClassicHttpResponse response) { this.request = httpUriRequest; this.response = response; } diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/HijackingHttpRequestExecutor.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/HijackingHttpRequestExecutor.java index 59888a5dd..df8fbd059 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/HijackingHttpRequestExecutor.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/HijackingHttpRequestExecutor.java @@ -44,7 +44,7 @@ public ClassicHttpResponse execute( InputStream hijackedInput = (InputStream) context.getAttribute(HIJACKED_INPUT_ATTRIBUTE); if (hijackedInput != null) { - return executeHijacked(request, conn, context, hijackedInput); + return executeHijacked(request, conn, (HttpCoreContext) context, hijackedInput); } return super.execute(request, conn, informationCallback, context); @@ -53,12 +53,12 @@ public ClassicHttpResponse execute( private ClassicHttpResponse executeHijacked( ClassicHttpRequest request, HttpClientConnection conn, - HttpContext context, + HttpCoreContext context, InputStream hijackedInput ) throws HttpException, IOException { try { - context.setAttribute(HttpCoreContext.SSL_SESSION, conn.getSSLSession()); - context.setAttribute(HttpCoreContext.CONNECTION_ENDPOINT, conn.getEndpointDetails()); + context.setSSLSession(conn.getSSLSession()); + context.setEndpointDetails(conn.getEndpointDetails()); final ProtocolVersion transportVersion = request.getVersion(); if (transportVersion != null) { context.setProtocolVersion(transportVersion); diff --git a/docker-java-transport-httpclient5/src/test/java/com/github/dockerjava/transport/HttpClient5Tests.java b/docker-java-transport-httpclient5/src/test/java/com/github/dockerjava/transport/HttpClient5Tests.java new file mode 100644 index 000000000..d83621f78 --- /dev/null +++ b/docker-java-transport-httpclient5/src/test/java/com/github/dockerjava/transport/HttpClient5Tests.java @@ -0,0 +1,16 @@ +package com.github.dockerjava.transport; + +import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; + +import java.net.URI; + +public class HttpClient5Tests extends DockerHttpClientTCK { + + @Override + protected DockerHttpClient createDockerHttpClient(URI dockerHost, SSLConfig sslConfig) { + return new ApacheDockerHttpClient.Builder() + .dockerHost(dockerHost) + .sslConfig(sslConfig) + .build(); + } +} diff --git a/docker-java-transport-jersey/pom.xml b/docker-java-transport-jersey/pom.xml index 3a257414b..a600c208d 100644 --- a/docker-java-transport-jersey/pom.xml +++ b/docker-java-transport-jersey/pom.xml @@ -15,6 +15,10 @@ https://github.com/docker-java/docker-java Java API Client for Docker + + com.github.dockerjava.transport.jersey + + ${project.groupId} @@ -22,11 +26,6 @@ ${project.version} - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson-jaxrs.version} - org.glassfish.jersey.connectors jersey-apache-connector @@ -68,6 +67,20 @@ junixsocket-native-common ${junixsocket.version} + + + org.slf4j + jcl-over-slf4j + 1.7.30 + test + + + + ${project.groupId} + docker-java-transport-tck + ${project.version} + test + diff --git a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerHttpClient.java b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerHttpClient.java index f15e97712..78a65cf63 100644 --- a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerHttpClient.java +++ b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerHttpClient.java @@ -42,6 +42,10 @@ import java.util.Map; import java.util.Objects; +/** + * @deprecated use Apache HttpClient 5-based transport + */ +@Deprecated public final class JerseyDockerHttpClient implements DockerHttpClient { public static final class Builder { diff --git a/docker-java-transport-jersey/src/test/java/com/github/dockerjava/transport/JerseyTests.java b/docker-java-transport-jersey/src/test/java/com/github/dockerjava/transport/JerseyTests.java new file mode 100644 index 000000000..64dfe3966 --- /dev/null +++ b/docker-java-transport-jersey/src/test/java/com/github/dockerjava/transport/JerseyTests.java @@ -0,0 +1,26 @@ +package com.github.dockerjava.transport; + +import com.github.dockerjava.jaxrs.JerseyDockerHttpClient; +import org.junit.Ignore; +import org.junit.Test; + +import java.net.URI; + +public class JerseyTests extends DockerHttpClientTCK { + + @Override + protected DockerHttpClient createDockerHttpClient(URI dockerHost, SSLConfig sslConfig) { + return new JerseyDockerHttpClient.Builder() + .dockerHost(dockerHost) + .sslConfig(sslConfig) + .connectTimeout(30 * 1000) + .build(); + } + + @Test + @Ignore("does not support hijacking") + @Override + public void testHijacking() throws Exception { + super.testHijacking(); + } +} diff --git a/docker-java-transport-netty/pom.xml b/docker-java-transport-netty/pom.xml index f9bc3bed9..42fdd34b7 100644 --- a/docker-java-transport-netty/pom.xml +++ b/docker-java-transport-netty/pom.xml @@ -15,6 +15,10 @@ https://github.com/docker-java/docker-java Java API Client for Docker + + com.github.dockerjava.transport.netty + + ${project.groupId} diff --git a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java index cc1c4452b..ed66a6db8 100644 --- a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java +++ b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyDockerCmdExecFactory.java @@ -1,6 +1,5 @@ package com.github.dockerjava.netty; -import static com.google.common.base.Preconditions.checkNotNull; import static java.util.Objects.nonNull; import java.io.IOException; @@ -9,6 +8,7 @@ import java.net.SocketAddress; import java.net.SocketTimeoutException; import java.security.Security; +import java.util.Objects; import java.util.concurrent.TimeUnit; import javax.net.ssl.SSLEngine; @@ -16,7 +16,7 @@ import com.github.dockerjava.core.AbstractDockerCmdExecFactory; import com.github.dockerjava.core.WebTarget; -import org.apache.commons.lang.SystemUtils; +import org.apache.commons.lang3.SystemUtils; import com.github.dockerjava.api.command.DockerCmdExecFactory; import com.github.dockerjava.core.DockerClientConfig; @@ -284,7 +284,7 @@ public SSLParameters enableHostNameVerification(SSLParameters sslParameters) { @Override public void close() throws IOException { - checkNotNull(eventLoopGroup, "Factory not initialized. You probably forgot to call init()!"); + Objects.requireNonNull(eventLoopGroup, "Factory not initialized. You probably forgot to call init()!"); eventLoopGroup.shutdownGracefully(); } @@ -331,7 +331,7 @@ protected synchronized void channelIdle(ChannelHandlerContext ctx, IdleStateEven } protected WebTarget getBaseResource() { - checkNotNull(baseResource, "Factory not initialized, baseResource not set. You probably forgot to call init()!"); + Objects.requireNonNull(baseResource, "Factory not initialized, baseResource not set. You probably forgot to call init()!"); return baseResource; } } diff --git a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyWebTarget.java b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyWebTarget.java index 17672b0b4..8f2ffce27 100644 --- a/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyWebTarget.java +++ b/docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyWebTarget.java @@ -17,7 +17,7 @@ import com.github.dockerjava.core.WebTarget; import com.google.common.collect.ImmutableSet; import io.netty.handler.codec.http.HttpConstants; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; diff --git a/docker-java-transport-okhttp/pom.xml b/docker-java-transport-okhttp/pom.xml index fda31db4f..2a0ae4227 100644 --- a/docker-java-transport-okhttp/pom.xml +++ b/docker-java-transport-okhttp/pom.xml @@ -15,6 +15,10 @@ https://github.com/docker-java/docker-java Java API Client for Docker + + com.github.dockerjava.transport.okhttp + + ${project.groupId} @@ -30,8 +34,15 @@ net.java.dev.jna - jna-platform - 5.8.0 + jna + 5.18.1 + + + + ${project.groupId} + docker-java-transport-tck + ${project.version} + test diff --git a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/OkDockerHttpClient.java b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/OkDockerHttpClient.java index 3778d8bb4..ee58acb09 100644 --- a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/OkDockerHttpClient.java +++ b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/OkDockerHttpClient.java @@ -169,9 +169,13 @@ private OkDockerHttpClient( .scheme(isSSL ? "https" : "http") .host(dockerHost.getHost()) .port(dockerHost.getPort()); + + if (dockerHost.getPath().length() > 0) { + baseUrlBuilder = baseUrlBuilder.encodedPath(dockerHost.getPath()); + } break; default: - baseUrlBuilder = HttpUrl.get(dockerHost.toString()).newBuilder(); + throw new IllegalArgumentException("Unsupported protocol scheme: " + dockerHost); } baseUrl = baseUrlBuilder.build(); } diff --git a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java index dc19b1351..d25bcb3d3 100644 --- a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java +++ b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java @@ -20,7 +20,7 @@ public Socket createSocket() { try { return UnixSocket.get(socketPath); } catch (IOException e) { - throw new RuntimeException(e); + throw new RuntimeException("Failed create socket with path " + socketPath, e); } } diff --git a/docker-java-transport-okhttp/src/test/java/com/github/dockerjava/transport/OkHttpClientTests.java b/docker-java-transport-okhttp/src/test/java/com/github/dockerjava/transport/OkHttpClientTests.java new file mode 100644 index 000000000..9a5b77ff3 --- /dev/null +++ b/docker-java-transport-okhttp/src/test/java/com/github/dockerjava/transport/OkHttpClientTests.java @@ -0,0 +1,17 @@ +package com.github.dockerjava.transport; + +import com.github.dockerjava.okhttp.OkDockerHttpClient; + +import java.net.URI; + +public class OkHttpClientTests extends DockerHttpClientTCK { + + @Override + protected DockerHttpClient createDockerHttpClient(URI dockerHost, SSLConfig sslConfig) { + return new OkDockerHttpClient.Builder() + .dockerHost(dockerHost) + .sslConfig(sslConfig) + .connectTimeout(30 * 100) + .build(); + } +} diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml new file mode 100644 index 000000000..d7253c786 --- /dev/null +++ b/docker-java-transport-tck/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + + + com.github.docker-java + docker-java-parent + 0-SNAPSHOT + ../pom.xml + + + docker-java-transport-tck + jar + + docker-java-transport-tck + https://github.com/docker-java/docker-java + Java API Client for Docker + + + com.github.dockerjava.transport.tck + + + + + ${project.groupId} + docker-java-core + ${project.version} + + + ${project.groupId} + docker-java-transport + ${project.version} + + + + org.assertj + assertj-core + 3.27.6 + + + + com.squareup.okhttp3 + mockwebserver + 3.14.9 + + + + org.testcontainers + testcontainers + 2.0.2 + + + + org.slf4j + slf4j-jdk14 + 1.7.35 + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + diff --git a/docker-java-transport-tck/src/main/java/com/github/dockerjava/transport/DockerHttpClientTCK.java b/docker-java-transport-tck/src/main/java/com/github/dockerjava/transport/DockerHttpClientTCK.java new file mode 100644 index 000000000..f90973be6 --- /dev/null +++ b/docker-java-transport-tck/src/main/java/com/github/dockerjava/transport/DockerHttpClientTCK.java @@ -0,0 +1,148 @@ +package com.github.dockerjava.transport; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.Frame; +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.DockerClientImpl; +import com.github.dockerjava.transport.DockerHttpClient.Request; +import com.github.dockerjava.transport.DockerHttpClient.Request.Method; +import com.github.dockerjava.transport.DockerHttpClient.Response; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.Test; +import org.testcontainers.DockerClientFactory; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.dockerclient.TransportConfig; + +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.net.URI; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.assertj.core.api.Assertions.assertThat; + +public abstract class DockerHttpClientTCK { + + protected abstract DockerHttpClient createDockerHttpClient(URI dockerHost, SSLConfig sslConfig); + + @Test + public void testHijacking() throws Exception { + try ( + DockerClient client = createDockerClient(); + + PipedOutputStream out = new PipedOutputStream(); + PipedInputStream in = new PipedInputStream(out); + + AttachContainerTestCallback callback = new AttachContainerTestCallback(); + + AttacheableContainer container = new AttacheableContainer() { + @Override + protected void containerIsCreated(String containerId) { + client.attachContainerCmd(containerId) + .withStdOut(true) + .withFollowStream(true) + .withStdIn(in) + .exec(callback); + } + }; + ) { + container.start(); + assertThat(callback.awaitStarted(5, SECONDS)).as("attached").isTrue(); + + String snippet = "hello world"; + out.write((snippet + "\n").getBytes()); + out.flush(); + + assertThat(callback.awaitCompletion(15, SECONDS)).as("completed").isTrue(); + assertThat(callback.toString()).contains("STDOUT: " + snippet); + } + } + + /** + * Test that docker-java supports path in DOCKER_HOST + * + * @see valid values + */ + @Test + public final void testPath() throws Exception { + try (MockWebServer server = new MockWebServer()) { + String dockerHost = server.url("/%20some/path/").toString() + .replace("http://", "tcp://"); + + try (DockerHttpClient client = createDockerHttpClient(dockerHost)) { + server.enqueue(new MockResponse().setResponseCode(200)); + ping(client); + assertThat(server.takeRequest().getPath()) + .as("recorded path") + .isEqualTo("/%20some/path/_ping"); + } + } + } + + private DockerHttpClient createDockerHttpClient() { + // Use Testcontainers to detect Docker environment + TransportConfig transportConfig = DockerClientFactory.instance().getTransportConfig(); + return createDockerHttpClient(transportConfig.getDockerHost(), transportConfig.getSslConfig()); + } + + private DockerHttpClient createDockerHttpClient(String dockerHost) { + return createDockerHttpClient(URI.create(dockerHost), null); + } + + private DockerClient createDockerClient() { + return createDockerClient(createDockerHttpClient()); + } + + private DockerClient createDockerClient(DockerHttpClient dockerHttpClient) { + return DockerClientImpl.getInstance( + DefaultDockerClientConfig.createDefaultConfigBuilder().build(), + dockerHttpClient + ); + } + + private void ping(DockerHttpClient client) { + Request pingRequest = Request.builder() + .method(Method.GET) + .path("/_ping") + .build(); + + try (Response response = client.execute(pingRequest)) { + assertThat(response.getStatusCode()) + .as("status code") + .isEqualTo(200); + } + } + + private static class AttachContainerTestCallback extends ResultCallback.Adapter { + + private final StringBuffer log = new StringBuffer(); + + @Override + public void onNext(Frame item) { + log.append(item.toString()); + super.onNext(item); + } + + @Override + public String toString() { + return log.toString(); + } + } + + private static class AttacheableContainer extends GenericContainer { + + private AttacheableContainer() { + super("busybox:1.35.0"); + + withCommand("/bin/sh", "-c", "read line && echo $line"); + withCreateContainerCmdModifier(it -> { + it.withTty(false); + it.withAttachStdin(true); + it.withAttachStdout(true); + it.withAttachStderr(true); + it.withStdinOpen(true); + }); + } + } +} diff --git a/docker-java-transport-zerodep/pom.xml b/docker-java-transport-zerodep/pom.xml index 7d3fb4034..3cccafa33 100644 --- a/docker-java-transport-zerodep/pom.xml +++ b/docker-java-transport-zerodep/pom.xml @@ -15,6 +15,10 @@ https://github.com/docker-java/docker-java Java API Client for Docker + + com.github.dockerjava.transport.zerodep + + ${project.groupId} diff --git a/docker-java-transport/pom.xml b/docker-java-transport/pom.xml index a7e76095d..8be456dd1 100644 --- a/docker-java-transport/pom.xml +++ b/docker-java-transport/pom.xml @@ -15,6 +15,10 @@ https://github.com/docker-java/docker-java Java API Client for Docker + + com.github.dockerjava.transport + + com.google.code.findbugs @@ -26,14 +30,14 @@ org.immutables value - 2.8.2 + 2.10.1 provided net.java.dev.jna jna - 5.8.0 + 5.18.1 provided diff --git a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java index 0a9338771..eb7a49b51 100644 --- a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java +++ b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java @@ -3,11 +3,14 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketException; +import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.SocketChannel; +import java.nio.channels.WritableByteChannel; public class UnixSocket extends AbstractSocket { @@ -22,7 +25,8 @@ public class UnixSocket extends AbstractSocket { public static Socket get(String path) throws IOException { try { return new UnixSocket(path); - } catch (Exception e) { + } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | + IllegalAccessException e) { //noinspection deprecation return DomainSocket.get(path); } @@ -32,7 +36,8 @@ public static Socket get(String path) throws IOException { private final SocketChannel socketChannel; - private UnixSocket(String path) throws Exception { + private UnixSocket(String path) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, + IllegalAccessException, IOException { Class unixDomainSocketAddress = Class.forName("java.net.UnixDomainSocketAddress"); this.socketAddress = (SocketAddress) unixDomainSocketAddress.getMethod("of", String.class) @@ -67,7 +72,7 @@ public OutputStream getOutputStream() throws IOException { throw new SocketException("Socket output is shutdown"); } - return Channels.newOutputStream(socketChannel); + return Channels.newOutputStream(new WrappedWritableByteChannel()); } @Override @@ -85,4 +90,22 @@ public void close() throws IOException { super.close(); this.socketChannel.close(); } + + private class WrappedWritableByteChannel implements WritableByteChannel { + + @Override + public int write(ByteBuffer src) throws IOException { + return UnixSocket.this.socketChannel.write(src); + } + + @Override + public boolean isOpen() { + return UnixSocket.this.socketChannel.isOpen(); + } + + @Override + public void close() throws IOException { + UnixSocket.this.socketChannel.close(); + } + } } diff --git a/docker-java/pom.xml b/docker-java/pom.xml index b9db85b9c..3cfd7f255 100644 --- a/docker-java/pom.xml +++ b/docker-java/pom.xml @@ -15,6 +15,10 @@ https://github.com/docker-java/docker-java Java API Client for Docker + + com.github.dockerjava + + ${project.groupId} @@ -114,30 +118,30 @@ org.awaitility awaitility - 4.0.1 + 4.3.0 test com.fasterxml.jackson.core jackson-databind - - 2.8.8 + + 2.20.1 test com.fasterxml.jackson.core jackson-annotations - - 2.8.8 + + 2.20 test org.projectlombok lombok - 1.18.18 + 1.18.38 provided diff --git a/docker-java/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/docker-java/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java index a3e4c3909..8100f285e 100644 --- a/docker-java/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java +++ b/docker-java/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java @@ -94,7 +94,7 @@ public DockerClient build() { } else { Logger log = LoggerFactory.getLogger(DockerClientBuilder.class); log.warn( - "'dockerHttpClient' should be set." + + "'dockerHttpClient' should be set. " + "Falling back to Jersey, will be an error in future releases." ); diff --git a/docker-java/src/test/java/com/github/dockerjava/api/ModelsSerializableTest.java b/docker-java/src/test/java/com/github/dockerjava/api/ModelsSerializableTest.java index 18bc76ea8..1c7c1de6c 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/ModelsSerializableTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/ModelsSerializableTest.java @@ -8,8 +8,7 @@ import com.github.dockerjava.api.model.PushResponseItem; import com.github.dockerjava.api.model.ResponseItem; import com.google.common.reflect.ClassPath.ClassInfo; -import org.apache.commons.lang.reflect.FieldUtils; -import org.hamcrest.MatcherAssert; +import org.apache.commons.lang3.reflect.FieldUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/docker-java/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java b/docker-java/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java index 0cf5141d4..23ef4b7f2 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java @@ -28,7 +28,9 @@ public enum CommandJSONSamples implements JSONResourceRef { inspectContainerResponse_full_1_21, inspectContainerResponse_full_1_26a, inspectContainerResponse_full_1_26b, - inspectContainerResponse_empty; + inspectContainerResponse_empty, + updateContainerResponse_empty, + updateContainerResponse_warnings; @Override public String getFileName() { diff --git a/docker-java/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java b/docker-java/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java index 062088316..12105e8a1 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/command/InspectContainerResponseTest.java @@ -56,11 +56,11 @@ public void roundTrip_full() throws IOException { final InspectContainerResponse response = responses[0]; // Check volumes: https://github.com/docker-java/docker-java/issues/211 - assertEquals(response.getVolumes().length, 2); - assertEquals(response.getVolumesRW().length, 2); - assertEquals(response.getVolumes()[1].getContainerPath(), "/bar/foo/myvol2"); - assertEquals(response.getVolumes()[1].getHostPath(), "/path2"); - assertEquals(response.getVolumesRW()[1].getVolume().getPath(), "/bar/foo/myvol2"); + assertEquals(2, response.getVolumes().length); + assertEquals(2, response.getVolumesRW().length); + assertEquals("/bar/foo/myvol2" ,response.getVolumes()[1].getContainerPath()); + assertEquals("/path2", response.getVolumes()[1].getHostPath()); + assertEquals("/bar/foo/myvol2", response.getVolumesRW()[1].getVolume().getPath()); assertFalse(response.getVolumesRW()[1].getAccessMode().toBoolean()); assertTrue(response.getVolumesRW()[0].getAccessMode().toBoolean()); assertThat(response.getLogPath(), is("/mnt/sda1/var/lib/docker/containers/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1/469e5edd8d5b33e3c905a7ffc97360ec6ee211d6782815fbcd144568045819e1-json.log")); @@ -76,11 +76,11 @@ public void roundTrip_full_healthcheck() throws IOException { type ); - assertEquals(response.getState().getHealth().getStatus(), "healthy"); - assertEquals(response.getState().getHealth().getFailingStreak(), new Integer(0)); - assertEquals(response.getState().getHealth().getLog().size(), 2); - assertEquals(response.getState().getHealth().getLog().get(0).getOutput(), "Hello"); - assertEquals(response.getState().getHealth().getLog().get(1).getOutput(), "World"); + assertEquals("healthy", response.getState().getHealth().getStatus()); + assertEquals(new Integer(0), response.getState().getHealth().getFailingStreak()); + assertEquals(2, response.getState().getHealth().getLog().size()); + assertEquals("Hello", response.getState().getHealth().getLog().get(0).getOutput()); + assertEquals("World", response.getState().getHealth().getLog().get(1).getOutput()); } @Test @@ -108,11 +108,11 @@ public void roundTrip_1_26a_full() throws IOException { final InspectContainerResponse response = responses[0]; final List mounts = response.getMounts(); - assertEquals(mounts.size(), 1); + assertEquals(1, mounts.size()); final InspectContainerResponse.Mount mount = mounts.get(0); final Volume volume = mount.getDestination(); - assertEquals(volume.getPath(), "/var/lib/postgresql/data"); + assertEquals("/var/lib/postgresql/data", volume.getPath()); } @Test @@ -124,11 +124,11 @@ public void roundTrip_1_26b_full() throws IOException { final InspectContainerResponse response = responses[0]; final List mounts = response.getMounts(); - assertEquals(mounts.size(), 1); + assertEquals(1, mounts.size()); final InspectContainerResponse.Mount mount = mounts.get(0); final Volume volume = mount.getDestination(); - assertEquals(volume.getPath(), "/srv/test"); + assertEquals("/srv/test", volume.getPath()); } @Test diff --git a/docker-java/src/test/java/com/github/dockerjava/api/command/UpdateContainerResponseTest.java b/docker-java/src/test/java/com/github/dockerjava/api/command/UpdateContainerResponseTest.java new file mode 100644 index 000000000..300a5c324 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/api/command/UpdateContainerResponseTest.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.UpdateContainerResponse; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static com.github.dockerjava.test.serdes.JSONTestHelper.testRoundTrip; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +public class UpdateContainerResponseTest { + @Test + public void roundTrip_empty() throws IOException { + UpdateContainerResponse response = testRoundTrip(CommandJSONSamples.updateContainerResponse_empty, UpdateContainerResponse.class); + assertNull(response.getWarnings()); + } + + @Test + public void roundTrip_warnings() throws IOException { + UpdateContainerResponse response = testRoundTrip(CommandJSONSamples.updateContainerResponse_warnings, + UpdateContainerResponse.class); + + List warnings = response.getWarnings(); + assertNotNull(warnings); + assertEquals(1, warnings.size()); + + final String warning = warnings.get(0); + assertEquals("Published ports are discarded when using host network mode", warning); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java index 9d08843dc..d5ff7044a 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/AccessModeTest.java @@ -15,17 +15,17 @@ public class AccessModeTest { @Test public void defaultAccessMode() { - assertEquals(AccessMode.DEFAULT, rw); + assertEquals(rw, AccessMode.DEFAULT); } @Test public void stringify() { - assertEquals(AccessMode.rw.toString(), "rw"); + assertEquals("rw", AccessMode.rw.toString()); } @Test public void fromString() { - assertEquals(AccessMode.valueOf("rw"), rw); + assertEquals(rw, AccessMode.valueOf("rw")); } @Test diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java index 86120733b..ae3e4a91b 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/AuthConfigTest.java @@ -17,7 +17,7 @@ public class AuthConfigTest { @Test - public void defaultServerAddress() throws Exception { + public void defaultServerAddress() { assertEquals(new AuthConfig().getRegistryAddress(), "https://index.docker.io/v1/"); } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java index 663231151..d31a66dde 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java @@ -166,6 +166,17 @@ public void parseReadWriteShared() { assertThat(bind.getPropagationMode(), is(PropagationMode.SHARED)); } + @Test + public void parseReadWriteRshared() { + Bind bind = Bind.parse("/host:/container:rw,rshared"); + assertThat(bind.getPath(), is("/host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.RSHARED)); + } + @Test public void parseReadWriteSlave() { Bind bind = Bind.parse("/host:/container:rw,slave"); @@ -177,6 +188,17 @@ public void parseReadWriteSlave() { assertThat(bind.getPropagationMode(), is(PropagationMode.SLAVE)); } + @Test + public void parseReadWriteRslave() { + Bind bind = Bind.parse("/host:/container:rw,rslave"); + assertThat(bind.getPath(), is("/host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.RSLAVE)); + } + @Test public void parseReadWritePrivate() { Bind bind = Bind.parse("/host:/container:rw,private"); @@ -188,6 +210,17 @@ public void parseReadWritePrivate() { assertThat(bind.getPropagationMode(), is(PropagationMode.PRIVATE)); } + @Test + public void parseReadWriteRprivate() { + Bind bind = Bind.parse("/host:/container:rw,rprivate"); + assertThat(bind.getPath(), is("/host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.RPRIVATE)); + } + @Test public void parseReadOnly() { Bind bind = Bind.parse("/host:/container:ro"); @@ -284,16 +317,31 @@ public void toStringReadWriteShared() { assertThat(Bind.parse("/host:/container:rw,shared").toString(), is("/host:/container:rw,shared")); } + @Test + public void toStringReadWriteRshared() { + assertThat(Bind.parse("/host:/container:rw,rshared").toString(), is("/host:/container:rw,rshared")); + } + @Test public void toStringReadWriteSlave() { assertThat(Bind.parse("/host:/container:rw,slave").toString(), is("/host:/container:rw,slave")); } + @Test + public void toStringReadWriteRslave() { + assertThat(Bind.parse("/host:/container:rw,rslave").toString(), is("/host:/container:rw,rslave")); + } + @Test public void toStringReadWritePrivate() { assertThat(Bind.parse("/host:/container:rw,private").toString(), is("/host:/container:rw,private")); } + @Test + public void toStringReadWriteRprivate() { + assertThat(Bind.parse("/host:/container:rw,rprivate").toString(), is("/host:/container:rw,rprivate")); + } + @Test public void toStringDefaultAccessMode() { assertThat(Bind.parse("/host:/container").toString(), is("/host:/container:rw")); diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java index e76d2437c..b0652d945 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java @@ -11,13 +11,16 @@ public class CapabilityTest { @Test public void serializeCapability() throws Exception { String json = JSONTestHelper.getMapper().writeValueAsString(Capability.ALL); - assertEquals(json, "\"ALL\""); + assertEquals("\"ALL\"", json); } @Test public void deserializeCapability() throws Exception { Capability capability = JSONTestHelper.getMapper().readValue("\"ALL\"", Capability.class); - assertEquals(capability, Capability.ALL); + assertEquals(Capability.ALL, capability); + + Capability compatibleCapability = JSONTestHelper.getMapper().readValue("\"CAP_ALL\"", Capability.class); + assertEquals(Capability.ALL, compatibleCapability); } @Test(expected = JsonMappingException.class) diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/DeviceTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/DeviceTest.java index 18c6fbbc8..9d191fe52 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/DeviceTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/DeviceTest.java @@ -54,7 +54,7 @@ public class DeviceTest { }}; @Test - public void testParse() throws Exception { + public void testParse() { assertThat(Device.parse("/dev/sda:/dev/xvdc:r"), equalTo(new Device("r", "/dev/xvdc", "/dev/sda"))); diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java index 20999a92f..fce761380 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortTest.java @@ -16,13 +16,13 @@ public class ExposedPortTest { @Test public void parsePortAndProtocol() { ExposedPort exposedPort = ExposedPort.parse("80/tcp"); - assertEquals(exposedPort, new ExposedPort(80, TCP)); + assertEquals(new ExposedPort(80, TCP), exposedPort); } @Test public void parsePortOnly() { ExposedPort exposedPort = ExposedPort.parse("80"); - assertEquals(exposedPort, new ExposedPort(80, DEFAULT)); + assertEquals(new ExposedPort(80, DEFAULT), exposedPort); } @Test @@ -43,7 +43,7 @@ public void parseNull() { @Test public void stringify() { - assertEquals(ExposedPort.parse("80/tcp").toString(), "80/tcp"); + assertEquals("80/tcp", ExposedPort.parse("80/tcp").toString()); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortsTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortsTest.java index 456e65ca4..f46dddc68 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortsTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/ExposedPortsTest.java @@ -51,7 +51,7 @@ public void usesFromJson() throws Exception { } @Test - public void usesFromJsonWithDuplicate() throws Exception { + public void usesFromJsonWithDuplicate() { ExposedPorts ports = new ExposedPorts( new ExposedPort(80, InternetProtocol.UDP), new ExposedPort(80), diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/HostConfigTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/HostConfigTest.java index d69c31ba9..5e13103dd 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/HostConfigTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/HostConfigTest.java @@ -8,7 +8,7 @@ public class HostConfigTest { @Test - public void testNewObjectsEqual() throws Exception { + public void testNewObjectsEqual() { assertThat(HostConfig.newHostConfig(), equalTo(HostConfig.newHostConfig())); } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java index c39706e51..3b8efa2c5 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/IdentifierTest.java @@ -17,26 +17,26 @@ public void testFromCompoundString() throws Exception { Identifier i3A = Identifier.fromCompoundString("10.0.0.1:123/jim:latest"); assertTrue(!i1.tag.isPresent()); - assertEquals(i1.repository.name, "10.0.0.1/jim"); + assertEquals("10.0.0.1/jim", i1.repository.name); assertTrue(i2.tag.isPresent()); - assertEquals(i2.tag.get(), "123"); - assertEquals(i2.repository.name, "10.0.0.1/jim"); + assertEquals("123", i2.tag.get()); + assertEquals("10.0.0.1/jim", i2.repository.name); assertTrue(i3.tag.isPresent()); - assertEquals(i3.tag.get(), "124"); - assertEquals(i3.repository.name, "10.0.0.1:123/jim"); - assertEquals(i3.repository.getURL().getPort(), 123); - assertEquals(i3A.tag.get(), "latest"); + assertEquals("124", i3.tag.get()); + assertEquals("10.0.0.1:123/jim", i3.repository.name); + assertEquals(123, i3.repository.getURL().getPort()); + assertEquals("latest", i3A.tag.get()); Identifier i4 = Identifier.fromCompoundString("centos:latest"); assertTrue(i4.tag.isPresent()); - assertEquals(i4.tag.get(), "latest"); + assertEquals("latest", i4.tag.get()); Identifier i5 = Identifier.fromCompoundString("busybox"); assertTrue(!i5.tag.isPresent()); Identifier i6 = Identifier.fromCompoundString("10.0.0.1:5000/my-test-image:1234"); - assertEquals(i6.repository.getPath(), "my-test-image"); + assertEquals("my-test-image", i6.repository.getPath()); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java index 5efb8d2c3..0421e1411 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/InternetProtocolTest.java @@ -13,22 +13,22 @@ public class InternetProtocolTest { @Test public void defaultProtocol() { - assertEquals(InternetProtocol.DEFAULT, TCP); + assertEquals(TCP, InternetProtocol.DEFAULT); } @Test public void stringify() { - assertEquals(TCP.toString(), "tcp"); + assertEquals("tcp", TCP.toString()); } @Test public void parseUpperCase() { - assertEquals(InternetProtocol.parse("TCP"), TCP); + assertEquals(TCP, InternetProtocol.parse("TCP")); } @Test public void parseLowerCase() { - assertEquals(InternetProtocol.parse("tcp"), TCP); + assertEquals(TCP, InternetProtocol.parse("tcp")); } @Test diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/LinkTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/LinkTest.java index 18363a9ee..b780eb22f 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/LinkTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/LinkTest.java @@ -14,15 +14,15 @@ public class LinkTest { @Test public void parse() { Link link = Link.parse("name:alias"); - assertEquals(link.getName(), "name"); - assertEquals(link.getAlias(), "alias"); + assertEquals("name", link.getName()); + assertEquals("alias", link.getAlias()); } @Test public void parseWithContainerNames() { Link link = Link.parse("/name:/conatiner/alias"); - assertEquals(link.getName(), "name"); - assertEquals(link.getAlias(), "alias"); + assertEquals("name", link.getName()); + assertEquals("alias", link.getAlias()); } @Test @@ -43,7 +43,7 @@ public void parseNull() { @Test public void stringify() { - assertEquals(Link.parse("name:alias").toString(), "name:alias"); + assertEquals("name:alias", Link.parse("name:alias").toString()); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java index 3849a6094..9190cfda4 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/PortBindingTest.java @@ -23,27 +23,27 @@ public void fullDefinition() { @Test public void noProtocol() { - assertEquals(PortBinding.parse("127.0.0.1:80:8080"), new PortBinding(Binding.bindIpAndPort("127.0.0.1", 80), TCP_8080)); + assertEquals(new PortBinding(Binding.bindIpAndPort("127.0.0.1", 80), TCP_8080), PortBinding.parse("127.0.0.1:80:8080")); } @Test public void noHostIp() { - assertEquals(PortBinding.parse("80:8080/tcp"), new PortBinding(Binding.bindPort(80), TCP_8080)); + assertEquals(new PortBinding(Binding.bindPort(80), TCP_8080), PortBinding.parse("80:8080/tcp")); } @Test public void portsOnly() { - assertEquals(PortBinding.parse("80:8080"), new PortBinding(Binding.bindPort(80), TCP_8080)); + assertEquals(new PortBinding(Binding.bindPort(80), TCP_8080), PortBinding.parse("80:8080")); } @Test public void exposedPortOnly() { - assertEquals(PortBinding.parse("8080"), new PortBinding(Binding.empty(), TCP_8080)); + assertEquals(new PortBinding(Binding.empty(), TCP_8080), PortBinding.parse("8080")); } @Test public void dynamicHostPort() { - assertEquals(PortBinding.parse("127.0.0.1::8080"), new PortBinding(Binding.bindIp("127.0.0.1"), TCP_8080)); + assertEquals(new PortBinding(Binding.bindIp("127.0.0.1"), TCP_8080), PortBinding.parse("127.0.0.1::8080")); } @Test diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/PortsAddBindingsTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/PortsAddBindingsTest.java index 02b3047e7..484e5897f 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/PortsAddBindingsTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/PortsAddBindingsTest.java @@ -36,9 +36,9 @@ public void addTwoBindingsForDifferentExposedPorts() { Map bindings = ports.getBindings(); // two keys with one value each - assertEquals(bindings.size(), 2); - assertArrayEquals(bindings.get(TCP_80), new Binding[] {BINDING_8080}); - assertArrayEquals(bindings.get(TCP_90), new Binding[] {BINDING_9090}); + assertEquals(2, bindings.size()); + assertArrayEquals(new Binding[] {BINDING_8080}, bindings.get(TCP_80)); + assertArrayEquals(new Binding[] {BINDING_9090}, bindings.get(TCP_90)); } @Test @@ -47,8 +47,8 @@ public void addTwoBindingsForSameExposedPort() { Map bindings = ports.getBindings(); // one key with two values - assertEquals(bindings.size(), 1); - assertArrayEquals(bindings.get(TCP_80), new Binding[] {BINDING_8080, BINDING_9090}); + assertEquals(1, bindings.size()); + assertArrayEquals(new Binding[] {BINDING_8080, BINDING_9090}, bindings.get(TCP_80)); } @Test @@ -56,7 +56,7 @@ public void addNullBindings() { ports.add(new PortBinding(null, TCP_80)); Map bindings = ports.getBindings(); // one key with two values - assertEquals(bindings.size(), 1); + assertEquals(1, bindings.size()); assertNull(bindings.get(TCP_80)); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/PortsSerializingTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/PortsSerializingTest.java index ecbdd9a49..2f528556f 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/PortsSerializingTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/PortsSerializingTest.java @@ -19,12 +19,12 @@ public class PortsSerializingTest { public void deserializingPortWithMultipleBindings() throws Exception { Ports ports = JSONTestHelper.getMapper().readValue(jsonWithDoubleBindingForOnePort, Ports.class); Map map = ports.getBindings(); - assertEquals(map.size(), 1); + assertEquals(1, map.size()); Binding[] bindings = map.get(ExposedPort.tcp(80)); - assertEquals(bindings.length, 2); - assertEquals(bindings[0], new Binding("10.0.0.1", "80")); - assertEquals(bindings[1], new Binding("10.0.0.2", "80")); + assertEquals(2, bindings.length); + assertEquals(new Binding("10.0.0.1", "80"), bindings[0]); + assertEquals(new Binding("10.0.0.2", "80"), bindings[1]); } @Test @@ -32,20 +32,20 @@ public void serializingPortWithMultipleBindings() throws Exception { Ports ports = new Ports(); ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.1", "80")); ports.bind(ExposedPort.tcp(80), new Binding("10.0.0.2", "80")); - assertEquals(JSONTestHelper.getMapper().writeValueAsString(ports), jsonWithDoubleBindingForOnePort); + assertEquals(jsonWithDoubleBindingForOnePort, JSONTestHelper.getMapper().writeValueAsString(ports)); } @Test public void serializingEmptyBinding() throws Exception { Ports ports = new Ports(ExposedPort.tcp(80), new Binding(null, null)); - assertEquals(JSONTestHelper.getMapper().writeValueAsString(ports), "{\"80/tcp\":[{\"HostIp\":\"\",\"HostPort\":\"\"}]}"); + assertEquals("{\"80/tcp\":[{\"HostIp\":\"\",\"HostPort\":\"\"}]}", JSONTestHelper.getMapper().writeValueAsString(ports)); } @Test public void deserializingPortWithNullBindings() throws Exception { Ports ports = JSONTestHelper.getMapper().readValue(jsonWithNullBindingForOnePort, Ports.class); Map map = ports.getBindings(); - assertEquals(map.size(), 1); + assertEquals(1, map.size()); assertNull(map.get(ExposedPort.tcp(80))); } @@ -54,6 +54,6 @@ public void deserializingPortWithNullBindings() throws Exception { public void serializingWithNullBindings() throws Exception { Ports ports = new Ports(); ports.bind(ExposedPort.tcp(80), null); - assertEquals(JSONTestHelper.getMapper().writeValueAsString(ports), jsonWithNullBindingForOnePort); + assertEquals(jsonWithNullBindingForOnePort, JSONTestHelper.getMapper().writeValueAsString(ports)); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java index 486badd55..f73036864 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java @@ -29,6 +29,14 @@ * @author Zach Marshall */ public class PullResponseItemTest { + @Test + public void imageAlreadyExists() throws IOException { + PullResponseItem response = testRoundTrip(PullResponseJSONSamples.pullImageResponse_alreadyExists, + PullResponseItem.class); + assertTrue(response.isPullSuccessIndicated()); + assertFalse(response.isErrorIndicated()); + } + @Test public void pullNewerImage() throws IOException { PullResponseItem response = testRoundTrip(PullResponseJSONSamples.pullImageResponse_newerImage, diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java b/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java index 31cdf0f3b..4997a390a 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java @@ -23,7 +23,9 @@ * @author Zach Marshall */ public enum PullResponseJSONSamples implements JSONResourceRef { - pullImageResponse_legacy, pullImageResponse_error, pullImageResponse_newerImage, pullImageResponse_upToDate; + pullImageResponse_legacy, pullImageResponse_error, + pullImageResponse_newerImage, pullImageResponse_upToDate, + pullImageResponse_alreadyExists; @Override public String getFileName() { diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicyParsingTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicyParsingTest.java index fb79c0ca9..57dbc1b9f 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicyParsingTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicyParsingTest.java @@ -13,32 +13,32 @@ public class RestartPolicyParsingTest { @Test - public void noRestart() throws Exception { - assertEquals(RestartPolicy.parse("no"), RestartPolicy.noRestart()); + public void noRestart() { + assertEquals(RestartPolicy.noRestart(), RestartPolicy.parse("no")); } @Test - public void alwaysRestart() throws Exception { - assertEquals(RestartPolicy.parse("always"), RestartPolicy.alwaysRestart()); + public void alwaysRestart() { + assertEquals(RestartPolicy.alwaysRestart(), RestartPolicy.parse("always")); } @Test - public void unlessStoppedRestart() throws Exception { - assertEquals(RestartPolicy.parse("unless-stopped"), RestartPolicy.unlessStoppedRestart()); + public void unlessStoppedRestart() { + assertEquals(RestartPolicy.unlessStoppedRestart(), RestartPolicy.parse("unless-stopped")); } @Test - public void onFailureRestart() throws Exception { - assertEquals(RestartPolicy.parse("on-failure"), RestartPolicy.onFailureRestart(0)); + public void onFailureRestart() { + assertEquals(RestartPolicy.onFailureRestart(0), RestartPolicy.parse("on-failure")); } @Test - public void onFailureRestartWithCount() throws Exception { - assertEquals(RestartPolicy.parse("on-failure:2"), RestartPolicy.onFailureRestart(2)); + public void onFailureRestartWithCount() { + assertEquals(RestartPolicy.onFailureRestart(2), RestartPolicy.parse("on-failure:2")); } @Test - public void illegalSyntax() throws Exception { + public void illegalSyntax() { expectedEx.expect(IllegalArgumentException.class); expectedEx.expectMessage("Error parsing RestartPolicy 'nonsense'"); @@ -46,7 +46,7 @@ public void illegalSyntax() throws Exception { } @Test - public void illegalRetryCount() throws Exception { + public void illegalRetryCount() { expectedEx.expect(IllegalArgumentException.class); expectedEx.expectMessage("Error parsing RestartPolicy 'on-failure:X'"); diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicySerializingTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicySerializingTest.java index 6e4524fd5..c9c6a897d 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicySerializingTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicySerializingTest.java @@ -15,35 +15,35 @@ public class RestartPolicySerializingTest { // --restart no public void noRestart() throws Exception { String json = JSONTestHelper.getMapper().writeValueAsString(RestartPolicy.noRestart()); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"\"}"); + assertEquals("{\"MaximumRetryCount\":0,\"Name\":\"\"}", json); } @Test // --restart always public void alwaysRestart() throws Exception { String json = JSONTestHelper.getMapper().writeValueAsString(RestartPolicy.alwaysRestart()); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"always\"}"); + assertEquals("{\"MaximumRetryCount\":0,\"Name\":\"always\"}", json); } @Test // --restart unless-stopped public void unlessStoppedRestart() throws Exception { String json = JSONTestHelper.getMapper().writeValueAsString(RestartPolicy.unlessStoppedRestart()); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"unless-stopped\"}"); + assertEquals("{\"MaximumRetryCount\":0,\"Name\":\"unless-stopped\"}", json); } @Test // --restart on-failure public void onFailureRestart() throws Exception { String json = JSONTestHelper.getMapper().writeValueAsString(RestartPolicy.onFailureRestart(0)); - assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"on-failure\"}"); + assertEquals("{\"MaximumRetryCount\":0,\"Name\":\"on-failure\"}", json); } @Test // --restart on-failure:2 public void onFailureRestartWithCount() throws Exception { String json = JSONTestHelper.getMapper().writeValueAsString(RestartPolicy.onFailureRestart(2)); - assertEquals(json, "{\"MaximumRetryCount\":2,\"Name\":\"on-failure\"}"); + assertEquals("{\"MaximumRetryCount\":2,\"Name\":\"on-failure\"}", json); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicyToStringTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicyToStringTest.java index 4d9fa8cbc..e32f97341 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicyToStringTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/RestartPolicyToStringTest.java @@ -18,8 +18,8 @@ public static Object[][] restartPolicies() { public String policy; @Test - public void serializationWithoutCount() throws Exception { - assertEquals(RestartPolicy.parse(policy).toString(), policy); + public void serializationWithoutCount() { + assertEquals(policy, RestartPolicy.parse(policy).toString()); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java index b413cf029..7f38eb0f0 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeBindsTest.java @@ -28,9 +28,9 @@ public void t() throws IOException { String s = "{\"/data\":\"/some/path\"}"; VolumeBinds volumeBinds = JSONTestHelper.getMapper().readValue(s, VolumeBinds.class); VolumeBind[] binds = volumeBinds.getBinds(); - assertEquals(binds.length, 1); - assertEquals(binds[0].getHostPath(), "/some/path"); - assertEquals(binds[0].getContainerPath(), "/data"); + assertEquals(1, binds.length); + assertEquals("/some/path", binds[0].getHostPath()); + assertEquals("/data", binds[0].getContainerPath()); } @Test(expected = JsonMappingException.class) diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeFromSerializingTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeFromSerializingTest.java index ae343047c..6155f88e3 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeFromSerializingTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeFromSerializingTest.java @@ -18,7 +18,7 @@ public void deserializing() throws Exception { @Test public void serializing() throws Exception { VolumesFrom volumeFrom = new VolumesFrom("container1", AccessMode.ro); - assertEquals(JSONTestHelper.getMapper().writeValueAsString(volumeFrom), json); + assertEquals(json, JSONTestHelper.getMapper().writeValueAsString(volumeFrom)); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeTest.java index cb1c4befd..20e28a55d 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/VolumeTest.java @@ -7,6 +7,6 @@ public class VolumeTest { @Test public void getPath() { - assertEquals(new Volume("/path").getPath(), "/path"); + assertEquals("/path", new Volume("/path").getPath()); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/AttachContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/AttachContainerCmdIT.java index 6913c21c0..dde47e2d8 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/AttachContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/AttachContainerCmdIT.java @@ -5,16 +5,13 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.StreamType; -import org.junit.Assume; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.ByteArrayInputStream; import java.io.File; -import java.io.InputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.util.concurrent.CountDownLatch; @@ -44,8 +41,6 @@ public class AttachContainerCmdIT extends CmdIT { public void attachContainerWithStdin() throws Exception { DockerClient dockerClient = dockerRule.getClient(); - Assume.assumeTrue("supports stdin attach", getFactoryType().supportsStdinAttach()); - String snippet = "hello world"; CreateContainerResponse container = dockerClient.createContainerCmd("busybox") @@ -63,7 +58,7 @@ public void attachContainerWithStdin() throws Exception { AttachContainerTestCallback callback = new AttachContainerTestCallback() { @Override public void onNext(Frame frame) { - assertEquals(frame.getStreamType(), StreamType.STDOUT); + assertEquals(StreamType.STDOUT, frame.getStreamType()); super.onNext(frame); } }; @@ -183,53 +178,6 @@ public void onNext(Frame frame) { assertThat(callback.toString(), containsString("stdout\r\nstderr")); } - @Test - public void attachContainerStdinUnsupported() throws Exception { - - DockerClient dockerClient = dockerRule.getClient(); - Assume.assumeFalse("does not support stdin attach", getFactoryType().supportsStdinAttach()); - expectedException.expect(UnsupportedOperationException.class); - - String snippet = "hello world"; - - CreateContainerResponse container = dockerClient.createContainerCmd(DEFAULT_IMAGE) - .withCmd("echo", snippet) - .withTty(false) - .withAttachStdin(true) - .withAttachStdout(true) - .withAttachStderr(true) - .exec(); - - LOG.info("Created container: {}", container.toString()); - assertThat(container.getId(), not(is(emptyString()))); - - AttachContainerTestCallback callback = new AttachContainerTestCallback() { - @Override - public void onNext(Frame frame) { - assertThat(frame.getStreamType(), equalTo(StreamType.STDOUT)); - super.onNext(frame); - } - }; - - InputStream stdin = new ByteArrayInputStream("".getBytes()); - - dockerClient.attachContainerCmd(container.getId()) - .withStdErr(true) - .withStdOut(true) - .withFollowStream(true) - .withLogs(true) - .withStdIn(stdin) - .exec(callback); - - assertFalse("Processing of the response is not expected to be started" + - " because `attachContainerCmd` with stdin is not supported", callback.awaitStarted(5, SECONDS)); - - dockerClient.startContainerCmd(container.getId()).exec(); - - callback.awaitCompletion(30, TimeUnit.SECONDS); - callback.close(); - } - /** * {@link ResultCallback#onComplete()} should be called immediately after * container exit. It was broken for Netty and TLS connection. diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/AuthCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/AuthCmdIT.java index 887f97334..d37bea819 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/AuthCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/AuthCmdIT.java @@ -19,7 +19,7 @@ public class AuthCmdIT extends CmdIT { @Test - public void testAuth() throws Exception { + public void testAuth() { assumeThat("Fails on 1.22. Temporary disabled.", dockerRule, apiVersionGreater(VERSION_1_22)); AuthResponse response = dockerRule.getClient().authCmd().exec(); @@ -30,7 +30,7 @@ public void testAuth() throws Exception { @Ignore("Disabled because of 500/InternalServerException") @Test - public void testAuthInvalid() throws Exception { + public void testAuthInvalid() { assertThrows("Wrong login/password, please try again", UnauthorizedException.class, () -> { DockerClientBuilder.getInstance(dockerRule.config("garbage")) .build() diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/BuildImageCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/BuildImageCmdIT.java index cd9b1ef9c..d514ed59c 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/BuildImageCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/BuildImageCmdIT.java @@ -163,21 +163,21 @@ private String execBuild(BuildImageCmd buildImageCmd) throws Exception { } @Test(expected = DockerClientException.class) - public void dockerignoreDockerfileIgnored() throws Exception { + public void dockerignoreDockerfileIgnored() { File baseDir = fileFromBuildTestResource("dockerignore/DockerfileIgnored"); dockerRule.getClient().buildImageCmd(baseDir).withNoCache(true).start().awaitImageId(); } @Test - public void dockerignoreDockerfileNotIgnored() throws Exception { + public void dockerignoreDockerfileNotIgnored() { File baseDir = fileFromBuildTestResource("dockerignore/DockerfileNotIgnored"); dockerRule.getClient().buildImageCmd(baseDir).withNoCache(true).start().awaitImageId(); } @Test(expected = DockerClientException.class) - public void dockerignoreInvalidDockerIgnorePattern() throws Exception { + public void dockerignoreInvalidDockerIgnorePattern() { File baseDir = fileFromBuildTestResource("dockerignore/InvalidDockerignorePattern"); dockerRule.getClient().buildImageCmd(baseDir).withNoCache(true).start().awaitImageId(); @@ -241,7 +241,7 @@ public void fromPrivateRegistry() throws Exception { } @Test - public void buildArgs() throws Exception { + public void buildArgs() { File baseDir = fileFromBuildTestResource("buildArgs"); String imageId = dockerRule.getClient().buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "abc !@#$%^&*()_+") @@ -256,7 +256,7 @@ public void buildArgs() throws Exception { } @Test - public void labels() throws Exception { + public void labels() { assumeThat("API version should be >= 1.23", dockerRule, isGreaterOrEqual(VERSION_1_23)); File baseDir = fileFromBuildTestResource("labels"); @@ -274,7 +274,7 @@ public void labels() throws Exception { } @Test - public void multipleTags() throws Exception { + public void multipleTags() { assumeThat("API version should be >= 1.23", dockerRule, isGreaterOrEqual(VERSION_1_21)); @@ -295,7 +295,7 @@ public void multipleTags() throws Exception { } @Test - public void cacheFrom() throws Exception { + public void cacheFrom() { assumeThat(dockerRule, isGreaterOrEqual(VERSION_1_27)); File baseDir1 = fileFromBuildTestResource("CacheFrom/test1"); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CmdIT.java index 12664c4e5..b01cb1e90 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CmdIT.java @@ -5,116 +5,34 @@ import com.github.dockerjava.core.DockerClientImpl; import com.github.dockerjava.core.DockerRule; import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; -import com.github.dockerjava.jaxrs.JerseyDockerHttpClient; import com.github.dockerjava.junit.category.Integration; -import com.github.dockerjava.netty.NettyDockerCmdExecFactory; -import com.github.dockerjava.okhttp.OkDockerHttpClient; +import com.github.dockerjava.transport.DockerHttpClient; import org.junit.Rule; import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - -import java.util.Arrays; /** * @author Kanstantsin Shautsou */ @Category(Integration.class) -@RunWith(Parameterized.class) public abstract class CmdIT { - public enum FactoryType { - NETTY(true) { - @Override - public DockerClientImpl createDockerClient(DockerClientConfig config) { - return (DockerClientImpl) DockerClientBuilder.getInstance(config) - .withDockerCmdExecFactory( - new NettyDockerCmdExecFactory() - .withConnectTimeout(30 * 1000) - ) - .build(); - } - }, - JERSEY(false) { - @Override - public DockerClientImpl createDockerClient(DockerClientConfig config) { - return (DockerClientImpl) DockerClientBuilder.getInstance(config) - .withDockerHttpClient( - new TrackingDockerHttpClient( - new JerseyDockerHttpClient.Builder() - .dockerHost(config.getDockerHost()) - .sslConfig(config.getSSLConfig()) - .connectTimeout(30 * 1000) - .build() - ) - ) - .build(); - } - }, - OKHTTP(true) { - @Override - public DockerClientImpl createDockerClient(DockerClientConfig config) { - return (DockerClientImpl) DockerClientBuilder.getInstance(config) - .withDockerHttpClient( - new TrackingDockerHttpClient( - new OkDockerHttpClient.Builder() - .dockerHost(config.getDockerHost()) - .sslConfig(config.getSSLConfig()) - .connectTimeout(30 * 100) - .build() - ) - ) - .build(); - } - }, - HTTPCLIENT5(true) { - @Override - public DockerClientImpl createDockerClient(DockerClientConfig config) { - return (DockerClientImpl) DockerClientBuilder.getInstance(config) - .withDockerHttpClient( - new TrackingDockerHttpClient( - new ApacheDockerHttpClient.Builder() - .dockerHost(config.getDockerHost()) - .sslConfig(config.getSSLConfig()) - .build() - ) - ) - .build(); - } - }; - - private final String subnetPrefix; - private final boolean supportsStdinAttach; - - FactoryType(boolean supportsStdinAttach) { - this.subnetPrefix = "10." + (100 + ordinal()) + "."; - this.supportsStdinAttach = supportsStdinAttach; - } - - public String getSubnetPrefix() { - return subnetPrefix; - } - public boolean supportsStdinAttach() { - return supportsStdinAttach; - } - - public abstract DockerClientImpl createDockerClient(DockerClientConfig config); - } - - @Parameterized.Parameters(name = "{index}:{0}") - public static Iterable data() { - return Arrays.asList(FactoryType.values()); + public static DockerHttpClient createDockerHttpClient(DockerClientConfig config) { + return new TrackingDockerHttpClient( + new ApacheDockerHttpClient.Builder() + .dockerHost(config.getDockerHost()) + .sslConfig(config.getSSLConfig()) + .build() + ); } - @Parameterized.Parameter - public FactoryType factoryType; - - public FactoryType getFactoryType() { - return factoryType; + public static DockerClientImpl createDockerClient(DockerClientConfig config) { + return (DockerClientImpl) DockerClientBuilder.getInstance(config) + .withDockerHttpClient(createDockerHttpClient(config)) + .build(); } @Rule - public DockerRule dockerRule = new DockerRule( this); + public DockerRule dockerRule = new DockerRule(); @Rule public DockerHttpClientLeakDetector leakDetector = new DockerHttpClientLeakDetector(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CommitCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CommitCmdIT.java index 39f51adc7..bd87d4aab 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CommitCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CommitCmdIT.java @@ -46,9 +46,6 @@ public void commit() throws DockerException, InterruptedException { InspectImageResponse inspectImageResponse = dockerRule.getClient().inspectImageCmd(imageId).exec(); LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - assertThat(inspectImageResponse, hasField("container", startsWith(container.getId()))); - assertThat(inspectImageResponse.getContainerConfig().getImage(), equalTo(DEFAULT_IMAGE)); - InspectImageResponse busyboxImg = dockerRule.getClient().inspectImageCmd("busybox").exec(); assertThat(inspectImageResponse.getParent(), equalTo(busyboxImg.getId())); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ConnectToNetworkCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ConnectToNetworkCmdIT.java index b7c28e8bc..40b552611 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ConnectToNetworkCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ConnectToNetworkCmdIT.java @@ -26,7 +26,7 @@ public class ConnectToNetworkCmdIT extends CmdIT { @Test public void connectToNetwork() throws InterruptedException { assumeNotSwarm("no network in swarm", dockerRule); - String networkName = "connectToNetwork" + dockerRule.getKind(); + String networkName = "connectToNetwork"; CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("sleep", "9999").exec(); dockerRule.getClient().startContainerCmd(container.getId()).exec(); @@ -48,8 +48,8 @@ public void connectToNetwork() throws InterruptedException { public void connectToNetworkWithContainerNetwork() throws InterruptedException { assumeNotSwarm("no network in swarm", dockerRule); - final String subnetPrefix = getFactoryType().getSubnetPrefix() + "100"; - final String networkName = "ContainerWithNetwork" + dockerRule.getKind(); + final String subnetPrefix = "10.100.100"; + final String networkName = "ContainerWithNetwork"; final String containerIp = subnetPrefix + ".100"; CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) @@ -74,7 +74,7 @@ public void connectToNetworkWithContainerNetwork() throws InterruptedException { .withNetworkId(network.getId()) .withContainerId(container.getId()) .withContainerNetwork(new ContainerNetwork() - .withAliases("aliasName" + dockerRule.getKind()) + .withAliases("aliasName") .withIpamConfig(new ContainerNetwork.Ipam() .withIpv4Address(containerIp))) .exec(); @@ -89,7 +89,7 @@ public void connectToNetworkWithContainerNetwork() throws InterruptedException { ContainerNetwork testNetwork = inspectContainerResponse.getNetworkSettings().getNetworks().get(networkName); assertNotNull(testNetwork); - assertThat(testNetwork.getAliases(), hasItem("aliasName" + dockerRule.getKind())); + assertThat(testNetwork.getAliases(), hasItem("aliasName")); assertThat(testNetwork.getGateway(), is(subnetPrefix + ".1")); assertThat(testNetwork.getIpAddress(), is(containerIp)); } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveFromContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveFromContainerCmdIT.java index 9cede72e8..e0c2ca03e 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveFromContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveFromContainerCmdIT.java @@ -30,10 +30,10 @@ public class CopyArchiveFromContainerCmdIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(CopyArchiveFromContainerCmdIT.class); @Test - public void copyFromContainer() throws Exception { + public void copyFromContainer() { // TODO extract this into a shared method CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withName("copyFromContainer" + dockerRule.getKind()) + .withName("copyFromContainer") .withCmd("touch", "/copyFromContainer") .exec(); @@ -51,7 +51,7 @@ public void copyFromContainer() throws Exception { } @Test(expected = NotFoundException.class) - public void copyFromNonExistingContainer() throws Exception { + public void copyFromNonExistingContainer() { dockerRule.getClient().copyArchiveFromContainerCmd("non-existing", "/test").exec(); } @@ -59,14 +59,14 @@ public void copyFromNonExistingContainer() throws Exception { @Test public void copyFromContainerBinaryFile() throws Exception { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withName("copyFromContainerBinaryFile" + dockerRule.getKind()) + .withName("copyFromContainerBinaryFile") .exec(); LOG.info("Created container: {}", container); assertThat(container.getId(), not(isEmptyOrNullString())); Path temp = Files.createTempFile("", ".tar.gz"); - Path binaryFile = Paths.get("src/test/resources/testCopyFromArchive/binary.dat"); + Path binaryFile = Paths.get(ClassLoader.getSystemResource("testCopyFromArchive/binary.dat").toURI()); CompressArchiveUtil.tar(binaryFile, temp, true, false); try (InputStream uploadStream = Files.newInputStream(temp)) { @@ -78,7 +78,7 @@ public void copyFromContainerBinaryFile() throws Exception { try (TarArchiveInputStream tarInputStream = new TarArchiveInputStream(response)) { TarArchiveEntry nextTarEntry = tarInputStream.getNextTarEntry(); - assertEquals(nextTarEntry.getName(), "binary.dat"); + assertEquals("binary.dat", nextTarEntry.getName()); try (InputStream binaryFileInputStream = Files.newInputStream(binaryFile, StandardOpenOption.READ)) { assertTrue(IOUtils.contentEquals(binaryFileInputStream, tarInputStream)); } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveToContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveToContainerCmdIT.java index 307c1e17c..efce65c29 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveToContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveToContainerCmdIT.java @@ -4,7 +4,9 @@ import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.core.util.CompressArchiveUtil; +import com.github.dockerjava.utils.LogContainerTestCallback; import org.apache.commons.io.FileUtils; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,12 +16,16 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.concurrent.TimeUnit; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.isEmptyOrNullString; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeThat; public class CopyArchiveToContainerCmdIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(CopyArchiveToContainerCmdIT.class); @@ -28,7 +34,7 @@ public class CopyArchiveToContainerCmdIT extends CmdIT { public void copyFileToContainer() throws Exception { CreateContainerResponse container = prepareContainerForCopy("1"); Path temp = Files.createTempFile("", ".tar.gz"); - CompressArchiveUtil.tar(Paths.get("src/test/resources/testReadFile"), temp, true, false); + CompressArchiveUtil.tar(Paths.get(ClassLoader.getSystemResource("testReadFile").toURI()), temp, true, false); try (InputStream uploadStream = Files.newInputStream(temp)) { dockerRule.getClient() .copyArchiveToContainerCmd(container.getId()) @@ -42,7 +48,7 @@ public void copyFileToContainer() throws Exception { public void copyStreamToContainer() throws Exception { CreateContainerResponse container = prepareContainerForCopy("2"); dockerRule.getClient().copyArchiveToContainerCmd(container.getId()) - .withHostResource("src/test/resources/testReadFile") + .withHostResource(Paths.get(ClassLoader.getSystemResource("testReadFile").toURI()).toString()) .exec(); assertFileCopied(container); } @@ -50,8 +56,8 @@ public void copyStreamToContainer() throws Exception { @Test public void copyStreamToContainerTwice() throws Exception { CreateContainerResponse container = prepareContainerForCopy("rerun"); - CopyArchiveToContainerCmd copyArchiveToContainerCmd=dockerRule.getClient().copyArchiveToContainerCmd(container.getId()) - .withHostResource("src/test/resources/testReadFile"); + CopyArchiveToContainerCmd copyArchiveToContainerCmd = dockerRule.getClient().copyArchiveToContainerCmd(container.getId()) + .withHostResource(Paths.get(ClassLoader.getSystemResource("testReadFile").toURI()).toString()); copyArchiveToContainerCmd.exec(); assertFileCopied(container); //run again to make sure no DockerClientException @@ -60,7 +66,7 @@ public void copyStreamToContainerTwice() throws Exception { private CreateContainerResponse prepareContainerForCopy(String method) { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withName("docker-java-itest-copyToContainer" + method + dockerRule.getKind()) + .withName("docker-java-itest-copyToContainer" + method) .exec(); LOG.info("Created container: {}", container); assertThat(container.getId(), not(isEmptyOrNullString())); @@ -78,8 +84,8 @@ private void assertFileCopied(CreateContainerResponse container) throws IOExcept @Test(expected = NotFoundException.class) public void copyToNonExistingContainer() throws Exception { - - dockerRule.getClient().copyArchiveToContainerCmd("non-existing").withHostResource("src/test/resources/testReadFile").exec(); + dockerRule.getClient().copyArchiveToContainerCmd("non-existing") + .withHostResource(Paths.get(ClassLoader.getSystemResource("testReadFile").toURI()).toString()).exec(); } @Test @@ -108,7 +114,7 @@ public void copyDirWithLastAddedTarEntryEmptyDir() throws Exception{ // cleanup dir FileUtils.deleteDirectory(localDir.toFile()); } - + @Test public void copyFileWithExecutePermission() throws Exception { // create script file, add permission to execute @@ -125,7 +131,7 @@ public void copyFileWithExecutePermission() throws Exception { // script to be copied to the container's home dir and then executes it String containerCmd = "sleep 3; /home/" + scriptPath.getFileName().toString(); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") - .withName("copyFileWithExecutivePerm" + dockerRule.getKind()) + .withName("copyFileWithExecutivePerm") .withCmd("/bin/sh", "-c", containerCmd) .exec(); // start the container @@ -143,4 +149,72 @@ public void copyFileWithExecutePermission() throws Exception { assertThat(exitCode, equalTo(0)); } + @Ignore("Docker issue https://github.com/moby/moby/issues/46388") + @Test + public void copyFileWithUIDGID() throws Exception { + Path with = Files.createFile(Files.createTempDirectory("copyFileWithUIDGID").resolve("uidgid.with")); + Files.write(with, "with".getBytes()); + + Path without = Files.createFile(Files.createTempDirectory("copyFileWithUIDGID").resolve("uidgid.without")); + Files.write(without, "without".getBytes()); + + String containerCmd = "while [ ! -f /home/uidgid.with ]; do true; done && stat -c %n:%u /home/uidgid.with /home/uidgid.without"; + Long syncUserUid = 4L; // sync user in busybox uses uid=4 + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withName("copyFileWithUIDGID") + .withCmd("/bin/sh", "-c", containerCmd) + .withUser(syncUserUid.toString()) + .exec(); + // start the container + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + dockerRule.getClient().copyArchiveToContainerCmd(container.getId()) + .withRemotePath("/home/") + .withHostResource(without.toString()) + .withCopyUIDGID(false) + .exec(); + dockerRule.getClient().copyArchiveToContainerCmd(container.getId()) + .withRemotePath("/home/") + .withHostResource(with.toString()) + .withCopyUIDGID(true) + .exec(); + + // await exit code + int exitCode = dockerRule.getClient().waitContainerCmd(container.getId()) + .start() + .awaitStatusCode(); + // check result + assertThat(exitCode, equalTo(0)); + + LogContainerTestCallback loggingCallback = new LogContainerTestCallback(true); + + dockerRule.getClient().logContainerCmd(container.getId()) + .withStdOut(true) + .withTailAll() + .exec(loggingCallback); + + loggingCallback.awaitCompletion(3, TimeUnit.SECONDS); + String containerOutput = loggingCallback.toString(); + + assertThat(containerOutput, containsString(String.format("/home/uidgid.with:%d", syncUserUid))); + + Long hostUid = getHostUidIfPossible(); + assumeThat("could not get the uid on host platform", hostUid, notNullValue(Long.class)); + assertThat(containerOutput, containsString(String.format("/home/uidgid.without:%d", hostUid))); + } + + private static Long getHostUidIfPossible() { + try { + Class unixSystemClazz = Class.forName("com.sun.security.auth.module.UnixSystem"); + Object unixSystem = unixSystemClazz.newInstance(); + Object uid = unixSystemClazz.getMethod("getUid").invoke(unixSystem); + if (uid == null) { + return null; + } + + return uid instanceof Long ? (Long) uid : Long.parseLong(uid.toString()); + } catch (Exception e) { + return null; + } + } } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CopyFileFromContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CopyFileFromContainerCmdIT.java index ffef0d38a..3864aa9e4 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CopyFileFromContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CopyFileFromContainerCmdIT.java @@ -23,12 +23,12 @@ public class CopyFileFromContainerCmdIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(CopyFileFromContainerCmdIT.class); @Test - public void copyFromContainer() throws Exception { + public void copyFromContainer() { assumeThat("Doesn't work since 1.24", dockerRule, not(isGreaterOrEqual(VERSION_1_24))); assumeNotSwarm("", dockerRule); - String containerName = "copyFileFromContainer" + dockerRule.getKind(); + String containerName = "copyFileFromContainer"; dockerRule.ensureContainerRemoved(containerName); // TODO extract this into a shared method @@ -51,7 +51,7 @@ public void copyFromContainer() throws Exception { } @Test(expected = NotFoundException.class) - public void copyFromNonExistingContainer() throws Exception { + public void copyFromNonExistingContainer() { dockerRule.getClient().copyFileFromContainerCmd("non-existing", "/test").exec(); } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java index b70d6fc08..99d5dd997 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java @@ -1,12 +1,17 @@ package com.github.dockerjava.cmd; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.CreateNetworkResponse; import com.github.dockerjava.api.command.CreateVolumeResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.exception.ConflictException; import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.api.exception.InternalServerErrorException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.AuthConfig; @@ -31,7 +36,9 @@ import com.github.dockerjava.utils.TestUtils; import net.jcip.annotations.NotThreadSafe; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.SystemUtils; import org.junit.ClassRule; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -53,6 +60,7 @@ import static com.github.dockerjava.api.model.HostConfig.newHostConfig; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_23; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_24; +import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_44; import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static com.github.dockerjava.junit.DockerMatchers.mountedVolumes; import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE; @@ -70,6 +78,7 @@ import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; @@ -364,7 +373,7 @@ public void createContainerWithHostname() throws Exception { @Test(expected = ConflictException.class) public void createContainerWithName() throws DockerException { - String containerName = "container_" + dockerRule.getKind(); + String containerName = "container_"; CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withName(containerName) @@ -386,8 +395,8 @@ public void createContainerWithName() throws DockerException { @Test public void createContainerWithLink() throws DockerException { - String containerName1 = "containerWithlink_" + dockerRule.getKind(); - String containerName2 = "container2Withlink_" + dockerRule.getKind(); + String containerName1 = "containerWithlink_"; + String containerName2 = "container2Withlink_"; CreateContainerResponse container1 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("sleep", "9999") .withName(containerName1).exec(); @@ -416,6 +425,7 @@ public void createContainerWithLink() throws DockerException { } @Test + @Ignore public void createContainerWithMemorySwappiness() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withCmd("sleep", "9999") @@ -437,9 +447,9 @@ public void createContainerWithMemorySwappiness() throws DockerException { @Test public void createContainerWithLinkInCustomNetwork() throws DockerException { - String containerName1 = "containerCustomlink_" + dockerRule.getKind(); - String containerName2 = "containerCustom2link_" + dockerRule.getKind(); - String networkName = "linkNetcustom" + dockerRule.getKind(); + String containerName1 = "containerCustomlink_"; + String containerName2 = "containerCustom2link_"; + String networkName = "linkNetcustom"; CreateNetworkResponse createNetworkResponse = dockerRule.getClient().createNetworkCmd() .withName(networkName) @@ -485,9 +495,9 @@ public void createContainerWithLinkInCustomNetwork() throws DockerException { @Test public void createContainerWithCustomIp() throws DockerException { - String containerName1 = "containerCustomIplink_" + dockerRule.getKind(); - String networkName = "customIpNet" + dockerRule.getKind(); - String subnetPrefix = getFactoryType().getSubnetPrefix() + "101"; + String containerName1 = "containerCustomIplink_"; + String networkName = "customIpNet"; + String subnetPrefix = "10.100.101"; CreateNetworkResponse createNetworkResponse = dockerRule.getClient().createNetworkCmd() .withIpam(new Network.Ipam() @@ -523,8 +533,8 @@ public void createContainerWithCustomIp() throws DockerException { @Test public void createContainerWithAlias() throws DockerException { - String containerName1 = "containerAlias_" + dockerRule.getKind(); - String networkName = "aliasNet" + dockerRule.getKind(); + String containerName1 = "containerAlias_"; + String networkName = "aliasNet"; CreateNetworkResponse createNetworkResponse = dockerRule.getClient().createNetworkCmd() .withName(networkName) @@ -538,7 +548,7 @@ public void createContainerWithAlias() throws DockerException { .withNetworkMode(networkName)) .withCmd("sleep", "9999") .withName(containerName1) - .withAliases("server" + dockerRule.getKind()) + .withAliases("server") .exec(); assertThat(container.getId(), not(is(emptyString()))); @@ -549,7 +559,7 @@ public void createContainerWithAlias() throws DockerException { .exec(); ContainerNetwork aliasNet = inspectContainerResponse.getNetworkSettings().getNetworks().get(networkName); - assertThat(aliasNet.getAliases(), hasItem("server" + dockerRule.getKind())); + assertThat(aliasNet.getAliases(), hasItem("server")); } @Test @@ -597,7 +607,7 @@ public void createContainerWithDns() throws DockerException { public void createContainerWithEntrypoint() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withName("containerEntrypoint" + dockerRule.getKind()) + .withName("containerEntrypoint") .withEntrypoint("sleep", "9999").exec(); LOG.info("Created container {}", container.toString()); @@ -616,7 +626,7 @@ public void createContainerWithExtraHosts() throws DockerException { String[] extraHosts = {"dockerhost:127.0.0.1", "otherhost:10.0.0.1"}; CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withName("containerextrahosts" + dockerRule.getKind()) + .withName("containerextrahosts") .withHostConfig(newHostConfig() .withExtraHosts(extraHosts)).exec(); @@ -650,7 +660,7 @@ public void createContainerWithDevices() throws DockerException { @Test public void createContainerWithPortBindings() throws DockerException { - int baseport = 10_000 + (getFactoryType().ordinal() * 1000); + int baseport = 10_000; ExposedPort tcp22 = ExposedPort.tcp(22); ExposedPort tcp23 = ExposedPort.tcp(23); @@ -687,8 +697,8 @@ public void createContainerWithPortBindings() throws DockerException { @Test public void createContainerWithLinking() throws DockerException { - String containerName1 = "containerWithlinking_" + dockerRule.getKind(); - String containerName2 = "container2Withlinking_" + dockerRule.getKind(); + String containerName1 = "containerWithlinking_"; + String containerName2 = "container2Withlinking_"; CreateContainerResponse container1 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withCmd("sleep", "9999") @@ -812,7 +822,7 @@ public void createContainerWithMacAddress() throws DockerException { @Test public void createContainerWithULimits() throws DockerException { - String containerName = "containerulimit" + dockerRule.getKind(); + String containerName = "containerulimit"; Ulimit[] ulimits = {new Ulimit("nproc", 709, 1026), new Ulimit("nofile", 1024, 4096)}; CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) @@ -834,7 +844,7 @@ public void createContainerWithULimits() throws DockerException { @Test public void createContainerWithIntegerBoundsExceedingULimit() throws DockerException { - String containerName = "containercoreulimit" + dockerRule.getKind(); + String containerName = "containercoreulimit"; Ulimit[] ulimits = {new Ulimit("core", 99999999998L, 99999999999L)}; CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) @@ -955,6 +965,8 @@ public void onNext(Frame item) { @Test public void createContainerWithCgroupParent() throws DockerException { + assumeThat(!SystemUtils.IS_OS_LINUX, is(true)); + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") .withHostConfig(newHostConfig() .withCgroupParent("/parent")) @@ -1108,4 +1120,57 @@ public void overrideHostConfigWithRawValues() { assertThat(inspectContainerResponse.getHostConfig().getNanoCPUs(), is(500_000_000L)); } + + @Test + public void shouldNotEncodeAuth() { + CreateContainerCmd cmd = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withAuthConfig(new AuthConfig().withEmail("test@test.com")) + .withCmd("sleep", "9999"); + + ObjectMapper objectMapper = dockerRule.getConfig().getObjectMapper(); + + ObjectNode jsonNode = objectMapper.valueToTree(cmd); + + assertThat(jsonNode.get("authConfig"), nullValue()); + } + + @Test + public void shouldHandleANetworkAliasWithoutACustomNetworkGracefully() { + // Should not throw + dockerRule.getClient() + .createContainerCmd(DEFAULT_IMAGE) + .withAliases("hello-world") + .withHostConfig(newHostConfig()) + .withCmd("sleep", "9999") + .exec(); + } + + @Test + public void createContainerWithAnnotations() throws DockerException { + DefaultDockerClientConfig forcedConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() + .withApiVersion(VERSION_1_44) + .withRegistryUrl("https://index.docker.io/v1/") + .build(); + + DockerClient forcedClient = CmdIT.createDockerClient(forcedConfig); + Map annotations = new HashMap<>(); + annotations.put("com.example.key1", "value1"); + annotations.put("com.example.key2", "value2"); + + CreateContainerResponse container = forcedClient.createContainerCmd(DEFAULT_IMAGE) + .withCmd("sleep", "9999") + .withHostConfig(newHostConfig() + .withAnnotations(annotations)) + .exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(is(emptyString()))); + + InspectContainerResponse inspectContainerResponse = forcedClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getAnnotations(), equalTo(annotations)); + assertThat(inspectContainerResponse.getHostConfig().getAnnotations().get("com.example.key1"), equalTo("value1")); + assertThat(inspectContainerResponse.getHostConfig().getAnnotations().get("com.example.key2"), equalTo("value2")); + } } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateNetworkCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateNetworkCmdIT.java index 36776bdb1..d60425a2a 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateNetworkCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateNetworkCmdIT.java @@ -15,9 +15,11 @@ import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeThat; @@ -28,7 +30,7 @@ public class CreateNetworkCmdIT extends CmdIT { public void createNetwork() throws DockerException { assumeNotSwarm("no network in swarm", dockerRule); - String networkName = "createNetwork" + dockerRule.getKind(); + String networkName = "createNetwork"; CreateNetworkResponse createNetworkResponse = dockerRule.getClient().createNetworkCmd().withName(networkName).exec(); @@ -37,14 +39,15 @@ public void createNetwork() throws DockerException { Network network = dockerRule.getClient().inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec(); assertThat(network.getName(), is(networkName)); assertThat(network.getDriver(), is("bridge")); + assertThat(network.getCreated().getTime(), greaterThan(0L)); } @Test public void createNetworkWithIpamConfig() throws DockerException { assumeNotSwarm("no network in swarm", dockerRule); - String networkName = "networkIpam" + dockerRule.getKind(); - String subnet = "10.67." + (79 + getFactoryType().ordinal()) + ".0/24"; + String networkName = "networkIpam"; + String subnet = "10.67.79.0/24"; Network.Ipam ipam = new Network.Ipam().withConfig(new Network.Ipam.Config().withSubnet(subnet)); CreateNetworkResponse createNetworkResponse = dockerRule.getClient().createNetworkCmd().withName(networkName).withIpam(ipam).exec(); @@ -52,7 +55,7 @@ public void createNetworkWithIpamConfig() throws DockerException { assertNotNull(createNetworkResponse.getId()); Network network = dockerRule.getClient().inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec(); - assertEquals(network.getName(), networkName); + assertEquals(networkName, network.getName()); assertEquals("bridge", network.getDriver()); assertEquals(subnet, network.getIpam().getConfig().iterator().next().getSubnet()); } @@ -61,7 +64,7 @@ public void createNetworkWithIpamConfig() throws DockerException { public void createAttachableNetwork() throws DockerException { assumeThat("API version should be > 1.24", dockerRule, isGreaterOrEqual(VERSION_1_25)); - String networkName = "createAttachableNetwork" + dockerRule.getKind(); + String networkName = "createAttachableNetwork"; CreateNetworkResponse createNetworkResponse = dockerRule.getClient().createNetworkCmd() .withName(networkName) .withAttachable(true) @@ -77,12 +80,12 @@ public void createNetworkWithLabel() throws DockerException { assumeNotSwarm("no network in swarm?", dockerRule); assumeThat("API version should be >= 1.21", dockerRule, isGreaterOrEqual(VERSION_1_21)); - String networkName = "createNetworkWithLabel" + dockerRule.getKind(); + String networkName = "createNetworkWithLabel"; Map labels = new HashMap<>(); - labels.put("com.example.usage" + dockerRule.getKind(), "test"); + labels.put("com.example.usage", "test"); CreateNetworkResponse createNetworkResponse = dockerRule.getClient().createNetworkCmd().withName(networkName).withLabels(labels).exec(); assertNotNull(createNetworkResponse.getId()); Network network = dockerRule.getClient().inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec(); - assertEquals(network.getLabels(), labels); + assertEquals(labels, network.getLabels()); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CustomCommandIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CustomCommandIT.java index e7899f84a..bf273a98c 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CustomCommandIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CustomCommandIT.java @@ -1,6 +1,5 @@ package com.github.dockerjava.cmd; -import com.github.dockerjava.core.DockerClientImpl; import com.github.dockerjava.core.DockerRule; import com.github.dockerjava.transport.DockerHttpClient; import com.github.dockerjava.transport.DockerHttpClient.Request; @@ -18,8 +17,7 @@ public class CustomCommandIT extends CmdIT { @Test public void testCustomCommand() throws Exception { - DockerClientImpl dockerClient = getFactoryType().createDockerClient(DockerRule.config(null)); - DockerHttpClient httpClient = dockerClient.getHttpClient(); + DockerHttpClient httpClient = CmdIT.createDockerHttpClient(DockerRule.config(null)); Assume.assumeNotNull(httpClient); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java index 3c9451545..2d932cc24 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/DisconnectFromNetworkCmdIT.java @@ -13,13 +13,13 @@ public class DisconnectFromNetworkCmdIT extends CmdIT { @Test - public void disconnectFromNetwork() throws InterruptedException { + public void disconnectFromNetwork() { assumeNotSwarm("no network in swarm", dockerRule); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999").exec(); dockerRule.getClient().startContainerCmd(container.getId()).exec(); - CreateNetworkResponse network = dockerRule.getClient().createNetworkCmd().withName("disconnectNetwork" + dockerRule.getKind()).exec(); + CreateNetworkResponse network = dockerRule.getClient().createNetworkCmd().withName("disconnectNetwork").exec(); dockerRule.getClient().connectToNetworkCmd().withNetworkId(network.getId()).withContainerId(container.getId()).exec(); @@ -35,14 +35,14 @@ public void disconnectFromNetwork() throws InterruptedException { } @Test - public void forceDisconnectFromNetwork() throws InterruptedException { + public void forceDisconnectFromNetwork() { assumeNotSwarm("no network in swarm", dockerRule); - CreateNetworkResponse network = dockerRule.getClient().createNetworkCmd().withName("testNetwork2" + dockerRule.getKind()).exec(); + CreateNetworkResponse network = dockerRule.getClient().createNetworkCmd().withName("testNetwork2").exec(); CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") .withHostConfig(newHostConfig() - .withNetworkMode("testNetwork2" + dockerRule.getKind())) + .withNetworkMode("testNetwork2")) .withCmd("sleep", "9999") .exec(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ExecStartCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ExecStartCmdIT.java index cf096aa26..fc111f0e2 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ExecStartCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ExecStartCmdIT.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.core.command.ExecStartResultCallback; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -77,6 +78,7 @@ public void execStartAttached() throws Exception { assertTrue(responseAsString.length() > 0); } + @Ignore @Test(expected = NotFoundException.class) public void execStartWithNonExistentUser() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java new file mode 100644 index 000000000..bdca27572 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java @@ -0,0 +1,88 @@ +package com.github.dockerjava.cmd; + +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.HealthStateLog; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.HealthCheck; +import com.github.dockerjava.core.RemoteApiVersion; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; +import static org.awaitility.Awaitility.await; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.emptyString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.junit.Assume.assumeThat; + +public class HealthCmdIT extends CmdIT { + private final Logger LOG = LoggerFactory.getLogger(HealthCmdIT.class); + + @Test + public void healthiness() { + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("nc", "-l", "-p", "8080") + .withHealthcheck(new HealthCheck() + .withTest(Arrays.asList("CMD", "sh", "-c", "netstat -ltn | grep 8080")) + .withInterval(TimeUnit.SECONDS.toNanos(1)) + .withTimeout(TimeUnit.MINUTES.toNanos(1)) + .withStartPeriod(TimeUnit.SECONDS.toNanos(30)) + .withRetries(10)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + await().atMost(60L, TimeUnit.SECONDS).untilAsserted( + () -> { + InspectContainerResponse inspectContainerResponse = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); + assertThat(inspectContainerResponse.getState().getHealth().getStatus(), is(equalTo("healthy"))); + } + ); + } + + @Test + public void healthiness_startInterval() { + assumeThat("API version should be >= 1.44", dockerRule, isGreaterOrEqual(RemoteApiVersion.VERSION_1_44)); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("nc", "-l", "-p", "8080") + .withHealthcheck(new HealthCheck() + .withTest(Arrays.asList("CMD", "sh", "-c", "netstat -ltn | grep 8080")) + .withInterval(TimeUnit.SECONDS.toNanos(5)) + .withTimeout(TimeUnit.MINUTES.toNanos(1)) + .withStartPeriod(TimeUnit.SECONDS.toNanos(2)) + .withStartInterval(TimeUnit.SECONDS.toNanos(1)) + .withRetries(10)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + await().atMost(60L, TimeUnit.SECONDS).untilAsserted( + () -> { + InspectContainerResponse inspectContainerResponse = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); + List healthStateLogs = inspectContainerResponse.getState().getHealth().getLog(); + assertThat(healthStateLogs.size(), is(greaterThanOrEqualTo(2))); + healthStateLogs.forEach(log -> LOG.info("Health log: {}", log.getStart())); + HealthStateLog log1 = healthStateLogs.get(healthStateLogs.size() - 1); + HealthStateLog log2 = healthStateLogs.get(healthStateLogs.size() - 2); + long diff = ChronoUnit.NANOS.between(ZonedDateTime.parse(log2.getStart()), ZonedDateTime.parse(log1.getStart())); + assertThat(diff, is(greaterThanOrEqualTo(inspectContainerResponse.getConfig().getHealthcheck().getInterval()))); + } + ); + } + +} diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InfoCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InfoCmdIT.java index d7917326b..74fc2cbda 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InfoCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InfoCmdIT.java @@ -48,6 +48,7 @@ public void infoTest() throws DockerException { assertThat(dockerInfo.getImages(), notNullValue()); assertThat(dockerInfo.getImages(), greaterThan(0)); assertThat(dockerInfo.getDebug(), notNullValue()); + assertThat(dockerInfo.getRuntimes(), notNullValue()); if (isNotSwarm(dockerClient)) { assertThat(dockerInfo.getNFd(), greaterThan(0)); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java index 9e47cfd9f..e47a911d7 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java @@ -6,6 +6,7 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Container; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +46,7 @@ public void inspectContainer() throws DockerException { assertThat(container.getId(), not(is(emptyString()))); InspectContainerResponse containerInfo = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); - assertEquals(containerInfo.getId(), container.getId()); + assertEquals(container.getId(), containerInfo.getId()); } @@ -100,7 +101,9 @@ public void inspectContainerWithSize() throws DockerException { // TODO check swarm if (isNotSwarm(dockerRule.getClient())) { assertNotNull(containerInfo.getSizeRootFs()); - assertTrue(containerInfo.getSizeRootFs().intValue() > 0); + assertTrue(containerInfo.getSizeRootFs() > 0L); + assertNotNull(containerInfo.getSizeRw()); + assertEquals(4096, containerInfo.getSizeRw().longValue()); } } @@ -125,6 +128,7 @@ public void inspectContainerRestartCount() throws DockerException { } @Test + @Ignore public void inspectContainerNetworkSettings() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectExecCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectExecCmdIT.java index 3f22fca33..b256c6a7c 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectExecCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectExecCmdIT.java @@ -79,7 +79,7 @@ public void inspectExec() throws Exception { } @Test - public void inspectExecNetworkSettings() throws IOException { + public void inspectExecNetworkSettings() { final RemoteApiVersion apiVersion = getVersion(dockerRule.getClient()); String containerName = "generated_" + new SecureRandom().nextInt(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectNetworkCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectNetworkCmdIT.java index eca86497d..035d3d767 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectNetworkCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectNetworkCmdIT.java @@ -10,6 +10,7 @@ import static com.github.dockerjava.utils.TestUtils.findNetwork; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; public class InspectNetworkCmdIT extends CmdIT { @@ -28,5 +29,6 @@ public void inspectNetwork() throws DockerException { assertThat(network.getDriver(), equalTo(expected.getDriver())); assertThat(network.getIpam().getConfig().get(0).getSubnet(), equalTo(expected.getIpam().getConfig().get(0).getSubnet())); assertThat(network.getIpam().getDriver(), equalTo(expected.getIpam().getDriver())); + assertThat(network.getCreated().getTime(), greaterThan(0L)); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java index 9ada9d7ad..3490924c7 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.TimeUnit; import static ch.lambdaj.Lambda.filter; import static com.github.dockerjava.api.model.HostConfig.newHostConfig; @@ -25,11 +26,12 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.emptyString; -import static org.hamcrest.Matchers.isOneOf; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.oneOf; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertEquals; import static org.testinfected.hamcrest.jpa.PersistenceMatchers.hasField; @@ -59,7 +61,7 @@ public void tearDown() { } @Test - public void testListContainers() throws Exception { + public void testListContainers() { List containers = dockerRule.getClient().listContainersCmd() .withLabelFilter(testLabel) .withShowAll(true) @@ -106,7 +108,7 @@ public void testListContainers() throws Exception { } @Test - public void testListContainersWithLabelsFilter() throws Exception { + public void testListContainersWithLabelsFilter() { // list with filter by Map label dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withCmd("echo") .withLabels(testLabel) @@ -138,7 +140,7 @@ public void testListContainersWithLabelsFilter() throws Exception { } @Test - public void testNameFilter() throws Exception { + public void testNameFilter() { String testUUID = testLabel.get("test"); String id1, id2; @@ -160,12 +162,12 @@ public void testNameFilter() throws Exception { .exec(); assertThat(filteredContainers.size(), is(2)); - assertThat(filteredContainers.get(0).getId(), isOneOf(id1, id2)); - assertThat(filteredContainers.get(1).getId(), isOneOf(id1, id2)); + assertThat(filteredContainers.get(0).getId(), is(oneOf(id1, id2))); + assertThat(filteredContainers.get(1).getId(), is(oneOf(id1, id2))); } @Test - public void testIdsFilter() throws Exception { + public void testIdsFilter() { String id1, id2; id1 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withLabels(testLabel) @@ -183,21 +185,13 @@ public void testIdsFilter() throws Exception { .exec(); assertThat(filteredContainers.size(), is(2)); - assertThat(filteredContainers.get(0).getId(), isOneOf(id1, id2)); - assertThat(filteredContainers.get(1).getId(), isOneOf(id1, id2)); + assertThat(filteredContainers.get(0).getId(), is(oneOf(id1, id2))); + assertThat(filteredContainers.get(1).getId(), is(oneOf(id1, id2))); } @Test - public void testStatusFilter() throws Exception { - String id1, id2; - id1 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withCmd("sh", "-c", "sleep 99999") - .withLabels(testLabel) - .exec() - .getId(); - - id2 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withCmd("sh", "-c", "sleep 99999") + public void shouldFilterByCreatedStatus() { + String containerId = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withLabels(testLabel) .exec() .getId(); @@ -208,46 +202,71 @@ public void testStatusFilter() throws Exception { .withStatusFilter(singletonList("created")) .exec(); - assertThat(filteredContainers.size(), is(2)); - assertThat(filteredContainers.get(1).getId(), isOneOf(id1, id2)); + assertThat(filteredContainers.size(), is(1)); + assertThat(filteredContainers.get(0).getId(), is(containerId)); + } - dockerRule.getClient().startContainerCmd(id1).exec(); + @Test + public void shouldFilterByRunningStatus() { + String containerId = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withLabels(testLabel) + .exec() + .getId(); + dockerRule.getClient().startContainerCmd(containerId).exec(); - filteredContainers = dockerRule.getClient().listContainersCmd() + List filteredContainers = dockerRule.getClient().listContainersCmd() .withShowAll(true) .withLabelFilter(testLabel) .withStatusFilter(singletonList("running")) .exec(); - assertThat(filteredContainers.size(), is(1)); - assertThat(filteredContainers.get(0).getId(), is(id1)); + assertThat(filteredContainers, hasSize(1)); + assertThat(filteredContainers.get(0).getId(), is(containerId)); + } - dockerRule.getClient().pauseContainerCmd(id1).exec(); + @Test + public void shouldFilterByPausedStatus() { + String containerId = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withCmd("sh", "-c", "sleep 99999") + .withLabels(testLabel) + .exec() + .getId(); + dockerRule.getClient().startContainerCmd(containerId).exec(); + dockerRule.getClient().pauseContainerCmd(containerId).exec(); - filteredContainers = dockerRule.getClient().listContainersCmd() + List filteredContainers = dockerRule.getClient().listContainersCmd() .withShowAll(true) .withLabelFilter(testLabel) .withStatusFilter(singletonList("paused")) .exec(); - assertThat(filteredContainers.size(), is(1)); - assertThat(filteredContainers.get(0).getId(), is(id1)); + assertThat(filteredContainers, hasSize(1)); + assertThat(filteredContainers.get(0).getId(), is(containerId)); + } - dockerRule.getClient().unpauseContainerCmd(id1).exec(); - dockerRule.getClient().stopContainerCmd(id1).exec(); + @Test + public void shouldFilterByExitedStatus() throws InterruptedException { + String containerId = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withCmd("sh", "-c", "sleep 99999") + .withLabels(testLabel) + .exec() + .getId(); + dockerRule.getClient().startContainerCmd(containerId).exec(); + dockerRule.getClient().stopContainerCmd(containerId).exec(); + dockerRule.getClient().waitContainerCmd(containerId).start().awaitCompletion(15, TimeUnit.SECONDS); - filteredContainers = dockerRule.getClient().listContainersCmd() + List filteredContainers = dockerRule.getClient().listContainersCmd() .withShowAll(true) .withLabelFilter(testLabel) .withStatusFilter(singletonList("exited")) .exec(); - assertThat(filteredContainers.size(), is(1)); - assertThat(filteredContainers.get(0).getId(), is(id1)); + assertThat(filteredContainers, hasSize(1)); + assertThat(filteredContainers.get(0).getId(), is(containerId)); } @Test - public void testVolumeFilter() throws Exception { + public void testVolumeFilter() { String id; dockerRule.getClient().createVolumeCmd() .withName("TestFilterVolume") @@ -271,12 +290,12 @@ public void testVolumeFilter() throws Exception { .withVolumeFilter(singletonList("TestFilterVolume")) .exec(); - assertThat(filteredContainers.size(), is(1)); + assertThat(filteredContainers, hasSize(1)); assertThat(filteredContainers.get(0).getId(), is(id)); } @Test - public void testNetworkFilter() throws Exception { + public void testNetworkFilter() { String id; dockerRule.getClient().createNetworkCmd() .withName("TestFilterNetwork") @@ -311,11 +330,11 @@ public void testAncestorFilter() throws Exception { DockerAssume.assumeNotSwarm(dockerRule.getClient()); dockerRule.getClient().pullImageCmd("busybox") - .withTag("1.24") + .withTag("1.35") .start() .awaitCompletion(); - dockerRule.getClient().createContainerCmd("busybox:1.24") + dockerRule.getClient().createContainerCmd("busybox:1.35") .withLabels(testLabel) .exec(); @@ -337,7 +356,7 @@ public void testAncestorFilter() throws Exception { } @Test - public void testExitedFilter() throws Exception { + public void testExitedFilter() { dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withLabels(testLabel) .exec(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ListImagesCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ListImagesCmdIT.java index c89b98a0a..67ba85672 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ListImagesCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ListImagesCmdIT.java @@ -4,10 +4,12 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.api.model.Info; +import org.apache.commons.lang3.RandomUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Collections; import java.util.List; import static com.github.dockerjava.utils.TestUtils.isNotSwarm; @@ -15,6 +17,7 @@ import static org.hamcrest.Matchers.emptyArray; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.not; @@ -37,9 +40,9 @@ public void listImages() throws DockerException { Image img = images.get(0); assertThat(img.getCreated(), is(greaterThan(0L))); - assertThat(img.getVirtualSize(), is(greaterThan(0L))); + assertThat(img.getSize(), is(greaterThan(0L))); assertThat(img.getId(), not(is(emptyString()))); - assertThat(img.getRepoTags(), not(emptyArray())); + assertThat(img.getRepoTags(), emptyArray()); } @Test @@ -54,6 +57,36 @@ public void listImagesWithDanglingFilter() throws DockerException { assertTrue(imageInFilteredList); } + @Test + public void listImagesWithReferenceFilter() throws DockerException { + String tag = "" + RandomUtils.nextInt(0, Integer.MAX_VALUE); + + dockerRule.getClient().tagImageCmd("busybox:latest", "docker-java/busybox", tag).exec(); + try { + List images = dockerRule.getClient().listImagesCmd().withReferenceFilter("docker-java/busybox") + .exec(); + assertThat(images, hasSize(1)); + } + finally { + dockerRule.getClient().removeImageCmd("docker-java/busybox:" + tag).exec(); + } + } + + @Test + public void listImagesWithFilter() throws DockerException { + String tag = "" + RandomUtils.nextInt(0, Integer.MAX_VALUE); + + dockerRule.getClient().tagImageCmd("busybox:latest", "docker-java/busybox", tag).exec(); + try { + List images = dockerRule.getClient().listImagesCmd().withFilter("reference", Collections.singletonList("docker-java/busybox")) + .exec(); + assertThat(images, hasSize(1)); + } + finally { + dockerRule.getClient().removeImageCmd("docker-java/busybox:" + tag).exec(); + } + } + private boolean isImageInFilteredList(List images, String expectedImageId) { for (Image image : images) { if (expectedImageId.equals(image.getId())) { diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/LoadImageCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/LoadImageCmdIT.java index 5734163f9..36a8d51fc 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/LoadImageCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/LoadImageCmdIT.java @@ -1,5 +1,6 @@ package com.github.dockerjava.cmd; +import com.github.dockerjava.api.command.LoadImageCallback; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.utils.TestResources; import net.jcip.annotations.NotThreadSafe; @@ -24,7 +25,7 @@ public class LoadImageCmdIT extends CmdIT { @Before public void beforeMethod() { - expectedImageId = "sha256:56031f66eb0cef2e2e5cb2d1dabafaa0ebcd0a18a507d313b5bdb8c0472c5eba"; + expectedImageId = "sha256:28a8ed28c8b7bd9d7fc00f22ac7df6d385436b93e88ac978943f3dba06d836b4"; if (findImageWithId(expectedImageId, dockerRule.getClient().listImagesCmd().exec()) != null) { dockerRule.getClient().removeImageCmd(expectedImageId).exec(); } @@ -53,6 +54,19 @@ public void loadImageFromTar() throws Exception { asList(image.getRepoTags()), equalTo(singletonList("docker-java/load:1.0"))); } + @Test + public void loadImageFromTarAsync() throws Exception { + try (InputStream uploadStream = Files.newInputStream(TestResources.getApiImagesLoadTestTarball())) { + dockerRule.getClient().loadImageAsyncCmd(uploadStream).exec(new LoadImageCallback()).awaitMessage(); + } + + final Image image = findImageWithId(expectedImageId, dockerRule.getClient().listImagesCmd().exec()); + + assertThat("Can't find expected image after loading from a tar archive!", image, notNullValue()); + assertThat("Image after loading from a tar archive has wrong tags!", + asList(image.getRepoTags()), equalTo(singletonList("docker-java/load:1.0"))); + } + private Image findImageWithId(final String id, final List images) { for (Image image : images) { if (id.equals(image.getId())) { diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/LogContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/LogContainerCmdIT.java index b0de380db..8593d6ccf 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/LogContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/LogContainerCmdIT.java @@ -66,7 +66,7 @@ public void asyncLogContainerWithTtyEnabled() throws Exception { assertTrue(loggingCallback.toString().contains("hello")); - assertEquals(loggingCallback.getCollectedFrames().get(0).getStreamType(), StreamType.RAW); + assertEquals(StreamType.RAW, loggingCallback.getCollectedFrames().get(0).getStreamType()); } @Test @@ -206,6 +206,7 @@ public void asyncLogContainerWithSince() throws Exception { .withStdErr(true) .withStdOut(true) .withSince(timestamp) + .withUntil(timestamp + 1000) .exec(loggingCallback); loggingCallback.awaitCompletion(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/PullImageCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/PullImageCmdIT.java index 539a2b606..3b8dde3ff 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/PullImageCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/PullImageCmdIT.java @@ -45,7 +45,7 @@ public void testPullImage() throws Exception { // pulled down, preferably small in size. If tag is not used pull will // download all images in that repository but tmpImgs will only // deleted 'latest' image but not images with other tags - String testImage = "hackmann/empty"; + String testImage = "alpine:3.17"; LOG.info("Removing image: {}", testImage); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/PushImageCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/PushImageCmdIT.java index 7f55d5f9e..00cd11d51 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/PushImageCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/PushImageCmdIT.java @@ -36,7 +36,7 @@ public class PushImageCmdIT extends CmdIT { private AuthConfig authConfig; @Before - public void beforeTest() throws Exception { + public void beforeTest() { authConfig = REGISTRY.getAuthConfig(); } @@ -48,7 +48,7 @@ public void pushLatest() throws Exception { assertThat(container.getId(), not(is(emptyString()))); LOG.info("Committing container: {}", container.toString()); - String imgName = authConfig.getRegistryAddress() + "/" + dockerRule.getKind() + "-push-latest"; + String imgName = authConfig.getRegistryAddress() + "/push-latest"; String imageId = dockerRule.getClient().commitCmd(container.getId()) .withRepository(imgName) .exec(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveContainerCmdImplIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveContainerCmdImplIT.java index 01dfd954c..408098148 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveContainerCmdImplIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveContainerCmdImplIT.java @@ -23,7 +23,7 @@ public class RemoveContainerCmdImplIT extends CmdIT { @Test - public void removeContainer() throws Exception { + public void removeContainer() { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("true").exec(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveImageCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveImageCmdIT.java index c072eaf90..00d2e6cc1 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveImageCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveImageCmdIT.java @@ -24,7 +24,7 @@ public class RemoveImageCmdIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(RemoveImageCmdIT.class); @Test - public void removeImage() throws DockerException, InterruptedException { + public void removeImage() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999").exec(); LOG.info("Created container: {}", container.toString()); @@ -47,7 +47,7 @@ public void removeImage() throws DockerException, InterruptedException { } @Test(expected = NotFoundException.class) - public void removeNonExistingImage() throws DockerException, InterruptedException { + public void removeNonExistingImage() throws DockerException { dockerRule.getClient().removeImageCmd("non-existing").exec(); } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveVolumeCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveVolumeCmdIT.java index 76037e1e3..6d0fdf981 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveVolumeCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RemoveVolumeCmdIT.java @@ -17,7 +17,7 @@ public class RemoveVolumeCmdIT extends CmdIT { @Test(expected = NotFoundException.class) public void removeVolume() throws DockerException { - String volumeName = "volume1" + dockerRule.getKind(); + String volumeName = "volume1"; CreateVolumeResponse createVolumeResponse = dockerRule.getClient().createVolumeCmd() .withName(volumeName) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RenameContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RenameContainerCmdIT.java index fed3920b7..c50ebcf43 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RenameContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RenameContainerCmdIT.java @@ -31,7 +31,7 @@ public void renameContainer() throws DockerException { String name1 = inspectContainerResponse.getName(); dockerRule.getClient().renameContainerCmd(container.getId()) - .withName(dockerRule.getKind() + "renameContainer") + .withName("renameContainer") .exec(); InspectContainerResponse inspectContainerResponse2 = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); @@ -45,9 +45,9 @@ public void renameContainer() throws DockerException { } @Test(expected = NotFoundException.class) - public void renameExistingContainer() throws DockerException, InterruptedException { + public void renameExistingContainer() throws DockerException { dockerRule.getClient().renameContainerCmd("non-existing") - .withName(dockerRule.getKind() + "renameExistingContainer") + .withName("renameExistingContainer") .exec(); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java index cf2f43e92..592c9c650 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java @@ -1,18 +1,24 @@ package com.github.dockerjava.cmd; +import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.RemoteApiVersion; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE; +import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.not; +import static org.junit.Assume.assumeThat; public class RestartContainerCmdImplIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(RestartContainerCmdImplIT.class); @@ -44,8 +50,43 @@ public void restartContainer() throws DockerException { dockerRule.getClient().killContainerCmd(container.getId()).exec(); } + @Test + public void restartContainerWithSignal() throws Exception { + assumeThat("API version should be >= 1.42", dockerRule, isGreaterOrEqual(RemoteApiVersion.VERSION_1_42)); + + DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() + .withApiVersion(RemoteApiVersion.VERSION_1_44) + .withRegistryUrl("https://index.docker.io/v1/") + .build(); + try (DockerClient dockerClient = createDockerClient(dockerClientConfig)) { + String expectedUserSignal = "10"; + String initialCommandWithTrap = "trap 'echo \"exit trapped\"' %s; while :; do sleep 1; done"; + final String containerId = dockerClient + .createContainerCmd(DEFAULT_IMAGE) + .withCmd( + "/bin/sh", + "-c", + String.format(initialCommandWithTrap, expectedUserSignal)) + .exec() + .getId(); + assertThat(containerId, not(is(emptyString()))); + dockerClient.startContainerCmd(containerId).exec(); + + // Restart container without signal + dockerClient.restartContainerCmd(containerId).exec(); + String log = dockerRule.containerLog(containerId); + assertThat(log.trim(), emptyString()); + + dockerClient.restartContainerCmd(containerId).withSignal(expectedUserSignal).exec(); + log = dockerRule.containerLog(containerId); + assertThat(log.trim(), is("exit trapped")); + + dockerClient.removeContainerCmd(containerId).withForce(true).withRemoveVolumes(true).exec(); + } + } + @Test(expected = NotFoundException.class) - public void restartNonExistingContainer() throws DockerException, InterruptedException { + public void restartNonExistingContainer() throws DockerException { dockerRule.getClient().restartContainerCmd("non-existing").exec(); } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java index 76e4fe329..5d41889ca 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/StartContainerCmdIT.java @@ -44,7 +44,7 @@ public class StartContainerCmdIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(StartContainerCmdIT.class); @Test - public void startContainerWithVolumes() throws Exception { + public void startContainerWithVolumes() { // see http://docs.docker.io/use/working_with_volumes/ Volume volume1 = new Volume("/opt/webapp1"); @@ -171,7 +171,7 @@ public void startContainerWithDnsSearch() throws DockerException { @Test public void startContainerWithPortBindings() throws DockerException { - int baseport = 20_000 + (getFactoryType().ordinal() * 1000); + int baseport = 20_000; ExposedPort tcp22 = ExposedPort.tcp(22); ExposedPort tcp23 = ExposedPort.tcp(23); @@ -267,8 +267,8 @@ public void startContainerWithConflictingPortBindings() throws DockerException { @Test public void startContainerWithLinkingDeprecated() throws DockerException { - String container1Name = "containerWithLink1" + dockerRule.getKind(); - String container2Name = "containerWithLink2" + dockerRule.getKind(); + String container1Name = "containerWithLink1"; + String container2Name = "containerWithLink2"; dockerRule.ensureContainerRemoved(container1Name); dockerRule.ensureContainerRemoved(container2Name); @@ -328,8 +328,8 @@ public void startContainerWithLinkingDeprecated() throws DockerException { @Test public void startContainerWithLinking() throws DockerException { - String container1Name = "containerWithLinking1" + dockerRule.getKind(); - String container2Name = "containerWithLinking2" + dockerRule.getKind(); + String container1Name = "containerWithLinking1"; + String container2Name = "containerWithLinking2"; dockerRule.ensureContainerRemoved(container1Name); dockerRule.ensureContainerRemoved(container2Name); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/TagImageCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/TagImageCmdIT.java index 88bd28fd4..fc5894455 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/TagImageCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/TagImageCmdIT.java @@ -1,7 +1,7 @@ package com.github.dockerjava.cmd; import com.github.dockerjava.api.exception.NotFoundException; -import org.apache.commons.lang.math.RandomUtils; +import org.apache.commons.lang3.RandomUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,8 +11,8 @@ public class TagImageCmdIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(TagImageCmdIT.class); @Test - public void tagImage() throws Exception { - String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); + public void tagImage() { + String tag = "" + RandomUtils.nextInt(0, Integer.MAX_VALUE); dockerRule.getClient().tagImageCmd("busybox:latest", "docker-java/busybox", tag).exec(); @@ -20,9 +20,9 @@ public void tagImage() throws Exception { } @Test(expected = NotFoundException.class) - public void tagNonExistingImage() throws Exception { + public void tagNonExistingImage() { - String tag = "" + RandomUtils.nextInt(Integer.MAX_VALUE); + String tag = "" + RandomUtils.nextInt(0, Integer.MAX_VALUE); dockerRule.getClient().tagImageCmd("non-existing", "docker-java/busybox", tag).exec(); } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java index b21bbb533..e1e637809 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java @@ -31,7 +31,7 @@ public class UpdateContainerCmdIT extends CmdIT { @Test - public void updateContainer() throws DockerException, IOException { + public void updateContainer() throws DockerException { assumeThat("API version should be >= 1.22", dockerRule, isGreaterOrEqual(VERSION_1_22)); CreateContainerResponse response = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) @@ -48,8 +48,8 @@ public void updateContainer() throws DockerException, IOException { dockerRule.getClient().updateContainerCmd(containerId) .withBlkioWeight(300) .withCpuShares(512) - .withCpuPeriod(100000) - .withCpuQuota(50000) + .withCpuPeriod(100000L) + .withCpuQuota(50000L) // .withCpusetCpus("0") // depends on env .withCpusetMems("0") // .withMemory(209715200L + 2L) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/VersionCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/VersionCmdIT.java index 08a198b9f..90c7e534e 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/VersionCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/VersionCmdIT.java @@ -2,7 +2,7 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.Version; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,7 +22,7 @@ public void version() throws DockerException { assertTrue(version.getGoVersion().length() > 0); assertTrue(version.getVersion().length() > 0); - assertEquals(StringUtils.split(version.getVersion(), ".").length, 3); + assertEquals(3, StringUtils.split(version.getVersion(), ".").length); } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/WaitContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/WaitContainerCmdIT.java index a8269c82f..3a39b3eea 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/WaitContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/WaitContainerCmdIT.java @@ -8,18 +8,25 @@ import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.WaitContainerCondition; import com.github.dockerjava.api.model.WaitResponse; +import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.TimeUnit; +import static com.github.dockerjava.api.model.HostConfig.newHostConfig; +import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_25; +import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_30; +import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.not; +import static org.junit.Assume.assumeThat; public class WaitContainerCmdIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(BuildImageCmd.class); @@ -84,7 +91,7 @@ public void testWaitContainerAbort() throws Exception { } @Test - public void testWaitContainerTimeout() throws Exception { + public void testWaitContainerTimeout() { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "10").exec(); @@ -102,4 +109,77 @@ public void testWaitContainerTimeout() throws Exception { LOG.info(e.getMessage()); } } + + @Test + public void testWaitNotStartedContainer() { + assumeThat("API version should be > 1.25", dockerRule, isGreaterOrEqual(VERSION_1_25)); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withHostConfig(newHostConfig().withAutoRemove(true)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + + WaitContainerResultCallback callback = dockerRule.getClient().waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()); + + Integer statusCode = callback.awaitStatusCode(100, TimeUnit.MILLISECONDS); + Assert.assertEquals(0, statusCode.intValue()); + } + + @Test + public void testWaitContainerWithAutoRemoval() { + assumeThat("API version should be > 1.30", dockerRule, isGreaterOrEqual(VERSION_1_30)); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("false") + .withHostConfig(newHostConfig().withAutoRemove(true)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + + WaitContainerResultCallback removedCondition = dockerRule.getClient().waitContainerCmd(container.getId()) + .withCondition(WaitContainerCondition.REMOVED) + .exec(new WaitContainerResultCallback()); + + WaitContainerResultCallback nextExitCondition = dockerRule.getClient().waitContainerCmd(container.getId()) + .withCondition(WaitContainerCondition.NEXT_EXIT) + .exec(new WaitContainerResultCallback()); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + Assert.assertEquals(1, removedCondition.awaitStatusCode(100, TimeUnit.MILLISECONDS).intValue()); + Assert.assertEquals(1, nextExitCondition.awaitStatusCode(100, TimeUnit.MILLISECONDS).intValue()); + } + + @Test + public void testWaitRestartedContainer() { + assumeThat("API version should be > 1.30", dockerRule, isGreaterOrEqual(VERSION_1_30)); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("sh", "-c", "[ -f \"$HOME/.first_run_marker\" ] && exit 2 || { touch \"$HOME/.first_run_marker\"; exit 1; }") + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + + WaitContainerResultCallback firstExitCallback = dockerRule.getClient().waitContainerCmd(container.getId()) + .withCondition(WaitContainerCondition.NEXT_EXIT) + .exec(new WaitContainerResultCallback()); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + Integer firstStatusCode = firstExitCallback.awaitStatusCode(100, TimeUnit.MILLISECONDS); + Assert.assertEquals(1, firstStatusCode.intValue()); + + WaitContainerResultCallback callback = dockerRule.getClient().waitContainerCmd(container.getId()) + .withCondition(WaitContainerCondition.NEXT_EXIT) + .exec(new WaitContainerResultCallback()); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + Integer statusCode = callback.awaitStatusCode(100, TimeUnit.MILLISECONDS); + Assert.assertEquals(2, statusCode.intValue()); + } } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateConfigCmdExecIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateConfigCmdExecIT.java index aad681534..8ebb610b9 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateConfigCmdExecIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateConfigCmdExecIT.java @@ -2,7 +2,7 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateConfigResponse; -import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateSecretCmdExecIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateSecretCmdExecIT.java index 34a106af9..4644a8330 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateSecretCmdExecIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateSecretCmdExecIT.java @@ -5,7 +5,7 @@ import com.github.dockerjava.api.model.Secret; import com.github.dockerjava.api.model.SecretSpec; import com.google.common.collect.Lists; -import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.hamcrest.collection.IsCollectionWithSize; import org.junit.Test; import org.slf4j.Logger; @@ -21,7 +21,7 @@ public class CreateSecretCmdExecIT extends SwarmCmdIT { public static final Logger LOG = LoggerFactory.getLogger(CreateSecretCmdExecIT.class); @Test - public void testCreateSecret() throws Exception { + public void testCreateSecret() { DockerClient dockerClient = startSwarm(); int length = 10; boolean useLetters = true; diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateServiceCmdExecIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateServiceCmdExecIT.java index e50f35dd3..e221d9cd3 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateServiceCmdExecIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/CreateServiceCmdExecIT.java @@ -53,7 +53,7 @@ public class CreateServiceCmdExecIT extends SwarmCmdIT { private DockerClient dockerClient; @Before - public final void setUpCreateServiceCmdExecIT() throws Exception { + public final void setUpCreateServiceCmdExecIT() { authConfig = REGISTRY.getAuthConfig(); dockerClient = startSwarm(); } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/InspectConfigCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/InspectConfigCmdIT.java index 44fe845e0..12c69c996 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/InspectConfigCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/InspectConfigCmdIT.java @@ -4,13 +4,11 @@ import com.github.dockerjava.api.command.CreateConfigResponse; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.Config; -import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertEquals; public class InspectConfigCmdIT extends SwarmCmdIT { diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/JoinSwarmCmdExecIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/JoinSwarmCmdExecIT.java index 7d8838d5a..16f1b0911 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/JoinSwarmCmdExecIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/JoinSwarmCmdExecIT.java @@ -43,7 +43,7 @@ private SwarmJoinTokens initSwarmOnDocker(DockerClient docker) { } @Test - public void joinSwarmAsWorker() throws Exception { + public void joinSwarmAsWorker() { SwarmJoinTokens tokens = initSwarmOnDocker(docker1); docker2.joinSwarmCmd() @@ -58,7 +58,7 @@ public void joinSwarmAsWorker() throws Exception { } @Test - public void joinSwarmAsManager() throws DockerException, InterruptedException { + public void joinSwarmAsManager() throws DockerException { SwarmJoinTokens tokens = initSwarmOnDocker(docker1); docker2.joinSwarmCmd() @@ -73,7 +73,7 @@ public void joinSwarmAsManager() throws DockerException, InterruptedException { } @Test(expected = DockerException.class) - public void joinSwarmIfAlreadyInSwarm() throws Exception { + public void joinSwarmIfAlreadyInSwarm() { SwarmJoinTokens tokens = initSwarmOnDocker(docker1); initSwarmOnDocker(docker2); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListConfigCmdExecIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListConfigCmdExecIT.java index c13689c8c..2c19a7f0e 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListConfigCmdExecIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListConfigCmdExecIT.java @@ -4,7 +4,7 @@ import com.github.dockerjava.api.command.CreateConfigResponse; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.model.Config; -import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListSecretCmdExecIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListSecretCmdExecIT.java index a4b8f1288..ce90f23a0 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListSecretCmdExecIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListSecretCmdExecIT.java @@ -6,7 +6,7 @@ import com.github.dockerjava.api.model.Secret; import com.github.dockerjava.api.model.SecretSpec; import com.google.common.collect.Lists; -import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListServicesCmdExecIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListServicesCmdExecIT.java index 432c7d4bd..715ba60c8 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListServicesCmdExecIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListServicesCmdExecIT.java @@ -27,7 +27,7 @@ public class ListServicesCmdExecIT extends SwarmCmdIT { private static final String LABEL_VALUE = "test"; @Test - public void testListServices() throws Exception { + public void testListServices() { DockerClient dockerClient = startSwarm(); Map serviceLabels = Collections.singletonMap(LABEL_KEY, LABEL_VALUE); CreateServiceResponse response = dockerClient.createServiceCmd(new ServiceSpec() diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListSwarmNodesCmdExecIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListSwarmNodesCmdExecIT.java index 1a4f94c1d..853dc6c03 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListSwarmNodesCmdExecIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/ListSwarmNodesCmdExecIT.java @@ -12,7 +12,7 @@ public class ListSwarmNodesCmdExecIT extends SwarmCmdIT { @Test - public void testListSwarmNodes() throws Exception { + public void testListSwarmNodes() { DockerClient dockerClient = startSwarm(); List nodes = dockerClient.listSwarmNodesCmd().exec(); @@ -20,7 +20,7 @@ public void testListSwarmNodes() throws Exception { } @Test - public void testListSwarmNodesWithIdFilter() throws Exception { + public void testListSwarmNodesWithIdFilter() { DockerClient dockerClient = startSwarm(); List nodes = dockerClient.listSwarmNodesCmd().exec(); @@ -39,7 +39,7 @@ public void testListSwarmNodesWithIdFilter() throws Exception { } @Test - public void testListSwarmNodesWithNameFilter() throws Exception { + public void testListSwarmNodesWithNameFilter() { DockerClient dockerClient = startSwarm(); List nodes = dockerClient.listSwarmNodesCmd().exec(); @@ -58,7 +58,7 @@ public void testListSwarmNodesWithNameFilter() throws Exception { } @Test - public void testListSwarmNodesWithMembershipFilter() throws Exception { + public void testListSwarmNodesWithMembershipFilter() { DockerClient dockerClient = startSwarm(); List nodesWithAcceptedMembership = dockerClient.listSwarmNodesCmd() @@ -73,7 +73,7 @@ public void testListSwarmNodesWithMembershipFilter() throws Exception { } @Test - public void testListSwarmNodesWithRoleFilter() throws Exception { + public void testListSwarmNodesWithRoleFilter() { DockerClient dockerClient = startSwarm(); List nodesWithManagerRole = dockerClient.listSwarmNodesCmd() diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/LogSwarmObjectIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/LogSwarmObjectIT.java index ddaf86fb6..11606dce0 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/LogSwarmObjectIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/LogSwarmObjectIT.java @@ -12,6 +12,7 @@ import com.github.dockerjava.api.model.TaskSpec; import com.github.dockerjava.api.model.TaskState; import com.github.dockerjava.utils.LogContainerTestCallback; +import org.junit.Ignore; import org.junit.Test; import java.io.IOException; @@ -25,6 +26,8 @@ import static org.hamcrest.core.Is.is; public class LogSwarmObjectIT extends SwarmCmdIT { + + @Ignore @Test public void testLogsCmd() throws InterruptedException, IOException { DockerClient dockerClient = startSwarm(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/RemoveSwarmNodeCmdExecIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/RemoveSwarmNodeCmdExecIT.java new file mode 100644 index 000000000..8bdee6947 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/RemoveSwarmNodeCmdExecIT.java @@ -0,0 +1,44 @@ +package com.github.dockerjava.cmd.swarm; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Swarm; +import com.github.dockerjava.api.model.SwarmNode; +import com.github.dockerjava.api.model.SwarmNodeRole; +import com.google.common.collect.Lists; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Optional; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class RemoveSwarmNodeCmdExecIT extends SwarmCmdIT { + + private static final Logger LOGGER = LoggerFactory.getLogger(RemoveSwarmNodeCmdExecIT.class); + + @Test + public void testRemoveSwarmNode() throws Exception { + DockerClient dockerClient = startSwarm(); + Swarm swarm = dockerClient.inspectSwarmCmd().exec(); + + DockerClient docker2 = startDockerInDocker(); + docker2.joinSwarmCmd() + .withRemoteAddrs(Lists.newArrayList("docker1")) + .withJoinToken(swarm.getJoinTokens().getWorker()) + .exec(); + LOGGER.info("docker2 joined docker's swarm"); + + List nodes = dockerClient.listSwarmNodesCmd().exec(); + assertThat(2, is(nodes.size())); + Optional firstWorkNode = nodes.stream().filter(node -> node.getSpec().getRole() == SwarmNodeRole.WORKER) + .findFirst(); + dockerClient.removeSwarmNodeCmd(firstWorkNode.get().getId()) + .withForce(true) + .exec(); + nodes = dockerClient.listSwarmNodesCmd().exec(); + assertThat(nodes.size(), is(1)); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java index f88cb9873..36bcab840 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java @@ -20,6 +20,8 @@ import org.junit.experimental.categories.Category; import java.io.IOException; +import java.time.Duration; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -36,7 +38,7 @@ public abstract class SwarmCmdIT extends CmdIT { private static final String DOCKER_IN_DOCKER_IMAGE_REPOSITORY = "docker"; - private static final String DOCKER_IN_DOCKER_IMAGE_TAG = "17.12-dind"; + private static final String DOCKER_IN_DOCKER_IMAGE_TAG = "26.1.3-dind"; private static final String DOCKER_IN_DOCKER_CONTAINER_PREFIX = "docker"; @@ -47,7 +49,7 @@ public abstract class SwarmCmdIT extends CmdIT { private final Set startedContainerIds = new HashSet<>(); @Before - public final void setUpMultiNodeSwarmCmdIT() throws Exception { + public final void setUpMultiNodeSwarmCmdIT() { assumeThat(dockerRule, isGreaterOrEqual(VERSION_1_24)); } @@ -105,6 +107,8 @@ protected DockerClient startDockerInDocker() throws InterruptedException { ExposedPort exposedPort = ExposedPort.tcp(2375); CreateContainerResponse response = hostDockerClient .createContainerCmd(DOCKER_IN_DOCKER_IMAGE_REPOSITORY + ":" + DOCKER_IN_DOCKER_IMAGE_TAG) + .withEntrypoint("dockerd") + .withCmd(Arrays.asList("--host=tcp://0.0.0.0:2375", "--host=unix:///var/run/docker.sock", "--tls=false")) .withHostConfig(newHostConfig() .withNetworkMode(NETWORK_NAME) .withPortBindings(new PortBinding( @@ -125,7 +129,7 @@ protected DockerClient startDockerInDocker() throws InterruptedException { DockerClient dockerClient = initializeDockerClient(binding); - await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + await().pollDelay(Duration.ofSeconds(5)).atMost(10, TimeUnit.SECONDS).untilAsserted(() -> { dockerClient.pingCmd().exec(); }); @@ -136,6 +140,6 @@ private DockerClient initializeDockerClient(Ports.Binding binding) { DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() .withRegistryUrl("https://index.docker.io/v1/") .withDockerHost("tcp://" + binding).build(); - return getFactoryType().createDockerClient(config); + return createDockerClient(config); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/UpdateSwarmNodeIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/UpdateSwarmNodeIT.java index e307f671a..d26e051b1 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/UpdateSwarmNodeIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/UpdateSwarmNodeIT.java @@ -14,7 +14,7 @@ public class UpdateSwarmNodeIT extends SwarmCmdIT { @Test - public void testUpdateSwarmNode() throws Exception { + public void testUpdateSwarmNode() { DockerClient dockerClient = startSwarm(); List nodes = dockerClient.listSwarmNodesCmd().exec(); assertThat(1, is(nodes.size())); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/UpdateSwarmServiceIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/UpdateSwarmServiceIT.java index f98c3ed36..c477320bf 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/UpdateSwarmServiceIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/UpdateSwarmServiceIT.java @@ -21,13 +21,13 @@ public class UpdateSwarmServiceIT extends SwarmCmdIT { @Test - public void testUpdateServiceReplicate() throws Exception { + public void testUpdateServiceReplicate() { DockerClient dockerClient = startSwarm(); //create network String networkId = dockerClient.createNetworkCmd().withName("networkname").withDriver("overlay") .withIpam(new Network.Ipam().withDriver("default")).exec().getId(); TaskSpec taskSpec = new TaskSpec().withContainerSpec( - new ContainerSpec().withImage("busybox").withArgs(Arrays.asList("sleep", "3600"))); + new ContainerSpec().withImage("busybox").withArgs(Arrays.asList("sleep", "3600")).withInit(true)); ServiceSpec serviceSpec = new ServiceSpec() .withMode(new ServiceModeConfig().withReplicated(new ServiceReplicatedModeOptions().withReplicas(1))) .withTaskTemplate(taskSpec) diff --git a/docker-java/src/test/java/com/github/dockerjava/core/DefaultDockerClientConfigTest.java b/docker-java/src/test/java/com/github/dockerjava/core/DefaultDockerClientConfigTest.java index f7964f0dd..6c7787caf 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/DefaultDockerClientConfigTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/DefaultDockerClientConfigTest.java @@ -1,10 +1,10 @@ package com.github.dockerjava.core; -import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.AuthConfig; import com.github.dockerjava.api.model.AuthConfigurations; import com.google.common.io.Resources; -import org.apache.commons.lang.SerializationUtils; +import java.io.IOException; +import org.apache.commons.lang3.SerializationUtils; import org.junit.Test; import java.io.File; @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.util.UUID; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; @@ -22,17 +23,31 @@ import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; public class DefaultDockerClientConfigTest { public static final DefaultDockerClientConfig EXAMPLE_CONFIG = newExampleConfig(); + public static final DefaultDockerClientConfig EXAMPLE_CONFIG_FULLY_LOADED = newExampleConfigFullyLoaded(); private static DefaultDockerClientConfig newExampleConfig() { - String dockerCertPath = dockerCertPath(); + return new DefaultDockerClientConfig(URI.create("tcp://foo"), null, "dockerConfig", "apiVersion", "registryUrl", + "registryUsername", "registryPassword", "registryEmail", + new LocalDirectorySSLConfig(dockerCertPath)); + } - return new DefaultDockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + private static DefaultDockerClientConfig newExampleConfigFullyLoaded() { + try { + String dockerCertPath = dockerCertPath(); + String dockerConfig = "dockerConfig"; + DockerConfigFile loadedConfigFile = DockerConfigFile.loadConfig(DockerClientConfig.getDefaultObjectMapper(), dockerConfig); + return new DefaultDockerClientConfig(URI.create("tcp://foo"), loadedConfigFile, dockerConfig, "apiVersion", "registryUrl", + "registryUsername", "registryPassword", "registryEmail", new LocalDirectorySSLConfig(dockerCertPath)); + } catch (IOException exception) { + throw new RuntimeException(exception); + } } private static String homeDir() { @@ -44,12 +59,12 @@ private static String dockerCertPath() { } @Test - public void equals() throws Exception { + public void equals() { assertEquals(EXAMPLE_CONFIG, newExampleConfig()); } @Test - public void environmentDockerHost() throws Exception { + public void environmentDockerHost() { // given docker host in env Map env = new HashMap<>(); @@ -65,11 +80,60 @@ public void environmentDockerHost() throws Exception { // when you build a config DefaultDockerClientConfig config = buildConfig(env, systemProperties); - assertEquals(config.getDockerHost(), URI.create("tcp://baz:8768")); + assertEquals(URI.create("tcp://baz:8768"), config.getDockerHost()); + } + + @Test + public void dockerContextFromConfig() { + // given home directory with docker contexts configured + Properties systemProperties = new Properties(); + systemProperties.setProperty("user.home", "target/test-classes/dockerContextHomeDir"); + + // and an empty environment + Map env = new HashMap<>(); + + // when you build a config + DefaultDockerClientConfig config = buildConfig(env, systemProperties); + + assertEquals(URI.create("unix:///configcontext.sock"), config.getDockerHost()); + } + + @Test + public void dockerContextFromEnvironmentVariable() { + // given home directory with docker contexts + Properties systemProperties = new Properties(); + systemProperties.setProperty("user.home", "target/test-classes/dockerContextHomeDir"); + + // and an environment variable that overrides docker context + Map env = new HashMap<>(); + env.put(DefaultDockerClientConfig.DOCKER_CONTEXT, "envvarcontext"); + + // when you build a config + DefaultDockerClientConfig config = buildConfig(env, systemProperties); + + assertEquals(URI.create("unix:///envvarcontext.sock"), config.getDockerHost()); } @Test - public void environment() throws Exception { + public void dockerContextWithDockerHostAndTLS() { + // given home directory with docker contexts + Properties systemProperties = new Properties(); + systemProperties.setProperty("user.home", "target/test-classes/dockerContextHomeDir"); + + // and an environment variable that overrides docker context + Map env = new HashMap<>(); + env.put(DefaultDockerClientConfig.DOCKER_CONTEXT, "remote"); + + // when you build a config + DefaultDockerClientConfig config = buildConfig(env, systemProperties); + + assertEquals(URI.create("tcp://remote:2376"), config.getDockerHost()); + assertTrue("SSL config is set", config.getSSLConfig() instanceof LocalDirectorySSLConfig); + assertTrue("SSL directory is set", ((LocalDirectorySSLConfig)config.getSSLConfig()).getDockerCertPath().endsWith("dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker")); + } + + @Test + public void environment() { // given a default config in env properties Map env = new HashMap<>(); @@ -87,7 +151,7 @@ public void environment() throws Exception { DefaultDockerClientConfig config = buildConfig(env, new Properties()); // then we get the example object - assertEquals(config, EXAMPLE_CONFIG); + assertEquals(EXAMPLE_CONFIG_FULLY_LOADED, config); } @Test @@ -108,7 +172,7 @@ private DefaultDockerClientConfig buildConfig(Map env, Propertie } @Test - public void defaults() throws Exception { + public void defaults() { // given default cert path Properties systemProperties = new Properties(); @@ -119,16 +183,16 @@ public void defaults() throws Exception { DefaultDockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties); // then the cert path is as expected - assertEquals(config.getDockerHost(), URI.create("unix:///var/run/docker.sock")); - assertEquals(config.getRegistryUsername(), "someUserName"); - assertEquals(config.getRegistryUrl(), AuthConfig.DEFAULT_SERVER_ADDRESS); - assertEquals(config.getApiVersion(), RemoteApiVersion.unknown()); - assertEquals(config.getDockerConfigPath(), homeDir() + "/.docker"); + assertEquals(URI.create("unix:///var/run/docker.sock"), config.getDockerHost()); + assertEquals("someUserName", config.getRegistryUsername()); + assertEquals(AuthConfig.DEFAULT_SERVER_ADDRESS, config.getRegistryUrl()); + assertEquals(RemoteApiVersion.unknown(), config.getApiVersion()); + assertEquals(homeDir() + "/.docker", config.getDockerConfigPath()); assertNull(config.getSSLConfig()); } @Test - public void systemProperties() throws Exception { + public void systemProperties() { // given system properties based on the example Properties systemProperties = new Properties(); @@ -146,7 +210,7 @@ public void systemProperties() throws Exception { DefaultDockerClientConfig config = buildConfig(Collections. emptyMap(), systemProperties); // then it is the same as the example - assertEquals(config, EXAMPLE_CONFIG); + assertEquals(EXAMPLE_CONFIG_FULLY_LOADED, config); } @@ -159,41 +223,24 @@ public void serializableTest() { } @Test() - public void testSslContextEmpty() throws Exception { - new DefaultDockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + public void testSslContextEmpty() { + new DefaultDockerClientConfig(URI.create("tcp://foo"), new DockerConfigFile(), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", null); } @Test() - public void testTlsVerifyAndCertPath() throws Exception { - new DefaultDockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + public void testTlsVerifyAndCertPath() { + new DefaultDockerClientConfig(URI.create("tcp://foo"), new DockerConfigFile(), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", new LocalDirectorySSLConfig(dockerCertPath())); } - @Test(expected = DockerClientException.class) - public void testWrongHostScheme() throws Exception { - new DefaultDockerClientConfig(URI.create("http://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", - null); - } - - @Test() - public void testTcpHostScheme() throws Exception { - new DefaultDockerClientConfig(URI.create("tcp://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", - null); - } - @Test() - public void testUnixHostScheme() throws Exception { - new DefaultDockerClientConfig(URI.create("unix://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", - null); - } - - @Test() - public void testNpipeHostScheme() throws Exception { - new DefaultDockerClientConfig(URI.create("npipe://foo"), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", - null); + public void testAnyHostScheme() { + URI dockerHost = URI.create("a" + UUID.randomUUID().toString().replace("-", "") + "://foo"); + new DefaultDockerClientConfig(dockerHost, new DockerConfigFile(), "dockerConfig", "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", + null); } @Test @@ -265,10 +312,12 @@ public void dockerHostSetExplicitlyIfSetToDefaultByUser() { @Test - public void testGetAuthConfigurationsFromDockerCfg() throws URISyntaxException { + public void testGetAuthConfigurationsFromDockerCfg() throws URISyntaxException, IOException { File cfgFile = new File(Resources.getResource("com.github.dockerjava.core/registry.v1").toURI()); + DockerConfigFile dockerConfigFile = + DockerConfigFile.loadConfig(DockerClientConfig.getDefaultObjectMapper(), cfgFile.getAbsolutePath()); DefaultDockerClientConfig clientConfig = new DefaultDockerClientConfig(URI.create( - "unix://foo"), cfgFile.getAbsolutePath(), "apiVersion", "registryUrl", "registryUsername", "registryPassword", + "unix://foo"), dockerConfigFile, cfgFile.getAbsolutePath(), "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", null); AuthConfigurations authConfigurations = clientConfig.getAuthConfigurations(); @@ -281,10 +330,12 @@ public void testGetAuthConfigurationsFromDockerCfg() throws URISyntaxException { } @Test - public void testGetAuthConfigurationsFromConfigJson() throws URISyntaxException { + public void testGetAuthConfigurationsFromConfigJson() throws URISyntaxException, IOException { File cfgFile = new File(Resources.getResource("com.github.dockerjava.core/registry.v2").toURI()); + DockerConfigFile dockerConfigFile = + DockerConfigFile.loadConfig(DockerClientConfig.getDefaultObjectMapper(), cfgFile.getAbsolutePath()); DefaultDockerClientConfig clientConfig = new DefaultDockerClientConfig(URI.create( - "unix://foo"), cfgFile.getAbsolutePath(), "apiVersion", "registryUrl", "registryUsername", "registryPassword", + "unix://foo"), dockerConfigFile, cfgFile.getAbsolutePath(), "apiVersion", "registryUrl", "registryUsername", "registryPassword", "registryEmail", null); AuthConfigurations authConfigurations = clientConfig.getAuthConfigurations(); diff --git a/docker-java/src/test/java/com/github/dockerjava/core/DockerClientBuilderTest.java b/docker-java/src/test/java/com/github/dockerjava/core/DockerClientBuilderTest.java index be0bfda8a..d826a98ce 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/DockerClientBuilderTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/DockerClientBuilderTest.java @@ -34,7 +34,7 @@ public void testConcurrentClientBuilding() throws Exception { parallel(AMOUNT, runnable); // set contains all required unique instances - assertEquals(instances.size(), AMOUNT); + assertEquals(AMOUNT, instances.size()); } public static void parallel(int threads, final Runnable task) throws Exception { diff --git a/docker-java/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java b/docker-java/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java index 08f658d52..6ae88ffd1 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/DockerClientImplTest.java @@ -10,9 +10,10 @@ public class DockerClientImplTest { @Test - public void configuredInstanceAuthConfig() throws Exception { + public void configuredInstanceAuthConfig() { // given a config with null serverAddress - DefaultDockerClientConfig dockerClientConfig = new DefaultDockerClientConfig(URI.create("tcp://foo"), null, null, null, "", "", "", null); + DefaultDockerClientConfig dockerClientConfig = new DefaultDockerClientConfig(URI.create("tcp://foo"), + new DockerConfigFile(), null, null, null, "", "", "", null); DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig); // when we get the auth config @@ -21,12 +22,12 @@ public void configuredInstanceAuthConfig() throws Exception { throw new AssertionError(); } catch (NullPointerException e) { // then we get a NPE with expected message - assertEquals(e.getMessage(), "Configured serverAddress is null."); + assertEquals("Configured serverAddress is null.", e.getMessage()); } } @Test - public void defaultInstanceAuthConfig() throws Exception { + public void defaultInstanceAuthConfig() { System.setProperty("user.home", "target/test-classes/someHomeDir"); diff --git a/docker-java/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java b/docker-java/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java index 83bc124e9..76211fc55 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java @@ -150,12 +150,26 @@ public void validDockerConfig() throws IOException { assertThat(runTest("validDockerConfig"), is(expected)); } + @Test + public void validDockerConfigWithCurrentContext() throws IOException { + DockerConfigFile expected = new DockerConfigFile(); + expected.setCurrentContext("expectedContext"); + + assertThat(runTest("validDockerConfigWithCurrentContext"), is(expected)); + } + @Test public void nonExistent() throws IOException { DockerConfigFile expected = new DockerConfigFile(); assertThat(runTest("idontexist"), is(expected)); } + @Test + public void validJsonAuthsNull() throws IOException { + DockerConfigFile expected = new DockerConfigFile(); + assertThat(runTest("validJsonAuthsNull"), is(expected)); + } + private DockerConfigFile runTest(String testFileName) throws IOException { return DockerConfigFile.loadConfig(JSONTestHelper.getMapper(), new File(FILESROOT, testFileName).getAbsolutePath()); } diff --git a/docker-java/src/test/java/com/github/dockerjava/core/DockerRule.java b/docker-java/src/test/java/com/github/dockerjava/core/DockerRule.java index c4a66fb10..af606a5b1 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/DockerRule.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/DockerRule.java @@ -11,16 +11,13 @@ import com.github.dockerjava.api.exception.ConflictException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.cmd.CmdIT; -import com.github.dockerjava.transport.DockerHttpClient; import com.github.dockerjava.utils.LogContainerTestCallback; -import lombok.experimental.Delegate; import org.junit.rules.ExternalResource; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.Closeable; import java.io.File; import java.util.HashSet; import java.util.Set; @@ -34,21 +31,16 @@ public class DockerRule extends ExternalResource { private DockerClient dockerClient; - private CmdIT cmdIT; - private final Set createdContainerIds = new HashSet<>(); private final Set createdNetworkIds = new HashSet<>(); private final Set createdVolumeNames = new HashSet<>(); - public DockerRule(CmdIT cmdIT) { - this.cmdIT = cmdIT; - } - + private final DefaultDockerClientConfig config = config(); public DockerClient newClient() { - DockerClientImpl dockerClient = cmdIT.getFactoryType().createDockerClient(config()); + DockerClientImpl dockerClient = CmdIT.createDockerClient(config); dockerClient.withDockerCmdExecFactory( new DockerCmdExecFactoryDelegate(dockerClient.dockerCmdExecFactory) { @@ -92,6 +84,10 @@ protected DockerClient getDockerClient() { }; } + public DefaultDockerClientConfig getConfig() { + return config; + } + public DockerClient getClient() { if (dockerClient != null) { return dockerClient; @@ -178,7 +174,7 @@ private static DefaultDockerClientConfig config() { public static DefaultDockerClientConfig config(String password) { DefaultDockerClientConfig.Builder builder = DefaultDockerClientConfig.createDefaultConfigBuilder() - .withApiVersion(RemoteApiVersion.VERSION_1_30) + .withApiVersion(RemoteApiVersion.VERSION_1_44) .withRegistryUrl("https://index.docker.io/v1/"); if (password != null) { builder = builder.withRegistryPassword(password); @@ -202,10 +198,6 @@ public String containerLog(String containerId) throws Exception { .toString(); } - public String getKind() { - return cmdIT.getFactoryType().name().toLowerCase(); - } - public void ensureContainerRemoved(String container1Name) { try { getClient().removeContainerCmd(container1Name) @@ -217,55 +209,4 @@ public void ensureContainerRemoved(String container1Name) { } } - public void ensureImageRemoved(String imageId) { - try { - getClient().removeImageCmd(imageId) - .withForce(true) - .exec(); - } catch (NotFoundException ex) { - // ignore - } - } - - private static class CreateContainerCmdDelegate implements CreateContainerCmd { - @Delegate(excludes = Closeable.class) - private final CreateContainerCmd delegate; - - private CreateContainerCmdDelegate(CreateContainerCmd delegate) { - this.delegate = delegate; - } - - @Override - public void close() { - delegate.close(); - } - } - - private static class CreateNetworkCmdDelegate implements CreateNetworkCmd { - @Delegate(excludes = Closeable.class) - private final CreateNetworkCmd delegate; - - private CreateNetworkCmdDelegate(CreateNetworkCmd delegate) { - this.delegate = delegate; - } - - @Override - public void close() { - delegate.close(); - } - } - - private static class CreateVolumeCmdDelegate implements CreateVolumeCmd { - @Delegate(excludes = Closeable.class) - private final CreateVolumeCmd delegate; - - private CreateVolumeCmdDelegate(CreateVolumeCmd delegate) { - this.delegate = delegate; - } - - @Override - public void close() { - delegate.close(); - } - } } diff --git a/docker-java/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java b/docker-java/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java index b6dde97f5..11ea90e57 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/GoLangFileMatchTest.java @@ -85,7 +85,7 @@ public static Object[][] getTestData() { public MatchTestCase testCase; @Test - public void testMatch() throws IOException { + public void testMatch() { String pattern = testCase.pattern; String s = testCase.s; if (GoLangFileMatch.IS_WINDOWS) { diff --git a/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java b/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java index 234ed47a1..89ad131f6 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java @@ -7,7 +7,7 @@ import com.github.dockerjava.core.NameParser.HostnameReposName; import com.github.dockerjava.core.NameParser.ReposTag; import com.github.dockerjava.core.exception.InvalidRepositoryNameException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -21,7 +21,7 @@ public class NameParserTest { @Test - public void testValidateRepoName() throws Exception { + public void testValidateRepoName() { NameParser.validateRepoName("repository"); NameParser.validateRepoName("namespace/repository"); NameParser.validateRepoName("namespace-with-dashes/repository"); @@ -33,118 +33,159 @@ public void testValidateRepoName() throws Exception { } @Test(expected = InvalidRepositoryNameException.class) - public void testValidateRepoNameEmpty() throws Exception { + public void testValidateRepoNameEmpty() { NameParser.validateRepoName(""); } @Test(expected = InvalidRepositoryNameException.class) - public void testValidateRepoNameExceedsMaxLength() throws Exception { + public void testValidateRepoNameExceedsMaxLength() { NameParser.validateRepoName(StringUtils.repeat("repository", 255)); } @Test(expected = InvalidRepositoryNameException.class) - public void testValidateRepoNameEndWithDash() throws Exception { + public void testValidateRepoNameEndWithDash() { NameParser.validateRepoName("repository-"); } @Test(expected = InvalidRepositoryNameException.class) - public void testValidateRepoNameStartWithDash() throws Exception { + public void testValidateRepoNameStartWithDash() { NameParser.validateRepoName("-repository"); } @Test(expected = InvalidRepositoryNameException.class) - public void testValidateRepoNameEndWithDot() throws Exception { + public void testValidateRepoNameEndWithDot() { NameParser.validateRepoName("repository."); } @Test(expected = InvalidRepositoryNameException.class) - public void testValidateRepoNameStartWithDot() throws Exception { + public void testValidateRepoNameStartWithDot() { NameParser.validateRepoName(".repository"); } @Test(expected = InvalidRepositoryNameException.class) - public void testValidateRepoNameEndWithUnderscore() throws Exception { + public void testValidateRepoNameEndWithUnderscore() { NameParser.validateRepoName("repository_"); } @Test(expected = InvalidRepositoryNameException.class) - public void testValidateRepoNameStartWithUnderscore() throws Exception { + public void testValidateRepoNameStartWithUnderscore() { NameParser.validateRepoName("_repository"); } @Test(expected = InvalidRepositoryNameException.class) - public void testValidateRepoNameWithColon() throws Exception { + public void testValidateRepoNameWithColon() { NameParser.validateRepoName("repository:with:colon"); } @Test - public void testResolveSimpleRepositoryName() throws Exception { + public void testResolveSimpleRepositoryName() { HostnameReposName resolved = NameParser.resolveRepositoryName("repository"); - assertEquals(resolved, new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository")); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); } @Test - public void testResolveRepositoryNameWithNamespace() throws Exception { + public void testResolveRepositoryNameWithTag() { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository:tag"); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); + } + + @Test + public void testResolveRepositoryNameWithSHA256() { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository@sha256:sha256"); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); + } + + @Test + public void testResolveRepositoryNameWithTagAndSHA256() { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository:tag@sha256:sha256"); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); + } + + @Test + public void testResolveRepositoryNameWithNamespace() { HostnameReposName resolved = NameParser.resolveRepositoryName("namespace/repository"); - assertEquals(resolved, new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "namespace/repository")); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "namespace/repository"), resolved); } @Test - public void testResolveRepositoryNameWithNamespaceAndSHA256() throws Exception { + public void testResolveRepositoryNameWithNamespaceAndSHA256() { HostnameReposName resolved = NameParser.resolveRepositoryName("namespace/repository@sha256:sha256"); - assertEquals(resolved, new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "namespace/repository@sha256:sha256")); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "namespace/repository"), resolved); } @Test - public void testResolveRepositoryNameWithNamespaceAndHostname() throws Exception { + public void testResolveRepositoryNameWithNamespaceAndHostname() { HostnameReposName resolved = NameParser.resolveRepositoryName("localhost:5000/namespace/repository"); - assertEquals(resolved, new HostnameReposName("localhost:5000", "namespace/repository")); + assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); } @Test - public void testResolveRepositoryNameWithNamespaceAndHostnameAndSHA256() throws Exception { + public void testResolveRepositoryNameWithNamespaceAndHostnameAndSHA256() { HostnameReposName resolved = NameParser.resolveRepositoryName("localhost:5000/namespace/repository@sha256:sha256"); - assertEquals(resolved, new HostnameReposName("localhost:5000", "namespace/repository")); + assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); + } + + @Test + public void testResolveRepositoryNameWithNamespaceAndHostnameAndTag() { + HostnameReposName resolved = NameParser.resolveRepositoryName("localhost:5000/namespace/repository:tag"); + assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); + } + @Test + public void testResolveRepositoryNameWithNamespaceAndHostnameAndTagAndSHA256() { + HostnameReposName resolved = NameParser.resolveRepositoryName("localhost:5000/namespace/repository:tag@sha256:sha256"); + assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); } @Test(expected = InvalidRepositoryNameException.class) - public void testResolveRepositoryNameWithIndex() throws Exception { + public void testResolveRepositoryNameWithIndex() { NameParser.resolveRepositoryName("index.docker.io/repository"); } @Test - public void testResolveReposTagWithoutTagSimple() throws Exception { + public void testResolveReposTagWithoutTagSimple() { ReposTag resolved = NameParser.parseRepositoryTag("repository"); - assertEquals(resolved, new ReposTag("repository", "")); + assertEquals(new ReposTag("repository", ""), resolved); resolved = NameParser.parseRepositoryTag("namespace/repository"); - assertEquals(resolved, new ReposTag("namespace/repository", "")); + assertEquals(new ReposTag("namespace/repository", ""), resolved); resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository"); - assertEquals(resolved, new ReposTag("localhost:5000/namespace/repository", "")); + assertEquals(new ReposTag("localhost:5000/namespace/repository", ""), resolved); } @Test - public void testResolveReposTagWithTag() throws Exception { + public void testResolveReposTagWithTag() { ReposTag resolved = NameParser.parseRepositoryTag("repository:tag"); - assertEquals(resolved, new ReposTag("repository", "tag")); + assertEquals(new ReposTag("repository", "tag"), resolved); resolved = NameParser.parseRepositoryTag("namespace/repository:tag"); - assertEquals(resolved, new ReposTag("namespace/repository", "tag")); + assertEquals(new ReposTag("namespace/repository", "tag"), resolved); resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository:tag"); - assertEquals(resolved, new ReposTag("localhost:5000/namespace/repository", "tag")); + assertEquals(new ReposTag("localhost:5000/namespace/repository", "tag"), resolved); } @Test - public void testResolveReposTagWithSHA256() throws Exception { + public void testResolveReposTagWithSHA256() { ReposTag resolved = NameParser.parseRepositoryTag("repository@sha256:sha256"); - assertEquals(resolved, new ReposTag("repository@sha256:sha256", "")); + assertEquals(new ReposTag("repository@sha256:sha256", ""), resolved); resolved = NameParser.parseRepositoryTag("namespace/repository@sha256:sha256"); - assertEquals(resolved, new ReposTag("namespace/repository@sha256:sha256", "")); + assertEquals(new ReposTag("namespace/repository@sha256:sha256", ""), resolved); resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository@sha256:sha256"); - assertEquals(resolved, new ReposTag("localhost:5000/namespace/repository@sha256:sha256", "")); + assertEquals(new ReposTag("localhost:5000/namespace/repository@sha256:sha256", ""), resolved); + } + + @Test + public void testResolveReposTagWithTagAndSHA256() { + ReposTag resolved = NameParser.parseRepositoryTag("repository:tag@sha256:sha256"); + assertEquals(new ReposTag("repository:tag@sha256:sha256", ""), resolved); + + resolved = NameParser.parseRepositoryTag("namespace/repository:tag@sha256:sha256"); + assertEquals(new ReposTag("namespace/repository:tag@sha256:sha256", ""), resolved); + + resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository:tag@sha256:sha256"); + assertEquals(new ReposTag("localhost:5000/namespace/repository:tag@sha256:sha256", ""), resolved); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/core/RemoteApiVersionTest.java b/docker-java/src/test/java/com/github/dockerjava/core/RemoteApiVersionTest.java index a9446ffd4..06b825868 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/RemoteApiVersionTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/RemoteApiVersionTest.java @@ -1,6 +1,6 @@ package com.github.dockerjava.core; -import org.apache.commons.lang.SerializationUtils; +import org.apache.commons.lang3.SerializationUtils; import org.junit.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/docker-java/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java b/docker-java/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java index e8adff20b..580e278f4 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/command/FrameReaderTest.java @@ -34,7 +34,7 @@ public void endOfStreamReturnsNull() throws Exception { @Test public void stdInBytesFrameReturnsFrame() throws Exception { - assertEquals(nextFrame(0, 0, 0, 0, 0, 0, 0, 0), new Frame(StreamType.STDIN, new byte[0])); + assertEquals(new Frame(StreamType.STDIN, new byte[0]), nextFrame(0, 0, 0, 0, 0, 0, 0, 0)); } private Frame nextFrame(int... bytes) throws IOException { @@ -44,12 +44,12 @@ private Frame nextFrame(int... bytes) throws IOException { @Test public void stdOutBytesFrameReturnsFrame() throws Exception { - assertEquals(nextFrame(1, 0, 0, 0, 0, 0, 0, 0), new Frame(StreamType.STDOUT, new byte[0])); + assertEquals(new Frame(StreamType.STDOUT, new byte[0]), nextFrame(1, 0, 0, 0, 0, 0, 0, 0)); } @Test public void stdErrBytesFrameReturnsFrame() throws Exception { - assertEquals(nextFrame(2, 0, 0, 0, 0, 0, 0, 0), new Frame(StreamType.STDERR, new byte[0])); + assertEquals(new Frame(StreamType.STDERR, new byte[0]), nextFrame(2, 0, 0, 0, 0, 0, 0, 0)); } private void setBytes(int... bytes) { diff --git a/docker-java/src/test/java/com/github/dockerjava/core/util/CompressArchiveUtilTest.java b/docker-java/src/test/java/com/github/dockerjava/core/util/CompressArchiveUtilTest.java index 720441e20..f15085d1c 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/util/CompressArchiveUtilTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/util/CompressArchiveUtilTest.java @@ -241,7 +241,7 @@ private static void assertTarArchiveEntryIsExecutableFile(File archive, String f TarArchiveEntry tarArchiveEntry = getTarArchiveEntry(archive, fileName); assertNotNull(tarArchiveEntry); assertTrue(tarArchiveEntry.isFile()); - assertEquals("should be executable", (tarArchiveEntry.getMode() & 0755), 0755); + assertEquals("should be executable", 0755, (tarArchiveEntry.getMode() & 0755)); } private static void assertTarArchiveEntryIsSymlink(File archive, String fileName, String expectedTarget) throws IOException { diff --git a/docker-java/src/test/java/com/github/dockerjava/junit/PrivateRegistryRule.java b/docker-java/src/test/java/com/github/dockerjava/junit/PrivateRegistryRule.java index 7aae924f9..327bfc941 100644 --- a/docker-java/src/test/java/com/github/dockerjava/junit/PrivateRegistryRule.java +++ b/docker-java/src/test/java/com/github/dockerjava/junit/PrivateRegistryRule.java @@ -7,8 +7,8 @@ import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.cmd.CmdIT; import com.github.dockerjava.core.DockerRule; -import com.github.dockerjava.core.DockerClientBuilder; import org.junit.rules.ExternalResource; import java.io.File; @@ -29,7 +29,7 @@ public class PrivateRegistryRule extends ExternalResource { private String containerId; public PrivateRegistryRule() { - this.dockerClient = DockerClientBuilder.getInstance().build(); + this.dockerClient = CmdIT.createDockerClient(DockerRule.config(null)); } public AuthConfig getAuthConfig() { diff --git a/docker-java/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java b/docker-java/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java index 7585a7534..03019f383 100644 --- a/docker-java/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java @@ -43,7 +43,7 @@ public void testNettyDockerCmdExecFactoryConfigWithApiVersion() throws Exception Builder configBuilder = new DefaultDockerClientConfig.Builder() .withDockerTlsVerify(false) .withDockerHost("tcp://localhost:" + dockerPort) - .withApiVersion("1.23"); + .withApiVersion("1.44"); DockerClient client = DockerClientBuilder.getInstance(configBuilder) .withDockerCmdExecFactory(factory) @@ -56,8 +56,8 @@ public void testNettyDockerCmdExecFactoryConfigWithApiVersion() throws Exception List requests = server.getRequests(); - assertEquals(requests.size(), 1); - assertEquals(requests.get(0).uri(), "/v1.23/version"); + assertEquals(1, requests.size()); + assertEquals("/v1.44/version", requests.get(0).uri()); } finally { server.stop(); } @@ -83,8 +83,8 @@ public void testNettyDockerCmdExecFactoryConfigWithoutApiVersion() throws Except List requests = server.getRequests(); - assertEquals(requests.size(), 1); - assertEquals(requests.get(0).uri(), "/version"); + assertEquals(1, requests.size()); + assertEquals("/version", requests.get(0).uri()); } finally { server.stop(); } diff --git a/docker-java/src/test/java/com/github/dockerjava/netty/NettyWebTargetTest.java b/docker-java/src/test/java/com/github/dockerjava/netty/NettyWebTargetTest.java index adef3268f..4e7bb1da2 100644 --- a/docker-java/src/test/java/com/github/dockerjava/netty/NettyWebTargetTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/netty/NettyWebTargetTest.java @@ -17,12 +17,12 @@ public class NettyWebTargetTest { private ChannelProvider channelProvider; @Before - public void setUp() throws Exception { + public void setUp() { MockitoAnnotations.initMocks(this); } @Test - public void verifyImmutability() throws Exception { + public void verifyImmutability() { NettyWebTarget emptyWebTarget = new NettyWebTarget(JSONTestHelper.getMapper(), channelProvider, "DUMMY"); NettyWebTarget initWebTarget = emptyWebTarget.path("/containers/{id}/attach").resolveTemplate("id", "d03da378b592") @@ -31,12 +31,12 @@ public void verifyImmutability() throws Exception { NettyWebTarget anotherWebTarget = emptyWebTarget.path("/containers/{id}/attach") .resolveTemplate("id", "2cfada4e3c07").queryParam("stdin", "true"); - assertEquals(new NettyWebTarget(JSONTestHelper.getMapper(), channelProvider, "DUMMY"), emptyWebTarget); + assertEquals(emptyWebTarget, new NettyWebTarget(JSONTestHelper.getMapper(), channelProvider, "DUMMY")); - assertEquals(new NettyWebTarget(JSONTestHelper.getMapper(), channelProvider, "DUMMY").path("/containers/d03da378b592/attach") - .queryParam("logs", "true"), initWebTarget); + assertEquals(initWebTarget, new NettyWebTarget(JSONTestHelper.getMapper(), channelProvider, "DUMMY").path("/containers/d03da378b592/attach") + .queryParam("logs", "true")); - assertEquals(new NettyWebTarget(JSONTestHelper.getMapper(), channelProvider, "DUMMY").path("/containers/2cfada4e3c07/attach") - .queryParam("stdin", "true"), anotherWebTarget); + assertEquals(anotherWebTarget, new NettyWebTarget(JSONTestHelper.getMapper(), channelProvider, "DUMMY").path("/containers/2cfada4e3c07/attach") + .queryParam("stdin", "true")); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandlerTest.java b/docker-java/src/test/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandlerTest.java index 98161b072..ef903f942 100644 --- a/docker-java/src/test/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandlerTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/netty/handler/FramedResponseStreamHandlerTest.java @@ -87,7 +87,7 @@ public void channelRead0rawStream() throws Exception { objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); // Assert result - assertEquals(responseHandler.frames.get(0).toString(), "RAW: "); + assertEquals("RAW: ", responseHandler.frames.get(0).toString()); } @Test @@ -117,7 +117,7 @@ public void channelRead0stdIn() throws Exception { objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); // Assert result - assertEquals(responseHandler.frames.get(0).toString(), "STDIN: "); + assertEquals("STDIN: ", responseHandler.frames.get(0).toString()); } @Test @@ -132,7 +132,7 @@ public void channelRead0stdOut() throws Exception { objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); // Assert result - assertEquals(responseHandler.frames.get(0).toString(), "STDOUT: "); + assertEquals("STDOUT: ", responseHandler.frames.get(0).toString()); } @Test @@ -147,7 +147,7 @@ public void channelRead0stdErr() throws Exception { objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); // Assert result - assertEquals(responseHandler.frames.get(0).toString(), "STDERR: "); + assertEquals("STDERR: ", responseHandler.frames.get(0).toString()); } @Test @@ -162,7 +162,7 @@ public void channelRead0largePayload() throws Exception { objectUnderTest.channelRead0(Mockito.mock(ChannelHandlerContext.class), Unpooled.wrappedBuffer(msg)); // Assert result - assertEquals(responseHandler.frames.get(0).toString(), "STDOUT: "); + assertEquals("STDOUT: ", responseHandler.frames.get(0).toString()); } @Test @@ -179,6 +179,6 @@ public void exceptionCaught() throws Exception { objectUnderTest.exceptionCaught(Mockito.mock(ChannelHandlerContext.class), throwable); // Assert result - assertEquals(responseHandler.exceptions.get(0).getCause(), exception); + assertEquals(exception, responseHandler.exceptions.get(0).getCause()); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java b/docker-java/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java index 9433f97d6..9a2492062 100644 --- a/docker-java/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/netty/handler/HttpResponseStreamHandlerTest.java @@ -32,10 +32,10 @@ public void testNoBytesSkipped() throws Exception { ChannelHandlerContext ctx = Mockito.mock(ChannelHandlerContext.class); ByteBuf buffer = generateByteBuf(); ByteBuf readBuffer = buffer.copy(); - assertEquals(buffer.refCnt(), 1); + assertEquals(1, buffer.refCnt()); streamHandler.channelRead(ctx, buffer); streamHandler.channelInactive(ctx); - assertEquals(buffer.refCnt(), 0); + assertEquals(0, buffer.refCnt()); try (InputStream inputStream = callback.getInputStream()) { assertTrue(IOUtils.contentEquals(inputStream, new ByteBufInputStream(readBuffer))); } @@ -49,10 +49,10 @@ public void testReadByteByByte() throws Exception { ChannelHandlerContext ctx = Mockito.mock(ChannelHandlerContext.class); ByteBuf buffer = generateByteBuf(); ByteBuf readBuffer = buffer.copy(); - assertEquals(buffer.refCnt(), 1); + assertEquals(1, buffer.refCnt()); streamHandler.channelRead(ctx, buffer); streamHandler.channelInactive(ctx); - assertEquals(buffer.refCnt(), 0); + assertEquals(0, buffer.refCnt()); try (InputStream inputStream = callback.getInputStream()) { for (int i = 0; i < readBuffer.readableBytes(); i++) { int b = inputStream.read(); diff --git a/docker-java/src/test/java/com/github/dockerjava/utils/TestResources.java b/docker-java/src/test/java/com/github/dockerjava/utils/TestResources.java index 35ece680f..2a56333f1 100644 --- a/docker-java/src/test/java/com/github/dockerjava/utils/TestResources.java +++ b/docker-java/src/test/java/com/github/dockerjava/utils/TestResources.java @@ -1,5 +1,6 @@ package com.github.dockerjava.utils; +import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; @@ -8,7 +9,7 @@ public class TestResources { private TestResources() { } - public static Path getApiImagesLoadTestTarball() { - return Paths.get("src/test/resources/api/images/load/image.tar"); + public static Path getApiImagesLoadTestTarball() throws URISyntaxException { + return Paths.get(ClassLoader.getSystemResource("api/images/load/image.tar").toURI()); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/utils/TestUtils.java b/docker-java/src/test/java/com/github/dockerjava/utils/TestUtils.java index 87833343b..eb3af8deb 100644 --- a/docker-java/src/test/java/com/github/dockerjava/utils/TestUtils.java +++ b/docker-java/src/test/java/com/github/dockerjava/utils/TestUtils.java @@ -5,7 +5,7 @@ import com.github.dockerjava.core.RemoteApiVersion; import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/docker-java/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json b/docker-java/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json index 2f3428d7a..688ea2689 100644 --- a/docker-java/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json +++ b/docker-java/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json @@ -6,6 +6,7 @@ "postgres" ], "SizeRootFs" : null, + "SizeRw" : null, "HostConfig" : { "KernelMemory" : 0, "MemorySwappiness" : -1, diff --git a/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_empty.json b/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_empty.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_empty.json @@ -0,0 +1 @@ +{} diff --git a/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_warnings.json b/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_warnings.json new file mode 100644 index 000000000..edeaedc7a --- /dev/null +++ b/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_warnings.json @@ -0,0 +1,5 @@ +{ + "Warnings": [ + "Published ports are discarded when using host network mode" + ] +} diff --git a/docker-java/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_alreadyExists.json b/docker-java/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_alreadyExists.json new file mode 100644 index 000000000..ae318e29d --- /dev/null +++ b/docker-java/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_alreadyExists.json @@ -0,0 +1 @@ +{"status":"Already exists"} diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/config.json b/docker-java/src/test/resources/dockerContextHomeDir/.docker/config.json new file mode 100644 index 000000000..5bb2ebebe --- /dev/null +++ b/docker-java/src/test/resources/dockerContextHomeDir/.docker/config.json @@ -0,0 +1,4 @@ +{ + "auths": {}, + "currentContext": "configcontext" +} diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/meta/51699a7c75211315f1dbf6ecc40dfb0ffdd4ee11ecb2ce7853c9751aea1f9444/meta.json b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/meta/51699a7c75211315f1dbf6ecc40dfb0ffdd4ee11ecb2ce7853c9751aea1f9444/meta.json new file mode 100644 index 000000000..c6456d6b8 --- /dev/null +++ b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/meta/51699a7c75211315f1dbf6ecc40dfb0ffdd4ee11ecb2ce7853c9751aea1f9444/meta.json @@ -0,0 +1,12 @@ +{ + "Name": "envvarcontext", + "Metadata": { + "Description": "envvarcontext" + }, + "Endpoints": { + "docker": { + "Host": "unix:///envvarcontext.sock", + "SkipTLSVerify": false + } + } +} diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/meta/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/meta.json b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/meta/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/meta.json new file mode 100644 index 000000000..a4ff5b460 --- /dev/null +++ b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/meta/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/meta.json @@ -0,0 +1,15 @@ +{ + "Name": "remote", + "Metadata": { + "Description": "remote" + }, + "Endpoints": { + "docker": { + "Host": "tcp://remote:2376", + "SkipTLSVerify": false + } + }, + "Storage": { + "TLSPath": "target/test-classes/com/github/dockerjava/core/util/CertificateUtilsTest/allFilesExist" + } +} diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/meta/d090e08f0c9167acd72adef6d9fa07ec2de3a873cdd545dd8cb7fc7a10a1331a/meta.json b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/meta/d090e08f0c9167acd72adef6d9fa07ec2de3a873cdd545dd8cb7fc7a10a1331a/meta.json new file mode 100644 index 000000000..adff3b1c9 --- /dev/null +++ b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/meta/d090e08f0c9167acd72adef6d9fa07ec2de3a873cdd545dd8cb7fc7a10a1331a/meta.json @@ -0,0 +1,12 @@ +{ + "Name": "configcontext", + "Metadata": { + "Description": "configcontext" + }, + "Endpoints": { + "docker": { + "Host": "unix:///configcontext.sock", + "SkipTLSVerify": false + } + } +} diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/ca.pem b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/ca.pem new file mode 100644 index 000000000..e69de29bb diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/cert.pem b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/cert.pem new file mode 100644 index 000000000..e69de29bb diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/key.pem b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/key.pem new file mode 100644 index 000000000..e69de29bb diff --git a/docker-java/src/test/resources/samples/1.22/containers/json/filter1.json b/docker-java/src/test/resources/samples/1.22/containers/json/filter1.json index 159e62da6..51329bb63 100644 --- a/docker-java/src/test/resources/samples/1.22/containers/json/filter1.json +++ b/docker-java/src/test/resources/samples/1.22/containers/json/filter1.json @@ -10,6 +10,7 @@ "Created": 1455662451, "Ports": [], "SizeRootFs": 1113554, + "SizeRw": 0, "Labels": {}, "Status": "Up Less than a second", "HostConfig": { diff --git a/docker-java/src/test/resources/someHomeDir/.docker/config.json b/docker-java/src/test/resources/someHomeDir/.docker/config.json index 630394039..02ed0cf7f 100644 --- a/docker-java/src/test/resources/someHomeDir/.docker/config.json +++ b/docker-java/src/test/resources/someHomeDir/.docker/config.json @@ -1,9 +1,9 @@ { "auths":{ "https://index.docker.io/v1/":{ - "auth":"XXXX=", + "auth":"dXNlcm5hbWU6cGFzc3dvcmQ=", "email":"foo.bar@test.com" } } -} \ No newline at end of file +} diff --git a/docker-java/src/test/resources/testAuthConfigFile/validDockerConfigWithCurrentContext/config.json b/docker-java/src/test/resources/testAuthConfigFile/validDockerConfigWithCurrentContext/config.json new file mode 100644 index 000000000..8c5963f87 --- /dev/null +++ b/docker-java/src/test/resources/testAuthConfigFile/validDockerConfigWithCurrentContext/config.json @@ -0,0 +1,4 @@ +{ + "auths": {}, + "currentContext": "expectedContext" +} diff --git a/docker-java/src/test/resources/testAuthConfigFile/validJsonAuthsNull/config.json b/docker-java/src/test/resources/testAuthConfigFile/validJsonAuthsNull/config.json new file mode 100644 index 000000000..d104c357c --- /dev/null +++ b/docker-java/src/test/resources/testAuthConfigFile/validJsonAuthsNull/config.json @@ -0,0 +1,9 @@ +{ + "auths": null, + "credsStore": "desktop", + "plugins": { + "-x-cli-hints": { + "enabled": "true" + } + } +} diff --git a/docker-java/template.mf b/docker-java/template.mf index 274e6f917..2ce26d092 100644 --- a/docker-java/template.mf +++ b/docker-java/template.mf @@ -13,7 +13,7 @@ Import-Template: javax.ws.rs.*;version="[2.0.0, 2.1.0)", org.apache.commons.compress.*;version="${commons-compress.version:short}", org.apache.commons.io.*;version="${commons-io.version:short}", - org.apache.commons.lang.*;version="${commons-lang.version:short}", + org.apache.commons.lang3.*;version="${commons-lang3.version:short}", org.apache.http.*;version="[4.4.0, 4.6.0)", org.bouncycastle.*;version="${bouncycastle.version:short}", org.glassfish.jersey.*;version="${jersey.version:default}", diff --git a/docs/getting_started.md b/docs/getting_started.md index 012b721d4..7781e38ec 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -16,10 +16,15 @@ You will need an instance of `DockerClientConfig` to tell the library how to acc The builder is available and allows you to configure every property of the client: ```java +import com.github.dockerjava.core.DockerClientConfig +import com.github.dockerjava.core.DefaultDockerClientConfig DockerClientConfig standard = DefaultDockerClientConfig.createDefaultConfigBuilder().build(); ``` ```java +import com.github.dockerjava.core.DockerClientConfig +import com.github.dockerjava.core.DefaultDockerClientConfig + DockerClientConfig custom = DefaultDockerClientConfig.createDefaultConfigBuilder() .withDockerHost("tcp://docker.somewhere.tld:2376") .withDockerTlsVerify(true) diff --git a/pom.xml b/pom.xml index bb1a424e1..72add3980 100644 --- a/pom.xml +++ b/pom.xml @@ -57,23 +57,20 @@ 1.8 1.8 - 2.30.1 - 2.10.3 - 2.10.3 + 2.47 4.5.12 - 1.21 - 1.11 - 2.6 - 2.6 + 1.28.0 + 2.21.0 + 3.19.0 1.7.30 - 1.64 - 2.3.2 - 19.0 + 1.82 + 2.10.1 + 33.4.8-jre 1.2.3 - 4.1.46.Final + 4.2.7.Final 2.2 1.8 2.3.3 @@ -96,6 +93,7 @@ docker-java-bom docker-java-core docker-java-transport + docker-java-transport-tck docker-java-transport-netty docker-java-transport-jersey docker-java-transport-okhttp @@ -148,6 +146,7 @@ ${jdk.target} ${jdk.debug} ${jdk.optimize} + true @@ -162,6 +161,13 @@ + + + + ${automatic.module.name} + + + @@ -236,13 +242,13 @@ com.github.siom79.japicmp japicmp-maven-plugin - 0.14.3 + 0.24.2 com.github.docker-java ${project.artifactId} - 3.2.0 + 3.3.4 jar @@ -278,6 +284,17 @@ + + org.sonatype.central + central-publishing-maven-plugin + 0.9.0 + true + + central + docker-java-transport-tck + com.github.docker-java + + @@ -289,6 +306,9 @@ org.apache.maven.plugins maven-javadoc-plugin + + org.sonatype.central + central-publishing-maven-plugin @@ -300,6 +320,13 @@ org.apache.maven.plugins maven-gpg-plugin + + + + --pinentry-mode + loopback + + sign-artifacts