diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/util/AtmosUtils.java b/apis/atmos/src/main/java/org/jclouds/atmos/util/AtmosUtils.java index a86c6625ba..5c5e4ee469 100644 --- a/apis/atmos/src/main/java/org/jclouds/atmos/util/AtmosUtils.java +++ b/apis/atmos/src/main/java/org/jclouds/atmos/util/AtmosUtils.java @@ -18,6 +18,7 @@ */ package org.jclouds.atmos.util; import static com.google.common.base.Preconditions.checkState; +import static org.jclouds.util.Predicates2.retry; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -40,7 +41,6 @@ import org.jclouds.http.HttpCommand; import org.jclouds.http.HttpException; import org.jclouds.http.HttpResponse; import org.jclouds.http.functions.ParseSax; -import org.jclouds.predicates.RetryablePredicate; import com.google.common.base.Predicate; @@ -87,7 +87,7 @@ public class AtmosUtils { } public static void deletePathAndEnsureGone(final AtmosClient sync, String path) { - checkState(new RetryablePredicate(new Predicate() { + checkState(retry(new Predicate() { public boolean apply(String in) { try { sync.deletePath(in); diff --git a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java index 7581d5e46a..ac2164470f 100644 --- a/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java +++ b/apis/atmos/src/test/java/org/jclouds/atmos/AtmosClientLiveTest.java @@ -19,6 +19,7 @@ package org.jclouds.atmos; import static com.google.common.base.Preconditions.checkState; +import static org.jclouds.util.Predicates2.retry; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; @@ -42,7 +43,6 @@ import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest; import org.jclouds.http.HttpResponseException; import org.jclouds.io.Payloads; import org.jclouds.io.payloads.InputStreamPayload; -import org.jclouds.predicates.RetryablePredicate; import org.jclouds.util.Strings2; import org.testng.annotations.Test; @@ -328,7 +328,7 @@ public class AtmosClientLiveTest extends BaseBlobStoreIntegrationTest { getApi().deletePath(path); } catch (KeyNotFoundException ex) { } - checkState(new RetryablePredicate(new Predicate() { + checkState(retry(new Predicate() { public boolean apply(String in) { try { return !getApi().pathExists(in); diff --git a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersComputeServiceContextModule.java b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersComputeServiceContextModule.java index 42b13210b1..16cfc47f19 100644 --- a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersComputeServiceContextModule.java +++ b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersComputeServiceContextModule.java @@ -27,7 +27,6 @@ import org.jclouds.cloudservers.compute.functions.CloudServersImageToImage; import org.jclouds.cloudservers.compute.functions.CloudServersImageToOperatingSystem; import org.jclouds.cloudservers.compute.functions.FlavorToHardware; import org.jclouds.cloudservers.compute.functions.ServerToNodeMetadata; -import org.jclouds.cloudservers.compute.predicates.GetImageWhenStatusActivePredicateWithResult; import org.jclouds.cloudservers.compute.strategy.CloudServersComputeServiceAdapter; import org.jclouds.cloudservers.domain.Flavor; import org.jclouds.cloudservers.domain.ImageStatus; @@ -40,9 +39,9 @@ import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.extensions.ImageExtension; +import org.jclouds.compute.internal.BaseComputeService; import org.jclouds.domain.Location; import org.jclouds.functions.IdentityFunction; -import org.jclouds.predicates.PredicateWithResult; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; @@ -85,10 +84,6 @@ public class CloudServersComputeServiceContextModule extends bind(new TypeLiteral() { }).to(CloudServersImageExtension.class); - - bind(new TypeLiteral>() { - }).to(GetImageWhenStatusActivePredicateWithResult.class); - } @VisibleForTesting diff --git a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/extensions/CloudServersImageExtension.java b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/extensions/CloudServersImageExtension.java index 603c2ab125..826ff05b1c 100644 --- a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/extensions/CloudServersImageExtension.java +++ b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/extensions/CloudServersImageExtension.java @@ -21,10 +21,11 @@ package org.jclouds.cloudservers.compute.extensions; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_IMAGE_AVAILABLE; import java.util.NoSuchElementException; import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Resource; import javax.inject.Inject; @@ -36,16 +37,20 @@ import org.jclouds.cloudservers.CloudServersClient; import org.jclouds.cloudservers.domain.Server; import org.jclouds.compute.domain.CloneImageTemplate; import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.ImageTemplate; import org.jclouds.compute.domain.ImageTemplateBuilder; +import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.extensions.ImageExtension; import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.domain.Location; import org.jclouds.logging.Logger; -import org.jclouds.predicates.PredicateWithResult; -import org.jclouds.predicates.Retryables; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.UncheckedTimeoutException; /** * CloudServers implementation of {@link ImageExtension} @@ -62,20 +67,16 @@ public class CloudServersImageExtension implements ImageExtension { private final CloudServersClient client; private final ListeningExecutorService userExecutor; - private final PredicateWithResult imageAvailablePredicate; - @com.google.inject.Inject(optional = true) - @Named("IMAGE_MAX_WAIT") - private long maxWait = 3600; - @com.google.inject.Inject(optional = true) - @Named("IMAGE_WAIT_PERIOD") - private long waitPeriod = 1; + private final Supplier location; + private final Predicate> imageAvailablePredicate; @Inject - public CloudServersImageExtension(CloudServersClient client, - @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor, - PredicateWithResult imageAvailablePredicate) { + public CloudServersImageExtension(CloudServersClient client, @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor, + Supplier location, + @Named(TIMEOUT_IMAGE_AVAILABLE) Predicate> imageAvailablePredicate) { this.client = checkNotNull(client, "client"); this.userExecutor = checkNotNull(userExecutor, "userExecutor"); + this.location = checkNotNull(location, "location"); this.imageAvailablePredicate = checkNotNull(imageAvailablePredicate, "imageAvailablePredicate"); } @@ -93,17 +94,25 @@ public class CloudServersImageExtension implements ImageExtension { checkState(template instanceof CloneImageTemplate, " openstack-nova only supports creating images through cloning."); CloneImageTemplate cloneTemplate = (CloneImageTemplate) template; - final org.jclouds.cloudservers.domain.Image image = client.createImageFromServer(cloneTemplate.getName(), + org.jclouds.cloudservers.domain.Image csImage = client.createImageFromServer(cloneTemplate.getName(), Integer.parseInt(cloneTemplate.getSourceNodeId())); + + final AtomicReference image = new AtomicReference(new ImageBuilder() + .location(location.get()) + .ids(csImage.getId() + "") + .description(cloneTemplate.getName()) + .operatingSystem(OperatingSystem.builder().description(cloneTemplate.getName()).build()) + .status(Image.Status.PENDING).build()); + return userExecutor.submit(new Callable() { @Override public Image call() throws Exception { - return Retryables.retryGettingResultOrFailing(imageAvailablePredicate, image.getId(), maxWait, waitPeriod, - TimeUnit.SECONDS, "Image was not created within the time limit, Giving up! [Limit: " + maxWait - + " secs.]"); + if (imageAvailablePredicate.apply(image)) + return image.get(); + // TODO: get rid of the expectation that the image will be available, as it is very brittle + throw new UncheckedTimeoutException("Image was not created within the time limit: " + image.get()); } }); - } @Override diff --git a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/predicates/GetImageWhenStatusActivePredicateWithResult.java b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/predicates/GetImageWhenStatusActivePredicateWithResult.java deleted file mode 100644 index e67720522f..0000000000 --- a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/predicates/GetImageWhenStatusActivePredicateWithResult.java +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Licensed to jclouds, Inc. (jclouds) under one or more - * contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. jclouds 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.cloudservers.compute.predicates; - -import static com.google.common.base.Preconditions.checkNotNull; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; - -import org.jclouds.cloudservers.CloudServersClient; -import org.jclouds.cloudservers.options.ListOptions; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.predicates.PredicateWithResult; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; - -/** - * - * @author David Alves - * - */ -public final class GetImageWhenStatusActivePredicateWithResult implements PredicateWithResult { - - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - private final CloudServersClient client; - private final Function cloudserversImageToImage; - private org.jclouds.cloudservers.domain.Image result; - private RuntimeException lastFailure; - - @Inject - public GetImageWhenStatusActivePredicateWithResult(CloudServersClient client, - Function cloudserversImageToImage) { - this.client = client; - this.cloudserversImageToImage = cloudserversImageToImage; - } - - @Override - public boolean apply(Integer input) { - result = checkNotNull(findImage(input)); - switch (result.getStatus()) { - case ACTIVE: - logger.info("<< Image %s is available for use. %s", input, result); - return true; - case QUEUED: - case PREPARING: - case SAVING: - logger.debug("<< Image %s is not available yet. %s", input, result); - return false; - default: - lastFailure = new IllegalStateException("Image " + input + " was not created. " + result); - throw lastFailure; - } - } - - @Override - public Image getResult() { - return cloudserversImageToImage.apply(result); - } - - @Override - public Throwable getLastFailure() { - return lastFailure; - } - - private org.jclouds.cloudservers.domain.Image findImage(final int id) { - return Iterables.tryFind(client.listImages(new ListOptions().withDetails()), - new Predicate() { - @Override - public boolean apply(org.jclouds.cloudservers.domain.Image input) { - return input.getId() == id; - } - }).orNull(); - - } -} diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/CloudServersClientLiveTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/CloudServersClientLiveTest.java index 038ad6c7c5..4750310312 100644 --- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/CloudServersClientLiveTest.java +++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/CloudServersClientLiveTest.java @@ -18,9 +18,11 @@ */ package org.jclouds.cloudservers; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.jclouds.cloudservers.options.CreateServerOptions.Builder.withFile; import static org.jclouds.cloudservers.options.CreateSharedIpGroupOptions.Builder.withServer; import static org.jclouds.cloudservers.options.ListOptions.Builder.withDetails; +import static org.jclouds.util.Predicates2.retry; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -30,7 +32,6 @@ import java.lang.reflect.UndeclaredThrowableException; import java.security.SecureRandom; import java.util.Map; import java.util.Set; -import java.util.concurrent.TimeUnit; import org.jclouds.cloudservers.domain.BackupSchedule; import org.jclouds.cloudservers.domain.DailyBackup; @@ -49,7 +50,6 @@ import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; import org.jclouds.domain.LoginCredentials; import org.jclouds.http.HttpResponseException; import org.jclouds.io.Payload; -import org.jclouds.predicates.RetryablePredicate; import org.jclouds.predicates.SocketOpen; import org.jclouds.ssh.SshClient; import org.jclouds.ssh.SshException; @@ -91,7 +91,7 @@ public class CloudServersClientLiveTest extends BaseComputeServiceContextLiveTes client = injector.getInstance(CloudServersClient.class); sshFactory = injector.getInstance(SshClient.Factory.class); SocketOpen socketOpen = injector.getInstance(SocketOpen.class); - socketTester = new RetryablePredicate(socketOpen, 120, 1, TimeUnit.SECONDS); + socketTester = retry(socketOpen, 120, 1, SECONDS); injector.injectMembers(socketOpen); // add logger } diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/extensions/CloudServersImageExtensionExpectTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/extensions/CloudServersImageExtensionExpectTest.java new file mode 100644 index 0000000000..3dc0da6313 --- /dev/null +++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/extensions/CloudServersImageExtensionExpectTest.java @@ -0,0 +1,95 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.cloudservers.compute.extensions; + +import static org.testng.Assert.assertEquals; + +import org.jclouds.cloudservers.internal.BaseCloudServersComputeServiceExpectTest; +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageTemplate; +import org.jclouds.compute.extensions.ImageExtension; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; +import com.google.common.net.HttpHeaders; +import com.google.common.util.concurrent.Futures; + +/** + * + * @author David Alves + * + */ +@Test(groups = "unit", testName = "CloudServersImageExtensionExpectTest") +public class CloudServersImageExtensionExpectTest extends BaseCloudServersComputeServiceExpectTest { + private HttpRequest getServerDetail = HttpRequest.builder().method("GET") + .endpoint("https://lon.servers.api.rackspacecloud.com/v1.0/10001786/servers/1234?format=json&now=1257695648897") + .addHeader(HttpHeaders.ACCEPT, "application/json") + .addHeader("X-Auth-Token", authToken).build(); + + private HttpResponse getServerResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/test_get_server_detail.json")).build(); + + HttpRequest createImage = HttpRequest.builder().method("POST") + .endpoint("https://lon.servers.api.rackspacecloud.com/v1.0/10001786/images?format=json&now=1257695648897") + .addHeader("Accept", "application/json") + .addHeader("X-Auth-Token", authToken) + .payload( + payloadFromStringWithContentType( + "{\"image\":{\"serverId\":1234,\"name\":\"test\"}}", + "application/json")).build(); + + HttpResponse createImageResponse = HttpResponse.builder().statusCode(200) + .payload( + payloadFromStringWithContentType( + "{\"image\":{\"id\":2,\"serverId\":1234,\"name\":\"test\",\"status\":\"SAVING\"}}", + "application/json")).build(); + + private HttpRequest getImage = HttpRequest.builder().method("GET") + .endpoint("https://lon.servers.api.rackspacecloud.com/v1.0/10001786/images/2?format=json&now=1257695648897") + .addHeader(HttpHeaders.ACCEPT, "application/json") + .addHeader("X-Auth-Token", authToken).build(); + + private HttpResponse getImageResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/test_get_image_active.json")).build(); + + + public void testCreateImage() { + Builder requestResponseMap = ImmutableMap. builder(); + requestResponseMap.put(initialAuth, responseWithAuth); + requestResponseMap.put(getServerDetail, getServerResponse).build(); + requestResponseMap.put(createImage, createImageResponse).build(); + requestResponseMap.put(getImage, getImageResponse).build(); + + ImageExtension apiThatCreatesImage = requestsSendResponses(requestResponseMap.build()).getImageExtension().get(); + + ImageTemplate newImageTemplate = apiThatCreatesImage.buildImageTemplateFromNode("test", "1234"); + + Image image = Futures.getUnchecked(apiThatCreatesImage.createImage(newImageTemplate)); + assertEquals(image.getId(), "2"); + } + + public ComputeService apply(ComputeServiceContext input) { + return input.getComputeService(); + } +} diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/predicates/GetImageWhenStatusActivePredicateWithResultExpectTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/predicates/GetImageWhenStatusActivePredicateWithResultExpectTest.java deleted file mode 100644 index b026aaa0f3..0000000000 --- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/predicates/GetImageWhenStatusActivePredicateWithResultExpectTest.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Licensed to jclouds, Inc. (jclouds) under one or more - * contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. jclouds 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.cloudservers.compute.predicates; - -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - -import java.net.URI; -import java.util.Map; - -import org.jclouds.cloudservers.internal.BaseCloudServersComputeServiceExpectTest; -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.domain.Image; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpResponse; -import org.jclouds.predicates.PredicateWithResult; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.net.HttpHeaders; -import com.google.inject.Injector; - -/** - * - * @author David Alves - * - */ -@Test(groups = "unit", testName = "GetImageWhenStatusActivePredicateWithResultExpectTest") -public class GetImageWhenStatusActivePredicateWithResultExpectTest extends - BaseCloudServersComputeServiceExpectTest { - - private final HttpRequest listImagesDetail = HttpRequest - .builder() - .method("GET") - .endpoint( - URI.create("https://lon.servers.api.rackspacecloud.com/v1.0/10001786/images/detail?format=json&now=1257695648897")) - .headers(ImmutableMultimap. builder() - .put(HttpHeaders.ACCEPT, "application/json") - .put("X-Auth-Token", authToken).build()).build(); - - private final HttpResponse listImagesResponse = HttpResponse.builder().statusCode(200) - .payload(payloadFromResource("/test_list_images_detail_imageextension.json")).build(); - - private final Map requestResponseMap = ImmutableMap. builder() - .put(listImagesDetail, listImagesResponse).put(initialAuth, responseWithAuth).build(); - - public void testReturnsFalseOnQueuedAndSavingAndTrueOnActive() { - Injector injector = requestsSendResponses(requestResponseMap); - PredicateWithResult predicate = injector - .getInstance(GetImageWhenStatusActivePredicateWithResult.class); - assertTrue(predicate.apply(2));// ACTIVE - assertFalse(predicate.apply(743));// SAVING - assertFalse(predicate.apply(744));// QUEUED - assertFalse(predicate.apply(747));// PREPARING - } - - public void testFailsOnOtherStatuses() { - Injector injector = requestsSendResponses(requestResponseMap); - PredicateWithResult predicate = injector - .getInstance(GetImageWhenStatusActivePredicateWithResult.class); - assertTrue(illegalStateExceptionThrown(predicate, 745));// UNRECOGNIZED - assertTrue(illegalStateExceptionThrown(predicate, 746));// UNKNOWN - assertTrue(illegalStateExceptionThrown(predicate, 748));// FAILED - } - - private boolean illegalStateExceptionThrown(PredicateWithResult predicate, Integer id) { - try { - predicate.apply(id); - } catch (IllegalStateException e) { - return true; - } - return false; - } - - @Override - public Injector apply(ComputeServiceContext input) { - return input.utils().injector(); - } - -} diff --git a/apis/cloudservers/src/test/resources/test_get_image_active.json b/apis/cloudservers/src/test/resources/test_get_image_active.json new file mode 100644 index 0000000000..eb851ef50f --- /dev/null +++ b/apis/cloudservers/src/test/resources/test_get_image_active.json @@ -0,0 +1,11 @@ +{ + "image" : { + "id" : 2, + "name" : "CentOS 5.2", + "serverId" : 12, + "updated" : "2010-10-10T12:00:00Z", + "created" : "2010-08-10T12:00:00Z", + "status" : "ACTIVE", + "progress" : 100 + } +} \ No newline at end of file diff --git a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/compute/config/CloudSigmaComputeServiceContextModule.java b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/compute/config/CloudSigmaComputeServiceContextModule.java index d178d08db4..70bb29d92c 100644 --- a/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/compute/config/CloudSigmaComputeServiceContextModule.java +++ b/apis/cloudsigma/src/main/java/org/jclouds/cloudsigma/compute/config/CloudSigmaComputeServiceContextModule.java @@ -18,7 +18,8 @@ */ package org.jclouds.cloudsigma.compute.config; -import java.util.concurrent.TimeUnit; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.jclouds.util.Predicates2.retry; import javax.inject.Inject; import javax.inject.Singleton; @@ -46,10 +47,9 @@ import org.jclouds.compute.domain.OsFamilyVersion64Bit; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.domain.Volume; import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; import org.jclouds.domain.Location; import org.jclouds.functions.IdentityFunction; -import org.jclouds.predicates.RetryablePredicate; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -114,10 +114,8 @@ public class CloudSigmaComputeServiceContextModule extends @Provides @Singleton - protected Predicate supplyDriveUnclaimed(DriveClaimed driveClaimed, - ComputeServiceConstants.Timeouts timeouts) { - return new RetryablePredicate(Predicates.not(driveClaimed), timeouts.nodeRunning, 1000, - TimeUnit.MILLISECONDS); + protected Predicate supplyDriveUnclaimed(DriveClaimed driveClaimed, Timeouts timeouts) { + return retry(Predicates.not(driveClaimed), timeouts.nodeRunning, 1000, MILLISECONDS); } @Provides diff --git a/apis/cloudsigma/src/test/java/org/jclouds/cloudsigma/CloudSigmaClientLiveTest.java b/apis/cloudsigma/src/test/java/org/jclouds/cloudsigma/CloudSigmaClientLiveTest.java index 91ed90ba63..e73df50d64 100644 --- a/apis/cloudsigma/src/test/java/org/jclouds/cloudsigma/CloudSigmaClientLiveTest.java +++ b/apis/cloudsigma/src/test/java/org/jclouds/cloudsigma/CloudSigmaClientLiveTest.java @@ -17,13 +17,13 @@ * under the License. */ package org.jclouds.cloudsigma; - +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.jclouds.util.Predicates2.retry; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import java.io.IOException; import java.util.Set; -import java.util.concurrent.TimeUnit; import java.util.logging.Logger; import org.jclouds.cloudsigma.domain.ClaimType; @@ -47,7 +47,6 @@ import org.jclouds.compute.domain.ExecResponse; import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; import org.jclouds.domain.LoginCredentials; import org.jclouds.predicates.InetSocketAddressConnect; -import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.RestContext; import org.jclouds.ssh.SshClient; import org.jclouds.sshj.config.SshjSshClientModule; @@ -92,10 +91,8 @@ public class CloudSigmaClientLiveTest extends BaseComputeServiceContextLiveTest cloudSigmaContext = view.unwrap(); client = cloudSigmaContext.getApi(); - driveNotClaimed = new RetryablePredicate(Predicates.not(new DriveClaimed(client)), maxDriveImageTime, - 1, TimeUnit.SECONDS); - socketTester = new RetryablePredicate(new InetSocketAddressConnect(), maxDriveImageTime, 1, - TimeUnit.SECONDS); + driveNotClaimed = retry(Predicates.not(new DriveClaimed(client)), maxDriveImageTime, 1, SECONDS); + socketTester = retry(new InetSocketAddressConnect(), maxDriveImageTime, 1, SECONDS); if (template == null || template.getImageId() == null) { imageId = view.getComputeService().templateBuilder().build().getImage().getId(); diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/config/CloudStackComputeServiceContextModule.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/config/CloudStackComputeServiceContextModule.java index 129a6769b7..a2d27e7521 100644 --- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/config/CloudStackComputeServiceContextModule.java +++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/config/CloudStackComputeServiceContextModule.java @@ -18,7 +18,9 @@ */ package org.jclouds.cloudstack.compute.config; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; +import static org.jclouds.util.Predicates2.retry; import java.util.Map; import java.util.Set; @@ -65,7 +67,6 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.Location; -import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; @@ -183,8 +184,7 @@ public class CloudStackComputeServiceContextModule extends @Provides @Singleton protected Predicate jobComplete(JobComplete jobComplete) { - // TODO: parameterize - return new RetryablePredicate(jobComplete, 1200, 1, 5, TimeUnit.SECONDS); + return retry(jobComplete, 1200, 1, 5, SECONDS); } @Provides diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/CloudStackComputeServiceAdapterLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/CloudStackComputeServiceAdapterLiveTest.java index bddd452e42..af4954d3ec 100644 --- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/CloudStackComputeServiceAdapterLiveTest.java +++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/CloudStackComputeServiceAdapterLiveTest.java @@ -17,20 +17,17 @@ * under the License. */ package org.jclouds.cloudstack.compute; - import static com.google.common.collect.Iterables.getFirst; import static com.google.inject.name.Names.bindProperties; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; -import org.jclouds.cloudstack.domain.FirewallRule; -import org.jclouds.cloudstack.functions.GetFirewallRulesByVirtualMachine; -import org.jclouds.cloudstack.functions.GetIPForwardingRulesByVirtualMachine; +import static org.jclouds.util.Predicates2.retry; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import java.util.Map; import java.util.Random; import java.util.Set; -import java.util.concurrent.TimeUnit; import javax.inject.Singleton; @@ -39,6 +36,7 @@ import org.jclouds.cloudstack.compute.config.CloudStackComputeServiceContextModu import org.jclouds.cloudstack.compute.options.CloudStackTemplateOptions; import org.jclouds.cloudstack.compute.strategy.CloudStackComputeServiceAdapter; import org.jclouds.cloudstack.compute.strategy.OptionsConverter; +import org.jclouds.cloudstack.domain.FirewallRule; import org.jclouds.cloudstack.domain.IPForwardingRule; import org.jclouds.cloudstack.domain.Network; import org.jclouds.cloudstack.domain.NetworkType; @@ -46,9 +44,11 @@ import org.jclouds.cloudstack.domain.ServiceOffering; import org.jclouds.cloudstack.domain.User; import org.jclouds.cloudstack.domain.VirtualMachine; import org.jclouds.cloudstack.domain.Zone; -import org.jclouds.cloudstack.internal.BaseCloudStackClientLiveTest; +import org.jclouds.cloudstack.functions.GetFirewallRulesByVirtualMachine; +import org.jclouds.cloudstack.functions.GetIPForwardingRulesByVirtualMachine; import org.jclouds.cloudstack.functions.StaticNATVirtualMachineInNetwork; import org.jclouds.cloudstack.functions.ZoneIdToZone; +import org.jclouds.cloudstack.internal.BaseCloudStackClientLiveTest; import org.jclouds.cloudstack.predicates.JobComplete; import org.jclouds.cloudstack.predicates.TemplatePredicates; import org.jclouds.cloudstack.suppliers.GetCurrentUser; @@ -62,7 +62,6 @@ import org.jclouds.compute.functions.DefaultCredentialsFromImageOrOverridingCred import org.jclouds.compute.strategy.PrioritizeCredentialsFromTemplate; import org.jclouds.domain.Credentials; import org.jclouds.logging.slf4j.config.SLF4JLoggingModule; -import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.annotations.Identity; import org.testng.annotations.AfterGroups; import org.testng.annotations.BeforeGroups; @@ -129,7 +128,7 @@ public class CloudStackComputeServiceAdapterLiveTest extends BaseCloudStackClien @Provides @Singleton protected Predicate jobComplete(JobComplete jobComplete) { - return new RetryablePredicate(jobComplete, 1200, 1, 5, TimeUnit.SECONDS); + return retry(jobComplete, 1200, 1, 5, SECONDS); } @Provides diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/LoadBalancerClientLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/LoadBalancerClientLiveTest.java index 3c2dc31f99..9ad9b2dff6 100644 --- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/LoadBalancerClientLiveTest.java +++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/LoadBalancerClientLiveTest.java @@ -19,8 +19,10 @@ package org.jclouds.cloudstack.features; import static com.google.common.collect.Iterables.find; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.jclouds.cloudstack.predicates.NetworkPredicates.hasLoadBalancerService; import static org.jclouds.cloudstack.predicates.NetworkPredicates.isVirtualNetwork; +import static org.jclouds.util.Predicates2.retry; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -28,7 +30,6 @@ import static org.testng.Assert.assertTrue; import java.io.IOException; import java.util.NoSuchElementException; import java.util.Set; -import java.util.concurrent.TimeUnit; import org.jclouds.cloudstack.domain.AsyncJob; import org.jclouds.cloudstack.domain.JobResult; @@ -40,7 +41,6 @@ import org.jclouds.cloudstack.domain.PublicIPAddress; import org.jclouds.cloudstack.domain.VirtualMachine; import org.jclouds.cloudstack.internal.BaseCloudStackClientLiveTest; import org.jclouds.cloudstack.predicates.LoadBalancerRuleActive; -import org.jclouds.predicates.RetryablePredicate; import org.jclouds.ssh.SshException; import org.testng.annotations.AfterGroups; import org.testng.annotations.BeforeGroups; @@ -60,16 +60,14 @@ public class LoadBalancerClientLiveTest extends BaseCloudStackClientLiveTest { private PublicIPAddress ip = null; private VirtualMachine vm; private LoadBalancerRule rule; - private RetryablePredicate loadBalancerRuleActive; + private Predicate loadBalancerRuleActive; private Network network; private boolean networksDisabled; @BeforeGroups(groups = "live") public void setupContext() { super.setupContext(); - - loadBalancerRuleActive = new RetryablePredicate(new LoadBalancerRuleActive(client), 60, 1, 1, - TimeUnit.SECONDS); + loadBalancerRuleActive = retry(new LoadBalancerRuleActive(client), 60, 1, 1, SECONDS); prefix += "rule"; try { network = find(client.getNetworkClient().listNetworks(), diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/SnapshotClientLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/SnapshotClientLiveTest.java index 84f372337d..736f8f1f86 100644 --- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/SnapshotClientLiveTest.java +++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/SnapshotClientLiveTest.java @@ -36,8 +36,6 @@ import org.jclouds.cloudstack.domain.Volume; import org.jclouds.cloudstack.internal.BaseCloudStackClientLiveTest; import org.jclouds.cloudstack.options.ListSnapshotsOptions; import org.jclouds.logging.Logger; -import org.jclouds.predicates.PredicateCallable; -import org.jclouds.predicates.Retryables; import org.testng.annotations.Test; import com.google.common.base.Function; @@ -121,18 +119,10 @@ public class SnapshotClientLiveTest extends BaseCloudStackClientLiveTest { public void testCreateSnapshotFromVolume() { final Volume volume = getPreferredVolume(); //fail fast if none - - Snapshot snapshot = Retryables.retryGettingResultOrFailing(new PredicateCallable() { - public Snapshot call() { - logger.info("creating snapshot from volume %s", volume); - AsyncCreateResponse job = client.getSnapshotClient().createSnapshot(volume.getId()); - assertTrue(jobComplete.apply(job.getJobId())); - return findSnapshotWithId(job.getId()); - } - protected void onFailure() { - logger.info("failed creating snapshot (retrying): %s", getLastFailure()); - } - }, null, 60*1000, "failed to create snapshot"); + logger.info("creating snapshot from volume %s", volume); + AsyncCreateResponse job = client.getSnapshotClient().createSnapshot(volume.getId()); + assertTrue(jobComplete.apply(job.getJobId())); + Snapshot snapshot = findSnapshotWithId(job.getId()); logger.info("created snapshot %s from volume %s", snapshot, volume); checkSnapshot(snapshot); client.getSnapshotClient().deleteSnapshot(snapshot.getId()); diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateClientLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateClientLiveTest.java index f07dce1111..1a52c7e661 100644 --- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateClientLiveTest.java +++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateClientLiveTest.java @@ -19,6 +19,7 @@ package org.jclouds.cloudstack.features; import static org.jclouds.cloudstack.options.ListTemplatesOptions.Builder.zoneId; +import static org.jclouds.util.Predicates2.retry; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -44,7 +45,6 @@ import org.jclouds.cloudstack.options.ListNetworksOptions; import org.jclouds.cloudstack.options.ListVolumesOptions; import org.jclouds.cloudstack.options.RegisterTemplateOptions; import org.jclouds.logging.Logger; -import org.jclouds.predicates.RetryablePredicate; import org.testng.annotations.AfterGroups; import org.testng.annotations.Test; @@ -186,7 +186,7 @@ public class TemplateClientLiveTest extends BaseCloudStackClientLiveTest { return t2.getStatus() == Template.Status.DOWNLOADED; } }; - assertTrue(new RetryablePredicate