Skip to content

(#127) Image.run() #140

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/main/java/com/amihaiemil/docker/Image.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,13 @@ public interface Image extends JsonObject {
void tag(
String repo, String name
) throws IOException, UnexpectedResponseException;

/**
* Run this image.
* @return The container for the running image.
* @throws IOException If something goes wrong.
* @throws UnexpectedResponseException If the status response is not
* the expected one.
*/
Container run() throws IOException, UnexpectedResponseException;
}
2 changes: 1 addition & 1 deletion src/main/java/com/amihaiemil/docker/RtDocker.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public final Containers containers() {
@Override
public final Images images() {
return new RtImages(
this.client, URI.create(this.baseUri.toString() + "/images")
this.client, URI.create(this.baseUri.toString() + "/images"), this
);
}

Expand Down
27 changes: 25 additions & 2 deletions src/main/java/com/amihaiemil/docker/RtImage.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,27 @@ final class RtImage extends JsonResource implements Image {
*/
private final URI baseUri;

/**
* Docker API.
*/
private final Docker docker;

/**
* Ctor.
* @param rep JsonObject representation of this Image.
* @param client The http client.
* @param uri The URI for this image.
* @param dkr The docker entry point.
* @checkstyle ParameterNumber (5 lines)
*/
RtImage(final JsonObject rep, final HttpClient client, final URI uri) {
RtImage(
final JsonObject rep, final HttpClient client,
final URI uri, final Docker dkr
) {
super(rep);
this.client = client;
this.baseUri = uri;
this.docker = dkr;
}

@Override
Expand All @@ -77,7 +88,8 @@ public Iterable<Image> history() {
json -> new RtImage(
json,
this.client,
this.baseUri
this.baseUri,
this.docker
)
);
}
Expand Down Expand Up @@ -115,4 +127,15 @@ public void tag(
tag.releaseConnection();
}
}

@Override
public Container run() throws IOException, UnexpectedResponseException {
final Container container = this.docker.containers().create(
this.baseUri.getPath().substring(
this.baseUri.getPath().lastIndexOf('/') + 1
)
);
container.start();
return container;
}
}
15 changes: 12 additions & 3 deletions src/main/java/com/amihaiemil/docker/RtImages.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,21 @@ final class RtImages implements Images {
*/
private final URI baseUri;

/**
* Docker API.
*/
private final Docker docker;

/**
* Ctor.
* @param client The http client.
* @param uri The URI for this Images API.
* @param dkr The docker entry point.
*/
RtImages(final HttpClient client, final URI uri) {
RtImages(final HttpClient client, final URI uri, final Docker dkr) {
this.client = client;
this.baseUri = uri;
this.docker = dkr;
}

@Override
Expand All @@ -83,7 +90,8 @@ public Image pull(
this.client,
URI.create(
this.baseUri.toString() + "/" + name
)
),
this.docker
);
} finally {
create.releaseConnection();
Expand Down Expand Up @@ -125,7 +133,8 @@ public Iterator<Image> iterator() {
this.client,
URI.create(
this.baseUri.toString() + "/" + json.getString("Id")
)
),
this.docker
)
);
}
Expand Down
74 changes: 63 additions & 11 deletions src/test/java/com/amihaiemil/docker/RtImageTestCase.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,15 @@
import com.amihaiemil.docker.mock.Condition;
import com.amihaiemil.docker.mock.Response;
import java.net.URI;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.json.Json;
import javax.json.JsonObject;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.Test;
import org.mockito.Mockito;

/**
* Unit tests for RtImage.
Expand All @@ -44,6 +47,10 @@
* @checkstyle MethodName (500 lines)
*/
public final class RtImageTestCase {
/**
* Mock docker.
*/
private static final Docker DOCKER = Mockito.mock(Docker.class);

/**
* RtImage can return info about itself.
Expand Down Expand Up @@ -72,7 +79,8 @@ public void inspectsItself() throws Exception {
req -> req.getRequestLine().getUri().endsWith("/456/json")
)
),
URI.create("http://localhost:80/1.30/images/456")
URI.create("http://localhost:80/1.30/images/456"),
DOCKER
);
final JsonObject info = image.inspect();
MatcherAssert.assertThat(info.keySet(), Matchers.hasSize(4));
Expand Down Expand Up @@ -105,7 +113,8 @@ public void returnsHistory() {
Json.createArrayBuilder().build().toString()
)
),
URI.create("http://localhost:80/1.30/images/456")
URI.create("http://localhost:80/1.30/images/456"),
DOCKER
).history(),
Matchers.allOf(
Matchers.notNullValue(),
Expand Down Expand Up @@ -135,7 +144,8 @@ public void deleteSendsCorrectRequest() throws Exception {
)
)
),
URI.create("http://localhost/images/test")
URI.create("http://localhost/images/test"),
DOCKER
).delete();
}

Expand All @@ -151,7 +161,8 @@ public void deleteErrorOn404() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_NOT_FOUND)
),
URI.create("http://localhost/images/test")
URI.create("http://localhost/images/test"),
DOCKER
).delete();
}

Expand All @@ -167,7 +178,8 @@ public void deleteErrorOn409() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_CONFLICT)
),
URI.create("http://localhost/images/test")
URI.create("http://localhost/images/test"),
DOCKER
).delete();
}

Expand All @@ -183,7 +195,8 @@ public void deleteErrorOn500() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_INTERNAL_SERVER_ERROR)
),
URI.create("http://localhost/images/test")
URI.create("http://localhost/images/test"),
DOCKER
).delete();
}

Expand All @@ -210,7 +223,8 @@ public void tagsOk() throws Exception {
)
)
),
URI.create("http://localhost/images/123")
URI.create("http://localhost/images/123"),
DOCKER
).tag("myrepo/myimage", "mytag");
}

Expand All @@ -226,7 +240,8 @@ public void tagErrorIfResponseIs400() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_BAD_REQUEST)
),
URI.create("https://localhost")
URI.create("https://localhost"),
DOCKER
).tag("myrepo/myimage", "mytag");
}

Expand All @@ -242,7 +257,8 @@ public void tagErrorIfResponseIs404() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_NOT_FOUND)
),
URI.create("https://localhost")
URI.create("https://localhost"),
DOCKER
).tag("myrepo/myimage", "mytag");
}

Expand All @@ -258,7 +274,8 @@ public void tagErrorIfResponseIs409() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_CONFLICT)
),
URI.create("https://localhost")
URI.create("https://localhost"),
DOCKER
).tag("myrepo/myimage", "mytag");
}

Expand All @@ -274,7 +291,42 @@ public void tagErrorIfResponseIs500() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_INTERNAL_SERVER_ERROR)
),
URI.create("https://localhost")
URI.create("https://localhost"),
DOCKER
).tag("myrepo/myimage", "mytag");
}

/**
* RtImage can run itself.
* @throws Exception If something goes wrong.
*/
@Test
public void runsItselfOk() throws Exception {
final AtomicBoolean started = new AtomicBoolean(false);
final Container container = Mockito.mock(Container.class);
Mockito.doAnswer(
invocation -> {
started.set(true);
return null;
}
).when(container).start();
final Containers containers = Mockito.mock(Containers.class);
Mockito.doReturn(container)
.when(containers)
.create(Mockito.eq("image123"));
Mockito.doReturn(containers).when(DOCKER).containers();
MatcherAssert.assertThat(
new RtImage(
Mockito.mock(JsonObject.class),
Mockito.mock(HttpClient.class),
URI.create("http://localhost/images/image123"),
DOCKER
).run(),
Matchers.is(container)
);
MatcherAssert.assertThat(
started.get(),
Matchers.is(true)
);
}
}
32 changes: 24 additions & 8 deletions src/test/java/com/amihaiemil/docker/RtImagesTestCase.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.Test;
import org.mockito.Mockito;

/**
* Unit tests for {@link RtImages}.
Expand All @@ -44,6 +45,11 @@
* @checkstyle MethodName (500 lines)
*/
public final class RtImagesTestCase {
/**
* Mock docker.
*/
private static final Docker DOCKER = Mockito.mock(Docker.class);

/**
* Must return the same number of images as there are elements in the
* json array returned by the service.
Expand All @@ -64,7 +70,9 @@ public void iteratesImages() {
.add("Id", "sha256:3e314f95dcace0f5e")
).build().toString()
)
), URI.create("http://localhost")
),
URI.create("http://localhost"),
DOCKER
).forEach(image -> count.incrementAndGet());
MatcherAssert.assertThat(
count.get(),
Expand All @@ -85,7 +93,9 @@ public void iteratesZeroImages() throws Exception {
HttpStatus.SC_OK,
Json.createArrayBuilder().build().toString()
)
), URI.create("http://localhost")
),
URI.create("http://localhost"),
DOCKER
).forEach(image -> count.incrementAndGet());
MatcherAssert.assertThat(
count.get(),
Expand All @@ -103,7 +113,8 @@ public void iterateFailsIfResponseIs500() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_INTERNAL_SERVER_ERROR)
),
URI.create("http://localhost")
URI.create("http://localhost"),
DOCKER
).iterator();
}

Expand Down Expand Up @@ -131,7 +142,8 @@ public void createSetsGivenParameters() throws Exception {
}
)
),
URI.create("http://localhost")
URI.create("http://localhost"),
DOCKER
).pull("testImage", "1.23");
}

Expand All @@ -146,7 +158,8 @@ public void createErrorOnStatus404() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_NOT_FOUND)
),
URI.create("http://localhost")
URI.create("http://localhost"),
DOCKER
).pull("", "");
}

Expand All @@ -161,7 +174,8 @@ public void createErrorOnStatus500() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_INTERNAL_SERVER_ERROR)
),
URI.create("http://localhost")
URI.create("http://localhost"),
DOCKER
).pull("", "");
}

Expand All @@ -185,7 +199,8 @@ public void prunesOk() throws Exception {
.getUri().endsWith("/images/prune")
)
),
URI.create("http://localhost/images")
URI.create("http://localhost/images"),
DOCKER
).prune();
}

Expand All @@ -200,7 +215,8 @@ public void pruneThrowsErrorOnResponse500() throws Exception {
new AssertRequest(
new Response(HttpStatus.SC_INTERNAL_SERVER_ERROR)
),
URI.create("http://localhost/images")
URI.create("http://localhost/images"),
DOCKER
).prune();
}
}