diff --git a/atmos/pom.xml b/atmos/pom.xml index 4cb7bc0d68..aec222e1a4 100644 --- a/atmos/pom.xml +++ b/atmos/pom.xml @@ -127,6 +127,14 @@ test.initializer ${test.initializer} + + jclouds.blobstore.httpstream.url + ${jclouds.blobstore.httpstream.url} + + + jclouds.blobstore.httpstream.md5 + ${jclouds.blobstore.httpstream.md5} + diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java index e547b780a2..c968259751 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java @@ -43,12 +43,13 @@ import org.jclouds.aws.ec2.domain.KeyPair; import org.jclouds.aws.ec2.domain.PlacementGroup; import org.jclouds.aws.ec2.domain.PlacementGroup.State; import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.internal.BaseComputeService; import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; import org.jclouds.compute.strategy.DestroyNodeStrategy; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.compute.strategy.ListNodesStrategy; @@ -81,14 +82,14 @@ public class EC2ComputeService extends BaseComputeService { DestroyNodeStrategy destroyNodeStrategy, Provider templateBuilderProvider, Provider templateOptionsProvider, @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, + @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, EC2Client ec2Client, Map credentialsMap, @Named("SECURITY") Map securityGroupMap, @Named("PLACEMENT") Map placementGroupMap, @Named("DELETED") Predicate placementGroupDeleted) { super(context, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, - nodeTerminated, utils, executor); + nodeTerminated, utils, timeouts, executor); this.ec2Client = ec2Client; this.credentialsMap = credentialsMap; this.securityGroupMap = securityGroupMap; diff --git a/aws/pom.xml b/aws/pom.xml index aa5c5c3946..2b2e620caf 100644 --- a/aws/pom.xml +++ b/aws/pom.xml @@ -271,6 +271,14 @@ test.initializer ${test.initializer} + + jclouds.blobstore.httpstream.url + ${jclouds.blobstore.httpstream.url} + + + jclouds.blobstore.httpstream.md5 + ${jclouds.blobstore.httpstream.md5} + diff --git a/azure/pom.xml b/azure/pom.xml index b27f4bd972..b276832bb8 100644 --- a/azure/pom.xml +++ b/azure/pom.xml @@ -140,6 +140,14 @@ test.initializer ${test.initializer} + + jclouds.blobstore.httpstream.url + ${jclouds.blobstore.httpstream.url} + + + jclouds.blobstore.httpstream.md5 + ${jclouds.blobstore.httpstream.md5} + diff --git a/azure/src/test/java/org/jclouds/azure/storage/blob/AzureBlobClientLiveTest.java b/azure/src/test/java/org/jclouds/azure/storage/blob/AzureBlobClientLiveTest.java index 0886c05e1c..5124a7b789 100644 --- a/azure/src/test/java/org/jclouds/azure/storage/blob/AzureBlobClientLiveTest.java +++ b/azure/src/test/java/org/jclouds/azure/storage/blob/AzureBlobClientLiveTest.java @@ -73,7 +73,7 @@ public class AzureBlobClientLiveTest { private String containerPrefix = System.getProperty("user.name") + "-azureblob"; private BlobStoreContext context; - protected String provider = "azurequeue"; + protected String provider = "azureblob"; protected String identity; protected String credential; protected String endpoint; diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java index be9e05e358..d7bd8911d8 100755 --- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java +++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseBlobIntegrationTest.java @@ -127,7 +127,7 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest { public Void apply(Blob from) { try { assertEquals(CryptoStreams.md5(from.getPayload()), oneHundredOneConstitutionsMD5); - checkContentDispostion(from, expectedContentDisposition); + checkContentDisposition(from, expectedContentDisposition); } catch (IOException e) { Throwables.propagate(e); } @@ -156,16 +156,6 @@ public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest { context.getBlobStore().putBlob(containerName, sourceObject); } - /** - * Methods for checking Content-Disposition. In this way, in implementations that do not support - * the new field, it is easy to override with empty, and allow the rest of the test to work. - * - * @param blob - * @param expected - */ - protected void checkContentDispostion(Blob blob, String expected) { - assertEquals(blob.getPayload().getContentMetadata().getContentDisposition(), expected); - } @Test(groups = { "integration", "live" }) public void testGetIfModifiedSince() throws InterruptedException { diff --git a/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java b/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java index cc3562fe65..ec289f72df 100755 --- a/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java +++ b/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java @@ -30,6 +30,8 @@ import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; import javax.annotation.Resource; @@ -45,15 +47,16 @@ import org.jclouds.compute.RunNodesException; import org.jclouds.compute.RunScriptOnNodesException; import org.jclouds.compute.callables.RunScriptOnNode; import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.options.RunScriptOptions; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; import org.jclouds.compute.strategy.DestroyNodeStrategy; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.compute.strategy.ListNodesStrategy; @@ -63,6 +66,7 @@ import org.jclouds.compute.util.ComputeUtils; import org.jclouds.domain.Location; import org.jclouds.io.Payload; import org.jclouds.logging.Logger; +import org.jclouds.predicates.RetryablePredicate; import org.jclouds.ssh.ExecResponse; import org.jclouds.ssh.SshClient; @@ -100,6 +104,7 @@ public class BaseComputeService implements ComputeService { protected final Predicate nodeRunning; protected final Predicate nodeTerminated; protected final ComputeUtils utils; + protected final Timeouts timeouts; protected final ExecutorService executor; @Inject @@ -110,7 +115,7 @@ public class BaseComputeService implements ComputeService { DestroyNodeStrategy destroyNodeStrategy, Provider templateBuilderProvider, Provider templateOptionsProvider, @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, + @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.context = checkNotNull(context, "context"); this.images = checkNotNull(images, "images"); @@ -126,6 +131,7 @@ public class BaseComputeService implements ComputeService { this.nodeRunning = checkNotNull(nodeRunning, "nodeRunning"); this.nodeTerminated = checkNotNull(nodeTerminated, "nodeTerminated"); this.utils = checkNotNull(utils, "utils"); + this.timeouts = checkNotNull(timeouts, "timeouts"); this.executor = checkNotNull(executor, "executor"); } @@ -145,9 +151,9 @@ public class BaseComputeService implements ComputeService { throws RunNodesException { checkArgument(tag.indexOf('-') == -1, "tag cannot contain hyphens"); checkNotNull(template.getLocation(), "location"); - logger.debug(">> running %d node%s tag(%s) location(%s) image(%s) hardwareProfile(%s) options(%s)", count, count > 1 ? "s" - : "", tag, template.getLocation().getId(), template.getImage().getId(), template.getHardware().getId(), - template.getOptions()); + logger.debug(">> running %d node%s tag(%s) location(%s) image(%s) hardwareProfile(%s) options(%s)", count, + count > 1 ? "s" : "", tag, template.getLocation().getId(), template.getImage().getId(), template + .getHardware().getId(), template.getOptions()); Set nodes = Sets.newHashSet(); Map badNodes = Maps.newLinkedHashMap(); Map> responses = runNodesAndAddToSetStrategy.execute(tag, count, template, nodes, badNodes); @@ -179,11 +185,27 @@ public class BaseComputeService implements ComputeService { * {@inheritDoc} */ @Override - public void destroyNode(String id) { + public void destroyNode(final String id) { checkNotNull(id, "id"); logger.debug(">> destroying node(%s)", id); - NodeMetadata node = destroyNodeStrategy.execute(id); - boolean successful = node == null ? true : nodeTerminated.apply(node); + final AtomicReference node = new AtomicReference(); + RetryablePredicate tester = new RetryablePredicate(new Predicate() { + + @Override + public boolean apply(String input) { + try { + NodeMetadata md = destroyNodeStrategy.execute(id); + if (md != null) + node.set(md); + return true; + } catch (IllegalStateException e) { + logger.warn("<< illegal state destroying node(%s)", id); + return false; + } + } + + }, timeouts.nodeRunning, 1000, TimeUnit.MILLISECONDS); + boolean successful = tester.apply(id) && (node.get() == null || nodeTerminated.apply(node.get())); logger.debug("<< destroyed node(%s) success(%s)", id, successful); } diff --git a/compute/src/main/java/org/jclouds/compute/reference/ComputeServiceConstants.java b/compute/src/main/java/org/jclouds/compute/reference/ComputeServiceConstants.java index 58dd1dc937..34981fd8b7 100644 --- a/compute/src/main/java/org/jclouds/compute/reference/ComputeServiceConstants.java +++ b/compute/src/main/java/org/jclouds/compute/reference/ComputeServiceConstants.java @@ -43,7 +43,7 @@ public interface ComputeServiceConstants { public static final String PROPERTY_BLACKLIST_NODES = "jclouds.compute.blacklist.nodes"; @Singleton - static class Timeouts { + public static class Timeouts { @Inject(optional = true) @Named(PROPERTY_TIMEOUT_NODE_TERMINATED) public long nodeTerminated = 30 * 1000; diff --git a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java index f3329a2175..300de6c21a 100755 --- a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java @@ -170,9 +170,8 @@ public abstract class BaseComputeServiceLiveTest { protected void setupCredentials() { identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); credential = System.getProperty("test." + provider + ".credential"); - endpoint = checkNotNull(System.getProperty("test." + provider + ".endpoint"), "test." + provider + ".endpoint"); - apiversion = checkNotNull(System.getProperty("test." + provider + ".apiversion"), "test." + provider - + ".apiversion"); + endpoint = System.getProperty("test." + provider + ".endpoint"); + apiversion = System.getProperty("test." + provider + ".apiversion"); } protected Properties setupProperties() { diff --git a/core/src/main/java/org/jclouds/concurrent/internal/SyncProxy.java b/core/src/main/java/org/jclouds/concurrent/internal/SyncProxy.java index 1363b80e9a..fa5e52477e 100644 --- a/core/src/main/java/org/jclouds/concurrent/internal/SyncProxy.java +++ b/core/src/main/java/org/jclouds/concurrent/internal/SyncProxy.java @@ -45,6 +45,7 @@ import com.google.common.base.Throwables; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.common.util.concurrent.ListenableFuture; +import com.google.inject.ProvisionException; /** * Generates RESTful clients from appropriately annotated interfaces. @@ -56,7 +57,7 @@ public class SyncProxy implements InvocationHandler { @SuppressWarnings("unchecked") public static T proxy(Class clazz, SyncProxy proxy) throws IllegalArgumentException, SecurityException, - NoSuchMethodException { + NoSuchMethodException { return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] { clazz }, proxy); } @@ -71,8 +72,8 @@ public class SyncProxy implements InvocationHandler { @Inject public SyncProxy(Class declaring, Object async, - @Named("sync") ConcurrentMap delegateMap, Map, Class> sync2Async) - throws SecurityException, NoSuchMethodException { + @Named("sync") ConcurrentMap delegateMap, Map, Class> sync2Async) + throws SecurityException, NoSuchMethodException { this.delegateMap = delegateMap; this.delegate = async; this.declaring = declaring; @@ -91,7 +92,7 @@ public class SyncProxy implements InvocationHandler { Method delegatedMethod = delegate.getClass().getMethod(method.getName(), method.getParameterTypes()); if (!Arrays.equals(delegatedMethod.getExceptionTypes(), method.getExceptionTypes())) throw new IllegalArgumentException(String.format( - "method %s has different typed exceptions than delegated method %s", method, delegatedMethod)); + "method %s has different typed exceptions than delegated method %s", method, delegatedMethod)); if (delegatedMethod.getReturnType().isAssignableFrom(ListenableFuture.class)) { if (method.isAnnotationPresent(Timeout.class)) { Timeout methodTimeout = method.getAnnotation(Timeout.class); @@ -123,7 +124,7 @@ public class SyncProxy implements InvocationHandler { } else if (method.isAnnotationPresent(Delegate.class)) { Class asyncClass = sync2Async.get(method.getReturnType()); checkState(asyncClass != null, "please configure corresponding async class for " + method.getReturnType() - + " in your RestClientModule"); + + " in your RestClientModule"); Object returnVal = delegateMap.get(new ClassMethodArgs(asyncClass, method, args)); return returnVal; } else if (syncMethodMap.containsKey(method)) { @@ -131,7 +132,9 @@ public class SyncProxy implements InvocationHandler { } else { try { return ((ListenableFuture) methodMap.get(method).invoke(delegate, args)).get(timeoutMap.get(method), - TimeUnit.NANOSECONDS); + TimeUnit.NANOSECONDS); + } catch (ProvisionException e) { + throw throwTypedExceptionOrCause(method.getExceptionTypes(), e); } catch (ExecutionException e) { throw throwTypedExceptionOrCause(method.getExceptionTypes(), e); } catch (Exception e) { diff --git a/core/src/main/java/org/jclouds/rest/internal/AsyncRestClientProxy.java b/core/src/main/java/org/jclouds/rest/internal/AsyncRestClientProxy.java index b322208b7c..29ad5224a7 100755 --- a/core/src/main/java/org/jclouds/rest/internal/AsyncRestClientProxy.java +++ b/core/src/main/java/org/jclouds/rest/internal/AsyncRestClientProxy.java @@ -40,8 +40,10 @@ import org.jclouds.http.HttpResponse; import org.jclouds.http.TransformingHttpCommand; import org.jclouds.internal.ClassMethodArgs; import org.jclouds.logging.Logger; +import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.InvocationContext; import org.jclouds.rest.annotations.Delegate; +import org.jclouds.util.Utils; import com.google.common.base.Function; import com.google.common.util.concurrent.Futures; @@ -117,6 +119,9 @@ public class AsyncRestClientProxy implements InvocationHandler { ((InvocationContext) exceptionParser).setContext((GeneratedHttpRequest) request); } } catch (RuntimeException e) { + AuthorizationException aex = Utils.getFirstThrowableOfType(e, AuthorizationException.class); + if (aex != null) + e = aex; if (exceptionParser != null) { try { return Futures.immediateFuture(exceptionParser.apply(e)); diff --git a/rackspace/pom.xml b/rackspace/pom.xml index 9a3ab33101..b59c1b321d 100644 --- a/rackspace/pom.xml +++ b/rackspace/pom.xml @@ -158,6 +158,14 @@ test.initializer ${test.initializer} + + jclouds.blobstore.httpstream.url + ${jclouds.blobstore.httpstream.url} + + + jclouds.blobstore.httpstream.md5 + ${jclouds.blobstore.httpstream.md5} + diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/handlers/ParseCloudServersErrorFromHttpResponse.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/handlers/ParseCloudServersErrorFromHttpResponse.java index 61359fb3bd..8b6d9216c2 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/handlers/ParseCloudServersErrorFromHttpResponse.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/handlers/ParseCloudServersErrorFromHttpResponse.java @@ -71,8 +71,10 @@ public class ParseCloudServersErrorFromHttpResponse implements HttpErrorHandler break; case 409: exception = new IllegalStateException(content); + break; default: exception = new HttpResponseException(command, response, content); + break; } } finally { releasePayload(response); diff --git a/rackspace/src/test/java/org/jclouds/rackspace/RackspaceAuthenticationLiveTest.java b/rackspace/src/test/java/org/jclouds/rackspace/RackspaceAuthenticationLiveTest.java index d066b88f67..06b4476580 100755 --- a/rackspace/src/test/java/org/jclouds/rackspace/RackspaceAuthenticationLiveTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/RackspaceAuthenticationLiveTest.java @@ -73,7 +73,7 @@ public class RackspaceAuthenticationLiveTest { authentication.authenticate("foo", "bar").get(10, TimeUnit.SECONDS); } - protected String provider = "rackspace"; + protected String provider = "cloudservers"; protected String identity; protected String credential; protected String endpoint; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VCloudError.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VCloudError.java index ccd6ccafd0..c391231b5c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VCloudError.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VCloudError.java @@ -47,6 +47,10 @@ public interface VCloudError { * A conflict was detected between sections of an OVF descriptor. */ CONFLICT, + /** + * The entity is busy + */ + BUSY_ENTITY, /** * An attempt to instantiate a vAppTemplate or use a vAppTemplate or a Vm in a composition did * not include an AllEULAsAccepted element with a value of true. diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/handlers/ParseVCloudErrorFromHttpResponse.java b/vcloud/core/src/main/java/org/jclouds/vcloud/handlers/ParseVCloudErrorFromHttpResponse.java index d68157367e..a9bc823f3d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/handlers/ParseVCloudErrorFromHttpResponse.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/handlers/ParseVCloudErrorFromHttpResponse.java @@ -41,6 +41,7 @@ import org.jclouds.util.Utils; import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.VCloudResponseException; import org.jclouds.vcloud.domain.VCloudError; +import org.jclouds.vcloud.domain.VCloudError.MinorCode; import org.jclouds.vcloud.util.VCloudUtils; /** @@ -87,7 +88,12 @@ public class ParseVCloudErrorFromHttpResponse implements HttpErrorHandler { switch (response.getStatusCode()) { case 400: - exception = new IllegalArgumentException(message, exception); + if (error != null && error.getMinorErrorCode() != null + && error.getMinorErrorCode() == MinorCode.BUSY_ENTITY) + exception = new IllegalStateException(message, exception); + else + exception = new IllegalArgumentException(message, exception); + break; case 401: case 403: exception = new AuthorizationException(command.getRequest(), message); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java index bd21d30d01..270ff0914a 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java @@ -30,12 +30,13 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.internal.BaseComputeService; import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; import org.jclouds.compute.strategy.DestroyNodeStrategy; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.compute.strategy.ListNodesStrategy; @@ -61,23 +62,24 @@ public class TerremarkVCloudComputeService extends BaseComputeService { @Inject protected TerremarkVCloudComputeService(ComputeServiceContext context, Supplier> images, - Supplier> sizes, Supplier> locations, - ListNodesStrategy listNodesStrategy, GetNodeMetadataStrategy getNodeMetadataStrategy, - RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, - DestroyNodeStrategy destroyNodeStrategy, Provider templateBuilderProvider, - Provider templateOptionsProvider, @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, CleanupOrphanKeys cleanupOrphanKeys, - ConcurrentMap credentialsMap, NodeMetadataToOrgAndName nodeToOrgAndName) { + Supplier> sizes, Supplier> locations, + ListNodesStrategy listNodesStrategy, GetNodeMetadataStrategy getNodeMetadataStrategy, + RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, + DestroyNodeStrategy destroyNodeStrategy, Provider templateBuilderProvider, + Provider templateOptionsProvider, + @Named("NODE_RUNNING") Predicate nodeRunning, + @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, CleanupOrphanKeys cleanupOrphanKeys, + ConcurrentMap credentialsMap, NodeMetadataToOrgAndName nodeToOrgAndName) { super(context, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, runNodesAndAddToSetStrategy, - rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, - nodeTerminated, utils, executor); + rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, + nodeTerminated, utils, timeouts, executor); this.cleanupOrphanKeys = cleanupOrphanKeys; } /** - * like {@link BaseComputeService#destroyNodesMatching} except that this will - * clean implicit keypairs. + * like {@link BaseComputeService#destroyNodesMatching} except that this will clean implicit + * keypairs. */ @Override public Set destroyNodesMatching(Predicate filter) { @@ -87,8 +89,7 @@ public class TerremarkVCloudComputeService extends BaseComputeService { } /** - * returns template options, except of type - * {@link TerremarkVCloudTemplateOptions}. + * returns template options, except of type {@link TerremarkVCloudTemplateOptions}. */ @Override public TerremarkVCloudTemplateOptions templateOptions() {