diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..5bbffc51f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +max_line_length = 140 +indent_style = space +indent_size = 4 +tab_width = 4 +insert_final_newline = true + +[*.java] +ij_java_class_count_to_use_import_on_demand = 9999 +ij_java_names_count_to_use_import_on_demand = 9999 + +[{*.pom,*.xml}] +indent_style = tab +ij_xml_attribute_wrap = off + + +[*.{yaml,yml}] +indent_size = 2 +ij_yaml_keep_indents_on_empty_lines = false 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 new file mode 100644 index 000000000..9bcef2d88 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,16 @@ +version: 2 +updates: +- package-ecosystem: maven + 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 new file mode 100644 index 000000000..f570cce43 --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,19 @@ +tag-template: $NEXT_PATCH_VERSION +name-template: '$NEXT_PATCH_VERSION' +categories: + - title: '🚀 Features' + labels: + - 'type/feature' + - title: '📈 Enhancements' + labels: + - 'type/enhancement' + - title: '🐛 Bug Fixes' + labels: + - 'type/bug' + - title: '🧰 Maintenance' + label: 'type/housekeeping' +change-template: '- $TITLE @$AUTHOR (#$NUMBER)' +template: | + ## Changes + + $CHANGES diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 000000000..23aefd1f3 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,16 @@ + +daysUntilStale: 90 + +daysUntilClose: 30 + +exemptLabels: + - resolution/acknowledged + +staleLabel: resolution/stale + +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + +closeComment: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..d7b105d1d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,55 @@ +name: CI + +on: + pull_request: {} + push: { branches: [ main ] } + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + include: + - { 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@v4 + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 8 + distribution: temurin + cache: maven + - name: Configure Docker + id: setup_docker + uses: docker/setup-docker-action@v4 + with: + channel: stable + tcp-port: 2375 + - name: Build with Maven + env: + DOCKER_HOST: ${{steps.setup_docker.outputs.tcp}} + run: ./mvnw --no-transfer-progress verify diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 000000000..99cd01cfc --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,16 @@ +name: Release Drafter + +on: + push: + # branches to consider in the event; optional, defaults to all + branches: + - main + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + # Drafts your next Release notes as Pull Requests are merged into "master" + - uses: release-drafter/release-drafter@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..16777daa6 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,32 @@ +name: Release + +on: + release: + types: + - prereleased + - released + +jobs: + build: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 8 + 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 main's CI status + - name: Deploy with Maven + env: + 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 8f1fdc779..006641e8c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,13 +6,14 @@ .project .settings .classpath +.factorypath # Ignore all build/dist directories target +dependency-reduced-pom.xml # Ignore InteliJ Idea project files -.idea -.idea/* +.idea/ *.iml *.iws *.ipr @@ -21,4 +22,5 @@ target *.log #Ignore Test Output -test-output \ No newline at end of file +test-output +/.checkstyle diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 000000000..b901097f2 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 000000000..2cc7d4a55 Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..642d572ce --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 985c35690..000000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: java -jdk: - - oraclejdk7 -after_success: - - echo "ossrh\${env.OSSRH_USER}\${env.OSSRH_PASS}" > ~/settings.xml - - mvn deploy -DskipITs --settings ~/settings.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index dd6e676c5..5d344d93b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,275 @@ Change Log === + +## 3.2.0 +- **Changelog is not maintained in this file. Please follow git diff or github releases.** +- Library was split into multiple modules to get ability to choose transports. +Okhttp was added (say thanks to @bsideup). +- Various cleanup, tests de-duplication internally. Planned binary compatibility breakage was reverted by @testcontainers project, so migration should work smoothly. Please switch to non-deprecated methods. +- Appeared various new commands and Fields(command options for existing commands). + +## 3.1.2 +- update unix-socket to 2.2.0 +- Remove `JacksonJaxbJsonProvider` from `FiltersEncoder` +- BuildImageCmdImpl: Fix an exception message +- Add support for target parameter in BuildImgCmd +- Add prune operations +- Updating Jackson due to CVEs +- Make StatsConfig public +- Set 3 mb as limit for json responce. + +## 3.1.1 +- Patch save image with tag +- [api/healthcheck] startPeriod is now a long + +## 3.1.0 +- Release + +## 3.1.0-rc-8 +- Do awaitCompletion upon socket close exception +- Fix `X-Registry-Auth` base64 encoding + +## 3.1.0-rc-7 +- Fix NPE when docker config file doesn't exist + +## 3.1.0-rc-6 +- Add resize feature to container and exec +- Update part of apis to 1.37 +- Update dependencies +- Fix No serializer found for class com.githubdockerjava.api.model.ServiceGlobalModeOptions +- Add HostConfig.StorageOpt and ExecCreateCmd.Env +- Added GCPLOGS enum LoggingType +- Stop proxying HostConfig class (static helper provided) +- Add ExecCreateCmd.Env +- Add failcnt into memorystatsconfig +- Support some missing Engine APIs +- Added memory swappiness to create container command. +- Fix for ignore all files except specified + +## 3.1.0-rc-5 +- Add missing properties in InspectContainer response +- Add withFilter methods in ListNetworksCmd & ListVolumesCmd +- Add WorkingDir property in containers exec +- Add isolation property support in Info response +- Support platform option in image build/create/pull commands +- Add OSVersion and RootFS support in InspectImageResponse +- Fix double-marshalling of cachefrom +- make AuthConfig compatible with indentitytoken +- Allow netty to handle compressed response bodies + +## 3.1.0-rc-4 +- Update deps +- fix HTTP/1.1 compliance (missing Host header) +- support rollback_completed value in ServiceUpdateState +- Add Privileged property to ExecCreateCmd +- Encode spaces as %20 rather than + in URL params +- Add tmpfs mount support since v1.29 +- Add support for swarm service/task logs +- Add mapping annotations to custom constructor +- Support network mode as part of the docker build +- support "rollback" as value for UpdateFailureAction +- Add "Pid" field to InspectExecResponse +- Add DiskQuota to HostConfig and CreateContainerCmd +- Add AutoRemove to HostConfig +- follow symbolic links when walking dir +- Use path from the configured docker host instead of hardcoded "/var/run/docker.sock" in netty factory +- Configure JerseyDockerCmdExecFactory to avoid chunked encoding + +## 3.1.0-rc-3 +- export TmpFs configuration for HostConfig and DockerClient +- avoid double encoding for url query string + +## 3.1.0-rc-2 +- https://github.com/docker-java/docker-java/pulls?q=is%3Apr+milestone%3A3.1.0-rc-2+is%3Aclosed + +## 3.1.0-rc-1 + A lot of changes... +- Swarm Mode support. +- Classic swarm support. +- various netty improvements +- Implement AbstractDockerCmdExecFactory + + +## 3.0.14 +- Encode spaces as %20 rather than + in URL params + +## 3.0.13 +- Fix .dockerignore handling on Windows +- Include empty directories in build context + +## 3.0.12 +- Make NettyDockerCmdExecFactory has compatibility both Linux and OSX automatically +- Fix double encoding for netty. +- filter config.json before unmarshalling (creds/auth) + +## 3.0.11 +- Add labels and attachable properties to network. +- Set default socket timeout for RequestConfig. +- Netty skip instead of throw error on non-linux os. +- Clean tmp file after upload. +- Filters ignore application/x-tar. +- Allow user to call connectionManager's closeIdleConnections. + +## 3.0.10 +- Support for cache-from in build image command +- Allow multiple tags in build image command +- Custom `db` logging type +- Allow an explicit Dockerfile location string to be specified to theuild command +- Fix image build for docker 17 with 'tagged' word. + +## 3.0.9 +- NettyDockerCmdExecFactory ignores API version +- exclude commons-logging from httpclient since docker-java uses slf4j/logback +- Generate OSGi compliant manifest +- AuthResponse may contains token. + +## 3.0.8 + - Use TLSv1.2 by default + - Health api + - Labels + - Support for multiple certificates + +## 3.0.7 + * https://github.com/docker-java/docker-java/milestone/17?closed=1 + * HostConfig pidLimits + * Label image during build + * Expose 'User' property on ExecCreateCmd #707 #708 + +## 3.0.6 + * Fixed issue with jersey and unix domain sockets. + * [#703](https://github.com/docker-java/docker-java/pull/703) Allow to configure connection pool timeout. + * Make all models Serializable. + * [NETTY] Fix loadImage responce on 1.24 API. + * LogPath field for inspect container. + * [#700] (https://github.com/docker-java/docker-java/pull/700) Bugfix:donot throw RuntimeException when a error occured in awaitCompletion(long,TimeUnit) + +## 3.0.5 + * Events updated to 1.24 API model. + +## 3.0.4 + * Make cert util methods public. + +## 3.0.3 + * [JERSEY] Don't send body for start container request. + +## 3.0.2 + * Enhanced Dockerignore filtering. + * Added shmsize for hostconfig. + * Exposed HostConfig instead of spaghetty calls. + +## 3.0.1 + +All changes +* Updated all dependencies +* [#643] (https://github.com/docker-java/docker-java/pull/643) Fixes for .dockerignore filtering +* [#627] (https://github.com/docker-java/docker-java/pull/627) Implementation of POST /images/load endpoint +* [#630] (https://github.com/docker-java/docker-java/pull/630) Fix: Second execution of a docker command in Netty implementation always fails +* [#596] (https://github.com/docker-java/docker-java/pull/596) Refactor configuration of SSL to allow override with custom config +* [#529] (https://github.com/docker-java/docker-java/pull/529) Refactor CertUtils. Support ECDSA and PrivateKey +* [#593] (https://github.com/docker-java/docker-java/pull/593) Added Device.parse() method with simple verification. + +v3.0.0 +--- +Notes + +* The 3.0.0 release contains multiple API breaking changes compared to 2.x therefore the major version switch. It supports a subset of v.1.22 of the docker remote API. It also includes an experimental netty based implementation of `DockerCmdExecFactory` that probably will replace the current jersey/httpclient based one in a later release. Take a look at the [Wiki](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) how to use it. +* The configuration has been changed to better match the docker CLI configuration options. The properties file was renamed from `docker.io.properties` to `docker-java.properties`. See README.md for details. + +All changes +* [#590] (https://github.com/docker-java/docker-java/pull/590) Fix default docker.properties to match with docker CLI defaults +* [#585] (https://github.com/docker-java/docker-java/pull/585) Add RootDir property to GraphData +* [#580] (https://github.com/docker-java/docker-java/pull/580) Fixes execute permissions for files when copied to container +* [#579] (https://github.com/docker-java/docker-java/pull/579) Adds missing name filter evaluation to netty version of ListImagesCmdExec +* [#578] (https://github.com/docker-java/docker-java/pull/578) Fix error during image build when Dockerfile in subdirectory of build context +* [#575] (https://github.com/docker-java/docker-java/pull/575) Support binding of port ranges +* [#574] (https://github.com/docker-java/docker-java/pull/574) Fix for copyArchiveToContainerCmd bug +* [#572] (https://github.com/docker-java/docker-java/pull/572) Inspect container command now shows sizes if requested +* [#563] (https://github.com/docker-java/docker-java/pull/563) Fix memory leak in netty implementation of DockerCmdExecFactory +* [#550] (https://github.com/docker-java/docker-java/pull/550) Add ability to configure IPAM config for CreateNetworkCmd +* [#484] (https://github.com/docker-java/docker-java/pull/484) Implement missing network api options for v1.22 + +Included in 3.0.0-RC5 + +* [#542] (https://github.com/docker-java/docker-java/pull/542) Fix large volumes of output from "docker exec" trigger out of memory error +* [#541] (https://github.com/docker-java/docker-java/pull/541) ImageInspectResponse.GraphDriver.Data is more complex structure +* [#534] (https://github.com/docker-java/docker-java/pull/534) Fix create volume command doesn't assign passed in volume driverOpts to field +* [#533] (https://github.com/docker-java/docker-java/pull/533) Added shmsize build option + +Included in 3.0.0-RC4 +* [#528] (https://github.com/docker-java/docker-java/pull/528) Fix DOCKER_TLS_VERIFY cannot be 'false' or empty +* [#527] (https://github.com/docker-java/docker-java/pull/527) Fix `mirrors` field is list and not a single string #527 +* [#510] (https://github.com/docker-java/docker-java/pull/510) Add CgroupParent option for create cmd +* [#509] (https://github.com/docker-java/docker-java/pull/509) Implement container rename api +* [#501] (https://github.com/docker-java/docker-java/pull/501) Fix execution of copy file/archive command skips 0xFF bytes +* [#500] (https://github.com/docker-java/docker-java/pull/500) Add aux to ResponseItem +* [#498] (https://github.com/docker-java/docker-java/issues/498) Update image inspect response + + +Included in 3.0.0-RC3 +* [#488] (https://github.com/docker-java/docker-java/pull/488) Support remote API 1.22 subset + +Included in 3.0.0-RC2 +* [#486] (https://github.com/docker-java/docker-java/pull/486) Fix NegativeArraySizeException in awaitCompletion() +* [#472] (https://github.com/docker-java/docker-java/pull/472) Exec start command: detect end of STDIN stream +* [#466] (https://github.com/docker-java/docker-java/pull/466) Fix exec start stdin encoding + +Included in 3.0.0-RC1 +* [#463] (https://github.com/docker-java/docker-java/pull/463) More logging drivers +* [#447] (https://github.com/docker-java/docker-java/pull/447) Refactoring of DockerClientConfig +* [#430] (https://github.com/docker-java/docker-java/pull/430) Fix ExecStartCmd failure +* [#426] (https://github.com/docker-java/docker-java/pull/426) Refactored filters API +* [#425] (https://github.com/docker-java/docker-java/pull/425) Implement Network API +* [#410] (https://github.com/docker-java/docker-java/pull/410) Support for build-args of docker build +* [#408] (https://github.com/docker-java/docker-java/pull/408) Support for volume API +* [#406] (https://github.com/docker-java/docker-java/pull/406) Added RestartCount to InspectContainerResponse +* [#396] (https://github.com/docker-java/docker-java/pull/396) Disable evaluation of http.proxy... variables when using unix socket connection +* [#393] (https://github.com/docker-java/docker-java/pull/393) Support ONBUILD instruction in Dockerfiles +* [#392] (https://github.com/docker-java/docker-java/pull/392) Introduce InspectContainerResponse.Mounts +* [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public +* [#386] (https://github.com/docker-java/docker-java/pull/386) Basic http proxy configuration support +* [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) +* [#359] (https://github.com/docker-java/docker-java/pull/359) Fix performance issue of build command by adding bulk-read variant of InputStream.read() +* [#357] (https://github.com/docker-java/docker-java/pull/357) Wait container command needs possibility to abort operation +* [#347] (https://github.com/docker-java/docker-java/pull/347) Implementation of copy archive to/from container commands +* [#313] (https://github.com/docker-java/docker-java/pull/313) Refactor primitive type fields to be of object type in JSON objects + +v2.2.3 +--- +* [#487] (https://github.com/docker-java/docker-java/pull/487) Fix NegativeArraySizeException in awaitCompletion() + +v2.2.2 +--- +* [#478] (https://github.com/docker-java/docker-java/pull/478) Remove debug println + +v2.2.1 +--- +* [#474] (https://github.com/docker-java/docker-java/pull/474) Fix periodic pull failure (2.x) + +v2.2.0 +--- +* [#457] (https://github.com/docker-java/docker-java/pull/457) Input configuration should not be altered as it breaks unix socket support +* [#430] (https://github.com/docker-java/docker-java/pull/430) Fix ExecStartCmd failure (backported from 3.0.0) + +v2.1.4 +--- + +* [#396] (https://github.com/docker-java/docker-java/pull/396) Disable evaluation of http.proxy... variables when using unix socket connection +* [#359] (https://github.com/docker-java/docker-java/pull/359) Fix performance issue of build command by adding bulk-read variant of InputStream.read() + +v2.1.3 +--- +* [#387] (https://github.com/docker-java/docker-java/pull/387) Make ProgressDetails attributes public +* [#386] (https://github.com/docker-java/docker-java/pull/386) Basic http proxy configuration support +* [#362] (https://github.com/docker-java/docker-java/pull/362) Deprecate "network" and enable "networks" stats (remote Docker API 1.21) + +v2.1.2 +--- +* [#350] (https://github.com/docker-java/docker-java/pull/350) Remove ServiceLoader logic +* [#344] (https://github.com/docker-java/docker-java/pull/344) Implement equals/hashCode for Filters +* [#335] (https://github.com/docker-java/docker-java/pull/335) Improve backward-compatibility support for older API versions +* [#333] (https://github.com/docker-java/docker-java/pull/333) Adding support for withPidMode + v2.1.1 --- * [#326] (https://github.com/docker-java/docker-java/pull/326) Add all missing fields to ResponseItem and related classes @@ -32,7 +301,7 @@ v2.0.0 Release notes * Some commands APIs has been changed to be callback-driven now to simplify the processing of the result streams for the client application. This affects namely the events, stats, log, attach, build, push and pull commands. Look at the Wiki how to [process events](https://github.com/docker-java/docker-java/wiki#handle-events) or how to [build an image](https://github.com/docker-java/docker-java/wiki#build-image-from-dockerfile) from dockerfile for example. -* The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmatically](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/master/src/test/resources/logback.xml) configuration file in the classpath. +* The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmatically](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/main/src/test/resources/logback.xml) configuration file in the classpath. All changes diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..5072b0864 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,58 @@ +# Build with Maven + +#### Prerequisites: + +* Java min 1.8 +* Maven 3 + +Build and run integration tests as follows: + + $ mvn clean install + +If you do not have access to a Docker server or just want to execute the build quickly, you can run the build without the integration tests: + + $ mvn clean install -DskipITs + +By default the docker engine is using local UNIX sockets for communication with the docker CLI so docker-java +client also uses UNIX domain sockets to connect to the docker daemon by default. To make the docker daemon listening on a TCP (http/https) port you have to configure it by setting the DOCKER_OPTS environment variable to something like the following: + + DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock" + +More details about setting up Docker Engine can be found in the official documentation: https://docs.docker.com/engine/admin/ + +To force docker-java to use TCP (http) configure the following (see [Configuration](https://github.com/docker-java/docker-java#configuration) for details): + + DOCKER_HOST=tcp://127.0.0.1:2375 + +For secure tls (https) communication: + + DOCKER_HOST=tcp://127.0.0.1:2376 + DOCKER_TLS_VERIFY=1 + DOCKER_CERT_PATH=/Users/marcus/.docker/machine/machines/docker-1.11.2 + + +# Code Design + * Model is based on Objects and not primitives that allows nullify requests and have null values for data + that wasn't provided by docker daemon. + * For null safeness findbugs annotations are used. + ** Every method that may return `null` (and we are unsure in any fields as docker daemon may change something) + should be annotated with `@CheckForNull` return qualifier from `javax.annotation` package. + ** Methods that can't return `null` must be annotated with `@Nonnull`. + ** The same for Arguments. + ** `@Nullable` must be used only for changing inherited (other typed) qualifier. + * Setters in builder style must be prefixed with `withXX`. + * All classes should provide `toString()` `equals()` and `hashCode()` defined methods. + * Javadocs + ** Provide full information on field: + *** For models define API version with `@since {@link RemoteApiVersion#VERSION_1_X}`. + ** getters/setters should refernce to field `@see #$field`. + * If it is `Serializable` it shall have a `serialVersionUID` field. Unless code has shipped to users, the initial value of the `serialVersionUID` field shall be `1L`. + +# Coding style + * Some initial styling already enforced with checkstyle. Please aim for consistency with the existing code. + +# Testing + * Unit tests for serder (serialization-deserialization). + * Integration tests for commands. + * If model object has builders, then fill it with data and compare by `equals()` with expected response + from docker daemon. If failed, then some fields mappings are wrong. \ No newline at end of file diff --git a/README.md b/README.md index fc86bd39c..b1fa9c89e 100644 --- a/README.md +++ b/README.md @@ -1,140 +1,9 @@ -[![Build Status](https://travis-ci.org/docker-java/docker-java.svg?branch=master)](https://travis-ci.org/docker-java/docker-java) - +[![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=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") -Supports a subset of the Docker Remote API [v1.19](https://github.com/docker/docker/blob/master/docs/reference/api/docker_remote_api_v1.19.md), Docker Server version 1.7.x - -The current implementation is based on Jersey 2.x and therefore classpath incompatible with older Jersey 1.x dependent libraries! - -Developer forum for [docker-java](https://groups.google.com/forum/?#!forum/docker-java-dev "docker-java") - -## Build with Maven - -###### Prerequisites: - -* Java 1.7 -* Maven 3.0.5 -* Docker 1.7.x - -If you need SSL, then you'll need to put your `*.pem` file into `~/.docker/`, if you're using boot2docker, do this: - - $ ln -s /Users/alex.collins/.boot2docker/certs/boot2docker-vm .docker - -Build and run integration tests as follows: - - $ mvn clean install - -If you do not have access to a Docker server or just want to execute the build quickly, you can run the build without the integration tests: - - $ mvn clean install -DskipITs - -By default Docker server is using UNIX sockets for communication with the Docker client, however docker-java -client uses TCP/IP to connect to the Docker server by default, so you will need to make sure that your Docker server is -listening on TCP port. To allow Docker server to use TCP add the following line to /etc/default/docker - - DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock" - -However you can force docker-java to use UNIX socket communication by configure the following url: - - unix:///var/run/docker.sock - -More details setting up Docker server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/ - -Now make sure that docker is up: - - $ docker -H tcp://127.0.0.1:2375 version - - Client version: 0.8.0 - Go version (client): go1.2 - Git commit (client): cc3a8c8 - Server version: 1.2.0 - Git commit (server): fa7b24f - Go version (server): go1.3.1 - -Run build without integration tests: - - $ mvn clean install -DskipITs - -## Docker-Java maven dependencies - -### Latest release version - - - com.github.docker-java - docker-java - 2.1.1 - - -### Latest SNAPSHOT version -You can find the latest SNAPSHOT version including javadoc and source files on [Sonatypes OSS repository](https://oss.sonatype.org/content/groups/public/com/github/docker-java/docker-java/). - - - - com.github.docker-java - docker-java - 2.1.2-SNAPSHOT - - -## Documentation - -For code examples, please look at the [Wiki](https://github.com/docker-java/docker-java/wiki) or [Test cases](https://github.com/docker-java/docker-java/tree/master/src/test/java/com/github/dockerjava/core/command "Test cases") - -## Configuration - -There are a couple of configuration items, all of which have sensible defaults: - -* `url` The Docker URL, e.g. `https://localhost:2376` or `unix:///var/run/docker.sock` -* `version` The API version, e.g. `1.16`. -* `username` Your registry username (required to push containers). -* `password` Your registry password. -* `email` Your registry email. -* `serverAddress` Your registry's address. -* `dockerCertPath` Path to the docker certs. - -There are three ways to configure, in descending order of precedence: - -#### Programmatic: -In your application, e.g. - - DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder() - .withVersion("1.16") - .withUri("https://my-docker-host.tld:2376") - .withUsername("dockeruser") - .withPassword("ilovedocker") - .withEmail("dockeruser@github.com") - .withServerAddress("https://index.docker.io/v1/") - .withDockerCertPath("/home/user/.docker") - .build(); - DockerClient docker = DockerClientBuilder.getInstance(config).build(); - -#### Properties - - docker.io.url=https://localhost:2376 - docker.io.version=1.16 - docker.io.username=dockeruser - docker.io.password=ilovedocker - docker.io.email=dockeruser@github.com - docker.io.serverAddress=https://index.docker.io/v1/ - docker.io.dockerCertPath=/home/user/.docker - - -##### System Properties: - - java -Ddocker.io.username=dockeruser pkg.Main - -##### System Environment - - export DOCKER_URL=http://localhost:2376 - -Note: we also auto-detect defaults. If you use `DOCKER_HOST` we use that value, and if `DOCKER_CERT_PATH` or `DOCKER_TLS_VERIFY=1` is set, we switch to SSL. - -##### File System - -In `$HOME/.docker.io.properties` - -##### Class Path - -In the class path at `/docker.io.properties` - +# [Read the documentation here](docs/README.md) diff --git a/circle.sh b/circle.sh index c84ca3fe6..b5b7cdbb0 100755 --- a/circle.sh +++ b/circle.sh @@ -6,7 +6,7 @@ case "$1" in mkdir .docker cp $CIRCLE_PROJECT_REPONAME/etc/certs/* .docker - # configure docker deamon to use SSL and provide the path to the certificates + # configure docker daemon to use SSL and provide the path to the certificates docker_opts='DOCKER_OPTS="$DOCKER_OPTS -H tcp://127.0.0.1:2376 --tlsverify --tlscacert='$HOME'/.docker/ca.pem --tlscert='$HOME'/.docker/server-cert.pem --tlskey='$HOME'/.docker/server-key.pem"' sudo sh -c "echo '$docker_opts' >> /etc/default/docker" diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml new file mode 100644 index 000000000..dda682ab1 --- /dev/null +++ b/docker-java-api/pom.xml @@ -0,0 +1,102 @@ + + 4.0.0 + + + com.github.docker-java + docker-java-parent + 0-SNAPSHOT + ../pom.xml + + + docker-java-api + jar + + docker-java-api + https://github.com/docker-java/docker-java + Java API Client for Docker + + + com.github.dockerjava.api + + + + + com.fasterxml.jackson.core + jackson-annotations + 2.20 + + + + org.slf4j + slf4j-api + ${slf4j-api.version} + + + + com.google.code.findbugs + annotations + 3.0.1u2 + provided + + + + org.projectlombok + lombok + 1.18.38 + provided + + + + + org.junit.jupiter + junit-jupiter + 5.13.4 + test + + + + com.tngtech.archunit + archunit-junit5 + 1.4.1 + test + + + + com.tngtech.archunit + archunit + 0.18.0 + test + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + com.github.dockerjava.api.* + + + + + com.github.siom79.japicmp + japicmp-maven-plugin + + + + com.github.dockerjava.api.command.UpdateContainerCmd#getCpuPeriod() + com.github.dockerjava.api.command.UpdateContainerCmd#withCpuPeriod(java.lang.Integer) + com.github.dockerjava.api.command.UpdateContainerCmd#getCpuQuota() + com.github.dockerjava.api.command.UpdateContainerCmd#withCpuQuota(java.lang.Integer) + com.github.dockerjava.api.command.InspectContainerResponse#getSizeRootFs() + com.github.dockerjava.api.command.InspectContainerResponse#getSizeRw() + + + + + + + diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java new file mode 100644 index 000000000..e5f57e1bb --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -0,0 +1,500 @@ +package com.github.dockerjava.api; + +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ConnectToNetworkCmd; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CreateConfigCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateNetworkCmd; +import com.github.dockerjava.api.command.CreateSecretCmd; +import com.github.dockerjava.api.command.CreateServiceCmd; +import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.command.InitializeSwarmCmd; +import com.github.dockerjava.api.command.InspectConfigCmd; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.InspectNetworkCmd; +import com.github.dockerjava.api.command.InspectServiceCmd; +import com.github.dockerjava.api.command.InspectSwarmCmd; +import com.github.dockerjava.api.command.InspectVolumeCmd; +import com.github.dockerjava.api.command.JoinSwarmCmd; +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.api.command.LeaveSwarmCmd; +import com.github.dockerjava.api.command.ListConfigsCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.ListNetworksCmd; +import com.github.dockerjava.api.command.ListSecretsCmd; +import com.github.dockerjava.api.command.ListServicesCmd; +import com.github.dockerjava.api.command.ListSwarmNodesCmd; +import com.github.dockerjava.api.command.ListTasksCmd; +import com.github.dockerjava.api.command.ListVolumesCmd; +import com.github.dockerjava.api.command.LoadImageAsyncCmd; +import com.github.dockerjava.api.command.LoadImageCmd; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.command.LogSwarmObjectCmd; +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PruneCmd; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.RemoveConfigCmd; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RemoveNetworkCmd; +import com.github.dockerjava.api.command.RemoveSecretCmd; +import com.github.dockerjava.api.command.RemoveServiceCmd; +import com.github.dockerjava.api.command.RemoveSwarmNodeCmd; +import com.github.dockerjava.api.command.RemoveVolumeCmd; +import com.github.dockerjava.api.command.RenameContainerCmd; +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.api.command.ResizeExecCmd; +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.api.command.SaveImageCmd; +import com.github.dockerjava.api.command.SaveImagesCmd; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.api.command.UpdateContainerCmd; +import com.github.dockerjava.api.command.UpdateServiceCmd; +import com.github.dockerjava.api.command.UpdateSwarmCmd; +import com.github.dockerjava.api.command.UpdateSwarmNodeCmd; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.Identifier; +import com.github.dockerjava.api.model.PruneType; +import com.github.dockerjava.api.model.SecretSpec; +import com.github.dockerjava.api.model.ServiceSpec; +import com.github.dockerjava.api.model.SwarmSpec; + +import javax.annotation.Nonnull; +import java.io.Closeable; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +// https://godoc.org/github.com/fsouza/go-dockerclient +public interface DockerClient extends Closeable { + + AuthConfig authConfig() throws DockerException; + + /** + * Authenticate with the server, useful for checking authentication. + */ + AuthCmd authCmd(); + + InfoCmd infoCmd(); + + PingCmd pingCmd(); + + VersionCmd versionCmd(); + + /** + * * IMAGE API * + */ + + PullImageCmd pullImageCmd(@Nonnull String repository); + + PushImageCmd pushImageCmd(@Nonnull String name); + + PushImageCmd pushImageCmd(@Nonnull Identifier identifier); + + CreateImageCmd createImageCmd(@Nonnull String repository, @Nonnull InputStream imageStream); + + /** + * Loads a tarball with a set of images and tags into a Docker repository. + * + * Corresponds to POST /images/load API endpoint. + * + * @param imageStream + * stream of the tarball file + * @return created command + * @since {@link RemoteApiVersion#VERSION_1_7} + */ + LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream); + + LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream); + + SearchImagesCmd searchImagesCmd(@Nonnull String term); + + RemoveImageCmd removeImageCmd(@Nonnull String imageId); + + ListImagesCmd listImagesCmd(); + + InspectImageCmd inspectImageCmd(@Nonnull String imageId); + + /** + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ + SaveImageCmd saveImageCmd(@Nonnull String name); + + /** + * Command to download multiple images at once. + * @return command (builder) + */ + SaveImagesCmd saveImagesCmd(); + + /** + * * CONTAINER API * + */ + + ListContainersCmd listContainersCmd(); + + CreateContainerCmd createContainerCmd(@Nonnull String image); + + /** + * Creates a new {@link StartContainerCmd} for the container with the given ID. The command can then be further customized by using + * builder methods on it like {@link StartContainerCmd#withDns(String...)}. + *

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

+ * This command corresponds to the /containers/{id}/start endpoint of the Docker Remote API. + */ + StartContainerCmd startContainerCmd(@Nonnull String containerId); + + ExecCreateCmd execCreateCmd(@Nonnull String containerId); + + ResizeExecCmd resizeExecCmd(@Nonnull String execId); + + InspectContainerCmd inspectContainerCmd(@Nonnull String containerId); + + RemoveContainerCmd removeContainerCmd(@Nonnull String containerId); + + WaitContainerCmd waitContainerCmd(@Nonnull String containerId); + + AttachContainerCmd attachContainerCmd(@Nonnull String containerId); + + ExecStartCmd execStartCmd(@Nonnull String execId); + + InspectExecCmd inspectExecCmd(@Nonnull String execId); + + LogContainerCmd logContainerCmd(@Nonnull String containerId); + + /** + * Copy resource from container to local machine. + * + * @param containerId + * id of the container + * @param resource + * path to container's resource + * @return created command + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(@Nonnull String containerId, @Nonnull String resource); + + /** + * Copy resource from container to local machine. + * + * @param containerId + * id of the container + * @param resource + * path to container's resource + * @return created command + * @see #copyArchiveFromContainerCmd(String, String) + * @deprecated since docker API version 1.20, replaced by {@link #copyArchiveFromContainerCmd(String, String)} + * since 1.24 fails. + */ + @Deprecated + CopyFileFromContainerCmd copyFileFromContainerCmd(@Nonnull String containerId, @Nonnull String resource); + + /** + * Copy archive from local machine to remote container + * + * @param containerId + * id of the container + * @return created command + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + CopyArchiveToContainerCmd copyArchiveToContainerCmd(@Nonnull String containerId); + + ContainerDiffCmd containerDiffCmd(@Nonnull String containerId); + + StopContainerCmd stopContainerCmd(@Nonnull String containerId); + + KillContainerCmd killContainerCmd(@Nonnull String containerId); + + /** + * Update container settings + * + * @param containerId id of the container + * @return command + * @since {@link RemoteApiVersion#VERSION_1_22} + */ + UpdateContainerCmd updateContainerCmd(@Nonnull String containerId); + + /** + * Rename container. + * + * @param containerId id of the container + * @return command + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + RenameContainerCmd renameContainerCmd(@Nonnull String containerId); + + RestartContainerCmd restartContainerCmd(@Nonnull String containerId); + + ResizeContainerCmd resizeContainerCmd(@Nonnull String containerId); + + CommitCmd commitCmd(@Nonnull String containerId); + + BuildImageCmd buildImageCmd(); + + BuildImageCmd buildImageCmd(File dockerFileOrFolder); + + BuildImageCmd buildImageCmd(InputStream tarInputStream); + + TopContainerCmd topContainerCmd(String containerId); + + TagImageCmd tagImageCmd(String imageId, String imageNameWithRepository, String tag); + + PauseContainerCmd pauseContainerCmd(String containerId); + + UnpauseContainerCmd unpauseContainerCmd(String containerId); + + EventsCmd eventsCmd(); + + StatsCmd statsCmd(String containerId); + + CreateVolumeCmd createVolumeCmd(); + + InspectVolumeCmd inspectVolumeCmd(String name); + + RemoveVolumeCmd removeVolumeCmd(String name); + + ListVolumesCmd listVolumesCmd(); + + ListNetworksCmd listNetworksCmd(); + + InspectNetworkCmd inspectNetworkCmd(); + + CreateNetworkCmd createNetworkCmd(); + + RemoveNetworkCmd removeNetworkCmd(@Nonnull String networkId); + + ConnectToNetworkCmd connectToNetworkCmd(); + + DisconnectFromNetworkCmd disconnectFromNetworkCmd(); + + /** + * Enables swarm mode for the docker engine and creates a new swarm cluster + * + * @since 1.24 + * @param swarmSpec the specification for the swarm + * @return the command + */ + InitializeSwarmCmd initializeSwarmCmd(SwarmSpec swarmSpec); + + /** + * Gets information about the swarm the docker engine is currently in + * + * @since 1.24 + * @return the command + */ + InspectSwarmCmd inspectSwarmCmd(); + + /** + * Enables swarm mode for the docker engine and joins an existing swarm cluster + * + * @since 1.24 + * @return the command + */ + JoinSwarmCmd joinSwarmCmd(); + + /** + * Disables swarm node for the docker engine and leaves the swarm cluster + * + * @since 1.24 + * @return the command + */ + LeaveSwarmCmd leaveSwarmCmd(); + + /** + * Updates the swarm specification + * + * @since 1.24 + * @param swarmSpec the specification for the swarm + * @return the command + */ + UpdateSwarmCmd updateSwarmCmd(SwarmSpec swarmSpec); + + /** + * Updates the swarm node + * + * @return the command + * @since 1.24 + */ + UpdateSwarmNodeCmd updateSwarmNodeCmd(); + + /** + * Remove the swarm node + * + * @param swarmNodeId swarmNodeId + * @return the command + * @since 1.24 + */ + RemoveSwarmNodeCmd removeSwarmNodeCmd(String swarmNodeId); + + /** + * List nodes in swarm + * + * @return the command + * @since 1.24 + */ + ListSwarmNodesCmd listSwarmNodesCmd(); + + /** + * Command to list all services in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + * @return command + */ + ListServicesCmd listServicesCmd(); + + /** + * Command to create a service in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + * @param serviceSpec the service specification + * @return command + */ + CreateServiceCmd createServiceCmd(ServiceSpec serviceSpec); + + /** + * Command to inspect a service + * @param serviceId service id or service name + * @return command + */ + InspectServiceCmd inspectServiceCmd(String serviceId); + + /** + * Command to update a service specification + * @param serviceId service id + * @param serviceSpec the new service specification + * @return command + */ + UpdateServiceCmd updateServiceCmd(String serviceId, ServiceSpec serviceSpec); + + /** + * Command to remove a service + * @param serviceId service id or service name + * @return command + */ + RemoveServiceCmd removeServiceCmd(String serviceId); + + /** + * List tasks in the swarm cluster + * + * @return the command + * @since 1.24 + */ + ListTasksCmd listTasksCmd(); + + /** + * Command to get service log + * + * @return the command + * @since 1.29 + */ + LogSwarmObjectCmd logServiceCmd(String serviceId); + + /** + * Command to get task log + * + * @return the command + * @since 1.29 + */ + LogSwarmObjectCmd logTaskCmd(String taskId); + + /** + * Command to delete unused containers/images/networks/volumes + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + PruneCmd pruneCmd(PruneType pruneType); + + /** + * Command to list all secrets. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_25} + * @return command + */ + ListSecretsCmd listSecretsCmd(); + + /** + * Command to create a secret in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_25} + * @param secretSpec the secret specification + * @return command + */ + CreateSecretCmd createSecretCmd(SecretSpec secretSpec); + + /** + * Command to remove a secret + * + * @since {@link RemoteApiVersion#VERSION_1_25} + * @param secretId secret id or secret name + * @return command + */ + RemoveSecretCmd removeSecretCmd(String secretId); + + + /** + * Command to list all configs. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_30} + * @return command + */ + ListConfigsCmd listConfigsCmd(); + + /** + * Command to create a config in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_30} + * @return command + */ + CreateConfigCmd createConfigCmd(); + + /** + * Command to inspect a service + * + * @since {@link RemoteApiVersion#VERSION_1_30} + * @param configId config id or config name + * @return command + */ + InspectConfigCmd inspectConfigCmd(String configId); + + /** + * Command to remove a config + * @since {@link RemoteApiVersion#VERSION_1_30} + * @param configId config id or config name + * @return command + */ + RemoveConfigCmd removeConfigCmd(String configId); + + + @Override + void close() throws IOException; + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java new file mode 100644 index 000000000..5de64641f --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java @@ -0,0 +1,527 @@ +package com.github.dockerjava.api; + +import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.AuthCmd; +import com.github.dockerjava.api.command.BuildImageCmd; +import com.github.dockerjava.api.command.CommitCmd; +import com.github.dockerjava.api.command.ConnectToNetworkCmd; +import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; +import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; +import com.github.dockerjava.api.command.CopyFileFromContainerCmd; +import com.github.dockerjava.api.command.CreateConfigCmd; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateImageCmd; +import com.github.dockerjava.api.command.CreateNetworkCmd; +import com.github.dockerjava.api.command.CreateSecretCmd; +import com.github.dockerjava.api.command.CreateServiceCmd; +import com.github.dockerjava.api.command.CreateVolumeCmd; +import com.github.dockerjava.api.command.DisconnectFromNetworkCmd; +import com.github.dockerjava.api.command.EventsCmd; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.github.dockerjava.api.command.InfoCmd; +import com.github.dockerjava.api.command.InitializeSwarmCmd; +import com.github.dockerjava.api.command.InspectConfigCmd; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectExecCmd; +import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.InspectNetworkCmd; +import com.github.dockerjava.api.command.InspectServiceCmd; +import com.github.dockerjava.api.command.InspectSwarmCmd; +import com.github.dockerjava.api.command.InspectVolumeCmd; +import com.github.dockerjava.api.command.JoinSwarmCmd; +import com.github.dockerjava.api.command.KillContainerCmd; +import com.github.dockerjava.api.command.LeaveSwarmCmd; +import com.github.dockerjava.api.command.ListConfigsCmd; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.ListImagesCmd; +import com.github.dockerjava.api.command.ListNetworksCmd; +import com.github.dockerjava.api.command.ListSecretsCmd; +import com.github.dockerjava.api.command.ListServicesCmd; +import com.github.dockerjava.api.command.ListSwarmNodesCmd; +import com.github.dockerjava.api.command.ListTasksCmd; +import com.github.dockerjava.api.command.ListVolumesCmd; +import com.github.dockerjava.api.command.LoadImageAsyncCmd; +import com.github.dockerjava.api.command.LoadImageCmd; +import com.github.dockerjava.api.command.LogContainerCmd; +import com.github.dockerjava.api.command.LogSwarmObjectCmd; +import com.github.dockerjava.api.command.PauseContainerCmd; +import com.github.dockerjava.api.command.PingCmd; +import com.github.dockerjava.api.command.PruneCmd; +import com.github.dockerjava.api.command.PullImageCmd; +import com.github.dockerjava.api.command.PushImageCmd; +import com.github.dockerjava.api.command.RemoveConfigCmd; +import com.github.dockerjava.api.command.RemoveContainerCmd; +import com.github.dockerjava.api.command.RemoveImageCmd; +import com.github.dockerjava.api.command.RemoveNetworkCmd; +import com.github.dockerjava.api.command.RemoveSecretCmd; +import com.github.dockerjava.api.command.RemoveServiceCmd; +import com.github.dockerjava.api.command.RemoveSwarmNodeCmd; +import com.github.dockerjava.api.command.RemoveVolumeCmd; +import com.github.dockerjava.api.command.RenameContainerCmd; +import com.github.dockerjava.api.command.ResizeContainerCmd; +import com.github.dockerjava.api.command.ResizeExecCmd; +import com.github.dockerjava.api.command.RestartContainerCmd; +import com.github.dockerjava.api.command.SaveImageCmd; +import com.github.dockerjava.api.command.SaveImagesCmd; +import com.github.dockerjava.api.command.SearchImagesCmd; +import com.github.dockerjava.api.command.StartContainerCmd; +import com.github.dockerjava.api.command.StatsCmd; +import com.github.dockerjava.api.command.StopContainerCmd; +import com.github.dockerjava.api.command.TagImageCmd; +import com.github.dockerjava.api.command.TopContainerCmd; +import com.github.dockerjava.api.command.UnpauseContainerCmd; +import com.github.dockerjava.api.command.UpdateContainerCmd; +import com.github.dockerjava.api.command.UpdateServiceCmd; +import com.github.dockerjava.api.command.UpdateSwarmCmd; +import com.github.dockerjava.api.command.UpdateSwarmNodeCmd; +import com.github.dockerjava.api.command.VersionCmd; +import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.Identifier; +import com.github.dockerjava.api.model.PruneType; +import com.github.dockerjava.api.model.SecretSpec; +import com.github.dockerjava.api.model.ServiceSpec; +import com.github.dockerjava.api.model.SwarmSpec; + +import javax.annotation.Nonnull; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +/** + * @apiNote implementations MUST override {{@link #getDockerClient()}} + * @implNote We're not using an abstract class here because we want + * Java compiler to force us to implement every {@link DockerClient}'s method, + * especially when new methods are added + */ +@SuppressWarnings("unused") +public class DockerClientDelegate implements DockerClient { + + protected DockerClient getDockerClient() { + throw new IllegalStateException("Implement me!"); + } + + @Override + public AuthConfig authConfig() throws DockerException { + return getDockerClient().authConfig(); + } + + @Override + public AuthCmd authCmd() { + return getDockerClient().authCmd(); + } + + @Override + public InfoCmd infoCmd() { + return getDockerClient().infoCmd(); + } + + @Override + public PingCmd pingCmd() { + return getDockerClient().pingCmd(); + } + + @Override + public VersionCmd versionCmd() { + return getDockerClient().versionCmd(); + } + + @Override + public PullImageCmd pullImageCmd(@Nonnull String repository) { + return getDockerClient().pullImageCmd(repository); + } + + @Override + public PushImageCmd pushImageCmd(@Nonnull String name) { + return getDockerClient().pushImageCmd(name); + } + + @Override + public PushImageCmd pushImageCmd(@Nonnull Identifier identifier) { + return getDockerClient().pushImageCmd(identifier); + } + + @Override + public CreateImageCmd createImageCmd(@Nonnull String repository, @Nonnull InputStream imageStream) { + return getDockerClient().createImageCmd(repository, imageStream); + } + + @Override + public LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream) { + return getDockerClient().loadImageCmd(imageStream); + } + + @Override + public LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream) { + return getDockerClient().loadImageAsyncCmd(imageStream); + } + + @Override + public SearchImagesCmd searchImagesCmd(@Nonnull String term) { + return getDockerClient().searchImagesCmd(term); + } + + @Override + public RemoveImageCmd removeImageCmd(@Nonnull String imageId) { + return getDockerClient().removeImageCmd(imageId); + } + + @Override + public ListImagesCmd listImagesCmd() { + return getDockerClient().listImagesCmd(); + } + + @Override + public InspectImageCmd inspectImageCmd(@Nonnull String imageId) { + return getDockerClient().inspectImageCmd(imageId); + } + + @Override + public SaveImageCmd saveImageCmd(@Nonnull String name) { + return getDockerClient().saveImageCmd(name); + } + + @Override + public SaveImagesCmd saveImagesCmd() { + return getDockerClient().saveImagesCmd(); + } + + @Override + public ListContainersCmd listContainersCmd() { + return getDockerClient().listContainersCmd(); + } + + @Override + public CreateContainerCmd createContainerCmd(@Nonnull String image) { + return getDockerClient().createContainerCmd(image); + } + + @Override + public StartContainerCmd startContainerCmd(@Nonnull String containerId) { + return getDockerClient().startContainerCmd(containerId); + } + + @Override + public ExecCreateCmd execCreateCmd(@Nonnull String containerId) { + return getDockerClient().execCreateCmd(containerId); + } + + @Override + public ResizeExecCmd resizeExecCmd(@Nonnull String execId) { + return getDockerClient().resizeExecCmd(execId); + } + + @Override + public InspectContainerCmd inspectContainerCmd(@Nonnull String containerId) { + return getDockerClient().inspectContainerCmd(containerId); + } + + @Override + public RemoveContainerCmd removeContainerCmd(@Nonnull String containerId) { + return getDockerClient().removeContainerCmd(containerId); + } + + @Override + public WaitContainerCmd waitContainerCmd(@Nonnull String containerId) { + return getDockerClient().waitContainerCmd(containerId); + } + + @Override + public AttachContainerCmd attachContainerCmd(@Nonnull String containerId) { + return getDockerClient().attachContainerCmd(containerId); + } + + @Override + public ExecStartCmd execStartCmd(@Nonnull String execId) { + return getDockerClient().execStartCmd(execId); + } + + @Override + public InspectExecCmd inspectExecCmd(@Nonnull String execId) { + return getDockerClient().inspectExecCmd(execId); + } + + @Override + public LogContainerCmd logContainerCmd(@Nonnull String containerId) { + return getDockerClient().logContainerCmd(containerId); + } + + @Override + public CopyArchiveFromContainerCmd copyArchiveFromContainerCmd(@Nonnull String containerId, @Nonnull String resource) { + return getDockerClient().copyArchiveFromContainerCmd(containerId, resource); + } + + @Override + @Deprecated + public CopyFileFromContainerCmd copyFileFromContainerCmd(@Nonnull String containerId, @Nonnull String resource) { + return getDockerClient().copyFileFromContainerCmd(containerId, resource); + } + + @Override + public CopyArchiveToContainerCmd copyArchiveToContainerCmd(@Nonnull String containerId) { + return getDockerClient().copyArchiveToContainerCmd(containerId); + } + + @Override + public ContainerDiffCmd containerDiffCmd(@Nonnull String containerId) { + return getDockerClient().containerDiffCmd(containerId); + } + + @Override + public StopContainerCmd stopContainerCmd(@Nonnull String containerId) { + return getDockerClient().stopContainerCmd(containerId); + } + + @Override + public KillContainerCmd killContainerCmd(@Nonnull String containerId) { + return getDockerClient().killContainerCmd(containerId); + } + + @Override + public UpdateContainerCmd updateContainerCmd(@Nonnull String containerId) { + return getDockerClient().updateContainerCmd(containerId); + } + + @Override + public RenameContainerCmd renameContainerCmd(@Nonnull String containerId) { + return getDockerClient().renameContainerCmd(containerId); + } + + @Override + public RestartContainerCmd restartContainerCmd(@Nonnull String containerId) { + return getDockerClient().restartContainerCmd(containerId); + } + + @Override + public ResizeContainerCmd resizeContainerCmd(@Nonnull String containerId) { + return getDockerClient().resizeContainerCmd(containerId); + } + + @Override + public CommitCmd commitCmd(@Nonnull String containerId) { + return getDockerClient().commitCmd(containerId); + } + + @Override + public BuildImageCmd buildImageCmd() { + return getDockerClient().buildImageCmd(); + } + + @Override + public BuildImageCmd buildImageCmd(File dockerFileOrFolder) { + return getDockerClient().buildImageCmd(dockerFileOrFolder); + } + + @Override + public BuildImageCmd buildImageCmd(InputStream tarInputStream) { + return getDockerClient().buildImageCmd(tarInputStream); + } + + @Override + public TopContainerCmd topContainerCmd(String containerId) { + return getDockerClient().topContainerCmd(containerId); + } + + @Override + public TagImageCmd tagImageCmd(String imageId, String imageNameWithRepository, String tag) { + return getDockerClient().tagImageCmd(imageId, imageNameWithRepository, tag); + } + + @Override + public PauseContainerCmd pauseContainerCmd(String containerId) { + return getDockerClient().pauseContainerCmd(containerId); + } + + @Override + public UnpauseContainerCmd unpauseContainerCmd(String containerId) { + return getDockerClient().unpauseContainerCmd(containerId); + } + + @Override + public EventsCmd eventsCmd() { + return getDockerClient().eventsCmd(); + } + + @Override + public StatsCmd statsCmd(String containerId) { + return getDockerClient().statsCmd(containerId); + } + + @Override + public CreateVolumeCmd createVolumeCmd() { + return getDockerClient().createVolumeCmd(); + } + + @Override + public InspectVolumeCmd inspectVolumeCmd(String name) { + return getDockerClient().inspectVolumeCmd(name); + } + + @Override + public RemoveVolumeCmd removeVolumeCmd(String name) { + return getDockerClient().removeVolumeCmd(name); + } + + @Override + public ListVolumesCmd listVolumesCmd() { + return getDockerClient().listVolumesCmd(); + } + + @Override + public ListNetworksCmd listNetworksCmd() { + return getDockerClient().listNetworksCmd(); + } + + @Override + public InspectNetworkCmd inspectNetworkCmd() { + return getDockerClient().inspectNetworkCmd(); + } + + @Override + public CreateNetworkCmd createNetworkCmd() { + return getDockerClient().createNetworkCmd(); + } + + @Override + public RemoveNetworkCmd removeNetworkCmd(@Nonnull String networkId) { + return getDockerClient().removeNetworkCmd(networkId); + } + + @Override + public ConnectToNetworkCmd connectToNetworkCmd() { + return getDockerClient().connectToNetworkCmd(); + } + + @Override + public DisconnectFromNetworkCmd disconnectFromNetworkCmd() { + return getDockerClient().disconnectFromNetworkCmd(); + } + + @Override + public InitializeSwarmCmd initializeSwarmCmd(SwarmSpec swarmSpec) { + return getDockerClient().initializeSwarmCmd(swarmSpec); + } + + @Override + public InspectSwarmCmd inspectSwarmCmd() { + return getDockerClient().inspectSwarmCmd(); + } + + @Override + public JoinSwarmCmd joinSwarmCmd() { + return getDockerClient().joinSwarmCmd(); + } + + @Override + public LeaveSwarmCmd leaveSwarmCmd() { + return getDockerClient().leaveSwarmCmd(); + } + + @Override + public UpdateSwarmCmd updateSwarmCmd(SwarmSpec swarmSpec) { + return getDockerClient().updateSwarmCmd(swarmSpec); + } + + @Override + public UpdateSwarmNodeCmd updateSwarmNodeCmd() { + return getDockerClient().updateSwarmNodeCmd(); + } + + @Override + public RemoveSwarmNodeCmd removeSwarmNodeCmd(String swarmNodeId) { + return getDockerClient().removeSwarmNodeCmd(swarmNodeId); + } + + @Override + public ListSwarmNodesCmd listSwarmNodesCmd() { + return getDockerClient().listSwarmNodesCmd(); + } + + @Override + public ListServicesCmd listServicesCmd() { + return getDockerClient().listServicesCmd(); + } + + @Override + public CreateServiceCmd createServiceCmd(ServiceSpec serviceSpec) { + return getDockerClient().createServiceCmd(serviceSpec); + } + + @Override + public InspectServiceCmd inspectServiceCmd(String serviceId) { + return getDockerClient().inspectServiceCmd(serviceId); + } + + @Override + public UpdateServiceCmd updateServiceCmd(String serviceId, ServiceSpec serviceSpec) { + return getDockerClient().updateServiceCmd(serviceId, serviceSpec); + } + + @Override + public RemoveServiceCmd removeServiceCmd(String serviceId) { + return getDockerClient().removeServiceCmd(serviceId); + } + + @Override + public ListTasksCmd listTasksCmd() { + return getDockerClient().listTasksCmd(); + } + + @Override + public LogSwarmObjectCmd logServiceCmd(String serviceId) { + return getDockerClient().logServiceCmd(serviceId); + } + + @Override + public LogSwarmObjectCmd logTaskCmd(String taskId) { + return getDockerClient().logTaskCmd(taskId); + } + + @Override + public PruneCmd pruneCmd(PruneType pruneType) { + return getDockerClient().pruneCmd(pruneType); + } + + @Override + public ListSecretsCmd listSecretsCmd() { + return getDockerClient().listSecretsCmd(); + } + + @Override + public CreateSecretCmd createSecretCmd(SecretSpec secretSpec) { + return getDockerClient().createSecretCmd(secretSpec); + } + + @Override + public RemoveSecretCmd removeSecretCmd(String secretId) { + return getDockerClient().removeSecretCmd(secretId); + } + + @Override + public ListConfigsCmd listConfigsCmd() { + return getDockerClient().listConfigsCmd(); + } + + @Override + public CreateConfigCmd createConfigCmd() { + return getDockerClient().createConfigCmd(); + } + + @Override + public InspectConfigCmd inspectConfigCmd(String configId) { + return getDockerClient().inspectConfigCmd(configId); + } + + @Override + public RemoveConfigCmd removeConfigCmd(String configId) { + return getDockerClient().removeConfigCmd(configId); + } + + @Override + public void close() throws IOException { + getDockerClient().close(); + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallback.java new file mode 100644 index 000000000..6a244d620 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallback.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.api.async; + +import java.io.Closeable; + +/** + * Result callback + */ +public interface ResultCallback extends Closeable { + + class Adapter extends ResultCallbackTemplate, A_RES_T> { + @Override + public void onNext(A_RES_T object) { + + } + } + + /** + * Called when the async processing starts respectively when the response arrives from the server. The passed {@link Closeable} can be + * used to close/interrupt the processing. + */ + void onStart(Closeable closeable); + + /** Called when an async result event occurs */ + void onNext(A_RES_T object); + + /** Called when an exception occurs while processing */ + void onError(Throwable throwable); + + /** Called when processing was finished either by reaching the end or by aborting it */ + void onComplete(); +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallbackTemplate.java b/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallbackTemplate.java new file mode 100644 index 000000000..911e67826 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/async/ResultCallbackTemplate.java @@ -0,0 +1,161 @@ +/* + * Created on 16.06.2015 + */ +package com.github.dockerjava.api.async; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Closeable; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * Abstract template implementation of {@link ResultCallback} + * + * @author Marcus Linke + * + */ +public abstract class ResultCallbackTemplate, A_RES_T> implements + ResultCallback { + + private static final Logger LOGGER = LoggerFactory.getLogger(ResultCallbackTemplate.class); + + private final CountDownLatch started = new CountDownLatch(1); + + private final CountDownLatch completed = new CountDownLatch(1); + + private Closeable stream; + + private boolean closed = false; + + private Throwable firstError = null; + + @Override + public void onStart(Closeable stream) { + this.stream = stream; + this.closed = false; + started.countDown(); + } + + @Override + public void onError(Throwable throwable) { + + if (closed) return; + + if (this.firstError == null) { + this.firstError = throwable; + } + + try { + LOGGER.error("Error during callback", throwable); + } finally { + try { + close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void onComplete() { + try { + close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void close() throws IOException { + if (!closed) { + closed = true; + try { + if (stream != null) { + stream.close(); + } + } finally { + completed.countDown(); + } + } + } + + /** + * Blocks until {@link ResultCallback#onComplete()} was called + */ + @SuppressWarnings("unchecked") + public RC_T awaitCompletion() throws InterruptedException { + try { + completed.await(); + // eventually (re)throws RuntimeException + throwFirstError(); + return (RC_T) this; + } finally { + try { + close(); + } catch (IOException e) { + LOGGER.debug("Failed to close", e); + } + } + } + + /** + * Blocks until {@link ResultCallback#onComplete()} was called or the given timeout occurs + * @return {@code true} if completed and {@code false} if the waiting time elapsed + * before {@link ResultCallback#onComplete()} was called. + */ + public boolean awaitCompletion(long timeout, TimeUnit timeUnit) throws InterruptedException { + try { + boolean result = completed.await(timeout, timeUnit); + throwFirstError(); + return result; + } finally { + try { + close(); + } catch (IOException e) { + LOGGER.debug("Failed to close", e); + } + } + } + + /** + * Blocks until {@link ResultCallback#onStart(Closeable)} was called. + * {@link ResultCallback#onStart(Closeable)} is called when the request was processed on the server + * side and the response is incoming. + */ + @SuppressWarnings("unchecked") + public RC_T awaitStarted() throws InterruptedException { + started.await(); + return (RC_T) this; + } + + /** + * Blocks until {@link ResultCallback#onStart(Closeable)} was called or the given timeout occurs. + * {@link ResultCallback#onStart(Closeable)} is called when the request was processed on the server side + * and the response is incoming. + * @return {@code true} if started and {@code false} if the waiting time elapsed + * before {@link ResultCallback#onStart(Closeable)} was called. + */ + public boolean awaitStarted(long timeout, TimeUnit timeUnit) throws InterruptedException { + return started.await(timeout, timeUnit); + } + + /** + * Throws the first occurred error as a runtime exception + * @throws com.github.dockerjava.api.exception.DockerException The first docker based Error + * @throws RuntimeException on any other occurred error + */ + protected void throwFirstError() { + if (firstError != null) { + if (firstError instanceof Error) { + throw (Error) firstError; + } + if (firstError instanceof RuntimeException) { + throw (RuntimeException) firstError; + } + throw new RuntimeException(firstError); + } + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java new file mode 100644 index 000000000..b2f287cc2 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AsyncDockerCmd.java @@ -0,0 +1,22 @@ +/* + * Created on 17.06.2015 + */ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.async.ResultCallbackTemplate; + +/** + * + * + * @author Marcus Linke + * + */ +public interface AsyncDockerCmd, A_RES_T> extends DockerCmd { + + > T exec(T resultCallback); + + default ResultCallbackTemplate start() { + return exec(new ResultCallback.Adapter<>()); + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java new file mode 100644 index 000000000..ddeb21c2d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AttachContainerCmd.java @@ -0,0 +1,70 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Frame; + +/** + * Attach to container + * + * @param logs + * - true or false, includes logs. Defaults to false. + * + * @param followStream + * - true or false, return stream. Defaults to false. + * @param stdout + * - true or false, includes stdout log. Defaults to false. + * @param stderr + * - true or false, includes stderr log. Defaults to false. + * @param timestamps + * - true or false, if true, print timestamps for every log line. Defaults to false. + */ +public interface AttachContainerCmd extends AsyncDockerCmd { + + @CheckForNull + String getContainerId(); + + @CheckForNull + Boolean hasLogsEnabled(); + + @CheckForNull + Boolean hasFollowStreamEnabled(); + + @CheckForNull + Boolean hasTimestampsEnabled(); + + @CheckForNull + Boolean hasStdoutEnabled(); + + @CheckForNull + Boolean hasStderrEnabled(); + + @CheckForNull + InputStream getStdin(); + + AttachContainerCmd withContainerId(@Nonnull String containerId); + + /** + * Following the stream means the resulting {@link InputStream} returned by {@link #exec()} reads infinitely. So a + * {@link InputStream#read()} MAY BLOCK FOREVER as long as no data is streamed from the docker host to {@link DockerClient}! + */ + AttachContainerCmd withFollowStream(Boolean followStream); + + AttachContainerCmd withTimestamps(Boolean timestamps); + + AttachContainerCmd withStdOut(Boolean stdout); + + AttachContainerCmd withStdErr(Boolean stderr); + + AttachContainerCmd withStdIn(InputStream stdin); + + AttachContainerCmd withLogs(Boolean logs); + + interface Exec extends DockerCmdAsyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/AuthCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AuthCmd.java new file mode 100644 index 000000000..f9ffbf859 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/AuthCmd.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.UnauthorizedException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.AuthResponse; + +import javax.annotation.CheckForNull; + +/** + * + * Authenticate with the server, useful for checking authentication. + * + */ +public interface AuthCmd extends SyncDockerCmd { + + @CheckForNull + AuthConfig getAuthConfig(); + + AuthCmd withAuthConfig(AuthConfig authConfig); + + /** + * @return The status. Based on it's value you may mean you need to authorise your account, e.g.: "Account created. Please see the + * documentation of the registry http://localhost:5000/v1/ for instructions how to activate it." + * @throws UnauthorizedException + * If you're not authorised (e.g. bad password). + */ + @Override + AuthResponse exec() throws UnauthorizedException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java new file mode 100644 index 000000000..1b7b76a67 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -0,0 +1,244 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.AuthConfigurations; +import com.github.dockerjava.api.model.BuildResponseItem; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.io.File; +import java.io.InputStream; +import java.net.URI; +import java.util.Map; +import java.util.Set; + +/** + * Build an image from Dockerfile. + *

+ * TODO: http://docs.docker.com/reference/builder/#dockerignore + * + * @see build-image-from-a-dockerfile + */ +public interface BuildImageCmd extends AsyncDockerCmd { + + // lib specific + + @CheckForNull + InputStream getTarInputStream(); + + @CheckForNull + AuthConfigurations getBuildAuthConfigs(); + + // getters + + /** + * "t" in API + * + * @deprecated since docker API version 1.21 there can be multiple tags + * specified so use {@link #getTags()} + */ + @CheckForNull + @Deprecated + String getTag(); + + /** + * Multple "t" tags. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + @CheckForNull + Set getTags(); + + /** + * "Cache-from" in API + */ + @CheckForNull + Set getCacheFrom(); + + /** + * "remote" in API + */ + @CheckForNull + URI getRemote(); + + /** + * "nocache" in API + */ + @CheckForNull + Boolean hasNoCacheEnabled(); + + /** + * "rm" in API + */ + @CheckForNull + Boolean hasRemoveEnabled(); + + /** + * "forcerm" in API + */ + @CheckForNull + Boolean isForcerm(); + + /** + * "q" in API + */ + @CheckForNull + Boolean isQuiet(); + + /** + * "pull" in API + */ + @CheckForNull + Boolean hasPullEnabled(); + + @CheckForNull + String getPathToDockerfile(); + + @CheckForNull + Long getMemory(); + + @CheckForNull + Long getMemswap(); + + @CheckForNull + String getCpushares(); + + @CheckForNull + String getCpusetcpus(); + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + @CheckForNull + Map getBuildArgs(); + + /** + * @since {@link RemoteApiVersion#VERSION_1_22} + */ + @CheckForNull + Long getShmsize(); + + /** + * @since {@link RemoteApiVersion#VERSION_1_23} + */ + @CheckForNull + Map getLabels(); + + /** + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + @CheckForNull + String getNetworkMode(); + + /** + * "platform" in API + * + * @since {@link RemoteApiVersion#VERSION_1_32} + */ + @CheckForNull + String getPlatform(); + + /** + * @since {@link RemoteApiVersion#VERSION_1_38} + */ + @CheckForNull + String getTarget(); + + /** + * @since {@link RemoteApiVersion#VERSION_1_28} + */ + @CheckForNull + Set getExtraHosts(); + + // setters + + /** + * @deprecated since docker API version 1.21 there can be multiple tags + * specified so use {@link BuildImageCmd#withTags(java.util.Set)} + */ + @Deprecated + BuildImageCmd withTag(String tag); + + BuildImageCmd withTags(Set tags); + + /* + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + BuildImageCmd withCacheFrom(Set cacheFrom); + + BuildImageCmd withRemote(URI remote); + + BuildImageCmd withBaseDirectory(File baseDirectory); + + BuildImageCmd withDockerfile(File dockerfile); + + BuildImageCmd withDockerfilePath(String dockerfilePath); + + BuildImageCmd withNoCache(Boolean noCache); + + BuildImageCmd withRemove(Boolean rm); + + BuildImageCmd withForcerm(Boolean forcerm); + + BuildImageCmd withQuiet(Boolean quiet); + + BuildImageCmd withPull(Boolean pull); + + BuildImageCmd withMemory(Long memory); + + BuildImageCmd withMemswap(Long memswap); + + BuildImageCmd withCpushares(String cpushares); + + BuildImageCmd withCpusetcpus(String cpusetcpus); + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + BuildImageCmd withBuildArg(String key, String value); + + // setters lib specific + + BuildImageCmd withBuildAuthConfigs(AuthConfigurations authConfig); + + BuildImageCmd withTarInputStream(@Nonnull InputStream tarInputStream); + + /** + * @since {@link RemoteApiVersion#VERSION_1_22} + */ + BuildImageCmd withShmsize(Long shmsize); + + /** + * @since {@link RemoteApiVersion#VERSION_1_23} + */ + BuildImageCmd withLabels(Map labels); + + /** + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + BuildImageCmd withNetworkMode(String networkMode); + + /** + *@since {@link RemoteApiVersion#VERSION_1_32} + */ + BuildImageCmd withPlatform(String platform); + + /** + * @since {@link RemoteApiVersion#VERSION_1_38} + */ + BuildImageCmd withTarget(String target); + + /** + * @since {@link RemoteApiVersion#VERSION_1_28} + */ + BuildImageCmd withExtraHosts(Set extraHosts); + + @Override + default BuildImageResultCallback start() { + return exec(new BuildImageResultCallback()); + } + + interface Exec extends DockerCmdAsyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java new file mode 100644 index 000000000..9db21a6c4 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java @@ -0,0 +1,80 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallbackTemplate; +import com.github.dockerjava.api.exception.DockerClientException; +import com.github.dockerjava.api.model.BuildResponseItem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.TimeUnit; + +/** + * + * @author Marcus Linke + * + */ +public class BuildImageResultCallback extends ResultCallbackTemplate { + + private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageResultCallback.class); + + private String imageId; + + private String error; + + @Override + public void onNext(BuildResponseItem item) { + if (item.isBuildSuccessIndicated()) { + this.imageId = item.getImageId(); + } else if (item.isErrorIndicated()) { + this.error = item.getError(); + } + LOGGER.debug("{}", item); + } + + /** + * Awaits the image id from the response stream. + * + * @throws DockerClientException + * if the build fails. + */ + public String awaitImageId() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + return getImageId(); + } + + /** + * Awaits the image id from the response stream. + * + * @throws DockerClientException + * if the build fails or the timeout occurs. + */ + public String awaitImageId(long timeout, TimeUnit timeUnit) { + try { + awaitCompletion(timeout, timeUnit); + } catch (InterruptedException e) { + throw new DockerClientException("Awaiting image id interrupted: ", e); + } + + return getImageId(); + } + + private String getImageId() { + if (error != null) { + throw new DockerClientException("Could not build image: " + error); + } + + if (imageId != null) { + return imageId; + } + + throw new DockerClientException("Could not build image"); + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CommitCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CommitCmd.java new file mode 100644 index 000000000..a182751b8 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CommitCmd.java @@ -0,0 +1,136 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import java.util.Map; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.ExposedPorts; +import com.github.dockerjava.api.model.Volumes; + +/** + * + * Create a new image from a container's changes. Returns the new image ID. + * + */ +public interface CommitCmd extends SyncDockerCmd { + + @CheckForNull + String getAuthor(); + + @CheckForNull + String getContainerId(); + + @CheckForNull + String[] getEnv(); + + @CheckForNull + ExposedPorts getExposedPorts(); + + @CheckForNull + String getHostname(); + + @CheckForNull + Map getLabels(); + + @CheckForNull + Integer getMemory(); + + @CheckForNull + Integer getMemorySwap(); + + @CheckForNull + String getMessage(); + + @CheckForNull + String[] getPortSpecs(); + + @CheckForNull + String getRepository(); + + @CheckForNull + String getTag(); + + @CheckForNull + String getUser(); + + @CheckForNull + Volumes getVolumes(); + + @CheckForNull + String getWorkingDir(); + + @CheckForNull + Boolean hasPauseEnabled(); + + @CheckForNull + Boolean isOpenStdin(); + + @CheckForNull + Boolean isStdinOnce(); + + @CheckForNull + Boolean isTty(); + + CommitCmd withAttachStderr(Boolean attachStderr); + + CommitCmd withAttachStdin(Boolean attachStdin); + + CommitCmd withAttachStdout(Boolean attachStdout); + + CommitCmd withAuthor(String author); + + CommitCmd withCmd(String... cmd); + + CommitCmd withContainerId(@Nonnull String containerId); + + CommitCmd withDisableNetwork(Boolean disableNetwork); + + CommitCmd withEnv(String... env); + + CommitCmd withExposedPorts(ExposedPorts exposedPorts); + + CommitCmd withHostname(String hostname); + + /** + * @since 1.19 + */ + CommitCmd withLabels(Map labels); + + CommitCmd withMemory(Integer memory); + + CommitCmd withMemorySwap(Integer memorySwap); + + CommitCmd withMessage(String message); + + CommitCmd withOpenStdin(Boolean openStdin); + + CommitCmd withPause(Boolean pause); + + CommitCmd withPortSpecs(String... portSpecs); + + CommitCmd withRepository(String repository); + + CommitCmd withStdinOnce(Boolean stdinOnce); + + CommitCmd withTag(String tag); + + CommitCmd withTty(Boolean tty); + + CommitCmd withUser(String user); + + CommitCmd withVolumes(Volumes volumes); + + CommitCmd withWorkingDir(String workingDir); + + /** + * @throws NotFoundException + * No such container + */ + @Override + String exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java new file mode 100644 index 000000000..e6868fd7d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ConnectToNetworkCmd.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.ContainerNetwork; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Connects a container to a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface ConnectToNetworkCmd extends SyncDockerCmd { + + @CheckForNull + String getNetworkId(); + + @CheckForNull + String getContainerId(); + + @CheckForNull + ContainerNetwork getContainerConfig(); + + ConnectToNetworkCmd withNetworkId(@Nonnull String networkId); + + ConnectToNetworkCmd withContainerId(@Nonnull String containerId); + + ConnectToNetworkCmd withContainerNetwork(@Nonnull ContainerNetwork endpointConfig); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java new file mode 100644 index 000000000..b64a13233 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ContainerDiffCmd.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.api.command; + +import java.util.List; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.exception.InternalServerErrorException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.ChangeLog; + +public interface ContainerDiffCmd extends SyncDockerCmd> { + + @CheckForNull + String getContainerId(); + + ContainerDiffCmd withContainerId(@Nonnull String containerId); + + @Override + String toString(); + + /** + * @throws NotFoundException + * No such container + * @throws InternalServerErrorException + * server error + * @throws DockerException + * unexpected http status code + */ + @Override + List exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec> { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java new file mode 100644 index 000000000..4ed28c01f --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveFromContainerCmd.java @@ -0,0 +1,38 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +public interface CopyArchiveFromContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + @CheckForNull + String getHostPath(); + + @CheckForNull + String getResource(); + + CopyArchiveFromContainerCmd withContainerId(@Nonnull String containerId); + + CopyArchiveFromContainerCmd withHostPath(String hostPath); + + CopyArchiveFromContainerCmd withResource(@Nonnull String resource); + + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException + * No such container + */ + @Override + InputStream exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} 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 new file mode 100644 index 000000000..19b3c3843 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java @@ -0,0 +1,81 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import com.github.dockerjava.api.exception.NotFoundException; + +public interface CopyArchiveToContainerCmd extends SyncDockerCmd { + + String getContainerId(); + + String getHostResource(); + + InputStream getTarInputStream(); + + boolean isNoOverwriteDirNonDir(); + + boolean isDirChildrenOnly(); + + boolean isCopyUIDGID(); + /** + * Set container's id + * + * @param containerId + * id of the container to copy file to + */ + CopyArchiveToContainerCmd withContainerId(String containerId); + + /** + * Set path to the resource on the host machine + * + * @param resource + * path to the resource on the host machine + */ + CopyArchiveToContainerCmd withHostResource(String resource); + + /** + * Set the tar input stream that will be uploaded to the container. withHostResource or withTarInputStream can be defined but not both. + * + * @param tarInputStream + * the stream to upload to the container + */ + CopyArchiveToContainerCmd withTarInputStream(InputStream tarInputStream); + + /** + * If set to true then it will be an error if unpacking the given content would cause an existing directory to be replaced with a + * non-directory and vice versa + * + * @param noOverwriteDirNonDir + * flag to know if non directory can be overwritten + */ + 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 + * dirChildrenOnly = false will create /var/data/root/titi and /var/data/root/tata + * + * @param dirChildrenOnly + * if root directory is ignored + */ + CopyArchiveToContainerCmd withDirChildrenOnly(boolean dirChildrenOnly); + + String getRemotePath(); + + CopyArchiveToContainerCmd withRemotePath(String remotePath); + + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java new file mode 100644 index 000000000..5dc920ed0 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyFileFromContainerCmd.java @@ -0,0 +1,38 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +public interface CopyFileFromContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + @CheckForNull + String getHostPath(); + + @CheckForNull + String getResource(); + + CopyFileFromContainerCmd withContainerId(@Nonnull String containerId); + + CopyFileFromContainerCmd withHostPath(String hostPath); + + CopyFileFromContainerCmd withResource(@Nonnull String resource); + + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException + * No such container + */ + @Override + InputStream exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigCmd.java new file mode 100644 index 000000000..205bc7a7d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigCmd.java @@ -0,0 +1,51 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.ConflictException; + +import javax.annotation.CheckForNull; +import java.util.Map; + +/** + * Command to create a new config + * + * @since {@link RemoteApiVersion#VERSION_1_30} + */ +public interface CreateConfigCmd extends SyncDockerCmd { + + @CheckForNull + String getName(); + + @CheckForNull + String getData(); + + @CheckForNull + Map getLabels(); + + /** + * @param name + * - The new config name. + */ + CreateConfigCmd withName(String name); + + /** + * @param data + * - The new config data. + */ + CreateConfigCmd withData(byte[] data); + + /** + * @param labels + * - A mapping of labels keys and values. Labels are a mechanism for applying metadata to Docker objects. + */ + CreateConfigCmd withLabels(Map labels); + + /** + * @throws ConflictException Named config already exists + */ + @Override + CreateConfigResponse exec() throws ConflictException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigResponse.java new file mode 100644 index 000000000..5836275ff --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateConfigResponse.java @@ -0,0 +1,20 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * The response of a {@link CreateConfigCmd} + */ +@EqualsAndHashCode +@ToString +public class CreateConfigResponse extends DockerObject { + @JsonProperty("ID") + private String id; + + public String getId() { + return id; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java new file mode 100644 index 000000000..fba83f50c --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -0,0 +1,1025 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.Capability; +import com.github.dockerjava.api.model.Device; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HealthCheck; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.Link; +import com.github.dockerjava.api.model.LogConfig; +import com.github.dockerjava.api.model.LxcConf; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.Ulimit; +import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumesFrom; + +import javax.annotation.CheckForNull; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static java.util.Objects.requireNonNull; + +public interface CreateContainerCmd extends SyncDockerCmd { + + @CheckForNull + AuthConfig getAuthConfig(); + + /** + * While using swarm classic, you can provide an optional auth config which will be used to pull images from a private registry, + * if the swarm node does not already have the docker image. + * Note: This option does not have any effect in normal docker + * + * @param authConfig The optional auth config + */ + CreateContainerCmd withAuthConfig(AuthConfig authConfig); + + @CheckForNull + List getAliases(); + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Bind[] getBinds() { + return getHostConfig().getBinds(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withBinds(Bind... binds) { + Objects.requireNonNull(binds, "binds was not specified"); + getHostConfig().setBinds(binds); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withBinds(List binds) { + Objects.requireNonNull(binds, "binds was not specified"); + return withBinds(binds.toArray(new Bind[binds.size()])); + } + + /** + * Add network-scoped alias for the container + * + * @param aliases on ore more aliases + */ + CreateContainerCmd withAliases(List aliases); + + /** + * Add network-scoped alias for the container + * + * @param aliases on ore more aliases + */ + CreateContainerCmd withAliases(String... aliases); + + @CheckForNull + String[] getCmd(); + + CreateContainerCmd withCmd(String... cmd); + + CreateContainerCmd withCmd(List cmd); + + @CheckForNull + HealthCheck getHealthcheck(); + + CreateContainerCmd withHealthcheck(HealthCheck healthCheck); + + @CheckForNull + Boolean getArgsEscaped(); + + CreateContainerCmd withArgsEscaped(Boolean argsEscaped); + + @CheckForNull + String getDomainName(); + + CreateContainerCmd withDomainName(String domainName); + + @CheckForNull + String[] getEntrypoint(); + + CreateContainerCmd withEntrypoint(String... entrypoint); + + CreateContainerCmd withEntrypoint(List entrypoint); + + @CheckForNull + String[] getEnv(); + + /** + * Adds environment-variables. NB: Not additive, i.e. in case of multiple calls to the method, only the most recent + * values will be injected. Prior env-variables will be deleted. + * + * @param env the String(s) to set as ENV in the container + */ + CreateContainerCmd withEnv(String... env); + + /** + * Adds environment-variables. NB: Not additive, i.e. in case of multiple calls to the method, only the most recent + * values will be injected. Prior env-variables will be deleted. + * + * @param env the list of Strings to set as ENV in the container + */ + CreateContainerCmd withEnv(List env); + + @CheckForNull + ExposedPort[] getExposedPorts(); + + CreateContainerCmd withExposedPorts(List exposedPorts); + + CreateContainerCmd withExposedPorts(ExposedPort... exposedPorts); + + @CheckForNull + String getStopSignal(); + + CreateContainerCmd withStopSignal(String stopSignal); + + @CheckForNull + Integer getStopTimeout(); + + CreateContainerCmd withStopTimeout(Integer stopTimeout); + + @CheckForNull + String getHostName(); + + CreateContainerCmd withHostName(String hostName); + + @CheckForNull + String getImage(); + + CreateContainerCmd withImage(String image); + + @CheckForNull + String getIpv4Address(); + + CreateContainerCmd withIpv4Address(String ipv4Address); + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Link[] getLinks() { + return getHostConfig().getLinks(); + } + + /** + * Add link to another container. + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withLinks(Link... links) { + requireNonNull(links, "links was not specified"); + getHostConfig().setLinks(links); + return this; + } + + /** + * Add link to another container. + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withLinks(List links) { + requireNonNull(links, "links was not specified"); + return withLinks(links.toArray(new Link[links.size()])); + } + + @CheckForNull + String getIpv6Address(); + + CreateContainerCmd withIpv6Address(String ipv6Address); + + @CheckForNull + Map getLabels(); + + CreateContainerCmd withLabels(Map labels); + + @CheckForNull + String getMacAddress(); + + CreateContainerCmd withMacAddress(String macAddress); + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Long getMemory() { + return getHostConfig().getMemory(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withMemory(Long memory) { + Objects.requireNonNull(memory, "memory was not specified"); + getHostConfig().withMemory(memory); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Long getMemorySwap() { + return getHostConfig().getMemorySwap(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withMemorySwap(Long memorySwap) { + Objects.requireNonNull(memorySwap, "memorySwap was not specified"); + getHostConfig().withMemorySwap(memorySwap); + return this; + } + + @CheckForNull + String getName(); + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default String getNetworkMode() { + return getHostConfig().getNetworkMode(); + } + + /** + * Set the Network mode for the container + *

+ * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withNetworkMode(String networkMode) { + Objects.requireNonNull(networkMode, "networkMode was not specified"); + getHostConfig().withNetworkMode(networkMode); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Ports getPortBindings() { + return getHostConfig().getPortBindings(); + } + + /** + * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of the + * docker run CLI command. + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withPortBindings(PortBinding... portBindings) { + Objects.requireNonNull(portBindings, "portBindings was not specified"); + getHostConfig().withPortBindings(new Ports(portBindings)); + return this; + } + + /** + * Add one or more {@link PortBinding}s. This corresponds to the --publish (-p) option of the + * docker run CLI command. + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withPortBindings(List portBindings) { + Objects.requireNonNull(portBindings, "portBindings was not specified"); + return withPortBindings(portBindings.toArray(new PortBinding[0])); + } + + /** + * Add the port bindings that are contained in the given {@link Ports} object. + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withPortBindings(Ports portBindings) { + Objects.requireNonNull(portBindings, "portBindings was not specified"); + getHostConfig().withPortBindings(portBindings); + return this; + } + + CreateContainerCmd withName(String name); + + @CheckForNull + String[] getPortSpecs(); + + CreateContainerCmd withPortSpecs(String... portSpecs); + + CreateContainerCmd withPortSpecs(List portSpecs); + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Boolean getPrivileged() { + return getHostConfig().getPrivileged(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withPrivileged(Boolean privileged) { + Objects.requireNonNull(privileged, "no privileged was specified"); + getHostConfig().withPrivileged(privileged); + return this; + } + + @CheckForNull + String getUser(); + + CreateContainerCmd withUser(String user); + + @CheckForNull + Volume[] getVolumes(); + + CreateContainerCmd withVolumes(Volume... volumes); + + CreateContainerCmd withVolumes(List volumes); + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default VolumesFrom[] getVolumesFrom() { + return getHostConfig().getVolumesFrom(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withVolumesFrom(VolumesFrom... volumesFrom) { + Objects.requireNonNull(volumesFrom, "volumesFrom was not specified"); + getHostConfig().withVolumesFrom(volumesFrom); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withVolumesFrom(List volumesFrom) { + requireNonNull(volumesFrom, "volumesFrom was not specified"); + return withVolumesFrom(volumesFrom.toArray(new VolumesFrom[volumesFrom.size()])); + } + + @CheckForNull + String getWorkingDir(); + + CreateContainerCmd withWorkingDir(String workingDir); + + @CheckForNull + Boolean isAttachStderr(); + + CreateContainerCmd withAttachStderr(Boolean attachStderr); + + @CheckForNull + Boolean isAttachStdin(); + + CreateContainerCmd withAttachStdin(Boolean attachStdin); + + @CheckForNull + Boolean isAttachStdout(); + + CreateContainerCmd withAttachStdout(Boolean attachStdout); + + @CheckForNull + Boolean isNetworkDisabled(); + + CreateContainerCmd withNetworkDisabled(Boolean disableNetwork); + + @CheckForNull + Boolean isStdInOnce(); + + CreateContainerCmd withStdInOnce(Boolean stdInOnce); + + @CheckForNull + Boolean isStdinOpen(); + + CreateContainerCmd withStdinOpen(Boolean stdinOpen); + + @CheckForNull + Boolean isTty(); + + CreateContainerCmd withTty(Boolean tty); + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Boolean getPublishAllPorts() { + return getHostConfig().getPublishAllPorts(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withPublishAllPorts(Boolean publishAllPorts) { + requireNonNull(publishAllPorts, "no publishAllPorts was specified"); + getHostConfig().withPublishAllPorts(publishAllPorts); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @CheckForNull + @Deprecated + @JsonIgnore + default String[] getExtraHosts() { + return getHostConfig().getExtraHosts(); + } + + /** + * Add hostnames to /etc/hosts in the container + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withExtraHosts(String... extraHosts) { + requireNonNull(extraHosts, "extraHosts was not specified"); + getHostConfig().withExtraHosts(extraHosts); + return this; + } + + /** + * Add hostnames to /etc/hosts in the container + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withExtraHosts(List extraHosts) { + requireNonNull(extraHosts, "extraHosts was not specified"); + return withExtraHosts(extraHosts.toArray(new String[extraHosts.size()])); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @CheckForNull + @Deprecated + @JsonIgnore + default Capability[] getCapAdd() { + return getHostConfig().getCapAdd(); + } + + /** + * Add linux kernel capability to the container. For example: + * adding {@link Capability#MKNOD} allows the container to create special files using the 'mknod' command. + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withCapAdd(Capability... capAdd) { + requireNonNull(capAdd, "capAdd was not specified"); + getHostConfig().withCapAdd(capAdd); + return this; + } + + /** + * Add linux kernel capability to the container. For example: + * adding {@link Capability#MKNOD} allows the container to create special files using the 'mknod' command. + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withCapAdd(List capAdd) { + requireNonNull(capAdd, "capAdd was not specified"); + return withCapAdd(capAdd.toArray(new Capability[capAdd.size()])); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @CheckForNull + @Deprecated + @JsonIgnore + default Capability[] getCapDrop() { + return getHostConfig().getCapDrop(); + } + + /** + * Drop linux kernel capability from the container. For example: + * dropping {@link Capability#CHOWN} prevents the container from changing the owner of any files. + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withCapDrop(Capability... capDrop) { + requireNonNull(capDrop, "capDrop was not specified"); + getHostConfig().withCapDrop(capDrop); + return this; + } + + /** + * Drop linux kernel capability from the container. For example: + * dropping {@link Capability#CHOWN} prevents the container from changing the owner of any files. + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withCapDrop(List capDrop) { + requireNonNull(capDrop, "capDrop was not specified"); + return withCapDrop(capDrop.toArray(new Capability[capDrop.size()])); + } + + + @CheckForNull + List getOnBuild(); + + CreateContainerCmd withOnBuild(List onBuild); + + @CheckForNull + HostConfig getHostConfig(); + + CreateContainerCmd withHostConfig(HostConfig hostConfig); + + // The following methods are deprecated and should be set on {@link #getHostConfig()} instead. + // TODO remove in the next big release + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Integer getBlkioWeight() { + return getHostConfig().getBlkioWeight(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @CheckForNull + @Deprecated + @JsonIgnore + default String getCgroupParent() { + return getHostConfig().getCgroupParent(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Integer getCpuPeriod() { + Long result = getHostConfig().getCpuPeriod(); + return result != null ? result.intValue() : null; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Integer getCpuShares() { + return getHostConfig().getCpuShares(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default String getCpusetCpus() { + return getHostConfig().getCpusetCpus(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default String getCpusetMems() { + return getHostConfig().getCpusetMems(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Device[] getDevices() { + return getHostConfig().getDevices(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default String[] getDns() { + return getHostConfig().getDns(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default String[] getDnsSearch() { + return getHostConfig().getDnsSearch(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default LogConfig getLogConfig() { + return getHostConfig().getLogConfig(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default LxcConf[] getLxcConf() { + return getHostConfig().getLxcConf(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Boolean getOomKillDisable() { + return getHostConfig().getOomKillDisable(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default String getPidMode() { + return getHostConfig().getPidMode(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Boolean getReadonlyRootfs() { + return getHostConfig().getReadonlyRootfs(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default RestartPolicy getRestartPolicy() { + return getHostConfig().getRestartPolicy(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @CheckForNull + @JsonIgnore + default Ulimit[] getUlimits() { + return getHostConfig().getUlimits(); + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withBlkioWeight(Integer blkioWeight) { + getHostConfig().withBlkioWeight(blkioWeight); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withCgroupParent(String cgroupParent) { + getHostConfig().withCgroupParent(cgroupParent); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withContainerIDFile(String containerIDFile) { + getHostConfig().withContainerIDFile(containerIDFile); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withCpuPeriod(Integer cpuPeriod) { + getHostConfig().withCpuPeriod(cpuPeriod != null ? cpuPeriod.longValue() : null); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withCpuShares(Integer cpuShares) { + getHostConfig().withCpuShares(cpuShares); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withCpusetCpus(String cpusetCpus) { + getHostConfig().withCpusetCpus(cpusetCpus); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withCpusetMems(String cpusetMems) { + getHostConfig().withCpusetMems(cpusetMems); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withDevices(Device... devices) { + getHostConfig().withDevices(devices); + return this; + } + + /** + * Add host devices to the container + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withDevices(List devices) { + getHostConfig().withDevices(devices); + return this; + } + + /** + * Set custom DNS servers + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withDns(String... dns) { + getHostConfig().withDns(dns); + return this; + } + + /** + * Set custom DNS servers + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withDns(List dns) { + getHostConfig().withDns(dns); + return this; + } + + /** + * Set custom DNS search domains + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withDnsSearch(String... dnsSearch) { + getHostConfig().withDnsSearch(dnsSearch); + return this; + } + + /** + * Set custom DNS search domains + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withDnsSearch(List dnsSearch) { + getHostConfig().withDnsSearch(dnsSearch); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withLogConfig(LogConfig logConfig) { + getHostConfig().withLogConfig(logConfig); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withLxcConf(LxcConf... lxcConf) { + getHostConfig().withLxcConf(lxcConf); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withLxcConf(List lxcConf) { + getHostConfig().withLxcConf(lxcConf.toArray(new LxcConf[0])); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withOomKillDisable(Boolean oomKillDisable) { + getHostConfig().withOomKillDisable(oomKillDisable); + return this; + } + + /** + * Set the PID (Process) Namespace mode for the container, 'host': use the host's PID namespace inside the container + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withPidMode(String pidMode) { + getHostConfig().withPidMode(pidMode); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withReadonlyRootfs(Boolean readonlyRootfs) { + getHostConfig().withReadonlyRootfs(readonlyRootfs); + return this; + } + + /** + * Set custom {@link RestartPolicy} for the container. Defaults to {@link RestartPolicy#noRestart()} + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { + getHostConfig().withRestartPolicy(restartPolicy); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + @JsonIgnore + default CreateContainerCmd withUlimits(Ulimit... ulimits) { + getHostConfig().withUlimits(ulimits); + return this; + } + + /** + * + * @deprecated see {@link #getHostConfig()} + */ + @Deprecated + default CreateContainerCmd withUlimits(List ulimits) { + getHostConfig().withUlimits(ulimits); + return this; + } + + @CheckForNull + default String getPlatform() { + return null; + } + + CreateContainerCmd withPlatform(String platform); + + /** + * @throws NotFoundException No such container + * @throws ConflictException Named container already exists + */ + @Override + CreateContainerResponse exec() throws NotFoundException, ConflictException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerResponse.java new file mode 100644 index 000000000..ad24d7ec8 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerResponse.java @@ -0,0 +1,38 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * + * @author Konstantin Pelykh (kpelykh@gmail.com) + * + */ +@EqualsAndHashCode +@ToString +public class CreateContainerResponse extends DockerObject { + + @JsonProperty("Id") + private String id; + + @JsonProperty("Warnings") + private String[] warnings; + + public String getId() { + return id; + } + + public String[] getWarnings() { + return warnings; + } + + public void setId(String id) { + this.id = id; + } + + public void setWarnings(String[] warnings) { + this.warnings = warnings; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java new file mode 100644 index 000000000..4e78dd5e0 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageCmd.java @@ -0,0 +1,50 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +public interface CreateImageCmd extends SyncDockerCmd { + + @CheckForNull + String getRepository(); + + @CheckForNull + String getTag(); + + @CheckForNull + String getPlatform(); + + @CheckForNull + InputStream getImageStream(); + + /** + * @param repository + * the repository to import to + */ + CreateImageCmd withRepository(@Nonnull String repository); + + /** + * @param imageStream + * the InputStream of the tar file + */ + CreateImageCmd withImageStream(InputStream imageStream); + + /** + * @param tag + * any tag for this image + * @deprecated use repo:tag format for repository + */ + CreateImageCmd withTag(String tag); + + /** + * @param platform + * the platform for this image + */ + CreateImageCmd withPlatform(String platform); + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageResponse.java new file mode 100644 index 000000000..53b2b5367 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateImageResponse.java @@ -0,0 +1,24 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * Parse reponses from /images/create + * + * @author Ryan Campbell (ryan.campbell@gmail.com) + * + */ +@EqualsAndHashCode +@ToString +public class CreateImageResponse extends DockerObject { + + @JsonProperty("status") + private String id; + + public String getId() { + return id; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java new file mode 100644 index 000000000..56b9df17a --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkCmd.java @@ -0,0 +1,78 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.api.model.Network.Ipam; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.util.Map; + +/** + * Create a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface CreateNetworkCmd extends SyncDockerCmd { + + @CheckForNull + String getName(); + + @CheckForNull + String getDriver(); + + @CheckForNull + Network.Ipam getIpam(); + + @CheckForNull + Map getOptions(); + + @CheckForNull + Boolean getCheckDuplicate(); + + @CheckForNull + Boolean getInternal(); + + @CheckForNull + Boolean getEnableIPv6(); + + @CheckForNull + Boolean getAttachable(); + + @CheckForNull + Map getLabels(); + + /** The new network's name. Required. */ + CreateNetworkCmd withName(@Nonnull String name); + + /** Name of the network driver to use. Defaults to bridge. */ + CreateNetworkCmd withDriver(String driver); + + /** Ipam config, such as subnet, gateway and ip range of the network */ + CreateNetworkCmd withIpam(Ipam ipam); + + /** Driver specific options */ + CreateNetworkCmd withOptions(Map options); + + CreateNetworkCmd withCheckDuplicate(boolean checkForDuplicate); + + CreateNetworkCmd withInternal(boolean internal); + + CreateNetworkCmd withEnableIpv6(boolean enableIpv6); + + /** + * If enabled, and the network is in the global scope, non-service containers on worker nodes will be able to connect to the network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + CreateNetworkCmd withAttachable(Boolean attachable); + + /** + * Add label for network + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + CreateNetworkCmd withLabels(Map labels); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java new file mode 100644 index 000000000..3f6f219e1 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateNetworkResponse.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@EqualsAndHashCode +@ToString +public class CreateNetworkResponse extends DockerObject { + + @JsonProperty("Id") + private String id; + + @JsonProperty("Warnings") + private String[] warnings; + + public String getId() { + return id; + } + + public String[] getWarnings() { + return warnings; + } + + public void setId(String id) { + this.id = id; + } + + public void setWarnings(String[] warnings) { + this.warnings = warnings; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretCmd.java new file mode 100644 index 000000000..c27e42317 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretCmd.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.model.SecretSpec; + +import javax.annotation.CheckForNull; + +/** + * Command to create a new secret + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ +public interface CreateSecretCmd extends SyncDockerCmd { + + @CheckForNull + SecretSpec getSecretSpec(); + + CreateSecretCmd withSecretSpec(SecretSpec secretSpec); + + /** + * @throws ConflictException Named secret already exists + */ + @Override + CreateSecretResponse exec() throws ConflictException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretResponse.java new file mode 100644 index 000000000..2c1b6f11b --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateSecretResponse.java @@ -0,0 +1,20 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * The response of a {@link CreateSecretCmd} + */ +@EqualsAndHashCode +@ToString +public class CreateSecretResponse extends DockerObject { + @JsonProperty("ID") + private String id; + + public String getId() { + return id; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceCmd.java new file mode 100644 index 000000000..bfcce27ad --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceCmd.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.ServiceSpec; + +import javax.annotation.CheckForNull; + +/** + * Command to create a new service + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ +public interface CreateServiceCmd extends SyncDockerCmd { + + @CheckForNull + ServiceSpec getServiceSpec(); + + @CheckForNull + AuthConfig getAuthConfig(); + + CreateServiceCmd withServiceSpec(ServiceSpec serviceSpec); + + CreateServiceCmd withAuthConfig(AuthConfig authConfig); + + /** + * @throws ConflictException + * Named service already exists + */ + @Override + CreateServiceResponse exec() throws ConflictException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceResponse.java new file mode 100644 index 000000000..b68343f55 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateServiceResponse.java @@ -0,0 +1,20 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * The response of a {@link CreateServiceCmd} + */ +@EqualsAndHashCode +@ToString +public class CreateServiceResponse extends DockerObject { + @JsonProperty("ID") + private String id; + + public String getId() { + return id; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java new file mode 100644 index 000000000..4a3ef9819 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeCmd.java @@ -0,0 +1,47 @@ +package com.github.dockerjava.api.command; + +import java.util.Map; + +import javax.annotation.CheckForNull; + +public interface CreateVolumeCmd extends SyncDockerCmd { + + @CheckForNull + String getName(); + + @CheckForNull + Map getLabels(); + + @CheckForNull + String getDriver(); + + @CheckForNull + Map getDriverOpts(); + + /** + * @param name + * - The new volume’s name. If not specified, Docker generates a name. + */ + CreateVolumeCmd withName(String name); + + /** + * @param labels + * - A mapping of labels keys and values. Labels are a mechanism for applying metadata to Docker objects. + */ + CreateVolumeCmd withLabels(Map labels); + + /** + * @param driver + * - Name of the volume driver to use. Defaults to local for the name. + */ + CreateVolumeCmd withDriver(String driver); + + /** + * @param driverOpts + * - A mapping of driver options and values. These options are passed directly to the driver and are driver specific. + */ + CreateVolumeCmd withDriverOpts(Map driverOpts); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java new file mode 100644 index 000000000..4afc6f6ba --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateVolumeResponse.java @@ -0,0 +1,45 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Map; + +/** + * + * @author Marcus Linke + */ +@EqualsAndHashCode +@ToString +public class CreateVolumeResponse extends DockerObject { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Labels") + private Map labels; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("Mountpoint") + private String mountpoint; + + public String getName() { + return name; + } + + public Map getLabels() { + return labels; + } + + public String getDriver() { + return driver; + } + + public String getMountpoint() { + return mountpoint; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java new file mode 100644 index 000000000..161ff2c29 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java @@ -0,0 +1,412 @@ +package com.github.dockerjava.api.command; + +import java.io.IOException; + +public class DelegatingDockerCmdExecFactory implements DockerCmdExecFactory { + + // We're not using abstract class because we want + // the compiler to force us to implement new DockerCmdExecFactory when added + public DockerCmdExecFactory getDockerCmdExecFactory() { + throw new IllegalStateException("Implement me!"); + } + + @Override + public AuthCmd.Exec createAuthCmdExec() { + return getDockerCmdExecFactory().createAuthCmdExec(); + } + + @Override + public InfoCmd.Exec createInfoCmdExec() { + return getDockerCmdExecFactory().createInfoCmdExec(); + } + + @Override + public PingCmd.Exec createPingCmdExec() { + return getDockerCmdExecFactory().createPingCmdExec(); + } + + @Override + public ResizeContainerCmd.Exec createResizeContainerCmdExec() { + return getDockerCmdExecFactory().createResizeContainerCmdExec(); + } + + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return getDockerCmdExecFactory().createExecCmdExec(); + } + + @Override + public ResizeExecCmd.Exec createResizeExecCmdExec() { + return getDockerCmdExecFactory().createResizeExecCmdExec(); + } + + @Override + public VersionCmd.Exec createVersionCmdExec() { + return getDockerCmdExecFactory().createVersionCmdExec(); + } + + @Override + public PullImageCmd.Exec createPullImageCmdExec() { + return getDockerCmdExecFactory().createPullImageCmdExec(); + } + + @Override + public PushImageCmd.Exec createPushImageCmdExec() { + return getDockerCmdExecFactory().createPushImageCmdExec(); + } + + @Override + public SaveImageCmd.Exec createSaveImageCmdExec() { + return getDockerCmdExecFactory().createSaveImageCmdExec(); + } + + @Override + public SaveImagesCmd.Exec createSaveImagesCmdExec() { + return getDockerCmdExecFactory().createSaveImagesCmdExec(); + } + + @Override + public CreateImageCmd.Exec createCreateImageCmdExec() { + return getDockerCmdExecFactory().createCreateImageCmdExec(); + } + + @Override + public LoadImageCmd.Exec createLoadImageCmdExec() { + return getDockerCmdExecFactory().createLoadImageCmdExec(); + } + + @Override + public LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec() { + return getDockerCmdExecFactory().createLoadImageAsyncCmdExec(); + } + + @Override + public SearchImagesCmd.Exec createSearchImagesCmdExec() { + return getDockerCmdExecFactory().createSearchImagesCmdExec(); + } + + @Override + public RemoveImageCmd.Exec createRemoveImageCmdExec() { + return getDockerCmdExecFactory().createRemoveImageCmdExec(); + } + + @Override + public ListImagesCmd.Exec createListImagesCmdExec() { + return getDockerCmdExecFactory().createListImagesCmdExec(); + } + + @Override + public InspectImageCmd.Exec createInspectImageCmdExec() { + return getDockerCmdExecFactory().createInspectImageCmdExec(); + } + + @Override + public ListContainersCmd.Exec createListContainersCmdExec() { + return getDockerCmdExecFactory().createListContainersCmdExec(); + } + + @Override + public CreateContainerCmd.Exec createCreateContainerCmdExec() { + return getDockerCmdExecFactory().createCreateContainerCmdExec(); + } + + @Override + public StartContainerCmd.Exec createStartContainerCmdExec() { + return getDockerCmdExecFactory().createStartContainerCmdExec(); + } + + @Override + public InspectContainerCmd.Exec createInspectContainerCmdExec() { + return getDockerCmdExecFactory().createInspectContainerCmdExec(); + } + + @Override + public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { + return getDockerCmdExecFactory().createRemoveContainerCmdExec(); + } + + @Override + public WaitContainerCmd.Exec createWaitContainerCmdExec() { + return getDockerCmdExecFactory().createWaitContainerCmdExec(); + } + + @Override + public AttachContainerCmd.Exec createAttachContainerCmdExec() { + return getDockerCmdExecFactory().createAttachContainerCmdExec(); + } + + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return getDockerCmdExecFactory().createExecStartCmdExec(); + } + + @Override + public InspectExecCmd.Exec createInspectExecCmdExec() { + return getDockerCmdExecFactory().createInspectExecCmdExec(); + } + + @Override + public LogContainerCmd.Exec createLogContainerCmdExec() { + return getDockerCmdExecFactory().createLogContainerCmdExec(); + } + + @Override + public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec() { + return getDockerCmdExecFactory().createCopyFileFromContainerCmdExec(); + } + + @Override + public CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec() { + return getDockerCmdExecFactory().createCopyArchiveFromContainerCmdExec(); + } + + @Override + public CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec() { + return getDockerCmdExecFactory().createCopyArchiveToContainerCmdExec(); + } + + @Override + public StopContainerCmd.Exec createStopContainerCmdExec() { + return getDockerCmdExecFactory().createStopContainerCmdExec(); + } + + @Override + public ContainerDiffCmd.Exec createContainerDiffCmdExec() { + return getDockerCmdExecFactory().createContainerDiffCmdExec(); + } + + @Override + public KillContainerCmd.Exec createKillContainerCmdExec() { + return getDockerCmdExecFactory().createKillContainerCmdExec(); + } + + @Override + public UpdateContainerCmd.Exec createUpdateContainerCmdExec() { + return getDockerCmdExecFactory().createUpdateContainerCmdExec(); + } + + @Override + public RenameContainerCmd.Exec createRenameContainerCmdExec() { + return getDockerCmdExecFactory().createRenameContainerCmdExec(); + } + + @Override + public RestartContainerCmd.Exec createRestartContainerCmdExec() { + return getDockerCmdExecFactory().createRestartContainerCmdExec(); + } + + @Override + public CommitCmd.Exec createCommitCmdExec() { + return getDockerCmdExecFactory().createCommitCmdExec(); + } + + @Override + public BuildImageCmd.Exec createBuildImageCmdExec() { + return getDockerCmdExecFactory().createBuildImageCmdExec(); + } + + @Override + public TopContainerCmd.Exec createTopContainerCmdExec() { + return getDockerCmdExecFactory().createTopContainerCmdExec(); + } + + @Override + public TagImageCmd.Exec createTagImageCmdExec() { + return getDockerCmdExecFactory().createTagImageCmdExec(); + } + + @Override + public PauseContainerCmd.Exec createPauseContainerCmdExec() { + return getDockerCmdExecFactory().createPauseContainerCmdExec(); + } + + @Override + public UnpauseContainerCmd.Exec createUnpauseContainerCmdExec() { + return getDockerCmdExecFactory().createUnpauseContainerCmdExec(); + } + + @Override + public EventsCmd.Exec createEventsCmdExec() { + return getDockerCmdExecFactory().createEventsCmdExec(); + } + + @Override + public StatsCmd.Exec createStatsCmdExec() { + return getDockerCmdExecFactory().createStatsCmdExec(); + } + + @Override + public CreateVolumeCmd.Exec createCreateVolumeCmdExec() { + return getDockerCmdExecFactory().createCreateVolumeCmdExec(); + } + + @Override + public InspectVolumeCmd.Exec createInspectVolumeCmdExec() { + return getDockerCmdExecFactory().createInspectVolumeCmdExec(); + } + + @Override + public RemoveVolumeCmd.Exec createRemoveVolumeCmdExec() { + return getDockerCmdExecFactory().createRemoveVolumeCmdExec(); + } + + @Override + public ListVolumesCmd.Exec createListVolumesCmdExec() { + return getDockerCmdExecFactory().createListVolumesCmdExec(); + } + + @Override + public ListNetworksCmd.Exec createListNetworksCmdExec() { + return getDockerCmdExecFactory().createListNetworksCmdExec(); + } + + @Override + public InspectNetworkCmd.Exec createInspectNetworkCmdExec() { + return getDockerCmdExecFactory().createInspectNetworkCmdExec(); + } + + @Override + public CreateNetworkCmd.Exec createCreateNetworkCmdExec() { + return getDockerCmdExecFactory().createCreateNetworkCmdExec(); + } + + @Override + public RemoveNetworkCmd.Exec createRemoveNetworkCmdExec() { + return getDockerCmdExecFactory().createRemoveNetworkCmdExec(); + } + + @Override + public ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec() { + return getDockerCmdExecFactory().createConnectToNetworkCmdExec(); + } + + @Override + public DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec() { + return getDockerCmdExecFactory().createDisconnectFromNetworkCmdExec(); + } + + @Override + public InitializeSwarmCmd.Exec createInitializeSwarmCmdExec() { + return getDockerCmdExecFactory().createInitializeSwarmCmdExec(); + } + + @Override + public InspectSwarmCmd.Exec createInspectSwarmCmdExec() { + return getDockerCmdExecFactory().createInspectSwarmCmdExec(); + } + + @Override + public JoinSwarmCmd.Exec createJoinSwarmCmdExec() { + return getDockerCmdExecFactory().createJoinSwarmCmdExec(); + } + + @Override + public LeaveSwarmCmd.Exec createLeaveSwarmCmdExec() { + return getDockerCmdExecFactory().createLeaveSwarmCmdExec(); + } + + @Override + public UpdateSwarmCmd.Exec createUpdateSwarmCmdExec() { + return getDockerCmdExecFactory().createUpdateSwarmCmdExec(); + } + + @Override + public ListServicesCmd.Exec createListServicesCmdExec() { + return getDockerCmdExecFactory().createListServicesCmdExec(); + } + + @Override + public CreateServiceCmd.Exec createCreateServiceCmdExec() { + return getDockerCmdExecFactory().createCreateServiceCmdExec(); + } + + @Override + public InspectServiceCmd.Exec createInspectServiceCmdExec() { + return getDockerCmdExecFactory().createInspectServiceCmdExec(); + } + + @Override + public UpdateServiceCmd.Exec createUpdateServiceCmdExec() { + return getDockerCmdExecFactory().createUpdateServiceCmdExec(); + } + + @Override + public RemoveServiceCmd.Exec createRemoveServiceCmdExec() { + return getDockerCmdExecFactory().createRemoveServiceCmdExec(); + } + + @Override + public LogSwarmObjectCmd.Exec logSwarmObjectExec(String endpoint) { + return getDockerCmdExecFactory().logSwarmObjectExec(endpoint); + } + + @Override + public ListSwarmNodesCmd.Exec listSwarmNodeCmdExec() { + return getDockerCmdExecFactory().listSwarmNodeCmdExec(); + } + + @Override + public InspectSwarmNodeCmd.Exec inspectSwarmNodeCmdExec() { + return getDockerCmdExecFactory().inspectSwarmNodeCmdExec(); + } + + @Override + public RemoveSwarmNodeCmd.Exec removeSwarmNodeCmdExec() { + return getDockerCmdExecFactory().removeSwarmNodeCmdExec(); + } + + @Override + public UpdateSwarmNodeCmd.Exec updateSwarmNodeCmdExec() { + return getDockerCmdExecFactory().updateSwarmNodeCmdExec(); + } + + @Override + public ListTasksCmd.Exec listTasksCmdExec() { + return getDockerCmdExecFactory().listTasksCmdExec(); + } + + @Override + public PruneCmd.Exec pruneCmdExec() { + return getDockerCmdExecFactory().pruneCmdExec(); + } + + @Override + public ListSecretsCmd.Exec createListSecretsCmdExec() { + return getDockerCmdExecFactory().createListSecretsCmdExec(); + } + + @Override + public CreateSecretCmd.Exec createCreateSecretCmdExec() { + return getDockerCmdExecFactory().createCreateSecretCmdExec(); + } + + @Override + public RemoveSecretCmd.Exec createRemoveSecretCmdExec() { + return getDockerCmdExecFactory().createRemoveSecretCmdExec(); + } + + @Override + public ListConfigsCmd.Exec createListConfigsCmdExec() { + return getDockerCmdExecFactory().createListConfigsCmdExec(); + } + + @Override + public CreateConfigCmd.Exec createCreateConfigCmdExec() { + return getDockerCmdExecFactory().createCreateConfigCmdExec(); + } + + @Override + public InspectConfigCmd.Exec createInspectConfigCmdExec() { + return getDockerCmdExecFactory().createInspectConfigCmdExec(); + } + + @Override + public RemoveConfigCmd.Exec createRemoveConfigCmdExec() { + return getDockerCmdExecFactory().createRemoveConfigCmdExec(); + } + + @Override + public void close() throws IOException { + getDockerCmdExecFactory().close(); + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java new file mode 100644 index 000000000..07dadec1e --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DisconnectFromNetworkCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Disconnects a container from a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface DisconnectFromNetworkCmd extends SyncDockerCmd { + + @CheckForNull + String getNetworkId(); + + @CheckForNull + String getContainerId(); + + @CheckForNull + Boolean getForce(); + + DisconnectFromNetworkCmd withNetworkId(@Nonnull String networkId); + + DisconnectFromNetworkCmd withContainerId(@Nonnull String containerId); + + DisconnectFromNetworkCmd withForce(@Nonnull Boolean force); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmd.java similarity index 84% rename from src/main/java/com/github/dockerjava/api/command/DockerCmd.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmd.java index eafe34ae5..ea3ecf0d9 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmd.java @@ -5,6 +5,6 @@ public interface DockerCmd extends Closeable { @Override - public void close(); + void close(); -} \ No newline at end of file +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java new file mode 100644 index 000000000..52b16d3c3 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdAsyncExec.java @@ -0,0 +1,9 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallback; + +public interface DockerCmdAsyncExec, A_RES_T> { + + Void exec(CMD_T command, ResultCallback resultCallback); + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java new file mode 100644 index 000000000..cedf6d40d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -0,0 +1,273 @@ +package com.github.dockerjava.api.command; + +import java.io.Closeable; +import java.io.IOException; + +public interface DockerCmdExecFactory extends Closeable { + + AuthCmd.Exec createAuthCmdExec(); + + InfoCmd.Exec createInfoCmdExec(); + + PingCmd.Exec createPingCmdExec(); + + ExecCreateCmd.Exec createExecCmdExec(); + + VersionCmd.Exec createVersionCmdExec(); + + PullImageCmd.Exec createPullImageCmdExec(); + + PushImageCmd.Exec createPushImageCmdExec(); + + SaveImageCmd.Exec createSaveImageCmdExec(); + + SaveImagesCmd.Exec createSaveImagesCmdExec(); + + CreateImageCmd.Exec createCreateImageCmdExec(); + + LoadImageCmd.Exec createLoadImageCmdExec(); + + LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec(); + + SearchImagesCmd.Exec createSearchImagesCmdExec(); + + RemoveImageCmd.Exec createRemoveImageCmdExec(); + + ListImagesCmd.Exec createListImagesCmdExec(); + + InspectImageCmd.Exec createInspectImageCmdExec(); + + ListContainersCmd.Exec createListContainersCmdExec(); + + CreateContainerCmd.Exec createCreateContainerCmdExec(); + + StartContainerCmd.Exec createStartContainerCmdExec(); + + InspectContainerCmd.Exec createInspectContainerCmdExec(); + + RemoveContainerCmd.Exec createRemoveContainerCmdExec(); + + WaitContainerCmd.Exec createWaitContainerCmdExec(); + + AttachContainerCmd.Exec createAttachContainerCmdExec(); + + ResizeContainerCmd.Exec createResizeContainerCmdExec(); + + ExecStartCmd.Exec createExecStartCmdExec(); + + ResizeExecCmd.Exec createResizeExecCmdExec(); + + InspectExecCmd.Exec createInspectExecCmdExec(); + + LogContainerCmd.Exec createLogContainerCmdExec(); + + CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); + + CopyArchiveFromContainerCmd.Exec createCopyArchiveFromContainerCmdExec(); + + CopyArchiveToContainerCmd.Exec createCopyArchiveToContainerCmdExec(); + + StopContainerCmd.Exec createStopContainerCmdExec(); + + ContainerDiffCmd.Exec createContainerDiffCmdExec(); + + KillContainerCmd.Exec createKillContainerCmdExec(); + + UpdateContainerCmd.Exec createUpdateContainerCmdExec(); + + /** + * Rename container. + * + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + RenameContainerCmd.Exec createRenameContainerCmdExec(); + + RestartContainerCmd.Exec createRestartContainerCmdExec(); + + CommitCmd.Exec createCommitCmdExec(); + + BuildImageCmd.Exec createBuildImageCmdExec(); + + TopContainerCmd.Exec createTopContainerCmdExec(); + + TagImageCmd.Exec createTagImageCmdExec(); + + PauseContainerCmd.Exec createPauseContainerCmdExec(); + + UnpauseContainerCmd.Exec createUnpauseContainerCmdExec(); + + EventsCmd.Exec createEventsCmdExec(); + + StatsCmd.Exec createStatsCmdExec(); + + CreateVolumeCmd.Exec createCreateVolumeCmdExec(); + + InspectVolumeCmd.Exec createInspectVolumeCmdExec(); + + RemoveVolumeCmd.Exec createRemoveVolumeCmdExec(); + + ListVolumesCmd.Exec createListVolumesCmdExec(); + + ListNetworksCmd.Exec createListNetworksCmdExec(); + + InspectNetworkCmd.Exec createInspectNetworkCmdExec(); + + CreateNetworkCmd.Exec createCreateNetworkCmdExec(); + + RemoveNetworkCmd.Exec createRemoveNetworkCmdExec(); + + ConnectToNetworkCmd.Exec createConnectToNetworkCmdExec(); + + DisconnectFromNetworkCmd.Exec createDisconnectFromNetworkCmdExec(); + + // swarm + InitializeSwarmCmd.Exec createInitializeSwarmCmdExec(); + + InspectSwarmCmd.Exec createInspectSwarmCmdExec(); + + JoinSwarmCmd.Exec createJoinSwarmCmdExec(); + + LeaveSwarmCmd.Exec createLeaveSwarmCmdExec(); + + UpdateSwarmCmd.Exec createUpdateSwarmCmdExec(); + + /** + * Command to list all services in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + ListServicesCmd.Exec createListServicesCmdExec(); + + /** + * Command to create a new service in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + CreateServiceCmd.Exec createCreateServiceCmdExec(); + + /** + * Command to inspect a service in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + InspectServiceCmd.Exec createInspectServiceCmdExec(); + + /** + * Command to update a service specification in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + UpdateServiceCmd.Exec createUpdateServiceCmdExec(); + + /** + * Command to remove a service in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + RemoveServiceCmd.Exec createRemoveServiceCmdExec(); + + /** + * @param endpoint endpoint name to tail logs + * @return + * @since {@link RemoteApiVersion#VERSION_1_29} + */ + LogSwarmObjectCmd.Exec logSwarmObjectExec(String endpoint); + + // nodes + + /** + * List all nodes. Node operations require the engine to be part of a swarm + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + ListSwarmNodesCmd.Exec listSwarmNodeCmdExec(); + + /** + * Return low-level information on the node. Node operations require the engine to be part of a swarm + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + InspectSwarmNodeCmd.Exec inspectSwarmNodeCmdExec(); + + /** + * Remove a node from the swarm. Node operations require the engine to be part of a swarm + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + RemoveSwarmNodeCmd.Exec removeSwarmNodeCmdExec(); + + /** + * Update a node. Node operations require the engine to be part of a swarm + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + UpdateSwarmNodeCmd.Exec updateSwarmNodeCmdExec(); + + /** + * Update a node. Node operations require the engine to be part of a swarm + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ + ListTasksCmd.Exec listTasksCmdExec(); + + /** + * Delete unused content (containers, images, volumes, networks, build relicts) + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + PruneCmd.Exec pruneCmdExec(); + + /** + * Command to list all secrets. + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + ListSecretsCmd.Exec createListSecretsCmdExec(); + + /** + * Command to create a new secret in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + CreateSecretCmd.Exec createCreateSecretCmdExec(); + + /** + * Command to remove a secret in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + RemoveSecretCmd.Exec createRemoveSecretCmdExec(); + + /** + * Command to list all configs. + * + * @since {@link RemoteApiVersion#VERSION_1_30} + */ + ListConfigsCmd.Exec createListConfigsCmdExec(); + + /** + * Command to inspect a config in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_30} + */ + InspectConfigCmd.Exec createInspectConfigCmdExec(); + + /** + * Command to create a new config in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_30} + */ + CreateConfigCmd.Exec createCreateConfigCmdExec(); + + /** + * Command to remove a config in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_30} + */ + RemoveConfigCmd.Exec createRemoveConfigCmdExec(); + + + @Override + void close() throws IOException; + +} diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java similarity index 76% rename from src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java index 678b4afe1..a4cd40707 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdSyncExec.java @@ -2,6 +2,6 @@ public interface DockerCmdSyncExec, RES_T> { - public RES_T exec(CMD_T command); + RES_T exec(CMD_T command); } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java new file mode 100644 index 000000000..34a0c5ad5 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/EventsCmd.java @@ -0,0 +1,88 @@ +package com.github.dockerjava.api.command; + +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +import javax.annotation.CheckForNull; + +import com.github.dockerjava.api.model.Event; +import com.github.dockerjava.api.model.EventType; + +/** + * Get events + */ +public interface EventsCmd extends AsyncDockerCmd { + + @CheckForNull + Map> getFilters(); + + @CheckForNull + String getSince(); + + @CheckForNull + String getUntil(); + + /** + * @param container + * - container to filter + */ + EventsCmd withContainerFilter(String... container); + + /** + * @param event + * - event to filter (pull | create | attach | start | stop | kill) + */ + EventsCmd withEventFilter(String... event); + + /** + * @param eventTypes event types to filter + */ + EventsCmd withEventTypeFilter(String... eventTypes); + + /** + * This provides a type safe version of {@link #withEventTypeFilter(String...)}. + * + * @param eventTypes event types to filter + */ + default EventsCmd withEventTypeFilter(EventType... eventTypes) { + return withEventTypeFilter( + Stream.of(eventTypes) + .map(EventType::getValue) + .toArray(String[]::new) + ); + } + + /** + * @param image + * - image to filter + */ + EventsCmd withImageFilter(String... image); + + /** + * @param label + * - label to filter + */ + EventsCmd withLabelFilter(String... label); + + /** + * @param labels + * - labels to filter (map of names and values) + */ + EventsCmd withLabelFilter(Map labels); + + /** + * @param since + * - Show all events created since timestamp + */ + EventsCmd withSince(String since); + + /** + * @param until + * - Show all events created until timestamp + */ + EventsCmd withUntil(String until); + + interface Exec extends DockerCmdAsyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java new file mode 100644 index 000000000..c03a6334a --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -0,0 +1,60 @@ +package com.github.dockerjava.api.command; + +import java.util.List; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +public interface ExecCreateCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + @CheckForNull + Boolean hasAttachStderrEnabled(); + + @CheckForNull + Boolean hasAttachStdinEnabled(); + + @CheckForNull + Boolean hasAttachStdoutEnabled(); + + @CheckForNull + Boolean hasTtyEnabled(); + + @CheckForNull + List getEnv(); + + @CheckForNull + String getUser(); + + @CheckForNull + Boolean getPrivileged(); + + @CheckForNull + String getWorkingDir(); + + ExecCreateCmd withAttachStderr(Boolean attachStderr); + + ExecCreateCmd withAttachStdin(Boolean attachStdin); + + ExecCreateCmd withAttachStdout(Boolean attachStdout); + + ExecCreateCmd withCmd(String... cmd); + + ExecCreateCmd withEnv(List env); + + ExecCreateCmd withContainerId(@Nonnull String containerId); + + ExecCreateCmd withTty(Boolean tty); + + ExecCreateCmd withUser(String user); + + ExecCreateCmd withPrivileged(Boolean isPrivileged); + + ExecCreateCmd withWorkingDir(String workingDir); + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java new file mode 100644 index 000000000..449803236 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java @@ -0,0 +1,18 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@EqualsAndHashCode +@ToString +public class ExecCreateCmdResponse extends DockerObject { + + @JsonProperty("Id") + private String id; + + public String getId() { + return id; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java new file mode 100644 index 000000000..6d151be61 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -0,0 +1,45 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Frame; + +public interface ExecStartCmd extends AsyncDockerCmd { + + @CheckForNull + String getExecId(); + + @CheckForNull + Boolean hasDetachEnabled(); + + @CheckForNull + Boolean hasTtyEnabled(); + + @CheckForNull + InputStream getStdin(); + + ExecStartCmd withDetach(Boolean detach); + + ExecStartCmd withExecId(@Nonnull String execId); + + ExecStartCmd withTty(Boolean tty); + + ExecStartCmd withStdIn(InputStream stdin); + + /** + * + * @throws NotFoundException + * No such exec instance + */ + @Override + > T exec(T resultCallback); + + interface Exec extends DockerCmdAsyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphData.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphData.java new file mode 100644 index 000000000..44abc176d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphData.java @@ -0,0 +1,112 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; + +/** + * part of {@link GraphDriver} + * @author Kanstantsin Shautsou + */ +@EqualsAndHashCode +@ToString +public class GraphData extends DockerObject { + + @JsonProperty("RootDir") + private String rootDir; + + @JsonProperty("DeviceId") + private String deviceId; + + @JsonProperty("DeviceName") + private String deviceName; + + @JsonProperty("DeviceSize") + private String deviceSize; + + @JsonProperty("dir") + private String dir; + + /** + * @see #rootDir + */ + @CheckForNull + public String getRootDir() { + return rootDir; + } + + /** + * @see #rootDir + */ + public GraphData withRootDir(String rootDir) { + this.rootDir = rootDir; + return this; + } + + /** + * @see #deviceId + */ + @CheckForNull + public String getDeviceId() { + return deviceId; + } + + /** + * @see #deviceId + */ + public GraphData withDeviceId(String deviceId) { + this.deviceId = deviceId; + return this; + } + + /** + * @see #deviceName + */ + @CheckForNull + public String getDeviceName() { + return deviceName; + } + + /** + * @see #deviceName + */ + public GraphData withDeviceName(String deviceName) { + this.deviceName = deviceName; + return this; + } + + /** + * @see #deviceSize + */ + @CheckForNull + public String getDeviceSize() { + return deviceSize; + } + + /** + * @see #deviceSize + */ + public GraphData withDeviceSize(String deviceSize) { + this.deviceSize = deviceSize; + return this; + } + + /** + * @see #dir + */ + @CheckForNull + public String getDir() { + return dir; + } + + /** + * @see #dir + */ + public GraphData withDir(String dir) { + this.dir = dir; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphDriver.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphDriver.java new file mode 100644 index 000000000..4d6679416 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/GraphDriver.java @@ -0,0 +1,63 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; + +/** + * Part of {@link InspectImageResponse} and {@link InspectContainerResponse} + * + * @author Kanstantsin Shautsou + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21} + */ +@EqualsAndHashCode +@ToString +public class GraphDriver extends DockerObject { + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21} + */ + @JsonProperty("Name") + private String name; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21} + */ + @JsonProperty("Data") + private GraphData data; + + + /** + * @see #data + */ + @CheckForNull + public GraphData getData() { + return data; + } + + /** + * @see #data + */ + public GraphDriver withData(GraphData data) { + this.data = data; + return this; + } + + /** + * @see #name + */ + @CheckForNull + public String getName() { + return name; + } + + /** + * @see #name + */ + public GraphDriver withName(String name) { + this.name = name; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthState.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthState.java new file mode 100644 index 000000000..0d8e399c1 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthState.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +@EqualsAndHashCode +@ToString +public class HealthState extends DockerObject { + + @JsonProperty("Status") + private String status; + + @JsonProperty("FailingStreak") + private Integer failingStreak; + + @JsonProperty("Log") + private List log; + + public String getStatus() { + return status; + } + + public Integer getFailingStreak() { + return failingStreak; + } + + public List getLog() { + return log; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthStateLog.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthStateLog.java new file mode 100644 index 000000000..71939f872 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/HealthStateLog.java @@ -0,0 +1,48 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@EqualsAndHashCode +@ToString +public class HealthStateLog extends DockerObject { + + @JsonProperty("Start") + private String start; + + @JsonProperty("End") + private String end; + + @JsonProperty("ExitCode") + private Long exitCode; + + @JsonProperty("Output") + private String output; + + public String getStart() { + return start; + } + + public String getEnd() { + return end; + } + + /** + * + * @deprecated use {@link #getExitCodeLong()} + */ + @Deprecated + public Integer getExitCode() { + return exitCode != null ? exitCode.intValue() : null; + } + + public Long getExitCodeLong() { + return exitCode; + } + + public String getOutput() { + return output; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InfoCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InfoCmd.java new file mode 100644 index 000000000..5dead0f45 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InfoCmd.java @@ -0,0 +1,10 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Info; + +public interface InfoCmd extends SyncDockerCmd { + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InitializeSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InitializeSwarmCmd.java new file mode 100644 index 000000000..ff0fabf99 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InitializeSwarmCmd.java @@ -0,0 +1,36 @@ +package com.github.dockerjava.api.command; + + +import com.github.dockerjava.api.model.SwarmSpec; + +import javax.annotation.CheckForNull; + +public interface InitializeSwarmCmd extends SyncDockerCmd { + + @CheckForNull + String getListenAddr(); + + InitializeSwarmCmd withListenAddr(String listenAddr); + + @CheckForNull + String getAdvertiseAddr(); + + InitializeSwarmCmd withAdvertiseAddr(String advertiseAddr); + + @CheckForNull + Boolean isForceNewCluster(); + + InitializeSwarmCmd withForceNewCluster(Boolean forceNewCluster); + + @CheckForNull + SwarmSpec getSwarmSpec(); + + InitializeSwarmCmd withSwarmSpec(SwarmSpec swarmSpec); + + @Override + Void exec(); + + interface Exec extends DockerCmdSyncExec { + + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectConfigCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectConfigCmd.java new file mode 100644 index 000000000..96374d795 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectConfigCmd.java @@ -0,0 +1,25 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Config; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +public interface InspectConfigCmd extends SyncDockerCmd { + + @CheckForNull + String getConfigId(); + + InspectConfigCmd withConfigId(@Nonnull String configId); + + /** + * @throws NotFoundException + * No such config + */ + @Override + Config exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java new file mode 100644 index 000000000..bbb0159f8 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerCmd.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +public interface InspectContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + InspectContainerCmd withContainerId(@Nonnull String containerId); + + InspectContainerCmd withSize(Boolean showSize); + + Boolean getSize(); + + /** + * @throws NotFoundException + * No such container + */ + @Override + InspectContainerResponse exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} 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 new file mode 100644 index 000000000..f06bd4ed9 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -0,0 +1,643 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.ContainerConfig; +import com.github.dockerjava.api.model.DockerObject; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.NetworkSettings; +import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeBind; +import com.github.dockerjava.api.model.VolumeBinds; +import com.github.dockerjava.api.model.VolumeRW; +import com.github.dockerjava.api.model.VolumesRW; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; +import java.util.List; +import java.util.Map; + +/** + * + * @author Konstantin Pelykh (kpelykh@gmail.com) + * + */ +@EqualsAndHashCode +@ToString +public class InspectContainerResponse extends DockerObject { + + @JsonProperty("Args") + private String[] args; + + @JsonProperty("Config") + private ContainerConfig config; + + @JsonProperty("Created") + private String created; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("ExecDriver") + private String execDriver; + + @JsonProperty("HostConfig") + private HostConfig hostConfig; + + @JsonProperty("HostnamePath") + private String hostnamePath; + + @JsonProperty("HostsPath") + private String hostsPath; + + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @JsonProperty("LogPath") + private String logPath; + + @JsonProperty("Id") + private String id; + + @JsonProperty("SizeRootFs") + private Long sizeRootFs; + + @JsonProperty("SizeRw") + private Long sizeRw; + + @JsonProperty("Image") + private String imageId; + + @JsonProperty("MountLabel") + private String mountLabel; + + @JsonProperty("Name") + private String name; + + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @JsonProperty("RestartCount") + private Integer restartCount; + + @JsonProperty("NetworkSettings") + private NetworkSettings networkSettings; + + @JsonProperty("Path") + private String path; + + @JsonProperty("ProcessLabel") + private String processLabel; + + @JsonProperty("ResolvConfPath") + private String resolvConfPath; + + @JsonProperty("ExecIDs") + private List execIds; + + @JsonProperty("State") + private ContainerState state; + + @JsonProperty("Volumes") + private VolumeBinds volumes; + + @JsonProperty("VolumesRW") + private VolumesRW volumesRW; + + @JsonProperty("Node") + private Node node; + + @JsonProperty("Mounts") + private List mounts; + + @JsonProperty("GraphDriver") + private GraphDriver graphDriver; + + /** + * @since {@link RemoteApiVersion#VERSION_1_30} + */ + @JsonProperty("Platform") + private String platform; + + public String getId() { + return id; + } + + public Long getSizeRootFs() { + return sizeRootFs; + } + + public Long getSizeRw() { + return sizeRw; + } + + public String getCreated() { + return created; + } + + public String getPath() { + return path; + } + + public String getProcessLabel() { + return processLabel; + } + + public String[] getArgs() { + return args; + } + + public ContainerConfig getConfig() { + return config; + } + + public ContainerState getState() { + return state; + } + + public String getImageId() { + return imageId; + } + + public NetworkSettings getNetworkSettings() { + return networkSettings; + } + + public String getResolvConfPath() { + return resolvConfPath; + } + + @JsonIgnore + public VolumeBind[] getVolumes() { + return volumes == null ? null : volumes.getBinds(); + } + + /** + * @deprecated As of {@link RemoteApiVersion#VERSION_1_20} use {@link #getMounts()} instead + */ + @JsonIgnore + @Deprecated + @CheckForNull + public VolumeRW[] getVolumesRW() { + return volumesRW == null ? null : volumesRW.getVolumesRW(); + } + + public String getHostnamePath() { + return hostnamePath; + } + + public String getHostsPath() { + return hostsPath; + } + + @CheckForNull + public String getLogPath() { + return logPath; + } + + public String getName() { + return name; + } + + public Integer getRestartCount() { + return restartCount; + } + + public String getDriver() { + return driver; + } + + public HostConfig getHostConfig() { + return hostConfig; + } + + public String getExecDriver() { + return execDriver; + } + + public String getMountLabel() { + return mountLabel; + } + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + public List getMounts() { + return mounts; + } + + public List getExecIds() { + return execIds; + } + + /** + * Get the underlying swarm node info. This property does only contains a value in swarm-classic + * @return The underlying swarm-classic node info + * @CheckForNull + */ + public Node getNode() { + return node; + } + + /** + * @see #graphDriver + */ + @CheckForNull + public GraphDriver getGraphDriver() { + return graphDriver; + } + + /** + * @see #platform + */ + @CheckForNull + public String getPlatform() { + return platform; + } + + @EqualsAndHashCode + @ToString + public class ContainerState extends DockerObject { + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Status") + private String status; + + /** + * @since < {@link RemoteApiVersion#VERSION_1_16} + */ + @CheckForNull + @JsonProperty("Running") + private Boolean running; + + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull + @JsonProperty("Paused") + private Boolean paused; + + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull + @JsonProperty("Restarting") + private Boolean restarting; + + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull + @JsonProperty("OOMKilled") + private Boolean oomKilled; + + /** + * Unclear + * + * @since {@link RemoteApiVersion#UNKNOWN_VERSION} + */ + @CheckForNull + @JsonProperty("Dead") + private Boolean dead; + + /** + * @since < {@link RemoteApiVersion#VERSION_1_16} + */ + @CheckForNull + @JsonProperty("Pid") + private Long pid; + + /** + * @since < {@link RemoteApiVersion#VERSION_1_16} + */ + @CheckForNull + @JsonProperty("ExitCode") + private Long exitCode; + + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull + @JsonProperty("Error") + private String error; + + /** + * @since < {@link RemoteApiVersion#VERSION_1_16} + */ + @CheckForNull + @JsonProperty("StartedAt") + private String startedAt; + + /** + * @since {@link RemoteApiVersion#VERSION_1_17} + */ + @CheckForNull + @JsonProperty("FinishedAt") + private String finishedAt; + + + /** + * @since Docker version 1.12 + */ + @JsonProperty("Health") + private HealthState health; + + /** + * See {@link #status} + */ + @CheckForNull + public String getStatus() { + return status; + } + + /** + * See {@link #running} + */ + @CheckForNull + public Boolean getRunning() { + return running; + } + + /** + * See {@link #paused} + */ + @CheckForNull + public Boolean getPaused() { + return paused; + } + + /** + * See {@link #restarting} + */ + @CheckForNull + public Boolean getRestarting() { + return restarting; + } + + /** + * See {@link #oomKilled} + */ + @CheckForNull + public Boolean getOOMKilled() { + return oomKilled; + } + + /** + * See {@link #dead} + */ + @CheckForNull + public Boolean getDead() { + return dead; + } + + /** + * See {@link #pid} + * + * @deprecated use {@link #getPidLong()} + */ + @Deprecated + @CheckForNull + public Integer getPid() { + return pid != null ? pid.intValue() : null; + } + + /** + * See {@link #pid} + */ + @CheckForNull + public Long getPidLong() { + return pid; + } + + /** + * See {@link #exitCode} + * + * @deprecated use {@link #getExitCodeLong()} + */ + @Deprecated + @CheckForNull + public Integer getExitCode() { + return exitCode != null ? exitCode.intValue() : null; + } + + /** + * See {@link #exitCode} + */ + @CheckForNull + public Long getExitCodeLong() { + return exitCode; + } + + /** + * See {@link #error} + */ + @CheckForNull + public String getError() { + return error; + } + + /** + * See {@link #startedAt} + */ + @CheckForNull + public String getStartedAt() { + return startedAt; + } + + /** + * See {@link #finishedAt} + */ + @CheckForNull + public String getFinishedAt() { + return finishedAt; + } + + public HealthState getHealth() { + return health; + } + } + + @EqualsAndHashCode + @ToString + public static class Mount extends DockerObject { + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Name") + private String name; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Source") + private String source; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Destination") + private Volume destination; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Driver") + private String driver; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("Mode") + private String mode; + + /** + * @since {@link RemoteApiVersion#VERSION_1_20} + */ + @CheckForNull + @JsonProperty("RW") + private Boolean rw; + + @CheckForNull + public String getName() { + return name; + } + + @CheckForNull + public String getSource() { + return source; + } + + @CheckForNull + public Volume getDestination() { + return destination; + } + + @CheckForNull + public String getDriver() { + return driver; + } + + @CheckForNull + public String getMode() { + return mode; + } + + @CheckForNull + public Boolean getRW() { + return rw; + } + + /** + * @see #destination + */ + public Mount withDestination(Volume destination) { + this.destination = destination; + return this; + } + + /** + * @see #driver + */ + public Mount withDriver(String driver) { + this.driver = driver; + return this; + } + + /** + * @see #mode + */ + public Mount withMode(String mode) { + this.mode = mode; + return this; + } + + /** + * @see #name + */ + public Mount withName(String name) { + this.name = name; + return this; + } + + /** + * @see #rw + */ + public Mount withRw(Boolean rw) { + this.rw = rw; + return this; + } + + /** + * @see #source + */ + public Mount withSource(String source) { + this.source = source; + return this; + } + } + + @EqualsAndHashCode + @ToString + public class Node extends DockerObject { + + @JsonProperty("ID") + private String id; + + @JsonProperty("IP") + private String ip; + + @JsonProperty("Addr") + private String addr; + + @JsonProperty("Name") + private String name; + + @JsonProperty("Cpus") + private Integer cpus; + + @JsonProperty("Memory") + private Long memory; + + @JsonProperty("Labels") + private Map labels; + + public String getId() { + return id; + } + + public String getIp() { + return ip; + } + + public String getAddr() { + return addr; + } + + public String getName() { + return name; + } + + public Integer getCpus() { + return cpus; + } + + public Long getMemory() { + return memory; + } + + public Map getLabels() { + return labels; + } + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java new file mode 100644 index 000000000..fdb2577c4 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecCmd.java @@ -0,0 +1,24 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +public interface InspectExecCmd extends SyncDockerCmd { + + @CheckForNull + String getExecId(); + + InspectExecCmd withExecId(@Nonnull String execId); + + /** + * @throws NotFoundException + * if no such exec has been found + */ + @Override + InspectExecResponse exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java new file mode 100644 index 000000000..307fdd873 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectExecResponse.java @@ -0,0 +1,208 @@ +package com.github.dockerjava.api.command; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import com.github.dockerjava.api.model.NetworkSettings; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; + +@EqualsAndHashCode +@ToString +public class InspectExecResponse extends DockerObject { + @JsonProperty("ID") + private String id; + + @JsonProperty("OpenStdin") + private Boolean openStdin; + + @JsonProperty("OpenStderr") + private Boolean openStderr; + + @JsonProperty("OpenStdout") + private Boolean openStdout; + + @JsonProperty("Running") + private Boolean running; + + /** + * @since {@link RemoteApiVersion#VERSION_1_22} + */ + @JsonProperty("CanRemove") + private Boolean canRemove; + + @JsonProperty("ExitCode") + private Long exitCode; + + @JsonProperty("ProcessConfig") + private ProcessConfig processConfig; + + /** + * @deprecated @since {@link RemoteApiVersion#VERSION_1_22} + */ + @Deprecated + @JsonProperty("Container") + private Container container; + + /** + * @since {@link RemoteApiVersion#VERSION_1_22} + */ + @JsonProperty("ContainerID") + private String containerID; + + /** + * @since {@link RemoteApiVersion#VERSION_1_22} + */ + @JsonProperty("DetachKeys") + private String detachKeys; + + /** + * @since {@link RemoteApiVersion#VERSION_1_25} + */ + @JsonProperty("Pid") + private Long pid; + + public String getId() { + return id; + } + + public Boolean isOpenStdin() { + return openStdin; + } + + public Boolean isOpenStderr() { + return openStderr; + } + + public Boolean isOpenStdout() { + return openStdout; + } + + public Boolean isRunning() { + return running; + } + + /** + * @deprecated use {@link #getExitCodeLong()} + */ + @Deprecated + public Integer getExitCode() { + return exitCode != null ? exitCode.intValue() : null; + } + + public Long getExitCodeLong() { + return exitCode; + } + + public ProcessConfig getProcessConfig() { + return processConfig; + } + + /** + * @see #container + */ + @Deprecated + public Container getContainer() { + return container; + } + + /** + * @see #canRemove + */ + @CheckForNull + public Boolean getCanRemove() { + return canRemove; + } + + /** + * @see #containerID + */ + @CheckForNull + public String getContainerID() { + return containerID; + } + + /** + * @see #detachKeys + */ + @CheckForNull + public String getDetachKeys() { + return detachKeys; + } + + /** + * @see #pid + * @deprecated use {@link #getPidLong()} + */ + @CheckForNull + @Deprecated + public Integer getPid() { + return pid != null ? pid.intValue() : null; + } + + /** + * @see #pid + */ + @CheckForNull + public Long getPidLong() { + return pid; + } + + @EqualsAndHashCode + @ToString + public class ProcessConfig extends DockerObject { + + @JsonProperty("arguments") + private List arguments; + + @JsonProperty("entrypoint") + private String entryPoint; + + @JsonProperty("privileged") + private Boolean privileged; + + @JsonProperty("tty") + private Boolean tty; + + @JsonProperty("user") + private String user; + + public List getArguments() { + return arguments; + } + + public String getEntryPoint() { + return entryPoint; + } + + public Boolean isPrivileged() { + return privileged; + } + + public Boolean isTty() { + return tty; + } + + public String getUser() { + return user; + } + } + + @EqualsAndHashCode + @ToString + public class Container extends DockerObject { + + @JsonProperty("NetworkSettings") + private NetworkSettings networkSettings; + + /** + * @since {@link RemoteApiVersion#VERSION_1_21} + */ + public NetworkSettings getNetworkSettings() { + return networkSettings; + } + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java new file mode 100644 index 000000000..411a71bcb --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageCmd.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Inspect the details of an image. + */ +public interface InspectImageCmd extends SyncDockerCmd { + + @CheckForNull + String getImageId(); + + InspectImageCmd withImageId(@Nonnull String imageId); + + /** + * @throws NotFoundException + * No such image + */ + @Override + InspectImageResponse exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java new file mode 100644 index 000000000..bf48ba8f0 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectImageResponse.java @@ -0,0 +1,374 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.ContainerConfig; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; +import java.util.List; + +/** + * + * @author Konstantin Pelykh (kpelykh@gmail.com) + * + */ +@EqualsAndHashCode +@ToString +public class InspectImageResponse extends DockerObject { + + @JsonProperty("Architecture") + private String arch; + + @JsonProperty("Author") + private String author; + + @JsonProperty("Comment") + private String comment; + + @JsonProperty("Config") + private ContainerConfig config; + + @JsonProperty("Container") + private String container; + + @JsonProperty("ContainerConfig") + private ContainerConfig containerConfig; + + @JsonProperty("Created") + private String created; + + @JsonProperty("DockerVersion") + private String dockerVersion; + + @JsonProperty("Id") + private String id; + + @JsonProperty("Os") + private String os; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_25} + */ + @JsonProperty("OsVersion") + private String osVersion; + + @JsonProperty("Parent") + private String parent; + + @JsonProperty("Size") + private Long size; + + @JsonProperty("RepoTags") + private List repoTags; + + @JsonProperty("RepoDigests") + private List repoDigests; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21} + */ + @JsonProperty("VirtualSize") + private Long virtualSize; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_21} + */ + @JsonProperty("GraphDriver") + private GraphDriver graphDriver; + + @JsonProperty("RootFS") + private RootFS rootFS; + + /** + * @see #arch + */ + @CheckForNull + public String getArch() { + return arch; + } + + /** + * @see #arch + */ + public InspectImageResponse withArch(String arch) { + this.arch = arch; + return this; + } + + /** + * @see #author + */ + @CheckForNull + public String getAuthor() { + return author; + } + + /** + * @see #author + */ + public InspectImageResponse withAuthor(String author) { + this.author = author; + return this; + } + + /** + * @see #comment + */ + @CheckForNull + public String getComment() { + return comment; + } + + /** + * @see #comment + */ + public InspectImageResponse withComment(String comment) { + this.comment = comment; + return this; + } + + /** + * Get the image commit configuration + * @see #config + */ + @CheckForNull + public ContainerConfig getConfig() { + return config; + } + + /** + * @see #config + */ + public InspectImageResponse withConfig(ContainerConfig config) { + this.config = config; + return this; + } + + /** + * @see #container + */ + @CheckForNull + public String getContainer() { + return container; + } + + /** + * @see #container + */ + public InspectImageResponse withContainer(String container) { + this.container = container; + return this; + } + + /** + * If the image was created from a container, this config contains the configuration of the container + * which was committed in this image + * @see #containerConfig + */ + @CheckForNull + public ContainerConfig getContainerConfig() { + return containerConfig; + } + + /** + * @see #containerConfig + */ + public InspectImageResponse withContainerConfig(ContainerConfig containerConfig) { + this.containerConfig = containerConfig; + return this; + } + + /** + * @see #created + */ + @CheckForNull + public String getCreated() { + return created; + } + + /** + * @see #created + */ + public InspectImageResponse withCreated(String created) { + this.created = created; + return this; + } + + /** + * @see #dockerVersion + */ + @CheckForNull + public String getDockerVersion() { + return dockerVersion; + } + + /** + * @see #dockerVersion + */ + public InspectImageResponse withDockerVersion(String dockerVersion) { + this.dockerVersion = dockerVersion; + return this; + } + + /** + * @see #id + */ + @CheckForNull + public String getId() { + return id; + } + + /** + * @see #id + */ + public InspectImageResponse withId(String id) { + this.id = id; + return this; + } + + /** + * @see #os + */ + @CheckForNull + public String getOs() { + return os; + } + + /** + * @see #os + */ + public InspectImageResponse withOs(String os) { + this.os = os; + return this; + } + + /** + * @see #osVersion + */ + @CheckForNull + public String getOsVersion() { + return osVersion; + } + + /** + * @see #osVersion + */ + public InspectImageResponse withOsVersion(String osVersion) { + this.osVersion = osVersion; + return this; + } + + /** + * @see #parent + */ + @CheckForNull + public String getParent() { + return parent; + } + + /** + * @see #parent + */ + public InspectImageResponse withParent(String parent) { + this.parent = parent; + return this; + } + + /** + * @see #repoTags + */ + @CheckForNull + public List getRepoTags() { + return repoTags; + } + + /** + * @see #repoTags + */ + public InspectImageResponse withRepoTags(List repoTags) { + this.repoTags = repoTags; + return this; + } + + /** + * @see #size + */ + @CheckForNull + public Long getSize() { + return size; + } + + /** + * @see #size + */ + public InspectImageResponse withSize(Long size) { + this.size = size; + return this; + } + + /** + * @see #repoDigests + */ + @CheckForNull + public List getRepoDigests() { + return repoDigests; + } + + /** + * @see #repoDigests + */ + public InspectImageResponse withRepoDigests(List repoDigests) { + this.repoDigests = repoDigests; + return this; + } + + /** + * @see #graphDriver + */ + @CheckForNull + public GraphDriver getGraphDriver() { + return graphDriver; + } + + /** + * @see #graphDriver + */ + public InspectImageResponse withGraphDriver(GraphDriver graphDriver) { + this.graphDriver = graphDriver; + return this; + } + + /** + * @see #virtualSize + */ + @CheckForNull + public Long getVirtualSize() { + return virtualSize; + } + + /** + * @see #virtualSize + */ + public InspectImageResponse withVirtualSize(Long virtualSize) { + this.virtualSize = virtualSize; + return this; + } + + /** + * @see #rootFS + */ + @CheckForNull + public RootFS getRootFS() { + return rootFS; + } + + /** + * @see #rootFS + */ + public InspectImageResponse withRootFS(RootFS rootFS) { + this.rootFS = rootFS; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java new file mode 100644 index 000000000..9dd462ac4 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectNetworkCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Network; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Inspect a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface InspectNetworkCmd extends SyncDockerCmd { + + @CheckForNull + String getNetworkId(); + + InspectNetworkCmd withNetworkId(@Nonnull String networkId); + + /** + * @throws NotFoundException + * No such network + */ + @Override + Network exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectServiceCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectServiceCmd.java new file mode 100644 index 000000000..74c52c1f3 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectServiceCmd.java @@ -0,0 +1,25 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Service; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +public interface InspectServiceCmd extends SyncDockerCmd { + + @CheckForNull + String getServiceId(); + + InspectServiceCmd withServiceId(@Nonnull String serviceId); + + /** + * @throws NotFoundException + * No such service + */ + @Override + Service exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmCmd.java new file mode 100644 index 000000000..9342d9969 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmCmd.java @@ -0,0 +1,18 @@ +package com.github.dockerjava.api.command; + + +import com.github.dockerjava.api.model.Swarm; + +/** + * Inspect a swarm. + */ +public interface InspectSwarmCmd extends SyncDockerCmd { + + @Override + Swarm exec(); + + interface Exec extends DockerCmdSyncExec { + } + + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmNodeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmNodeCmd.java new file mode 100644 index 000000000..07750f09e --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectSwarmNodeCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.SwarmNode; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Inspect a swarmNode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ +public interface InspectSwarmNodeCmd extends SyncDockerCmd { + + @CheckForNull + String getSwarmNodeId(); + + InspectSwarmNodeCmd withSwarmNodeId(@Nonnull String swarmNodeId); + + /** + * @throws NotFoundException No such swarmNode + */ + @Override + SwarmNode exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectTaskCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectTaskCmd.java new file mode 100644 index 000000000..118910eee --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectTaskCmd.java @@ -0,0 +1,19 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Task; + +import javax.annotation.CheckForNull; + +public interface InspectTaskCmd extends SyncDockerCmd { + @CheckForNull + String getTaskId(); + + InspectTaskCmd withTaskId(); + + @Override + Task exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java new file mode 100644 index 000000000..73d552d22 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeCmd.java @@ -0,0 +1,23 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.Nonnull; + +/** + * Inspect the details of a volume. + * + * @author Marcus Linke + * + */ +public interface InspectVolumeCmd extends SyncDockerCmd { + + String getName(); + + /** + * @param name + * - The volume’s name. + */ + InspectVolumeCmd withName(@Nonnull String name); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java new file mode 100644 index 000000000..bc0008817 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectVolumeResponse.java @@ -0,0 +1,53 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Map; + +/** + * + * @author Marcus Linke + */ +@EqualsAndHashCode +@ToString +public class InspectVolumeResponse extends DockerObject { + + @JsonProperty("Name") + private String name; + + @JsonProperty("Labels") + private Map labels; + + @JsonProperty("Driver") + private String driver; + + @JsonProperty("Mountpoint") + private String mountpoint; + + @JsonProperty("Options") + private Map options; + + public String getName() { + return name; + } + + public Map getLabels() { + return labels; + } + + public String getDriver() { + return driver; + } + + public String getMountpoint() { + return mountpoint; + } + + public Map getOptions() { + return options; + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/JoinSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/JoinSwarmCmd.java new file mode 100644 index 000000000..cc2412a58 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/JoinSwarmCmd.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.api.command; + + +import javax.annotation.CheckForNull; +import java.util.List; + +public interface JoinSwarmCmd extends SyncDockerCmd { + + @CheckForNull + String getListenAddr(); + + JoinSwarmCmd withListenAddr(String listenAddr); + + @CheckForNull + String getAdvertiseAddr(); + + JoinSwarmCmd withAdvertiseAddr(String advertiseAddr); + + @CheckForNull + List getRemoteAddrs(); + + JoinSwarmCmd withRemoteAddrs(List remoteAddrs); + + @CheckForNull + String getJoinToken(); + + JoinSwarmCmd withJoinToken(String joinToken); + + @Override + Void exec(); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java new file mode 100644 index 000000000..e64d7b393 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/KillContainerCmd.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Kill a running container. + */ +public interface KillContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + @CheckForNull + String getSignal(); + + KillContainerCmd withContainerId(@Nonnull String containerId); + + KillContainerCmd withSignal(String signal); + + /** + * @throws NotFoundException + * No such container + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LeaveSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LeaveSwarmCmd.java new file mode 100644 index 000000000..11a5b80d9 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LeaveSwarmCmd.java @@ -0,0 +1,18 @@ +package com.github.dockerjava.api.command; + + +import javax.annotation.CheckForNull; + +public interface LeaveSwarmCmd extends SyncDockerCmd { + + @CheckForNull + Boolean hasForceEnabled(); + + LeaveSwarmCmd withForceEnabled(Boolean force); + + @Override + Void exec(); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListConfigsCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListConfigsCmd.java new file mode 100644 index 000000000..38d34816a --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListConfigsCmd.java @@ -0,0 +1,21 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Config; + +import java.util.List; +import java.util.Map; + +/** + * Command to list all configs in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_30} + */ +public interface ListConfigsCmd extends SyncDockerCmd> { + + Map> getFilters(); + + ListConfigsCmd withFilters(Map> filters); + + interface Exec extends DockerCmdSyncExec> { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java new file mode 100644 index 000000000..879ec711c --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListContainersCmd.java @@ -0,0 +1,128 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Container; + +import javax.annotation.CheckForNull; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * List containers + * + */ +public interface ListContainersCmd extends SyncDockerCmd> { + + @CheckForNull + String getBeforeId(); + + @CheckForNull + Map> getFilters(); + + @CheckForNull + Integer getLimit(); + + @CheckForNull + String getSinceId(); + + @CheckForNull + Boolean hasShowAllEnabled(); + + @CheckForNull + Boolean hasShowSizeEnabled(); + + /** + * @param before + * - Show only containers created before Id, include non-running ones. + */ + ListContainersCmd withBefore(String before); + + /** + * @param name + * - Show only containers that has the container's name + */ + ListContainersCmd withNameFilter(Collection name); + + /** + * @param id + * - Show only containers that has the container's id + */ + ListContainersCmd withIdFilter(Collection id); + + /** + * @param ancestor + * - Show only containers created from an image or a descendant. + */ + ListContainersCmd withAncestorFilter(Collection ancestor); + + /** + * @param volume + * - Show only containers with volume name or mount point destination + */ + ListContainersCmd withVolumeFilter(Collection volume); + + /** + * @param network + * - Show only containers with network id or network name + */ + ListContainersCmd withNetworkFilter(Collection network); + + /** + * @param exited + * - Show only containers that exited with the passed exitcode. + */ + ListContainersCmd withExitedFilter(Integer exited); + + /** + * @param status + * - Show only containers with the passed status (created|restarting|running|paused|exited). + */ + ListContainersCmd withStatusFilter(Collection status); + + /** + * @param labels + * - Show only containers with the passed labels. + */ + ListContainersCmd withLabelFilter(Collection labels); + + /** + * @param labels + * - Show only containers with the passed labels. Labels is a {@link Map} that contains label keys and values + */ + ListContainersCmd withLabelFilter(Map labels); + + /** + * @param limit + * - Show `limit` last created containers, include non-running ones. There is no limit by default. + */ + ListContainersCmd withLimit(Integer limit); + + /** + * @param showAll + * - Show all containers. Only running containers are shown by default. + */ + ListContainersCmd withShowAll(Boolean showAll); + + /** + * @param showSize + * - Show the containers sizes. This is false by default. + */ + ListContainersCmd withShowSize(Boolean showSize); + + /** + * @param since + * - Show only containers created since Id, include non-running ones. + */ + ListContainersCmd withSince(String since); + + /** + * @param filterName + * @param filterValues + * - Show only containers where the filter matches the given values + */ + ListContainersCmd withFilter(String filterName, Collection filterValues); + + interface Exec extends DockerCmdSyncExec> { + } + +} diff --git a/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 new file mode 100644 index 000000000..cc60a5bcc --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -0,0 +1,60 @@ +package com.github.dockerjava.api.command; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import javax.annotation.CheckForNull; + +import com.github.dockerjava.api.model.Image; + +/** + * List images + */ +public interface ListImagesCmd extends SyncDockerCmd> { + + @CheckForNull + Map> getFilters(); + + String getImageNameFilter(); + + @CheckForNull + Boolean hasShowAllEnabled(); + + /** + * Show all images (by default filter out the intermediate images used to build) + */ + ListImagesCmd withShowAll(Boolean showAll); + + ListImagesCmd withImageNameFilter(String imageName); + + /** + * Filter dangling images + */ + ListImagesCmd withDanglingFilter(Boolean dangling); + + /** + * @param labels + * - string array in the form ["key"] or ["key=value"] or a mix of both + */ + ListImagesCmd withLabelFilter(String... label); + + /** + * @param labels + * - {@link Map} of labels that contains label keys and values + */ + ListImagesCmd withLabelFilter(Map labels); + + /** + * Filter images by reference + * + * @param reference string in the form {@code [:]} + */ + ListImagesCmd withReferenceFilter(String reference); + + ListImagesCmd withFilter(String key, Collection values); + + interface Exec extends DockerCmdSyncExec> { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java new file mode 100644 index 000000000..a7921824d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListNetworksCmd.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Network; + +import javax.annotation.CheckForNull; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * List networks. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface ListNetworksCmd extends SyncDockerCmd> { + + @CheckForNull + Map> getFilters(); + + ListNetworksCmd withNameFilter(String... networkName); + + ListNetworksCmd withIdFilter(String... networkId); + + /** + * @param filterName + * @param filterValues + * - Show only networks where the filter matches the given values + */ + ListNetworksCmd withFilter(String filterName, Collection filterValues); + + interface Exec extends DockerCmdSyncExec> { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSecretsCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSecretsCmd.java new file mode 100644 index 000000000..959d68831 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSecretsCmd.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Secret; + +import javax.annotation.CheckForNull; +import java.util.List; +import java.util.Map; + +/** + * List secrets + */ +public interface ListSecretsCmd extends SyncDockerCmd> { + + @CheckForNull + Map> getFilters(); + + /** + * @param ids - Show only secrets with the given ids + */ + ListSecretsCmd withIdFilter(List ids); + + /** + * @param names - Show only secrets with the given names + */ + ListSecretsCmd withNameFilter(List names); + + /** + * @param labels - Show only secrets with the passed labels. Labels is a {@link Map} that contains label keys and values + */ + ListSecretsCmd withLabelFilter(Map labels); + + interface Exec extends DockerCmdSyncExec> { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListServicesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListServicesCmd.java new file mode 100644 index 000000000..5926add1e --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListServicesCmd.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Service; + +import javax.annotation.CheckForNull; +import java.util.List; +import java.util.Map; + +/** + * Command to list all services in a docker swarm. Only applicable if docker runs in swarm mode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ +public interface ListServicesCmd extends SyncDockerCmd> { + + @CheckForNull + Map> getFilters(); + + /** + * @param ids - Show only services with the given ids + */ + ListServicesCmd withIdFilter(List ids); + + /** + * @param names - Show only services with the given names + */ + ListServicesCmd withNameFilter(List names); + + /** + * @param labels - Show only services with the passed labels. Labels is a {@link Map} that contains label keys and values + */ + ListServicesCmd withLabelFilter(Map labels); + + interface Exec extends DockerCmdSyncExec> { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSwarmNodesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSwarmNodesCmd.java new file mode 100644 index 000000000..6ad0205d3 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListSwarmNodesCmd.java @@ -0,0 +1,42 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.SwarmNode; + +import javax.annotation.CheckForNull; +import java.util.List; +import java.util.Map; + +/** + * List SwarmNodes + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ +public interface ListSwarmNodesCmd extends SyncDockerCmd> { + + @CheckForNull + Map> getFilters(); + + /** + * @param ids - Show only swarmNodes with the given ids + */ + ListSwarmNodesCmd withIdFilter(List ids); + + /** + * @param names - Show only swarmNodes with the given names + */ + ListSwarmNodesCmd withNameFilter(List names); + + /** + * @param memberships - Show only swarmNodes with the given memberships + */ + ListSwarmNodesCmd withMembershipFilter(List memberships); + + /** + * @param roles - Show only swarmNodes with the given roles + */ + ListSwarmNodesCmd withRoleFilter(List roles); + + interface Exec extends DockerCmdSyncExec> { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListTasksCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListTasksCmd.java new file mode 100644 index 000000000..8037ded5d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListTasksCmd.java @@ -0,0 +1,56 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.Task; +import com.github.dockerjava.api.model.TaskState; + +import javax.annotation.CheckForNull; +import java.util.List; +import java.util.Map; + +public interface ListTasksCmd extends SyncDockerCmd> { + @CheckForNull + Map> getFilters(); + + /** + * @param labels - Show only tasks with the passed labels. + * Labels is a {@link Map} that contains label keys and values + */ + ListTasksCmd withLabelFilter(Map labels); + + /** + * @param labels - Show only tasks with the passed labels. + */ + ListTasksCmd withLabelFilter(String... labels); + + /** + * @param ids Task id(s) + */ + ListTasksCmd withIdFilter(String... ids); + + /** + * @param names Task name(s) + */ + ListTasksCmd withNameFilter(String... names); + + /** + * @param nodeNames Node id(s) or name(s) + */ + ListTasksCmd withNodeFilter(String... nodeNames); + + /** + * @param serviceNames Service name(s) + */ + ListTasksCmd withServiceFilter(String... serviceNames); + + /** + * @param desiredState The desired-state filter can take the values running, shutdown, or accepted. + */ + ListTasksCmd withStateFilter(TaskState... desiredState); + + @Override + List exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec> { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java new file mode 100644 index 000000000..bd66653eb --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesCmd.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.api.command; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import javax.annotation.CheckForNull; + +/** + * List volumes. + * + * @author Marcus Linke + */ +public interface ListVolumesCmd extends SyncDockerCmd { + + @CheckForNull + Map> getFilters(); + + /** + * @param dangling + * - Show dangling volumes filter + */ + ListVolumesCmd withDanglingFilter(Boolean dangling); + + /** + * @param filterName + * @param filterValues + * - Show only volumes where the filter matches the given values + */ + ListVolumesCmd withFilter(String filterName, Collection filterValues); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java new file mode 100644 index 000000000..7c434a48d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListVolumesResponse.java @@ -0,0 +1,24 @@ +package com.github.dockerjava.api.command; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * + * @author Marcus Linke + */ +@EqualsAndHashCode +@ToString +public class ListVolumesResponse extends DockerObject { + + @JsonProperty("Volumes") + private List volumes; + + public List getVolumes() { + return volumes; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageAsyncCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageAsyncCmd.java new file mode 100644 index 000000000..4f054db22 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageAsyncCmd.java @@ -0,0 +1,22 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.LoadResponseItem; + +import java.io.InputStream; + +public interface LoadImageAsyncCmd extends AsyncDockerCmd { + InputStream getImageStream(); + + /** + * @param imageStream the InputStream of the tar file + */ + LoadImageAsyncCmd withImageStream(InputStream imageStream); + + @Override + default LoadImageCallback start() { + return exec(new LoadImageCallback()); + } + + interface Exec extends DockerCmdAsyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java new file mode 100644 index 000000000..80cca18de --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java @@ -0,0 +1,49 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallbackTemplate; +import com.github.dockerjava.api.exception.DockerClientException; +import com.github.dockerjava.api.model.LoadResponseItem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LoadImageCallback extends ResultCallbackTemplate { + + private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageCallback.class); + + private String message; + + private String error; + + @Override + public void onNext(LoadResponseItem item) { + if (item.isBuildSuccessIndicated()) { + this.message = item.getMessage(); + } else if (item.isErrorIndicated()) { + this.error = item.getError(); + } + + LOGGER.debug("{}", item); + } + + public String awaitMessage() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + return getMessage(); + } + + private String getMessage() { + if (this.message != null) { + return this.message; + } + + if (this.error == null) { + throw new DockerClientException("Could not build image"); + } + + throw new DockerClientException("Could not build image: " + this.error); + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java new file mode 100644 index 000000000..184b7ef33 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCmd.java @@ -0,0 +1,21 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +public interface LoadImageCmd extends SyncDockerCmd { + + @CheckForNull + InputStream getImageStream(); + + /** + * @param imageStream + * the InputStream of the tar file + */ + LoadImageCmd withImageStream(@Nonnull InputStream imageStream); + + interface Exec extends DockerCmdSyncExec { + } +} 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 new file mode 100644 index 000000000..29c4516cd --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogContainerCmd.java @@ -0,0 +1,89 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.Frame; + +/** + * Get container logs + * + * @param followStream + * - true or false, return stream. Defaults to false. + * @param stdout + * - true or false, includes stdout log. Defaults to false. + * @param stderr + * - true or false, includes stderr log. Defaults to false. + * @param timestamps + * - true or false, if true, print timestamps for every log line. Defaults to false. + * @param tail + * - `all` or ``, Output specified number of lines at the end of logs + * @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 { + + @CheckForNull + String getContainerId(); + + @CheckForNull + Integer getTail(); + + @CheckForNull + Boolean hasFollowStreamEnabled(); + + @CheckForNull + Boolean hasTimestampsEnabled(); + + @CheckForNull + Boolean hasStdoutEnabled(); + + @CheckForNull + Boolean hasStderrEnabled(); + + @CheckForNull + Integer getSince(); + + @CheckForNull + Integer getUntil(); + + LogContainerCmd withContainerId(@Nonnull String containerId); + + /** + * Following the stream means the resulting {@link InputStream} returned by {@link #exec()} reads infinitely. So a + * {@link InputStream#read()} MAY BLOCK FOREVER as long as no data is streamed from the docker host to {@link DockerClient}! + */ + LogContainerCmd withFollowStream(Boolean followStream); + + LogContainerCmd withTimestamps(Boolean timestamps); + + LogContainerCmd withStdOut(Boolean stdout); + + LogContainerCmd withStdErr(Boolean stderr); + + LogContainerCmd withTailAll(); + + LogContainerCmd withTail(Integer tail); + + LogContainerCmd withSince(Integer since); + + LogContainerCmd withUntil(Integer until); + + /** + * @throws com.github.dockerjava.api.NotFoundException + * No such container + */ + @Override + > T exec(T resultCallback); + + interface Exec extends DockerCmdAsyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogSwarmObjectCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogSwarmObjectCmd.java new file mode 100644 index 000000000..f5e738518 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LogSwarmObjectCmd.java @@ -0,0 +1,94 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.Frame; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Get docker service/task stdout/stderr logs + */ +public interface LogSwarmObjectCmd extends AsyncDockerCmd { + /** + * @param id ID or name of the service + * @return self + */ + LogSwarmObjectCmd withId(@Nonnull String id); + + /** + * @param follow Return the logs as a raw stream. + * @return self + */ + LogSwarmObjectCmd withFollow(Boolean follow); + + /** + * @param timestamps Add timestamps to every log line + * @return self + */ + LogSwarmObjectCmd withTimestamps(Boolean timestamps); + + /** + * @param stdout Return logs from stdout + * @return self + */ + LogSwarmObjectCmd withStdout(Boolean stdout); + + /** + * @param stderr Return logs from stderr + * @return self + */ + LogSwarmObjectCmd withStderr(Boolean stderr); + + /** + * @param tail only return this number of log lines from the end of the logs. + * @return self + */ + LogSwarmObjectCmd withTail(Integer tail); + + /** + * @param since Only return logs since this time, as a UNIX timestamp + * @return self + */ + LogSwarmObjectCmd withSince(Integer since); + + /** + * @param details Show service context and extra details provided to logs. + * @return + */ + LogSwarmObjectCmd withDetails(Boolean details); + + @CheckForNull + String getId(); + + @CheckForNull + Integer getTail(); + + @CheckForNull + Boolean getFollow(); + + @CheckForNull + Boolean getTimestamps(); + + @CheckForNull + Boolean getStdout(); + + @CheckForNull + Boolean getStderr(); + + @CheckForNull + Integer getSince(); + + @CheckForNull + Boolean getDetails(); + + /** + * @throws com.github.dockerjava.api.exception.NotFoundException no such service + */ + @Override + > T exec(T resultCallback); + + interface Exec extends DockerCmdAsyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java new file mode 100644 index 000000000..813c40d50 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PauseContainerCmd.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Pause a container. + * + * @param containerId + * - Id of the container + * + */ +public interface PauseContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + PauseContainerCmd withContainerId(@Nonnull String containerId); + + /** + * @throws NotFoundException + * No such container + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PingCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PingCmd.java new file mode 100644 index 000000000..54b81b981 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PingCmd.java @@ -0,0 +1,12 @@ +package com.github.dockerjava.api.command; + +/** + * Ping the Docker server + * + */ +public interface PingCmd extends SyncDockerCmd { + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PruneCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PruneCmd.java new file mode 100644 index 000000000..89a082eaf --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PruneCmd.java @@ -0,0 +1,53 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.PruneResponse; +import com.github.dockerjava.api.model.PruneType; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.util.List; +import java.util.Map; + +/** + * Delete unused content (containers, images, volumes, networks, build relicts) + * + * @since {@link RemoteApiVersion#VERSION_1_25} + */ +public interface PruneCmd extends SyncDockerCmd { + + @Nonnull + PruneType getPruneType(); + + @Nonnull + String getApiPath(); + + @CheckForNull + Map> getFilters(); + + PruneCmd withPruneType(final PruneType pruneType); + /** + * Prune containers created before this timestamp + * Meaningful only for CONTAINERS and IMAGES prune type + * @param until Can be Unix timestamps, date formatted timestamps, + * or Go duration strings (e.g. 10m, 1h30m) computed relative to the daemon machine’s time. + */ + PruneCmd withUntilFilter(String until); + + /** + * When set to true, prune only unused and untagged images. When set to false, all unused images are pruned. + * Meaningful only for IMAGES prune type + */ + PruneCmd withDangling(Boolean dangling); + + /** + * Prune containers with the specified labels + */ + PruneCmd withLabelFilter(String... label); + + @Override + PruneResponse exec(); + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java new file mode 100644 index 000000000..d86bddfe3 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageCmd.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.PullResponseItem; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * + * Pull image from repository. + * + */ +public interface PullImageCmd extends AsyncDockerCmd { + + @CheckForNull + String getRepository(); + + @CheckForNull + String getTag(); + + @CheckForNull + String getPlatform(); + + @CheckForNull + String getRegistry(); + + @CheckForNull + AuthConfig getAuthConfig(); + + PullImageCmd withRepository(@Nonnull String repository); + + PullImageCmd withTag(String tag); + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_32} + */ + PullImageCmd withPlatform(String tag); + + PullImageCmd withRegistry(String registry); + + PullImageCmd withAuthConfig(AuthConfig authConfig); + + @Override + default ResultCallback.Adapter start() { + return exec(new PullImageResultCallback()); + } + + interface Exec extends DockerCmdAsyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java new file mode 100644 index 000000000..5980ce3df --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java @@ -0,0 +1,115 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.exception.DockerClientException; +import com.github.dockerjava.api.model.PullResponseItem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.CheckForNull; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author Marcus Linke + * + */ +public class PullImageResultCallback extends ResultCallback.Adapter { + + private static final Logger LOGGER = LoggerFactory.getLogger(PullImageResultCallback.class); + + private boolean isSwarm = false; + private Map results = null; + + @CheckForNull + private PullResponseItem latestItem = null; + + @Override + public void onNext(PullResponseItem item) { + // only do it once + if (results == null && latestItem == null) { + checkForDockerSwarmResponse(item); + } + + if (isSwarm) { + handleDockerSwarmResponse(item); + } else { + handleDockerClientResponse(item); + } + + LOGGER.debug("{}", item); + } + + private void checkForDockerSwarmResponse(PullResponseItem item) { + if (item.getStatus().matches("Pulling\\s.+\\.{3}$")) { + isSwarm = true; + LOGGER.debug("Communicating with Docker Swarm."); + } + } + + private void handleDockerSwarmResponse(final PullResponseItem item) { + if (results == null) { + results = new HashMap<>(); + } + + // Swarm terminates a pull sometimes with an empty line. + // Therefore keep first success message + PullResponseItem currentItem = results.get(item.getId()); + if (currentItem == null || !currentItem.isPullSuccessIndicated()) { + results.put(item.getId(), item); + } + } + + private void handleDockerClientResponse(PullResponseItem item) { + latestItem = item; + } + + private void checkDockerSwarmPullSuccessful() { + if (results.isEmpty()) { + throw new DockerClientException("Could not pull image through Docker Swarm"); + } else { + boolean pullFailed = false; + StringBuilder sb = new StringBuilder(); + + for (PullResponseItem pullResponseItem : results.values()) { + if (!pullResponseItem.isPullSuccessIndicated()) { + pullFailed = true; + sb.append("[" + pullResponseItem.getId() + ":" + messageFromPullResult(pullResponseItem) + "]"); + } + } + + if (pullFailed) { + throw new DockerClientException("Could not pull image: " + sb.toString()); + } + } + } + + private void checkDockerClientPullSuccessful() { + if (latestItem == null) { + return; + } + + if (!latestItem.isPullSuccessIndicated()) { + throw new DockerClientException("Could not pull image: " + messageFromPullResult(latestItem)); + } + } + + private String messageFromPullResult(PullResponseItem pullResponseItem) { + return (pullResponseItem.getError() != null) ? pullResponseItem.getError() : pullResponseItem.getStatus(); + } + + @Override + protected void throwFirstError() { + super.throwFirstError(); + + if (isSwarm) { + checkDockerSwarmPullSuccessful(); + } else { + checkDockerClientPullSuccessful(); + } + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java new file mode 100644 index 000000000..01f9d0567 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PushImageCmd.java @@ -0,0 +1,78 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.exception.DockerClientException; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.AuthConfig; +import com.github.dockerjava.api.model.PushResponseItem; + +/** + * Push the latest image to the repository. + * + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ +public interface PushImageCmd extends AsyncDockerCmd { + + @CheckForNull + AuthConfig getAuthConfig(); + + @CheckForNull + String getName(); + + @CheckForNull + String getTag(); + + /** + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ + PushImageCmd withName(@Nonnull String name); + + /** + * @param tag + * The image's tag. Not null. + */ + PushImageCmd withTag(String tag); + + PushImageCmd withAuthConfig(AuthConfig authConfig); + + /** + * @throws NotFoundException + * No such image + */ + @Override + > T exec(T resultCallback); + + @Override + default ResultCallback.Adapter start() { + return exec(new ResultCallback.Adapter() { + + @Nullable + private PushResponseItem latestItem = null; + + @Override + public void onNext(PushResponseItem item) { + this.latestItem = item; + } + + @Override + protected void throwFirstError() { + super.throwFirstError(); + + if (latestItem == null) { + throw new DockerClientException("Could not push image"); + } else if (latestItem.isErrorIndicated()) { + throw new DockerClientException("Could not push image: " + latestItem.getError()); + } + } + }); + } + + interface Exec extends DockerCmdAsyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveConfigCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveConfigCmd.java new file mode 100644 index 000000000..741fe32c0 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveConfigCmd.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Remove a config. + */ +public interface RemoveConfigCmd extends SyncDockerCmd { + + @CheckForNull + String getConfigId(); + + RemoveConfigCmd withConfigId(@Nonnull String secretId); + + /** + * @throws NotFoundException + * No such config + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java new file mode 100644 index 000000000..0a057af81 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveContainerCmd.java @@ -0,0 +1,43 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Remove a container. + * + * @param removeVolumes + * - true or false, Remove the volumes associated to the container. Defaults to false + * @param force + * - true or false, Removes the container even if it was running. Defaults to false + */ +public interface RemoveContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + @CheckForNull + Boolean hasRemoveVolumesEnabled(); + + @CheckForNull + Boolean hasForceEnabled(); + + RemoveContainerCmd withContainerId(@Nonnull String containerId); + + RemoveContainerCmd withRemoveVolumes(Boolean removeVolumes); + + RemoveContainerCmd withForce(Boolean force); + + /** + * @throws NotFoundException + * No such container + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java new file mode 100644 index 000000000..a1942b69b --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveImageCmd.java @@ -0,0 +1,47 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * + * Remove an image, deleting any tags it might have. + * + */ +public interface RemoveImageCmd extends SyncDockerCmd { + + @CheckForNull + String getImageId(); + + @CheckForNull + Boolean hasForceEnabled(); + + @CheckForNull + Boolean hasNoPruneEnabled(); + + RemoveImageCmd withImageId(@Nonnull String imageId); + + /** + * force parameter to force delete of an image, even if it's tagged in multiple repositories + */ + RemoveImageCmd withForce(Boolean force); + + /** + * noprune parameter to prevent the deletion of parent images + * + */ + RemoveImageCmd withNoPrune(Boolean noPrune); + + /** + * @throws NotFoundException + * No such image + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java new file mode 100644 index 000000000..1466fd3e4 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveNetworkCmd.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Remove a network. + * + * @since {@link RemoteApiVersion#VERSION_1_21} + */ +public interface RemoveNetworkCmd extends SyncDockerCmd { + + @CheckForNull + String getNetworkId(); + + RemoveNetworkCmd withNetworkId(@Nonnull String networkId); + + /** + * @throws NotFoundException + * No such network + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSecretCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSecretCmd.java new file mode 100644 index 000000000..28476da1d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSecretCmd.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Remove a secret. + */ +public interface RemoveSecretCmd extends SyncDockerCmd { + + @CheckForNull + String getSecretId(); + + RemoveSecretCmd withSecretId(@Nonnull String secretId); + + /** + * @throws NotFoundException + * No such secret + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveServiceCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveServiceCmd.java new file mode 100644 index 000000000..d8a58126a --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveServiceCmd.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Remove a service. + */ +public interface RemoveServiceCmd extends SyncDockerCmd { + + @CheckForNull + String getServiceId(); + + RemoveServiceCmd withServiceId(@Nonnull String serviceId); + + /** + * @throws NotFoundException + * No such service + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} 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 new file mode 100644 index 000000000..603c610b3 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveSwarmNodeCmd.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Remove a swarmNode. + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ +public interface RemoveSwarmNodeCmd extends SyncDockerCmd { + + @CheckForNull + String getSwarmNodeId(); + + @CheckForNull + Boolean hasForceEnabled(); + + RemoveSwarmNodeCmd withSwarmNodeId(@Nonnull String swarmNodeId); + + RemoveSwarmNodeCmd withForce(Boolean force); + + /** + * @throws NotFoundException No such swarmNode + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java new file mode 100644 index 000000000..c21ad240d --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RemoveVolumeCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Remove a volume. + * + * @author Marcus Linke + */ +public interface RemoveVolumeCmd extends SyncDockerCmd { + + String getName(); + + RemoveVolumeCmd withName(@Nonnull String name); + + /** + * @throws NotFoundException + * No such volume + * @throws ConflictException + * Volume is in use and cannot be removed + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RenameContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RenameContainerCmd.java new file mode 100644 index 000000000..a69ba2a3f --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RenameContainerCmd.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Rename a container. + * + * @since {@link RemoteApiVersion#VERSION_1_17} + */ +public interface RenameContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + RenameContainerCmd withContainerId(@Nonnull String containerId); + + @CheckForNull + String getName(); + + RenameContainerCmd withName(@Nonnull String name); + + /** + * @throws NotFoundException No such container + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java new file mode 100644 index 000000000..fef0087ed --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeContainerCmd.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +public interface ResizeContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + Integer getHeight(); + + Integer getWidth(); + + ResizeContainerCmd withContainerId(@Nonnull String execId); + + ResizeContainerCmd withSize(int height, int width); + + /** + * @throws NotFoundException no such container instance + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java new file mode 100644 index 000000000..5910705e0 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ResizeExecCmd.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +public interface ResizeExecCmd extends SyncDockerCmd { + @CheckForNull + String getExecId(); + + Integer getHeight(); + + Integer getWidth(); + + ResizeExecCmd withExecId(@Nonnull String execId); + + ResizeExecCmd withSize(int height, int width); + + /** + * @throws NotFoundException no such exec instance + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java new file mode 100644 index 000000000..372456813 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -0,0 +1,51 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Restart a running container. + * + * @param signal - Signal to send to the container as an integer or string (e.g. SIGINT). + * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. + */ +public interface RestartContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + @CheckForNull + Integer getTimeout(); + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_42} + */ + @CheckForNull + String getSignal(); + + RestartContainerCmd withContainerId(@Nonnull String containerId); + + /** + * @deprecated wrong name, use {@link #withTimeout(Integer)} + */ + @Deprecated + default RestartContainerCmd withtTimeout(Integer timeout) { + return withTimeout(timeout); + } + + RestartContainerCmd withTimeout(Integer timeout); + + RestartContainerCmd withSignal(String signal); + + /** + * @throws NotFoundException No such container + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RootFS.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RootFS.java new file mode 100644 index 000000000..c190852af --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RootFS.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; +import java.util.List; + +/** + * Part of {@link InspectImageResponse} + * + * @author Dmitry Tretyakov + */ +@EqualsAndHashCode +@ToString +public class RootFS extends DockerObject { + + @JsonProperty("Type") + private String type; + + @JsonProperty("Layers") + private List layers; + + /** + * @see #type + */ + @CheckForNull + public String getType() { + return type; + } + + /** + * @see #type + */ + public RootFS withType(String type) { + this.type = type; + return this; + } + + /** + * @see #layers + */ + @CheckForNull + public List getLayers() { + return layers; + } + + /** + * @see #layers + */ + public RootFS withLayers(List layers) { + this.layers = layers; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java new file mode 100644 index 000000000..aee9011cb --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImageCmd.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +public interface SaveImageCmd extends SyncDockerCmd { + + @CheckForNull + String getName(); + + @CheckForNull + String getTag(); + + /** + * @param name + * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. + */ + SaveImageCmd withName(@Nonnull String name); + + /** + * @param tag + * The image's tag. Not null. + */ + SaveImageCmd withTag(String tag); + + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException + * No such image + */ + InputStream exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImagesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImagesCmd.java new file mode 100644 index 000000000..1dd504434 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SaveImagesCmd.java @@ -0,0 +1,47 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.exception.NotFoundException; + +import javax.annotation.Nonnull; +import java.io.InputStream; +import java.util.List; + +/** Command for downloading multiple images at once. */ +public interface SaveImagesCmd extends SyncDockerCmd { + + /** Image name and tag. */ + interface TaggedImage { + + /** + * The (tagged) image name. + * @return "name:tag" if a tag was specified, otherwise "name" + */ + String asString(); + } + + /** + * Adds an image to the list of images to download. + * @param name image name (not null) + * @param tag tag + * @return this + */ + SaveImagesCmd withImage(@Nonnull String name, @Nonnull String tag); + + + /** + * Gets the images that were added by {@link #withImage(String, String)}. + * @return images to be downloaded + */ + List getImages(); + + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException no such image + */ + InputStream exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java new file mode 100644 index 000000000..8dc38ee3e --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SearchImagesCmd.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.api.command; + +import java.util.List; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.model.SearchItem; + +/** + * Search images + * + * @param term + * - search term + * + */ +public interface SearchImagesCmd extends SyncDockerCmd> { + + @CheckForNull + String getTerm(); + Integer getLimit(); + + SearchImagesCmd withTerm(@Nonnull String term); + SearchImagesCmd withLimit(@Nonnull Integer limit); + + interface Exec extends DockerCmdSyncExec> { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java new file mode 100644 index 000000000..e82f7f433 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StartContainerCmd.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.exception.NotModifiedException; + +/** + * Start a container. + * + */ +public interface StartContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + StartContainerCmd withContainerId(@Nonnull String containerId); + + /** + * @throws NotFoundException + * No such container + * @throws NotModifiedException + * Container already started + */ + @Override + Void exec() throws NotFoundException, NotModifiedException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/StatsCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StatsCmd.java new file mode 100644 index 000000000..c85ca2b2f --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StatsCmd.java @@ -0,0 +1,26 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.model.Statistics; + +/** + * Get container stats. The result of {@link Statistics} is handled asynchronously because the docker remote API will block when a container + * is stopped until the container is up again. + */ +public interface StatsCmd extends AsyncDockerCmd { + + @CheckForNull + String getContainerId(); + + StatsCmd withContainerId(@Nonnull String containerId); + + @CheckForNull + Boolean hasNoStream(); + + StatsCmd withNoStream(boolean noStream); + + interface Exec extends DockerCmdAsyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java new file mode 100644 index 000000000..3b39fec9c --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/StopContainerCmd.java @@ -0,0 +1,42 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.exception.NotModifiedException; + +/** + * Stop a running container. + * + * @param containerId + * - Id of the container + * @param timeout + * - Timeout in seconds before killing the container. Defaults to 10 seconds. + * + */ +public interface StopContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + @CheckForNull + Integer getTimeout(); + + StopContainerCmd withContainerId(@Nonnull String containerId); + + StopContainerCmd withTimeout(Integer timeout); + + /** + * @throws NotFoundException + * No such container + * @throws NotModifiedException + * Container already stopped + */ + @Override + Void exec() throws NotFoundException, NotModifiedException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java similarity index 81% rename from src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java index 0ac3cf819..2105f7b80 100644 --- a/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/SyncDockerCmd.java @@ -2,6 +2,6 @@ public interface SyncDockerCmd extends DockerCmd { - public RES_T exec(); + RES_T exec(); -} \ No newline at end of file +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java new file mode 100644 index 000000000..07c8cd335 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TagImageCmd.java @@ -0,0 +1,44 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Tag an image into a repository + * + * @param image + * The local image to tag (either a name or an id) + * @param repository + * The repository to tag in + * @param force + * (not documented) + * + */ +public interface TagImageCmd extends SyncDockerCmd { + + @CheckForNull + String getImageId(); + + @CheckForNull + String getRepository(); + + @CheckForNull + String getTag(); + + @CheckForNull + Boolean hasForceEnabled(); + + TagImageCmd withImageId(@Nonnull String imageId); + + TagImageCmd withRepository(String repository); + + TagImageCmd withTag(String tag); + + TagImageCmd withForce(); + + TagImageCmd withForce(Boolean force); + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java new file mode 100644 index 000000000..7cf2cee46 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerCmd.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * List processes running inside a container + */ +public interface TopContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + @CheckForNull + String getPsArgs(); + + TopContainerCmd withContainerId(@Nonnull String containerId); + + TopContainerCmd withPsArgs(String psArgs); + + /** + * @throws NotFoundException + * No such container + */ + @Override + TopContainerResponse exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java new file mode 100644 index 000000000..e604c20ae --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/TopContainerResponse.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.model.DockerObject; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * + * @author Marcus Linke + * + */ +@EqualsAndHashCode +@ToString +public class TopContainerResponse extends DockerObject { + + @JsonProperty("Titles") + private String[] titles; + + @JsonProperty("Processes") + private String[][] processes; + + public String[] getTitles() { + return titles; + } + + public String[][] getProcesses() { + return processes; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java new file mode 100644 index 000000000..28c2e7d36 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UnpauseContainerCmd.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Unpause a container. + * + * @param containerId + * - Id of the container + * + */ +public interface UnpauseContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + UnpauseContainerCmd withContainerId(@Nonnull String containerId); + + /** + * @throws NotFoundException + * No such container + */ + @Override + Void exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java new file mode 100644 index 000000000..d53bcdcdf --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java @@ -0,0 +1,157 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.BlkioRateDevice; +import com.github.dockerjava.api.model.BlkioWeightDevice; +import com.github.dockerjava.api.model.Device; +import com.github.dockerjava.api.model.DeviceRequest; +import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.Ulimit; +import com.github.dockerjava.api.model.UpdateContainerResponse; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.util.List; + +/** + * @author Kanstantsin Shautsou + * @since {@link RemoteApiVersion#VERSION_1_22} + */ +public interface UpdateContainerCmd extends SyncDockerCmd { + @CheckForNull + String getContainerId(); + + UpdateContainerCmd withContainerId(@Nonnull String containerId); + + @CheckForNull + Integer getBlkioWeight(); + + UpdateContainerCmd withBlkioWeight(Integer blkioWeight); + + @CheckForNull + List getBlkioWeightDevice(); + + UpdateContainerCmd withBlkioWeightDevice(List blkioWeightDevice); + + @CheckForNull + List getBlkioDeviceReadBps(); + + UpdateContainerCmd withBlkioDeviceReadBps(List blkioDeviceReadBps); + + @CheckForNull + List getBlkioDeviceWriteBps(); + + UpdateContainerCmd withBlkioDeviceWriteBps(List blkioDeviceWriteBps); + + @CheckForNull + List getBlkioDeviceReadIOps(); + + UpdateContainerCmd withBlkioDeviceReadIOps(List blkioDeviceReadIOps); + + @CheckForNull + List getBlkioDeviceWriteIOps(); + + UpdateContainerCmd withBlkioDeviceWriteIOps(List blkioDeviceWriteIOps); + + @CheckForNull + Long getCpuPeriod(); + + UpdateContainerCmd withCpuPeriod(Long cpuPeriod); + + @CheckForNull + Long getCpuQuota(); + + UpdateContainerCmd withCpuQuota(Long cpuQuota); + + @CheckForNull + String getCpusetCpus(); + + UpdateContainerCmd withCpusetCpus(String cpusetCpus); + + @CheckForNull + String getCpusetMems(); + + UpdateContainerCmd withCpusetMems(String cpusetMems); + + @CheckForNull + Integer getCpuShares(); + + UpdateContainerCmd withCpuShares(Integer cpuShares); + + @CheckForNull + Long getCpuRealtimePeriod(); + + UpdateContainerCmd withCpuRealtimePeriod(Long cpuRealtimePeriod); + + @CheckForNull + Long getCpuRealtimeRuntime(); + + UpdateContainerCmd withCpuRealtimeRuntime(Long cpuRealtimeRuntime); + + @CheckForNull + List getDevices(); + + UpdateContainerCmd withDevices(List devices); + + @CheckForNull + List getDeviceCgroupRules(); + + UpdateContainerCmd withDeviceCgroupRules(List deviceCgroupRules); + + @CheckForNull + List getDeviceRequests(); + + UpdateContainerCmd withDeviceRequests(List deviceRequests); + + @CheckForNull + Long getKernelMemory(); + + UpdateContainerCmd withKernelMemory(Long kernelMemory); + + @CheckForNull + Long getMemory(); + + UpdateContainerCmd withMemory(Long memory); + + @CheckForNull + Long getMemoryReservation(); + + UpdateContainerCmd withMemoryReservation(Long memoryReservation); + + @CheckForNull + Long getMemorySwap(); + + UpdateContainerCmd withMemorySwap(Long memorySwap); + + @CheckForNull + Long getNanoCPUs(); + + UpdateContainerCmd withNanoCPUs(Long nanoCPUs); + + @CheckForNull + Boolean getOomKillDisable(); + + UpdateContainerCmd withOomKillDisable(Boolean oomKillDisable); + + @CheckForNull + Boolean getInit(); + + UpdateContainerCmd withInit(Boolean init); + + @CheckForNull + Long getPidsLimit(); + + UpdateContainerCmd withPidsLimit(Long pidsLimit); + + @CheckForNull + List getUlimits(); + + UpdateContainerCmd withUlimits(List ulimits); + + @CheckForNull + RestartPolicy getRestartPolicy(); + + UpdateContainerCmd withRestartPolicy(RestartPolicy restartPolicy); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateServiceCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateServiceCmd.java new file mode 100644 index 000000000..da4b78387 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateServiceCmd.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.ServiceSpec; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * @since {@link RemoteApiVersion#VERSION_1_24} + */ +public interface UpdateServiceCmd extends SyncDockerCmd { + @CheckForNull + String getServiceId(); + + UpdateServiceCmd withServiceId(@Nonnull String serviceId); + + @CheckForNull + ServiceSpec getServiceSpec(); + + UpdateServiceCmd withServiceSpec(ServiceSpec serviceSpec); + + @CheckForNull + Long getVersion(); + + UpdateServiceCmd withVersion(Long version); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmCmd.java new file mode 100644 index 000000000..60b69aa4e --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmCmd.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.api.command; + + +import com.github.dockerjava.api.model.SwarmSpec; + +import javax.annotation.CheckForNull; + +public interface UpdateSwarmCmd extends SyncDockerCmd { + + @CheckForNull + Long getVersion(); + + UpdateSwarmCmd withVersion(Long version); + + @CheckForNull + Boolean getRotateWorkerToken(); + + UpdateSwarmCmd withRotateWorkerToken(Boolean rotateWorkerToken); + + @CheckForNull + Boolean getRotateManagerToken(); + + UpdateSwarmCmd withRotateManagerToken(Boolean rotateManagerToken); + + @CheckForNull + SwarmSpec getSwarmSpec(); + + UpdateSwarmCmd withSwarmSpec(SwarmSpec swarmSpec); + + @Override + Void exec(); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmNodeCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmNodeCmd.java new file mode 100644 index 000000000..f535d2b7f --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateSwarmNodeCmd.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.SwarmNodeSpec; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * Update swarmNode spec + * + * @since {@link RemoteApiVersion#VERSION_1_24} + */ +public interface UpdateSwarmNodeCmd extends SyncDockerCmd { + + @CheckForNull + String getSwarmNodeId(); + + UpdateSwarmNodeCmd withSwarmNodeId(@Nonnull String swarmNodeId); + + @CheckForNull + SwarmNodeSpec getSwarmNodeSpec(); + + UpdateSwarmNodeCmd withSwarmNodeSpec(SwarmNodeSpec swarmNodeSpec); + + UpdateSwarmNodeCmd withVersion(@Nonnull Long versionId); + + @CheckForNull + Long getVersion(); + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/VersionCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/VersionCmd.java new file mode 100644 index 000000000..1e45efb62 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/VersionCmd.java @@ -0,0 +1,13 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.Version; + +/** + * Returns the Docker version info. + */ +public interface VersionCmd extends SyncDockerCmd { + + 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 new file mode 100644 index 000000000..7b910cd69 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java @@ -0,0 +1,51 @@ +package com.github.dockerjava.api.command; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.WaitContainerCondition; +import com.github.dockerjava.api.model.WaitResponse; + +/** + * Wait a container + * + * Block until container stops, then returns its exit code + */ +public interface WaitContainerCmd extends AsyncDockerCmd { + + @CheckForNull + String getContainerId(); + + WaitContainerCmd withContainerId(@Nonnull String containerId); + + /** + * Defaults to {@link WaitContainerCondition#NOT_RUNNING} if omitted or empty. + * + * @since {@link RemoteApiVersion#VERSION_1_30} + */ + @Nullable + WaitContainerCondition getCondition(); + + /** + * @since {@link RemoteApiVersion#VERSION_1_30} + */ + WaitContainerCmd withCondition(@Nullable WaitContainerCondition condition); + + /** + * @throws NotFoundException container not found + */ + @Override + > T exec(T resultCallback); + + @Override + default WaitContainerResultCallback start() { + return exec(new WaitContainerResultCallback()); + } + + interface Exec extends DockerCmdAsyncExec { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java new file mode 100644 index 000000000..6cb160151 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java @@ -0,0 +1,74 @@ +/* + * Created on 21.07.2015 + */ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.async.ResultCallbackTemplate; +import com.github.dockerjava.api.exception.DockerClientException; +import com.github.dockerjava.api.model.WaitResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.CheckForNull; +import java.util.concurrent.TimeUnit; + +/** + * + * @author Marcus Linke + * + */ +public class WaitContainerResultCallback extends ResultCallbackTemplate { + + private static final Logger LOGGER = LoggerFactory.getLogger(WaitContainerResultCallback.class); + + @CheckForNull + private WaitResponse waitResponse = null; + + @Override + public void onNext(WaitResponse waitResponse) { + this.waitResponse = waitResponse; + LOGGER.debug("{}", waitResponse); + } + + /** + * Awaits the status code from the container. + * + * @throws DockerClientException + * if the wait operation fails. + */ + public Integer awaitStatusCode() { + try { + awaitCompletion(); + } catch (InterruptedException e) { + throw new DockerClientException("", e); + } + + return getStatusCode(); + } + + /** + * Awaits the status code from the container. + * + * @throws DockerClientException + * if the wait operation fails. + */ + public Integer awaitStatusCode(long timeout, TimeUnit timeUnit) { + try { + if (!awaitCompletion(timeout, timeUnit)) { + throw new DockerClientException("Awaiting status code timeout."); + } + } catch (InterruptedException e) { + throw new DockerClientException("Awaiting status code interrupted: ", e); + } + + return getStatusCode(); + } + + private Integer getStatusCode() { + if (waitResponse == null) { + throw new DockerClientException("Error while wait container"); + } else { + return waitResponse.getStatusCode(); + } + } +} diff --git a/src/main/java/com/github/dockerjava/api/BadRequestException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/BadRequestException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/BadRequestException.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/BadRequestException.java index 2696c5bc1..0934281a3 100644 --- a/src/main/java/com/github/dockerjava/api/BadRequestException.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/BadRequestException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/ConflictException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/ConflictException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/ConflictException.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/ConflictException.java index 6a84fdee3..da223a79e 100644 --- a/src/main/java/com/github/dockerjava/api/ConflictException.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/ConflictException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/DockerClientException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerClientException.java similarity index 88% rename from src/main/java/com/github/dockerjava/api/DockerClientException.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerClientException.java index 538698bb6..24139c0e1 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClientException.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerClientException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerException.java new file mode 100644 index 000000000..69baf047e --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/DockerException.java @@ -0,0 +1,28 @@ +package com.github.dockerjava.api.exception; + +/** + * + * @author Konstantin Pelykh (kpelykh@gmail.com) + * + */ + +public class DockerException extends RuntimeException { + + private static final long serialVersionUID = 7667768099261650608L; + + private int httpStatus = 0; + + public DockerException(String message, int httpStatus) { + super(String.format("Status %d: %s", httpStatus, message)); + this.httpStatus = httpStatus; + } + + public DockerException(String message, int httpStatus, Throwable cause) { + super(String.format("Status %d: %s", httpStatus, message), cause); + this.httpStatus = httpStatus; + } + + public int getHttpStatus() { + return httpStatus; + } +} diff --git a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java similarity index 91% rename from src/main/java/com/github/dockerjava/api/InternalServerErrorException.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java index cda5602ed..451a31bac 100644 --- a/src/main/java/com/github/dockerjava/api/InternalServerErrorException.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/InternalServerErrorException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/NotAcceptableException.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java index 78345a68b..45a2e97fc 100644 --- a/src/main/java/com/github/dockerjava/api/NotAcceptableException.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotAcceptableException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/NotFoundException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotFoundException.java similarity index 92% rename from src/main/java/com/github/dockerjava/api/NotFoundException.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotFoundException.java index 67e6f18bf..fb1d2369f 100644 --- a/src/main/java/com/github/dockerjava/api/NotFoundException.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotFoundException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * Indicates that the given entity does not exist. diff --git a/src/main/java/com/github/dockerjava/api/NotModifiedException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/NotModifiedException.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java index fa0aa459f..3e2820365 100644 --- a/src/main/java/com/github/dockerjava/api/NotModifiedException.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/NotModifiedException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java similarity index 90% rename from src/main/java/com/github/dockerjava/api/UnauthorizedException.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java index b097d6523..2dcf8764e 100644 --- a/src/main/java/com/github/dockerjava/api/UnauthorizedException.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/exception/UnauthorizedException.java @@ -1,4 +1,4 @@ -package com.github.dockerjava.api; +package com.github.dockerjava.api.exception; /** * diff --git a/src/main/java/com/github/dockerjava/api/model/AccessMode.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AccessMode.java similarity index 100% rename from src/main/java/com/github/dockerjava/api/model/AccessMode.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/AccessMode.java diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfig.java new file mode 100644 index 000000000..cbb108571 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfig.java @@ -0,0 +1,147 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; +import java.io.Serializable; + +@EqualsAndHashCode +@ToString(onlyExplicitlyIncluded = true) +public class AuthConfig extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * For backwards compatibility. Make sure you update the properties if you change this. + * + * @see "/docker.io.properties" + */ + public static final String DEFAULT_SERVER_ADDRESS = "https://index.docker.io/v1/"; + + @JsonProperty("username") + @ToString.Include + private String username; + + @JsonProperty("password") + private String password; + + @JsonProperty("email") + @ToString.Include + private String email; + + @JsonProperty("serveraddress") + @ToString.Include + private String registryAddress = DEFAULT_SERVER_ADDRESS; + + @JsonProperty("auth") + private String auth; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22} + */ + @JsonProperty("registrytoken") + private String registrytoken; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_23} + */ + @JsonProperty("identitytoken") + private String identitytoken; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_25} + */ + @JsonProperty("stackOrchestrator") + @ToString.Include + private String stackOrchestrator; + + public String getUsername() { + return username; + } + + public AuthConfig withUsername(String username) { + this.username = username; + return this; + } + + public String getPassword() { + return password; + } + + public AuthConfig withPassword(String password) { + this.password = password; + return this; + } + + public String getEmail() { + return email; + } + + public AuthConfig withEmail(String email) { + this.email = email; + return this; + } + + public String getRegistryAddress() { + return registryAddress; + } + + public AuthConfig withRegistryAddress(String registryAddress) { + this.registryAddress = registryAddress; + return this; + } + + public String getAuth() { + return auth; + } + + public AuthConfig withAuth(String auth) { + this.auth = auth; + return this; + } + + /** + * @see #identitytoken + */ + public String getIdentitytoken() { + return identitytoken; + } + /** + * @see #identitytoken + */ + public AuthConfig withIdentityToken(String identitytoken) { + this.identitytoken = identitytoken; + return this; + } + + /** + * @see #registrytoken + */ + @CheckForNull + public String getRegistrytoken() { + return registrytoken; + } + + /** + * @see #registrytoken + */ + public AuthConfig withRegistrytoken(String registrytoken) { + this.registrytoken = registrytoken; + return this; + } + + /** + * @see #stackOrchestrator + */ + public String getStackOrchestrator() { + return stackOrchestrator; + } + + /** + * @see #stackOrchestrator + */ + public void setStackOrchestrator(String stackOrchestrator) { + this.stackOrchestrator = stackOrchestrator; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java new file mode 100644 index 000000000..cbb7240f4 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthConfigurations.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.api.model; + +import java.io.Serializable; +import java.util.Map; +import java.util.TreeMap; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@EqualsAndHashCode +@ToString +public class AuthConfigurations extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + + @JsonProperty("configs") + private Map configs = new TreeMap<>(); + + public void addConfig(AuthConfig authConfig) { + configs.put(authConfig.getRegistryAddress(), authConfig); + } + + public Map getConfigs() { + return this.configs; + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthResponse.java new file mode 100644 index 000000000..0703cab68 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/AuthResponse.java @@ -0,0 +1,44 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.io.Serializable; + +@EqualsAndHashCode +@ToString(onlyExplicitlyIncluded = true) +public class AuthResponse extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * @since 1.23 + */ + @JsonProperty("Status") + @ToString.Include + private String status; + + /** + * @since 1.23 + */ + @JsonProperty("IdentityToken") + private String identityToken; + + /** + * @see #status + */ + @Nonnull + public String getStatus() { + return status; + } + + /** + * @see #identityToken + */ + @CheckForNull + public String getIdentityToken() { + return identityToken; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java new file mode 100644 index 000000000..ea7c22e69 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -0,0 +1,164 @@ +package com.github.dockerjava.api.model; + +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; + +/** + * Represents a host path being bind mounted as a {@link Volume} in a Docker container. + * The Bind can be in read only or read write access mode. + */ +@EqualsAndHashCode +@ToString +public class Bind extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + + private String path; + + private Volume volume; + + private AccessMode accessMode; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_23} + */ + private Boolean noCopy; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_17} + */ + private SELContext secMode; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_22} + */ + private PropagationMode propagationMode; + + public Bind(String path, Volume volume) { + this(path, volume, AccessMode.DEFAULT, SELContext.DEFAULT); + } + + public Bind(String path, Volume volume, Boolean noCopy) { + this(path, volume, AccessMode.DEFAULT, SELContext.DEFAULT, noCopy); + } + + public Bind(String path, Volume volume, AccessMode accessMode) { + this(path, volume, accessMode, SELContext.DEFAULT); + } + + public Bind(String path, Volume volume, AccessMode accessMode, SELContext secMode) { + this(path, volume, accessMode, secMode, null); + } + + public Bind(String path, Volume volume, AccessMode accessMode, SELContext secMode, Boolean noCopy) { + this(path, volume, accessMode, secMode, noCopy, PropagationMode.DEFAULT_MODE); + } + + public Bind(String path, Volume volume, AccessMode accessMode, SELContext secMode, Boolean noCopy, PropagationMode propagationMode) { + this.path = path; + this.volume = volume; + this.accessMode = accessMode; + this.secMode = secMode; + this.noCopy = noCopy; + this.propagationMode = propagationMode; + } + + public String getPath() { + return path; + } + + public Volume getVolume() { + return volume; + } + + public AccessMode getAccessMode() { + return accessMode; + } + + public SELContext getSecMode() { + return secMode; + } + + public Boolean getNoCopy() { + return noCopy; + } + + public PropagationMode getPropagationMode() { + return propagationMode; + } + + /** + * Parses a bind mount specification to a {@link Bind}. + * + * @param serialized + * the specification, e.g. /host:/container:ro + * @return a {@link Bind} matching the specification + * @throws IllegalArgumentException + * if the specification cannot be parsed + */ + public static Bind parse(String serialized) { + try { + // Split by ':' but not ':\' (Windows-style path) + String[] parts = serialized.split(":(?!\\\\)"); + switch (parts.length) { + case 2: { + return new Bind(parts[0], new Volume(parts[1])); + } + case 3: { + String[] flags = parts[2].split(","); + AccessMode accessMode = AccessMode.DEFAULT; + SELContext seMode = SELContext.DEFAULT; + Boolean nocopy = null; + PropagationMode propagationMode = PropagationMode.DEFAULT_MODE; + for (String p : flags) { + if (p.length() == 2) { + accessMode = AccessMode.valueOf(p.toLowerCase()); + } else if ("nocopy".equals(p)) { + nocopy = true; + } else if (PropagationMode.SHARED.toString().equals(p)) { + propagationMode = PropagationMode.SHARED; + } else if (PropagationMode.RSHARED.toString().equals(p)) { + propagationMode = PropagationMode.RSHARED; + } else if (PropagationMode.SLAVE.toString().equals(p)) { + propagationMode = PropagationMode.SLAVE; + } else if (PropagationMode.RSLAVE.toString().equals(p)) { + propagationMode = PropagationMode.RSLAVE; + } else if (PropagationMode.PRIVATE.toString().equals(p)) { + propagationMode = PropagationMode.PRIVATE; + } else if (PropagationMode.RPRIVATE.toString().equals(p)) { + propagationMode = PropagationMode.RPRIVATE; + } else { + seMode = SELContext.fromString(p); + } + } + + return new Bind(parts[0], new Volume(parts[1]), accessMode, seMode, nocopy, propagationMode); + } + default: { + throw new IllegalArgumentException(); + } + } + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing Bind '" + serialized + "'", e); + } + } + + /** + * Returns a string representation of this {@link Bind} suitable for inclusion in a JSON message. + * The format is <host path>:<container path>:<access mode>, + * like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link Bind} + */ + @Override + public String toString() { + return String.format("%s:%s:%s%s%s%s", + path, + volume.getPath(), + accessMode.toString(), + secMode != SELContext.none ? "," + secMode.toString() : "", + noCopy != null ? ",nocopy" : "", + propagationMode != PropagationMode.DEFAULT_MODE ? "," + propagationMode.toString() : ""); + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindOptions.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindOptions.java new file mode 100644 index 000000000..801e7719a --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindOptions.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; + +/** + * @since {@link RemoteApiVersion#VERSION_1_24} + */ +@EqualsAndHashCode +@ToString +public class BindOptions extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * @since 1.24 + */ + @JsonProperty("Propagation") + BindPropagation propagation; + + /** + * @see #propagation + */ + public BindPropagation getPropagation() { + return propagation; + } + + /** + * @see #propagation + */ + public BindOptions withPropagation(BindPropagation propagation) { + this.propagation = propagation; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindPropagation.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindPropagation.java new file mode 100644 index 000000000..81a189e77 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BindPropagation.java @@ -0,0 +1,26 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @since {@link RemoteApiVersion#VERSION_1_24} + */ +public enum BindPropagation { + @JsonProperty("rprivate") + R_PRIVATE, + + @JsonProperty("private") + PRIVATE, + + @JsonProperty("rshared") + R_SHARED, + + @JsonProperty("shared") + SHARED, + + @JsonProperty("rslave") + R_SLAVE, + + @JsonProperty("slave") + SLAVE +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java new file mode 100644 index 000000000..06aff4ecf --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Binds.java @@ -0,0 +1,34 @@ +package com.github.dockerjava.api.model; + +import java.io.Serializable; +import java.util.stream.Stream; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public class Binds implements Serializable { + private static final long serialVersionUID = 1L; + + private Bind[] binds; + + public Binds(Bind... binds) { + this.binds = binds; + } + + public Bind[] getBinds() { + return binds; + } + + @JsonValue + public String[] toPrimitive() { + return Stream.of(binds).map(Bind::toString).toArray(String[]::new); + } + + @JsonCreator + public static Binds fromPrimitive(String[] binds) { + return new Binds( + Stream.of(binds).map(Bind::parse).toArray(Bind[]::new) + ); + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java new file mode 100644 index 000000000..300bcbf24 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioRateDevice.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; + +@EqualsAndHashCode +@ToString +public class BlkioRateDevice extends DockerObject implements Serializable { + public static final long serialVersionUID = 1L; + + @JsonProperty("Path") + private String path; + + @JsonProperty("Rate") + private Long rate; + + public String getPath() { + return path; + } + + public BlkioRateDevice withPath(String path) { + this.path = path; + return this; + } + + public Long getRate() { + return rate; + } + + public BlkioRateDevice withRate(Long rate) { + this.rate = rate; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatEntry.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatEntry.java new file mode 100644 index 000000000..2fccabaa2 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatEntry.java @@ -0,0 +1,61 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; + +/** + * BlkioStat is not documented in pubic docker swapper.yaml yet, reference: + * https://github.com/moby/moby/blob/master/api/types/stats.go + */ +@EqualsAndHashCode +@ToString +public class BlkioStatEntry extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + @JsonProperty("major") + Long major; + @JsonProperty("minor") + Long minor; + @JsonProperty("op") + String op; + @JsonProperty("value") + Long value; + + public Long getMajor() { + return major; + } + + public BlkioStatEntry withMajor(Long major) { + this.major = major; + return this; + } + + public Long getMinor() { + return minor; + } + + public BlkioStatEntry withMinor(Long minor) { + this.minor = minor; + return this; + } + + public String getOp() { + return op; + } + + public BlkioStatEntry withOp(String op) { + this.op = op; + return this; + } + + public Long getValue() { + return value; + } + + public BlkioStatEntry withValue(Long value) { + this.value = value; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatsConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatsConfig.java new file mode 100644 index 000000000..5a7db4d8b --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioStatsConfig.java @@ -0,0 +1,108 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; +import java.io.Serializable; +import java.util.List; + +/** + * Used in {@link Statistics} + * + * @author Yuting Liu + */ +@EqualsAndHashCode +@ToString +public class BlkioStatsConfig extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + + @JsonProperty("io_service_bytes_recursive") + private List ioServiceBytesRecursive; + + @JsonProperty("io_serviced_recursive") + private List ioServicedRecursive; + + @JsonProperty("io_queue_recursive") + private List ioQueueRecursive; + + @JsonProperty("io_service_time_recursive") + private List ioServiceTimeRecursive; + + @JsonProperty("io_wait_time_recursive") + private List ioWaitTimeRecursive; + + @JsonProperty("io_merged_recursive") + private List ioMergedRecursive; + + @JsonProperty("io_time_recursive") + private List ioTimeRecursive; + + @JsonProperty("sectors_recursive") + private List sectorsRecursive; + + /** + * @see #ioServiceBytesRecursive + */ + @CheckForNull + public List getIoServiceBytesRecursive() { + return ioServiceBytesRecursive; + } + + /** + * @see #ioServicedRecursive + */ + @CheckForNull + public List getIoServicedRecursive() { + return ioServicedRecursive; + } + + /** + * @see #ioQueueRecursive + */ + @CheckForNull + public List getIoQueueRecursive() { + return ioQueueRecursive; + } + + /** + * @see #ioServiceTimeRecursive + */ + @CheckForNull + public List getIoServiceTimeRecursive() { + return ioServiceTimeRecursive; + } + + /** + * @see #ioWaitTimeRecursive + */ + @CheckForNull + public List getIoWaitTimeRecursive() { + return ioWaitTimeRecursive; + } + + /** + * @see #ioMergedRecursive + */ + @CheckForNull + public List getIoMergedRecursive() { + return ioMergedRecursive; + } + + /** + * @see #ioTimeRecursive + */ + @CheckForNull + public List getIoTimeRecursive() { + return ioTimeRecursive; + } + + /** + * @see #sectorsRecursive + */ + @CheckForNull + public List getSectorsRecursive() { + return sectorsRecursive; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java new file mode 100644 index 000000000..3fd9704d8 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BlkioWeightDevice.java @@ -0,0 +1,37 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; + +@EqualsAndHashCode +@ToString +public class BlkioWeightDevice extends DockerObject implements Serializable { + public static final long serialVersionUID = 1L; + + @JsonProperty("Path") + private String path; + + @JsonProperty("Weight") + private Integer weight; + + public String getPath() { + return path; + } + + public BlkioWeightDevice withPath(String path) { + this.path = path; + return this; + } + + public Integer getWeight() { + return weight; + } + + public BlkioWeightDevice withWeight(Integer weight) { + this.weight = weight; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java new file mode 100644 index 000000000..80356e55c --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/BuildResponseItem.java @@ -0,0 +1,42 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * Represents a build response stream item + */ +@EqualsAndHashCode +@ToString +public class BuildResponseItem extends ResponseItem { + private static final long serialVersionUID = -1252904184236343612L; + + private static final String BUILD_SUCCESS = "Successfully built"; + private static final String SHA256 = "sha256:"; + + /** + * Returns whether the stream field indicates a successful build operation + */ + @JsonIgnore + public boolean isBuildSuccessIndicated() { + if (isErrorIndicated() || getStream() == null) { + return false; + } + + return getStream().contains(BUILD_SUCCESS) || getStream().startsWith(SHA256); + } + + @JsonIgnore + public String getImageId() { + if (!isBuildSuccessIndicated()) { + return null; + } + + if (getStream().startsWith(SHA256)) { + return getStream().replaceFirst(SHA256, "").trim(); + } + + return getStream().replaceFirst(BUILD_SUCCESS, "").trim(); + } +} diff --git a/src/main/java/com/github/dockerjava/api/model/Capability.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java similarity index 78% rename from src/main/java/com/github/dockerjava/api/model/Capability.java rename to docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java index b17827553..57fb97c7b 100644 --- a/src/main/java/com/github/dockerjava/api/model/Capability.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java @@ -1,11 +1,11 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonCreator; + /** - * The Linux capabilities supported by Docker. The list of capabilities is defined in Docker's types.go, {@link #ALL} - * was added manually. - * - * @see http://man7.org/linux/man-pages/man7/capabilities.7.html + * The Linux capabilities supported by Docker. The list of capabilities is defined in Docker's types.go, {@link #ALL} was added manually. + * + * @see http://man7.org/linux/man-pages/man7/capabilities.7.html */ public enum Capability { /** @@ -20,6 +20,10 @@ public enum Capability { * */ AUDIT_CONTROL, + /** + * Allow reading the audit log via multicast netlink socket. + */ + AUDIT_READ, /** * Write records to kernel auditing log. */ @@ -28,13 +32,20 @@ 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)). */ CHOWN, /** - * Bypass file read, write, and execute permission checks. (DAC is an abbreviation of - * "discretionary access control".) + * Bypass file read, write, and execute permission checks. (DAC is an abbreviation of "discretionary access control".) */ DAC_OVERRIDE, /** @@ -43,9 +54,8 @@ public enum Capability { DAC_READ_SEARCH, /** *
    - *
  • Bypass permission checks on operations that normally require the file system UID of the process to match the - * UID of the file (e.g., chmod(2), utime(2)), excluding those operations covered by the {@link #DAC_OVERRIDE} and - * {@link #DAC_READ_SEARCH}. + *
  • Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file + * (e.g., chmod(2), utime(2)), excluding those operations covered by the {@link #DAC_OVERRIDE} and {@link #DAC_READ_SEARCH}. *
  • Set extended file attributes (see chattr(1)) on arbitrary files. *
  • Set Access Control Lists (ACLs) on arbitrary files. *
  • Ignore directory sticky bit on file deletion. @@ -56,8 +66,8 @@ public enum Capability { /** *
      *
    • Don't clear set-user-ID and set-group-ID permission bits when a file is modified. - *
    • Set the set-group-ID bit for a file whose GID does not match the file system or any of the supplementary GIDs - * of the calling process. + *
    • Set the set-group-ID bit for a file whose GID does not match the file system or any of the supplementary GIDs of the calling + * process. *
    */ FSETID, @@ -70,8 +80,7 @@ public enum Capability { */ IPC_OWNER, /** - * Bypass permission checks for sending signals (see kill(2)). This includes use of the ioctl(2) KDSIGACCEPT - * operation. + * Bypass permission checks for sending signals (see kill(2)). This includes use of the ioctl(2) KDSIGACCEPT operation. */ KILL, /** @@ -105,8 +114,8 @@ public enum Capability { *
  • Clear driver statistics. *
  • Set promiscuous mode. *
  • Enabling multicasting. - *
  • Use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside - * the range 0 to 6), SO_RCVBUFFORCE, and SO_SNDBUFFORCE. + *
  • Use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside the range 0 to 6), + * SO_RCVBUFFORCE, and SO_SNDBUFFORCE. *
*/ NET_ADMIN, @@ -125,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. */ @@ -139,9 +152,9 @@ public enum Capability { /** * If file capabilities are not supported: *
    - *
  • grant or remove any capability in the caller's permitted capability set to or from any other process. (This - * property of CAP_SETPCAP is not available when the kernel is configured to support file capabilities, since - * CAP_SETPCAP has entirely different semantics for such kernels.) + *
  • grant or remove any capability in the caller's permitted capability set to or from any other process. (This property of + * CAP_SETPCAP is not available when the kernel is configured to support file capabilities, since CAP_SETPCAP has entirely different + * semantics for such kernels.) *
*

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