You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by tu...@apache.org on 2014/03/30 20:04:17 UTC

[2/7] add docker client

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/docker-java/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java
----------------------------------------------------------------------
diff --git a/docker-java/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java b/docker-java/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java
new file mode 100644
index 0000000..46c2d57
--- /dev/null
+++ b/docker-java/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java
@@ -0,0 +1,791 @@
+package com.kpelykh.docker.client.test;
+
+import com.kpelykh.docker.client.DockerClient;
+import com.kpelykh.docker.client.DockerException;
+import com.kpelykh.docker.client.model.*;
+
+import com.sun.jersey.api.client.ClientResponse;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.LineIterator;
+import org.apache.commons.lang.StringUtils;
+import org.hamcrest.Matcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.ITestResult;
+import org.testng.annotations.*;
+
+import java.io.*;
+import java.lang.reflect.Method;
+import java.net.DatagramSocket;
+import java.net.ServerSocket;
+import java.util.ArrayList;
+import java.util.List;
+
+import static ch.lambdaj.Lambda.filter;
+import static ch.lambdaj.Lambda.selectUnique;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.hasItem;
+import static org.testinfected.hamcrest.jpa.HasFieldWithValue.hasField;
+
+/**
+ * Unit test for DockerClient.
+ * @author Konstantin Pelykh (kpelykh@gmail.com)
+ */
+public class DockerClientTest extends Assert
+{
+    public static final Logger LOG = LoggerFactory.getLogger(DockerClientTest.class);
+
+    private DockerClient dockerClient;
+
+    private List<String> tmpImgs = new ArrayList<String>();
+    private List<String> tmpContainers = new ArrayList<String>();
+
+    @BeforeTest
+    public void beforeTest() throws DockerException {
+        LOG.info("======================= BEFORETEST =======================");
+        String url = System.getProperty("docker.url", "http://192.168.1.188:5555");
+        LOG.info("Connecting to Docker server at " + url);
+        dockerClient = new DockerClient(url);
+        
+        LOG.info("Creating image 'busybox'");
+        dockerClient.pull("busybox");
+
+        assertNotNull(dockerClient);
+        LOG.info("======================= END OF BEFORETEST =======================\n\n");
+    }
+
+    @AfterTest
+    public void afterTest() {
+        LOG.info("======================= END OF AFTERTEST =======================");
+    }
+
+    @BeforeMethod
+    public void beforeMethod(Method method) {
+        LOG.info(String.format("################################## STARTING %s ##################################", method.getName()));
+    }
+
+    @AfterMethod
+    public void afterMethod(ITestResult result) {
+
+        for (String container : tmpContainers) {
+            LOG.info("Cleaning up temporary container {}", container);
+            try {
+             dockerClient.stopContainer(container);
+             dockerClient.kill(container);
+             dockerClient.removeContainer(container);
+            } catch (DockerException ignore) {}
+        }
+
+        for (String image : tmpImgs) {
+            LOG.info("Cleaning up temporary image {}", image);
+            try {
+                dockerClient.removeImage(image);
+            } catch (DockerException ignore) {}
+        }
+
+        LOG.info("################################## END OF {} ##################################\n", result.getName());
+    }
+
+    /*
+     * #########################
+     * ## INFORMATION TESTS ##
+     * #########################
+    */
+
+    @Test
+    public void testDockerVersion() throws DockerException {
+        Version version = dockerClient.version();
+        LOG.info(version.toString());
+
+        assertTrue(version.getGoVersion().length() > 0);
+        assertTrue(version.getVersion().length() > 0);
+
+        assertEquals(StringUtils.split(version.getVersion(), ".").length, 3);
+
+    }
+
+    @Test
+    public void testDockerInfo() throws DockerException {
+        Info dockerInfo = dockerClient.info();
+        LOG.info(dockerInfo.toString());
+
+        assertTrue(dockerInfo.toString().contains("containers"));
+        assertTrue(dockerInfo.toString().contains("images"));
+        assertTrue(dockerInfo.toString().contains("debug"));
+
+        assertTrue(dockerInfo.getContainers() > 0);
+        assertTrue(dockerInfo.getImages() > 0);
+        assertTrue(dockerInfo.getNFd() > 0);
+        assertTrue(dockerInfo.getNGoroutines() > 0);
+        assertTrue(dockerInfo.isMemoryLimit());
+    }
+
+    @Test
+    public void testDockerSearch() throws DockerException {
+        List<SearchItem> dockerSearch = dockerClient.search("busybox");
+        LOG.info("Search returned {}", dockerSearch.toString());
+
+        Matcher matcher = hasItem(hasField("name", equalTo("busybox")));
+        assertThat(dockerSearch, matcher);
+
+        assertThat(filter(hasField("name", is("busybox")), dockerSearch).size(), equalTo(1));
+    }
+
+    /*
+     * ###################
+     * ## LISTING TESTS ##
+     * ###################
+     */
+
+
+    @Test
+    public void testImages() throws DockerException {
+        List<Image> images = dockerClient.getImages(true);
+        assertThat(images, notNullValue());
+        LOG.info("Images List: {}", images);
+        Info info = dockerClient.info();
+
+        assertThat(images.size(), equalTo(info.getImages()));
+
+        Image img = images.get(0);
+        assertThat(img.getCreated(), is(greaterThan(0L)) );
+        assertThat(img.getVirtualSize(), is(greaterThan(0L)) );
+        assertThat(img.getId(), not(isEmptyString()));
+        assertThat(img.getTag(), not(isEmptyString()));
+        assertThat(img.getRepository(), not(isEmptyString()));
+    }
+
+
+    @Test
+    public void testListContainers() throws DockerException {
+        List<Container> containers = dockerClient.listContainers(true);
+        assertThat(containers, notNullValue());
+        LOG.info("Container List: {}", containers);
+
+        int size = containers.size();
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[]{"echo"});
+
+        ContainerCreateResponse container1 = dockerClient.createContainer(containerConfig);
+        assertThat(container1.getId(), not(isEmptyString()));
+        dockerClient.startContainer(container1.getId());
+        tmpContainers.add(container1.getId());
+
+        List containers2 = dockerClient.listContainers(true);
+        assertThat(size + 1, is(equalTo(containers2.size())));
+        Matcher matcher = hasItem(hasField("id", startsWith(container1.getId())));
+        assertThat(containers2, matcher);
+
+        List<Container> filteredContainers = filter(hasField("id", startsWith(container1.getId())), containers2);
+        assertThat(filteredContainers.size(), is(equalTo(1)));
+
+        Container container2 = filteredContainers.get(0);
+        assertThat(container2.getCommand(), not(isEmptyString()));
+        assertThat(container2.getImage(), equalTo("busybox:latest"));
+    }
+
+
+    /*
+     * #####################
+     * ## CONTAINER TESTS ##
+     * #####################
+     */
+
+    @Test
+    public void testCreateContainer() throws DockerException {
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[]{"true"});
+
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+
+        LOG.info("Created container {}", container.toString());
+
+        assertThat(container.getId(), not(isEmptyString()));
+
+        tmpContainers.add(container.getId());
+    }
+
+    @Test
+    public void testStartContainer() throws DockerException {
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[]{"true"});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+        boolean add = tmpContainers.add(container.getId());
+
+        dockerClient.startContainer(container.getId());
+
+        ContainerInspectResponse containerInspectResponse = dockerClient.inspectContainer(container.getId());
+        LOG.info("Container Inspect: {}", containerInspectResponse.toString());
+
+        assertThat(containerInspectResponse.config, is(notNullValue()));
+        assertThat(containerInspectResponse.getId(), not(isEmptyString()));
+
+        assertThat(containerInspectResponse.getId(), startsWith(container.getId()));
+
+        assertThat(containerInspectResponse.getImage(), not(isEmptyString()));
+        assertThat(containerInspectResponse.getState(), is(notNullValue()));
+
+        assertThat(containerInspectResponse.getState().running, is(true));
+
+        if (!containerInspectResponse.getState().running) {
+            assertThat(containerInspectResponse.getState().exitCode, is(equalTo(0)));
+        }
+
+    }
+
+    @Test
+    public void testWaitContainer() throws DockerException {
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[]{"true"});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container: {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+        tmpContainers.add(container.getId());
+
+        dockerClient.startContainer(container.getId());
+
+        int exitCode = dockerClient.waitContainer(container.getId());
+        LOG.info("Container exit code: {}", exitCode);
+
+        assertThat(exitCode, equalTo(0));
+
+        ContainerInspectResponse containerInspectResponse = dockerClient.inspectContainer(container.getId());
+        LOG.info("Container Inspect: {}", containerInspectResponse.toString());
+
+        assertThat(containerInspectResponse.getState().running, is(equalTo(false)));
+        assertThat(containerInspectResponse.getState().exitCode, is(equalTo(exitCode)));
+
+    }
+
+    @Test
+    public void testLogs() throws DockerException, IOException {
+
+        String snippet = "hello world";
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[] {"/bin/echo", snippet});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container: {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+
+        dockerClient.startContainer(container.getId());
+        tmpContainers.add(container.getId());
+
+        int exitCode = dockerClient.waitContainer(container.getId());
+
+        assertThat(exitCode, equalTo(0));
+
+        ClientResponse response = dockerClient.logContainer(container.getId());
+
+        StringWriter logwriter = new StringWriter();
+
+        try {
+            LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8");
+            while (itr.hasNext()) {
+                String line = itr.next();
+                logwriter.write(line + (itr.hasNext() ? "\n" : ""));
+                LOG.info(line);
+            }
+        } finally {
+            IOUtils.closeQuietly(response.getEntityInputStream());
+        }
+
+        String fullLog = logwriter.toString();
+
+        LOG.info("Container log: {}", fullLog);
+        assertThat(fullLog, endsWith(snippet));
+    }
+
+    //This test doesn't work in Ubuntu 12.04 due to
+    //Error mounting '/dev/mapper/docker-8:5-...
+    //ref: https://github.com/dotcloud/docker/issues/4036
+
+    @Test
+    public void testDiff() throws DockerException {
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[] {"touch", "/test"});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container: {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+        dockerClient.startContainer(container.getId());
+        boolean add = tmpContainers.add(container.getId());
+        int exitCode = dockerClient.waitContainer(container.getId());
+        assertThat(exitCode, equalTo(0));
+
+        List filesystemDiff = dockerClient.containterDiff(container.getId());
+        LOG.info("Container DIFF: {}", filesystemDiff.toString());
+
+        assertThat(filesystemDiff.size(), equalTo(1));
+        ChangeLog testChangeLog = selectUnique(filesystemDiff, hasField("path", equalTo("/test")));
+
+        assertThat(testChangeLog, hasField("path", equalTo("/test")));
+        assertThat(testChangeLog, hasField("kind", equalTo(1)));
+    }
+
+    @Test
+    public void testStopContainer() throws DockerException {
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[] {"sleep", "9999"});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container: {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+        dockerClient.startContainer(container.getId());
+        tmpContainers.add(container.getId());
+
+        LOG.info("Stopping container: {}", container.getId());
+        dockerClient.stopContainer(container.getId(), 2);
+
+        ContainerInspectResponse containerInspectResponse = dockerClient.inspectContainer(container.getId());
+        LOG.info("Container Inspect: {}", containerInspectResponse.toString());
+
+        assertThat(containerInspectResponse.getState().running, is(equalTo(false)));
+        assertThat(containerInspectResponse.getState().exitCode, not(equalTo(0)));
+    }
+
+    @Test
+    public void testKillContainer() throws DockerException {
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[] {"sleep", "9999"});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container: {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+        dockerClient.startContainer(container.getId());
+        tmpContainers.add(container.getId());
+
+        LOG.info("Killing container: {}", container.getId());
+        dockerClient.kill(container.getId());
+
+        ContainerInspectResponse containerInspectResponse = dockerClient.inspectContainer(container.getId());
+        LOG.info("Container Inspect: {}", containerInspectResponse.toString());
+
+        assertThat(containerInspectResponse.getState().running, is(equalTo(false)));
+        assertThat(containerInspectResponse.getState().exitCode, not(equalTo(0)));
+
+    }
+
+    @Test
+    public void restartContainer() throws DockerException {
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[] {"sleep", "9999"});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container: {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+        dockerClient.startContainer(container.getId());
+        tmpContainers.add(container.getId());
+
+        ContainerInspectResponse containerInspectResponse = dockerClient.inspectContainer(container.getId());
+        LOG.info("Container Inspect: {}",  containerInspectResponse.toString());
+
+        String startTime = containerInspectResponse.getState().startedAt;
+
+        dockerClient.restart(container.getId(), 2);
+
+        ContainerInspectResponse containerInspectResponse2 = dockerClient.inspectContainer(container.getId());
+        LOG.info("Container Inspect After Restart: {}", containerInspectResponse2.toString());
+
+        String startTime2 = containerInspectResponse2.getState().startedAt;
+
+        assertThat(startTime, not(equalTo(startTime2)));
+
+        assertThat(containerInspectResponse.getState().running, is(equalTo(true)));
+
+        dockerClient.kill(container.getId());
+    }
+
+    @Test
+    public void removeContainer() throws DockerException {
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[] {"true"});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+
+        dockerClient.startContainer(container.getId());
+        dockerClient.waitContainer(container.getId());
+        tmpContainers.add(container.getId());
+
+        LOG.info("Removing container: {}", container.getId());
+        dockerClient.removeContainer(container.getId());
+
+        List containers2 = dockerClient.listContainers(true);
+        Matcher matcher = not(hasItem(hasField("id", startsWith(container.getId()))));
+        assertThat(containers2, matcher);
+
+    }
+
+    /*
+     * ##################
+     * ## IMAGES TESTS ##
+     * ##################
+     * */
+
+    @Test
+    public void testPullImage() throws DockerException, IOException {
+
+        String testImage = "centos";
+
+        LOG.info("Removing image: {}", testImage);
+        dockerClient.removeImage(testImage);
+
+        Info info = dockerClient.info();
+        LOG.info("Client info: {}", info.toString());
+
+        int imgCount= info.getImages();
+
+        LOG.info("Pulling image: {}", testImage);
+
+        ClientResponse response = dockerClient.pull(testImage);
+
+        StringWriter logwriter = new StringWriter();
+
+        try {
+            LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8");
+            while (itr.hasNext()) {
+                String line = itr.next();
+                logwriter.write(line + "\n");
+                LOG.info(line);
+            }
+        } finally {
+            IOUtils.closeQuietly(response.getEntityInputStream());
+        }
+
+        String fullLog = logwriter.toString();
+        assertThat(fullLog, containsString("Download complete"));
+
+        tmpImgs.add(testImage);
+
+        info = dockerClient.info();
+        LOG.info("Client info after pull, {}", info.toString());
+
+        assertThat(imgCount, lessThan(info.getImages()));
+
+        ImageInspectResponse imageInspectResponse = dockerClient.inspectImage(testImage);
+        LOG.info("Image Inspect: {}", imageInspectResponse.toString());
+        assertThat(imageInspectResponse, notNullValue());
+    }
+
+    //This test doesn't work in Ubuntu 12.04 due to
+    //Error mounting '/dev/mapper/docker-8:5-...
+    //ref: https://github.com/dotcloud/docker/issues/4036
+
+    @Test
+    public void commitImage() throws DockerException {
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[] {"touch", "/test"});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container: {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+        dockerClient.startContainer(container.getId());
+        tmpContainers.add(container.getId());
+
+        LOG.info("Commiting container: {}", container.toString());
+        String imageId = dockerClient.commit(new CommitConfig(container.getId()));
+        tmpImgs.add(imageId);
+
+        ImageInspectResponse imageInspectResponse = dockerClient.inspectImage(imageId);
+        LOG.info("Image Inspect: {}", imageInspectResponse.toString());
+
+        assertThat(imageInspectResponse, hasField("container", startsWith(container.getId())));
+        assertThat(imageInspectResponse.getContainerConfig().getImage(), equalTo("busybox"));
+
+        ImageInspectResponse busyboxImg = dockerClient.inspectImage("busybox");
+
+        assertThat(imageInspectResponse.getParent(), equalTo(busyboxImg.getId()));
+    }
+
+    @Test
+    public void testRemoveImage() throws DockerException, InterruptedException {
+
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage("busybox");
+        containerConfig.setCmd(new String[] {"touch", "/test"});
+
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container: {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+        dockerClient.startContainer(container.getId());
+        tmpContainers.add(container.getId());
+
+        LOG.info("Commiting container {}", container.toString());
+        String imageId = dockerClient.commit(new CommitConfig(container.getId()));
+        tmpImgs.add(imageId);
+
+        dockerClient.stopContainer(container.getId());
+        dockerClient.kill(container.getId());
+        dockerClient.removeContainer(container.getId());
+
+        tmpContainers.remove(container.getId());
+        LOG.info("Removing image: {}", imageId);
+        dockerClient.removeImage(imageId);
+
+        List containers = dockerClient.listContainers(true);
+        Matcher matcher = not(hasItem(hasField("id", startsWith(imageId))));
+        assertThat(containers, matcher);
+    }
+
+
+    /*
+     *
+     * ################
+     * ## MISC TESTS ##
+     * ################
+     */
+
+    @Test
+    public void testRunShlex() throws DockerException {
+
+        String[] commands = new String[] {
+                "true",
+                "echo \"The Young Descendant of Tepes & Septette for the Dead Princess\"",
+                "echo -n 'The Young Descendant of Tepes & Septette for the Dead Princess'",
+                "/bin/sh -c echo Hello World",
+                "/bin/sh -c echo 'Hello World'",
+                "echo 'Night of Nights'",
+                "true && echo 'Night of Nights'"
+        };
+
+        for (String command : commands) {
+            LOG.info("Running command: [{}]",  command);
+
+            ContainerConfig containerConfig = new ContainerConfig();
+            containerConfig.setImage("busybox");
+            containerConfig.setCmd( commands );
+
+            ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+            dockerClient.startContainer(container.getId());
+            tmpContainers.add(container.getId());
+            int exitcode = dockerClient.waitContainer(container.getId());
+            assertThat(exitcode, equalTo(0));
+        }
+    }
+
+
+    @Test
+    public void testNginxDockerfileBuilder() throws DockerException, IOException {
+        File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("nginx").getFile());
+
+        ClientResponse response = dockerClient.build(baseDir);
+
+        StringWriter logwriter = new StringWriter();
+
+        try {
+            LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8");
+            while (itr.hasNext()) {
+                String line = itr.next();
+                logwriter.write(line + "\n");
+                LOG.info(line);
+            }
+        } finally {
+            IOUtils.closeQuietly(response.getEntityInputStream());
+        }
+
+        String fullLog = logwriter.toString();
+        assertThat(fullLog, containsString("Successfully built"));
+
+        String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim();
+
+        ImageInspectResponse imageInspectResponse = dockerClient.inspectImage(imageId);
+        assertThat(imageInspectResponse, not(nullValue()));
+        LOG.info("Image Inspect: {}", imageInspectResponse.toString());
+        tmpImgs.add(imageInspectResponse.getId());
+
+        assertThat(imageInspectResponse.getAuthor(), equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\""));
+    }
+
+    @Test
+    public void testDockerBuilderAddFile() throws DockerException, IOException {
+        File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFile").getFile());
+        dockerfileBuild(baseDir, "Successfully executed testrun.sh");
+    }
+
+    @Test
+    public void testDockerBuilderAddFolder() throws DockerException, IOException {
+        File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testAddFolder").getFile());
+        dockerfileBuild(baseDir, "Successfully executed testAddFolder.sh");
+    }
+
+    @Test
+    public void testImportImageFromTar() throws DockerException, IOException {
+        InputStream tar = Thread.currentThread().getContextClassLoader().getResourceAsStream("testImportImageFromTar/empty.tar");
+        String imageId = dockerClient.importImage("empty", null, tar).getId();
+        assert imageId.contains(dockerClient.inspectImage("empty").getId());
+    }
+
+    @Test
+    public void testNetCatDockerfileBuilder() throws DockerException, IOException, InterruptedException {
+        File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("netcat").getFile());
+
+        ClientResponse response = dockerClient.build(baseDir);
+
+        StringWriter logwriter = new StringWriter();
+
+        try {
+            LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8");
+            while (itr.hasNext()) {
+                String line = itr.next();
+                logwriter.write(line + "\n");
+                LOG.info(line);
+            }
+        } finally {
+            IOUtils.closeQuietly(response.getEntityInputStream());
+        }
+
+        String fullLog = logwriter.toString();
+        assertThat(fullLog, containsString("Successfully built"));
+
+        String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim();
+
+        ImageInspectResponse imageInspectResponse = dockerClient.inspectImage(imageId);
+        assertThat(imageInspectResponse, not(nullValue()));
+        LOG.info("Image Inspect: {}", imageInspectResponse.toString());
+        tmpImgs.add(imageInspectResponse.getId());
+
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage(imageInspectResponse.getId());
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        assertThat(container.getId(), not(isEmptyString()));
+        dockerClient.startContainer(container.getId());
+        tmpContainers.add(container.getId());
+
+        ContainerInspectResponse containerInspectResponse = dockerClient.inspectContainer(container.getId());
+
+        assertThat(containerInspectResponse.getId(), notNullValue());
+        assertThat(containerInspectResponse.getNetworkSettings().ports, notNullValue());
+
+        //No use as such if not running on the server
+        for(String portstr : containerInspectResponse.getNetworkSettings().ports.getAllPorts().keySet()){
+
+         Ports.Port p = containerInspectResponse.getNetworkSettings().ports.getAllPorts().get(portstr);
+         int port = Integer.valueOf(p.getHostPort());
+         LOG.info("Checking port {} is open", port);
+             assertThat(available(port), is(false));
+        }
+        dockerClient.stopContainer(container.getId(), 0);
+
+    }
+
+
+    // UTIL
+
+    /**
+     * Checks to see if a specific port is available.
+     *
+     * @param port the port to check for availability
+     */
+    public static boolean available(int port) {
+        if (port < 1100 || port > 60000) {
+            throw new IllegalArgumentException("Invalid start port: " + port);
+        }
+
+        ServerSocket ss = null;
+        DatagramSocket ds = null;
+        try {
+            ss = new ServerSocket(port);
+            ss.setReuseAddress(true);
+            ds = new DatagramSocket(port);
+            ds.setReuseAddress(true);
+            return true;
+        } catch (IOException e) {
+        } finally {
+            if (ds != null) {
+                ds.close();
+            }
+
+            if (ss != null) {
+                try {
+                    ss.close();
+                } catch (IOException e) {
+                /* should not be thrown */
+                }
+            }
+        }
+
+        return false;
+    }
+
+    private void dockerfileBuild(File baseDir, String expectedText) throws DockerException, IOException {
+
+        //Build image
+        ClientResponse response = dockerClient.build(baseDir);
+
+        StringWriter logwriter = new StringWriter();
+
+        try {
+            LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8");
+            while (itr.hasNext()) {
+                String line = itr.next();
+                logwriter.write(line + "\n");
+                LOG.info(line);
+            }
+        } finally {
+            IOUtils.closeQuietly(response.getEntityInputStream());
+        }
+
+        String fullLog = logwriter.toString();
+        assertThat(fullLog, containsString("Successfully built"));
+
+        String imageId = StringUtils.substringBetween(fullLog, "Successfully built ", "\\n\"}").trim();
+
+        //Create container based on image
+        ContainerConfig containerConfig = new ContainerConfig();
+        containerConfig.setImage(imageId);
+        ContainerCreateResponse container = dockerClient.createContainer(containerConfig);
+        LOG.info("Created container: {}", container.toString());
+        assertThat(container.getId(), not(isEmptyString()));
+
+        dockerClient.startContainer(container.getId());
+        dockerClient.waitContainer(container.getId());
+
+        tmpContainers.add(container.getId());
+
+        //Log container
+        ClientResponse logResponse = dockerClient.logContainer(container.getId());
+
+        StringWriter logwriter2 = new StringWriter();
+
+        try {
+            LineIterator itr = IOUtils.lineIterator(logResponse.getEntityInputStream(), "UTF-8");
+            while (itr.hasNext()) {
+                String line = itr.next();
+                logwriter2.write(line + (itr.hasNext() ? "\n" : ""));
+                LOG.info(line);
+            }
+        } finally {
+            IOUtils.closeQuietly(logResponse.getEntityInputStream());
+        }
+
+        assertThat(logwriter2.toString(), endsWith(expectedText));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/docker-java/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/docker-java/src/test/resources/logback.xml b/docker-java/src/test/resources/logback.xml
new file mode 100644
index 0000000..99f8b3d
--- /dev/null
+++ b/docker-java/src/test/resources/logback.xml
@@ -0,0 +1,16 @@
+<configuration debug="true"> <!-- This will give you some valuable info about logback config upon runtime. Remove this for production. -->
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <logger name="com.kpelykh.docker.client" level="TRACE"/>
+    <logger name="com.kpelykh.docker.client.test" level="DEBUG"/>
+
+    <root level="info">
+        <appender-ref ref="STDOUT" />
+    </root>
+
+</configuration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/docker-java/src/test/resources/netcat/Dockerfile
----------------------------------------------------------------------
diff --git a/docker-java/src/test/resources/netcat/Dockerfile b/docker-java/src/test/resources/netcat/Dockerfile
new file mode 100644
index 0000000..1ea3554
--- /dev/null
+++ b/docker-java/src/test/resources/netcat/Dockerfile
@@ -0,0 +1,11 @@
+# Firefox over VNC
+#
+# VERSION               0.3
+
+FROM ubuntu
+
+#install netcat
+RUN apt-get install -y netcat
+
+EXPOSE 6900
+CMD    ["nc", "-l", "6900"]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/docker-java/src/test/resources/nginx/Dockerfile
----------------------------------------------------------------------
diff --git a/docker-java/src/test/resources/nginx/Dockerfile b/docker-java/src/test/resources/nginx/Dockerfile
new file mode 100644
index 0000000..b0abcd6
--- /dev/null
+++ b/docker-java/src/test/resources/nginx/Dockerfile
@@ -0,0 +1,12 @@
+# Nginx
+#
+# VERSION               0.0.1
+
+FROM      ubuntu
+MAINTAINER Guillaume J. Charmes "guillaume@dotcloud.com"
+
+# make sure the package repository is up to date
+RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
+RUN apt-get update
+
+RUN apt-get install -y inotify-tools nginx apache2 openssh-server
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/docker-java/src/test/resources/testAddFile/Dockerfile
----------------------------------------------------------------------
diff --git a/docker-java/src/test/resources/testAddFile/Dockerfile b/docker-java/src/test/resources/testAddFile/Dockerfile
new file mode 100644
index 0000000..38afcdd
--- /dev/null
+++ b/docker-java/src/test/resources/testAddFile/Dockerfile
@@ -0,0 +1,9 @@
+FROM      ubuntu
+
+# Copy testrun.sh files into the container
+
+ADD ./testrun.sh    /tmp/
+
+run cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh
+
+CMD ["testrun.sh"]

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/docker-java/src/test/resources/testAddFile/testrun.sh
----------------------------------------------------------------------
diff --git a/docker-java/src/test/resources/testAddFile/testrun.sh b/docker-java/src/test/resources/testAddFile/testrun.sh
new file mode 100755
index 0000000..80b468e
--- /dev/null
+++ b/docker-java/src/test/resources/testAddFile/testrun.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+echo "Successfully executed testrun.sh"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/docker-java/src/test/resources/testAddFolder/Dockerfile
----------------------------------------------------------------------
diff --git a/docker-java/src/test/resources/testAddFolder/Dockerfile b/docker-java/src/test/resources/testAddFolder/Dockerfile
new file mode 100644
index 0000000..b2a8e2a
--- /dev/null
+++ b/docker-java/src/test/resources/testAddFolder/Dockerfile
@@ -0,0 +1,11 @@
+FROM      ubuntu
+
+# Copy testrun.sh files into the container
+
+ADD .   /src/
+
+run ls -la /src
+
+run cp /src/folderA/testAddFolder.sh /usr/local/bin/ && chmod +x /usr/local/bin/testAddFolder.sh
+
+CMD ["testAddFolder.sh"]

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/docker-java/src/test/resources/testAddFolder/folderA/testAddFolder.sh
----------------------------------------------------------------------
diff --git a/docker-java/src/test/resources/testAddFolder/folderA/testAddFolder.sh b/docker-java/src/test/resources/testAddFolder/folderA/testAddFolder.sh
new file mode 100644
index 0000000..3013d92
--- /dev/null
+++ b/docker-java/src/test/resources/testAddFolder/folderA/testAddFolder.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+echo "Successfully executed testAddFolder.sh"

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/docker-java/src/test/resources/testImportImageFromTar/empty.tar
----------------------------------------------------------------------
diff --git a/docker-java/src/test/resources/testImportImageFromTar/empty.tar b/docker-java/src/test/resources/testImportImageFromTar/empty.tar
new file mode 100644
index 0000000..b055b9c
Binary files /dev/null and b/docker-java/src/test/resources/testImportImageFromTar/empty.tar differ

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cd8a4520/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index ac89c31..e196a59 100644
--- a/pom.xml
+++ b/pom.xml
@@ -427,6 +427,11 @@
       <artifactId>javax.inject</artifactId>
       <version>1</version>
     </dependency>
+    <dependency>
+      <groupId>com.kpelykh</groupId>
+      <artifactId>docker-java</artifactId>
+      <version>0.8.2-SNAPSHOT</version>
+    </dependency>
   </dependencies>
 
   <build>