From f592918fd86192a13b0efef9fee8914545bce826 Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Fri, 12 Dec 2014 13:47:44 +0100 Subject: [PATCH 1/2] Test for StartContainerCmd.withVolumesFrom() --- .../dockerjava/api/model/VolumeBind.java | 5 +++ .../client/AbstractDockerClientTest.java | 26 +++++++++++ .../command/StartContainerCmdImplTest.java | 43 ++++++++++++++++--- 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java index d662f2b8f..41028b6dc 100644 --- a/src/main/java/com/github/dockerjava/api/model/VolumeBind.java +++ b/src/main/java/com/github/dockerjava/api/model/VolumeBind.java @@ -16,4 +16,9 @@ public String getContainerPath() { public String getHostPath() { return hostPath; } + + @Override + public String toString() { + return hostPath + ":" + containerPath; + } } diff --git a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java index 4418a8d5f..3ed64d9a7 100644 --- a/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java +++ b/src/test/java/com/github/dockerjava/client/AbstractDockerClientTest.java @@ -1,10 +1,18 @@ package com.github.dockerjava.client; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; + import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.VolumeBind; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.TestDockerCmdExecFactory; +import com.google.common.base.Joiner; + import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; import org.slf4j.Logger; @@ -18,6 +26,8 @@ import java.lang.reflect.Method; import java.net.DatagramSocket; import java.net.ServerSocket; +import java.util.ArrayList; +import java.util.List; public abstract class AbstractDockerClientTest extends Assert { @@ -158,4 +168,20 @@ public static boolean available(int port) { return false; } + /** + * Asserts that {@link InspectContainerResponse#getVolumes()} (.Volumes) + * has {@link VolumeBind}s for the given {@link Volume}s + */ + public static void assertContainerHasVolumes(InspectContainerResponse inspectContainerResponse, + Volume ... expectedVolumes) { + VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); + LOG.info("Inspect .Volumes = [{}]", Joiner.on(", ").join(volumeBinds)); + + List volumes = new ArrayList(); + for (VolumeBind bind : volumeBinds) { + volumes.add(new Volume(bind.getContainerPath())); + } + assertThat(volumes, contains(expectedVolumes)); + } + } diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index 486f03b31..de744b59a 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -84,18 +84,49 @@ public void startContainerWithVolumes() throws DockerException { inspectContainerResponse = dockerClient.inspectContainerCmd(container .getId()).exec(); - VolumeBind[] volumeBinds = inspectContainerResponse.getVolumes(); - List volumes = new ArrayList(); - for(VolumeBind bind :volumeBinds){ - volumes.add(bind.getContainerPath()); - } - assertThat(volumes, contains(volume1.getPath(), volume2.getPath())); + assertContainerHasVolumes(inspectContainerResponse, volume1, volume2); assertThat(Arrays.asList(inspectContainerResponse.getVolumesRW()), contains(volume1, volume2)); } + @Test + public void startContainerWithVolumesFrom() throws DockerException { + + Volume volume1 = new Volume("/opt/webapp1"); + Volume volume2 = new Volume("/opt/webapp2"); + + String container1Name = UUID.randomUUID().toString(); + + CreateContainerResponse container1 = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999") + .withName(container1Name).exec(); + LOG.info("Created container1 {}", container1.toString()); + + dockerClient.startContainerCmd(container1.getId()).withBinds( + new Bind("/src/webapp1", volume1), new Bind("/src/webapp2", volume2)).exec(); + LOG.info("Started container1 {}", container1.toString()); + + InspectContainerResponse inspectContainerResponse1 = dockerClient.inspectContainerCmd( + container1.getId()).exec(); + + assertContainerHasVolumes(inspectContainerResponse1, volume1, volume2); + + + CreateContainerResponse container2 = dockerClient + .createContainerCmd("busybox").withCmd("sleep", "9999").exec(); + LOG.info("Created container2 {}", container2.toString()); + + dockerClient.startContainerCmd(container2.getId()).withVolumesFrom(container1Name).exec(); + LOG.info("Started container2 {}", container2.toString()); + + InspectContainerResponse inspectContainerResponse2 = dockerClient + .inspectContainerCmd(container2.getId()).exec(); + + assertContainerHasVolumes(inspectContainerResponse2, volume1, volume2); + } + @Test public void startContainerWithDns() throws DockerException { From 91a36fedecf13e20d46bdfdd747a10322d8f4005 Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Wed, 17 Dec 2014 17:36:27 +0100 Subject: [PATCH 2/2] Fix CreateContainerCmdImpl.withVolumesFrom() Another method that did not work until Docker Remote API 1.15, see CreateContainerCmd.withDns(). To fix it, the parameter had to be moved to nested HostConfig. --- .../core/command/CreateContainerCmdImpl.java | 5 +- .../command/CreateContainerCmdImplTest.java | 52 +++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index 8a6509bc6..8a4607c26 100644 --- a/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -41,7 +41,6 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd