ImageId can be image name or id and will pull from hub
diff --git a/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java b/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
index a1c9cae..935e47e 100644
--- a/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
+++ b/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
@@ -51,6 +51,7 @@
import org.jclouds.docker.domain.HostConfig;
import org.jclouds.docker.domain.Image;
import org.jclouds.docker.domain.ImageSummary;
+import org.jclouds.docker.options.CreateImageOptions;
import org.jclouds.docker.options.ListContainerOptions;
import org.jclouds.docker.options.RemoveContainerOptions;
import org.jclouds.domain.Location;
@@ -233,13 +234,32 @@
}
@Override
- public Image getImage(final String imageId) {
- // less efficient than just inspectImage but listImages return repoTags
- return find(listImages(), new Predicate<Image>() {
+ public Image getImage(final String imageIdOrName) {
+ checkNotNull(imageIdOrName);
+ if (imageIdOrName.startsWith("sha256")) {
+ // less efficient than just inspectImage but listImages return repoTags
+ return find(listImages(), new Predicate<Image>() {
+ @Override
+ public boolean apply(Image input) {
+ // Only attempt match on id as we should try to pull again anyway if using name
+ return input.id().equals(imageIdOrName);
+ }
+ }, null);
+ }
+ // Image is not cached or getting image by name so try to pull it
+ api.getImageApi().createImage(CreateImageOptions.Builder.fromImage(imageIdOrName));
+
+ // as above this ensure repotags are returned
+ return find(listImages(), new Predicate<Image>() {
@Override
public boolean apply(Image input) {
- return input.id().equals(imageId);
+ for (String tag : input.repoTags()) {
+ if (tag.equals(imageIdOrName) || tag.equals(imageIdOrName + ":latest")) {
+ return true;
+ }
+ }
+ return false;
}
}, null);
}
diff --git a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
index 9aae9bf..7db6ea2 100644
--- a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
@@ -19,10 +19,19 @@
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+
import java.util.Properties;
import java.util.Random;
import org.jclouds.compute.ComputeService;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+
import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.Template;
@@ -32,19 +41,12 @@
import org.jclouds.docker.compute.strategy.DockerComputeServiceAdapter;
import org.jclouds.docker.domain.Container;
import org.jclouds.docker.domain.Image;
-import org.jclouds.docker.options.CreateImageOptions;
import org.jclouds.docker.options.DeleteImageOptions;
import org.jclouds.sshj.config.SshjSshClientModule;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-
@Test(groups = "live", singleThreaded = true, testName = "DockerComputeServiceAdapterLiveTest")
public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest {
@@ -56,17 +58,13 @@
private TemplateBuilder templateBuilder;
private ComputeService computeService;
private NodeAndInitialCredentials<Container> guest;
+ private static final String CHUANWEN_COWSAY = "chuanwen/cowsay";
@BeforeClass
protected void init() {
super.initialize();
String imageName = SSHABLE_IMAGE + ":" + SSHABLE_IMAGE_TAG;
- Image image = api.getImageApi().inspectImage(imageName);
- if (image == null) {
- CreateImageOptions options = CreateImageOptions.Builder.fromImage(SSHABLE_IMAGE).tag(SSHABLE_IMAGE_TAG);
- api.getImageApi().createImage(options);
- }
- defaultImage = api.getImageApi().inspectImage(imageName);
+ defaultImage = adapter.getImage(imageName);
assertNotNull(defaultImage);
}
@@ -108,9 +106,38 @@
if (defaultImage != null) {
api.getImageApi().deleteImage(defaultImage.id(), DeleteImageOptions.Builder.force(true));
}
+ if (api.getImageApi().inspectImage(CHUANWEN_COWSAY) != null) {
+ api.getImageApi().deleteImage(CHUANWEN_COWSAY);
+ }
super.tearDown();
}
+ public void testGetImageNotHiddenByCache() {
+
+ //Ensure image to be tested is unknown to jclouds and docker and that cache is warm
+ assertNull(findImageFromListImages(CHUANWEN_COWSAY));
+ assertNull(api.getImageApi().inspectImage(CHUANWEN_COWSAY));
+
+ // Get new image
+ adapter.getImage(CHUANWEN_COWSAY);
+
+ assertNotNull(findImageFromListImages(CHUANWEN_COWSAY), "New image is not available from listImages presumably due to caching");
+ }
+
+ private Image findImageFromListImages(final String image) {
+ return Iterables.find(adapter.listImages(), new Predicate<Image>() {
+ @Override
+ public boolean apply(Image input) {
+ for (String tag : input.repoTags()) {
+ if (tag.equals(image) || tag.equals(CHUANWEN_COWSAY + ":latest")) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }, null);
+ }
+
@Override
protected Iterable<Module> setupModules() {
return ImmutableSet.<Module>of(getLoggingModule(), new SshjSshClientModule());
diff --git a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceLiveTest.java b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceLiveTest.java
index 1e024e4..d02e215 100644
--- a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceLiveTest.java
@@ -100,13 +100,7 @@
client = view.getComputeService();
String imageName = SSHABLE_IMAGE + ":" + SSHABLE_IMAGE_TAG;
- org.jclouds.docker.domain.Image image = imageApi().inspectImage(imageName);
- if (image == null) {
- CreateImageOptions options = CreateImageOptions.Builder.fromImage(SSHABLE_IMAGE).tag(SSHABLE_IMAGE_TAG);
- imageApi().createImage(options);
- }
- image = imageApi().inspectImage(imageName);
- defaultImage = client.getImage(image.id());
+ defaultImage = client.getImage(imageName);
assertNotNull(defaultImage);
}