Repository: jclouds Updated Branches: refs/heads/master 0f6ab3944 -> 40f31786c
http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java b/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java index 868e726..8b5a954 100644 --- a/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java +++ b/core/src/test/java/org/jclouds/rest/suppliers/MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest.java @@ -21,22 +21,26 @@ import static com.google.common.util.concurrent.Atomics.newReference; import static org.testng.Assert.assertEquals; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.SetAndThrowAuthorizationExceptionSupplierBackedLoader; import org.testng.annotations.Test; +import com.google.common.base.Optional; import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.common.util.concurrent.UncheckedExecutionException; +import com.google.common.util.concurrent.Uninterruptibles; @Test(groups = "unit", testName = "MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest") public class MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest { @Test public void testLoaderNormal() { AtomicReference<AuthorizationException> authException = newReference(); - assertEquals(new SetAndThrowAuthorizationExceptionSupplierBackedLoader<String>(ofInstance("foo"), - authException).load("KEY").get(), "foo"); + assertEquals(new SetAndThrowAuthorizationExceptionSupplierBackedLoader<String>(ofInstance("foo"), authException, new ValueLoadedCallback.NoOpCallback<String>()).load("KEY").get(), "foo"); assertEquals(authException.get(), null); } @@ -48,7 +52,7 @@ public class MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest { public String get() { throw new AuthorizationException(); } - }, authException).load("KEY"); + }, authException, new ValueLoadedCallback.NoOpCallback<String>()).load("KEY"); } finally { assertEquals(authException.get().getClass(), AuthorizationException.class); } @@ -62,7 +66,7 @@ public class MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest { public String get() { throw new RuntimeException(new ExecutionException(new AuthorizationException())); } - }, authException).load("KEY"); + }, authException, new ValueLoadedCallback.NoOpCallback<String>()).load("KEY"); } finally { assertEquals(authException.get().getClass(), AuthorizationException.class); } @@ -76,7 +80,7 @@ public class MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest { public String get() { throw new UncheckedExecutionException(new AuthorizationException()); } - }, authException).load("KEY"); + }, authException, new ValueLoadedCallback.NoOpCallback<String>()).load("KEY"); } finally { assertEquals(authException.get().getClass(), AuthorizationException.class); } @@ -90,9 +94,43 @@ public class MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplierTest { public String get() { throw new RuntimeException(new IllegalArgumentException("foo")); } - }, authException).load("KEY"); + }, authException, new ValueLoadedCallback.NoOpCallback<String>()).load("KEY"); } finally { assertEquals(authException.get().getClass(), RuntimeException.class); } } + + @Test + public void testLoaderNotifiesAfterReloading() { + AtomicReference<AuthorizationException> authException = newReference(); + ValueLoadedEventHandler handler = new ValueLoadedEventHandler(); + + Supplier<String> supplier = MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, + Suppliers.<String> ofInstance("foo"), 3, TimeUnit.SECONDS, handler); + + // The supplier loads the value initially and returns the cached values + assertEquals(handler.count.get(), 0); + supplier.get(); + assertEquals(handler.count.get(), 1); + supplier.get(); + assertEquals(handler.count.get(), 1); + + // Once expired, it reloads the values, notified the event, and updated the cache + Uninterruptibles.sleepUninterruptibly(4, TimeUnit.SECONDS); + supplier.get(); + assertEquals(handler.count.get(), 2); + supplier.get(); + assertEquals(handler.count.get(), 2); + supplier.get(); + assertEquals(handler.count.get(), 2); + } + + static class ValueLoadedEventHandler implements ValueLoadedCallback<String>{ + AtomicInteger count = new AtomicInteger(0); + + @Override + public void valueLoaded(Optional<String> value) { + count.incrementAndGet(); + } + } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/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 160c37f..aca7141 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,8 +27,6 @@ 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.compute.suppliers.ImageCacheSupplier; import org.jclouds.domain.Location; import org.jclouds.ec2.compute.domain.RegionAndName; import org.jclouds.ec2.compute.internal.EC2TemplateBuilderImpl; @@ -40,11 +38,11 @@ public class AWSEC2TemplateBuilderImpl extends EC2TemplateBuilderImpl { @Inject protected AWSEC2TemplateBuilderImpl(@Memoized Supplier<Set<? extends Location>> locations, - ImageCacheSupplier images, @Memoized Supplier<Set<? extends Hardware>> sizes, + @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, GetImageStrategy getImageStrategy, + @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider, Supplier<LoadingCache<RegionAndName, ? extends Image>> imageMap) { - super(locations, images, sizes, defaultLocation, optionsProvider, defaultTemplateProvider, getImageStrategy, imageMap); + super(locations, images, sizes, defaultLocation, optionsProvider, defaultTemplateProvider, imageMap); } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java ---------------------------------------------------------------------- diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java index 4d3d6c9..e1a184f 100644 --- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java @@ -16,14 +16,11 @@ */ package org.jclouds.aws.ec2.compute.config; -import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; - import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicReference; -import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.aws.ec2.compute.AWSEC2TemplateBuilderImpl; @@ -38,8 +35,6 @@ import org.jclouds.aws.ec2.compute.strategy.CreateKeyPairPlacementAndSecurityGro import org.jclouds.aws.ec2.compute.suppliers.AWSEC2HardwareSupplier; import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.extensions.ImageExtension; -import org.jclouds.compute.extensions.SecurityGroupExtension; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.ec2.compute.config.EC2BindComputeStrategiesByClass; import org.jclouds.ec2.compute.domain.RegionAndName; @@ -59,7 +54,6 @@ import org.jclouds.ec2.compute.suppliers.RegionAndNameToImageSupplier; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.suppliers.SetAndThrowAuthorizationExceptionSupplier; -import com.google.common.base.Optional; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.base.Throwables; @@ -107,9 +101,8 @@ public class AWSEC2ComputeServiceContextModule extends BaseComputeServiceContext // duplicates EC2ComputeServiceContextModule; but that's easiest thing to do with guice; could extract to common util // TODO: have a another look at this (Adrian) @Override - protected Supplier<Set<? extends Image>> supplyNonParsingImageCache( - AtomicReference<AuthorizationException> authException, @Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier<Set<? extends Image>> imageSupplier, Injector injector) { + protected Supplier<Set<? extends Image>> supplyNonParsingImages(final Supplier<Set<? extends Image>> imageSupplier, + Injector injector) { final Supplier<LoadingCache<RegionAndName, ? extends Image>> cache = injector.getInstance(Key .get(new TypeLiteral<Supplier<LoadingCache<RegionAndName, ? extends Image>>>() { })); @@ -170,14 +163,4 @@ public class AWSEC2ComputeServiceContextModule extends BaseComputeServiceContext protected TemplateOptions provideTemplateOptions(Injector injector, TemplateOptions options) { return options.as(EC2TemplateOptions.class).userData("#cloud-config\nrepo_upgrade: none\n".getBytes()); } - - @Override - protected Optional<ImageExtension> provideImageExtension(Injector i) { - return Optional.of(i.getInstance(ImageExtension.class)); - } - - @Override - protected Optional<SecurityGroupExtension> provideSecurityGroupExtension(Injector i) { - return Optional.of(i.getInstance(SecurityGroupExtension.class)); - } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java index ef0d539..2f6b962 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java @@ -21,7 +21,8 @@ import static com.google.common.collect.Iterables.transform; import org.jclouds.aws.ec2.AWSEC2Api; import org.jclouds.aws.util.AWSUtils; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.extensions.internal.BaseImageExtensionLiveTest; +import org.jclouds.compute.extensions.ImageExtension; +import org.jclouds.ec2.compute.extensions.EC2ImageExtensionLiveTest; import org.jclouds.ec2.compute.functions.EC2ImageParser; import org.jclouds.ec2.options.DescribeImagesOptions; import org.jclouds.sshj.config.SshjSshClientModule; @@ -33,7 +34,7 @@ import com.google.inject.Module; * Live test for aws-ec2 {@link ImageExtension} implementation */ @Test(groups = "live", singleThreaded = true, testName = "AWSEC2ImageExtensionLiveTest") -public class AWSEC2ImageExtensionLiveTest extends BaseImageExtensionLiveTest { +public class AWSEC2ImageExtensionLiveTest extends EC2ImageExtensionLiveTest { public AWSEC2ImageExtensionLiveTest() { provider = "aws-ec2"; http://git-wip-us.apache.org/repos/asf/jclouds/blob/40f31786/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java ---------------------------------------------------------------------- diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java index 4951b05..baaec3f 100644 --- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java +++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java @@ -25,26 +25,14 @@ import static org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperti import static org.jclouds.rest.config.BinderUtils.bindHttpApi; import static org.jclouds.util.Predicates2.retry; -import javax.inject.Named; -import javax.inject.Singleton; import java.net.URI; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; -import com.google.common.base.Function; -import com.google.common.base.Functions; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.collect.ImmutableMap; -import com.google.inject.Injector; -import com.google.inject.Provides; -import com.google.inject.Scopes; -import com.google.inject.TypeLiteral; +import javax.inject.Named; +import javax.inject.Singleton; + import org.jclouds.collect.Memoized; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceAdapter; @@ -53,8 +41,6 @@ import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.extensions.ImageExtension; -import org.jclouds.compute.extensions.SecurityGroupExtension; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.Location; import org.jclouds.domain.LoginCredentials; @@ -80,6 +66,19 @@ import org.jclouds.googlecomputeengine.domain.Operation; import org.jclouds.location.suppliers.ImplicitLocationSupplier; import org.jclouds.location.suppliers.implicit.FirstZone; +import com.google.common.base.Function; +import com.google.common.base.Functions; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableMap; +import com.google.inject.Injector; +import com.google.inject.Provides; +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; + public final class GoogleComputeEngineServiceContextModule extends ComputeServiceAdapterContextModule<Instance, MachineType, Image, Location> { @@ -197,15 +196,6 @@ public final class GoogleComputeEngineServiceContextModule return CacheBuilder.newBuilder().build(in); } - - @Override protected Optional<ImageExtension> provideImageExtension(Injector i) { - return Optional.absent(); - } - - @Override protected Optional<SecurityGroupExtension> provideSecurityGroupExtension(Injector i) { - return Optional.absent(); - } - private static final Map<Instance.Status, NodeMetadata.Status> toPortableNodeStatus = ImmutableMap.<Instance.Status, NodeMetadata.Status>builder() .put(Instance.Status.PROVISIONING, NodeMetadata.Status.PENDING)
