Repository: jclouds
Updated Branches:
  refs/heads/master a7e342422 -> 39f77ad3f


JCLOUDS-570: Fallback to the GetImageStrategy

If the TemplateBuilderImpl is given an imageId but the image can not be
found in the image cache, fallback to the GetImageStrategy to perform a
call to the provider to try to get it.

We've seen that in some cases images are not returned in the image list
but they actually exist in the provider. This fix won't make them
available when filtering by other properties such as the operating system,
etc, but at least will make them available if their id is known.


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

Branch: refs/heads/master
Commit: 39f77ad3f80efd7416f17a204aaa7b5b79629aa3
Parents: a7e3424
Author: Ignasi Barrera <[email protected]>
Authored: Thu Jun 5 19:13:04 2014 +0200
Committer: Ignasi Barrera <[email protected]>
Committed: Fri Jun 6 12:40:27 2014 +0200

----------------------------------------------------------------------
 .../compute/CloudSigmaTemplateBuilderImpl.java  |   5 +-
 .../internal/EC2TemplateBuilderImpl.java        |   6 +-
 .../ec2/compute/EC2TemplateBuilderTest.java     |   7 +-
 .../internal/EC2TemplateBuilderImplTest.java    |  56 ++---
 .../internal/VCloudTemplateBuilderImpl.java     |   5 +-
 .../domain/internal/TemplateBuilderImpl.java    |  39 ++-
 .../internal/TemplateBuilderImplTest.java       | 244 ++++++++++++-------
 .../ec2/compute/AWSEC2TemplateBuilderImpl.java  |   6 +-
 8 files changed, 219 insertions(+), 149 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/39f77ad3/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git 
a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderImpl.java
 
b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderImpl.java
index 31cef62..af38664 100644
--- 
a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderImpl.java
+++ 
b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderImpl.java
@@ -28,6 +28,7 @@ import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
 import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.strategy.GetImageStrategy;
 import org.jclouds.domain.Location;
 
 import com.google.common.base.Supplier;
@@ -40,7 +41,7 @@ public class CloudSigmaTemplateBuilderImpl extends 
TemplateBuilderImpl {
    public CloudSigmaTemplateBuilderImpl(@Memoized Supplier<Set<? extends 
Location>> locations,
                                         @Memoized Supplier<Set<? extends 
Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares,
                                         Supplier<Location> defaultLocation2, 
@Named("DEFAULT") Provider<TemplateOptions> optionsProvider,
-                                        @Named("DEFAULT") 
Provider<TemplateBuilder> defaultTemplateProvider) {
-      super(locations, images, hardwares, defaultLocation2, optionsProvider, 
defaultTemplateProvider);
+                                        @Named("DEFAULT") 
Provider<TemplateBuilder> defaultTemplateProvider, GetImageStrategy 
getImageStrategy) {
+      super(locations, images, hardwares, defaultLocation2, optionsProvider, 
defaultTemplateProvider, getImageStrategy);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/39f77ad3/apis/ec2/src/main/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git 
a/apis/ec2/src/main/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImpl.java
 
b/apis/ec2/src/main/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImpl.java
index 04ce9c0..63df6af 100644
--- 
a/apis/ec2/src/main/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImpl.java
+++ 
b/apis/ec2/src/main/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImpl.java
@@ -32,6 +32,7 @@ import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
 import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.strategy.GetImageStrategy;
 import org.jclouds.domain.Location;
 import org.jclouds.ec2.compute.domain.RegionAndName;
 import org.jclouds.util.Throwables2;
@@ -54,8 +55,9 @@ public class EC2TemplateBuilderImpl extends 
TemplateBuilderImpl {
    protected EC2TemplateBuilderImpl(@Memoized Supplier<Set<? extends 
Location>> locations,
          @Memoized Supplier<Set<? extends Image>> images, @Memoized 
Supplier<Set<? extends Hardware>> sizes,
          Supplier<Location> defaultLocation, @Named("DEFAULT") 
Provider<TemplateOptions> optionsProvider,
-         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider, 
Supplier<LoadingCache<RegionAndName, ? extends Image>> imageMap) {
-      super(locations, images, sizes, defaultLocation, optionsProvider, 
defaultTemplateProvider);
+         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider, 
GetImageStrategy getImageStrategy,
+         Supplier<LoadingCache<RegionAndName, ? extends Image>> imageMap) {
+      super(locations, images, sizes, defaultLocation, optionsProvider, 
defaultTemplateProvider, getImageStrategy);
       this.lazyImageCache = imageMap;
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/39f77ad3/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2TemplateBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2TemplateBuilderTest.java 
b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2TemplateBuilderTest.java
index 8dd6167..6482283 100644
--- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2TemplateBuilderTest.java
+++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2TemplateBuilderTest.java
@@ -48,6 +48,7 @@ import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.strategy.GetImageStrategy;
 import org.jclouds.domain.Location;
 import org.jclouds.domain.LocationBuilder;
 import org.jclouds.domain.LocationScope;
@@ -212,11 +213,13 @@ public class EC2TemplateBuilderTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(defaultOptions);
 
       replay(optionsProvider);
       replay(templateBuilderProvider);
+      replay(getImageStrategy);
       Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends 
Location>> ofInstance(ImmutableSet
                .<Location> of(location));
       Supplier<Set<? extends Hardware>> sizes = Suppliers.<Set<? extends 
Hardware>> ofInstance(ImmutableSet
@@ -225,10 +228,10 @@ public class EC2TemplateBuilderTest {
                              m2_4xlarge().build(), g2_2xlarge().build(), 
CC1_4XLARGE));
 
       return new EC2TemplateBuilderImpl(locations, images, sizes, 
Suppliers.ofInstance(location), optionsProvider,
-               templateBuilderProvider, imageCache) {
+               templateBuilderProvider, getImageStrategy, imageCache) {
       };
    }
-   
+
    Function<ComputeMetadata, String> indexer() {
       return new Function<ComputeMetadata, String>() {
          @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/39f77ad3/apis/ec2/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java
----------------------------------------------------------------------
diff --git 
a/apis/ec2/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java
 
b/apis/ec2/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java
index 7441110..386b5ab 100644
--- 
a/apis/ec2/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java
+++ 
b/apis/ec2/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java
@@ -37,6 +37,7 @@ import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
 import org.jclouds.compute.domain.internal.TemplateBuilderImplTest;
 import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.strategy.GetImageStrategy;
 import org.jclouds.domain.Location;
 import org.jclouds.ec2.compute.domain.RegionAndName;
 import org.jclouds.ec2.compute.functions.ImagesToRegionAndIdMap;
@@ -68,7 +69,7 @@ public class EC2TemplateBuilderImplTest extends 
TemplateBuilderImplTest {
    protected EC2TemplateBuilderImpl createTemplateBuilder(final Image 
knownImage,
          @Memoized Supplier<Set<? extends Location>> locations, @Memoized 
final Supplier<Set<? extends Image>> images,
          @Memoized Supplier<Set<? extends Hardware>> sizes, Location 
defaultLocation,
-         Provider<TemplateOptions> optionsProvider, Provider<TemplateBuilder> 
templateBuilderProvider) {
+         Provider<TemplateOptions> optionsProvider, Provider<TemplateBuilder> 
templateBuilderProvider, GetImageStrategy getImageStrategy) {
 
       LoadingCache<RegionAndName, ? extends Image> imageMap;
       if (knownImage != null) {
@@ -88,7 +89,7 @@ public class EC2TemplateBuilderImplTest extends 
TemplateBuilderImplTest {
       }
 
       return new EC2TemplateBuilderImpl(locations, images, sizes, 
Suppliers.ofInstance(defaultLocation),
-            optionsProvider, templateBuilderProvider, 
Suppliers.<LoadingCache<RegionAndName, ? extends Image>>ofInstance(imageMap));
+            optionsProvider, templateBuilderProvider, getImageStrategy, 
Suppliers.<LoadingCache<RegionAndName, ? extends Image>>ofInstance(imageMap));
    }
 
    @Override
@@ -118,6 +119,7 @@ public class EC2TemplateBuilderImplTest extends 
TemplateBuilderImplTest {
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
       Image knownImage = createMock(Image.class);
       OperatingSystem os = createMock(OperatingSystem.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(defaultOptions);
 
@@ -137,22 +139,14 @@ public class EC2TemplateBuilderImplTest extends 
TemplateBuilderImplTest {
       expect(os.getArch()).andReturn("paravirtual").atLeastOnce();
       expect(os.is64Bit()).andReturn(false).atLeastOnce();
 
-      replay(knownImage);
-      replay(os);
-      replay(defaultOptions);
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(knownImage, os, defaultOptions, optionsProvider, 
templateBuilderProvider, getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(knownImage, 
locations, images, sizes, region,
-            optionsProvider, templateBuilderProvider);
+            optionsProvider, templateBuilderProvider, getImageStrategy);
 
       assertEquals(template.imageId("us-east-1/ami").build().getImage(), 
knownImage);
 
-      verify(knownImage);
-      verify(os);
-      verify(defaultOptions);
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+      verify(knownImage, os, defaultOptions, optionsProvider, 
templateBuilderProvider, getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -169,29 +163,25 @@ public class EC2TemplateBuilderImplTest extends 
TemplateBuilderImplTest {
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
       Image knownImage = createMock(Image.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
       expect(knownImage.getId()).andReturn("region/ami").anyTimes();
       expect(knownImage.getProviderId()).andReturn("ami").anyTimes();
       expect(knownImage.getLocation()).andReturn(region).anyTimes();
 
       expect(optionsProvider.get()).andReturn(defaultOptions);
 
-      replay(knownImage);
-      replay(defaultOptions);
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(knownImage,  defaultOptions, optionsProvider, 
templateBuilderProvider, getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(knownImage, 
locations, images, sizes, region,
-            optionsProvider, templateBuilderProvider);
+            optionsProvider, templateBuilderProvider, getImageStrategy);
       try {
          template.imageId("ami").build();
          fail("Expected IllegalArgumentException");
       } catch (IllegalArgumentException e) {
 
       }
-      verify(knownImage);
-      verify(defaultOptions);
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+
+      verify(knownImage,  defaultOptions, optionsProvider, 
templateBuilderProvider, getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -208,6 +198,7 @@ public class EC2TemplateBuilderImplTest extends 
TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
       Image knownImage = createMock(Image.class);
       expect(knownImage.getId()).andReturn("region/ami").anyTimes();
       expect(knownImage.getProviderId()).andReturn("ami").anyTimes();
@@ -216,22 +207,21 @@ public class EC2TemplateBuilderImplTest extends 
TemplateBuilderImplTest {
       expect(defaultLocation.getId()).andReturn("region");
       expect(optionsProvider.get()).andReturn(defaultOptions);
 
-      replay(knownImage);
-      replay(defaultOptions);
-      replay(defaultLocation);
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(knownImage,  defaultOptions, defaultLocation, optionsProvider, 
templateBuilderProvider, getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(knownImage, 
locations, images, sizes, defaultLocation,
-            optionsProvider, templateBuilderProvider);
+            optionsProvider, templateBuilderProvider, getImageStrategy);
 
       assertEquals(template.imageId("region/bad").build().getImage(), 
knownImage);
 
-      verify(knownImage);
-      verify(defaultOptions);
-      verify(defaultLocation);
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+      verify(knownImage,  defaultOptions, defaultLocation, optionsProvider, 
templateBuilderProvider, getImageStrategy);
    }
 
+   // The EC2 provider already overrides the getImage method so this test is 
not useful for EC2
+   @Override
+   @Test(enabled = false)
+   public void testFindImageWithIdDefaultToGetImageStrategy() {
+
+   }
+   
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/39f77ad3/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/internal/VCloudTemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git 
a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/internal/VCloudTemplateBuilderImpl.java
 
b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/internal/VCloudTemplateBuilderImpl.java
index 49a1f78..73b5f40 100644
--- 
a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/internal/VCloudTemplateBuilderImpl.java
+++ 
b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/internal/VCloudTemplateBuilderImpl.java
@@ -28,6 +28,7 @@ import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
 import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.strategy.GetImageStrategy;
 import org.jclouds.domain.Location;
 
 import com.google.common.base.Supplier;
@@ -42,7 +43,7 @@ public class VCloudTemplateBuilderImpl extends 
TemplateBuilderImpl {
    protected VCloudTemplateBuilderImpl(@Memoized Supplier<Set<? extends 
Location>> locations,
          @Memoized Supplier<Set<? extends Image>> images, @Memoized 
Supplier<Set<? extends Hardware>> sizes,
          Supplier<Location> defaultLocation, @Named("DEFAULT") 
Provider<TemplateOptions> optionsProvider,
-         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider) {
-      super(locations, images, sizes, defaultLocation, optionsProvider, 
defaultTemplateProvider);
+         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider, 
GetImageStrategy getImageStrategy) {
+      super(locations, images, sizes, defaultLocation, optionsProvider, 
defaultTemplateProvider, getImageStrategy);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/39f77ad3/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git 
a/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
 
b/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
index f348b19..070e8c7 100644
--- 
a/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
+++ 
b/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
@@ -53,6 +53,7 @@ import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.domain.TemplateBuilderSpec;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.compute.reference.ComputeServiceConstants;
+import org.jclouds.compute.strategy.GetImageStrategy;
 import org.jclouds.domain.Location;
 import org.jclouds.logging.Logger;
 
@@ -60,6 +61,7 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.base.Supplier;
@@ -85,6 +87,7 @@ public class TemplateBuilderImpl implements TemplateBuilder {
    protected final Supplier<Location> defaultLocation;
    protected final Provider<TemplateOptions> optionsProvider;
    protected final Provider<TemplateBuilder> defaultTemplateProvider;
+   protected final GetImageStrategy getImageStrategy;
 
    @VisibleForTesting
    protected Location location;
@@ -133,13 +136,14 @@ public class TemplateBuilderImpl implements 
TemplateBuilder {
    protected TemplateBuilderImpl(@Memoized Supplier<Set<? extends Location>> 
locations,
          @Memoized Supplier<Set<? extends Image>> images, @Memoized 
Supplier<Set<? extends Hardware>> hardwares,
          Supplier<Location> defaultLocation2, @Named("DEFAULT") 
Provider<TemplateOptions> optionsProvider,
-         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider) {
-      this.locations = locations;
-      this.images = images;
-      this.hardwares = hardwares;
-      this.defaultLocation = defaultLocation2;
-      this.optionsProvider = optionsProvider;
-      this.defaultTemplateProvider = defaultTemplateProvider;
+         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider, 
GetImageStrategy getImageStrategy) {
+      this.locations = checkNotNull(locations, "locations");
+      this.images = checkNotNull(images, "locations");
+      this.hardwares = checkNotNull(hardwares, "hardwares");
+      this.defaultLocation = checkNotNull(defaultLocation2, 
"defaultLocation2");
+      this.optionsProvider = checkNotNull(optionsProvider, "optionsProvider");
+      this.defaultTemplateProvider = checkNotNull(defaultTemplateProvider, 
"defaultTemplateProvider");
+      this.getImageStrategy = checkNotNull(getImageStrategy, 
"getImageStrategy");
    }
 
    static Predicate<Hardware> supportsImagesPredicate(final Iterable<? extends 
Image> images) {
@@ -727,12 +731,21 @@ public class TemplateBuilderImpl implements 
TemplateBuilder {
    }
 
    private Image findImageWithId(Set<? extends Image> images) {
-      Image image;
-      // TODO: switch to GetImageStrategy in version 1.5
-      image = tryFind(images, idPredicate).orNull();
-      if (image == null)
-         throwNoSuchElementExceptionAfterLoggingImageIds(format("%s not 
found", idPredicate), images);
-      return image;
+      // Try find the image in the cache and fallback to the GetImageStrategy
+      // see https://issues.apache.org/jira/browse/JCLOUDS-570
+      Optional<? extends Image> image = tryFind(images, idPredicate);
+      if (!image.isPresent()) {
+         logger.warn("Image %s not found in the image cache. Trying to get it 
directly...", imageId);
+         // Note that this might generate make a call to the provider instead 
of using a cache, but
+         // this will be executed rarely, only when an image is not present in 
the image list but
+         // it actually exists in the provider. It shouldn't be an expensive 
call so using a cache just for
+         // this corner case is overkill.
+         image = Optional.fromNullable(getImageStrategy.getImage(imageId));
+         if (!image.isPresent()) {
+            throwNoSuchElementExceptionAfterLoggingImageIds(format("%s not 
found", idPredicate), images);
+         }
+      }
+      return image.get();
    }
 
    private Hardware findHardwareWithId(Set<? extends Hardware> 
hardwaresToSearch) {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/39f77ad3/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java
----------------------------------------------------------------------
diff --git 
a/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java
 
b/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java
index 5f44724..5f93b9f 100644
--- 
a/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java
+++ 
b/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.compute.domain.internal;
 
+import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
@@ -30,6 +31,7 @@ import java.util.Set;
 
 import javax.inject.Provider;
 
+import org.easymock.EasyMock;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.HardwareBuilder;
 import org.jclouds.compute.domain.Image;
@@ -43,6 +45,7 @@ import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.domain.Volume;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.compute.predicates.ImagePredicates;
+import org.jclouds.compute.strategy.GetImageStrategy;
 import org.jclouds.domain.Location;
 import org.jclouds.domain.LocationBuilder;
 import org.jclouds.domain.LocationScope;
@@ -135,15 +138,15 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
-
-      replay(defaultTemplate, optionsProvider, templateBuilderProvider);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
       assert template.locationPredicate.apply(hardware);
 
-      verify(defaultTemplate, optionsProvider, templateBuilderProvider);
+      verify(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
    
    /**
@@ -165,16 +168,17 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
-      replay(defaultTemplate, optionsProvider, templateBuilderProvider);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
inputImages, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
       template = templateBuilderPerTestCustomizer.apply(template);
 
       assertEquals(template.resolveImage(hardware, inputImages.get()), 
expectedBest);
 
-      verify(defaultTemplate, optionsProvider, templateBuilderProvider);
+      verify(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
 
    protected void doTestResolveImages(Supplier<Set<? extends Image>> 
inputImages, Image expectedBest) {
@@ -293,17 +297,18 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(new TemplateOptions());
 
-      replay(defaultTemplate, optionsProvider, templateBuilderProvider);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       
assertEquals(template.smallest().osArchMatches("X86_32").build().getImage(), 
image);
 
-      verify(defaultTemplate, optionsProvider, templateBuilderProvider);
+      verify(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -322,21 +327,18 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(new TemplateOptions());
 
-      replay(defaultTemplate);
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       template.imageId(getProviderFormatId("imageId")).build();
 
-      verify(defaultTemplate);
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+      verify(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -355,17 +357,18 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(new TemplateOptions());
 
-      replay(defaultTemplate, optionsProvider, templateBuilderProvider);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       template.imageId(getProviderFormatId("imageId")).build();
 
-      verify(defaultTemplate, optionsProvider, templateBuilderProvider);
+      verify(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
    }
 
@@ -385,20 +388,21 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(new TemplateOptions());
       
-      replay(defaultTemplate, optionsProvider, templateBuilderProvider);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
       
       TemplateBuilderImpl template = createTemplateBuilder(image, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
       try {
          template.imageId(getProviderFormatId("imageId")).build();
          fail("Expected NoSuchElementException");
       } catch (NoSuchElementException e) {
          // make sure message is succinct
          assertEquals(e.getMessage(), "no hardware profiles support images 
matching params: idEquals(differentImageId)");
-         verify(defaultTemplate, optionsProvider, templateBuilderProvider);
+         verify(defaultTemplate, optionsProvider, templateBuilderProvider, 
getImageStrategy);
       }
    }
 
@@ -417,26 +421,21 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(templateBuilderProvider.get()).andReturn(defaultTemplate);
       expect(defaultTemplate.options(from)).andReturn(defaultTemplate);
       expect(defaultTemplate.build()).andReturn(null);
       expect(optionsProvider.get()).andReturn(from).atLeastOnce();
 
-      replay(defaultTemplate);
-      replay(defaultLocation);
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(defaultTemplate, defaultLocation, optionsProvider, 
templateBuilderProvider, getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, defaultLocation,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       template.options(options).build();
 
-      verify(defaultTemplate);
-      verify(defaultLocation);
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+      verify(defaultTemplate, defaultLocation, optionsProvider, 
templateBuilderProvider, getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -453,32 +452,27 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(templateBuilderProvider.get()).andReturn(defaultTemplate);
       expect(defaultTemplate.build()).andReturn(null);
 
-      replay(defaultTemplate);
-      replay(defaultLocation);
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(defaultTemplate, defaultLocation, optionsProvider, 
templateBuilderProvider, getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, defaultLocation,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       template.build();
 
-      verify(defaultTemplate);
-      verify(defaultLocation);
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+      verify(defaultTemplate, defaultLocation, optionsProvider, 
templateBuilderProvider, getImageStrategy);
    }
 
    protected TemplateBuilderImpl createTemplateBuilder(Image knownImage, 
Supplier<Set<? extends Location>> locations,
             Supplier<Set<? extends Image>> images, Supplier<Set<? extends 
Hardware>> hardwares,
             Location defaultLocation, Provider<TemplateOptions> 
optionsProvider,
-            Provider<TemplateBuilder> templateBuilderProvider) {
+            Provider<TemplateBuilder> templateBuilderProvider, 
GetImageStrategy getImageStrategy) {
       TemplateBuilderImpl template = new TemplateBuilderImpl(locations, 
images, hardwares, Suppliers
-               .ofInstance(defaultLocation), optionsProvider, 
templateBuilderProvider);
+               .ofInstance(defaultLocation), optionsProvider, 
templateBuilderProvider, getImageStrategy);
       return template;
    }
 
@@ -499,16 +493,17 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
       expect(optionsProvider.get()).andReturn(from).atLeastOnce();
 
-      replay(defaultOptions, optionsProvider, templateBuilderProvider);
+      replay(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       
assertEquals(template.imageId(image.getId()).locationId(provider.getId()).build().getLocation(),
 region);
 
-      verify(defaultOptions, optionsProvider, templateBuilderProvider);
+      verify(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -522,13 +517,12 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
-      replay(defaultOptions);
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       try {
          template.imageId("foo").locationId("location").build();
@@ -537,9 +531,7 @@ public class TemplateBuilderImplTest {
 
       }
 
-      verify(defaultOptions);
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+      verify(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -554,14 +546,14 @@ public class TemplateBuilderImplTest {
                .<Hardware> of());
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(from).atLeastOnce();
 
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(optionsProvider, templateBuilderProvider, getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       try {
          
template.imageId("foo").options(provideTemplateOptions()).locationId("location").build();
@@ -570,8 +562,7 @@ public class TemplateBuilderImplTest {
 
       }
 
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+      verify(optionsProvider, templateBuilderProvider, getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -584,13 +575,14 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(defaultOptions);
 
-      replay(defaultOptions, optionsProvider, templateBuilderProvider);
+      replay(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       try {
          template.os64Bit(true).build();
@@ -599,7 +591,7 @@ public class TemplateBuilderImplTest {
          assertEquals(e.getMessage(), "no images present!");
       }
 
-      verify(defaultOptions, optionsProvider, templateBuilderProvider);
+      verify(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -612,13 +604,14 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(defaultOptions);
 
-      replay(defaultOptions, optionsProvider, templateBuilderProvider);
+      replay(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       try {
          template.os64Bit(true).build();
@@ -627,7 +620,7 @@ public class TemplateBuilderImplTest {
          assertEquals(e.getMessage(), "no hardware profiles present!");
       }
 
-      verify(defaultOptions, optionsProvider, templateBuilderProvider);
+      verify(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
 
    @SuppressWarnings("unchecked")
@@ -641,13 +634,15 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(defaultOptions);
+      
expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
 
-      replay(defaultOptions, optionsProvider, templateBuilderProvider);
+      replay(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       try {
          template.imageId("region/imageId2").build();
@@ -671,13 +666,14 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
       TemplateOptions defaultOptions = createMock(TemplateOptions.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(defaultOptions);
 
-      replay(defaultOptions, optionsProvider, templateBuilderProvider);
+      replay(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, region,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       try {
          template.imageDescriptionMatches("notDescription").build();
@@ -687,7 +683,7 @@ public class TemplateBuilderImplTest {
          assertEquals(e.getMessage(), "no image matched predicate: 
Predicates.and(nullEqualToIsParentOrIsGrandparentOfCurrentLocation(),imageDescription(notDescription))");
       }
 
-      verify(defaultOptions, optionsProvider, templateBuilderProvider);
+      verify(defaultOptions, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
 
    protected TemplateOptions provideTemplateOptions() {
@@ -706,13 +702,15 @@ public class TemplateBuilderImplTest {
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       TemplateOptions from = provideTemplateOptions();
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
       expect(optionsProvider.get()).andReturn(from);
+      
expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
 
-      replay(defaultLocation, optionsProvider, templateBuilderProvider);
+      replay(defaultLocation, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, defaultLocation,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       try {
          
template.imageId("region/ami").options(provideTemplateOptions()).build();
@@ -735,13 +733,12 @@ public class TemplateBuilderImplTest {
       Location defaultLocation = createMock(Location.class);
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
-      replay(defaultLocation);
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(defaultLocation, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, defaultLocation,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
       template.imageDescriptionMatches("imageDescriptionMatches");
       template.imageNameMatches("imageNameMatches");
@@ -767,9 +764,69 @@ public class TemplateBuilderImplTest {
       assertEquals(template.osFamily, null);
       assertEquals(template.imageId, "myid");
 
-      verify(defaultLocation);
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+      verify(defaultLocation, optionsProvider, templateBuilderProvider, 
getImageStrategy);
+   }
+
+   @Test
+   public void testFindImageWithIdDefaultToGetImageStrategy() {
+      final Supplier<Set<? extends Location>> locations = Suppliers.<Set<? 
extends Location>> ofInstance(ImmutableSet
+            .<Location> of(region));
+      final Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends 
Image>> ofInstance(ImmutableSet
+            .<Image> of(
+                  new ImageBuilder()
+                        .ids("Ubuntu 11.04 x64")
+                        .name("Ubuntu 11.04 x64")
+                        .description("Ubuntu 11.04 x64")
+                        .location(region)
+                        .status(Status.AVAILABLE)
+                        .operatingSystem(
+                              OperatingSystem.builder().name("Ubuntu 11.04 
x64").description("Ubuntu 11.04 x64")
+                                    
.is64Bit(true).version("11.04").family(OsFamily.UBUNTU).build()).build(),
+                  new ImageBuilder()
+                        .ids("Ubuntu 11.04 64-bit")
+                        .name("Ubuntu 11.04 64-bit")
+                        .description("Ubuntu 11.04 64-bit")
+                        .location(region)
+                        .status(Status.AVAILABLE)
+                        .operatingSystem(
+                              OperatingSystem.builder().name("Ubuntu 11.04 
64-bit").description("Ubuntu 11.04 64-bit")
+                                    
.is64Bit(true).version("11.04").family(OsFamily.UBUNTU).build()).build()));
+
+      final Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? 
extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(
+                  new HardwareBuilder()
+                        
.ids(String.format("datacenter(%s)platform(%s)cpuCores(%d)memorySizeMB(%d)diskSizeGB(%d)",
+                              "Falkenberg", "Xen", 1, 512, 5)).ram(512)
+                        .processors(ImmutableList.of(new Processor(1, 1.0)))
+                        .volumes(ImmutableList.<Volume> of(new 
VolumeImpl((float) 5, true, true))).hypervisor("Xen")
+                        .location(region)
+                        
.supportsImage(ImagePredicates.idEquals(image.getId())).build()));
+
+      final Provider<TemplateOptions> optionsProvider = new 
Provider<TemplateOptions>() {
+         @Override
+         public TemplateOptions get() {
+            return new TemplateOptions();
+         }
+      };
+
+      final GetImageStrategy getImageStrategy = 
createMock(GetImageStrategy.class);
+
+      expect(getImageStrategy.getImage(image.getId())).andReturn(image);
+      replay(getImageStrategy);
+
+      Provider<TemplateBuilder> templateBuilderProvider = new 
Provider<TemplateBuilder>() {
+         @Override
+         public TemplateBuilder get() {
+            return createTemplateBuilder(null, locations, images, hardwares, 
region, optionsProvider, this, getImageStrategy);
+         }
+      };
+
+      // Note that the image provided is not in the image list, but it is the 
one returned by the GetImagestrategy
+      TemplateBuilder templateBuilder = 
templateBuilderProvider.get().imageId(image.getId());
+      Template template = templateBuilder.build();
+
+      assertEquals(template.getImage().getId(), image.getId());
+      verify(getImageStrategy);
    }
    
    @SuppressWarnings("unchecked")
@@ -783,13 +840,12 @@ public class TemplateBuilderImplTest {
       Location defaultLocation = createMock(Location.class);
       Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
       Provider<TemplateBuilder> templateBuilderProvider = 
createMock(Provider.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
 
-      replay(defaultLocation);
-      replay(optionsProvider);
-      replay(templateBuilderProvider);
+      replay(defaultLocation, optionsProvider, templateBuilderProvider, 
getImageStrategy);
 
       TemplateBuilderImpl template = createTemplateBuilder(null, locations, 
images, hardwares, defaultLocation,
-               optionsProvider, templateBuilderProvider);
+               optionsProvider, templateBuilderProvider, getImageStrategy);
 
 
       template.hypervisorMatches("OpenVZ");
@@ -802,14 +858,11 @@ public class TemplateBuilderImplTest {
       assertEquals(template.hypervisor, null);
 
 
-      verify(defaultLocation);
-      verify(optionsProvider);
-      verify(templateBuilderProvider);
+      verify(defaultLocation, optionsProvider, templateBuilderProvider, 
getImageStrategy);
    }
 
    @Test
    public void testMatchesHardwareWithIdPredicate() {
-
       final Supplier<Set<? extends Location>> locations = Suppliers.<Set<? 
extends Location>> ofInstance(ImmutableSet
             .<Location> of(region));
       final Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends 
Image>> ofInstance(ImmutableSet
@@ -858,11 +911,14 @@ public class TemplateBuilderImplTest {
          }
 
       };
+
+      final GetImageStrategy getImageStrategy = 
createMock(GetImageStrategy.class);
+
       Provider<TemplateBuilder> templateBuilderProvider = new 
Provider<TemplateBuilder>() {
 
          @Override
          public TemplateBuilder get() {
-            return createTemplateBuilder(null, locations, images, hardwares, 
region, optionsProvider, this);
+            return createTemplateBuilder(null, locations, images, hardwares, 
region, optionsProvider, this, getImageStrategy);
          }
 
       };
@@ -875,13 +931,11 @@ public class TemplateBuilderImplTest {
       Template template = templateBuilder.build();
       assertEquals(template.getHardware().getHypervisor(), "OpenVZ");
       assertEquals(template.getImage().getId(), "Ubuntu 11.04 64-bit");
-
    }
    
 
    @Test
    public void testImageLocationNonDefault() {
-
       final Supplier<Set<? extends Location>> locations = Suppliers.<Set<? 
extends Location>> ofInstance(ImmutableSet
             .<Location> of(region));
       final Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends 
Image>> ofInstance(ImmutableSet
@@ -912,11 +966,14 @@ public class TemplateBuilderImplTest {
          }
 
       };
+
+      final GetImageStrategy getImageStrategy = 
createMock(GetImageStrategy.class);
+
       Provider<TemplateBuilder> templateBuilderProvider = new 
Provider<TemplateBuilder>() {
 
          @Override
          public TemplateBuilder get() {
-            return createTemplateBuilder(null, locations, images, hardwares, 
region, optionsProvider, this);
+            return createTemplateBuilder(null, locations, images, hardwares, 
region, optionsProvider, this, getImageStrategy);
          }
 
       };
@@ -927,12 +984,10 @@ public class TemplateBuilderImplTest {
 
       Template template = templateBuilder.build();
       assertEquals(template.getLocation().getId(), "us-east-2");
-
    }
 
    @Test
    public void testFromSpecWithLoginUser() {
-
       final Supplier<Set<? extends Location>> locations = Suppliers.<Set<? 
extends Location>> ofInstance(ImmutableSet
             .<Location> of(region));
       final Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends 
Image>> ofInstance(ImmutableSet
@@ -963,11 +1018,14 @@ public class TemplateBuilderImplTest {
          }
 
       };
+
+      final GetImageStrategy getImageStrategy = 
createMock(GetImageStrategy.class);
+
       Provider<TemplateBuilder> templateBuilderProvider = new 
Provider<TemplateBuilder>() {
 
          @Override
          public TemplateBuilder get() {
-            return createTemplateBuilder(null, locations, images, hardwares, 
region, optionsProvider, this);
+            return createTemplateBuilder(null, locations, images, hardwares, 
region, optionsProvider, this, getImageStrategy);
          }
 
       };

http://git-wip-us.apache.org/repos/asf/jclouds/blob/39f77ad3/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
index b3adb8b..c059044 100644
--- 
a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
+++ 
b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java
@@ -27,6 +27,7 @@ import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.strategy.GetImageStrategy;
 import org.jclouds.domain.Location;
 import org.jclouds.ec2.compute.domain.RegionAndName;
 import org.jclouds.ec2.compute.internal.EC2TemplateBuilderImpl;
@@ -44,8 +45,9 @@ public class AWSEC2TemplateBuilderImpl extends 
EC2TemplateBuilderImpl {
    protected AWSEC2TemplateBuilderImpl(@Memoized Supplier<Set<? extends 
Location>> locations,
          @Memoized Supplier<Set<? extends Image>> images, @Memoized 
Supplier<Set<? extends Hardware>> sizes,
          Supplier<Location> defaultLocation, @Named("DEFAULT") 
Provider<TemplateOptions> optionsProvider,
-         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider, 
Supplier<LoadingCache<RegionAndName, ? extends Image>> imageMap) {
-      super(locations, images, sizes, defaultLocation, optionsProvider, 
defaultTemplateProvider, imageMap);
+         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider, 
GetImageStrategy getImageStrategy,
+         Supplier<LoadingCache<RegionAndName, ? extends Image>> imageMap) {
+      super(locations, images, sizes, defaultLocation, optionsProvider, 
defaultTemplateProvider, getImageStrategy, imageMap);
    }
 
 }

Reply via email to