You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2016/01/20 23:15:29 UTC
jclouds-labs git commit: Improved DigitalOcean image extension
Repository: jclouds-labs
Updated Branches:
refs/heads/master 547ba0678 -> 1c5df25cf
Improved DigitalOcean image extension
Do not block when waiting for the images to become available.
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/1c5df25c
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/1c5df25c
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/1c5df25c
Branch: refs/heads/master
Commit: 1c5df25cf92626b9657257f959b40c25650e65fc
Parents: 547ba06
Author: Ignasi Barrera <na...@apache.org>
Authored: Thu Dec 24 11:29:46 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Jan 20 12:24:46 2016 +0100
----------------------------------------------------------------------
.../extensions/DigitalOcean2ImageExtension.java | 47 ++++++++++++--------
1 file changed, 29 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/1c5df25c/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/extensions/DigitalOcean2ImageExtension.java
----------------------------------------------------------------------
diff --git a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/extensions/DigitalOcean2ImageExtension.java b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/extensions/DigitalOcean2ImageExtension.java
index 56e67de..3baf146 100644
--- a/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/extensions/DigitalOcean2ImageExtension.java
+++ b/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/extensions/DigitalOcean2ImageExtension.java
@@ -17,17 +17,18 @@
package org.jclouds.digitalocean2.compute.extensions;
import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.util.concurrent.Futures.immediateFuture;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_IMAGE_AVAILABLE;
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
import java.util.NoSuchElementException;
+import java.util.concurrent.Callable;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
+import org.jclouds.Constants;
import org.jclouds.compute.domain.CloneImageTemplate;
import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.ImageTemplate;
@@ -45,6 +46,8 @@ import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.primitives.Ints;
import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.UncheckedTimeoutException;
/**
* The {@link org.jclouds.compute.extensions.ImageExtension} implementation for the DigitalOcean provider.
@@ -60,15 +63,18 @@ public class DigitalOcean2ImageExtension implements ImageExtension {
private final Predicate<Integer> imageAvailablePredicate;
private final Predicate<Integer> nodeStoppedPredicate;
private final Function<ImageInRegion, Image> imageTransformer;
+ private final ListeningExecutorService userExecutor;
@Inject DigitalOcean2ImageExtension(DigitalOcean2Api api,
@Named(TIMEOUT_IMAGE_AVAILABLE) Predicate<Integer> imageAvailablePredicate,
@Named(TIMEOUT_NODE_SUSPENDED) Predicate<Integer> nodeStoppedPredicate,
- Function<ImageInRegion, Image> imageTransformer) {
+ Function<ImageInRegion, Image> imageTransformer,
+ @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) {
this.api = api;
this.imageAvailablePredicate = imageAvailablePredicate;
this.nodeStoppedPredicate = nodeStoppedPredicate;
this.imageTransformer = imageTransformer;
+ this.userExecutor = userExecutor;
}
@Override
@@ -89,31 +95,36 @@ public class DigitalOcean2ImageExtension implements ImageExtension {
int dropletId = Integer.parseInt(cloneTemplate.getSourceNodeId());
// Droplet needs to be stopped
- Droplet droplet = api.dropletApi().get(dropletId);
+ final Droplet droplet = api.dropletApi().get(dropletId);
if (droplet.status() != Status.OFF) {
api.dropletApi().powerOff(dropletId);
checkState(nodeStoppedPredicate.apply(dropletId), "node was not powered off in the configured timeout");
}
- Action snapshotEvent = api.dropletApi().snapshot(Integer.parseInt(cloneTemplate.getSourceNodeId()),
+ final Action snapshotEvent = api.dropletApi().snapshot(Integer.parseInt(cloneTemplate.getSourceNodeId()),
cloneTemplate.getName());
logger.info(">> registered new Image, waiting for it to become available");
- // Until the process completes we don't have enough information to build an image to return
- checkState(imageAvailablePredicate.apply(snapshotEvent.id()),
- "snapshot failed to complete in the configured timeout");
-
- org.jclouds.digitalocean2.domain.Image snapshot = api.imageApi().list().concat().firstMatch(
- new Predicate<org.jclouds.digitalocean2.domain.Image>() {
- @Override
- public boolean apply(org.jclouds.digitalocean2.domain.Image input) {
- return input.name().equals(cloneTemplate.getName());
- }
- }).get();
-
- // By default snapshots are only available in the Droplet's region
- return immediateFuture(imageTransformer.apply(ImageInRegion.create(snapshot, droplet.region().slug())));
+ return userExecutor.submit(new Callable<Image>() {
+ @Override
+ public Image call() throws Exception {
+ if (imageAvailablePredicate.apply(snapshotEvent.id())) {
+ org.jclouds.digitalocean2.domain.Image snapshot = api.imageApi().list().concat()
+ .firstMatch(new Predicate<org.jclouds.digitalocean2.domain.Image>() {
+ @Override
+ public boolean apply(org.jclouds.digitalocean2.domain.Image input) {
+ return input.name().equals(cloneTemplate.getName());
+ }
+ }).get();
+
+ return imageTransformer.apply(ImageInRegion.create(snapshot, droplet.region().slug()));
+ }
+
+ throw new UncheckedTimeoutException("Image was not created within the time limit: "
+ + cloneTemplate.getName());
+ }
+ });
}
@Override