From 08f238542b59d421e8203b2695850fc32eb23ff2 Mon Sep 17 00:00:00 2001 From: Boris Kuzmic Date: Fri, 7 Dec 2018 09:11:39 +0100 Subject: [PATCH 1/3] For #206. Adding prune method to Volumes --- .../java/com/amihaiemil/docker/RtVolumes.java | 18 ++++ .../java/com/amihaiemil/docker/Volumes.java | 11 ++- .../amihaiemil/docker/RtVolumesTestCase.java | 90 +++++++++++++++++++ 3 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java diff --git a/src/main/java/com/amihaiemil/docker/RtVolumes.java b/src/main/java/com/amihaiemil/docker/RtVolumes.java index de4362ad..fe2a7926 100644 --- a/src/main/java/com/amihaiemil/docker/RtVolumes.java +++ b/src/main/java/com/amihaiemil/docker/RtVolumes.java @@ -25,8 +25,11 @@ */ package com.amihaiemil.docker; +import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import java.io.IOException; import java.net.URI; /** @@ -63,6 +66,21 @@ abstract class RtVolumes implements Volumes { this.docker = dkr; } + @Override + public void prune() throws IOException, UnexpectedResponseException { + final HttpPost prune = new HttpPost( + this.baseUri.toString().concat("/prune") + ); + try { + this.client.execute( + prune, + new MatchStatus(prune.getURI(), HttpStatus.SC_OK) + ); + } finally { + prune.releaseConnection(); + } + } + @Override public Docker docker() { return this.docker; diff --git a/src/main/java/com/amihaiemil/docker/Volumes.java b/src/main/java/com/amihaiemil/docker/Volumes.java index 84f589b1..f47a58f8 100644 --- a/src/main/java/com/amihaiemil/docker/Volumes.java +++ b/src/main/java/com/amihaiemil/docker/Volumes.java @@ -25,16 +25,25 @@ */ package com.amihaiemil.docker; +import java.io.IOException; + /** * Volumes API. * @author Mihai Andronache (amihaiemil@gmail.com) * @author Boris Kuzmic (boris.kuzmic@gmail.com) * @version $Id$ * @since 0.0.1 - * @todo #180:30min Continue implementing prune volumes operation. */ public interface Volumes extends Iterable { + /** + * Deletes unused volumes. + * @throws IOException If an I/O error occurs. + * @throws UnexpectedResponseException If the API responds with an + * unexpected status. + */ + void prune() throws IOException, UnexpectedResponseException; + /** * Return the Docker engine where these Images came from. * @return Docker. diff --git a/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java b/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java new file mode 100644 index 00000000..d4254840 --- /dev/null +++ b/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java @@ -0,0 +1,90 @@ +package com.amihaiemil.docker; + +import com.amihaiemil.docker.mock.AssertRequest; +import com.amihaiemil.docker.mock.Condition; +import com.amihaiemil.docker.mock.Response; +import org.apache.http.HttpStatus; +import org.hamcrest.MatcherAssert; +import org.hamcrest.core.IsEqual; +import org.junit.Test; +import org.mockito.Mockito; + +import javax.json.Json; +import java.net.URI; + + +/** + * Unit tests for {@link RtVolumes}. + * @author Boris Kuzmic (boris.kuzmic@gmail.com) + * @since 0.0.7 + * @checkstyle MethodName (500 lines) + */ +public final class RtVolumesTestCase { + + /** + * Mock docker. + */ + private static final Docker DOCKER = Mockito.mock(Docker.class); + + /** + * RtVolumes.prune() sends correct request and exist successfully on + * response code 200. + * @throws Exception If an error occurs. + */ + @Test + public void prunesOk() throws Exception { + new ListedImages( + new AssertRequest( + new Response(HttpStatus.SC_OK), + new Condition( + "prune() must send a POST request", + req -> "POST".equals(req.getRequestLine().getMethod()) + ), + new Condition( + "prune() resource URL must be '/volumes/prune'", + req -> req.getRequestLine() + .getUri().endsWith("/volumes/prune") + ) + ), + URI.create("http://localhost/volumes"), + DOCKER + ).prune(); + } + + /** + * RtVolumes.prune() must throw UnexpectedResponseException if service + * responds with 500. + * @throws Exception The UnexpectedResponseException. + */ + @Test(expected = UnexpectedResponseException.class) + public void pruneThrowsErrorOnResponse500() throws Exception { + new ListedImages( + new AssertRequest( + new Response(HttpStatus.SC_INTERNAL_SERVER_ERROR) + ), + URI.create("http://localhost/volumes"), + DOCKER + ).prune(); + } + + /** + * RtVolumes can return its Docker parent. + */ + @Test + public void returnsDocker() { + MatcherAssert.assertThat( + new ListedImages( + new AssertRequest( + new Response( + HttpStatus.SC_OK, + Json.createArrayBuilder().build().toString() + ) + ), + URI.create("http://localhost"), + DOCKER + ).docker(), + new IsEqual<>(DOCKER) + ); + } + +} From 7cd9267b2c3b16eda28aeb38fa6cd0d80de0f45d Mon Sep 17 00:00:00 2001 From: Boris Kuzmic Date: Sat, 8 Dec 2018 14:03:54 +0100 Subject: [PATCH 2/3] Sorting imports alphabetically --- src/main/java/com/amihaiemil/docker/RtVolumes.java | 5 ++--- src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/amihaiemil/docker/RtVolumes.java b/src/main/java/com/amihaiemil/docker/RtVolumes.java index fe2a7926..435dc1e0 100644 --- a/src/main/java/com/amihaiemil/docker/RtVolumes.java +++ b/src/main/java/com/amihaiemil/docker/RtVolumes.java @@ -25,13 +25,12 @@ */ package com.amihaiemil.docker; +import java.io.IOException; +import java.net.URI; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; -import java.io.IOException; -import java.net.URI; - /** * Runtime {@link Volumes}. * @author Marco Teixeira (marcoo.teixeira@gmail.com) diff --git a/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java b/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java index d4254840..117dd359 100644 --- a/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java +++ b/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java @@ -3,15 +3,14 @@ import com.amihaiemil.docker.mock.AssertRequest; import com.amihaiemil.docker.mock.Condition; import com.amihaiemil.docker.mock.Response; +import java.net.URI; +import javax.json.Json; import org.apache.http.HttpStatus; import org.hamcrest.MatcherAssert; import org.hamcrest.core.IsEqual; import org.junit.Test; import org.mockito.Mockito; -import javax.json.Json; -import java.net.URI; - /** * Unit tests for {@link RtVolumes}. From 0b95a4fe4dd2fa9c51edaf515d11d9848b181e35 Mon Sep 17 00:00:00 2001 From: Boris Kuzmic Date: Sat, 8 Dec 2018 14:18:28 +0100 Subject: [PATCH 3/3] Fixing call ListedVolumes instead of ListedImages --- src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java b/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java index 117dd359..545f483c 100644 --- a/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java +++ b/src/test/java/com/amihaiemil/docker/RtVolumesTestCase.java @@ -32,7 +32,7 @@ public final class RtVolumesTestCase { */ @Test public void prunesOk() throws Exception { - new ListedImages( + new ListedVolumes( new AssertRequest( new Response(HttpStatus.SC_OK), new Condition( @@ -57,7 +57,7 @@ public void prunesOk() throws Exception { */ @Test(expected = UnexpectedResponseException.class) public void pruneThrowsErrorOnResponse500() throws Exception { - new ListedImages( + new ListedVolumes( new AssertRequest( new Response(HttpStatus.SC_INTERNAL_SERVER_ERROR) ), @@ -72,7 +72,7 @@ public void pruneThrowsErrorOnResponse500() throws Exception { @Test public void returnsDocker() { MatcherAssert.assertThat( - new ListedImages( + new ListedVolumes( new AssertRequest( new Response( HttpStatus.SC_OK,