diff --git a/src/main/java/com/amihaiemil/docker/DiskSpaceInfo.java b/src/main/java/com/amihaiemil/docker/DiskSpaceInfo.java new file mode 100644 index 00000000..10ea59f7 --- /dev/null +++ b/src/main/java/com/amihaiemil/docker/DiskSpaceInfo.java @@ -0,0 +1,34 @@ +package com.amihaiemil.docker; + +/** + * Info about Docker disk space usage in bytes. + * @author Boris Kuzmic (boris.kuzmic@gmail.com) + * @since 0.0.6 + */ +public interface DiskSpaceInfo { + + /** + * Images disk usage. + * @return Disk usage for images in bytes + */ + Long images(); + + /** + * Containers disk usage. + * @return Disk usage for containers in bytes + */ + Long containers(); + + /** + * Volumes disk usage. + * @return Disk usage for volumes in bytes + */ + Long volumes(); + + /** + * Total disk usage. + * @return Total disk usage in bytes + */ + Long totalSpace(); + +} diff --git a/src/main/java/com/amihaiemil/docker/Docker.java b/src/main/java/com/amihaiemil/docker/Docker.java index 0f88a6dc..b08bf887 100644 --- a/src/main/java/com/amihaiemil/docker/Docker.java +++ b/src/main/java/com/amihaiemil/docker/Docker.java @@ -82,6 +82,12 @@ public interface Docker { */ Swarm swarm(); + /** + * Entry point for the DockerSystem API. + * @return DockerSystem. + */ + DockerSystem system(); + /** * The underlying, immutable, Apache HttpClient.

* diff --git a/src/main/java/com/amihaiemil/docker/DockerSystem.java b/src/main/java/com/amihaiemil/docker/DockerSystem.java new file mode 100644 index 00000000..1b8e04b6 --- /dev/null +++ b/src/main/java/com/amihaiemil/docker/DockerSystem.java @@ -0,0 +1,23 @@ +package com.amihaiemil.docker; + +import java.io.IOException; + +/** + * Docker System API entry point. + * @author Boris Kuzmic (boris.kuzmic@gmail.com) + * @see Docker DockerSystem API + * @since 0.0.6 + */ +public interface DockerSystem { + + /** + * Show docker disk usage. + * @return The created {@link DiskSpaceInfo}. + * @throws IOException If an I/O error occurs. + * @throws UnexpectedResponseException If the API responds with an + * unexpected status. + */ + DiskSpaceInfo diskUsage() + throws IOException, UnexpectedResponseException; + +} diff --git a/src/main/java/com/amihaiemil/docker/RtDocker.java b/src/main/java/com/amihaiemil/docker/RtDocker.java index eeb40d72..0f030ed7 100644 --- a/src/main/java/com/amihaiemil/docker/RtDocker.java +++ b/src/main/java/com/amihaiemil/docker/RtDocker.java @@ -120,6 +120,15 @@ public final Swarm swarm() { ); } + @Override + public DockerSystem system() { + return new RtDockerSystem( + this.client, + URI.create(this.baseUri.toString().concat("/system")), + this + ); + } + @Override public HttpClient httpClient() { return this.client; diff --git a/src/main/java/com/amihaiemil/docker/RtDockerSystem.java b/src/main/java/com/amihaiemil/docker/RtDockerSystem.java new file mode 100644 index 00000000..d0f89959 --- /dev/null +++ b/src/main/java/com/amihaiemil/docker/RtDockerSystem.java @@ -0,0 +1,66 @@ +package com.amihaiemil.docker; + +import org.apache.http.HttpStatus; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; + +import java.io.IOException; +import java.net.URI; + +/** + * System API. + * + * @author Boris Kuzmic (boris.kuzmic@gmail.com) + * @since 0.0.6 + */ +public final class RtDockerSystem implements DockerSystem { + + /** + * Apache HttpClient which sends the requests. + */ + private final HttpClient client; + + /** + * Base URI. + */ + private final URI baseUri; + + /** + * Docker engine. + */ + private Docker docker; + + /** + * Ctor. + * + * @param client Given HTTP Client. + * @param baseUri Base URI, ending with /system. + * @param dkr The Docker engine. + */ + RtDockerSystem(final HttpClient client, final URI baseUri, + final Docker dkr) { + this.client = client; + this.baseUri = baseUri; + this.docker = dkr; + } + + @Override + public DiskSpaceInfo diskUsage() throws IOException, + UnexpectedResponseException { + final HttpGet init = new HttpGet(this.baseUri.toString() + "/df"); + try { + return new SystemDiskSpaceInfo(this.client.execute( + init, + new ReadJsonObject( + new MatchStatus( + init.getURI(), + HttpStatus.SC_OK + ) + ) + )); + } finally { + init.releaseConnection(); + } + } + +} diff --git a/src/main/java/com/amihaiemil/docker/SystemDiskSpaceInfo.java b/src/main/java/com/amihaiemil/docker/SystemDiskSpaceInfo.java new file mode 100644 index 00000000..8496dcf8 --- /dev/null +++ b/src/main/java/com/amihaiemil/docker/SystemDiskSpaceInfo.java @@ -0,0 +1,60 @@ +package com.amihaiemil.docker; + +import javax.json.JsonArray; +import javax.json.JsonObject; + +/** + * Docker disk space usage information. + * @author Boris Kuzmic (boris.kuzmic@gmail.com) + * @since 0.0.6 + */ +public final class SystemDiskSpaceInfo implements DiskSpaceInfo { + + /** + * Response Json object from system/df call. + */ + private final JsonObject json; + + /** + * Ctor. + * @param jsonObject Response Json from system/df call + */ + SystemDiskSpaceInfo(final JsonObject jsonObject) { + this.json = jsonObject; + } + + @Override + public Long images() { + return this.json.getJsonNumber("LayersSize").longValue(); + } + + @Override + public Long containers() { + Long totalContainersSpace = 0L; + JsonArray containers = this.json.getJsonArray("Containers"); + for (int i=0; i