You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2015/10/21 16:27:44 UTC

[1/4] jclouds-labs git commit: [JCLOUDS-1010] use a lightweight image as a base for Docker build test

Repository: jclouds-labs
Updated Branches:
  refs/heads/master f4846f172 -> 3f0dce351


[JCLOUDS-1010] use a lightweight image as a base for Docker build test


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/b5d8260d
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/b5d8260d
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/b5d8260d

Branch: refs/heads/master
Commit: b5d8260d132c16f0dcb260b615a079a769159a7a
Parents: f4846f1
Author: Josef Cacek <jo...@gmail.com>
Authored: Thu Oct 8 11:19:09 2015 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Oct 21 16:10:18 2015 +0200

----------------------------------------------------------------------
 docker/src/test/resources/Dockerfile | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/b5d8260d/docker/src/test/resources/Dockerfile
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/Dockerfile b/docker/src/test/resources/Dockerfile
index 3c3b30e..f375d33 100644
--- a/docker/src/test/resources/Dockerfile
+++ b/docker/src/test/resources/Dockerfile
@@ -14,19 +14,21 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-FROM ubuntu:14.04
-MAINTAINER Sven Dowideit <Sv...@docker.com>
 
-RUN apt-get update && apt-get install -y openssh-server
-RUN mkdir /var/run/sshd
-RUN echo 'root:screencast' | chpasswd
-RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
 
-# SSH login fix. Otherwise user is kicked off after login
-RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
+FROM alpine:3.2
+MAINTAINER JClouds Dev <de...@jclouds.apache.org>
+
+ENV DROPBEAR_CONF=/etc/dropbear
 
-ENV NOTVISIBLE "in users profile"
-RUN echo "export VISIBLE=now" >> /etc/profile
+RUN apk add --update dropbear \
+    && mkdir -p ${DROPBEAR_CONF} \
+    && dropbearkey -t dss -f ${DROPBEAR_CONF}/dropbear_dss_host_key \
+    && dropbearkey -t rsa -f ${DROPBEAR_CONF}/dropbear_rsa_host_key -s 2048 \
+    && dropbearkey -t ecdsa -f ${DROPBEAR_CONF}/dropbear_ecdsa_host_key
+
+RUN echo 'root:screencast' | chpasswd
 
 EXPOSE 22
-CMD ["/usr/sbin/sshd", "-D"]
\ No newline at end of file
+
+CMD ["/usr/sbin/dropbear", "-E", "-F"]


[3/4] jclouds-labs git commit: [JCLOUDS-1020] fix query parameter name in Docker's BuildOptions

Posted by na...@apache.org.
[JCLOUDS-1020] fix query parameter name in Docker's BuildOptions


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/446e28ce
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/446e28ce
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/446e28ce

Branch: refs/heads/master
Commit: 446e28ce9a45267d8889d15ddc1ac4165ffd6121
Parents: c56d64a
Author: Josef Cacek <jo...@gmail.com>
Authored: Wed Oct 21 10:44:30 2015 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Oct 21 16:10:25 2015 +0200

----------------------------------------------------------------------
 docker/src/main/java/org/jclouds/docker/options/BuildOptions.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/446e28ce/docker/src/main/java/org/jclouds/docker/options/BuildOptions.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/options/BuildOptions.java b/docker/src/main/java/org/jclouds/docker/options/BuildOptions.java
index 6653a56..15d95e0 100644
--- a/docker/src/main/java/org/jclouds/docker/options/BuildOptions.java
+++ b/docker/src/main/java/org/jclouds/docker/options/BuildOptions.java
@@ -21,7 +21,7 @@ import org.jclouds.http.options.BaseHttpRequestOptions;
 public class BuildOptions extends BaseHttpRequestOptions {
 
    public BuildOptions tag(String tag) {
-      this.queryParameters.put("tag", tag);
+      this.queryParameters.put("t", tag);
       return this;
    }
 


[4/4] jclouds-labs git commit: Add LiveTest to cover loginPort (SSH) customization in Docker.

Posted by na...@apache.org.
Add LiveTest to cover loginPort (SSH) customization in Docker.


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/3f0dce35
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/3f0dce35
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/3f0dce35

Branch: refs/heads/master
Commit: 3f0dce351f17afa6351ad031583cf183b8a1f1ed
Parents: 446e28c
Author: Josef Cacek <jo...@gmail.com>
Authored: Tue Oct 20 18:54:58 2015 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Oct 21 16:10:29 2015 +0200

----------------------------------------------------------------------
 .../docker/compute/SshToCustomPortLiveTest.java | 224 +++++++++++++++++++
 1 file changed, 224 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/3f0dce35/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java b/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java
new file mode 100644
index 0000000..62e1e5e
--- /dev/null
+++ b/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java
@@ -0,0 +1,224 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.docker.compute;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.jclouds.compute.options.TemplateOptions.Builder.runAsRoot;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.jclouds.compute.RunNodesException;
+import org.jclouds.compute.domain.ExecResponse;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest;
+import org.jclouds.docker.DockerApi;
+import org.jclouds.docker.compute.functions.LoginPortForContainer;
+import org.jclouds.docker.compute.options.DockerTemplateOptions;
+import org.jclouds.docker.domain.Container;
+import org.jclouds.docker.domain.Image;
+import org.jclouds.docker.domain.ImageSummary;
+import org.jclouds.docker.options.BuildOptions;
+import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+
+/**
+ * This class tests configuring custom SSH port for Docker images.
+ */
+@Test(groups = "live", testName = "SshToCustomPortLiveTest", singleThreaded = true)
+public class SshToCustomPortLiveTest extends BaseComputeServiceContextLiveTest {
+
+   private static final int SSH_PORT = 8822;
+   private static final String IMAGE_REPOSITORY = "jclouds/testrepo";
+   private static final String IMAGE_TAG_1 = "testtag";
+   private static final String IMAGE_TAG_2 = "second";
+
+   private Image image;
+
+   public SshToCustomPortLiveTest() {
+      provider = "docker";
+   }
+
+   /**
+    * Asserts that the new image exists and tags were created successfully in
+    * the test preparation phase ({@link #setupContext()} method).
+    */
+   @Test
+   public void testImageCreated() {
+      assertNotNull(image);
+
+      final String imageId = image.id();
+      assertNotNull(imageId);
+
+      List<ImageSummary> listImages = api().getImageApi().listImages();
+      assertNotNull(listImages);
+      ImageSummary testImage = Iterables.find(listImages, new Predicate<ImageSummary>() {
+         @Override
+         public boolean apply(ImageSummary input) {
+            return imageId.equals(input.id());
+         }
+      });
+
+      assertEquals(testImage.repoTags().size(), 2, "Unexpected number of tags on the image.");
+      assertThat(testImage.repoTags()).contains(toTag(IMAGE_REPOSITORY, IMAGE_TAG_1),
+            toTag(IMAGE_REPOSITORY, IMAGE_TAG_2));
+   }
+
+   /**
+    * Start a node from the newly created image. The dropbear SSH server running
+    * on custom port ( {@value #SSH_PORT}). The Docker networkMode used is
+    * "host". Execute a command through the SSH connection and check the result.
+    * Destroy the node when finished.
+    * 
+    * @throws RunNodesException
+    */
+   @Test(dependsOnMethods = "testImageCreated")
+   public void testCustomPortSsh() throws RunNodesException {
+      final DockerTemplateOptions options = DockerTemplateOptions.Builder
+            .commands("/usr/sbin/dropbear", "-E", "-F", "-p", String.valueOf(SSH_PORT)).overrideLoginUser("root")
+            .overrideLoginPassword("screencast").blockOnPort(SSH_PORT, 30).networkMode("host");
+
+      final Template template = view.getComputeService().templateBuilder().imageId(image.id()).options(options).build();
+
+      String nodeId = null;
+      try {
+         NodeMetadata node = Iterables
+               .getOnlyElement(view.getComputeService().createNodesInGroup("ssh-test", 1, template));
+
+         nodeId = node.getId();
+         ExecResponse response = view.getComputeService().runScriptOnNode(nodeId, "echo hello",
+               runAsRoot(false).wrapInInitScript(false));
+         assertThat(response.getOutput().trim()).endsWith("hello");
+      } finally {
+         if (nodeId != null)
+            view.getComputeService().destroyNode(nodeId);
+      }
+   }
+
+   /**
+    * Build a new image with 2 tags on it in the test preparation phase.
+    * 
+    * @see org.jclouds.apis.BaseContextLiveTest#setupContext()
+    */
+   @Override
+   @BeforeClass(groups = { "integration", "live" })
+   public void setupContext() {
+      super.setupContext();
+
+      final String tag = toTag(IMAGE_REPOSITORY, IMAGE_TAG_1);
+      BuildOptions options = BuildOptions.Builder.tag(tag).verbose(false).nocache(false);
+      InputStream buildImageStream;
+      try {
+         buildImageStream = api().getMiscApi().build(BaseDockerApiLiveTest.tarredDockerfile(), options);
+         consumeStreamSilently(buildImageStream);
+      } catch (IOException e) {
+         throw new RuntimeException("Error occured during building Docker image.", e);
+      }
+      image = api().getImageApi().inspectImage(tag);
+      api().getImageApi().tagImage(image.id(), IMAGE_REPOSITORY, IMAGE_TAG_2, true);
+   }
+
+   /**
+    * After the test remove created image (with all tags).
+    * 
+    * @see #setupContext()
+    */
+   @AfterClass(alwaysRun = true)
+   protected void tearDown() {
+      consumeStreamSilently(api().getImageApi().deleteImage(toTag(IMAGE_REPOSITORY, IMAGE_TAG_1)));
+      consumeStreamSilently(api().getImageApi().deleteImage(toTag(IMAGE_REPOSITORY, IMAGE_TAG_2)));
+   }
+
+   /**
+    * Configure used modules. A custom {@link LoginPortForContainer} binding is
+    * added among logging and SSH module.
+    * 
+    * @see org.jclouds.compute.internal.BaseGenericComputeServiceContextLiveTest#setupModules()
+    */
+   @Override
+   protected Iterable<Module> setupModules() {
+      return ImmutableSet.<Module> of(getLoggingModule(), new SshjSshClientModule(), new AbstractModule() {
+         @Override
+         protected void configure() {
+            bind(LoginPortForContainer.class).toInstance(new LoginPortForContainer() {
+               @Override
+               public Optional<Integer> apply(Container input) {
+                  return Optional.of(SSH_PORT);
+               }
+            });
+         }
+      });
+   }
+
+   /**
+    * Return DockerApi for current Context.
+    * 
+    * @return
+    */
+   private DockerApi api() {
+      return view.unwrapApi(DockerApi.class);
+   }
+
+   /**
+    * Read all data from given InputStream and throw away all the bits.
+    * 
+    * @param is
+    */
+   private static void consumeStreamSilently(InputStream is) {
+      char[] tmpBuff = new char[8 * 1024];
+      // throw everything away
+      InputStreamReader isr = new InputStreamReader(is);
+
+      try {
+         try {
+            while (isr.read(tmpBuff) > -1) {
+               // empty
+            }
+         } finally {
+            isr.close();
+         }
+      } catch (IOException e) {
+         java.util.logging.Logger.getAnonymousLogger().log(Level.WARNING, "Error ocured during reading InputStream.", e);
+      }
+   }
+
+   /**
+    * Concatenate repository and tag name (if provided) in Docker format.
+    * 
+    * @param repo
+    * @param tag
+    * @return
+    */
+   private static String toTag(String repo, String tag) {
+      return repo + (tag != null ? ":" + tag : "");
+   }
+}


[2/4] jclouds-labs git commit: [JCLOUDS-1017] add tagImage() method to ImageApi

Posted by na...@apache.org.
[JCLOUDS-1017] add tagImage() method to ImageApi


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/c56d64ae
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/c56d64ae
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/c56d64ae

Branch: refs/heads/master
Commit: c56d64aed95891433bcb2ff03a311d550b3c145a
Parents: b5d8260
Author: Josef Cacek <jo...@gmail.com>
Authored: Tue Oct 20 15:08:16 2015 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Oct 21 16:10:21 2015 +0200

----------------------------------------------------------------------
 .../org/jclouds/docker/features/ImageApi.java   | 18 ++++
 .../docker/features/ImageApiLiveTest.java       | 38 +++++++-
 .../docker/features/ImageApiMockTest.java       | 12 +++
 .../jclouds/docker/parse/ImagesParseTest.java   | 48 +++++------
 docker/src/test/resources/images.json           | 91 +++++++++++---------
 5 files changed, 139 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c56d64ae/docker/src/main/java/org/jclouds/docker/features/ImageApi.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/features/ImageApi.java b/docker/src/main/java/org/jclouds/docker/features/ImageApi.java
index 9f7cebc..cfca40d 100644
--- a/docker/src/main/java/org/jclouds/docker/features/ImageApi.java
+++ b/docker/src/main/java/org/jclouds/docker/features/ImageApi.java
@@ -26,6 +26,7 @@ import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
@@ -102,4 +103,21 @@ public interface ImageApi {
    @Path("/images/{name}")
    InputStream deleteImage(@PathParam("name") String name, DeleteImageOptions options);
 
+   /**
+    * Tag the image name into a repository.
+    *
+    * @param name
+    *           the name of the image to be tagged
+    * @param repoName
+    *           the repository to tag in
+    * @param tag
+    *           the new tag name
+    * @param force
+    *           force create if tag already exists
+    */
+   @Named("image:tag")
+   @POST
+   @Path("/images/{name}/tag")
+   void tagImage(@PathParam("name") String name, @QueryParam("repo") String repoName,
+         @QueryParam("tag") String tag, @QueryParam("force") boolean force);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c56d64ae/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java
index a145417..1249f2f 100644
--- a/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java
@@ -16,20 +16,30 @@
  */
 package org.jclouds.docker.features;
 
+import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
+
 import java.io.InputStream;
+import java.util.List;
 
 import org.jclouds.docker.compute.BaseDockerApiLiveTest;
+import org.jclouds.docker.domain.Image;
+import org.jclouds.docker.domain.ImageSummary;
 import org.jclouds.docker.options.CreateImageOptions;
 import org.testng.annotations.Test;
 
-@Test(groups = "live", testName = "RemoteApiLiveTest", singleThreaded = true)
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+@Test(groups = "live", testName = "ImageApiLiveTest", singleThreaded = true)
 public class ImageApiLiveTest extends BaseDockerApiLiveTest {
 
    private static final String DEFAULT_IMAGE = "busybox";
    private static final String DEFAULT_TAG = "ubuntu-14.04";
 
+   private Image image;
+
    @Test
    public void testCreateImage() {
       InputStream createImageStream = api().createImage(CreateImageOptions.Builder.fromImage(DEFAULT_IMAGE).tag(DEFAULT_TAG));
@@ -38,18 +48,38 @@ public class ImageApiLiveTest extends BaseDockerApiLiveTest {
 
    @Test(dependsOnMethods = "testCreateImage")
    public void testInspectImage() {
-      assertNotNull(api.getImageApi().inspectImage(String.format("%s:%s", DEFAULT_IMAGE, DEFAULT_TAG)));
+      image = api.getImageApi().inspectImage(String.format("%s:%s", DEFAULT_IMAGE, DEFAULT_TAG));
+      assertNotNull(image);
    }
 
    @Test(dependsOnMethods = "testInspectImage")
+   public void testTagImage() {
+      api.getImageApi().tagImage(image.id(), "jclouds", "testTag", true);
+      Image taggedImage = api.getImageApi().inspectImage("jclouds:testTag");
+      assertEquals(taggedImage.id(), image.id(), "Newly added image tag should point to the same image ID.");
+   }
+
+   @Test(dependsOnMethods = "testTagImage")
    public void testListImages() {
-      assertNotNull(api().listImages());
+      List<ImageSummary> listImages = api().listImages();
+      assertNotNull(listImages);
+
+      Iterables.find(listImages, new Predicate<ImageSummary>() {
+         @Override
+         public boolean apply(ImageSummary input) {
+            return input.repoTags().contains("jclouds:testTag");
+         }
+      });
    }
 
-   @Test(dependsOnMethods = "testListImages")
+   @Test(dependsOnMethods = "testListImages", alwaysRun = true)
    public void testDeleteImage() {
       consumeStream(api().deleteImage(String.format("%s:%s", DEFAULT_IMAGE, DEFAULT_TAG)));
       assertNull(api().inspectImage(String.format("%s:%s", DEFAULT_IMAGE, DEFAULT_TAG)));
+
+      assertNotNull(api().inspectImage(image.id()), "Image should should still exist after removing original tag. There is a newly added tag referencing it.");
+      consumeStream(api().deleteImage("jclouds:testTag"));
+      assertNull(api().inspectImage("jclouds:testTag"));
    }
 
    private ImageApi api() {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c56d64ae/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java b/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java
index 5349c39..f789b6d 100644
--- a/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java
+++ b/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java
@@ -69,6 +69,18 @@ public class ImageApiMockTest extends BaseDockerMockTest {
       }
    }
 
+   public void testTagImage() throws Exception {
+      MockWebServer server = mockWebServer(new MockResponse().setResponseCode(201));
+      ImageApi api = api(DockerApi.class, server.getUrl("/").toString()).getImageApi();
+      try {
+         api.tagImage("633fcd11259e8d6bccfbb59a4086b95b0d0fb44edfc3912000ef1f70e8a7bfc6", "jclouds", "testTag", true);
+         assertSent(server, "POST",
+               "/images/633fcd11259e8d6bccfbb59a4086b95b0d0fb44edfc3912000ef1f70e8a7bfc6/tag?repo=jclouds&tag=testTag&force=true");
+      } finally {
+         server.shutdown();
+      }
+   }
+
    public void testDeleteImage() throws Exception {
       MockWebServer server = mockWebServer(new MockResponse().setResponseCode(204));
       ImageApi api = api(DockerApi.class, server.getUrl("/").toString()).getImageApi();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c56d64ae/docker/src/test/java/org/jclouds/docker/parse/ImagesParseTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/parse/ImagesParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/ImagesParseTest.java
index d2ef5b6..1042da0 100644
--- a/docker/src/test/java/org/jclouds/docker/parse/ImagesParseTest.java
+++ b/docker/src/test/java/org/jclouds/docker/parse/ImagesParseTest.java
@@ -39,30 +39,30 @@ public class ImagesParseTest extends BaseDockerParseTest<List<ImageSummary>> {
    @Consumes(MediaType.APPLICATION_JSON)
    public List<ImageSummary> expected() {
       return ImmutableList.of(
-              ImageSummary.create("cbba6639a342646deed70d7ea6162fa2a0acea9300f911f4e014555fe37d3456",
-                      1416827360,
-                      "05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba",
-                      0,
-                      808709069,
-                      ImmutableList.of("test:latest")),
-              ImageSummary.create("e1e548b03259ae30ba12232b6c16ef5205cf71b0363848e78b0394e1ecba4f57",
-                      1416826851,
-                      "6f36bec79c7f184ceebf7000cfb7244c4bc9b397b6659ac7f420a53d114250d9",
-                      0,
-                      5609404,
-                      ImmutableList.of("<none>:<none>")),
-              ImageSummary.create("8201388d2b288539aab6aabf5d3b15ec269eba95c6baa9d6771f16540abf3a3f",
-                      1414247273,
-                      "4671e2c549c5b60063e349f520c801dc73b53d2226a5a8e5501845ebe94761ca",
-                      0,
-                      755313702,
-                      ImmutableList.of("dockerfile/java:openjdk-7-jdk")),
-              ImageSummary.create("5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5",
-                      1414108439,
-                      "22093c35d77bb609b9257ffb2640845ec05018e3d96cb939f68d0e19127f1723",
-                      0,
-                      199257566,
-                      ImmutableList.of("ubuntu:14.04"))
+            ImageSummary.create("d7057cb020844f245031d27b76cb18af05db1cc3a96a29fa7777af75f5ac91a3",
+                  1442866547,
+                  "cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54",
+                  0,
+                  1095501,
+                  ImmutableList.of("docker.io/busybox:1.23.2", "docker.io/busybox:latest")),
+            ImageSummary.create("633fcd11259e8d6bccfbb59a4086b95b0d0fb44edfc3912000ef1f70e8a7bfc6",
+                  1442598293,
+                  "b65c936b5fb601d680ed656b1ccf8ab857c0e5cb521043a005405c194e9a69f3",
+                  0,
+                  5607885,
+                  ImmutableList.of("docker.io/busybox:ubuntu-14.04", "jclouds:testTag")),
+            ImageSummary.create("f4fddc471ec22fc1f7d37768132f1753bc171121e30ac2af7fcb0302588197c0",
+                  1442260874,
+                  "",
+                  5244426,
+                  5244426,
+                  ImmutableList.of("docker.io/alpine:3.2")),
+            ImageSummary.create("91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c",
+                  1440102075,
+                  "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
+                  0,
+                  188333286,
+                  ImmutableList.of("docker.io/ubuntu:14.04", "docker.io/ubuntu:latest"))
       );
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c56d64ae/docker/src/test/resources/images.json
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/images.json b/docker/src/test/resources/images.json
index 41d4f12..63bec4f 100644
--- a/docker/src/test/resources/images.json
+++ b/docker/src/test/resources/images.json
@@ -1,42 +1,53 @@
 [
-  {
-    "Created": 1416827360,
-    "Id": "cbba6639a342646deed70d7ea6162fa2a0acea9300f911f4e014555fe37d3456",
-    "ParentId": "05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba",
-    "RepoTags": [
-      "test:latest"
-    ],
-    "Size": 0,
-    "VirtualSize": 808709069
-  },
-  {
-    "Created": 1416826851,
-    "Id": "e1e548b03259ae30ba12232b6c16ef5205cf71b0363848e78b0394e1ecba4f57",
-    "ParentId": "6f36bec79c7f184ceebf7000cfb7244c4bc9b397b6659ac7f420a53d114250d9",
-    "RepoTags": [
-      "<none>:<none>"
-    ],
-    "Size": 0,
-    "VirtualSize": 5609404
-  },
-  {
-    "Created": 1414247273,
-    "Id": "8201388d2b288539aab6aabf5d3b15ec269eba95c6baa9d6771f16540abf3a3f",
-    "ParentId": "4671e2c549c5b60063e349f520c801dc73b53d2226a5a8e5501845ebe94761ca",
-    "RepoTags": [
-      "dockerfile/java:openjdk-7-jdk"
-    ],
-    "Size": 0,
-    "VirtualSize": 755313702
-  },
-  {
-    "Created": 1414108439,
-    "Id": "5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5",
-    "ParentId": "22093c35d77bb609b9257ffb2640845ec05018e3d96cb939f68d0e19127f1723",
-    "RepoTags": [
-      "ubuntu:14.04"
-    ],
-    "Size": 0,
-    "VirtualSize": 199257566
-  }
+    {
+        "Created": 1442866547,
+        "Id": "d7057cb020844f245031d27b76cb18af05db1cc3a96a29fa7777af75f5ac91a3",
+        "Labels": null,
+        "ParentId": "cfa753dfea5e68a24366dfba16e6edf573daa447abf65bc11619c1a98a3aff54",
+        "RepoDigests": [],
+        "RepoTags": [
+            "docker.io/busybox:1.23.2",
+            "docker.io/busybox:latest"
+        ],
+        "Size": 0,
+        "VirtualSize": 1095501
+    },
+    {
+        "Created": 1442598293,
+        "Id": "633fcd11259e8d6bccfbb59a4086b95b0d0fb44edfc3912000ef1f70e8a7bfc6",
+        "Labels": null,
+        "ParentId": "b65c936b5fb601d680ed656b1ccf8ab857c0e5cb521043a005405c194e9a69f3",
+        "RepoDigests": [],
+        "RepoTags": [
+            "docker.io/busybox:ubuntu-14.04",
+            "jclouds:testTag"
+        ],
+        "Size": 0,
+        "VirtualSize": 5607885
+    },
+    {
+        "Created": 1442260874,
+        "Id": "f4fddc471ec22fc1f7d37768132f1753bc171121e30ac2af7fcb0302588197c0",
+        "Labels": null,
+        "ParentId": "",
+        "RepoDigests": [],
+        "RepoTags": [
+            "docker.io/alpine:3.2"
+        ],
+        "Size": 5244426,
+        "VirtualSize": 5244426
+    },
+    {
+        "Created": 1440102075,
+        "Id": "91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c",
+        "Labels": {},
+        "ParentId": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82",
+        "RepoDigests": [],
+        "RepoTags": [
+            "docker.io/ubuntu:14.04",
+            "docker.io/ubuntu:latest"
+        ],
+        "Size": 0,
+        "VirtualSize": 188333286
+    }
 ]
\ No newline at end of file