diff --git a/README.txt b/README.txt index 4a000b28d2..d5bc557537 100644 --- a/README.txt +++ b/README.txt @@ -19,22 +19,26 @@ Overview: -jclouds is an open source framework that helps you get started in the cloud +jclouds is an open source library that helps you get started in the cloud and reuse your java and clojure development skills. Our api allows you to -freedom to use portable abstractions or cloud-specific features. +freedom to use portable abstractions or cloud-specific features. We have +two abstractions at the moment: compute and blobstore. compute helps you +bootstrap machines in the cloud. blobstore helps you manage key-value +data. our current version is 1.0-beta-7 our dev version is 1.0-SNAPSHOT -our compute api supports: ec2, gogrid, rackspace, rimuhosting, vcloud, trmk-ecloud, - trmk-vcloudexpress, eucalyptus, bluelock-vclouddirector, - bluelock-vcloudexpress, slicehost, stub (in-memory) +our compute api supports: ec2, gogrid, cloudservers (rackspace), rimuhosting, vcloud, + trmk-ecloud, trmk-vcloudexpress, eucalyptus, + bluelock-vclouddirector, slicehost, stub (in-memory) * note * the pom dependency org.jclouds/jclouds-allcompute gives you access to to all of these providers -our blobstore api supports: s3, rackspace, azure, atmos online, att synaptic, - walrus, googlestorage, transient (in-memory), filesystem (on-disk) +our blobstore api supports: s3, cloudfiles (rackspace), azurestorage, atmosonline, + synaptic, peer1-storage, walrus, googlestorage, + transient (in-memory), filesystem (on-disk) * note * the pom dependency org.jclouds/jclouds-allblobstore gives you access to to all of these providers diff --git a/atmos/pom.xml b/atmos/pom.xml index aec222e1a4..3846cd76dd 100644 --- a/atmos/pom.xml +++ b/atmos/pom.xml @@ -36,6 +36,10 @@ 1.3.0 FIXME FIXME + https://cloudonestorage.peer1.com + 1.3.0 + FIXME + FIXME https://storage.synaptic.att.com 1.3.0 FIXME @@ -107,6 +111,22 @@ test.atmosonline.credential ${test.atmosonline.credential} + + test.peer1-storage.endpoint + ${test.peer1-storage.endpoint} + + + test.peer1-storage.apiversion + ${test.peer1-storage.apiversion} + + + test.peer1-storage.identity + ${test.peer1-storage.identity} + + + test.peer1-storage.credential + ${test.peer1-storage.credential} + test.synaptic.endpoint ${test.synaptic.endpoint} diff --git a/atmos/src/main/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClient.java b/atmos/src/main/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClient.java index 2ba7495fb2..ec9a939907 100644 --- a/atmos/src/main/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClient.java +++ b/atmos/src/main/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClient.java @@ -29,6 +29,7 @@ import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.jclouds.atmosonline.saas.binders.BindMetadataToHeaders; @@ -103,6 +104,7 @@ public interface AtmosStorageAsyncClient { @POST @Path("/{directoryName}/") @ExceptionParser(ReturnEndpointIfAlreadyExists.class) + @Produces(MediaType.APPLICATION_OCTET_STREAM) @Consumes(MediaType.WILDCARD) ListenableFuture createDirectory(@PathParam("directoryName") String directoryName); diff --git a/atmos/src/main/java/org/jclouds/atmosonline/saas/filters/SignRequest.java b/atmos/src/main/java/org/jclouds/atmosonline/saas/filters/SignRequest.java index 861f84ed80..23a5ef0c3e 100644 --- a/atmos/src/main/java/org/jclouds/atmosonline/saas/filters/SignRequest.java +++ b/atmos/src/main/java/org/jclouds/atmosonline/saas/filters/SignRequest.java @@ -148,7 +148,7 @@ public class SignRequest implements HttpRequestFilter { // TreeSet == Sort the headers alphabetically. Set headers = new TreeSet(request.getHeaders().keySet()); for (String header : headers) { - if (header.startsWith("x-emc-")) { + if (header.startsWith("x-emc-") && !header.equals(AtmosStorageHeaders.SIGNATURE)) { // Convert all header names to lowercase. toSign.append(header.toLowerCase()).append(":"); // For headers with values that span multiple lines, convert them into one line by diff --git a/atmos/src/test/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClientTest.java b/atmos/src/test/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClientTest.java index d30356c52c..14a229ef48 100644 --- a/atmos/src/test/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClientTest.java +++ b/atmos/src/test/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClientTest.java @@ -140,7 +140,7 @@ public class AtmosStorageAsyncClientTest extends RestClientTestLength Required\r\n", IllegalArgumentException.class); } + + @Test + public void test412WithTextHtmlHttpResponseException() { + assertCodeMakes("GET", URI + .create("https://jclouds.blob.core.windows.net/adriancole-blobstore2?restype=container&comp=list&prefix=apps/apps/apps/&include=metadata"), 412, + "HTTP/1.1 412 The condition specified using HTTP conditional header(s) is not met.", "application/xml", "ConditionNotMetThe condition specified using HTTP conditional header(s) is not met.\nRequestId:921efcad-84bc-4e0a-863d-24810d1096e1\nTime:2010-11-04T15:03:07.8694513Z", + AzureStorageResponseException.class); + } private void assertCodeMakes(String method, URI uri, int statusCode, String message, String contentType, String content, Class expected) { diff --git a/blobstore/src/main/clojure/org/jclouds/blobstore.clj b/blobstore/src/main/clojure/org/jclouds/blobstore.clj index 8b626ff69a..3807697c1a 100644 --- a/blobstore/src/main/clojure/org/jclouds/blobstore.clj +++ b/blobstore/src/main/clojure/org/jclouds/blobstore.clj @@ -21,7 +21,8 @@ "A clojure binding for the jclouds BlobStore. Current supported services are: - [transient, filesystem, s3, azureblob, atmos, cloudfiles, walrus, googlestorage] + [transient, filesystem, s3, azureblob, atmos, cloudfiles, walrus, + googlestorage, synaptic, peer1-storage] Here's a quick example of how to viewresources in rackspace 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 fa5e52477e..9594a7ecff 100644 --- a/core/src/main/java/org/jclouds/concurrent/internal/SyncProxy.java +++ b/core/src/main/java/org/jclouds/concurrent/internal/SyncProxy.java @@ -35,6 +35,7 @@ import javax.inject.Inject; import javax.inject.Named; import org.jclouds.concurrent.Timeout; +import org.jclouds.http.HttpResponseException; import org.jclouds.internal.ClassMethodArgs; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ResourceNotFoundException; @@ -57,7 +58,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); } @@ -72,8 +73,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; @@ -92,7 +93,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); @@ -124,7 +125,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)) { @@ -132,7 +133,7 @@ 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) { @@ -143,6 +144,7 @@ public class SyncProxy implements InvocationHandler { } } + // Note this needs to be kept up-to-date with all top-level exceptions jclouds works against @SuppressWarnings("unchecked") public static Exception throwTypedExceptionOrCause(Class[] exceptionTypes, Exception exception) throws Exception { for (Class type : exceptionTypes) { @@ -154,6 +156,7 @@ public class SyncProxy implements InvocationHandler { Throwables.propagateIfInstanceOf(exception, IllegalStateException.class); Throwables.propagateIfInstanceOf(exception, AuthorizationException.class); Throwables.propagateIfInstanceOf(exception, ResourceNotFoundException.class); + Throwables.propagateIfInstanceOf(exception, HttpResponseException.class); Throwables.throwCause(exception, true); return exception; } diff --git a/core/src/main/java/org/jclouds/http/functions/ParseSax.java b/core/src/main/java/org/jclouds/http/functions/ParseSax.java index cb2045e2c1..d313e468ca 100644 --- a/core/src/main/java/org/jclouds/http/functions/ParseSax.java +++ b/core/src/main/java/org/jclouds/http/functions/ParseSax.java @@ -26,12 +26,10 @@ import static com.google.common.io.Closeables.closeQuietly; import java.io.InputStream; import java.io.StringReader; -import javax.annotation.Resource; import javax.inject.Inject; import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpResponse; -import org.jclouds.logging.Logger; import org.jclouds.rest.InvocationContext; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.util.Utils; @@ -41,6 +39,7 @@ import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import com.google.common.base.Function; +import com.google.common.base.Throwables; /** * This object will parse the body of an HttpResponse and return the result of type back to the @@ -52,8 +51,6 @@ public class ParseSax implements Function, InvocationContext private final XMLReader parser; private final HandlerWithResult handler; - @Resource - protected Logger logger = Logger.NULL; private HttpRequest request; public static interface Factory { @@ -71,7 +68,7 @@ public class ParseSax implements Function, InvocationContext checkNotNull(from, "http response"); checkNotNull(from.getPayload(), "payload in " + from); } catch (NullPointerException e) { - return addRequestDetailsToException(e); + return addDetailsAndPropagate(from, e); } if (from.getStatusCode() >= 300) return convertStreamToStringAndParse(from); @@ -82,7 +79,7 @@ public class ParseSax implements Function, InvocationContext try { return parse(Utils.toStringAndClose(from.getPayload().getInput())); } catch (Exception e) { - return addRequestDetailsToException(e); + return addDetailsAndPropagate(from, e); } } @@ -91,7 +88,7 @@ public class ParseSax implements Function, InvocationContext checkNotNull(from, "xml string"); checkArgument(from.indexOf('<') >= 0, String.format("not an xml document [%s] ", from)); } catch (RuntimeException e) { - return addRequestDetailsToException(e); + return addDetailsAndPropagate(null, e); } return parse(new InputSource(new StringReader(from))); } @@ -113,31 +110,39 @@ public class ParseSax implements Function, InvocationContext parser.parse(from); return getHandler().getResult(); } catch (Exception e) { - return addRequestDetailsToException(e); + return addDetailsAndPropagate(null, e); } } - private T addRequestDetailsToException(Exception e) { - String exceptionMessage = e.getMessage(); + public T addDetailsAndPropagate(HttpResponse response, Exception e) { + StringBuilder message = new StringBuilder(); + if (request != null) { + message.append("request: ").append(request.getRequestLine()); + } + if (response != null) { + if (message.length() != 0) + message.append("; "); + message.append("response: ").append(response.getStatusLine()); + } if (e instanceof SAXParseException) { SAXParseException parseException = (SAXParseException) e; String systemId = parseException.getSystemId(); if (systemId == null) { systemId = ""; } - exceptionMessage = String.format("Error on line %d of document %s: %s", systemId, parseException - .getLineNumber(), parseException.getMessage()); + if (message.length() != 0) + message.append("; "); + message.append(String.format("error at %d:%d in document %s", parseException.getColumnNumber(), + parseException.getLineNumber(), systemId)); } - if (request != null) { - StringBuilder message = new StringBuilder(); - message.append("Error parsing input for ").append(request.getRequestLine()).append(": "); - message.append(exceptionMessage); - logger.error(e, message.toString()); + if (message.length() != 0) { + message.append("; cause: ").append(e.toString()); throw new RuntimeException(message.toString(), e); } else { - logger.error(e, exceptionMessage.toString()); - throw new RuntimeException(exceptionMessage.toString(), e); + Throwables.propagate(e); + return null; } + } public HandlerWithResult getHandler() { diff --git a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java index 4ee32f93f4..3b61dd877a 100755 --- a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java +++ b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java @@ -33,7 +33,7 @@ import static com.google.common.collect.Sets.difference; import static com.google.common.collect.Sets.newHashSet; import static com.google.common.collect.Sets.newTreeSet; import static java.util.Arrays.asList; -import static javax.ws.rs.core.HttpHeaders.ACCEPT; +import static javax.ws.rs.core.HttpHeaders.*; import static javax.ws.rs.core.HttpHeaders.CONTENT_TYPE; import static javax.ws.rs.core.HttpHeaders.HOST; import static org.jclouds.http.HttpUtils.makeQueryLine; @@ -128,6 +128,7 @@ import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.MapMaker; @@ -470,6 +471,9 @@ public class RestAnnotationProcessor { payload = new MultipartForm(BOUNDARY, parts); } else if (formParams.size() > 0) { payload = Payloads.newUrlEncodedFormPayload(formParams, skips); + } else if (headers.containsKey(CONTENT_TYPE)) { + payload = Payloads.newByteArrayPayload(new byte[]{}); + payload.getContentMetadata().setContentType(Iterables.get(headers.get(CONTENT_TYPE),0)); } if (payload != null) { request.setPayload(payload); diff --git a/core/src/main/resources/rest.properties b/core/src/main/resources/rest.properties index 32844739b3..7fb01d36cc 100644 --- a/core/src/main/resources/rest.properties +++ b/core/src/main/resources/rest.properties @@ -104,7 +104,11 @@ synaptic.contextbuilder=org.jclouds.atmosonline.saas.AtmosStorageContextBuilder synaptic.endpoint=https://storage.synaptic.att.com synaptic.apiversion=1.3.0 -# TODO peer1 and hostedsolutions use atmos +peer1-storage.contextbuilder=org.jclouds.atmosonline.saas.AtmosStorageContextBuilder +peer1-storage.endpoint=https://storage.synaptic.att.com +peer1-storage.apiversion=1.3.0 + +# TODO hostedsolutions use atmos cloudfiles.contextbuilder=org.jclouds.rackspace.cloudfiles.CloudFilesContextBuilder cloudfiles.propertiesbuilder=org.jclouds.rackspace.cloudfiles.CloudFilesPropertiesBuilder diff --git a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java index 7b2d4fa9f0..b107347cb6 100755 --- a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java +++ b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java @@ -373,10 +373,22 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest { @POST @Path("") public void post(HttpRequestOptions options); - + + @POST + @Path("") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public void post(); } public void testHttpRequestOptionsPayloadParam() throws SecurityException, NoSuchMethodException, IOException { + Method method = TestPayloadParamVarargs.class.getMethod("post"); + HttpRequest request = factory(TestQuery.class).createRequest(method); + assertRequestLineEquals(request, "POST http://localhost:9999?x-ms-version=2009-07-17 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, ""); + assertPayloadEquals(request, "", "application/octet-stream", false); + } + + public void testHttpRequestWithOnlyContentType() throws SecurityException, NoSuchMethodException, IOException { Method method = TestPayloadParamVarargs.class.getMethod("post", HttpRequestOptions.class); verifyTestPostOptions(method); } diff --git a/skeletons/standalone-compute/pom.xml b/skeletons/standalone-compute/pom.xml index 3ef57068aa..d65f9ef182 100644 --- a/skeletons/standalone-compute/pom.xml +++ b/skeletons/standalone-compute/pom.xml @@ -33,9 +33,10 @@ trmkrun-ccc,test.trmk-924 - https://servermanager-compute.com - 1.0 - FIXME + FIXME + https://servermanager.com + 1.0 + FIXME @@ -95,16 +96,16 @@ - test.servermanager-compute.endpoint - ${test.servermanager-compute.endpoint} + test.servermanager.endpoint + ${test.servermanager.endpoint} - test.servermanager-compute.apiversion - ${test.servermanager-compute.apiversion} + test.servermanager.apiversion + ${test.servermanager.apiversion} - test.servermanager-compute.identity - ${test.servermanager-compute.identity} + test.servermanager.identity + ${test.servermanager.identity} jclouds.compute.blacklist.nodes diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudContextBuilder.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudContextBuilder.java index 0660dc110f..9b0d6a59b0 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudContextBuilder.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudContextBuilder.java @@ -25,7 +25,7 @@ import java.util.Properties; import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; import org.jclouds.logging.jdk.config.JDKLoggingModule; import org.jclouds.vcloud.VCloudExpressContextBuilder; -import org.jclouds.vcloud.terremark.compute.config.TerremarkVCloudComputeServiceContextModule; +import org.jclouds.vcloud.terremark.compute.config.TerremarkECloudComputeServiceContextModule; import org.jclouds.vcloud.terremark.config.TerremarkECloudRestClientModule; import com.google.inject.Injector; @@ -52,7 +52,7 @@ public class TerremarkECloudContextBuilder extends VCloudExpressContextBuilder { @Override protected void addContextModule(List modules) { - modules.add(new TerremarkVCloudComputeServiceContextModule()); + modules.add(new TerremarkECloudComputeServiceContextModule()); } @Override diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java index 9bec07eb52..547bdaf8f3 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java @@ -21,6 +21,7 @@ package org.jclouds.vcloud.terremark; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; import static org.jclouds.vcloud.terremark.reference.TerremarkConstants.PROPERTY_TERREMARK_EXTENSION_NAME; import static org.jclouds.vcloud.terremark.reference.TerremarkConstants.PROPERTY_TERREMARK_EXTENSION_VERSION; @@ -39,6 +40,8 @@ public class TerremarkECloudPropertiesBuilder extends TerremarkVCloudPropertiesB properties.setProperty(PROPERTY_ENDPOINT, "https://services.enterprisecloud.terremark.com/api"); properties.setProperty(PROPERTY_TERREMARK_EXTENSION_NAME, "eCloudExtensions"); properties.setProperty(PROPERTY_TERREMARK_EXTENSION_VERSION, "2.5"); + // for some reason the centos template is very slow to deploy + properties.setProperty(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED, 720l * 1000l + ""); return properties; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkECloudComputeServiceContextModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkECloudComputeServiceContextModule.java new file mode 100644 index 0000000000..017c798f46 --- /dev/null +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkECloudComputeServiceContextModule.java @@ -0,0 +1,35 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.vcloud.terremark.compute.config; + +import static org.jclouds.compute.domain.OsFamily.CENTOS; + +import org.jclouds.compute.domain.TemplateBuilder; + +import com.google.inject.Injector; + +/** + * @author Adrian Cole + */ +public class TerremarkECloudComputeServiceContextModule extends TerremarkVCloudComputeServiceContextModule { + protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { + return template.osFamily(CENTOS); + } +} diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTestDisabled.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java similarity index 94% rename from vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTestDisabled.java rename to vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java index 9c1086b3f5..3be000c4c8 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTestDisabled.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java @@ -44,9 +44,9 @@ import org.testng.annotations.Test; * * @author Adrian Cole */ -@Test(groups = "live", enabled = false, sequential = true, testName = "terremark.TerremarkVCloudComputeServiceLiveTest") -public class TerremarkECloudComputeServiceLiveTestDisabled extends BaseComputeServiceLiveTest { - public TerremarkECloudComputeServiceLiveTestDisabled() { +@Test(groups = "live", enabled = true, sequential = true, testName = "terremark.TerremarkVCloudComputeServiceLiveTest") +public class TerremarkECloudComputeServiceLiveTest extends BaseComputeServiceLiveTest { + public TerremarkECloudComputeServiceLiveTest() { provider = "trmk-ecloud"; }