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 RestClientTest ALL_S3 = ImmutableSet.of("EU", US_STANDARD, - US_EAST_1, US_WEST_1, AP_SOUTHEAST_1); + public static Set ALL_S3 = ImmutableSet.of(EU, US_STANDARD, + US_WEST_1, AP_SOUTHEAST_1); public static Set ALL_SQS = ImmutableSet.of(EU_WEST_1, US_STANDARD, US_EAST_1, US_WEST_1, AP_SOUTHEAST_1); } \ No newline at end of file diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/EC2PropertiesBuilder.java b/aws/core/src/main/java/org/jclouds/aws/ec2/EC2PropertiesBuilder.java index b8ad68742f..67dcdf98e5 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/EC2PropertiesBuilder.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/EC2PropertiesBuilder.java @@ -26,6 +26,7 @@ import static org.jclouds.aws.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; import static org.jclouds.aws.ec2.reference.EC2Constants.PROPERTY_ELB_ENDPOINT; import static org.jclouds.aws.reference.AWSConstants.PROPERTY_AUTH_TAG; import static org.jclouds.aws.reference.AWSConstants.PROPERTY_HEADER_TAG; +import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_NODE_SUSPENDED; import java.util.Properties; @@ -49,11 +50,15 @@ public class EC2PropertiesBuilder extends PropertiesBuilder { properties.setProperty(PROPERTY_EC2_AMI_OWNERS, "137112412989,063491364108,099720109477,411009282317"); // amis that work with the cluster instances properties.setProperty(PROPERTY_EC2_CC_AMIs, "us-east-1/ami-7ea24a17"); + // sometimes, like in ec2, stop takes a very long time, perhaps + // due to volume management. one example spent 2 minutes moving + // from stopping->stopped state on an ec2 micro + properties.setProperty(PROPERTY_TIMEOUT_NODE_SUSPENDED, 120 * 1000 + ""); // auth fail sometimes happens in EC2, as the rc.local script that injects the // authorized key executes after ssh has started properties.setProperty("jclouds.ssh.max_retries", "7"); properties.setProperty("jclouds.ssh.retryable_messages", - "Auth fail,invalid data,End of IO Stream Read,Connection reset,socket is not established"); + "Auth fail,invalid data,End of IO Stream Read,Connection reset,socket is not established"); return properties; } 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 79584776ce..681b81acc3 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 @@ -24,8 +24,8 @@ import static org.jclouds.aws.ec2.util.EC2Utils.parseHandle; import static org.jclouds.util.Utils.checkNotEmpty; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.ExecutorService; import javax.inject.Inject; @@ -55,12 +55,13 @@ import org.jclouds.compute.strategy.DestroyNodeStrategy; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.compute.strategy.ResumeNodeStrategy; +import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.compute.strategy.SuspendNodeStrategy; import org.jclouds.compute.util.ComputeUtils; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; +import org.jclouds.http.HttpResponseException; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; @@ -80,23 +81,23 @@ public class EC2ComputeService extends BaseComputeService { @Inject protected EC2ComputeService(ComputeServiceContext context, Map credentialStore, - @Memoized Supplier> images, @Memoized Supplier> sizes, - @Memoized Supplier> locations, ListNodesStrategy listNodesStrategy, - GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, - RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, - ResumeNodeStrategy startNodeStrategy, SuspendNodeStrategy stopNodeStrategy, - Provider templateBuilderProvider, Provider templateOptionsProvider, - @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, - @Named("NODE_SUSPENDED") Predicate nodeSuspended, 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) { + @Memoized Supplier> images, @Memoized Supplier> sizes, + @Memoized Supplier> locations, ListNodesStrategy listNodesStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, + ResumeNodeStrategy startNodeStrategy, SuspendNodeStrategy stopNodeStrategy, + Provider templateBuilderProvider, Provider templateOptionsProvider, + @Named("NODE_RUNNING") Predicate nodeRunning, + @Named("NODE_TERMINATED") Predicate nodeTerminated, + @Named("NODE_SUSPENDED") Predicate nodeSuspended, 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, credentialStore, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, - runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, startNodeStrategy, - stopNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, nodeTerminated, - nodeSuspended, utils, timeouts, executor); + runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, startNodeStrategy, stopNodeStrategy, + templateBuilderProvider, templateOptionsProvider, nodeRunning, nodeTerminated, nodeSuspended, utils, + timeouts, executor); this.ec2Client = ec2Client; this.credentialsMap = credentialsMap; this.securityGroupMap = securityGroupMap; @@ -108,21 +109,28 @@ public class EC2ComputeService extends BaseComputeService { void deletePlacementGroup(String region, String tag) { checkNotEmpty(tag, "tag"); String group = String.format("jclouds#%s#%s", tag, region); - if (ec2Client.getPlacementGroupServices().describePlacementGroupsInRegion(region, group).size() > 0) { - logger.debug(">> deleting placementGroup(%s)", group); - try { - ec2Client.getPlacementGroupServices().deletePlacementGroupInRegion(region, group); - checkState(placementGroupDeleted.apply(new PlacementGroup(region, group, "cluster", State.PENDING)), String - .format("placementGroup region(%s) name(%s) failed to delete", region, group)); - placementGroupMap.remove(new RegionAndName(region, tag)); - logger.debug("<< deleted placementGroup(%s)", group); - } catch (AWSResponseException e) { - if (e.getError().getCode().equals("InvalidPlacementGroup.InUse")) { - logger.debug("<< inUse placementGroup(%s)", group); - } else { - throw e; + try { + if (ec2Client.getPlacementGroupServices().describePlacementGroupsInRegion(region, group).size() > 0) { + logger.debug(">> deleting placementGroup(%s)", group); + try { + ec2Client.getPlacementGroupServices().deletePlacementGroupInRegion(region, group); + checkState(placementGroupDeleted.apply(new PlacementGroup(region, group, "cluster", State.PENDING)), + String.format("placementGroup region(%s) name(%s) failed to delete", region, group)); + placementGroupMap.remove(new RegionAndName(region, tag)); + logger.debug("<< deleted placementGroup(%s)", group); + } catch (AWSResponseException e) { + if (e.getError().getCode().equals("InvalidPlacementGroup.InUse")) { + logger.debug("<< inUse placementGroup(%s)", group); + } else { + throw e; + } } } + } catch (HttpResponseException e) { + // Eucalyptus does not support placement groups yet. + if (!(e.getResponse().getStatusCode() == 400 && context.getProviderSpecificContext().getProvider() + .equals("eucalyptus"))) + throw e; } } diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java index 7d8fde80ad..b5e76743b1 100755 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java @@ -22,7 +22,6 @@ package org.jclouds.aws.ec2.compute.config; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.jclouds.compute.domain.OsFamily.AMZN_LINUX; import static org.jclouds.compute.domain.OsFamily.CENTOS; -import static org.jclouds.compute.domain.OsFamily.UBUNTU; import java.util.Map; @@ -65,12 +64,12 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod @Override protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { String provider = injector.getInstance(Key.get(String.class, Provider.class)); - if ("eucalyptus".equals(provider)) - return template.osFamily(CENTOS); - else if ("nova".equals(provider)) - return template.osFamily(UBUNTU); - else + if ("ec2".equals(provider)) return template.osFamily(AMZN_LINUX).os64Bit(true); + else if ("nova".equals(provider)) + return super.provideTemplate(injector, template); + else + return template.osFamily(CENTOS); } @Provides diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java index e25b15d4b6..ed81f4ffe8 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java @@ -21,8 +21,8 @@ package org.jclouds.aws.ec2.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.compute.util.ComputeServiceUtils.parseOsFamilyOrNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseVersionOrReturnEmptyString; +import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; import java.util.regex.Matcher; @@ -42,6 +42,7 @@ import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; +import org.jclouds.compute.util.ComputeServiceUtils; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; @@ -72,32 +73,35 @@ public class ImageParser implements Function> locations; private final Supplier defaultLocation; private final String provider; + private final Map> osVersionMap; @Inject ImageParser(PopulateDefaultLoginCredentialsForImageStrategy credentialProvider, - @Memoized Supplier> locations, Supplier defaultLocation, - @Provider String provider) { + Map> osVersionMap, @Memoized Supplier> locations, + Supplier defaultLocation, @Provider String provider) { this.credentialProvider = checkNotNull(credentialProvider, "credentialProvider"); this.locations = checkNotNull(locations, "locations"); this.defaultLocation = checkNotNull(defaultLocation, "defaultLocation"); this.provider = checkNotNull(provider, "provider"); + this.osVersionMap = checkNotNull(osVersionMap, "utils"); } @Override @@ -111,12 +115,13 @@ public class ImageParser implements Function of("owner", from.getImageOwnerId(), "rootDeviceType", from - .getRootDeviceType().toString())); + .getRootDeviceType().toString())); OsFamily osFamily = parseOsFamilyOrNull(provider, from.getImageLocation()); String osName = null; String osArch = from.getVirtualizationType(); - String osVersion = parseVersionOrReturnEmptyString(osFamily, from.getImageLocation()); + String osVersion = ComputeServiceUtils.parseVersionOrReturnEmptyString(osFamily, from.getImageLocation(), + osVersionMap); String osDescription = from.getImageLocation(); boolean is64Bit = from.getArchitecture() == Architecture.X86_64; try { @@ -126,10 +131,10 @@ public class ImageParser implements Function> { sizes.add(cc1_4xlarge().location(location).supportsImageIds(ccAmi).build()); } sizes.addAll(ImmutableSet. of(t1_micro().build(), c1_medium().build(), c1_xlarge().build(), m1_large() - .build(), "nova".equals(providerName) ? m1_small().supportsImage(any()).build() : m1_small().build(), + .build(), !"ec2".equals(providerName) ? m1_small().supportsImage(any()).build() : m1_small().build(), m1_xlarge().build(), m2_xlarge().build(), m2_2xlarge().build(), m2_4xlarge().build())); return sizes; } diff --git a/aws/core/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java b/aws/core/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java index 1ecc0d1fcc..c31338a882 100755 --- a/aws/core/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java +++ b/aws/core/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java @@ -66,14 +66,13 @@ public class ParseAWSErrorFromXmlContent implements HttpErrorHandler { public void handleError(HttpCommand command, HttpResponse response) { HttpRequest request = command.getRequest(); - Exception exception = new HttpResponseException(command, response); + Exception exception = null; try { AWSError error = null; String message = null; if (response.getPayload() != null) { String contentType = response.getPayload().getContentMetadata().getContentType(); - if (contentType != null - && (contentType.indexOf("xml") != -1 || contentType.indexOf("unknown") != -1)) { + if (contentType != null && (contentType.indexOf("xml") != -1 || contentType.indexOf("unknown") != -1)) { error = utils.parseAWSErrorFromContent(request, response); if (error != null) { message = error.getMessage(); @@ -86,36 +85,39 @@ public class ParseAWSErrorFromXmlContent implements HttpErrorHandler { } } } - message = message != null ? message : String.format("%s -> %s", request.getRequestLine(), response - .getStatusLine()); + message = message != null ? message : String.format("%s -> %s", request.getRequestLine(), + response.getStatusLine()); + if (exception == null) + exception = new HttpResponseException(command, response, message); switch (response.getStatusCode()) { - case 400: - if (error != null && error.getCode() != null - && (error.getCode().endsWith(".NotFound") || error.getCode().endsWith(".Unknown"))) - exception = new ResourceNotFoundException(message, exception); - else if ((error != null && error.getCode() != null && (error.getCode().equals("IncorrectState") || error - .getCode().endsWith(".Duplicate"))) - || (message != null && message.indexOf("already exists") != -1)) - exception = new IllegalStateException(message, exception); - else if (error != null && error.getCode() != null && error.getCode().equals("AuthFailure")) - exception = new AuthorizationException(command.getRequest(), message); - else if (message != null && message.indexOf("Failed to bind the following fields") != -1)// Nova - exception = new IllegalArgumentException(message, exception); - break; - case 401: - case 403: + case 400: + if (error != null && error.getCode() != null + && (error.getCode().endsWith(".NotFound") || error.getCode().endsWith(".Unknown"))) + exception = new ResourceNotFoundException(message, exception); + else if ((error != null && error.getCode() != null && (error.getCode().equals("IncorrectState") || error + .getCode().endsWith(".Duplicate"))) || (message != null && message.indexOf("already exists") != -1)) + exception = new IllegalStateException(message, exception); + else if (error != null && error.getCode() != null && error.getCode().equals("AuthFailure")) exception = new AuthorizationException(command.getRequest(), message); - break; - case 404: - if (!command.getRequest().getMethod().equals("DELETE")) { - String container = request.getEndpoint().getHost(); - String key = request.getEndpoint().getPath(); - if (key == null || key.equals("/")) - exception = new ContainerNotFoundException(container, message); - else - exception = new KeyNotFoundException(container, key, message); - } - break; + else if (message != null && message.indexOf("Failed to bind the following fields") != -1)// Nova + exception = new IllegalArgumentException(message, exception); + break; + case 401: + case 403: + exception = new AuthorizationException(command.getRequest(), message); + break; + case 404: + if (!command.getRequest().getMethod().equals("DELETE")) { + String container = request.getEndpoint().getHost(); + String key = request.getEndpoint().getPath(); + if (key == null || key.equals("/")) + exception = new ContainerNotFoundException(container, message); + else + exception = new KeyNotFoundException(container, key, message); + } + break; + case 409: + exception = new IllegalStateException(message, exception); } } finally { releasePayload(response); diff --git a/aws/core/src/main/java/org/jclouds/aws/s3/S3PropertiesBuilder.java b/aws/core/src/main/java/org/jclouds/aws/s3/S3PropertiesBuilder.java index b0ef49ccce..c66cafbd57 100644 --- a/aws/core/src/main/java/org/jclouds/aws/s3/S3PropertiesBuilder.java +++ b/aws/core/src/main/java/org/jclouds/aws/s3/S3PropertiesBuilder.java @@ -60,20 +60,15 @@ public class S3PropertiesBuilder extends PropertiesBuilder { } protected Properties addEndpoints(Properties properties) { - properties.setProperty(PROPERTY_REGIONS, Joiner.on(',').join(Region.US_STANDARD, - Region.US_EAST_1, Region.US_WEST_1, "EU", Region.AP_SOUTHEAST_1)); - properties.setProperty(PROPERTY_DEFAULT_REGIONS, Joiner.on(',').join(Region.US_STANDARD, - Region.US_EAST_1)); + properties.setProperty(PROPERTY_REGIONS, + Joiner.on(',').join(Region.US_STANDARD, Region.US_WEST_1, "EU", Region.AP_SOUTHEAST_1)); + properties.setProperty(PROPERTY_DEFAULT_REGIONS, Region.US_STANDARD); properties.setProperty(PROPERTY_ENDPOINT, "https://s3.amazonaws.com"); - properties.setProperty(PROPERTY_ENDPOINT + "." + Region.US_STANDARD, - "https://s3.amazonaws.com"); - properties - .setProperty(PROPERTY_ENDPOINT + "." + Region.US_EAST_1, "https://s3.amazonaws.com"); - properties.setProperty(PROPERTY_ENDPOINT + "." + Region.US_WEST_1, - "https://s3-us-west-1.amazonaws.com"); + properties.setProperty(PROPERTY_ENDPOINT + "." + Region.US_STANDARD, "https://s3.amazonaws.com"); + properties.setProperty(PROPERTY_ENDPOINT + "." + Region.US_WEST_1, "https://s3-us-west-1.amazonaws.com"); properties.setProperty(PROPERTY_ENDPOINT + "." + "EU", "https://s3-eu-west-1.amazonaws.com"); - properties.setProperty(PROPERTY_ENDPOINT + "." + Region.AP_SOUTHEAST_1, - "https://s3-ap-southeast-1.amazonaws.com"); + properties + .setProperty(PROPERTY_ENDPOINT + "." + Region.AP_SOUTHEAST_1, "https://s3-ap-southeast-1.amazonaws.com"); return properties; } @@ -92,8 +87,8 @@ public class S3PropertiesBuilder extends PropertiesBuilder { protected void setMetaPrefix() { if (properties.getProperty(PROPERTY_USER_METADATA_PREFIX) == null) { - properties.setProperty(PROPERTY_USER_METADATA_PREFIX, String.format("x-%s-meta-", - properties.getProperty(PROPERTY_HEADER_TAG))); + properties.setProperty(PROPERTY_USER_METADATA_PREFIX, + String.format("x-%s-meta-", properties.getProperty(PROPERTY_HEADER_TAG))); } } diff --git a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/functions/BucketToResourceMetadata.java b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/functions/BucketToResourceMetadata.java index 1a91201aff..a1a891be0b 100644 --- a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/functions/BucketToResourceMetadata.java +++ b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/functions/BucketToResourceMetadata.java @@ -71,19 +71,21 @@ public class BucketToResourceMetadata implements Function locations = this.locations.get(); final String region = client.getBucketLocation(from.getName()); + assert region != null : String.format("could not get region for %s", from.getName()); if (region != null) { try { - return Iterables.find(locations.get(), new Predicate() { + return Iterables.find(locations, new Predicate() { @Override public boolean apply(Location input) { - return input.getId().equals(region.toString()); + return input.getId().equalsIgnoreCase(region.toString()); } }); } catch (NoSuchElementException e) { - logger.error("could not get location for region %s in %s", region, locations.get()); + logger.error("could not get location for region %s in %s", region, locations); } } else { logger.error("could not get region for %s", from.getName()); diff --git a/aws/core/src/main/java/org/jclouds/aws/s3/xml/LocationConstraintHandler.java b/aws/core/src/main/java/org/jclouds/aws/s3/xml/LocationConstraintHandler.java index bfb2b0d5ba..d0b89f9eb3 100644 --- a/aws/core/src/main/java/org/jclouds/aws/s3/xml/LocationConstraintHandler.java +++ b/aws/core/src/main/java/org/jclouds/aws/s3/xml/LocationConstraintHandler.java @@ -50,8 +50,8 @@ public class LocationConstraintHandler extends ParseSax.HandlerWithResult of("jclouds#" + tag + "#" - + instance.getRegion(), tag)); + assertEquals(Sets.newTreeSet(instance.getGroupIds()), + ImmutableSortedSet. of("jclouds#" + tag + "#" + instance.getRegion(), tag)); // make sure our dummy group has no rules SecurityGroup group = Iterables.getOnlyElement(securityGroupClient.describeSecurityGroupsInRegion(null, - "jclouds#" + tag + "#" + instance.getRegion())); + "jclouds#" + tag + "#" + instance.getRegion())); assert group.getIpPermissions().size() == 0 : group; // try to run a script with the original keyPair - runScriptWithCreds(tag, first.getOperatingSystem(), new Credentials(first.getCredentials().identity, result - .getKeyMaterial())); + runScriptWithCreds(tag, first.getOperatingSystem(), + new Credentials(first.getCredentials().identity, result.getKeyMaterial())); } finally { client.destroyNodesMatching(NodePredicates.withTag(tag)); @@ -168,11 +168,11 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { assertEquals(instance.getMonitoringState(), MonitoringState.ENABLED); RestContext monitoringContext = new RestContextFactory().createContext( - "cloudwatch", identity, credential, ImmutableSet. of(new Log4JLoggingModule())); + "cloudwatch", identity, credential, ImmutableSet. of(new Log4JLoggingModule())); try { Set datapoints = monitoringContext.getApi().getMetricStatisticsInRegion(instance.getRegion(), - "CPUUtilization", before, new Date(), 60, "Average"); + "CPUUtilization", before, new Date(), 60, "Average"); assert datapoints != null; } finally { monitoringContext.close(); @@ -182,13 +182,13 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { @Test(enabled = true, dependsOnMethods = "testCompareSizes") public void testExtendedOptionsNoKeyPair() throws Exception { SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) - .getSecurityGroupServices(); + .getSecurityGroupServices(); KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) - .getKeyPairServices(); + .getKeyPairServices(); InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) - .getInstanceServices(); + .getInstanceServices(); String tag = this.tag + "optionsnokey"; @@ -215,12 +215,12 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { assertEquals(instance.getKeyName(), null); // make sure we made our dummy group and also let in the user's group - assertEquals(instance.getGroupIds(), ImmutableSet. of(tag, String.format("jclouds#%s#%s", tag, - instance.getRegion()))); + assertEquals(Sets.newTreeSet(instance.getGroupIds()), + ImmutableSortedSet. of(tag, String.format("jclouds#%s#%s", tag, instance.getRegion()))); // make sure our dummy group has no rules - SecurityGroup group = Iterables.getOnlyElement(securityGroupClient.describeSecurityGroupsInRegion(null, String - .format("jclouds#%s#%s", tag, instance.getRegion()))); + SecurityGroup group = Iterables.getOnlyElement(securityGroupClient.describeSecurityGroupsInRegion(null, + String.format("jclouds#%s#%s", tag, instance.getRegion()))); assert group.getIpPermissions().size() == 0 : group; } finally { @@ -242,13 +242,13 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { return; } SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) - .getSecurityGroupServices(); + .getSecurityGroupServices(); KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) - .getKeyPairServices(); + .getKeyPairServices(); InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) - .getInstanceServices(); + .getInstanceServices(); String tag = this.tag + "optionswithsubnetid"; @@ -295,12 +295,12 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { private RunningInstance getInstance(InstanceClient instanceClient, String id) { RunningInstance instance = Iterables.getOnlyElement(Iterables.getOnlyElement(instanceClient - .describeInstancesInRegion(null, id))); + .describeInstancesInRegion(null, id))); return instance; } private void cleanupExtendedStuff(SecurityGroupClient securityGroupClient, KeyPairClient keyPairClient, String tag) - throws InterruptedException { + throws InterruptedException { try { for (SecurityGroup group : securityGroupClient.describeSecurityGroupsInRegion(null)) if (group.getName().startsWith("jclouds#" + tag) || group.getName().equals(tag)) { diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2TemplateBuilderLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2TemplateBuilderLiveTest.java index da449863fa..70f5eb92f9 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2TemplateBuilderLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2TemplateBuilderLiveTest.java @@ -19,24 +19,24 @@ package org.jclouds.aws.ec2.compute; -import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; import java.io.IOException; import java.util.Properties; -import org.jclouds.Constants; import org.jclouds.aws.ec2.domain.InstanceType; import org.jclouds.aws.ec2.reference.EC2Constants; +import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.compute.OsFamilyVersion64Bit; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; import org.jclouds.logging.log4j.config.Log4JLoggingModule; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import com.google.common.base.Predicate; import com.google.common.collect.ImmutableSet; import com.google.inject.Module; @@ -45,147 +45,106 @@ import com.google.inject.Module; * @author Adrian Cole */ @Test(groups = "live", testName = "ec2.EC2TemplateBuilderLiveTest") -public class EC2TemplateBuilderLiveTest { - protected String provider = "ec2"; - protected String identity; - protected String credential; - protected String endpoint; - protected String apiversion; +public class EC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { - @BeforeClass - protected void setupCredentials() { - identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); - credential = System.getProperty("test." + provider + ".credential"); - endpoint = System.getProperty("test." + provider + ".endpoint"); - apiversion = System.getProperty("test." + provider + ".apiversion"); + public EC2TemplateBuilderLiveTest() { + provider = "ec2"; } - protected Properties setupProperties() { - Properties overrides = new Properties(); - overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); - overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); - overrides.setProperty(provider + ".identity", identity); - if (credential != null) - overrides.setProperty(provider + ".credential", credential); - if (endpoint != null) - overrides.setProperty(provider + ".endpoint", endpoint); - if (apiversion != null) - overrides.setProperty(provider + ".apiversion", apiversion); - return overrides; + @Override + protected Predicate defineUnsupportedOperatingSystems() { + return new Predicate() { + + @Override + public boolean apply(OsFamilyVersion64Bit input) { + return input.family == OsFamily.RHEL || // + (input.family == OsFamily.CENTOS && !input.version.matches("5.[42]")) || // + (input.family == OsFamily.WINDOWS && !input.version.matches("200[38]")); + } + + }; } @Test public void testTemplateBuilderM1SMALLWithDescription() { - ComputeServiceContext newContext = null; - try { - newContext = new ComputeServiceContextFactory().createContext(provider, ImmutableSet - . of(new Log4JLoggingModule()), setupProperties()); - Template template = newContext.getComputeService().templateBuilder().hardwareId(InstanceType.M1_SMALL) - .osVersionMatches("10.10").imageDescriptionMatches("ubuntu-images").osFamily(OsFamily.UBUNTU).build(); + Template template = context.getComputeService().templateBuilder().hardwareId(InstanceType.M1_SMALL) + .osVersionMatches("10.10").imageDescriptionMatches("ubuntu-images").osFamily(OsFamily.UBUNTU).build(); + + assert (template.getImage().getProviderId().startsWith("ami-")) : template; + assertEquals(template.getImage().getOperatingSystem().getVersion(), "10.10"); + assertEquals(template.getImage().getOperatingSystem().is64Bit(), false); + assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); + assertEquals(template.getImage().getVersion(), "20101106"); + assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store"); + assertEquals(template.getLocation().getId(), "us-east-1"); + assertEquals(getCores(template.getHardware()), 1.0d); + assertEquals(template.getHardware().getId(), InstanceType.M1_SMALL); - System.out.println(template.getHardware()); - assert (template.getImage().getProviderId().startsWith("ami-")) : template; - assertEquals(template.getImage().getOperatingSystem().getVersion(), "10.10"); - assertEquals(template.getImage().getOperatingSystem().is64Bit(), false); - assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(template.getImage().getVersion(), "20101027"); - assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store"); - assertEquals(template.getLocation().getId(), "us-east-1"); - assertEquals(getCores(template.getHardware()), 1.0d); - assertEquals(template.getHardware().getId(), InstanceType.M1_SMALL); - } finally { - if (newContext != null) - newContext.close(); - } } @Test public void testTemplateBuilderCanUseImageIdAndhardwareId() { - ComputeServiceContext newContext = null; - try { - newContext = new ComputeServiceContextFactory().createContext(provider, ImmutableSet - . of(new Log4JLoggingModule()), setupProperties()); - Template template = newContext.getComputeService().templateBuilder().imageId("us-east-1/ami-ccb35ea5") - .hardwareId(InstanceType.M2_2XLARGE).build(); + Template template = context.getComputeService().templateBuilder().imageId("us-east-1/ami-ccb35ea5") + .hardwareId(InstanceType.M2_2XLARGE).build(); + + System.out.println(template.getHardware()); + assert (template.getImage().getProviderId().startsWith("ami-")) : template; + assertEquals(template.getImage().getOperatingSystem().getVersion(), "5.4"); + assertEquals(template.getImage().getOperatingSystem().is64Bit(), true); + assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS); + assertEquals(template.getImage().getVersion(), "4.4.10"); + assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store"); + assertEquals(template.getLocation().getId(), "us-east-1"); + assertEquals(getCores(template.getHardware()), 4.0d); + assertEquals(template.getHardware().getId(), InstanceType.M2_2XLARGE); - System.out.println(template.getHardware()); - assert (template.getImage().getProviderId().startsWith("ami-")) : template; - assertEquals(template.getImage().getOperatingSystem().getVersion(), "5.4"); - assertEquals(template.getImage().getOperatingSystem().is64Bit(), true); - assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS); - assertEquals(template.getImage().getVersion(), "4.4.10"); - assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store"); - assertEquals(template.getLocation().getId(), "us-east-1"); - assertEquals(getCores(template.getHardware()), 4.0d); - assertEquals(template.getHardware().getId(), InstanceType.M2_2XLARGE); - } finally { - if (newContext != null) - newContext.close(); - } } @Test public void testDefaultTemplateBuilder() throws IOException { - ComputeServiceContext newContext = null; - try { - newContext = new ComputeServiceContextFactory().createContext(provider, ImmutableSet - . of(new Log4JLoggingModule()), setupProperties()); - Template defaultTemplate = newContext.getComputeService().templateBuilder().build(); - assert (defaultTemplate.getImage().getProviderId().startsWith("ami-")) : defaultTemplate; - assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "0.9.9-beta"); - assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); - assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX); - assertEquals(defaultTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs"); - assertEquals(defaultTemplate.getLocation().getId(), "us-east-1"); - assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); + Template defaultTemplate = context.getComputeService().templateBuilder().build(); + assert (defaultTemplate.getImage().getProviderId().startsWith("ami-")) : defaultTemplate; + assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "0.9.9-beta"); + assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); + assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX); + assertEquals(defaultTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs"); + assertEquals(defaultTemplate.getLocation().getId(), "us-east-1"); + assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); - } finally { - if (newContext != null) - newContext.close(); - } } @Test public void testTemplateBuilderMicro() throws IOException { - ComputeServiceContext newContext = null; - try { - newContext = new ComputeServiceContextFactory().createContext(provider, ImmutableSet - . of(new Log4JLoggingModule()), setupProperties()); - Template microTemplate = newContext.getComputeService().templateBuilder().hardwareId(InstanceType.T1_MICRO) - .build(); - System.out.println(microTemplate.getHardware()); + Template microTemplate = context.getComputeService().templateBuilder().hardwareId(InstanceType.T1_MICRO).build(); + + assert (microTemplate.getImage().getProviderId().startsWith("ami-")) : microTemplate; + assertEquals(microTemplate.getImage().getOperatingSystem().getVersion(), "9.10"); + assertEquals(microTemplate.getImage().getOperatingSystem().is64Bit(), false); + assertEquals(microTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); + assertEquals(microTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs"); + assertEquals(microTemplate.getLocation().getId(), "us-east-1"); + assertEquals(getCores(microTemplate.getHardware()), 1.0d); - assert (microTemplate.getImage().getProviderId().startsWith("ami-")) : microTemplate; - assertEquals(microTemplate.getImage().getOperatingSystem().getVersion(), "9.10"); - assertEquals(microTemplate.getImage().getOperatingSystem().is64Bit(), false); - assertEquals(microTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(microTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs"); - assertEquals(microTemplate.getLocation().getId(), "us-east-1"); - assertEquals(getCores(microTemplate.getHardware()), 1.0d); - } finally { - if (newContext != null) - newContext.close(); - } } @Test public void testTemplateBuilderWithNoOwnersParsesImageOnDemand() throws IOException { - ComputeServiceContext newContext = null; + ComputeServiceContext context = null; try { Properties overrides = setupProperties(); // set owners to nothing overrides.setProperty(EC2Constants.PROPERTY_EC2_AMI_OWNERS, ""); - newContext = new ComputeServiceContextFactory().createContext(provider, ImmutableSet - . of(new Log4JLoggingModule()), overrides); + context = new ComputeServiceContextFactory().createContext(provider, + ImmutableSet. of(new Log4JLoggingModule()), overrides); - assertEquals(newContext.getComputeService().listImages().size(), 0); + assertEquals(context.getComputeService().listImages().size(), 0); - Template template = newContext.getComputeService().templateBuilder().imageId("us-east-1/ami-ccb35ea5").build(); + Template template = context.getComputeService().templateBuilder().imageId("us-east-1/ami-ccb35ea5").build(); System.out.println(template.getHardware()); assert (template.getImage().getProviderId().startsWith("ami-")) : template; assertEquals(template.getImage().getOperatingSystem().getVersion(), "5.4"); @@ -199,11 +158,11 @@ public class EC2TemplateBuilderLiveTest { // is 64bit // ensure we cache the new image for next time - assertEquals(newContext.getComputeService().listImages().size(), 1); + assertEquals(context.getComputeService().listImages().size(), 1); } finally { - if (newContext != null) - newContext.close(); + if (context != null) + context.close(); } } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EucalyptusComputeServiceLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EucalyptusComputeServiceLiveTestDisabled.java similarity index 74% rename from aws/core/src/test/java/org/jclouds/aws/ec2/compute/EucalyptusComputeServiceLiveTest.java rename to aws/core/src/test/java/org/jclouds/aws/ec2/compute/EucalyptusComputeServiceLiveTestDisabled.java index 48bea286b2..a61b0659a3 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EucalyptusComputeServiceLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EucalyptusComputeServiceLiveTestDisabled.java @@ -28,13 +28,14 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** + * Disabled until we have an environment with enough room to run a few nodes simultaneously. * * @author Adrian Cole */ -@Test(groups = "live", sequential = true, testName = "ec2.EucalyptusComputeServiceLiveTest") -public class EucalyptusComputeServiceLiveTest extends EC2ComputeServiceLiveTest { +@Test(groups = "live", enabled = true, sequential = true, testName = "ec2.EucalyptusComputeServiceLiveTest") +public class EucalyptusComputeServiceLiveTestDisabled extends EC2ComputeServiceLiveTest { - public EucalyptusComputeServiceLiveTest() { + public EucalyptusComputeServiceLiveTestDisabled() { provider = "eucalyptus"; } @@ -45,12 +46,18 @@ public class EucalyptusComputeServiceLiveTest extends EC2ComputeServiceLiveTest tag = "euc"; } + @Override + @Test(enabled = false) + public void testExtendedOptionsAndLogin() throws Exception { + // euc does not support monitoring + } + @Override protected void assertDefaultWorks() { Template defaultTemplate = client.templateBuilder().build(); assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS); - assertEquals(getCores(defaultTemplate.getHardware()), 2.0d); + assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/ImageParserTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/ImageParserTest.java index a5f0443a5f..99aa26d442 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/ImageParserTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/ImageParserTest.java @@ -21,18 +21,23 @@ package org.jclouds.aws.ec2.compute.functions; import static org.testng.Assert.assertEquals; +import java.util.Map; import java.util.Set; import org.jclouds.aws.ec2.compute.strategy.EC2PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.aws.ec2.domain.Image; import org.jclouds.aws.ec2.xml.DescribeImagesResponseHandlerTest; +import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystemBuilder; import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.json.Json; +import org.jclouds.json.config.GsonModule; import org.testng.annotations.Test; import com.google.common.base.Predicates; @@ -42,6 +47,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.google.gson.Gson; +import com.google.inject.Guice; /** * @author Adrian Cole @@ -141,6 +147,10 @@ public class ImageParserTest { assertEquals( new Gson().toJson(Iterables.get(result, 1)), "{\"operatingSystem\":{\"family\":\"UBUNTU\",\"arch\":\"paravirtual\",\"version\":\"9.10\",\"description\":\"411009282317/RightImage_Ubuntu_9.10_x64_v4.5.3_EBS_Alpha\",\"is64Bit\":true},\"version\":\"4.5.3_EBS_Alpha\",\"description\":\"RightImage_Ubuntu_9.10_x64_v4.5.3_EBS_Alpha\",\"defaultCredentials\":{\"identity\":\"root\"},\"id\":\"us-east-1/ami-c19db6b5\",\"type\":\"IMAGE\",\"providerId\":\"ami-c19db6b5\",\"location\":{\"scope\":\"REGION\",\"id\":\"us-east-1\",\"description\":\"us-east-1\"},\"userMetadata\":{\"owner\":\"411009282317\",\"rootDeviceType\":\"ebs\"}}"); + + assertEquals( + new Gson().toJson(Iterables.get(result, 2)), + "{\"operatingSystem\":{\"family\":\"WINDOWS\",\"arch\":\"hvm\",\"version\":\"2003\",\"description\":\"411009282317/RightImage Windows_2003_i386_v5.4.3\",\"is64Bit\":false},\"version\":\"5.4.3\",\"description\":\"Built by RightScale\",\"defaultCredentials\":{\"identity\":\"root\"},\"id\":\"us-east-1/ami-710c2605\",\"type\":\"IMAGE\",\"providerId\":\"ami-710c2605\",\"location\":{\"scope\":\"REGION\",\"id\":\"us-east-1\",\"description\":\"us-east-1\"},\"userMetadata\":{\"owner\":\"411009282317\",\"rootDeviceType\":\"ebs\"}}"); } public void testParseEucalyptusImage() { @@ -208,8 +218,13 @@ public class ImageParserTest { static Location defaultLocation = new LocationImpl(LocationScope.REGION, "us-east-1", "us-east-1", null); public static Set convertImages(String resource) { + + Map> map = new BaseComputeServiceContextModule() { + }.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule()) + .getInstance(Json.class)); + Set result = DescribeImagesResponseHandlerTest.parseImages(resource); - ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), + ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), map, Suppliers.> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers.ofInstance(defaultLocation), "ec2"); return Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(result, parser), Predicates.notNull())); diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/services/AMIClientLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/services/AMIClientLiveTest.java index 0012e32267..673ef2b69b 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/services/AMIClientLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/services/AMIClientLiveTest.java @@ -36,12 +36,13 @@ import org.jclouds.aws.domain.Region; import org.jclouds.aws.ec2.EC2AsyncClient; import org.jclouds.aws.ec2.EC2Client; import org.jclouds.aws.ec2.domain.Image; -import org.jclouds.aws.ec2.domain.RootDeviceType; import org.jclouds.aws.ec2.domain.Image.ImageType; +import org.jclouds.aws.ec2.domain.RootDeviceType; import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; @@ -74,13 +75,12 @@ public class AMIClientLiveTest { protected String endpoint; protected String apiversion; + @BeforeClass protected void setupCredentials() { identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); - credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider - + ".credential"); - endpoint = checkNotNull(System.getProperty("test." + provider + ".endpoint"), "test." + provider + ".endpoint"); - apiversion = checkNotNull(System.getProperty("test." + provider + ".apiversion"), "test." + provider - + ".apiversion"); + credential = System.getProperty("test." + provider + ".credential"); + endpoint = System.getProperty("test." + provider + ".endpoint"); + apiversion = System.getProperty("test." + provider + ".apiversion"); } protected Properties setupProperties() { @@ -88,9 +88,12 @@ public class AMIClientLiveTest { overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); overrides.setProperty(provider + ".identity", identity); - overrides.setProperty(provider + ".credential", credential); - overrides.setProperty(provider + ".endpoint", endpoint); - overrides.setProperty(provider + ".apiversion", apiversion); + if (credential != null) + overrides.setProperty(provider + ".credential", credential); + if (endpoint != null) + overrides.setProperty(provider + ".endpoint", endpoint); + if (apiversion != null) + overrides.setProperty(provider + ".apiversion", apiversion); return overrides; } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/services/AvailabilityZoneAndRegionClientLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/services/AvailabilityZoneAndRegionClientLiveTest.java index a6e86813b4..3ef0c93d3c 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/services/AvailabilityZoneAndRegionClientLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/services/AvailabilityZoneAndRegionClientLiveTest.java @@ -27,10 +27,10 @@ import static org.testng.Assert.assertNotNull; import java.net.URI; import java.util.Iterator; +import java.util.Map.Entry; import java.util.Properties; import java.util.Set; import java.util.SortedMap; -import java.util.Map.Entry; import org.jclouds.Constants; import org.jclouds.aws.domain.Region; @@ -41,13 +41,13 @@ import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.google.inject.Module; /** @@ -66,13 +66,12 @@ public class AvailabilityZoneAndRegionClientLiveTest { protected String endpoint; protected String apiversion; + @BeforeClass protected void setupCredentials() { identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); - credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider - + ".credential"); - endpoint = checkNotNull(System.getProperty("test." + provider + ".endpoint"), "test." + provider + ".endpoint"); - apiversion = checkNotNull(System.getProperty("test." + provider + ".apiversion"), "test." + provider - + ".apiversion"); + credential = System.getProperty("test." + provider + ".credential"); + endpoint = System.getProperty("test." + provider + ".endpoint"); + apiversion = System.getProperty("test." + provider + ".apiversion"); } protected Properties setupProperties() { @@ -80,9 +79,12 @@ public class AvailabilityZoneAndRegionClientLiveTest { overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); overrides.setProperty(provider + ".identity", identity); - overrides.setProperty(provider + ".credential", credential); - overrides.setProperty(provider + ".endpoint", endpoint); - overrides.setProperty(provider + ".apiversion", apiversion); + if (credential != null) + overrides.setProperty(provider + ".credential", credential); + if (endpoint != null) + overrides.setProperty(provider + ".endpoint", endpoint); + if (apiversion != null) + overrides.setProperty(provider + ".apiversion", apiversion); return overrides; } @@ -90,26 +92,25 @@ public class AvailabilityZoneAndRegionClientLiveTest { public void setupClient() { setupCredentials(); Properties overrides = setupProperties(); - context = new ComputeServiceContextFactory().createContext(provider, ImmutableSet. of(new Log4JLoggingModule()), - overrides).getProviderSpecificContext(); + context = new ComputeServiceContextFactory().createContext(provider, + ImmutableSet. of(new Log4JLoggingModule()), overrides).getProviderSpecificContext(); client = context.getApi().getAvailabilityZoneAndRegionServices(); } public void testDescribeAvailabilityZones() { - for (String region : Lists.newArrayList(null, Region.EU_WEST_1, Region.US_EAST_1, - Region.US_WEST_1, Region.AP_SOUTHEAST_1)) { - Set allResults = Sets.newLinkedHashSet(client - .describeAvailabilityZonesInRegion(region)); + for (String region : Lists.newArrayList(null, Region.EU_WEST_1, Region.US_EAST_1, Region.US_WEST_1, + Region.AP_SOUTHEAST_1)) { + Set allResults = client.describeAvailabilityZonesInRegion(region); assertNotNull(allResults); assert allResults.size() >= 2 : allResults.size(); Iterator iterator = allResults.iterator(); String id1 = iterator.next().getZone(); String id2 = iterator.next().getZone(); - Set twoResults = Sets.newLinkedHashSet(client - .describeAvailabilityZonesInRegion(region, availabilityZones(id1, id2))); + Set twoResults = client.describeAvailabilityZonesInRegion(region, + availabilityZones(id1, id2)); assertNotNull(twoResults); assertEquals(twoResults.size(), 2); - iterator = twoResults.iterator(); + iterator = allResults.iterator(); assertEquals(iterator.next().getZone(), id1); assertEquals(iterator.next().getZone(), id2); } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/services/ElasticBlockStoreClientLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/services/ElasticBlockStoreClientLiveTest.java index 2736288474..daabd9d99d 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/services/ElasticBlockStoreClientLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/services/ElasticBlockStoreClientLiveTest.java @@ -30,7 +30,6 @@ import java.util.SortedSet; import java.util.concurrent.TimeUnit; import org.jclouds.Constants; -import org.jclouds.aws.AWSResponseException; import org.jclouds.aws.domain.Region; import org.jclouds.aws.ec2.EC2AsyncClient; import org.jclouds.aws.ec2.EC2Client; @@ -44,6 +43,7 @@ import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.RestContext; import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; @@ -71,13 +71,12 @@ public class ElasticBlockStoreClientLiveTest { protected String endpoint; protected String apiversion; + @BeforeClass protected void setupCredentials() { identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); - credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider - + ".credential"); - endpoint = checkNotNull(System.getProperty("test." + provider + ".endpoint"), "test." + provider + ".endpoint"); - apiversion = checkNotNull(System.getProperty("test." + provider + ".apiversion"), "test." + provider - + ".apiversion"); + credential = System.getProperty("test." + provider + ".credential"); + endpoint = System.getProperty("test." + provider + ".endpoint"); + apiversion = System.getProperty("test." + provider + ".apiversion"); } protected Properties setupProperties() { @@ -85,9 +84,12 @@ public class ElasticBlockStoreClientLiveTest { overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); overrides.setProperty(provider + ".identity", identity); - overrides.setProperty(provider + ".credential", credential); - overrides.setProperty(provider + ".endpoint", endpoint); - overrides.setProperty(provider + ".apiversion", apiversion); + if (credential != null) + overrides.setProperty(provider + ".credential", credential); + if (endpoint != null) + overrides.setProperty(provider + ".endpoint", endpoint); + if (apiversion != null) + overrides.setProperty(provider + ".apiversion", apiversion); return overrides; } @@ -95,15 +97,15 @@ public class ElasticBlockStoreClientLiveTest { public void setupClient() { setupCredentials(); Properties overrides = setupProperties(); - context = new ComputeServiceContextFactory().createContext(provider, ImmutableSet. of(new Log4JLoggingModule()), - overrides).getProviderSpecificContext(); + context = new ComputeServiceContextFactory().createContext(provider, + ImmutableSet. of(new Log4JLoggingModule()), overrides).getProviderSpecificContext(); client = context.getApi().getElasticBlockStoreServices(); } @Test void testDescribeVolumes() { for (String region : Lists.newArrayList(null, Region.EU_WEST_1, Region.US_EAST_1, Region.US_WEST_1, - Region.AP_SOUTHEAST_1)) { + Region.AP_SOUTHEAST_1)) { SortedSet allResults = Sets.newTreeSet(client.describeVolumesInRegion(region)); assertNotNull(allResults); if (allResults.size() >= 1) { @@ -136,11 +138,11 @@ public class ElasticBlockStoreClientLiveTest { void testCreateSnapshotInRegion() { Snapshot snapshot = client.createSnapshotInRegion(null, volumeId); Predicate snapshotted = new RetryablePredicate(new SnapshotCompleted(client), 600, 10, - TimeUnit.SECONDS); + TimeUnit.SECONDS); assert snapshotted.apply(snapshot); Snapshot result = Iterables.getOnlyElement(client.describeSnapshotsInRegion(snapshot.getRegion(), - snapshotIds(snapshot.getId()))); + snapshotIds(snapshot.getId()))); assertEquals(result.getProgress(), 100); this.snapshot = result; @@ -152,7 +154,7 @@ public class ElasticBlockStoreClientLiveTest { assertNotNull(volume); Predicate availabile = new RetryablePredicate(new VolumeAvailable(client), 600, 10, - TimeUnit.SECONDS); + TimeUnit.SECONDS); assert availabile.apply(volume); Volume result = Iterables.getOnlyElement(client.describeVolumesInRegion(snapshot.getRegion(), volume.getId())); @@ -166,12 +168,12 @@ public class ElasticBlockStoreClientLiveTest { @Test(dependsOnMethods = "testCreateSnapshotInRegion") void testCreateVolumeFromSnapshotInAvailabilityZoneWithSize() { - Volume volume = client.createVolumeFromSnapshotInAvailabilityZone(AvailabilityZone.US_EAST_1B, 2, snapshot - .getId()); + Volume volume = client.createVolumeFromSnapshotInAvailabilityZone(AvailabilityZone.US_EAST_1B, 2, + snapshot.getId()); assertNotNull(volume); Predicate availabile = new RetryablePredicate(new VolumeAvailable(client), 600, 10, - TimeUnit.SECONDS); + TimeUnit.SECONDS); assert availabile.apply(volume); Volume result = Iterables.getOnlyElement(client.describeVolumesInRegion(snapshot.getRegion(), volume.getId())); @@ -197,13 +199,13 @@ public class ElasticBlockStoreClientLiveTest { @Test void testDescribeSnapshots() { for (String region : Lists.newArrayList(null, Region.EU_WEST_1, Region.US_EAST_1, Region.US_WEST_1, - Region.AP_SOUTHEAST_1)) { + Region.AP_SOUTHEAST_1)) { SortedSet allResults = Sets.newTreeSet(client.describeSnapshotsInRegion(region)); assertNotNull(allResults); if (allResults.size() >= 1) { Snapshot snapshot = allResults.last(); - Snapshot result = Iterables.getOnlyElement(client.describeSnapshotsInRegion(region, snapshotIds(snapshot - .getId()))); + Snapshot result = Iterables.getOnlyElement(client.describeSnapshotsInRegion(region, + snapshotIds(snapshot.getId()))); assertNotNull(result); assertEquals(result, snapshot); } @@ -246,12 +248,7 @@ public class ElasticBlockStoreClientLiveTest { @Test(dependsOnMethods = "testGetCreateVolumePermissionForSnapshot") void testDeleteSnapshotInRegion() { client.deleteSnapshotInRegion(snapshot.getRegion(), snapshot.getId()); - try { - client.describeSnapshotsInRegion(snapshot.getRegion(), snapshotIds(snapshot.getId())); - assert false : "shoud have exception"; - } catch (AWSResponseException e) { - assertEquals(e.getError().getCode(), "InvalidSnapshot.NotFound"); - } + assert client.describeSnapshotsInRegion(snapshot.getRegion(), snapshotIds(snapshot.getId())).size() == 0; } @AfterTest diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java index 9062ce171c..d13b7aa6f5 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java @@ -56,7 +56,9 @@ import org.jclouds.compute.domain.Template; import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.predicates.RetryablePredicate; +import org.jclouds.ssh.jsch.config.JschSshClientModule; import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; @@ -85,13 +87,12 @@ public class PlacementGroupClientLiveTest { protected String endpoint; protected String apiversion; + @BeforeClass protected void setupCredentials() { identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); - credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider - + ".credential"); - endpoint = checkNotNull(System.getProperty("test." + provider + ".endpoint"), "test." + provider + ".endpoint"); - apiversion = checkNotNull(System.getProperty("test." + provider + ".apiversion"), "test." + provider - + ".apiversion"); + credential = System.getProperty("test." + provider + ".credential"); + endpoint = System.getProperty("test." + provider + ".endpoint"); + apiversion = System.getProperty("test." + provider + ".apiversion"); } protected Properties setupProperties() { @@ -99,9 +100,12 @@ public class PlacementGroupClientLiveTest { overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); overrides.setProperty(provider + ".identity", identity); - overrides.setProperty(provider + ".credential", credential); - overrides.setProperty(provider + ".endpoint", endpoint); - overrides.setProperty(provider + ".apiversion", apiversion); + if (credential != null) + overrides.setProperty(provider + ".credential", credential); + if (endpoint != null) + overrides.setProperty(provider + ".endpoint", endpoint); + if (apiversion != null) + overrides.setProperty(provider + ".apiversion", apiversion); return overrides; } @@ -109,14 +113,14 @@ public class PlacementGroupClientLiveTest { public void setupClient() throws FileNotFoundException, IOException { setupCredentials(); Properties overrides = setupProperties(); - context = new ComputeServiceContextFactory().createContext(provider, ImmutableSet - . of(new Log4JLoggingModule()), overrides); + context = new ComputeServiceContextFactory().createContext(provider, + ImmutableSet. of(new Log4JLoggingModule(), new JschSshClientModule()), overrides); keyPair = setupKeyPair(); client = EC2Client.class.cast(context.getProviderSpecificContext().getApi()); availableTester = new RetryablePredicate(new PlacementGroupAvailable(client), 60, 1, - TimeUnit.SECONDS); + TimeUnit.SECONDS); deletedTester = new RetryablePredicate(new PlacementGroupDeleted(client), 60, 1, TimeUnit.SECONDS); } @@ -125,12 +129,12 @@ public class PlacementGroupClientLiveTest { void testDescribe() { for (String region : newArrayList(Region.US_EAST_1)) { SortedSet allResults = newTreeSet(client.getPlacementGroupServices() - .describePlacementGroupsInRegion(region)); + .describePlacementGroupsInRegion(region)); assertNotNull(allResults); if (allResults.size() >= 1) { PlacementGroup group = allResults.last(); SortedSet result = newTreeSet(client.getPlacementGroupServices() - .describePlacementGroupsInRegion(region, group.getName())); + .describePlacementGroupsInRegion(region, group.getName())); assertNotNull(result); PlacementGroup compare = result.last(); assertEquals(compare, group); @@ -159,7 +163,7 @@ public class PlacementGroupClientLiveTest { private void verifyPlacementGroup(String groupName) { assert availableTester.apply(new PlacementGroup(Region.US_EAST_1, groupName, "cluster", State.PENDING)) : group; Set oneResult = client.getPlacementGroupServices().describePlacementGroupsInRegion(null, - groupName); + groupName); assertNotNull(oneResult); assertEquals(oneResult.size(), 1); group = oneResult.iterator().next(); @@ -169,6 +173,7 @@ public class PlacementGroupClientLiveTest { } public void testStartCCInstance() throws Exception { + Set sizes = context.getComputeService().listHardwareProfiles(); assert any(sizes, new Predicate() { @@ -194,17 +199,19 @@ public class PlacementGroupClientLiveTest { assertEquals(template.getImage().getId(), "us-east-1/ami-7ea24a17"); template.getOptions().installPrivateKey(keyPair.get("private")).authorizePublicKey(keyPair.get("public")) - .runScript(buildScript(template.getImage().getOperatingSystem())); + .runScript(buildScript(template.getImage().getOperatingSystem())); String tag = PREFIX + "cccluster"; context.getComputeService().destroyNodesMatching(NodePredicates.withTag(tag)); + // TODO make this not lookup an explicit region + client.getPlacementGroupServices().deletePlacementGroupInRegion(null, "jclouds#" + tag + "#us-east-1"); try { Set nodes = context.getComputeService().runNodesWithTag(tag, 1, template); NodeMetadata node = getOnlyElement(nodes); getOnlyElement(getOnlyElement(client.getInstanceServices().describeInstancesInRegion(null, - node.getProviderId()))); + node.getProviderId()))); } catch (RunNodesException e) { System.err.println(e.getNodeErrors().keySet()); diff --git a/aws/core/src/test/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContentTest.java b/aws/core/src/test/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContentTest.java index 221bea329d..1c296ddb62 100644 --- a/aws/core/src/test/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContentTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContentTest.java @@ -68,6 +68,12 @@ public class ParseAWSErrorFromXmlContentTest { assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "", "IncorrectState", IllegalStateException.class); } + + @Test + public void test409SetsIllegalStateException() { + assertCodeMakes("PUT", URI.create("https://adriancole-blobstore011.s3.amazonaws.com/"), 409, "", + "OperationAbortedA conflicting conditional operation is currently in progress against this resource. Please try again.F716E81C3D814E59SDprHxWzG/YXzanVnV7VTz/wP+6fRt1dS+q00kH1rz248YOOSddkFiTXF04XtqNO", IllegalStateException.class); + } @Test public void test400WithInvalidGroupDuplicateIllegalStateException() { diff --git a/aws/core/src/test/java/org/jclouds/aws/s3/services/BucketsLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/s3/services/BucketsLiveTest.java index 559e9eaf7c..da9db89386 100644 --- a/aws/core/src/test/java/org/jclouds/aws/s3/services/BucketsLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/s3/services/BucketsLiveTest.java @@ -39,17 +39,17 @@ import java.util.concurrent.TimeoutException; import org.jclouds.aws.domain.Region; import org.jclouds.aws.s3.S3Client; import org.jclouds.aws.s3.domain.AccessControlList; +import org.jclouds.aws.s3.domain.AccessControlList.CanonicalUserGrantee; +import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee; +import org.jclouds.aws.s3.domain.AccessControlList.Grant; +import org.jclouds.aws.s3.domain.AccessControlList.GroupGranteeURI; +import org.jclouds.aws.s3.domain.AccessControlList.Permission; import org.jclouds.aws.s3.domain.BucketLogging; import org.jclouds.aws.s3.domain.BucketMetadata; import org.jclouds.aws.s3.domain.CannedAccessPolicy; import org.jclouds.aws.s3.domain.ListBucketResponse; import org.jclouds.aws.s3.domain.Payer; import org.jclouds.aws.s3.domain.S3Object; -import org.jclouds.aws.s3.domain.AccessControlList.CanonicalUserGrantee; -import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee; -import org.jclouds.aws.s3.domain.AccessControlList.Grant; -import org.jclouds.aws.s3.domain.AccessControlList.GroupGranteeURI; -import org.jclouds.aws.s3.domain.AccessControlList.Permission; import org.jclouds.aws.s3.internal.StubS3AsyncClient; import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest; import org.jclouds.util.Utils; @@ -90,7 +90,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { } public void testPrivateAclIsDefaultForBucket() throws InterruptedException, ExecutionException, TimeoutException, - IOException { + IOException { String bucketName = getContainerName(); try { AccessControlList acl = getApi().getBucketACL(bucketName); @@ -105,7 +105,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { } public void testUpdateBucketACL() throws InterruptedException, ExecutionException, TimeoutException, IOException, - Exception { + Exception { String bucketName = getContainerName(); try { // Confirm the bucket is private @@ -221,9 +221,9 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { assertNull(getApi().getBucketLogging(bucketName)); setupAclForBucketLoggingTarget(targetBucket); - final BucketLogging logging = new BucketLogging(targetBucket, "access_log-", ImmutableSet - . of(new Grant(new EmailAddressGrantee(StubS3AsyncClient.TEST_ACL_EMAIL), - Permission.FULL_CONTROL))); + final BucketLogging logging = new BucketLogging(targetBucket, "access_log-", + ImmutableSet. of(new Grant(new EmailAddressGrantee(StubS3AsyncClient.TEST_ACL_EMAIL), + Permission.FULL_CONTROL))); getApi().enableBucketLogging(bucketName, logging); @@ -231,6 +231,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { public void run() { try { BucketLogging newLogging = getApi().getBucketLogging(bucketName); + assert newLogging !=null; AccessControlList acl = new AccessControlList(); for (Grant grant : newLogging.getTargetGrants()) { // TODO: add permission // checking features to @@ -277,7 +278,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { public void testEu() throws Exception { final String bucketName = getScratchContainerName(); try { - getApi().putBucketInRegion(Region.EU_WEST_1, bucketName + "eu", withBucketAcl(CannedAccessPolicy.PUBLIC_READ)); + getApi().putBucketInRegion(Region.EU, bucketName + "eu", withBucketAcl(CannedAccessPolicy.PUBLIC_READ)); assertConsistencyAware(new Runnable() { public void run() { try { @@ -288,7 +289,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { } } }); - assertEquals(Region.EU_WEST_1, getApi().getBucketLocation(bucketName + "eu")); + assertEquals(Region.EU, getApi().getBucketLocation(bucketName + "eu")); // TODO: I believe that the following should work based on the above acl assertion passing. // However, it fails on 403 // URL url = new URL(String.format("http://%s.s3.amazonaws.com", bucketName)); @@ -298,7 +299,6 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { } } - void bucketExists() throws Exception { String bucketName = getContainerName(); try { @@ -334,7 +334,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { } public void testListBucketDelimiter() throws InterruptedException, ExecutionException, TimeoutException, - UnsupportedEncodingException { + UnsupportedEncodingException { String bucketName = getContainerName(); try { String prefix = "apps"; @@ -352,7 +352,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { } public void testListBucketPrefix() throws InterruptedException, ExecutionException, TimeoutException, - UnsupportedEncodingException { + UnsupportedEncodingException { String bucketName = getContainerName(); try { String prefix = "apps"; @@ -370,7 +370,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest { } public void testListBucketMaxResults() throws InterruptedException, ExecutionException, TimeoutException, - UnsupportedEncodingException { + UnsupportedEncodingException { String bucketName = getContainerName(); try { addAlphabetUnderRoot(bucketName); diff --git a/aws/core/src/test/java/org/jclouds/aws/sqs/SQSClientLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/sqs/SQSClientLiveTest.java index 77692c30ba..53b57d3186 100644 --- a/aws/core/src/test/java/org/jclouds/aws/sqs/SQSClientLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/sqs/SQSClientLiveTest.java @@ -68,10 +68,9 @@ public class SQSClientLiveTest { protected void setupCredentials() { identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); credential = checkNotNull(System.getProperty("test." + provider + ".credential"), "test." + provider - + ".credential"); - endpoint = checkNotNull(System.getProperty("test." + provider + ".endpoint"), "test." + provider + ".endpoint"); - apiversion = checkNotNull(System.getProperty("test." + provider + ".apiversion"), "test." + provider - + ".apiversion"); + + ".credential"); + endpoint = System.getProperty("test." + provider + ".endpoint"); + apiversion = System.getProperty("test." + provider + ".apiversion"); } protected Properties setupProperties() { @@ -79,9 +78,12 @@ public class SQSClientLiveTest { overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); overrides.setProperty(provider + ".identity", identity); - overrides.setProperty(provider + ".credential", credential); - overrides.setProperty(provider + ".endpoint", endpoint); - overrides.setProperty(provider + ".apiversion", apiversion); + if (credential != null) + overrides.setProperty(provider + ".credential", credential); + if (endpoint != null) + overrides.setProperty(provider + ".endpoint", endpoint); + if (apiversion != null) + overrides.setProperty(provider + ".apiversion", apiversion); return overrides; } @@ -90,14 +92,14 @@ public class SQSClientLiveTest { setupCredentials(); Properties overrides = setupProperties(); context = new RestContextFactory().createContext(provider, ImmutableSet. of(new Log4JLoggingModule()), - overrides); + overrides); this.client = context.getApi(); } @Test void testListQueuesInRegion() throws InterruptedException { for (String region : Lists.newArrayList(null, Region.EU_WEST_1, Region.US_EAST_1, Region.US_WEST_1, - Region.AP_SOUTHEAST_1)) { + Region.AP_SOUTHEAST_1)) { SortedSet allResults = Sets.newTreeSet(client.listQueuesInRegion(region)); assertNotNull(allResults); if (allResults.size() >= 1) { @@ -114,7 +116,7 @@ public class SQSClientLiveTest { String queueName = PREFIX + "1"; for (final String region : Lists.newArrayList(null, Region.EU_WEST_1, Region.US_EAST_1, Region.US_WEST_1, - Region.AP_SOUTHEAST_1)) { + Region.AP_SOUTHEAST_1)) { try { SortedSet result = Sets.newTreeSet(client.listQueuesInRegion(region, queuePrefix(queueName))); if (result.size() >= 1) { @@ -182,7 +184,7 @@ public class SQSClientLiveTest { assertion.run(); if (i > 0) System.err.printf("%d attempts and %dms asserting %s%n", i + 1, System.currentTimeMillis() - start, - assertion.getClass().getSimpleName()); + assertion.getClass().getSimpleName()); return; } catch (AssertionError e) { error = e; diff --git a/aws/core/src/test/resources/ec2/rightscale_images.xml b/aws/core/src/test/resources/ec2/rightscale_images.xml index 042ef5ce1b..8fdf40a769 100644 --- a/aws/core/src/test/resources/ec2/rightscale_images.xml +++ b/aws/core/src/test/resources/ec2/rightscale_images.xml @@ -41,5 +41,54 @@ + + ami-710c2605 + 411009282317/RightImage Windows_2003_i386_v5.4.3 + available + 411009282317 + true + i386 + machine + windows + RightImage Windows_2003_i386_v5.4.3 + Built by RightScale + ebs + /dev/sda1 + + + /dev/sda1 + + snap-9460affd + 35 + true + + + + hvm + + + ami-c6a882b2 + 411009282317/RightImage_Windows_2008_x64_v5.5.5 + 411009282317 + true + x86_64 + machine + windows + RightImage_Windows_2008_x64_v5.5.5 + Built by RightScale + ebs + /dev/sda1 + + + /dev/sda1 + + snap-68b26c01 + 80 + true + + + + hvm + diff --git a/aws/core/src/test/resources/log4j.xml b/aws/core/src/test/resources/log4j.xml index 1d36e512fd..5b548a0f48 100644 --- a/aws/core/src/test/resources/log4j.xml +++ b/aws/core/src/test/resources/log4j.xml @@ -162,12 +162,10 @@ - diff --git a/azure/src/main/java/org/jclouds/azure/storage/handlers/ParseAzureStorageErrorFromXmlContent.java b/azure/src/main/java/org/jclouds/azure/storage/handlers/ParseAzureStorageErrorFromXmlContent.java index cf0cbd58ce..73a52773af 100644 --- a/azure/src/main/java/org/jclouds/azure/storage/handlers/ParseAzureStorageErrorFromXmlContent.java +++ b/azure/src/main/java/org/jclouds/azure/storage/handlers/ParseAzureStorageErrorFromXmlContent.java @@ -68,12 +68,20 @@ public class ParseAzureStorageErrorFromXmlContent implements HttpErrorHandler { try { if (response.getPayload() != null) { String contentType = response.getPayload().getContentMetadata().getContentType(); - if (contentType != null && (contentType.indexOf("xml") != -1 || contentType.indexOf("unknown") != -1)) { - AzureStorageError error = utils.parseAzureStorageErrorFromContent(command, response, response + if (contentType != null && (contentType.indexOf("xml") != -1 || contentType.indexOf("unknown") != -1) + && !new Long(0).equals(response.getPayload().getContentMetadata().getContentLength())) { + try { + AzureStorageError error = utils.parseAzureStorageErrorFromContent(command, response, response .getPayload().getInput()); - if (error != null) { - message = error.getMessage(); - exception = new AzureStorageResponseException(command, response, error); + if (error != null) { + message = error.getMessage(); + exception = new AzureStorageResponseException(command, response, error); + } + } catch (RuntimeException e) { + try { + message = Utils.toStringAndClose(response.getPayload().getInput()); + } catch (IOException e1) { + } } } else { try { @@ -83,29 +91,28 @@ public class ParseAzureStorageErrorFromXmlContent implements HttpErrorHandler { } } message = message != null ? message : String.format("%s -> %s", command.getRequest().getRequestLine(), - response.getStatusLine()); + response.getStatusLine()); switch (response.getStatusCode()) { - case 401: - exception = new AuthorizationException(command.getRequest(), message); - break; - case 404: - - if (!command.getRequest().getMethod().equals("DELETE")) { - String path = command.getRequest().getEndpoint().getPath(); - Matcher matcher = CONTAINER_PATH.matcher(path); + case 401: + exception = new AuthorizationException(command.getRequest(), message); + break; + case 404: + if (!command.getRequest().getMethod().equals("DELETE")) { + String path = command.getRequest().getEndpoint().getPath(); + Matcher matcher = CONTAINER_PATH.matcher(path); + if (matcher.find()) { + exception = new ContainerNotFoundException(matcher.group(1), message); + } else { + matcher = CONTAINER_KEY_PATH.matcher(path); if (matcher.find()) { - exception = new ContainerNotFoundException(matcher.group(1), message); - } else { - matcher = CONTAINER_KEY_PATH.matcher(path); - if (matcher.find()) { - exception = new KeyNotFoundException(matcher.group(1), matcher.group(2), message); - } + exception = new KeyNotFoundException(matcher.group(1), matcher.group(2), message); } } - break; - case 411: - exception = new IllegalArgumentException(message); - break; + } + break; + case 411: + exception = new IllegalArgumentException(message); + break; } } finally { releasePayload(response); diff --git a/azure/src/test/java/org/jclouds/azure/storage/handlers/ParseAzureErrorFromXmlContentTest.java b/azure/src/test/java/org/jclouds/azure/storage/handlers/ParseAzureErrorFromXmlContentTest.java index 5f19192af7..76df0346b2 100644 --- a/azure/src/test/java/org/jclouds/azure/storage/handlers/ParseAzureErrorFromXmlContentTest.java +++ b/azure/src/test/java/org/jclouds/azure/storage/handlers/ParseAzureErrorFromXmlContentTest.java @@ -28,6 +28,7 @@ import static org.easymock.classextension.EasyMock.verify; import java.net.URI; import org.easymock.IArgumentMatcher; +import org.jclouds.azure.storage.AzureStorageResponseException; import org.jclouds.azure.storage.filters.SharedKeyLiteAuthentication; import org.jclouds.http.HttpCommand; import org.jclouds.http.HttpRequest; @@ -49,14 +50,33 @@ public class ParseAzureErrorFromXmlContentTest { @Test public void test411WithTextHtmlIllegalArgumentException() { - assertCodeMakes("PUT", URI - .create("https://jclouds.blob.core.windows.net/adriancole-azureblob-413790770?restype=container"), 411, - "Length Required", "text/html; charset=us-ascii", "Length Required\r\n", - IllegalArgumentException.class); + assertCodeMakes("PUT", + URI.create("https://jclouds.blob.core.windows.net/adriancole-azureblob-413790770?restype=container"), 411, + "Length Required", "text/html; charset=us-ascii", "Length Required\r\n", + IllegalArgumentException.class); + } + + @Test + public void test304WithNoContentIllegalArgumentException() { + assertCodeMakes("GET", URI.create("https://jclouds.blob.core.windows.net/adriancole-blobstore0/apples"), 411, + "HTTP/1.1 304 The condition specified using HTTP conditional header(s) is not met.", "application/unknown", + "", 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) { + String content, Class expected) { ParseAzureStorageErrorFromXmlContent function = Guice.createInjector(new SaxParserModule(), new AbstractModule() { @@ -70,7 +90,7 @@ public class ParseAzureErrorFromXmlContentTest { HttpCommand command = createMock(HttpCommand.class); HttpRequest request = new HttpRequest(method, uri); HttpResponse response = new HttpResponse(statusCode, message, Payloads.newInputStreamPayload(Utils - .toInputStream(content))); + .toInputStream(content))); response.getPayload().getContentMetadata().setContentType(contentType); expect(command.getRequest()).andReturn(request).atLeastOnce(); 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/compute/src/main/java/org/jclouds/compute/ComputeService.java b/compute/src/main/java/org/jclouds/compute/ComputeService.java index 5df136488f..11da882153 100755 --- a/compute/src/main/java/org/jclouds/compute/ComputeService.java +++ b/compute/src/main/java/org/jclouds/compute/ComputeService.java @@ -137,7 +137,7 @@ public interface ComputeService { * default, equivalent to {@code templateBuilder().any().options(templateOptions)}. */ Set runNodesWithTag(String tag, int count, TemplateOptions templateOptions) - throws RunNodesException; + throws RunNodesException; /** * Like {@link ComputeService#runNodesWithTag(String,int,TemplateOptions)}, except that the @@ -148,6 +148,10 @@ public interface ComputeService { /** * resume the node from {@link org.jclouds.compute.domain.NodeState#SUSPENDED suspended} state, * given its id. + * + *

note

+ * + * affected nodes may not resume with the same IP address(es) */ void resumeNode(String id); @@ -155,6 +159,10 @@ public interface ComputeService { * nodes matching the filter are treated as a logical set. Using the resume command, you can save * time by resumeing the nodes in parallel. * + *

note

+ * + * affected nodes may not resume with the same IP address(es) + * * @throws UnsupportedOperationException * if the underlying provider doesn't support suspend/resume */ @@ -164,6 +172,10 @@ public interface ComputeService { * suspend the node, given its id. This will result in * {@link org.jclouds.compute.domain.NodeState#SUSPENDED suspended} state. * + *

note

+ * + * affected nodes may not resume with the same IP address(es) + * * @throws UnsupportedOperationException * if the underlying provider doesn't support suspend/resume */ @@ -173,6 +185,9 @@ public interface ComputeService { * nodes matching the filter are treated as a logical set. Using the suspend command, you can * save time by suspending the nodes in parallel. * + *

note

+ * + * affected nodes may not resume with the same IP address(es) */ void suspendNodesMatching(Predicate filter); @@ -224,7 +239,7 @@ public interface ComputeService { * @see org.jclouds.compute.predicates.NodePredicates#runningWithTag(String) */ Map runScriptOnNodesMatching(Predicate filter, Payload runScript) - throws RunScriptOnNodesException; + throws RunScriptOnNodesException; /** * Run the script on all nodes with the specific tag. @@ -243,6 +258,6 @@ public interface ComputeService { * @see org.jclouds.io.Payloads */ Map runScriptOnNodesMatching(Predicate filter, - Payload runScript, RunScriptOptions options) throws RunScriptOnNodesException; + Payload runScript, RunScriptOptions options) throws RunScriptOnNodesException; } diff --git a/compute/src/main/java/org/jclouds/compute/Utils.java b/compute/src/main/java/org/jclouds/compute/Utils.java index 3d25c26635..345fb6ee37 100644 --- a/compute/src/main/java/org/jclouds/compute/Utils.java +++ b/compute/src/main/java/org/jclouds/compute/Utils.java @@ -44,4 +44,5 @@ public interface Utils extends org.jclouds.rest.Utils { * @return function that gets an ssh client for a node that is available via ssh. */ Function sshForNode(); + } diff --git a/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java b/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java index 5eb304e647..c8826d6570 100644 --- a/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java @@ -35,9 +35,12 @@ 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.OsFamily; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.functions.CreateSshClientOncePortIsListeningOnNode; +import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; +import org.jclouds.json.Json; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.ssh.SshClient; @@ -70,13 +73,20 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { bind(LoadBalancerService.class).toProvider(Providers. of(null)).in(Scopes.SINGLETON); } + @Provides + @Singleton + public Map> provideOsVersionMap(ComputeServiceConstants.ReferenceData data, Json json) { + return json.fromJson(data.osVersionMapJson, new TypeLiteral>>() { + }.getType()); + } + /** * The default template if none is provided. */ @Provides @Named("DEFAULT") protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { - return template.osFamily(UBUNTU); + return template.osFamily(UBUNTU).osVersionMatches("10.04").os64Bit(true); } /** 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 e9c9395c89..18c983fbee 100644 --- a/compute/src/main/java/org/jclouds/compute/reference/ComputeServiceConstants.java +++ b/compute/src/main/java/org/jclouds/compute/reference/ComputeServiceConstants.java @@ -38,10 +38,28 @@ public interface ComputeServiceConstants { public static final String PROPERTY_TIMEOUT_SCRIPT_COMPLETE = "jclouds.compute.timeout.script-complete"; public static final String PROPERTY_TIMEOUT_PORT_OPEN = "jclouds.compute.timeout.port-open"; /** - * comma-separated nodes that we shouldn't attempt to list as they are dead - * in the provider for some reason. + * comma-separated nodes that we shouldn't attempt to list as they are dead in the provider for + * some reason. */ - public static final String PROPERTY_BLACKLIST_NODES = "jclouds.compute.blacklist.nodes"; + public static final String PROPERTY_BLACKLIST_NODES = "jclouds.compute.blacklist-nodes"; + + /** + * os to map of version input string to output string + *

+ * ex. + * + *

+    * {"centos":{"5.4":"5.4","5.5":"5.5"},"rhel":{"5.4":"5.4","5.5":"5.5"},"ubuntu":{"karmic":"9.10","lucid":"10.04","maverick":"10.10","natty":"11.04"},"windows":{"2008":"2008","Server 2008":"2008","2008 R2":"2008 R2","Server 2008 R2":"2008 R2","2008 SP2":"2008 SP2","Server 2008 SP2":"2008 SP2"}}
+    * 
+ */ + public static final String PROPERTY_OS_VERSION_MAP_JSON = "jclouds.compute.os-version-map-json"; + + @Singleton + public static class ReferenceData { + @Inject(optional = true) + @Named(PROPERTY_OS_VERSION_MAP_JSON) + public String osVersionMapJson = "{\"centos\":{\"5.2\":\"5.2\",\"5.3\":\"5.3\",\"5.4\":\"5.4\",\"5.5\":\"5.5\"},\"rhel\":{\"5.2\":\"5.2\",\"5.3\":\"5.3\",\"5.4\":\"5.4\",\"5.5\":\"5.5\"},\"ubuntu\":{\"hardy\":\"8.04\",\"karmic\":\"9.10\",\"lucid\":\"10.04\",\"maverick\":\"10.10\",\"natty\":\"11.04\"},\"windows\":{\"2003\":\"2003\",\"2003 Standard\":\"2003\",\"2008\":\"2008\",\"2008 Web\":\"2008\",\"Server 2008\":\"2008\",\"2008 R2\":\"2008 R2\",\"Server 2008 R2\":\"2008 R2\",\"2008 Server R2\":\"2008 R2\",\"2008 SP2\":\"2008 SP2\",\"Server 2008 SP2\":\"2008 SP2\"}}"; + } @Singleton public static class Timeouts { @@ -52,11 +70,11 @@ public interface ComputeServiceConstants { @Inject(optional = true) @Named(PROPERTY_TIMEOUT_NODE_RUNNING) public long nodeRunning = 1200 * 1000; - + @Inject(optional = true) @Named(PROPERTY_TIMEOUT_NODE_SUSPENDED) public long nodeSuspended = 30 * 1000; - + @Inject(optional = true) @Named(PROPERTY_TIMEOUT_SCRIPT_COMPLETE) public long scriptComplete = 600 * 1000; diff --git a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceAdapter.java b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceAdapter.java index 2d8066c3f7..61766f6070 100644 --- a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceAdapter.java +++ b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceAdapter.java @@ -20,6 +20,8 @@ package org.jclouds.compute.stub.config; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.ConcurrentMap; import javax.inject.Inject; @@ -46,6 +48,7 @@ import org.jclouds.rest.ResourceNotFoundException; import com.google.common.base.Supplier; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; /** * @@ -60,12 +63,13 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda private final String privateIpPrefix; private final String passwordPrefix; private final String providerName; + private final Map> osToVersionMap; @Inject public StubComputeServiceAdapter(ConcurrentMap nodes, Supplier location, - @Named("NODE_ID") Provider idProvider, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix, - @Named("PRIVATE_IP_PREFIX") String privateIpPrefix, @Named("PASSWORD_PREFIX") String passwordPrefix, - @org.jclouds.rest.annotations.Provider String providerName) { + @Named("NODE_ID") Provider idProvider, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix, + @Named("PRIVATE_IP_PREFIX") String privateIpPrefix, @Named("PASSWORD_PREFIX") String passwordPrefix, + @org.jclouds.rest.annotations.Provider String providerName, Map> osToVersionMap) { this.nodes = nodes; this.location = location; this.idProvider = idProvider; @@ -73,11 +77,12 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda this.privateIpPrefix = privateIpPrefix; this.passwordPrefix = passwordPrefix; this.providerName = providerName; + this.osToVersionMap = osToVersionMap; } @Override public NodeMetadata runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, - Map credentialStore) { + Map credentialStore) { NodeMetadataBuilder builder = new NodeMetadataBuilder(); String id = idProvider.get() + ""; builder.ids(id); @@ -100,8 +105,8 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda @Override public Iterable listHardwareProfiles() { return ImmutableSet. of(StubComputeServiceDependenciesModule.stub("small", 1, 1740, 160), - StubComputeServiceDependenciesModule.stub("medium", 4, 7680, 850), StubComputeServiceDependenciesModule - .stub("large", 8, 15360, 1690)); + StubComputeServiceDependenciesModule.stub("medium", 4, 7680, 850), + StubComputeServiceDependenciesModule.stub("large", 8, 15360, 1690)); } @Override @@ -109,20 +114,19 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda Location zone = location.get().getParent(); String parentId = zone.getId(); Credentials defaultCredentials = new Credentials("root", null); - return ImmutableSet. of(new ImageBuilder().providerId("1").name(OsFamily.UBUNTU.name()) - .id(parentId + "/1").location(zone).operatingSystem( - new OperatingSystem(OsFamily.UBUNTU, "ubuntu 32", null, "X86_32", "ubuntu 32", false)) - .description("stub ubuntu 32").defaultCredentials(defaultCredentials).build(), // - new ImageBuilder().providerId("2").name(OsFamily.UBUNTU.name()).id(parentId + "/2").location(zone) - .operatingSystem( - new OperatingSystem(OsFamily.UBUNTU, "ubuntu 64", null, "X86_64", "ubuntu 64", true)) - .description("stub ubuntu 64").defaultCredentials(defaultCredentials).build(), // - new ImageBuilder().providerId("3").name(OsFamily.CENTOS.name()).id(parentId + "/3").location(zone) - .operatingSystem( - new OperatingSystem(OsFamily.CENTOS, "centos 64", null, "X86_64", "centos 64", true)) - .description("stub centos 64").defaultCredentials(defaultCredentials).build() // - - ); + Set images = Sets.newLinkedHashSet(); + int id = 1; + for (boolean is64Bit : new boolean[] { true, false }) + for (Entry> osVersions : this.osToVersionMap.entrySet()) { + for (String version : Sets.newHashSet(osVersions.getValue().values())) { + String desc = String.format("stub %s %s", osVersions.getKey(), is64Bit); + images.add(new ImageBuilder().providerId(id + "").name(osVersions.getKey().name()) + .id(parentId + "/" + id++).location(zone) + .operatingSystem(new OperatingSystem(osVersions.getKey(), desc, version, null, desc, is64Bit)) + .description(desc).defaultCredentials(defaultCredentials).build()); + } + } + return images; } @Override @@ -134,9 +138,9 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda public Iterable listLocations() { Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); Location region = new LocationImpl(LocationScope.REGION, providerName + "region", providerName + "region", - provider); + provider); return ImmutableSet. of(new LocationImpl(LocationScope.ZONE, providerName + "zone", providerName - + "zone", region)); + + "zone", region)); } @Override diff --git a/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java b/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java index 84b9c38254..87982f5960 100644 --- a/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java +++ b/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java @@ -38,7 +38,6 @@ import java.util.concurrent.Callable; import java.util.regex.Matcher; import java.util.regex.Pattern; - import org.jclouds.compute.ComputeServiceContextBuilder; import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.Hardware; @@ -56,7 +55,7 @@ import org.jclouds.ssh.SshClient; import com.google.common.base.Function; import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; /** * @@ -131,33 +130,6 @@ public class ComputeServiceUtils { return total; } - public static final Map> NAME_VERSION_MAP = ImmutableMap - .> of( - org.jclouds.compute.domain.OsFamily.CENTOS, - ImmutableMap. builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5").build(), - org.jclouds.compute.domain.OsFamily.RHEL, - ImmutableMap. builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5").build(), - org.jclouds.compute.domain.OsFamily.UBUNTU, - ImmutableMap. builder().put("hardy", "8.04").put("intrepid", "8.10") - .put("jaunty", "9.04").put("karmic", "9.10").put("lucid", "10.04").put("maverick", "10.10") - .put("natty", "11.04").build()); - - public static String parseVersionOrReturnEmptyString(org.jclouds.compute.domain.OsFamily family, final String in) { - if (NAME_VERSION_MAP.containsKey(family)) { - CONTAINS_SUBSTRING contains = new CONTAINS_SUBSTRING(in.replace('-', '.')); - try { - String key = find(NAME_VERSION_MAP.get(family).keySet(), contains); - return NAME_VERSION_MAP.get(family).get(key); - } catch (NoSuchElementException e) { - try { - return find(NAME_VERSION_MAP.get(family).values(), contains); - } catch (NoSuchElementException e1) { - } - } - } - return ""; - } - public static org.jclouds.compute.domain.OsFamily parseOsFamilyOrNull(String provider, String in) { org.jclouds.compute.domain.OsFamily myOs = null; for (org.jclouds.compute.domain.OsFamily os : org.jclouds.compute.domain.OsFamily.values()) { @@ -201,19 +173,6 @@ public class ComputeServiceUtils { }); } - private static final class CONTAINS_SUBSTRING implements Predicate { - private final String in; - - private CONTAINS_SUBSTRING(String in) { - this.in = in; - } - - @Override - public boolean apply(String input) { - return in.indexOf(input) != -1; - } - } - public static interface SshCallable extends Callable { NodeMetadata getNode(); @@ -249,4 +208,36 @@ public class ComputeServiceUtils { "node does not have IP addresses configured: " + node); } + public static String parseVersionOrReturnEmptyString(org.jclouds.compute.domain.OsFamily family, final String in, + Map> osVersionMap) { + if (osVersionMap.containsKey(family)) { + if (osVersionMap.get(family).containsKey(in)) + return osVersionMap.get(family).get(in); + CONTAINS_SUBSTRING contains = new CONTAINS_SUBSTRING(in.replace('-', '.')); + try { + String key = Iterables.find(osVersionMap.get(family).keySet(), contains); + return osVersionMap.get(family).get(key); + } catch (NoSuchElementException e) { + try { + return Iterables.find(osVersionMap.get(family).values(), contains); + } catch (NoSuchElementException e1) { + } + } + } + return ""; + } + + static final class CONTAINS_SUBSTRING implements Predicate { + private final String in; + + CONTAINS_SUBSTRING(String in) { + this.in = in; + } + + @Override + public boolean apply(String input) { + return in.indexOf(input) != -1; + } + } + } diff --git a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java index 9b056ed3e2..f967f6a063 100755 --- a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java @@ -161,8 +161,8 @@ public abstract class BaseComputeServiceLiveTest { if (context != null) context.close(); Properties props = setupProperties(); - context = new ComputeServiceContextFactory().createContext(provider, ImmutableSet.of(new Log4JLoggingModule(), - getSshModule()), props); + context = new ComputeServiceContextFactory().createContext(provider, + ImmutableSet.of(new Log4JLoggingModule(), getSshModule()), props); client = context.getComputeService(); } @@ -173,8 +173,8 @@ public abstract class BaseComputeServiceLiveTest { public void testCorrectAuthException() throws Exception { ComputeServiceContext context = null; try { - context = new ComputeServiceContextFactory().createContext(provider, "MOMMA", "MIA", ImmutableSet - . of(new Log4JLoggingModule())); + context = new ComputeServiceContextFactory().createContext(provider, "MOMMA", "MIA", + ImmutableSet. of(new Log4JLoggingModule())); context.getComputeService().listNodes(); } catch (AuthorizationException e) { throw e; @@ -217,7 +217,7 @@ public abstract class BaseComputeServiceLiveTest { OperatingSystem os = get(nodes, 0).getOperatingSystem(); try { Map responses = runScriptWithCreds(tag, os, new Credentials( - good.identity, "romeo")); + good.identity, "romeo")); assert false : "shouldn't pass with a bad password\n" + responses; } catch (RunScriptOnNodesException e) { assert getRootCause(e).getMessage().contains("Auth fail") : e; @@ -276,7 +276,7 @@ public abstract class BaseComputeServiceLiveTest { template = buildTemplate(client.templateBuilder()); template.getOptions().installPrivateKey(keyPair.get("private")).authorizePublicKey(keyPair.get("public")) - .runScript(buildScript(template.getImage().getOperatingSystem())); + .runScript(buildScript(template.getImage().getOperatingSystem())); } protected void checkImageIdMatchesTemplate(NodeMetadata node) { @@ -287,8 +287,8 @@ public abstract class BaseComputeServiceLiveTest { protected void checkOsMatchesTemplate(NodeMetadata node) { if (node.getOperatingSystem() != null) assert node.getOperatingSystem().getFamily().equals(template.getImage().getOperatingSystem().getFamily()) : String - .format("expecting family %s but got %s", template.getImage().getOperatingSystem().getFamily(), node - .getOperatingSystem()); + .format("expecting family %s but got %s", template.getImage().getOperatingSystem().getFamily(), + node.getOperatingSystem()); } void assertLocationSameOrChild(Location test, Location expected) { @@ -320,10 +320,11 @@ public abstract class BaseComputeServiceLiveTest { } protected Map runScriptWithCreds(final String tag, OperatingSystem os, - Credentials creds) throws RunScriptOnNodesException { + Credentials creds) throws RunScriptOnNodesException { try { - return client.runScriptOnNodesMatching(runningWithTag(tag), newStringPayload(buildScript(os).render( - OsFamily.UNIX)), overrideCredentialsWith(creds).nameTask("runScriptWithCreds")); + return client.runScriptOnNodesMatching(runningWithTag(tag), + newStringPayload(buildScript(os).render(OsFamily.UNIX)), + overrideCredentialsWith(creds).nameTask("runScriptWithCreds")); } catch (SshException e) { throw e; } @@ -353,16 +354,16 @@ public abstract class BaseComputeServiceLiveTest { @Test(enabled = true, dependsOnMethods = "testCreateAnotherNodeWithANewContextToEnsureSharedMemIsntRequired") public void testGet() throws Exception { - Map metadataMap = newLinkedHashMap(uniqueIndex(filter(client - .listNodesDetailsMatching(all()), and(withTag(tag), not(TERMINATED))), - new Function() { + Map metadataMap = newLinkedHashMap(uniqueIndex( + filter(client.listNodesDetailsMatching(all()), and(withTag(tag), not(TERMINATED))), + new Function() { - @Override - public String apply(NodeMetadata from) { - return from.getId(); - } + @Override + public String apply(NodeMetadata from) { + return from.getId(); + } - })); + })); for (NodeMetadata node : nodes) { metadataMap.remove(node.getId()); NodeMetadata metadata = client.getNodeMetadata(node.getId()); @@ -372,15 +373,16 @@ public abstract class BaseComputeServiceLiveTest { checkImageIdMatchesTemplate(metadata); checkOsMatchesTemplate(metadata); assertEquals(metadata.getState(), NodeState.RUNNING); - assertEquals(metadata.getPrivateAddresses(), node.getPrivateAddresses()); - assertEquals(metadata.getPublicAddresses(), node.getPublicAddresses()); + // due to DHCP the addresses can actually change in-between runs. + assertEquals(metadata.getPrivateAddresses().size(), node.getPrivateAddresses().size()); + assertEquals(metadata.getPublicAddresses().size(), node.getPublicAddresses().size()); } assertNodeZero(metadataMap.values()); } protected void assertNodeZero(Collection metadataSet) { assert metadataSet.size() == 0 : String.format("nodes left in set: [%s] which didn't match set: [%s]", - metadataSet, nodes); + metadataSet, nodes); } @Test(enabled = true, dependsOnMethods = "testGet") @@ -393,16 +395,20 @@ public abstract class BaseComputeServiceLiveTest { @Test(enabled = true, dependsOnMethods = "testReboot") public void testSuspendResume() throws Exception { client.suspendNodesMatching(withTag(tag)); + Set stoppedNodes = refreshNodes(); assert Iterables.all(stoppedNodes, new Predicate() { @Override public boolean apply(NodeMetadata input) { - return input.getState() == NodeState.SUSPENDED; + boolean returnVal = input.getState() == NodeState.SUSPENDED; + if (!returnVal) + System.err.printf("warning: node %s in state %s%n", input.getId(), input.getState()); + return returnVal; } - }) : nodes; + }) : stoppedNodes; client.resumeNodesMatching(withTag(tag)); testGet(); @@ -462,11 +468,11 @@ public abstract class BaseComputeServiceLiveTest { } template = client.templateBuilder().options(blockOnComplete(false).blockOnPort(8080, 600).inboundPorts(22, 8080)) - .build(); + .build(); // note this is a dependency on the template resolution template.getOptions().runScript( - RunScriptData.createScriptInstallAndStartJBoss(keyPair.get("public"), template.getImage() - .getOperatingSystem())); + RunScriptData.createScriptInstallAndStartJBoss(keyPair.get("public"), template.getImage() + .getOperatingSystem())); try { NodeMetadata node = getOnlyElement(client.runNodesWithTag(tag, 1, template)); @@ -500,26 +506,26 @@ public abstract class BaseComputeServiceLiveTest { assert location != location.getParent() : location; assert location.getScope() != null : location; switch (location.getScope()) { - case PROVIDER: - assertProvider(location); - break; - case REGION: - assertProvider(location.getParent()); - break; - case ZONE: - Location provider = location.getParent().getParent(); - // zone can be a direct descendant of provider - if (provider == null) - provider = location.getParent(); - assertProvider(provider); - break; - case HOST: - Location provider2 = location.getParent().getParent().getParent(); - // zone can be a direct descendant of provider - if (provider2 == null) - provider2 = location.getParent().getParent(); - assertProvider(provider2); - break; + case PROVIDER: + assertProvider(location); + break; + case REGION: + assertProvider(location.getParent()); + break; + case ZONE: + Location provider = location.getParent().getParent(); + // zone can be a direct descendant of provider + if (provider == null) + provider = location.getParent(); + assertProvider(provider); + break; + case HOST: + Location provider2 = location.getParent().getParent().getParent(); + // zone can be a direct descendant of provider + if (provider2 == null) + provider2 = location.getParent().getParent(); + assertProvider(provider2); + break; } } } @@ -607,7 +613,7 @@ public abstract class BaseComputeServiceLiveTest { assertEquals(hello.getOutput().trim(), "hello"); ExecResponse exec = ssh.exec("java -version"); assert exec.getError().indexOf("1.6") != -1 || exec.getOutput().indexOf("1.6") != -1 : exec + "\n" - + ssh.exec("cat /tmp/bootstrap/stdout.log /tmp/bootstrap/stderr.log"); + + ssh.exec("cat /tmp/bootstrap/stdout.log /tmp/bootstrap/stderr.log"); } finally { if (ssh != null) ssh.disconnect(); diff --git a/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java b/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java new file mode 100644 index 0000000000..ddf8fcc2e6 --- /dev/null +++ b/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java @@ -0,0 +1,173 @@ +/** + * + * 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.compute; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.util.ComputeServiceUtils.getCores; +import static org.testng.Assert.assertEquals; + +import java.io.IOException; +import java.util.Map; +import java.util.Map.Entry; +import java.util.NoSuchElementException; +import java.util.Properties; +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; + +import org.jclouds.Constants; +import org.jclouds.compute.config.BaseComputeServiceContextModule; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.json.Json; +import org.jclouds.json.config.GsonModule; +import org.jclouds.logging.log4j.config.Log4JLoggingModule; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; +import com.google.inject.Guice; +import com.google.inject.Module; + +/** + * + * @author Adrian Cole + */ +@Test(groups = "integration,live", testName = "compute.BaseTemplateBuilderLiveTest") +public abstract class BaseTemplateBuilderLiveTest { + + protected String provider; + protected String identity; + protected String credential; + protected String endpoint; + protected String apiversion; + protected ComputeServiceContext context; + + protected void setupCredentials() { + identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); + credential = System.getProperty("test." + provider + ".credential"); + endpoint = System.getProperty("test." + provider + ".endpoint"); + apiversion = System.getProperty("test." + provider + ".apiversion"); + } + + protected Properties setupProperties() { + Properties overrides = new Properties(); + overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); + overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); + overrides.setProperty(provider + ".identity", identity); + if (credential != null) + overrides.setProperty(provider + ".credential", credential); + if (endpoint != null) + overrides.setProperty(provider + ".endpoint", endpoint); + if (apiversion != null) + overrides.setProperty(provider + ".apiversion", apiversion); + return overrides; + } + + @BeforeClass + public void setupClient() throws InterruptedException, ExecutionException, TimeoutException, IOException { + setupCredentials(); + context = new ComputeServiceContextFactory().createContext(provider, + ImmutableSet. of(new Log4JLoggingModule()), setupProperties()); + } + + @DataProvider(name = "osSupported") + public Object[][] osSupported() { + return convertToArray(Sets.filter(provideAllOperatingSystems(), + Predicates.not(defineUnsupportedOperatingSystems()))); + } + + protected Object[][] convertToArray(Set supportedOperatingSystems) { + Object[][] returnVal = new Object[supportedOperatingSystems.size()][1]; + int i = 0; + for (OsFamilyVersion64Bit config : supportedOperatingSystems) + returnVal[i++][0] = config; + return returnVal; + } + + protected Predicate defineUnsupportedOperatingSystems() { + return Predicates.alwaysFalse(); + } + + @DataProvider(name = "osNotSupported") + public Object[][] osNotSupported() { + return convertToArray(Sets.filter(provideAllOperatingSystems(), defineUnsupportedOperatingSystems())); + } + + protected Set provideAllOperatingSystems() { + Map> map = new BaseComputeServiceContextModule() { + }.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule()) + .getInstance(Json.class)); + + Set supportedOperatingSystems = Sets.newHashSet(); + for (Entry> osVersions : map.entrySet()) { + for (String version : Sets.newHashSet(osVersions.getValue().values())) { + supportedOperatingSystems.add(new OsFamilyVersion64Bit(osVersions.getKey(), version, false)); + supportedOperatingSystems.add(new OsFamilyVersion64Bit(osVersions.getKey(), version, true)); + } + } + return supportedOperatingSystems; + } + + @Test(dataProvider = "osSupported") + public void testTemplateBuilderCanFind(OsFamilyVersion64Bit matrix) throws InterruptedException { + Template template = context.getComputeService().templateBuilder().osFamily(matrix.family) + .osVersionMatches("^" + matrix.version + "$").os64Bit(matrix.is64Bit).build(); + assertEquals(template.getImage().getOperatingSystem().getVersion(), matrix.version); + assertEquals(template.getImage().getOperatingSystem().is64Bit(), matrix.is64Bit); + assertEquals(template.getImage().getOperatingSystem().getFamily(), matrix.family); + } + + @Test(dataProvider = "osNotSupported", expectedExceptions = NoSuchElementException.class) + public void testTemplateBuilderCannotFind(OsFamilyVersion64Bit matrix) throws InterruptedException { + context.getComputeService().templateBuilder().osFamily(matrix.family) + .osVersionMatches("^" + matrix.version + "$").os64Bit(matrix.is64Bit).build(); + } + + @Test + public void testTemplateBuilderCanUseImageId() { + Template defaultTemplate = context.getComputeService().templateBuilder().build(); + + Template template = context.getComputeService().templateBuilder().imageId(defaultTemplate.getImage().getId()) + .build(); + assertEquals(template.getImage(), defaultTemplate.getImage()); + } + + @Test + public void testDefaultTemplateBuilder() throws IOException { + Template defaultTemplate = context.getComputeService().templateBuilder().build(); + assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "10.04"); + assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); + assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); + assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); + } + + @AfterTest + protected void cleanup() throws InterruptedException, ExecutionException, TimeoutException { + context.close(); + } + +} \ No newline at end of file diff --git a/compute/src/test/java/org/jclouds/compute/OsFamilyVersion64Bit.java b/compute/src/test/java/org/jclouds/compute/OsFamilyVersion64Bit.java new file mode 100644 index 0000000000..a2f13d634c --- /dev/null +++ b/compute/src/test/java/org/jclouds/compute/OsFamilyVersion64Bit.java @@ -0,0 +1,70 @@ +/** + * + * 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.compute; + +import org.jclouds.compute.domain.OsFamily; + +public class OsFamilyVersion64Bit { + public final OsFamily family; + public final String version; + public final boolean is64Bit; + + public OsFamilyVersion64Bit(OsFamily family, String version, boolean is64Bit) { + this.family = family; + this.version = version; + this.is64Bit = is64Bit; + } + + @Override + public String toString() { + return "OsFamilyVersion64Bit [family=" + family + ", version=" + version + ", is64Bit=" + is64Bit + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((family == null) ? 0 : family.hashCode()); + result = prime * result + (is64Bit ? 1231 : 1237); + result = prime * result + ((version == null) ? 0 : version.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + OsFamilyVersion64Bit other = (OsFamilyVersion64Bit) obj; + if (family != other.family) + return false; + if (is64Bit != other.is64Bit) + return false; + if (version == null) { + if (other.version != null) + return false; + } else if (!version.equals(other.version)) + return false; + return true; + } +} \ No newline at end of file diff --git a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java index 3c270d1ca9..0c1d8437b3 100644 --- a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java +++ b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java @@ -24,7 +24,6 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.reportMatcher; import static org.easymock.classextension.EasyMock.createMock; import static org.easymock.classextension.EasyMock.replay; -import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; import java.io.FileNotFoundException; @@ -38,8 +37,6 @@ import java.util.concurrent.TimeoutException; import org.easymock.IArgumentMatcher; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.Template; import org.jclouds.domain.Credentials; import org.jclouds.io.Payload; import org.jclouds.net.IPSocket; @@ -50,7 +47,6 @@ import org.jclouds.ssh.ExecResponse; import org.jclouds.ssh.SshClient; import org.jclouds.ssh.SshException; import org.jclouds.util.Utils; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.google.common.base.Throwables; @@ -63,15 +59,13 @@ import com.google.inject.Module; * * @author Adrian Cole */ -@Test(groups = "live", enabled = true, sequential = true, testName = "stub.StubComputeServiceIntegrationTest") +@Test(groups = "live", testName = "stub.StubComputeServiceIntegrationTest") public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTest { private static final ExecResponse EXEC_GOOD = new ExecResponse("", "", 0); private static final ExecResponse EXEC_BAD = new ExecResponse("", "", 1); - @BeforeClass - @Override - public void setServiceDefaults() { + public StubComputeServiceIntegrationTest() { provider = "stub"; } @@ -79,15 +73,6 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes public void testCorrectAuthException() throws Exception { } - @Test - public void testTemplateBuilder() { - Template defaultTemplate = client.templateBuilder().build(); - assertEquals(defaultTemplate.getImage().getOperatingSystem().getArch(), "X86_64"); - assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(defaultTemplate.getLocation().getId(), provider + "zone"); - assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); - } - protected void buildSocketTester() { SocketOpen socketOpen = createMock(SocketOpen.class); @@ -121,48 +106,48 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes SshClient client5 = createMock(SshClient.class); expect(factory.create(new IPSocket("144.175.1.1", 22), new Credentials("root", "password1"))).andReturn( - client1); + client1); runScriptAndService(client1, 1); expect(factory.create(new IPSocket("144.175.1.2", 22), new Credentials("root", "password2"))).andReturn( - client2).times(2); + client2).times(2); expect(factory.create(new IPSocket("144.175.1.2", 22), new Credentials("root", "romeo"))).andThrow( - new SshException("Auth fail")); + new SshException("Auth fail")); client2.connect(); try { runScript(client2, "runScriptWithCreds", Utils.toStringAndClose(StubComputeServiceIntegrationTest.class - .getResourceAsStream("/runscript.sh")), 2); + .getResourceAsStream("/runscript.sh")), 2); } catch (IOException e) { Throwables.propagate(e); } client2.disconnect(); expect(factory.create(new IPSocket("144.175.1.3", 22), new Credentials("root", "password3"))).andReturn( - client3).times(2); + client3).times(2); expect(factory.create(new IPSocket("144.175.1.4", 22), new Credentials("root", "password4"))).andReturn( - client4).times(2); + client4).times(2); expect(factory.create(new IPSocket("144.175.1.5", 22), new Credentials("root", "password5"))).andReturn( - client5).times(2); + client5).times(2); runScriptAndInstallSsh(client3, "bootstrap", 3); runScriptAndInstallSsh(client4, "bootstrap", 4); runScriptAndInstallSsh(client5, "bootstrap", 5); expect( - factory.create(eq(new IPSocket("144.175.1.1", 22)), eq(new Credentials("root", keyPair - .get("private"))))).andReturn(client1); + factory.create(eq(new IPSocket("144.175.1.1", 22)), + eq(new Credentials("root", keyPair.get("private"))))).andReturn(client1); expect( - factory.create(eq(new IPSocket("144.175.1.2", 22)), eq(new Credentials("root", keyPair - .get("private"))))).andReturn(client2); + factory.create(eq(new IPSocket("144.175.1.2", 22)), + eq(new Credentials("root", keyPair.get("private"))))).andReturn(client2); expect( - factory.create(eq(new IPSocket("144.175.1.3", 22)), eq(new Credentials("root", keyPair - .get("private"))))).andReturn(client3); + factory.create(eq(new IPSocket("144.175.1.3", 22)), + eq(new Credentials("root", keyPair.get("private"))))).andReturn(client3); expect( - factory.create(eq(new IPSocket("144.175.1.4", 22)), eq(new Credentials("root", keyPair - .get("private"))))).andReturn(client4); + factory.create(eq(new IPSocket("144.175.1.4", 22)), + eq(new Credentials("root", keyPair.get("private"))))).andReturn(client4); expect( - factory.create(eq(new IPSocket("144.175.1.5", 22)), eq(new Credentials("root", keyPair - .get("private"))))).andReturn(client5); + factory.create(eq(new IPSocket("144.175.1.5", 22)), + eq(new Credentials("root", keyPair.get("private"))))).andReturn(client5); helloAndJava(client2); helloAndJava(client3); @@ -184,7 +169,7 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes try { runScript(client, "jboss", Utils.toStringAndClose(StubComputeServiceIntegrationTest.class - .getResourceAsStream("/initscript_with_jboss.sh")), nodeId); + .getResourceAsStream("/initscript_with_jboss.sh")), nodeId); } catch (IOException e) { Throwables.propagate(e); } @@ -198,7 +183,7 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes try { runScript(client, scriptName, Utils.toStringAndClose(StubComputeServiceIntegrationTest.class - .getResourceAsStream("/initscript_with_java.sh")), nodeId); + .getResourceAsStream("/initscript_with_java.sh")), nodeId); } catch (IOException e) { Throwables.propagate(e); } @@ -251,7 +236,7 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes public void testAssignability() throws Exception { @SuppressWarnings("unused") RestContext, ConcurrentMap> stubContext = new ComputeServiceContextFactory() - .createContext(provider, identity, credential).getProviderSpecificContext(); + .createContext(provider, identity, credential).getProviderSpecificContext(); } private static class PayloadEquals implements IArgumentMatcher, Serializable { @@ -298,7 +283,7 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes return false; PayloadEquals other = (PayloadEquals) o; return this.expected == null && other.expected == null || this.expected != null - && this.expected.equals(other.expected); + && this.expected.equals(other.expected); } @Override @@ -321,6 +306,11 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes super.testImagesCache(); } + @Override + public void testCompareSizes() throws Exception { + super.testCompareSizes(); + } + @Test(enabled = true, dependsOnMethods = { "testImagesCache" }) public void testAScriptExecutionAfterBootWithBasicTemplate() throws Exception { super.testAScriptExecutionAfterBootWithBasicTemplate(); diff --git a/gogrid/src/test/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplierTest.java b/compute/src/test/java/org/jclouds/compute/StubTemplateBuilderIntegrationTest.java similarity index 68% rename from gogrid/src/test/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplierTest.java rename to compute/src/test/java/org/jclouds/compute/StubTemplateBuilderIntegrationTest.java index a9014d918c..1c84ef7259 100644 --- a/gogrid/src/test/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplierTest.java +++ b/compute/src/test/java/org/jclouds/compute/StubTemplateBuilderIntegrationTest.java @@ -17,21 +17,25 @@ * ==================================================================== */ -package org.jclouds.gogrid.compute.suppliers; - -import static org.testng.Assert.assertEquals; +package org.jclouds.compute; import org.testng.annotations.Test; /** + * * * @author Adrian Cole */ -public class GoGridImageSupplierTest { +@Test(groups = { "integration", "live" }, testName = "stub.StubTemplateBuilderIntegrationTest") +public class StubTemplateBuilderIntegrationTest extends BaseTemplateBuilderLiveTest { - @Test - public void testParseVersion() { - assertEquals(GoGridImageSupplier.parseVersion("CentOS 5.3 (64-bit)"), "5.3"); + public StubTemplateBuilderIntegrationTest() { + provider = "stub"; } -} + @Override + protected void setupCredentials() { + identity = "stub"; + credential = "stub"; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/google/gson/JcloudsDefaultTypeAdapters.java b/core/src/main/java/com/google/gson/JcloudsDefaultTypeAdapters.java new file mode 100644 index 0000000000..39fdc04c80 --- /dev/null +++ b/core/src/main/java/com/google/gson/JcloudsDefaultTypeAdapters.java @@ -0,0 +1,928 @@ +/** + * + * 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. + * ==================================================================== + */ + +/* + * Copyright (C) 2008 Google Inc. + * + * 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 com.google.gson; + +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.sql.Time; +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.SortedSet; +import java.util.StringTokenizer; +import java.util.TreeSet; +import java.util.UUID; + +import com.google.common.base.Function; +import com.google.common.collect.MapMaker; + +/** + * List of all the default type adapters ({@link JsonSerializer}s, {@link JsonDeserializer}s, and + * {@link InstanceCreator}s. + * + *

Note!

+ * changed to edit the default behaviour of enum parsing by Adrian Cole + * + * @author Inderjeet Singh + * @author Joel Leitch + */ +final class JcloudsDefaultTypeAdapters { + + private static final DefaultDateTypeAdapter DATE_TYPE_ADAPTER = new DefaultDateTypeAdapter(); + private static final DefaultJavaSqlDateTypeAdapter JAVA_SQL_DATE_TYPE_ADAPTER = new DefaultJavaSqlDateTypeAdapter(); + private static final DefaultTimeTypeAdapter TIME_TYPE_ADAPTER = new DefaultTimeTypeAdapter(); + private static final DefaultTimestampDeserializer TIMESTAMP_DESERIALIZER = new DefaultTimestampDeserializer(); + + @SuppressWarnings({ "rawtypes" }) + private static final EnumTypeAdapter ENUM_TYPE_ADAPTER = new EnumTypeAdapter(); + private static final UrlTypeAdapter URL_TYPE_ADAPTER = new UrlTypeAdapter(); + private static final UriTypeAdapter URI_TYPE_ADAPTER = new UriTypeAdapter(); + private static final UuidTypeAdapter UUUID_TYPE_ADAPTER = new UuidTypeAdapter(); + private static final LocaleTypeAdapter LOCALE_TYPE_ADAPTER = new LocaleTypeAdapter(); + private static final CollectionTypeAdapter COLLECTION_TYPE_ADAPTER = new CollectionTypeAdapter(); + private static final MapTypeAdapter MAP_TYPE_ADAPTER = new MapTypeAdapter(); + private static final BigDecimalTypeAdapter BIG_DECIMAL_TYPE_ADAPTER = new BigDecimalTypeAdapter(); + private static final BigIntegerTypeAdapter BIG_INTEGER_TYPE_ADAPTER = new BigIntegerTypeAdapter(); + + private static final BooleanTypeAdapter BOOLEAN_TYPE_ADAPTER = new BooleanTypeAdapter(); + private static final ByteTypeAdapter BYTE_TYPE_ADAPTER = new ByteTypeAdapter(); + private static final CharacterTypeAdapter CHARACTER_TYPE_ADAPTER = new CharacterTypeAdapter(); + private static final DoubleDeserializer DOUBLE_TYPE_ADAPTER = new DoubleDeserializer(); + private static final FloatDeserializer FLOAT_TYPE_ADAPTER = new FloatDeserializer(); + private static final IntegerTypeAdapter INTEGER_TYPE_ADAPTER = new IntegerTypeAdapter(); + private static final LongDeserializer LONG_DESERIALIZER = new LongDeserializer(); + private static final NumberTypeAdapter NUMBER_TYPE_ADAPTER = new NumberTypeAdapter(); + private static final ShortTypeAdapter SHORT_TYPE_ADAPTER = new ShortTypeAdapter(); + private static final StringTypeAdapter STRING_TYPE_ADAPTER = new StringTypeAdapter(); + + private static final PropertiesCreator PROPERTIES_CREATOR = new PropertiesCreator(); + private static final TreeSetCreator TREE_SET_CREATOR = new TreeSetCreator(); + private static final HashSetCreator HASH_SET_CREATOR = new HashSetCreator(); + private static final GregorianCalendarTypeAdapter GREGORIAN_CALENDAR_TYPE_ADAPTER = new GregorianCalendarTypeAdapter(); + + // The constants DEFAULT_SERIALIZERS, DEFAULT_DESERIALIZERS, and DEFAULT_INSTANCE_CREATORS + // must be defined after the constants for the type adapters. Otherwise, the type adapter + // constants will appear as nulls. + private static final ParameterizedTypeHandlerMap> DEFAULT_SERIALIZERS = createDefaultSerializers(); + private static final ParameterizedTypeHandlerMap> DEFAULT_DESERIALIZERS = createDefaultDeserializers(); + private static final ParameterizedTypeHandlerMap> DEFAULT_INSTANCE_CREATORS = createDefaultInstanceCreators(); + + private static ParameterizedTypeHandlerMap> createDefaultSerializers() { + ParameterizedTypeHandlerMap> map = new ParameterizedTypeHandlerMap>(); + + map.registerForTypeHierarchy(Enum.class, ENUM_TYPE_ADAPTER); + map.register(URL.class, URL_TYPE_ADAPTER); + map.register(URI.class, URI_TYPE_ADAPTER); + map.register(UUID.class, UUUID_TYPE_ADAPTER); + map.register(Locale.class, LOCALE_TYPE_ADAPTER); + map.registerForTypeHierarchy(Collection.class, COLLECTION_TYPE_ADAPTER); + map.registerForTypeHierarchy(Map.class, MAP_TYPE_ADAPTER); + map.register(Date.class, DATE_TYPE_ADAPTER); + map.register(java.sql.Date.class, JAVA_SQL_DATE_TYPE_ADAPTER); + map.register(Timestamp.class, DATE_TYPE_ADAPTER); + map.register(Time.class, TIME_TYPE_ADAPTER); + map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER); + map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER); + map.register(BigDecimal.class, BIG_DECIMAL_TYPE_ADAPTER); + map.register(BigInteger.class, BIG_INTEGER_TYPE_ADAPTER); + + // Add primitive serializers + map.register(Boolean.class, BOOLEAN_TYPE_ADAPTER); + map.register(boolean.class, BOOLEAN_TYPE_ADAPTER); + map.register(Byte.class, BYTE_TYPE_ADAPTER); + map.register(byte.class, BYTE_TYPE_ADAPTER); + map.register(Character.class, CHARACTER_TYPE_ADAPTER); + map.register(char.class, CHARACTER_TYPE_ADAPTER); + map.register(Integer.class, INTEGER_TYPE_ADAPTER); + map.register(int.class, INTEGER_TYPE_ADAPTER); + map.register(Number.class, NUMBER_TYPE_ADAPTER); + map.register(Short.class, SHORT_TYPE_ADAPTER); + map.register(short.class, SHORT_TYPE_ADAPTER); + map.register(String.class, STRING_TYPE_ADAPTER); + + map.makeUnmodifiable(); + return map; + } + + private static ParameterizedTypeHandlerMap> createDefaultDeserializers() { + ParameterizedTypeHandlerMap> map = new ParameterizedTypeHandlerMap>(); + map.registerForTypeHierarchy(Enum.class, wrapDeserializer(ENUM_TYPE_ADAPTER)); + map.register(URL.class, wrapDeserializer(URL_TYPE_ADAPTER)); + map.register(URI.class, wrapDeserializer(URI_TYPE_ADAPTER)); + map.register(UUID.class, wrapDeserializer(UUUID_TYPE_ADAPTER)); + map.register(Locale.class, wrapDeserializer(LOCALE_TYPE_ADAPTER)); + map.registerForTypeHierarchy(Collection.class, wrapDeserializer(COLLECTION_TYPE_ADAPTER)); + map.registerForTypeHierarchy(Map.class, wrapDeserializer(MAP_TYPE_ADAPTER)); + map.register(Date.class, wrapDeserializer(DATE_TYPE_ADAPTER)); + map.register(java.sql.Date.class, wrapDeserializer(JAVA_SQL_DATE_TYPE_ADAPTER)); + map.register(Timestamp.class, wrapDeserializer(TIMESTAMP_DESERIALIZER)); + map.register(Time.class, wrapDeserializer(TIME_TYPE_ADAPTER)); + map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER); + map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER); + map.register(BigDecimal.class, wrapDeserializer(BIG_DECIMAL_TYPE_ADAPTER)); + map.register(BigInteger.class, wrapDeserializer(BIG_INTEGER_TYPE_ADAPTER)); + + // Add primitive deserializers + map.register(Boolean.class, wrapDeserializer(BOOLEAN_TYPE_ADAPTER)); + map.register(boolean.class, wrapDeserializer(BOOLEAN_TYPE_ADAPTER)); + map.register(Byte.class, wrapDeserializer(BYTE_TYPE_ADAPTER)); + map.register(byte.class, wrapDeserializer(BYTE_TYPE_ADAPTER)); + map.register(Character.class, wrapDeserializer(CHARACTER_TYPE_ADAPTER)); + map.register(char.class, wrapDeserializer(CHARACTER_TYPE_ADAPTER)); + map.register(Double.class, wrapDeserializer(DOUBLE_TYPE_ADAPTER)); + map.register(double.class, wrapDeserializer(DOUBLE_TYPE_ADAPTER)); + map.register(Float.class, wrapDeserializer(FLOAT_TYPE_ADAPTER)); + map.register(float.class, wrapDeserializer(FLOAT_TYPE_ADAPTER)); + map.register(Integer.class, wrapDeserializer(INTEGER_TYPE_ADAPTER)); + map.register(int.class, wrapDeserializer(INTEGER_TYPE_ADAPTER)); + map.register(Long.class, wrapDeserializer(LONG_DESERIALIZER)); + map.register(long.class, wrapDeserializer(LONG_DESERIALIZER)); + map.register(Number.class, wrapDeserializer(NUMBER_TYPE_ADAPTER)); + map.register(Short.class, wrapDeserializer(SHORT_TYPE_ADAPTER)); + map.register(short.class, wrapDeserializer(SHORT_TYPE_ADAPTER)); + map.register(String.class, wrapDeserializer(STRING_TYPE_ADAPTER)); + + map.makeUnmodifiable(); + return map; + } + + private static ParameterizedTypeHandlerMap> createDefaultInstanceCreators() { + ParameterizedTypeHandlerMap> map = new ParameterizedTypeHandlerMap>(); + map.registerForTypeHierarchy(Map.class, MAP_TYPE_ADAPTER); + + // Add Collection type instance creators + map.registerForTypeHierarchy(Collection.class, COLLECTION_TYPE_ADAPTER); + + map.registerForTypeHierarchy(Set.class, HASH_SET_CREATOR); + map.registerForTypeHierarchy(SortedSet.class, TREE_SET_CREATOR); + map.register(Properties.class, PROPERTIES_CREATOR); + map.makeUnmodifiable(); + return map; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static JsonDeserializer wrapDeserializer(JsonDeserializer deserializer) { + return new JsonDeserializerExceptionWrapper(deserializer); + } + + static ParameterizedTypeHandlerMap> getDefaultSerializers() { + return getDefaultSerializers(false, LongSerializationPolicy.DEFAULT); + } + + static ParameterizedTypeHandlerMap> getDefaultSerializers( + boolean serializeSpecialFloatingPointValues, LongSerializationPolicy longSerializationPolicy) { + ParameterizedTypeHandlerMap> serializers = new ParameterizedTypeHandlerMap>(); + + // Double primitive + JcloudsDefaultTypeAdapters.DoubleSerializer doubleSerializer = new JcloudsDefaultTypeAdapters.DoubleSerializer( + serializeSpecialFloatingPointValues); + serializers.registerIfAbsent(Double.class, doubleSerializer); + serializers.registerIfAbsent(double.class, doubleSerializer); + + // Float primitive + JcloudsDefaultTypeAdapters.FloatSerializer floatSerializer = new JcloudsDefaultTypeAdapters.FloatSerializer( + serializeSpecialFloatingPointValues); + serializers.registerIfAbsent(Float.class, floatSerializer); + serializers.registerIfAbsent(float.class, floatSerializer); + + // Long primitive + JcloudsDefaultTypeAdapters.LongSerializer longSerializer = new JcloudsDefaultTypeAdapters.LongSerializer( + longSerializationPolicy); + serializers.registerIfAbsent(Long.class, longSerializer); + serializers.registerIfAbsent(long.class, longSerializer); + + serializers.registerIfAbsent(DEFAULT_SERIALIZERS); + return serializers; + } + + static ParameterizedTypeHandlerMap> getDefaultDeserializers() { + return DEFAULT_DESERIALIZERS; + } + + static ParameterizedTypeHandlerMap> getDefaultInstanceCreators() { + return DEFAULT_INSTANCE_CREATORS; + } + + static class DefaultDateTypeAdapter implements JsonSerializer, JsonDeserializer { + private final DateFormat format; + + DefaultDateTypeAdapter() { + this.format = DateFormat.getDateTimeInstance(); + } + + DefaultDateTypeAdapter(final String datePattern) { + this.format = new SimpleDateFormat(datePattern); + } + + DefaultDateTypeAdapter(final int style) { + this.format = DateFormat.getDateInstance(style); + } + + public DefaultDateTypeAdapter(final int dateStyle, final int timeStyle) { + this.format = DateFormat.getDateTimeInstance(dateStyle, timeStyle); + } + + // These methods need to be synchronized since JDK DateFormat classes are not thread-safe + // See issue 162 + public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { + synchronized (format) { + String dateFormatAsString = format.format(src); + return new JsonPrimitive(dateFormatAsString); + } + } + + public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + if (!(json instanceof JsonPrimitive)) { + throw new JsonParseException("The date should be a string value"); + } + try { + synchronized (format) { + return format.parse(json.getAsString()); + } + } catch (ParseException e) { + throw new JsonParseException(e); + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(DefaultDateTypeAdapter.class.getSimpleName()); + sb.append('(').append(format.getClass().getSimpleName()).append(')'); + return sb.toString(); + } + } + + static class DefaultJavaSqlDateTypeAdapter implements JsonSerializer, JsonDeserializer { + private final DateFormat format; + + DefaultJavaSqlDateTypeAdapter() { + this.format = new SimpleDateFormat("MMM d, yyyy"); + } + + public JsonElement serialize(java.sql.Date src, Type typeOfSrc, JsonSerializationContext context) { + synchronized (format) { + String dateFormatAsString = format.format(src); + return new JsonPrimitive(dateFormatAsString); + } + } + + public java.sql.Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + if (!(json instanceof JsonPrimitive)) { + throw new JsonParseException("The date should be a string value"); + } + try { + synchronized (format) { + Date date = format.parse(json.getAsString()); + return new java.sql.Date(date.getTime()); + } + } catch (ParseException e) { + throw new JsonParseException(e); + } + } + } + + static class DefaultTimestampDeserializer implements JsonDeserializer { + public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + Date date = context.deserialize(json, Date.class); + return new Timestamp(date.getTime()); + } + } + + static class DefaultTimeTypeAdapter implements JsonSerializer