From 89d201854be476d6e1f0ad2294c835f45759e997 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Thu, 27 Jan 2011 20:27:35 -0800 Subject: [PATCH 01/81] Issue 440: decoupled aws concepts from base ec2 driver; Issue 445: gracefully handle security group in-use --- .../java/org/jclouds/ec2/EC2AsyncClient.java | 14 - .../main/java/org/jclouds/ec2/EC2Client.java | 16 +- .../org/jclouds/ec2/EC2ContextBuilder.java | 2 +- .../org/jclouds/ec2/EC2PropertiesBuilder.java | 2 - ...BlockDeviceMappingToIndexedFormParams.java | 2 +- .../ec2/compute/EC2ComputeService.java | 64 +-- .../EC2ComputeServiceContextModule.java | 6 +- .../EC2ComputeServiceDependenciesModule.java | 65 +-- .../internal/EC2TemplateBuilderImpl.java | 5 - .../compute/options/EC2TemplateOptions.java | 137 +---- ...ityGroupsAsNeededAndReturnRunOptions.java} | 107 ++-- .../strategy/EC2ListNodesStrategy.java | 5 +- .../EC2RunNodesAndAddToSetStrategy.java | 58 +- .../suppliers/EC2HardwareSupplier.java | 55 +- .../RegionAndNameToImageSupplier.java | 44 +- .../ec2/config/EC2RestClientModule.java | 36 +- .../org/jclouds/ec2/domain/Reservation.java | 16 +- .../jclouds/ec2/domain/RunningInstance.java | 354 +++++++----- .../ec2/options/RunInstancesOptions.java | 117 +--- .../jclouds/ec2/reference/EC2Constants.java | 10 +- .../jclouds/ec2/services/AMIAsyncClient.java | 47 +- .../org/jclouds/ec2/services/AMIClient.java | 59 +- .../ec2/services/InstanceAsyncClient.java | 4 +- .../ec2/xml/BaseReservationHandler.java | 288 ++++------ .../xml/DescribeInstancesResponseHandler.java | 14 +- .../ec2/xml/RunInstancesResponseHandler.java | 9 +- .../org/jclouds/ec2/EC2AsyncClientTest.java | 4 - .../compute/EC2ComputeServiceLiveTest.java | 83 +-- .../ec2/compute/EC2ComputeServiceTest.java | 87 --- .../RunningInstanceToNodeMetadataTest.java | 55 +- .../options/EC2TemplateOptionsTest.java | 21 - ...GroupsAsNeededAndReturnRunOptionsTest.java | 442 +++++++++++++++ .../EC2RunNodesAndAddToSetStrategyTest.java | 3 +- .../ec2/options/RunInstancesOptionsTest.java | 73 +-- .../ec2/services/AMIAsyncClientTest.java | 56 -- .../ec2/services/AMIClientLiveTest.java | 10 +- .../ec2/services/BaseEC2AsyncClientTest.java | 8 +- .../ec2/services/InstanceAsyncClientTest.java | 162 +++--- .../DescribeInstancesResponseHandlerTest.java | 142 ++--- .../xml/RunInstancesResponseHandlerTest.java | 48 +- .../test/resources/describe_instances_euc.xml | 39 -- .../resources/describe_instances_nova.xml | 37 -- .../resources/describe_instances_running.xml | 2 +- .../EucalyptusPropertiesBuilder.java | 6 +- .../EucalyptusComputeServiceLiveTest.java | 30 ++ .../handlers/ParseAWSErrorFromXmlContent.java | 55 +- .../ParseAWSErrorFromXmlContentTest.java | 69 ++- .../ParseAzureErrorFromXmlContentTest.java | 1 + .../jclouds/aws/ec2/AWSEC2AsyncClient.java | 63 +++ .../org/jclouds/aws/ec2/AWSEC2Client.java | 66 +++ .../jclouds/aws/ec2/AWSEC2ContextBuilder.java | 8 +- .../aws/ec2/AWSEC2PropertiesBuilder.java | 2 +- .../aws/ec2/compute/AWSEC2ComputeService.java | 132 +++++ .../compute/AWSEC2TemplateBuilderImpl.java | 72 +++ .../ec2/compute/AWSEC2TemplateOptions.java | 423 +++++++++++++++ .../AWSEC2ComputeServiceContextModule.java | 25 +- ...WSEC2ComputeServiceDependenciesModule.java | 117 ++++ .../strategy/AWSEC2ReviseParsedImage.java | 2 +- ...rityGroupsAsNeededAndReturnRunOptions.java | 113 ++++ .../suppliers/AWSEC2HardwareSupplier.java | 90 ++++ .../AWSRegionAndNameToImageSupplier.java | 93 ++++ .../ec2/config/AWSEC2RestClientModule.java | 133 +++++ .../aws/ec2/domain/AWSRunningInstance.java | 354 ++++++++++++ .../aws}/ec2/domain/MonitoringState.java | 11 +- .../aws}/ec2/domain/PlacementGroup.java | 2 +- .../CreatePlacementGroupIfNeeded.java | 12 +- .../ec2/options/AWSRunInstancesOptions.java | 220 ++++++++ .../predicates/PlacementGroupAvailable.java | 10 +- .../ec2/predicates/PlacementGroupDeleted.java | 10 +- .../aws/ec2/reference/AWSEC2Constants.java | 58 ++ .../aws/ec2/services/AWSAMIAsyncClient.java | 94 ++++ .../aws/ec2/services/AWSAMIClient.java | 94 ++++ .../ec2/services/AWSInstanceAsyncClient.java | 92 ++++ .../aws/ec2/services/AWSInstanceClient.java | 51 ++ .../ec2/services/MonitoringAsyncClient.java | 6 +- .../aws}/ec2/services/MonitoringClient.java | 5 +- .../services/PlacementGroupAsyncClient.java | 6 +- .../ec2/services/PlacementGroupClient.java | 4 +- .../AWSDescribeInstancesResponseHandler.java | 71 +++ .../xml/AWSRunInstancesResponseHandler.java | 52 ++ .../ec2/xml/BaseAWSReservationHandler.java | 71 +++ ...escribePlacementGroupsResponseHandler.java | 4 +- ...ervedInstancesOfferingResponseHandler.java | 2 +- .../aws}/ec2/xml/MonitoringStateHandler.java | 4 +- .../aws}/ec2/xml/PlacementGroupHandler.java | 6 +- .../aws}/ec2/xml/ProductCodesHandler.java | 2 +- .../xml/ReservedInstancesOfferingHandler.java | 2 +- .../aws/ec2/AWSEC2AsyncClientTest.java | 91 ++++ .../compute/AWSEC2ComputeServiceLiveTest.java | 166 ++++++ .../AWSEC2TemplateBuilderLiveTest.java | 23 +- .../options/AWSEC2TemplateOptionsTest.java | 313 +++++++++++ .../strategy/AWSEC2ImageParserTest.java | 3 +- ...GroupsAsNeededAndReturnRunOptionsTest.java | 254 +++++---- .../options/AWSRunInstancesOptionsTest.java | 293 ++++++++++ .../ec2/services/AWSAMIAsyncClientTest.java | 386 +++++++++++++ .../ec2/services/AWSAMIClientLiveTest.java | 243 +++++++++ .../services/AWSInstanceAsyncClientTest.java | 505 ++++++++++++++++++ .../services/AWSInstanceClientLiveTest.java | 106 ++++ .../services/BaseAWSEC2AsyncClientTest.java | 93 ++++ .../services/MonitoringAsyncClientTest.java | 6 +- .../services/MonitoringClientLiveTest.java | 12 +- .../PlacementGroupAsyncClientTest.java | 6 +- .../PlacementGroupClientLiveTest.java | 38 +- ...SDescribeInstancesResponseHandlerTest.java | 161 ++++++ ...ibePlacementGroupsResponseHandlerTest.java | 6 +- ...dInstancesOfferingResponseHandlerTest.java | 3 +- .../ec2/xml/MonitoringStateHandlerTest.java | 5 +- .../aws}/ec2/xml/ProductCodesHandlerTest.java | 3 +- .../xml/RunInstancesResponseHandlerTest.java | 117 ++++ .../describe_image_attribute_productCodes.xml | 0 .../resources/describe_placement_groups.xml | 0 .../describe_reserved_instances_offerings.xml | 0 .../src/test/resources/monitoring.xml | 0 providers/eucalyptus-partnercloud-ec2/pom.xml | 6 + ...calyptusPartnerCloudPropertiesBuilder.java | 1 + ...rtnerCloudComputeServiceContextModule.java | 6 +- ...CloudEucalyptusComputeServiceLiveTest.java | 33 +- ...loudEucalyptusTemplateBuilderLiveTest.java | 2 +- .../domain/InterpretableStatement.java | 5 + 119 files changed, 6524 insertions(+), 1913 deletions(-) rename apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/{CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java => CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.java} (56%) delete mode 100644 apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceTest.java create mode 100644 apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java delete mode 100644 apis/ec2/src/test/resources/describe_instances_euc.xml delete mode 100644 apis/ec2/src/test/resources/describe_instances_nova.xml create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2AsyncClient.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2Client.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeService.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateOptions.java rename providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/{ => compute}/config/AWSEC2ComputeServiceContextModule.java (50%) create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceDependenciesModule.java rename providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/{ => compute}/strategy/AWSEC2ReviseParsedImage.java (99%) create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/suppliers/AWSEC2HardwareSupplier.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/suppliers/AWSRegionAndNameToImageSupplier.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2RestClientModule.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/AWSRunningInstance.java rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/domain/MonitoringState.java (86%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/domain/PlacementGroup.java (99%) rename {apis/ec2/src/main/java/org/jclouds/ec2/compute => providers/aws-ec2/src/main/java/org/jclouds/aws/ec2}/functions/CreatePlacementGroupIfNeeded.java (90%) create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/predicates/PlacementGroupAvailable.java (90%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/predicates/PlacementGroupDeleted.java (89%) create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/reference/AWSEC2Constants.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClient.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIClient.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClient.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceClient.java rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/services/MonitoringAsyncClient.java (95%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/services/MonitoringClient.java (94%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/services/PlacementGroupAsyncClient.java (96%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/services/PlacementGroupClient.java (97%) create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/AWSDescribeInstancesResponseHandler.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/AWSRunInstancesResponseHandler.java create mode 100644 providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/BaseAWSReservationHandler.java rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/xml/DescribePlacementGroupsResponseHandler.java (96%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/xml/DescribeReservedInstancesOfferingResponseHandler.java (98%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/xml/MonitoringStateHandler.java (95%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/xml/PlacementGroupHandler.java (94%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/xml/ProductCodesHandler.java (98%) rename {apis/ec2/src/main/java/org/jclouds => providers/aws-ec2/src/main/java/org/jclouds/aws}/ec2/xml/ReservedInstancesOfferingHandler.java (99%) create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/AWSEC2AsyncClientTest.java create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/options/AWSEC2TemplateOptionsTest.java rename providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/{ => compute}/strategy/AWSEC2ImageParserTest.java (98%) rename {apis/ec2/src/test/java/org/jclouds => providers/aws-ec2/src/test/java/org/jclouds/aws}/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java (71%) create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptionsTest.java create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClientTest.java create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSAMIClientLiveTest.java create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClientTest.java create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSInstanceClientLiveTest.java create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/BaseAWSEC2AsyncClientTest.java rename {apis/ec2/src/test/java/org/jclouds => providers/aws-ec2/src/test/java/org/jclouds/aws}/ec2/services/MonitoringAsyncClientTest.java (94%) rename {apis/ec2/src/test/java/org/jclouds => providers/aws-ec2/src/test/java/org/jclouds/aws}/ec2/services/MonitoringClientLiveTest.java (92%) rename {apis/ec2/src/test/java/org/jclouds => providers/aws-ec2/src/test/java/org/jclouds/aws}/ec2/services/PlacementGroupAsyncClientTest.java (96%) rename {apis/ec2/src/test/java/org/jclouds => providers/aws-ec2/src/test/java/org/jclouds/aws}/ec2/services/PlacementGroupClientLiveTest.java (89%) create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/AWSDescribeInstancesResponseHandlerTest.java rename {apis/ec2/src/test/java/org/jclouds => providers/aws-ec2/src/test/java/org/jclouds/aws}/ec2/xml/DescribePlacementGroupsResponseHandlerTest.java (92%) rename {apis/ec2/src/test/java/org/jclouds => providers/aws-ec2/src/test/java/org/jclouds/aws}/ec2/xml/DescribeReservedInstancesOfferingResponseHandlerTest.java (97%) rename {apis/ec2/src/test/java/org/jclouds => providers/aws-ec2/src/test/java/org/jclouds/aws}/ec2/xml/MonitoringStateHandlerTest.java (92%) rename {apis/ec2/src/test/java/org/jclouds => providers/aws-ec2/src/test/java/org/jclouds/aws}/ec2/xml/ProductCodesHandlerTest.java (95%) create mode 100644 providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/RunInstancesResponseHandlerTest.java rename {apis/ec2 => providers/aws-ec2}/src/test/resources/describe_image_attribute_productCodes.xml (100%) rename {apis/ec2 => providers/aws-ec2}/src/test/resources/describe_placement_groups.xml (100%) rename {apis/ec2 => providers/aws-ec2}/src/test/resources/describe_reserved_instances_offerings.xml (100%) rename {apis/ec2 => providers/aws-ec2}/src/test/resources/monitoring.xml (100%) diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/EC2AsyncClient.java b/apis/ec2/src/main/java/org/jclouds/ec2/EC2AsyncClient.java index b35b176d6a..4d775e5319 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/EC2AsyncClient.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/EC2AsyncClient.java @@ -25,8 +25,6 @@ import org.jclouds.ec2.services.ElasticBlockStoreAsyncClient; import org.jclouds.ec2.services.ElasticIPAddressAsyncClient; import org.jclouds.ec2.services.InstanceAsyncClient; import org.jclouds.ec2.services.KeyPairAsyncClient; -import org.jclouds.ec2.services.MonitoringAsyncClient; -import org.jclouds.ec2.services.PlacementGroupAsyncClient; import org.jclouds.ec2.services.SecurityGroupAsyncClient; import org.jclouds.ec2.services.WindowsAsyncClient; import org.jclouds.rest.annotations.Delegate; @@ -69,18 +67,6 @@ public interface EC2AsyncClient { @Delegate SecurityGroupAsyncClient getSecurityGroupServices(); - /** - * Provides asynchronous access to PlacementGroup services. - */ - @Delegate - PlacementGroupAsyncClient getPlacementGroupServices(); - - /** - * Provides asynchronous access to Monitoring services. - */ - @Delegate - MonitoringAsyncClient getMonitoringServices(); - /** * Provides asynchronous access to Windows services. */ diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/EC2Client.java b/apis/ec2/src/main/java/org/jclouds/ec2/EC2Client.java index f02e5cf528..d7f7e175e2 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/EC2Client.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/EC2Client.java @@ -21,17 +21,15 @@ package org.jclouds.ec2; import java.util.concurrent.TimeUnit; +import org.jclouds.concurrent.Timeout; import org.jclouds.ec2.services.AMIClient; import org.jclouds.ec2.services.AvailabilityZoneAndRegionClient; import org.jclouds.ec2.services.ElasticBlockStoreClient; import org.jclouds.ec2.services.ElasticIPAddressClient; import org.jclouds.ec2.services.InstanceClient; import org.jclouds.ec2.services.KeyPairClient; -import org.jclouds.ec2.services.MonitoringClient; -import org.jclouds.ec2.services.PlacementGroupClient; import org.jclouds.ec2.services.SecurityGroupClient; import org.jclouds.ec2.services.WindowsClient; -import org.jclouds.concurrent.Timeout; import org.jclouds.rest.annotations.Delegate; /** @@ -71,18 +69,6 @@ public interface EC2Client { @Delegate SecurityGroupClient getSecurityGroupServices(); - /** - * Provides synchronous access to PlacementGroup services. - */ - @Delegate - PlacementGroupClient getPlacementGroupServices(); - - /** - * Provides synchronous access to Monitoring services. - */ - @Delegate - MonitoringClient getMonitoringServices(); - /** * Provides asynchronous access to Windows services. */ diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/EC2ContextBuilder.java b/apis/ec2/src/main/java/org/jclouds/ec2/EC2ContextBuilder.java index 1237e31c11..8a4c5f32e9 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/EC2ContextBuilder.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/EC2ContextBuilder.java @@ -63,7 +63,7 @@ public class EC2ContextBuilder extends ComputeServiceContextBuilder modules) { - modules.add(new EC2RestClientModule()); + modules.add(EC2RestClientModule.create()); } @Override diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/EC2PropertiesBuilder.java b/apis/ec2/src/main/java/org/jclouds/ec2/EC2PropertiesBuilder.java index 21433ebd5f..03d60f595d 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/EC2PropertiesBuilder.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/EC2PropertiesBuilder.java @@ -24,7 +24,6 @@ import static org.jclouds.Constants.PROPERTY_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.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; -import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; import java.util.Properties; @@ -44,7 +43,6 @@ public class EC2PropertiesBuilder extends PropertiesBuilder { properties.setProperty(PROPERTY_ENDPOINT, "https://ec2.us-east-1.amazonaws.com"); properties.setProperty(PROPERTY_API_VERSION, EC2AsyncClient.VERSION); properties.setProperty(PROPERTY_EC2_AMI_OWNERS, "*"); - properties.setProperty(PROPERTY_EC2_CC_AMIs, ""); return properties; } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/binders/BindBlockDeviceMappingToIndexedFormParams.java b/apis/ec2/src/main/java/org/jclouds/ec2/binders/BindBlockDeviceMappingToIndexedFormParams.java index 044cf0bdbe..8d558c79ca 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/binders/BindBlockDeviceMappingToIndexedFormParams.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/binders/BindBlockDeviceMappingToIndexedFormParams.java @@ -45,10 +45,10 @@ public class BindBlockDeviceMappingToIndexedFormParams implements Binder { private static final String volumeIdPattern = "BlockDeviceMapping.%d.Ebs.VolumeId"; private static final String deleteOnTerminationPattern = "BlockDeviceMapping.%d.Ebs.DeleteOnTermination"; + @SuppressWarnings("unchecked") @Override public R bindToRequest(R request, Object input) { checkArgument(checkNotNull(input, "input") instanceof Map, "this binder is only valid for Map"); - @SuppressWarnings("unchecked") Map blockDeviceMapping = (Map) input; com.google.common.collect.ImmutableMap.Builder builder = ImmutableMap. builder(); diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/EC2ComputeService.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/EC2ComputeService.java index 3481944a91..2e5af2b371 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/EC2ComputeService.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/EC2ComputeService.java @@ -19,8 +19,6 @@ package org.jclouds.ec2.compute; -import static com.google.common.base.Preconditions.checkState; - import java.util.Map; import java.util.Set; import java.util.Map.Entry; @@ -32,7 +30,6 @@ import javax.inject.Provider; import javax.inject.Singleton; import org.jclouds.Constants; -import org.jclouds.aws.AWSResponseException; import org.jclouds.aws.util.AWSUtils; import org.jclouds.collect.Memoized; import org.jclouds.compute.ComputeServiceContext; @@ -58,9 +55,6 @@ import org.jclouds.ec2.compute.domain.RegionAndName; import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules; import org.jclouds.ec2.compute.options.EC2TemplateOptions; import org.jclouds.ec2.domain.KeyPair; -import org.jclouds.ec2.domain.PlacementGroup; -import org.jclouds.ec2.domain.PlacementGroup.State; -import org.jclouds.http.HttpResponseException; import org.jclouds.util.Preconditions2; import com.google.common.annotations.VisibleForTesting; @@ -76,8 +70,6 @@ public class EC2ComputeService extends BaseComputeService { private final EC2Client ec2Client; private final Map credentialsMap; private final Map securityGroupMap; - private final Map placementGroupMap; - private final Predicate placementGroupDeleted; @Inject protected EC2ComputeService(ComputeServiceContext context, Map credentialStore, @@ -92,9 +84,7 @@ public class EC2ComputeService extends BaseComputeService { @Named("NODE_SUSPENDED") Predicate nodeSuspended, InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory, 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) { + Map credentialsMap, @Named("SECURITY") Map securityGroupMap) { super(context, credentialStore, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, startNodeStrategy, stopNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, nodeTerminated, @@ -102,38 +92,7 @@ public class EC2ComputeService extends BaseComputeService { this.ec2Client = ec2Client; this.credentialsMap = credentialsMap; this.securityGroupMap = securityGroupMap; - this.placementGroupMap = placementGroupMap; - this.placementGroupDeleted = placementGroupDeleted; - } - @VisibleForTesting - void deletePlacementGroup(String region, String tag) { - Preconditions2.checkNotEmpty(tag, "tag"); - String group = String.format("jclouds#%s#%s", tag, region); - 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, group)); - 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 (UnsupportedOperationException e) { - } catch (HttpResponseException e) { - // Eucalyptus does not support placement groups yet. - if (!(e.getResponse().getStatusCode() == 400 && context.getProviderSpecificContext().getProvider().equals( - "eucalyptus"))) - throw e; - } } @VisibleForTesting @@ -142,10 +101,14 @@ public class EC2ComputeService extends BaseComputeService { String group = String.format("jclouds#%s#%s", tag, region); if (ec2Client.getSecurityGroupServices().describeSecurityGroupsInRegion(region, group).size() > 0) { logger.debug(">> deleting securityGroup(%s)", group); - ec2Client.getSecurityGroupServices().deleteSecurityGroupInRegion(region, group); - // TODO: test this clear happens - securityGroupMap.remove(new RegionNameAndIngressRules(region, group, null, false)); - logger.debug("<< deleted securityGroup(%s)", group); + try { + ec2Client.getSecurityGroupServices().deleteSecurityGroupInRegion(region, group); + // TODO: test this clear happens + securityGroupMap.remove(new RegionNameAndIngressRules(region, group, null, false)); + logger.debug("<< deleted securityGroup(%s)", group); + } catch (IllegalStateException e) { + logger.debug("<< inUse securityGroup(%s)", group); + } } } @@ -175,13 +138,16 @@ public class EC2ComputeService extends BaseComputeService { regionTags.put(AWSUtils.parseHandle(nodeMetadata.getId())[0], nodeMetadata.getTag()); } for (Entry regionTag : regionTags.entrySet()) { - deleteKeyPair(regionTag.getKey(), regionTag.getValue()); - deleteSecurityGroup(regionTag.getKey(), regionTag.getValue()); - deletePlacementGroup(regionTag.getKey(), regionTag.getValue()); + cleanUpIncidentalResources(regionTag); } return deadOnes; } + protected void cleanUpIncidentalResources(Entry regionTag) { + deleteKeyPair(regionTag.getKey(), regionTag.getValue()); + deleteSecurityGroup(regionTag.getKey(), regionTag.getValue()); + } + /** * returns template options, except of type {@link EC2TemplateOptions}. */ diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceContextModule.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceContextModule.java index 5f6d312820..dc545e3a52 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceContextModule.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceContextModule.java @@ -45,11 +45,15 @@ import com.google.inject.Provides; public class EC2ComputeServiceContextModule extends BaseComputeServiceContextModule { @Override protected void configure() { - install(new EC2ComputeServiceDependenciesModule()); + installDependencies(); install(new EC2BindComputeStrategiesByClass()); install(new EC2BindComputeSuppliersByClass()); super.configure(); } + + protected void installDependencies(){ + install(new EC2ComputeServiceDependenciesModule()); + } @Provides @Singleton diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceDependenciesModule.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceDependenciesModule.java index 175270982a..6d17a4dddc 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceDependenciesModule.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/config/EC2ComputeServiceDependenciesModule.java @@ -22,7 +22,6 @@ package org.jclouds.ec2.compute.config; import static com.google.common.collect.Iterables.toArray; import static com.google.common.collect.Maps.newLinkedHashMap; import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; -import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; import java.security.SecureRandom; import java.util.Map; @@ -31,25 +30,6 @@ import java.util.concurrent.TimeUnit; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.ec2.EC2AsyncClient; -import org.jclouds.ec2.EC2Client; -import org.jclouds.ec2.compute.EC2ComputeService; -import org.jclouds.ec2.compute.domain.RegionAndName; -import org.jclouds.ec2.compute.functions.CreatePlacementGroupIfNeeded; -import org.jclouds.ec2.compute.functions.CreateSecurityGroupIfNeeded; -import org.jclouds.ec2.compute.functions.CreateUniqueKeyPair; -import org.jclouds.ec2.compute.functions.CredentialsForInstance; -import org.jclouds.ec2.compute.functions.RegionAndIdToImage; -import org.jclouds.ec2.compute.functions.RunningInstanceToNodeMetadata; -import org.jclouds.ec2.compute.internal.EC2TemplateBuilderImpl; -import org.jclouds.ec2.compute.options.EC2TemplateOptions; -import org.jclouds.ec2.domain.InstanceState; -import org.jclouds.ec2.domain.KeyPair; -import org.jclouds.ec2.domain.PlacementGroup; -import org.jclouds.ec2.domain.RunningInstance; -import org.jclouds.ec2.predicates.InstancePresent; -import org.jclouds.ec2.predicates.PlacementGroupAvailable; -import org.jclouds.ec2.predicates.PlacementGroupDeleted; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.domain.Image; @@ -59,6 +39,21 @@ import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.Credentials; +import org.jclouds.ec2.EC2AsyncClient; +import org.jclouds.ec2.EC2Client; +import org.jclouds.ec2.compute.EC2ComputeService; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.functions.CreateSecurityGroupIfNeeded; +import org.jclouds.ec2.compute.functions.CreateUniqueKeyPair; +import org.jclouds.ec2.compute.functions.CredentialsForInstance; +import org.jclouds.ec2.compute.functions.RegionAndIdToImage; +import org.jclouds.ec2.compute.functions.RunningInstanceToNodeMetadata; +import org.jclouds.ec2.compute.internal.EC2TemplateBuilderImpl; +import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.ec2.domain.InstanceState; +import org.jclouds.ec2.domain.KeyPair; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.ec2.predicates.InstancePresent; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; @@ -100,20 +95,6 @@ public class EC2ComputeServiceDependenciesModule extends AbstractModule { return new RetryablePredicate(present, 5000, 200, TimeUnit.MILLISECONDS); } - @Provides - @Singleton - @Named("AVAILABLE") - protected Predicate placementGroupAvailable(PlacementGroupAvailable available) { - return new RetryablePredicate(available, 60, 1, TimeUnit.SECONDS); - } - - @Provides - @Singleton - @Named("DELETED") - protected Predicate placementGroupDeleted(PlacementGroupDeleted deleted) { - return new RetryablePredicate(deleted, 60, 1, TimeUnit.SECONDS); - } - @Override protected void configure() { bind(TemplateBuilder.class).to(EC2TemplateBuilderImpl.class); @@ -162,14 +143,6 @@ public class EC2ComputeServiceDependenciesModule extends AbstractModule { return newLinkedHashMap(); } - @Provides - @Singleton - @Named("PLACEMENT") - protected final Map placementGroupMap(CreatePlacementGroupIfNeeded in) { - // doesn't seem to clear when someone issues remove(key) - // return new MapMaker().makeComputingMap(in); - return newLinkedHashMap(); - } @Provides @Singleton @@ -180,14 +153,6 @@ public class EC2ComputeServiceDependenciesModule extends AbstractModule { return toArray(Splitter.on(',').split(amiOwners), String.class); } - @Provides - @Singleton - @Named(PROPERTY_EC2_CC_AMIs) - String[] ccAmis(@Named(PROPERTY_EC2_CC_AMIs) String ccAmis) { - if (ccAmis.trim().equals("")) - return new String[] {}; - return toArray(Splitter.on(',').split(ccAmis), String.class); - } @Provides @Singleton diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImpl.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImpl.java index 05da0cff62..ae2e275150 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImpl.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImpl.java @@ -71,11 +71,6 @@ public class EC2TemplateBuilderImpl extends TemplateBuilderImpl { eTo.keyPair(eFrom.getKeyPair()); if (!eFrom.shouldAutomaticallyCreateKeyPair()) eTo.noKeyPair(); - if (eFrom.getSubnetId() != null) - eTo.subnetId(eFrom.getSubnetId()); - eTo.blockDeviceMappings(eFrom.getBlockDeviceMappings()); - if (eFrom.isMonitoringEnabled()) - eTo.enableMonitoring(); if (eFrom.getUserData() != null) eTo.userData(eFrom.getUserData()); } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/options/EC2TemplateOptions.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/options/EC2TemplateOptions.java index be4932c2d4..f776c2c14d 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/options/EC2TemplateOptions.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/options/EC2TemplateOptions.java @@ -65,10 +65,6 @@ public class EC2TemplateOptions extends TemplateOptions { private Set groupIds = ImmutableSet.of(); private String keyPair = null; private boolean noKeyPair; - private boolean monitoringEnabled; - private String placementGroup = null; - private boolean noPlacementGroup; - private String subnetId; private byte[] userData; private Set blockDeviceMappings = ImmutableSet.of(); @@ -93,22 +89,12 @@ public class EC2TemplateOptions extends TemplateOptions { return this; } - /** - * Enable Cloudwatch monitoring - * - * @see CloudWatchClient - */ - public EC2TemplateOptions enableMonitoring() { - this.monitoringEnabled = true; - return this; - } - /** * Unencoded data */ public EC2TemplateOptions userData(byte[] unencodedData) { checkArgument(checkNotNull(unencodedData, "unencodedData").length <= 16 * 1024, - "userData cannot be larger than 16kb"); + "userData cannot be larger than 16kb"); this.userData = unencodedData; return this; } @@ -133,41 +119,11 @@ public class EC2TemplateOptions extends TemplateOptions { return this; } - /** - * Specifies the keypair used to run instances with - */ - public EC2TemplateOptions placementGroup(String placementGroup) { - checkNotNull(placementGroup, "use noPlacementGroup option to request boot without a keypair"); - checkState(!noPlacementGroup, "you cannot specify both options placementGroup and noPlacementGroup"); - Preconditions2.checkNotEmpty(placementGroup, "placementGroup must be non-empty"); - this.placementGroup = placementGroup; - return this; - } - - /** - * Do not use a keypair on instances - */ - public EC2TemplateOptions noPlacementGroup() { - checkState(placementGroup == null, "you cannot specify both options placementGroup and noPlacementGroup"); - this.noPlacementGroup = true; - return this; - } - - /** - * Specifies the subnetId used to run instances in - */ - public EC2TemplateOptions subnetId(String subnetId) { - checkNotNull(subnetId, "subnetId cannot be null"); - Preconditions2.checkNotEmpty(subnetId, "subnetId must be non-empty"); - this.subnetId = subnetId; - return this; - } - /** * Specifies the block device mappings to be used to run the instance */ public EC2TemplateOptions mapEBSSnapshotToDeviceName(String deviceName, String snapshotId, - @Nullable Integer sizeInGib, @Nullable Boolean deleteOnTermination) { + @Nullable Integer sizeInGib, @Nullable Boolean deleteOnTermination) { checkNotNull(deviceName, "deviceName cannot be null"); Preconditions2.checkNotEmpty(deviceName, "deviceName must be non-empty"); checkNotNull(snapshotId, "snapshotId cannot be null"); @@ -175,7 +131,7 @@ public class EC2TemplateOptions extends TemplateOptions { Set mappings = new HashSet(); mappings.addAll(blockDeviceMappings); MapEBSSnapshotToDevice mapping = new MapEBSSnapshotToDevice(deviceName, snapshotId, sizeInGib, - deleteOnTermination); + deleteOnTermination); mappings.add(mapping); blockDeviceMappings = ImmutableSet.copyOf(mappings); return this; @@ -185,7 +141,7 @@ public class EC2TemplateOptions extends TemplateOptions { * Specifies the block device mappings to be used to run the instance */ public EC2TemplateOptions mapNewVolumeToDeviceName(String deviceName, Integer sizeInGib, - @Nullable Boolean deleteOnTermination) { + @Nullable Boolean deleteOnTermination) { checkNotNull(deviceName, "deviceName cannot be null"); Preconditions2.checkNotEmpty(deviceName, "deviceName must be non-empty"); checkNotNull(sizeInGib, "sizeInGib cannot be null"); @@ -280,30 +236,6 @@ public class EC2TemplateOptions extends TemplateOptions { return EC2TemplateOptions.class.cast(options.noKeyPair()); } - /** - * @see EC2TemplateOptions#placementGroup - */ - public static EC2TemplateOptions placementGroup(String placementGroup) { - EC2TemplateOptions options = new EC2TemplateOptions(); - return EC2TemplateOptions.class.cast(options.placementGroup(placementGroup)); - } - - /** - * @see EC2TemplateOptions#noPlacementGroup - */ - public static EC2TemplateOptions noPlacementGroup() { - EC2TemplateOptions options = new EC2TemplateOptions(); - return EC2TemplateOptions.class.cast(options.noPlacementGroup()); - } - - /** - * @see EC2TemplateOptions#enableMonitoring - */ - public static EC2TemplateOptions enableMonitoring() { - EC2TemplateOptions options = new EC2TemplateOptions(); - return EC2TemplateOptions.class.cast(options.enableMonitoring()); - } - // methods that only facilitate returning the correct object type /** * @see TemplateOptions#inboundPorts @@ -353,13 +285,6 @@ public class EC2TemplateOptions extends TemplateOptions { return EC2TemplateOptions.class.cast(options.withMetadata()); } - /** - * @see TemplateOptions#withSubnetId - */ - public static EC2TemplateOptions subnetId(String subnetId) { - EC2TemplateOptions options = new EC2TemplateOptions(); - return EC2TemplateOptions.class.cast(options.subnetId(subnetId)); - } } // methods that only facilitate returning the correct object type @@ -509,34 +434,6 @@ public class EC2TemplateOptions extends TemplateOptions { return !noKeyPair; } - /** - * @return placementGroup to use when running the instance or null, to generate a placementGroup. - */ - public String getPlacementGroup() { - return placementGroup; - } - - /** - * @return true (default) if we are supposed to use a placementGroup - */ - public boolean shouldAutomaticallyCreatePlacementGroup() { - return !noPlacementGroup; - } - - /** - * @return true (default) if we are supposed to enable cloudwatch - */ - public boolean isMonitoringEnabled() { - return monitoringEnabled; - } - - /** - * @return subnetId to use when running the instance or null. - */ - public String getSubnetId() { - return subnetId; - } - /** * @return unencoded user data. */ @@ -559,11 +456,7 @@ public class EC2TemplateOptions extends TemplateOptions { result = prime * result + ((blockDeviceMappings == null) ? 0 : blockDeviceMappings.hashCode()); result = prime * result + ((groupIds == null) ? 0 : groupIds.hashCode()); result = prime * result + ((keyPair == null) ? 0 : keyPair.hashCode()); - result = prime * result + (monitoringEnabled ? 1231 : 1237); result = prime * result + (noKeyPair ? 1231 : 1237); - result = prime * result + (noPlacementGroup ? 1231 : 1237); - result = prime * result + ((placementGroup == null) ? 0 : placementGroup.hashCode()); - result = prime * result + ((subnetId == null) ? 0 : subnetId.hashCode()); result = prime * result + Arrays.hashCode(userData); return result; } @@ -592,22 +485,7 @@ public class EC2TemplateOptions extends TemplateOptions { return false; } else if (!keyPair.equals(other.keyPair)) return false; - if (monitoringEnabled != other.monitoringEnabled) - return false; - if (noKeyPair != other.noKeyPair) - return false; - if (noPlacementGroup != other.noPlacementGroup) - return false; - if (placementGroup == null) { - if (other.placementGroup != null) - return false; - } else if (!placementGroup.equals(other.placementGroup)) - return false; - if (subnetId == null) { - if (other.subnetId != null) - return false; - } else if (!subnetId.equals(other.subnetId)) - return false; + if (!Arrays.equals(userData, other.userData)) return false; @@ -618,9 +496,6 @@ public class EC2TemplateOptions extends TemplateOptions { public String toString() { return "EC2TemplateOptions [groupIds=" + groupIds + ", keyPair=" + keyPair + ", noKeyPair=" + noKeyPair - + ", monitoringEnabled=" + monitoringEnabled + ", placementGroup=" + placementGroup + ", noPlacementGroup=" - + noPlacementGroup + ", subnetId=" + subnetId + ", userData=" + Arrays.toString(userData) - + ", blockDeviceMappings=" + blockDeviceMappings + "]"; + + ", userData=" + Arrays.toString(userData) + ", blockDeviceMappings=" + blockDeviceMappings + "]"; } - } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.java similarity index 56% rename from apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java rename to apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.java index 6da51f0e16..835dbd4973 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.java @@ -20,7 +20,6 @@ package org.jclouds.ec2.compute.strategy; import static com.google.common.base.Preconditions.checkState; -import static org.jclouds.ec2.options.RunInstancesOptions.Builder.asType; import java.util.Map; import java.util.Set; @@ -34,14 +33,12 @@ import org.jclouds.compute.domain.Template; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.ec2.compute.domain.RegionAndName; import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules; -import org.jclouds.ec2.compute.functions.CreatePlacementGroupIfNeeded; import org.jclouds.ec2.compute.functions.CreateSecurityGroupIfNeeded; import org.jclouds.ec2.compute.functions.CreateUniqueKeyPair; import org.jclouds.ec2.compute.options.EC2TemplateOptions; import org.jclouds.ec2.domain.BlockDeviceMapping; import org.jclouds.ec2.domain.KeyPair; import org.jclouds.ec2.options.RunInstancesOptions; -import org.jclouds.location.Provider; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Sets; @@ -51,90 +48,70 @@ import com.google.common.collect.Sets; * @author Adrian Cole */ @Singleton -public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions { +public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions { + @VisibleForTesting - final String provider; + public final Map credentialsMap; @VisibleForTesting - final Map credentialsMap; + public final Map securityGroupMap; @VisibleForTesting - final Map securityGroupMap; + public final CreateUniqueKeyPair createUniqueKeyPair; @VisibleForTesting - final Map placementGroupMap; - @VisibleForTesting - final CreateUniqueKeyPair createUniqueKeyPair; - @VisibleForTesting - final CreateSecurityGroupIfNeeded createSecurityGroupIfNeeded; - @VisibleForTesting - final CreatePlacementGroupIfNeeded createPlacementGroupIfNeeded; + public final CreateSecurityGroupIfNeeded createSecurityGroupIfNeeded; + private final javax.inject.Provider optionsProvider; @Inject - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions(@Provider String provider, - Map credentialsMap, @Named("SECURITY") Map securityGroupMap, - @Named("PLACEMENT") Map placementGroupMap, CreateUniqueKeyPair createUniqueKeyPair, - CreateSecurityGroupIfNeeded createSecurityGroupIfNeeded, - CreatePlacementGroupIfNeeded createPlacementGroupIfNeeded) { - this.provider = provider; + public CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions(Map credentialsMap, + @Named("SECURITY") Map securityGroupMap, CreateUniqueKeyPair createUniqueKeyPair, + CreateSecurityGroupIfNeeded createSecurityGroupIfNeeded, + javax.inject.Provider optionsProvider) { this.credentialsMap = credentialsMap; this.securityGroupMap = securityGroupMap; - this.placementGroupMap = placementGroupMap; this.createUniqueKeyPair = createUniqueKeyPair; this.createSecurityGroupIfNeeded = createSecurityGroupIfNeeded; - this.createPlacementGroupIfNeeded = createPlacementGroupIfNeeded; - } - - // this method only exists so that we can mock - String getProvider() { - return provider; + this.optionsProvider = optionsProvider; } public RunInstancesOptions execute(String region, String tag, Template template) { - RunInstancesOptions instanceOptions = asType(template.getHardware().getId()); + RunInstancesOptions instanceOptions = getOptionsProvider().get().asType(template.getHardware().getId()); String keyPairName = createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, template.getOptions()); - String placementGroupName = template.getHardware().getId().startsWith("cc") ? createNewPlacementGroupUnlessUserSpecifiedOtherwise( - region, tag, template.getOptions()) : null; - - String subnetId = EC2TemplateOptions.class.cast(template.getOptions()).getSubnetId(); - - if (subnetId != null) { - instanceOptions.withSubnetId(subnetId); - } else { - Set groups = getSecurityGroupsForTagAndOptions(region, tag, template.getOptions()); - instanceOptions.withSecurityGroups(groups); - } + addSecurityGroups(region, tag, template, instanceOptions); if (keyPairName != null) instanceOptions.withKeyName(keyPairName); - if (placementGroupName != null) - instanceOptions.inPlacementGroup(placementGroupName); - byte[] userData = EC2TemplateOptions.class.cast(template.getOptions()).getUserData(); if (userData != null) instanceOptions.withUserData(userData); Set blockDeviceMappings = EC2TemplateOptions.class.cast(template.getOptions()) - .getBlockDeviceMappings(); + .getBlockDeviceMappings(); if (blockDeviceMappings != null && blockDeviceMappings.size() > 0) { checkState("ebs".equals(template.getImage().getUserMetadata().get("rootDeviceType")), - "BlockDeviceMapping only available on ebs boot"); + "BlockDeviceMapping only available on ebs boot"); instanceOptions.withBlockDeviceMappings(blockDeviceMappings); } return instanceOptions; } + protected void addSecurityGroups(String region, String tag, Template template, RunInstancesOptions instanceOptions) { + Set groups = getSecurityGroupsForTagAndOptions(region, tag, template.getOptions()); + instanceOptions.withSecurityGroups(groups); + } + @VisibleForTesting - String createNewKeyPairUnlessUserSpecifiedOtherwise(String region, String tag, TemplateOptions options) { + public String createNewKeyPairUnlessUserSpecifiedOtherwise(String region, String tag, TemplateOptions options) { String keyPairName = null; boolean shouldAutomaticallyCreateKeyPair = true; if (options instanceof EC2TemplateOptions) { keyPairName = EC2TemplateOptions.class.cast(options).getKeyPair(); if (keyPairName == null) shouldAutomaticallyCreateKeyPair = EC2TemplateOptions.class.cast(options) - .shouldAutomaticallyCreateKeyPair(); + .shouldAutomaticallyCreateKeyPair(); } if (keyPairName == null && shouldAutomaticallyCreateKeyPair) { RegionAndName regionAndName = new RegionAndName(region, tag); @@ -152,27 +129,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions } @VisibleForTesting - String createNewPlacementGroupUnlessUserSpecifiedOtherwise(String region, String tag, TemplateOptions options) { - String placementGroupName = null; - boolean shouldAutomaticallyCreatePlacementGroup = true; - if (options instanceof EC2TemplateOptions) { - placementGroupName = EC2TemplateOptions.class.cast(options).getPlacementGroup(); - if (placementGroupName == null) - shouldAutomaticallyCreatePlacementGroup = EC2TemplateOptions.class.cast(options) - .shouldAutomaticallyCreatePlacementGroup(); - } - if (placementGroupName == null && shouldAutomaticallyCreatePlacementGroup) { - placementGroupName = String.format("jclouds#%s#%s", tag, region); - RegionAndName regionAndName = new RegionAndName(region, placementGroupName); - if (!placementGroupMap.containsKey(regionAndName)) { - placementGroupMap.put(regionAndName, createPlacementGroupIfNeeded.apply(regionAndName)); - } - } - return placementGroupName; - } - - @VisibleForTesting - Set getSecurityGroupsForTagAndOptions(String region, @Nullable String tag, TemplateOptions options) { + public Set getSecurityGroupsForTagAndOptions(String region, @Nullable String tag, TemplateOptions options) { Set groups = Sets.newLinkedHashSet(); if (tag != null) { @@ -183,19 +140,25 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions if (options instanceof EC2TemplateOptions && EC2TemplateOptions.class.cast(options).getGroupIds().size() > 0) { regionNameAndIngessRulesForMarkerGroup = new RegionNameAndIngressRules(region, markerGroup, new int[] {}, - false); + false); groups.addAll(EC2TemplateOptions.class.cast(options).getGroupIds()); } else { - regionNameAndIngessRulesForMarkerGroup = new RegionNameAndIngressRules(region, markerGroup, - options.getInboundPorts(), true); + regionNameAndIngessRulesForMarkerGroup = new RegionNameAndIngressRules(region, markerGroup, options + .getInboundPorts(), true); } if (!securityGroupMap.containsKey(regionNameAndIngessRulesForMarkerGroup)) { - securityGroupMap.put(regionNameAndIngessRulesForMarkerGroup, - createSecurityGroupIfNeeded.apply(regionNameAndIngessRulesForMarkerGroup)); + securityGroupMap.put(regionNameAndIngessRulesForMarkerGroup, createSecurityGroupIfNeeded + .apply(regionNameAndIngessRulesForMarkerGroup)); } } return groups; } + + // allows us to mock this method + @VisibleForTesting + public javax.inject.Provider getOptionsProvider() { + return optionsProvider; + } } \ No newline at end of file diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2ListNodesStrategy.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2ListNodesStrategy.java index 6c2efe2617..73d6585cee 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2ListNodesStrategy.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2ListNodesStrategy.java @@ -81,12 +81,13 @@ public class EC2ListNodesStrategy implements ListNodesStrategy { @Override public Set listDetailsOnNodesMatching(Predicate filter) { - Iterable>> reservations = transformParallel( + Iterable>> reservations = transformParallel( regions, new Function>>>() { + @SuppressWarnings("unchecked") @Override public Future>> apply(String from) { - return client.getInstanceServices().describeInstancesInRegion(from); + return (Future>>) client.getInstanceServices().describeInstancesInRegion(from); } }, executor, null, logger, "reservations"); diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategy.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategy.java index 6d44e28fe2..edde764f99 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategy.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategy.java @@ -42,8 +42,6 @@ import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.compute.util.ComputeUtils; import org.jclouds.domain.Credentials; import org.jclouds.ec2.EC2Client; -import org.jclouds.ec2.compute.options.EC2TemplateOptions; -import org.jclouds.ec2.domain.Reservation; import org.jclouds.ec2.domain.RunningInstance; import org.jclouds.ec2.options.RunInstancesOptions; import org.jclouds.logging.Logger; @@ -52,6 +50,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Multimap; @@ -70,7 +69,7 @@ public class EC2RunNodesAndAddToSetStrategy implements RunNodesAndAddToSetStrate @VisibleForTesting final EC2Client client; @VisibleForTesting - final CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize; + final CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize; @VisibleForTesting final Function runningInstanceToNodeMetadata; @VisibleForTesting @@ -82,7 +81,7 @@ public class EC2RunNodesAndAddToSetStrategy implements RunNodesAndAddToSetStrate @Inject EC2RunNodesAndAddToSetStrategy( EC2Client client, - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize, + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize, @Named("PRESENT") Predicate instancePresent, Function runningInstanceToNodeMetadata, Function instanceToCredentials, Map credentialStore, @@ -100,33 +99,38 @@ public class EC2RunNodesAndAddToSetStrategy implements RunNodesAndAddToSetStrate public Map> execute(String tag, int count, Template template, Set goodNodes, Map badNodes, Multimap customizationResponses) { - Reservation reservation = createKeyPairAndSecurityGroupsAsNeededThenRunInstances(tag, - count, template); - - Iterable ids = transform(reservation, instanceToId); + Iterable started = createKeyPairAndSecurityGroupsAsNeededThenRunInstances(tag, count, + template); + Iterable ids = transform(started, instanceToId); String idsString = Joiner.on(',').join(ids); if (Iterables.size(ids) > 0) { logger.debug("<< started instances(%s)", idsString); - all(reservation, instancePresent); + all(started, instancePresent); logger.debug("<< present instances(%s)", idsString); - populateCredentials(reservation); + populateCredentials(started); } - return utils.customizeNodesAndAddToGoodMapOrPutExceptionIntoBadMap(template.getOptions(), transform(reservation, + return utils.customizeNodesAndAddToGoodMapOrPutExceptionIntoBadMap(template.getOptions(), transform(started, runningInstanceToNodeMetadata), goodNodes, badNodes, customizationResponses); } - protected void populateCredentials(Reservation reservation) { - RunningInstance instance1 = Iterables.get(reservation, 0); - Credentials credentials = instanceToCredentials.apply(instance1); + protected void populateCredentials(Iterable started) { + Credentials credentials = null; + for (RunningInstance instance : started) { + credentials = instanceToCredentials.apply(instance); + if (credentials != null) + break; + } if (credentials != null) - for (RunningInstance instance : reservation) + for (RunningInstance instance : started) credentialStore.put("node#" + instance.getRegion() + "/" + instance.getId(), credentials); + } + // TODO write test for this @VisibleForTesting - Reservation createKeyPairAndSecurityGroupsAsNeededThenRunInstances(String tag, int count, + Iterable createKeyPairAndSecurityGroupsAsNeededThenRunInstances(String tag, int count, Template template) { String region = AWSUtils.getRegionFromLocationOrNull(template.getLocation()); String zone = getZoneFromLocationOrNull(template.getLocation()); @@ -134,15 +138,23 @@ public class EC2RunNodesAndAddToSetStrategy implements RunNodesAndAddToSetStrate RunInstancesOptions instanceOptions = createKeyPairAndSecurityGroupsAsNeededAndReturncustomize.execute(region, tag, template); - if (EC2TemplateOptions.class.cast(template.getOptions()).isMonitoringEnabled()) - instanceOptions.enableMonitoring(); + int countStarted = 0; + int tries = 0; + Iterable started = ImmutableSet. of(); - if (logger.isDebugEnabled()) - logger.debug(">> running %d instance region(%s) zone(%s) ami(%s) params(%s)", count, region, zone, template - .getImage().getProviderId(), instanceOptions.buildFormParameters()); + while (countStarted < count && tries++ < count) { + if (logger.isDebugEnabled()) + logger.debug(">> running %d instance region(%s) zone(%s) ami(%s) params(%s)", count - countStarted, region, + zone, template.getImage().getProviderId(), instanceOptions.buildFormParameters()); - return client.getInstanceServices().runInstancesInRegion(region, zone, template.getImage().getProviderId(), 1, - count, instanceOptions); + started = Iterables.concat(started, client.getInstanceServices().runInstancesInRegion(region, zone, + template.getImage().getProviderId(), 1, count - countStarted, instanceOptions)); + + countStarted = Iterables.size(started); + if (countStarted < count) + logger.debug(">> not enough instances (%d/%d) started, attempting again", countStarted, count); + } + return started; } } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/suppliers/EC2HardwareSupplier.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/suppliers/EC2HardwareSupplier.java index 8f9608149c..8e79dca5eb 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/suppliers/EC2HardwareSupplier.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/suppliers/EC2HardwareSupplier.java @@ -19,37 +19,19 @@ package org.jclouds.ec2.compute.suppliers; -import static com.google.common.collect.Iterables.find; -import static com.google.common.collect.Sets.newLinkedHashSet; +import static org.jclouds.compute.predicates.ImagePredicates.any; import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.c1_medium; import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.c1_xlarge; -import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.cc1_4xlarge; import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_large; import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_small; import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_xlarge; -import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m2_2xlarge; -import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m2_4xlarge; -import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m2_xlarge; -import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.t1_micro; -import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; -import static org.jclouds.compute.predicates.ImagePredicates.any; import java.util.Set; -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.location.Provider; -import org.jclouds.logging.Logger; -import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; @@ -59,41 +41,10 @@ import com.google.common.collect.ImmutableSet; */ @Singleton public class EC2HardwareSupplier implements Supplier> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - private final Supplier> locations; - private final String[] ccAmis; - private final String providerName; - - @Inject - EC2HardwareSupplier(@Memoized Supplier> locations, @Provider String providerName, - @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis) { - this.locations = locations; - this.ccAmis = ccAmis; - this.providerName = providerName; - } @Override public Set get() { - Set sizes = newLinkedHashSet(); - for (String ccAmi : ccAmis) { - final String region = ccAmi.split("/")[0]; - Location location = find(locations.get(), new Predicate() { - - @Override - public boolean apply(Location input) { - return input.getScope() == LocationScope.REGION && input.getId().equals(region); - } - - }); - sizes.add(cc1_4xlarge().location(location).supportsImageIds(ccAmi).build()); - } - // TODO move logic to dependent module - sizes.addAll(ImmutableSet. of(t1_micro().build(), c1_medium().build(), c1_xlarge().build(), m1_large() - .build(), - !"aws-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; + return ImmutableSet. of(m1_small().supportsImage(any()).build(), c1_medium().build(), c1_xlarge() + .build(), m1_large().build(), m1_xlarge().build()); } } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/suppliers/RegionAndNameToImageSupplier.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/suppliers/RegionAndNameToImageSupplier.java index c1df66b9ff..423894b6a6 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/suppliers/RegionAndNameToImageSupplier.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/suppliers/RegionAndNameToImageSupplier.java @@ -38,31 +38,27 @@ package org.jclouds.ec2.compute.suppliers; * ==================================================================== */ -import static com.google.common.collect.Iterables.concat; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.transform; -import static com.google.common.collect.Maps.newLinkedHashMap; import static com.google.common.collect.Maps.uniqueIndex; -import static org.jclouds.ec2.options.DescribeImagesOptions.Builder.imageIds; import static org.jclouds.ec2.options.DescribeImagesOptions.Builder.ownedBy; import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; -import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; +import java.util.Map.Entry; import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.ec2.compute.domain.RegionAndName; import org.jclouds.ec2.compute.functions.EC2ImageParser; import org.jclouds.ec2.compute.strategy.DescribeImagesParallel; import org.jclouds.ec2.options.DescribeImagesOptions; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.location.Region; import org.jclouds.logging.Logger; @@ -84,18 +80,15 @@ public class RegionAndNameToImageSupplier implements Supplier regions; private final DescribeImagesParallel describer; - private final String[] ccAmis; private final String[] amiOwners; private final EC2ImageParser parser; private final Map images; @Inject - RegionAndNameToImageSupplier(@Region Set regions, DescribeImagesParallel describer, - @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis, @Named(PROPERTY_EC2_AMI_OWNERS) final String[] amiOwners, - final EC2ImageParser parser, final Map images) { + protected RegionAndNameToImageSupplier(@Region Set regions, DescribeImagesParallel describer, + @Named(PROPERTY_EC2_AMI_OWNERS) String[] amiOwners, EC2ImageParser parser, Map images) { this.regions = regions; this.describer = describer; - this.ccAmis = ccAmis; this.amiOwners = amiOwners; this.parser = parser; this.images = images; @@ -108,12 +101,11 @@ public class RegionAndNameToImageSupplier implements Supplier> providing images"); - Iterable> queries = concat( - getDescribeQueriesForOwnersInRegions(regions, amiOwners).entrySet(), ccAmisToDescribeQueries(ccAmis) - .entrySet()); + Iterable> queries = getDescribeQueriesForOwnersInRegions(regions, + amiOwners); - Iterable parsedImages = filter(transform(describer.apply(queries), parser), - Predicates.notNull()); + Iterable parsedImages = filter(transform(describer.apply(queries), parser), Predicates + .notNull()); images.putAll(uniqueIndex(parsedImages, new Function() { @@ -129,24 +121,16 @@ public class RegionAndNameToImageSupplier implements Supplier ccAmisToDescribeQueries(String[] ccAmis) { - Map queries = newLinkedHashMap(); - for (String from : ccAmis) { - queries.put(from.split("/")[0], imageIds(from.split("/")[1])); - } - return queries; - } - - private static Map getDescribeQueriesForOwnersInRegions(Set regions, - final String[] amiOwners) { - final DescribeImagesOptions options = getOptionsForOwners(amiOwners); + public Iterable> getDescribeQueriesForOwnersInRegions(Set regions, + String[] amiOwners) { + DescribeImagesOptions options = getOptionsForOwners(amiOwners); Builder builder = ImmutableMap. builder(); for (String region : regions) builder.put(region, options); - return builder.build(); + return builder.build().entrySet(); } - private static DescribeImagesOptions getOptionsForOwners(final String[] amiOwners) { + public static DescribeImagesOptions getOptionsForOwners(String[] amiOwners) { final DescribeImagesOptions options; if (amiOwners.length == 1 && amiOwners[0].equals("*")) options = new DescribeImagesOptions(); diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java b/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java index 5ab839e40f..2bc635a9db 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/config/EC2RestClientModule.java @@ -42,10 +42,6 @@ import org.jclouds.ec2.services.InstanceAsyncClient; import org.jclouds.ec2.services.InstanceClient; import org.jclouds.ec2.services.KeyPairAsyncClient; import org.jclouds.ec2.services.KeyPairClient; -import org.jclouds.ec2.services.MonitoringAsyncClient; -import org.jclouds.ec2.services.MonitoringClient; -import org.jclouds.ec2.services.PlacementGroupAsyncClient; -import org.jclouds.ec2.services.PlacementGroupClient; import org.jclouds.ec2.services.SecurityGroupAsyncClient; import org.jclouds.ec2.services.SecurityGroupClient; import org.jclouds.ec2.services.WindowsAsyncClient; @@ -65,23 +61,26 @@ import com.google.common.collect.ImmutableMap.Builder; */ @RequiresHttp @ConfiguresRestClient -public class EC2RestClientModule extends WithZonesFormSigningRestClientModule { +public class EC2RestClientModule extends + WithZonesFormSigningRestClientModule { public static final Map, Class> DELEGATE_MAP = ImmutableMap., Class> builder()// - .put(AMIClient.class, AMIAsyncClient.class)// - .put(ElasticIPAddressClient.class, ElasticIPAddressAsyncClient.class)// - .put(InstanceClient.class, InstanceAsyncClient.class)// - .put(KeyPairClient.class, KeyPairAsyncClient.class)// - .put(SecurityGroupClient.class, SecurityGroupAsyncClient.class)// - .put(PlacementGroupClient.class, PlacementGroupAsyncClient.class)// - .put(MonitoringClient.class, MonitoringAsyncClient.class)// - .put(WindowsClient.class, WindowsAsyncClient.class)// - .put(AvailabilityZoneAndRegionClient.class, AvailabilityZoneAndRegionAsyncClient.class)// - .put(ElasticBlockStoreClient.class, ElasticBlockStoreAsyncClient.class)// - .build(); + .put(AMIClient.class, AMIAsyncClient.class)// + .put(ElasticIPAddressClient.class, ElasticIPAddressAsyncClient.class)// + .put(InstanceClient.class, InstanceAsyncClient.class)// + .put(KeyPairClient.class, KeyPairAsyncClient.class)// + .put(SecurityGroupClient.class, SecurityGroupAsyncClient.class)// + .put(WindowsClient.class, WindowsAsyncClient.class)// + .put(AvailabilityZoneAndRegionClient.class, AvailabilityZoneAndRegionAsyncClient.class)// + .put(ElasticBlockStoreClient.class, ElasticBlockStoreAsyncClient.class)// + .build(); - public EC2RestClientModule() { - super(EC2Client.class, EC2AsyncClient.class, DELEGATE_MAP); + public static EC2RestClientModule create() { + return new EC2RestClientModule(EC2Client.class, EC2AsyncClient.class, DELEGATE_MAP); + } + + public EC2RestClientModule(Class sync, Class async, Map, Class> delegateMap) { + super(sync, async, delegateMap); } @Override @@ -111,6 +110,7 @@ public class EC2RestClientModule extends WithZonesFormSigningRestClientModule> { private final AvailabilityZoneAndRegionClient client; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/domain/Reservation.java b/apis/ec2/src/main/java/org/jclouds/ec2/domain/Reservation.java index fa41f67da9..03f982704b 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/domain/Reservation.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/domain/Reservation.java @@ -42,15 +42,15 @@ public class Reservation extends LinkedHashSet imp private static final long serialVersionUID = -9051777593518861395L; private final String region; private final Set groupIds = Sets.newLinkedHashSet(); - private final @Nullable - String ownerId; - private final @Nullable - String requesterId; - private final @Nullable - String reservationId; + @Nullable + private final String ownerId; + @Nullable + private final String requesterId; + @Nullable + private final String reservationId; - public Reservation(String region, Iterable groupIds, Iterable instances, - @Nullable String ownerId, @Nullable String requesterId, @Nullable String reservationId) { + public Reservation(String region, Iterable groupIds, Iterable instances, @Nullable String ownerId, + @Nullable String requesterId, @Nullable String reservationId) { this.region = checkNotNull(region, "region"); Iterables.addAll(this.groupIds, checkNotNull(groupIds, "groupIds")); Iterables.addAll(this, checkNotNull(instances, "instances")); diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/domain/RunningInstance.java b/apis/ec2/src/main/java/org/jclouds/ec2/domain/RunningInstance.java index 645de2b7b9..020c2e975f 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/domain/RunningInstance.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/domain/RunningInstance.java @@ -27,8 +27,8 @@ import java.util.Set; import javax.annotation.Nullable; - -import com.google.common.collect.Iterables; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -40,64 +40,221 @@ import com.google.common.collect.Sets; */ public class RunningInstance implements Comparable { - private final String region; - private final Set groupIds = Sets.newLinkedHashSet(); + public static class Builder { + protected String region; + protected Set groupIds = Sets.newLinkedHashSet(); + protected String amiLaunchIndex; + protected String dnsName; + protected String imageId; + protected String instanceId; + protected InstanceState instanceState; + protected String instanceType; + protected String ipAddress; + protected String kernelId; + protected String keyName; + protected Date launchTime; + protected String availabilityZone; + protected String virtualizationType = "paravirtual"; + protected String platform; + protected String privateDnsName; + protected String privateIpAddress; + protected String ramdiskId; + protected String reason; + protected RootDeviceType rootDeviceType = RootDeviceType.INSTANCE_STORE; + protected String rootDeviceName; + protected Map ebsBlockDevices = Maps.newLinkedHashMap(); - private final String amiLaunchIndex; + public Builder region(String region) { + this.region = region; + return this; + } + + public Builder groupIds(Iterable groupIds) { + this.groupIds = ImmutableSet.copyOf(checkNotNull(groupIds, "groupIds")); + return this; + } + + public Builder groupId(String groupId) { + if (groupId != null) + this.groupIds.add(groupId); + return this; + } + + public Builder amiLaunchIndex(String amiLaunchIndex) { + this.amiLaunchIndex = amiLaunchIndex; + return this; + } + + public Builder dnsName(String dnsName) { + this.dnsName = dnsName; + return this; + } + + public Builder imageId(String imageId) { + this.imageId = imageId; + return this; + } + + public Builder instanceId(String instanceId) { + this.instanceId = instanceId; + return this; + } + + public Builder instanceState(InstanceState instanceState) { + this.instanceState = instanceState; + return this; + } + + public Builder instanceType(String instanceType) { + this.instanceType = instanceType; + return this; + } + + public Builder ipAddress(String ipAddress) { + this.ipAddress = ipAddress; + return this; + } + + public Builder kernelId(String kernelId) { + this.kernelId = kernelId; + return this; + } + + public Builder keyName(String keyName) { + this.keyName = keyName; + return this; + } + + public Builder launchTime(Date launchTime) { + this.launchTime = launchTime; + return this; + } + + public Builder availabilityZone(String availabilityZone) { + this.availabilityZone = availabilityZone; + return this; + } + + public Builder virtualizationType(String virtualizationType) { + this.virtualizationType = virtualizationType; + return this; + } + + public Builder platform(String platform) { + this.platform = platform; + return this; + } + + public Builder privateDnsName(String privateDnsName) { + this.privateDnsName = privateDnsName; + return this; + } + + public Builder privateIpAddress(String privateIpAddress) { + this.privateIpAddress = privateIpAddress; + return this; + } + + public Builder ramdiskId(String ramdiskId) { + this.ramdiskId = ramdiskId; + return this; + } + + public Builder reason(String reason) { + this.reason = reason; + return this; + } + + public Builder rootDeviceType(RootDeviceType rootDeviceType) { + this.rootDeviceType = rootDeviceType; + return this; + } + + public Builder rootDeviceName(String rootDeviceName) { + this.rootDeviceName = rootDeviceName; + return this; + } + + public Builder devices(Map ebsBlockDevices) { + this.ebsBlockDevices = ImmutableMap.copyOf(checkNotNull(ebsBlockDevices, "ebsBlockDevices")); + return this; + } + + public Builder device(String key, BlockDevice value) { + if (key != null && value != null) + this.ebsBlockDevices.put(key, value); + return this; + } + + public RunningInstance build() { + return new RunningInstance(region, groupIds, amiLaunchIndex, dnsName, imageId, instanceId, instanceState, + instanceType, ipAddress, kernelId, keyName, launchTime, availabilityZone, virtualizationType, + platform, privateDnsName, privateIpAddress, ramdiskId, reason, rootDeviceType, rootDeviceName, + ebsBlockDevices); + } + + public String getDnsName() { + return dnsName; + } + + public String getIpAddress() { + return ipAddress; + } + + public String getPrivateDnsName() { + return privateDnsName; + } + + public String getPrivateIpAddress() { + return privateIpAddress; + } + + } + + protected final String region; + protected final Set groupIds; + protected final String amiLaunchIndex; @Nullable - private final String dnsName; - private final String imageId; - private final String instanceId; - private final InstanceState instanceState; - private final String instanceType; + protected final String dnsName; + protected final String imageId; + protected final String instanceId; + protected final InstanceState instanceState; + protected final String instanceType; @Nullable - private final String ipAddress; + protected final String ipAddress; @Nullable - private final String kernelId; + protected final String kernelId; @Nullable - private final String keyName; - private final Date launchTime; - private final MonitoringState monitoringState; - private final String availabilityZone; + protected final String keyName; + protected final Date launchTime; + protected final String availabilityZone; + protected final String virtualizationType; @Nullable - private final String placementGroup; - private final String virtualizationType; + protected final String platform; @Nullable - private final String platform; + protected final String privateDnsName; @Nullable - private final String privateDnsName; + protected final String privateIpAddress; @Nullable - private final String privateIpAddress; - private final Set productCodes = Sets.newLinkedHashSet(); + protected final String ramdiskId; @Nullable - private final String ramdiskId; + protected final String reason; + protected final RootDeviceType rootDeviceType; @Nullable - private final String reason; - @Nullable - private final String subnetId; - @Nullable - private final String spotInstanceRequestId; - @Nullable - private final String vpcId; - private final RootDeviceType rootDeviceType; - @Nullable - private final String rootDeviceName; - private final Map ebsBlockDevices = Maps.newHashMap(); + protected final String rootDeviceName; + protected final Map ebsBlockDevices; public int compareTo(RunningInstance o) { return (this == o) ? 0 : getId().compareTo(o.getId()); } - public RunningInstance(String region, Iterable groupIds, @Nullable String amiLaunchIndex, + protected RunningInstance(String region, Iterable groupIds, @Nullable String amiLaunchIndex, @Nullable String dnsName, String imageId, String instanceId, InstanceState instanceState, String instanceType, @Nullable String ipAddress, @Nullable String kernelId, @Nullable String keyName, - Date launchTime, MonitoringState monitoringState, String availabilityZone, @Nullable String placementGroup, - String virtualizationType, @Nullable String platform, @Nullable String privateDnsName, - @Nullable String privateIpAddress, Set productCodes, @Nullable String ramdiskId, - @Nullable String reason, @Nullable String subnetId, @Nullable String spotInstanceRequestId, - @Nullable String vpcId, RootDeviceType rootDeviceType, @Nullable String rootDeviceName, + Date launchTime, String availabilityZone, String virtualizationType, @Nullable String platform, + @Nullable String privateDnsName, @Nullable String privateIpAddress, @Nullable String ramdiskId, + @Nullable String reason, RootDeviceType rootDeviceType, @Nullable String rootDeviceName, Map ebsBlockDevices) { - Iterables.addAll(this.groupIds, checkNotNull(groupIds, "groupIds")); this.region = checkNotNull(region, "region"); this.amiLaunchIndex = amiLaunchIndex; // nullable on runinstances. this.dnsName = dnsName; // nullable on runinstances. @@ -109,22 +266,17 @@ public class RunningInstance implements Comparable { this.kernelId = kernelId; this.keyName = keyName; this.launchTime = checkNotNull(launchTime, "launchTime"); - this.monitoringState = monitoringState; - this.availabilityZone = availabilityZone; // nullable on Nova. - this.placementGroup = placementGroup; + this.availabilityZone = checkNotNull(availabilityZone, "availabilityZone"); this.virtualizationType = virtualizationType; this.platform = platform; - this.privateDnsName = privateDnsName; // nullable on Nova. - this.privateIpAddress = privateIpAddress; - Iterables.addAll(this.productCodes, checkNotNull(productCodes, "productCodes")); + this.privateDnsName = privateDnsName;// nullable on runinstances. + this.privateIpAddress = privateIpAddress;// nullable on runinstances. this.ramdiskId = ramdiskId; this.reason = reason; - this.subnetId = subnetId; - this.spotInstanceRequestId = spotInstanceRequestId; - this.vpcId = vpcId; this.rootDeviceType = checkNotNull(rootDeviceType, "rootDeviceType"); this.rootDeviceName = rootDeviceName; - this.getEbsBlockDevices().putAll(checkNotNull(ebsBlockDevices, "ebsBlockDevices")); + this.ebsBlockDevices = ImmutableMap.copyOf(checkNotNull(ebsBlockDevices, "ebsBlockDevices")); + this.groupIds = ImmutableSet.copyOf(checkNotNull(groupIds, "groupIds")); } /** @@ -209,13 +361,6 @@ public class RunningInstance implements Comparable { return launchTime; } - /** - * State of monitoring for the instance. - */ - public MonitoringState getMonitoringState() { - return monitoringState; - } - /** * The location where the instance launched. */ @@ -223,13 +368,6 @@ public class RunningInstance implements Comparable { return availabilityZone; } - /** - * The name of the placement group the instance is in (for cluster compute instances). - */ - public String getPlacementGroup() { - return placementGroup; - } - /** * Specifies the instance's virtualization type. Valid values are paravirtual or hvm. */ @@ -259,13 +397,6 @@ public class RunningInstance implements Comparable { return privateIpAddress; } - /** - * Product codes attached to this instance. - */ - public Set getProductCodes() { - return productCodes; - } - /** * Optional. RAM disk associated with this instance. */ @@ -280,27 +411,6 @@ public class RunningInstance implements Comparable { return reason; } - /** - * The ID of the Spot Instance request - */ - public String getSpotInstanceRequestId() { - return spotInstanceRequestId; - } - - /** - * Specifies the subnet ID in which the instance is running (Amazon Virtual Private Cloud). - */ - public String getSubnetId() { - return subnetId; - } - - /** - * Specifies the VPC in which the instance is running (Amazon Virtual Private Cloud). - */ - public String getVpcId() { - return vpcId; - } - public RootDeviceType getRootDeviceType() { return rootDeviceType; } @@ -339,21 +449,14 @@ public class RunningInstance implements Comparable { result = prime * result + ((kernelId == null) ? 0 : kernelId.hashCode()); result = prime * result + ((keyName == null) ? 0 : keyName.hashCode()); result = prime * result + ((launchTime == null) ? 0 : launchTime.hashCode()); - result = prime * result + ((monitoringState == null) ? 0 : monitoringState.hashCode()); - result = prime * result + ((placementGroup == null) ? 0 : placementGroup.hashCode()); result = prime * result + ((platform == null) ? 0 : platform.hashCode()); result = prime * result + ((privateDnsName == null) ? 0 : privateDnsName.hashCode()); result = prime * result + ((privateIpAddress == null) ? 0 : privateIpAddress.hashCode()); - result = prime * result + ((productCodes == null) ? 0 : productCodes.hashCode()); result = prime * result + ((ramdiskId == null) ? 0 : ramdiskId.hashCode()); - result = prime * result + ((reason == null) ? 0 : reason.hashCode()); result = prime * result + ((region == null) ? 0 : region.hashCode()); result = prime * result + ((rootDeviceName == null) ? 0 : rootDeviceName.hashCode()); result = prime * result + ((rootDeviceType == null) ? 0 : rootDeviceType.hashCode()); - result = prime * result + ((spotInstanceRequestId == null) ? 0 : spotInstanceRequestId.hashCode()); - result = prime * result + ((subnetId == null) ? 0 : subnetId.hashCode()); result = prime * result + ((virtualizationType == null) ? 0 : virtualizationType.hashCode()); - result = prime * result + ((vpcId == null) ? 0 : vpcId.hashCode()); return result; } @@ -426,16 +529,6 @@ public class RunningInstance implements Comparable { return false; } else if (!launchTime.equals(other.launchTime)) return false; - if (monitoringState == null) { - if (other.monitoringState != null) - return false; - } else if (!monitoringState.equals(other.monitoringState)) - return false; - if (placementGroup == null) { - if (other.placementGroup != null) - return false; - } else if (!placementGroup.equals(other.placementGroup)) - return false; if (platform == null) { if (other.platform != null) return false; @@ -451,21 +544,11 @@ public class RunningInstance implements Comparable { return false; } else if (!privateIpAddress.equals(other.privateIpAddress)) return false; - if (productCodes == null) { - if (other.productCodes != null) - return false; - } else if (!productCodes.equals(other.productCodes)) - return false; if (ramdiskId == null) { if (other.ramdiskId != null) return false; } else if (!ramdiskId.equals(other.ramdiskId)) return false; - if (reason == null) { - if (other.reason != null) - return false; - } else if (!reason.equals(other.reason)) - return false; if (region == null) { if (other.region != null) return false; @@ -481,41 +564,22 @@ public class RunningInstance implements Comparable { return false; } else if (!rootDeviceType.equals(other.rootDeviceType)) return false; - if (spotInstanceRequestId == null) { - if (other.spotInstanceRequestId != null) - return false; - } else if (!spotInstanceRequestId.equals(other.spotInstanceRequestId)) - return false; - if (subnetId == null) { - if (other.subnetId != null) - return false; - } else if (!subnetId.equals(other.subnetId)) - return false; if (virtualizationType == null) { if (other.virtualizationType != null) return false; } else if (!virtualizationType.equals(other.virtualizationType)) return false; - if (vpcId == null) { - if (other.vpcId != null) - return false; - } else if (!vpcId.equals(other.vpcId)) - return false; return true; } @Override public String toString() { - return "RunningInstance [amiLaunchIndex=" + amiLaunchIndex + ", availabilityZone=" + availabilityZone - + ", placementGroup=" + placementGroup + ", virtualizationType=" + virtualizationType + ", dnsName=" - + dnsName + ", ebsBlockDevices=" + ebsBlockDevices + ", groupIds=" + groupIds + ", imageId=" + imageId - + ", instanceId=" + instanceId + ", instanceState=" + instanceState + ", instanceType=" + instanceType - + ", ipAddress=" + ipAddress + ", kernelId=" + kernelId + ", keyName=" + keyName + ", launchTime=" - + launchTime + ", monitoringState=" + monitoringState + ", platform=" + platform + ", privateDnsName=" - + privateDnsName + ", privateIpAddress=" + privateIpAddress + ", productCodes=" + productCodes - + ", ramdiskId=" + ramdiskId + ", reason=" + reason + ", region=" + region + ", rootDeviceName=" - + rootDeviceName + ", rootDeviceType=" + rootDeviceType + ", spotInstanceRequestId=" - + spotInstanceRequestId + ", subnetId=" + subnetId + ", vpcId=" + vpcId + "]"; + return "[region=" + region + ", availabilityZone=" + availabilityZone + ", instanceId=" + instanceId + + ", instanceState=" + instanceState + ", instanceType=" + instanceType + ", virtualizationType=" + + virtualizationType + ", imageId=" + imageId + ", ipAddress=" + ipAddress + ", dnsName=" + dnsName + + ", privateIpAddress=" + privateIpAddress + ", privateDnsName=" + privateDnsName + ", keyName=" + + keyName + ", platform=" + platform + ", launchTime=" + launchTime + ", rootDeviceName=" + + rootDeviceName + ", rootDeviceType=" + rootDeviceType + ", ebsBlockDevices=" + ebsBlockDevices + "]"; } } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/options/RunInstancesOptions.java b/apis/ec2/src/main/java/org/jclouds/ec2/options/RunInstancesOptions.java index b3e743653d..0e35548e78 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/options/RunInstancesOptions.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/options/RunInstancesOptions.java @@ -43,8 +43,7 @@ import org.jclouds.encryption.internal.Base64; * * * @author Adrian Cole - * @see */ @@ -93,22 +92,6 @@ public class RunInstancesOptions extends BaseEC2RequestOptions { return getFirstFormOrNull("SecurityGroup.1"); } - /** - * Specifies the name of an existing placement group you want to launch the instance into (for - * cluster compute instances). - * - * @param placementGroup - * name of an existing placement group - */ - public RunInstancesOptions inPlacementGroup(String placementGroup) { - formParameters.put("Placement.GroupName", checkNotNull(placementGroup, "placementGroup")); - return this; - } - - String getPlacementGroup() { - return getFirstFormOrNull("Placement.GroupName"); - } - /** * Unencoded data */ @@ -163,58 +146,34 @@ public class RunInstancesOptions extends BaseEC2RequestOptions { return getFirstFormOrNull("RamdiskId"); } - /** - * Enables monitoring for the instance. - */ - public RunInstancesOptions enableMonitoring() { - formParameters.put("Monitoring.Enabled", "true"); - return this; - } - - String getMonitoringEnabled() { - return getFirstFormOrNull("Monitoring.Enabled"); - } - - /** - * Specifies the subnet ID within which to launch the instance(s) for Amazon Virtual Private - * Cloud. - */ - public RunInstancesOptions withSubnetId(String subnetId) { - formParameters.put("SubnetId", checkNotNull(subnetId, "subnetId")); - return this; - } - - String getSubnetId() { - return getFirstFormOrNull("SubnetId"); - } - /** * Specifies the Block Device Mapping for the instance - * + * */ - - public RunInstancesOptions withBlockDeviceMappings(Set mappings) { - int i = 1; - for(BlockDeviceMapping mapping: mappings) - { - checkNotNull(mapping.getDeviceName(), "deviceName"); - formParameters.put(String.format("BlockDeviceMapping.%d.DeviceName", i), mapping.getDeviceName()); - if(mapping.getVirtualName() != null) - formParameters.put(String.format("BlockDeviceMapping.%d.VirtualName", i), mapping.getVirtualName()); - if(mapping.getEbsSnapshotId() != null) - formParameters.put(String.format("BlockDeviceMapping.%d.Ebs.SnapshotId", i), mapping.getEbsSnapshotId()); - if(mapping.getEbsVolumeSize() != null) - formParameters.put(String.format("BlockDeviceMapping.%d.Ebs.VolumeSize", i), String.valueOf(mapping.getEbsVolumeSize())); - if(mapping.getEbsNoDevice() != null) - formParameters.put(String.format("BlockDeviceMapping.%d.Ebs.NoDevice", i), String.valueOf(mapping.getEbsNoDevice())); - if(mapping.getEbsDeleteOnTermination() != null) - formParameters.put(String.format("BlockDeviceMapping.%d.Ebs.DeleteOnTermination", i), String.valueOf(mapping.getEbsDeleteOnTermination())); - - i++; - } - return this; - } + public RunInstancesOptions withBlockDeviceMappings(Set mappings) { + int i = 1; + for (BlockDeviceMapping mapping : mappings) { + checkNotNull(mapping.getDeviceName(), "deviceName"); + formParameters.put(String.format("BlockDeviceMapping.%d.DeviceName", i), mapping.getDeviceName()); + if (mapping.getVirtualName() != null) + formParameters.put(String.format("BlockDeviceMapping.%d.VirtualName", i), mapping.getVirtualName()); + if (mapping.getEbsSnapshotId() != null) + formParameters.put(String.format("BlockDeviceMapping.%d.Ebs.SnapshotId", i), mapping.getEbsSnapshotId()); + if (mapping.getEbsVolumeSize() != null) + formParameters.put(String.format("BlockDeviceMapping.%d.Ebs.VolumeSize", i), String.valueOf(mapping + .getEbsVolumeSize())); + if (mapping.getEbsNoDevice() != null) + formParameters.put(String.format("BlockDeviceMapping.%d.Ebs.NoDevice", i), String.valueOf(mapping + .getEbsNoDevice())); + if (mapping.getEbsDeleteOnTermination() != null) + formParameters.put(String.format("BlockDeviceMapping.%d.Ebs.DeleteOnTermination", i), String + .valueOf(mapping.getEbsDeleteOnTermination())); + + i++; + } + return this; + } public static class Builder { /** @@ -233,14 +192,6 @@ public class RunInstancesOptions extends BaseEC2RequestOptions { return options.withSecurityGroup(securityGroup); } - /** - * @see RunInstancesOptions#inPlacementGroup(String) - */ - public static RunInstancesOptions inPlacementGroup(String placementGroup) { - RunInstancesOptions options = new RunInstancesOptions(); - return options.inPlacementGroup(placementGroup); - } - /** * @see RunInstancesOptions#withUserData(byte []) */ @@ -265,22 +216,6 @@ public class RunInstancesOptions extends BaseEC2RequestOptions { return options.withKernelId(kernelId); } - /** - * @see RunInstancesOptions#enableMonitoring() - */ - public static RunInstancesOptions enableMonitoring() { - RunInstancesOptions options = new RunInstancesOptions(); - return options.enableMonitoring(); - } - - /** - * @see RunInstancesOptions#withSubnetId(String) - */ - public static RunInstancesOptions withSubnetId(String subnetId) { - RunInstancesOptions options = new RunInstancesOptions(); - return options.withSubnetId(subnetId); - } - /** * @see RunInstancesOptions#withRamdisk(String) */ @@ -288,7 +223,7 @@ public class RunInstancesOptions extends BaseEC2RequestOptions { RunInstancesOptions options = new RunInstancesOptions(); return options.withRamdisk(ramdiskId); } - + /** * @see RunInstancesOptions#withBlockDeviceMappings(Set mappings) */ diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/reference/EC2Constants.java b/apis/ec2/src/main/java/org/jclouds/ec2/reference/EC2Constants.java index f54a5d63f1..f51281f681 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/reference/EC2Constants.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/reference/EC2Constants.java @@ -26,19 +26,11 @@ import org.jclouds.compute.ComputeService; * * @author Adrian Cole */ -public interface EC2Constants{ +public interface EC2Constants { /** * Listing the universe of amis is extremely expensive. set this to a comma separated value of * the ami owners you wish to use in {@link ComputeService} */ public static final String PROPERTY_EC2_AMI_OWNERS = "jclouds.ec2.ami-owners"; - public static final String PROPERTY_ELB_ENDPOINT = "jclouds.elb.endpoint"; - - /** - * amis that work on the cluster instance type - * - * @see InstanceType.CC1_4XLARGE - */ - public static final String PROPERTY_EC2_CC_AMIs = "jclouds.ec2.cc-amis"; } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/services/AMIAsyncClient.java b/apis/ec2/src/main/java/org/jclouds/ec2/services/AMIAsyncClient.java index 39253ff9ee..d86528fbbe 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/services/AMIAsyncClient.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/services/AMIAsyncClient.java @@ -32,12 +32,11 @@ import javax.ws.rs.Path; import org.jclouds.aws.filters.FormSigner; import org.jclouds.ec2.EC2AsyncClient; -import org.jclouds.ec2.binders.BindProductCodesToIndexedFormParams; import org.jclouds.ec2.binders.BindUserGroupsToIndexedFormParams; import org.jclouds.ec2.binders.BindUserIdsToIndexedFormParams; import org.jclouds.ec2.domain.Image; -import org.jclouds.ec2.domain.Image.EbsBlockDevice; import org.jclouds.ec2.domain.Permission; +import org.jclouds.ec2.domain.Image.EbsBlockDevice; import org.jclouds.ec2.options.CreateImageOptions; import org.jclouds.ec2.options.DescribeImagesOptions; import org.jclouds.ec2.options.RegisterImageBackedByEbsOptions; @@ -46,7 +45,6 @@ import org.jclouds.ec2.xml.BlockDeviceMappingHandler; import org.jclouds.ec2.xml.DescribeImagesResponseHandler; import org.jclouds.ec2.xml.ImageIdHandler; import org.jclouds.ec2.xml.PermissionHandler; -import org.jclouds.ec2.xml.ProductCodesHandler; import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull; import org.jclouds.rest.annotations.BinderParam; import org.jclouds.rest.annotations.EndpointParam; @@ -79,7 +77,8 @@ public interface AMIAsyncClient { @XMLResponseParser(DescribeImagesResponseHandler.class) @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) ListenableFuture> describeImagesInRegion( - @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, DescribeImagesOptions... options); + @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, + DescribeImagesOptions... options); /** * @see AMIClient#createImageInRegion @@ -88,7 +87,8 @@ public interface AMIAsyncClient { @Path("/") @FormParams(keys = ACTION, values = "CreateImage") @XMLResponseParser(ImageIdHandler.class) - ListenableFuture createImageInRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, + ListenableFuture createImageInRegion( + @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("Name") String name, @FormParam("InstanceId") String instanceId, CreateImageOptions... options); /** @@ -97,7 +97,8 @@ public interface AMIAsyncClient { @POST @Path("/") @FormParams(keys = ACTION, values = "DeregisterImage") - ListenableFuture deregisterImageInRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, + ListenableFuture deregisterImageInRegion( + @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("ImageId") String imageId); /** @@ -173,17 +174,6 @@ public interface AMIAsyncClient { @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("ImageId") String imageId); - /** - * @see AMIClient#getProductCodesForImageInRegion - */ - @POST - @Path("/") - @FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "productCodes" }) - @XMLResponseParser(ProductCodesHandler.class) - ListenableFuture> getProductCodesForImageInRegion( - @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, - @FormParam("ImageId") String imageId); - /** * @see AMIClient#getBlockDeviceMappingsForImageInRegion */ @@ -194,27 +184,4 @@ public interface AMIAsyncClient { ListenableFuture> getBlockDeviceMappingsForImageInRegion( @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @FormParam("ImageId") String imageId); - - /** - * @see AMIClient#addProductCodesToImageInRegion - */ - @POST - @Path("/") - @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "add", - "productCodes" }) - ListenableFuture addProductCodesToImageInRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, - @BinderParam(BindProductCodesToIndexedFormParams.class) Iterable productCodes, - @FormParam("ImageId") String imageId); - - /** - * @see AMIClient#removeProductCodesToImageInRegion - */ - @POST - @Path("/") - @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "remove", - "productCodes" }) - ListenableFuture removeProductCodesFromImageInRegion( - @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, - @BinderParam(BindProductCodesToIndexedFormParams.class) Iterable productCodes, - @FormParam("ImageId") String imageId); } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/services/AMIClient.java b/apis/ec2/src/main/java/org/jclouds/ec2/services/AMIClient.java index 9e621fcbc2..29d1b5aadb 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/services/AMIClient.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/services/AMIClient.java @@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; +import org.jclouds.concurrent.Timeout; import org.jclouds.ec2.domain.Image; import org.jclouds.ec2.domain.Permission; import org.jclouds.ec2.domain.Image.EbsBlockDevice; @@ -32,7 +33,6 @@ import org.jclouds.ec2.options.CreateImageOptions; import org.jclouds.ec2.options.DescribeImagesOptions; import org.jclouds.ec2.options.RegisterImageBackedByEbsOptions; import org.jclouds.ec2.options.RegisterImageOptions; -import org.jclouds.concurrent.Timeout; /** * Provides access to EC2 via their REST API. @@ -60,22 +60,6 @@ public interface AMIClient { @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) Set describeImagesInRegion(@Nullable String region, DescribeImagesOptions... options); - /** - * Returns the Product Codes of an image. - * - * @param region - * AMIs are tied to the Region where its files are located within Amazon S3. - * @param imageId - * The ID of the AMI for which an attribute will be described - * @see #describeImages - * @see #modifyImageAttribute - * @see #resetImageAttribute - * @see - * @see DescribeImagesOptions - */ - Set getProductCodesForImageInRegion(@Nullable String region, String imageId); - /** * Returns a map of device name to block device for the image. * @@ -114,8 +98,7 @@ public interface AMIClient { * "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateImage.html" * /> */ - String createImageInRegion(@Nullable String region, String name, String instanceId, - CreateImageOptions... options); + String createImageInRegion(@Nullable String region, String name, String instanceId, CreateImageOptions... options); /** * @@ -201,7 +184,7 @@ public interface AMIClient { */ String registerUnixImageBackedByEbsInRegion(@Nullable String region, String name, String ebsSnapshotId, RegisterImageBackedByEbsOptions... options); - + /** * Returns the {@link Permission}s of an image. * @@ -276,40 +259,4 @@ public interface AMIClient { void removeLaunchPermissionsFromImageInRegion(@Nullable String region, Iterable userIds, Iterable userGroups, String imageId); - /** - * Adds {@code productCode}s to an AMI. - * - * @param region - * AMIs are tied to the Region where its files are located within Amazon S3. - * @param productCodes - * Product Codes - * @param imageId - * The AMI ID. - * - * @see #removeProductCodesFromImage - * @see #describeImageAttribute - * @see #resetImageAttribute - * @see - */ - void addProductCodesToImageInRegion(@Nullable String region, Iterable productCodes, String imageId); - - /** - * Removes {@code productCode}s from an AMI. - * - * @param region - * AMIs are tied to the Region where its files are located within Amazon S3. - * @param productCodes - * Product Codes - * @param imageId - * The AMI ID. - * - * @see #addProductCodesToImage - * @see #describeImageAttribute - * @see #resetImageAttribute - * @see - */ - void removeProductCodesFromImageInRegion(@Nullable String region, Iterable productCodes, - String imageId); } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/services/InstanceAsyncClient.java b/apis/ec2/src/main/java/org/jclouds/ec2/services/InstanceAsyncClient.java index cecacd6ecc..b30afddbf7 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/services/InstanceAsyncClient.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/services/InstanceAsyncClient.java @@ -83,7 +83,7 @@ public interface InstanceAsyncClient { @FormParams(keys = ACTION, values = "DescribeInstances") @XMLResponseParser(DescribeInstancesResponseHandler.class) @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) - ListenableFuture>> describeInstancesInRegion( + ListenableFuture>> describeInstancesInRegion( @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds); @@ -94,7 +94,7 @@ public interface InstanceAsyncClient { @Path("/") @FormParams(keys = ACTION, values = "RunInstances") @XMLResponseParser(RunInstancesResponseHandler.class) - ListenableFuture> runInstancesInRegion( + ListenableFuture> runInstancesInRegion( @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, @Nullable @BinderParam(IfNotNullBindAvailabilityZoneToFormParam.class) String nullableAvailabilityZone, @FormParam("ImageId") String imageId, @FormParam("MinCount") int minCount, diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java b/apis/ec2/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java index 6a60ae61b2..04c4af953d 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/xml/BaseReservationHandler.java @@ -20,28 +20,27 @@ package org.jclouds.ec2.xml; import java.util.Date; -import java.util.Map; import java.util.Set; import javax.annotation.Resource; import javax.inject.Inject; +import org.jclouds.aws.util.AWSUtils; +import org.jclouds.date.DateService; import org.jclouds.ec2.domain.Attachment; import org.jclouds.ec2.domain.BlockDevice; import org.jclouds.ec2.domain.InstanceState; -import org.jclouds.ec2.domain.MonitoringState; import org.jclouds.ec2.domain.Reservation; import org.jclouds.ec2.domain.RootDeviceType; import org.jclouds.ec2.domain.RunningInstance; -import org.jclouds.aws.util.AWSUtils; -import org.jclouds.date.DateService; +import org.jclouds.ec2.domain.RunningInstance.Builder; import org.jclouds.http.functions.ParseSax.HandlerForGeneratedRequestWithResult; import org.jclouds.location.Region; import org.jclouds.logging.Logger; import org.xml.sax.Attributes; -import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.google.inject.Provider; /** * @@ -49,75 +48,49 @@ import com.google.common.collect.Sets; */ public abstract class BaseReservationHandler extends HandlerForGeneratedRequestWithResult { - protected final DateService dateService; - - protected final String defaultRegion; - - @Inject - public BaseReservationHandler(DateService dateService, @Region String defaultRegion) { - this.dateService = dateService; - this.defaultRegion = defaultRegion; - } - @Resource protected Logger logger = Logger.NULL; - private StringBuilder currentText = new StringBuilder(); - private Set groupIds = Sets.newLinkedHashSet(); - private Set instances = Sets.newLinkedHashSet(); - private String ownerId; - private String requesterId; - private String reservationId; - private String amiLaunchIndex; - private String dnsName; - private String imageId; - private String instanceId; - private InstanceState instanceState; - private String instanceType; - private String ipAddress; - private String kernelId; - private String keyName; - private Date launchTime; - private MonitoringState monitoringState; - private String availabilityZone; - private String placementGroup; - private String virtualizationType = "paravirtual"; - private String platform; - private String privateDnsName; - private String privateIpAddress; - private Set productCodes = Sets.newHashSet(); - private String ramdiskId; - private String reason; - private String spotInstanceRequestId; - private String subnetId; - private String vpcId; - protected boolean inInstances; - protected boolean inProductCodes; - protected boolean inGroups; - protected boolean inMonitoring; - private boolean inBlockDeviceMapping; - private Map ebsBlockDevices = Maps.newHashMap(); + protected final DateService dateService; + protected final String defaultRegion; + protected final Provider builderProvider; + @Inject + public BaseReservationHandler(DateService dateService, @Region String defaultRegion, + Provider builderProvider) { + this.dateService = dateService; + this.defaultRegion = defaultRegion; + this.builderProvider = builderProvider; + this.builder = builderProvider.get(); + } + + protected StringBuilder currentText = new StringBuilder(); + + protected Builder builder; + + protected int itemDepth; + boolean inInstancesSet; + // attachments private String volumeId; private Attachment.Status attachmentStatus; private Date attachTime; private boolean deleteOnTermination; - private RootDeviceType rootDeviceType = RootDeviceType.INSTANCE_STORE; private String deviceName; - private String rootDeviceName; + + // reservation stuff + private Set groupIds = Sets.newLinkedHashSet(); + private String ownerId; + private String requesterId; + private String reservationId; + + private Set instances = Sets.newLinkedHashSet(); public void startElement(String uri, String name, String qName, Attributes attrs) { - if (qName.equals("instancesSet")) { - inInstances = true; - } else if (qName.equals("productCodesSet")) { - inProductCodes = true; - } else if (qName.equals("groupSet")) { - inGroups = true; - } else if (qName.equals("blockDeviceMapping")) { - inBlockDeviceMapping = true; + if (qName.equals("item")) { + itemDepth++; + } else if (qName.equals("instancesSet")) { + inInstancesSet = true; } - if (qName.equals("monitoring")) - inMonitoring = true; } protected String currentOrNull() { @@ -126,7 +99,12 @@ public abstract class BaseReservationHandler extends HandlerForGeneratedReque } public void endElement(String uri, String name, String qName) { - if (qName.equals("groupId")) { + if (qName.equals("item")) { + inItem(); + itemDepth--; + } else if (qName.equals("instancesSet")) { + inInstancesSet = false; + } else if (qName.equals("groupId")) { groupIds.add(currentOrNull()); } else if (qName.equals("ownerId")) { ownerId = currentOrNull(); @@ -135,83 +113,51 @@ public abstract class BaseReservationHandler extends HandlerForGeneratedReque } else if (qName.equals("reservationId")) { reservationId = currentOrNull(); } else if (qName.equals("amiLaunchIndex")) { - amiLaunchIndex = currentOrNull(); + builder.amiLaunchIndex(currentOrNull()); } else if (qName.equals("dnsName")) { - dnsName = currentOrNull(); + String dnsName = currentOrNull(); // Eucalyptus - if ("0.0.0.0".equals(dnsName)) - dnsName = null; + if (!"0.0.0.0".equals(dnsName)) + builder.dnsName(dnsName); } else if (qName.equals("imageId")) { - imageId = currentOrNull(); + builder.imageId(currentOrNull()); } else if (qName.equals("instanceId")) { - instanceId = currentOrNull(); + builder.instanceId(currentOrNull()); } else if (qName.equals("name")) { - String state = currentOrNull(); - if (state != null) { - // Nova - if ("shutdown".equalsIgnoreCase(state)) - instanceState = InstanceState.TERMINATED; - else - instanceState = InstanceState.fromValue(state); - } + builder.instanceState(InstanceState.fromValue(currentOrNull())); } else if (qName.equals("instanceType")) { - instanceType = currentOrNull(); + builder.instanceType(currentOrNull()); } else if (qName.equals("ipAddress")) { - ipAddress = currentOrNull(); + builder.ipAddress(currentOrNull()); } else if (qName.equals("kernelId")) { - kernelId = currentOrNull(); + builder.kernelId(currentOrNull()); } else if (qName.equals("keyName")) { - keyName = currentOrNull(); + builder.keyName(currentOrNull()); } else if (qName.equals("launchTime")) { - try { - launchTime = dateService.iso8601DateParse(currentOrNull()); - } catch (RuntimeException e) { - // Eucalyptus - launchTime = dateService.iso8601SecondsDateParse(currentOrNull()); - } - } else if (qName.equals("state") && inMonitoring) { - monitoringState = MonitoringState.fromValue(currentOrNull()); + builder.launchTime(parseDate()); } else if (qName.equals("availabilityZone")) { - availabilityZone = currentOrNull(); - } else if (qName.equals("groupName")) { - placementGroup = currentOrNull(); + builder.availabilityZone(currentOrNull()); } else if (qName.equals("virtualizationType")) { - virtualizationType = currentOrNull(); + builder.virtualizationType(currentOrNull()); } else if (qName.equals("platform")) { - platform = currentOrNull(); + builder.platform(currentOrNull()); } else if (qName.equals("privateDnsName")) { - privateDnsName = currentOrNull(); + String privateDnsName = currentOrNull(); // Eucalyptus - if ("0.0.0.0".equals(privateDnsName)) - privateDnsName = null; + if (!"0.0.0.0".equals(privateDnsName)) + builder.privateDnsName(privateDnsName); } else if (qName.equals("privateIpAddress")) { - privateIpAddress = currentOrNull(); + builder.privateIpAddress(currentOrNull()); } else if (qName.equals("ramdiskId")) { - ramdiskId = currentOrNull(); + builder.ramdiskId(currentOrNull()); } else if (qName.equals("reason")) { - reason = currentOrNull(); - } else if (qName.equals("subnetId")) { - subnetId = currentOrNull(); - } else if (qName.equals("spotInstanceRequestId")) { - spotInstanceRequestId = currentOrNull(); - } else if (qName.equals("vpcId")) { - vpcId = currentOrNull(); - } else if (qName.equals("productCode")) { - productCodes.add(currentOrNull()); - } else if (qName.equals("productCodesSet")) { - inProductCodes = false; - } else if (qName.equals("instancesSet")) { - inInstances = false; - } else if (qName.equals("groupSet")) { - inGroups = false; - } else if (qName.equals("monitoring")) { - inMonitoring = false; - } else if (qName.equals("blockDeviceMapping")) { - inBlockDeviceMapping = false; + builder.reason(currentOrNull()); + } else if (qName.equals("rootDeviceType")) { + builder.rootDeviceType(RootDeviceType.fromValue(currentOrNull())); + } else if (qName.equals("rootDeviceName")) { + builder.rootDeviceName(currentOrNull()); } else if (qName.equals("deviceName")) { deviceName = currentOrNull(); - } else if (qName.equals("rootDeviceType")) { - rootDeviceType = RootDeviceType.fromValue(currentOrNull()); } else if (qName.equals("volumeId")) { volumeId = currentOrNull(); } else if (qName.equals("status")) { @@ -220,72 +166,60 @@ public abstract class BaseReservationHandler extends HandlerForGeneratedReque attachTime = dateService.iso8601DateParse(currentText.toString().trim()); } else if (qName.equals("deleteOnTermination")) { deleteOnTermination = Boolean.parseBoolean(currentText.toString().trim()); - } else if (qName.equals("rootDeviceName")) { - rootDeviceName = currentOrNull(); - } else if (qName.equals("item")) { - inItem(); - } - currentText = new StringBuilder(); - } - - protected void inItem() { - if (inBlockDeviceMapping) { - ebsBlockDevices.put(deviceName, new BlockDevice(volumeId, attachmentStatus, attachTime, - deleteOnTermination)); + } else if (qName.equals("ebs")) { + builder.device(deviceName, new BlockDevice(volumeId, attachmentStatus, attachTime, deleteOnTermination)); this.deviceName = null; this.volumeId = null; this.attachmentStatus = null; this.attachTime = null; this.deleteOnTermination = true; - } else if (inInstances && !inProductCodes && !inBlockDeviceMapping) { - String region = getRequest() != null ? AWSUtils.findRegionInArgsOrNull(getRequest()) : null; + } + currentText = new StringBuilder(); + } + protected Date parseDate() { + try { + return dateService.iso8601DateParse(currentOrNull()); + } catch (RuntimeException e) { // Eucalyptus - if (ipAddress == null && dnsName != null && dnsName.matches(".*[0-9]$")) { - ipAddress = dnsName; - dnsName = null; - } - - if (privateIpAddress == null && privateDnsName != null && privateDnsName.matches(".*[0-9]$")) { - privateIpAddress = privateDnsName; - privateDnsName = null; - } - if (region == null) - region = defaultRegion; - instances.add(new RunningInstance(region, groupIds, amiLaunchIndex, dnsName, imageId, instanceId, - instanceState, instanceType, ipAddress, kernelId, keyName, launchTime, monitoringState, - availabilityZone, placementGroup, virtualizationType, platform, privateDnsName, privateIpAddress, - productCodes, ramdiskId, reason, subnetId, spotInstanceRequestId, vpcId, rootDeviceType, rootDeviceName, - ebsBlockDevices)); - this.amiLaunchIndex = null; - this.dnsName = null; - this.imageId = null; - this.instanceId = null; - this.instanceState = null; - this.instanceType = null; - this.ipAddress = null; - this.kernelId = null; - this.keyName = null; - this.launchTime = null; - this.monitoringState = null; - this.availabilityZone = null; - this.placementGroup = null; - this.virtualizationType = "paravirtual"; - this.platform = null; - this.privateDnsName = null; - this.privateIpAddress = null; - this.productCodes = Sets.newHashSet(); - this.ramdiskId = null; - this.reason = null; - this.subnetId = null; - this.spotInstanceRequestId = null; - this.vpcId = null; - this.rootDeviceType = RootDeviceType.INSTANCE_STORE; - this.rootDeviceName = null; - this.ebsBlockDevices = Maps.newHashMap(); + return dateService.iso8601SecondsDateParse(currentOrNull()); } } + protected void inItem() { + if (endOfInstanceItem()) { + refineBuilderBeforeAddingInstance(); + instances.add(builder.build()); + builder = builderProvider.get(); + } + } + + protected void refineBuilderBeforeAddingInstance() { + String region = getRequest() != null ? AWSUtils.findRegionInArgsOrNull(getRequest()) : null; + + // Eucalyptus + if (builder.getIpAddress() == null && builder.getDnsName() != null && builder.getDnsName().matches(".*[0-9]$")) { + builder.ipAddress(builder.getDnsName()); + builder.dnsName(null); + } + if (builder.getPrivateIpAddress() == null && builder.getPrivateDnsName() != null + && builder.getPrivateDnsName().matches(".*[0-9]$")) { + builder.privateIpAddress(builder.getPrivateDnsName()); + builder.privateDnsName(null); + } + + builder.region((region == null) ? defaultRegion : region); + builder.groupIds(groupIds); + } + + protected Builder builder() { + return builder; + } + + protected boolean endOfInstanceItem() { + return itemDepth <= 2 && inInstancesSet; + } + public void characters(char ch[], int start, int length) { currentText.append(ch, start, length); } @@ -295,7 +229,7 @@ public abstract class BaseReservationHandler extends HandlerForGeneratedReque if (region == null) region = defaultRegion; Reservation info = new Reservation(region, groupIds, instances, - ownerId, requesterId, reservationId); + ownerId, requesterId, reservationId); this.groupIds = Sets.newLinkedHashSet(); this.instances = Sets.newLinkedHashSet(); this.ownerId = null; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeInstancesResponseHandler.java b/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeInstancesResponseHandler.java index 57fc65e789..a63eb307e4 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeInstancesResponseHandler.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeInstancesResponseHandler.java @@ -23,12 +23,13 @@ import java.util.Set; import javax.inject.Inject; +import org.jclouds.date.DateService; import org.jclouds.ec2.domain.Reservation; import org.jclouds.ec2.domain.RunningInstance; -import org.jclouds.date.DateService; import org.jclouds.location.Region; import com.google.common.collect.Sets; +import com.google.inject.Provider; /** * Parses the following XML document: @@ -43,8 +44,9 @@ public class DescribeInstancesResponseHandler extends private Set> reservations = Sets.newLinkedHashSet(); @Inject - DescribeInstancesResponseHandler(DateService dateService, @Region String defaultRegion) { - super(dateService, defaultRegion); + DescribeInstancesResponseHandler(DateService dateService, @Region String defaultRegion, + Provider builderProvider) { + super(dateService, defaultRegion, builderProvider); } @Override @@ -52,9 +54,13 @@ public class DescribeInstancesResponseHandler extends return reservations; } + protected boolean endOfReservationItem() { + return itemDepth == 1; + } + @Override protected void inItem() { - if (!inInstances && !inProductCodes && !inGroups) { + if (endOfReservationItem()) { reservations.add(super.newReservation()); } else { super.inItem(); diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/RunInstancesResponseHandler.java b/apis/ec2/src/main/java/org/jclouds/ec2/xml/RunInstancesResponseHandler.java index 5188ae029c..ab776e81f7 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/RunInstancesResponseHandler.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/xml/RunInstancesResponseHandler.java @@ -21,11 +21,13 @@ package org.jclouds.ec2.xml; import javax.inject.Inject; +import org.jclouds.date.DateService; import org.jclouds.ec2.domain.Reservation; import org.jclouds.ec2.domain.RunningInstance; -import org.jclouds.date.DateService; import org.jclouds.location.Region; +import com.google.inject.Provider; + /** * Parses the following XML document: *

@@ -37,8 +39,9 @@ import org.jclouds.location.Region; public class RunInstancesResponseHandler extends BaseReservationHandler> { @Inject - RunInstancesResponseHandler(DateService dateService, @Region String defaultRegion) { - super(dateService, defaultRegion); + RunInstancesResponseHandler(DateService dateService, @Region String defaultRegion, + Provider builderProvider) { + super(dateService, defaultRegion, builderProvider); } @Override diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/EC2AsyncClientTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/EC2AsyncClientTest.java index 52bf7daaa8..ae90573c74 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/EC2AsyncClientTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/EC2AsyncClientTest.java @@ -49,9 +49,7 @@ public class EC2AsyncClientTest extends BaseEC2AsyncClientTest { assert syncClient.getElasticIPAddressServices() != null; assert syncClient.getInstanceServices() != null; assert syncClient.getKeyPairServices() != null; - assert syncClient.getMonitoringServices() != null; assert syncClient.getSecurityGroupServices() != null; - assert syncClient.getPlacementGroupServices() != null; assert syncClient.getWindowsServices() != null; } @@ -63,9 +61,7 @@ public class EC2AsyncClientTest extends BaseEC2AsyncClientTest { assert asyncClient.getElasticIPAddressServices() != null; assert asyncClient.getInstanceServices() != null; assert asyncClient.getKeyPairServices() != null; - assert asyncClient.getMonitoringServices() != null; assert asyncClient.getSecurityGroupServices() != null; - assert asyncClient.getPlacementGroupServices() != null; assert asyncClient.getWindowsServices() != null; } diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceLiveTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceLiveTest.java index 61d4ed91c5..94959534b5 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceLiveTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceLiveTest.java @@ -101,11 +101,8 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { TemplateOptions options = client.templateOptions(); -// Date before = new Date(); - options.as(EC2TemplateOptions.class).securityGroups(tag); options.as(EC2TemplateOptions.class).keyPair(tag); - options.as(EC2TemplateOptions.class).enableMonitoring(); String startedId = null; try { @@ -129,7 +126,6 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { RunningInstance instance = getInstance(instanceClient, startedId); assertEquals(instance.getKeyName(), tag); -// checkMonitoringEnabled(before, instance); // make sure we made our dummy group and also let in the user's group assertEquals(Sets.newTreeSet(instance.getGroupIds()), @@ -155,21 +151,6 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { } } -// private void checkMonitoringEnabled(Date before, RunningInstance instance) { -// assertEquals(instance.getMonitoringState(), MonitoringState.ENABLED); -// -// RestContext monitoringContext = new RestContextFactory().createContext( -// "cloudwatch", identity, credential, ImmutableSet. of(new Log4JLoggingModule())); -// -// try { -// Set datapoints = monitoringContext.getApi().getMetricStatisticsInRegion(instance.getRegion(), -// "CPUUtilization", before, new Date(), 60, "Average"); -// assert datapoints != null; -// } finally { -// monitoringContext.close(); -// } -// } - @Test(enabled = true, dependsOnMethods = "testCompareSizes") public void testExtendedOptionsNoKeyPair() throws Exception { SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) @@ -224,73 +205,13 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { } } - @Test(enabled = true, dependsOnMethods = "testCompareSizes") - public void testExtendedOptionsWithSubnetId() throws Exception { - - String subnetId = System.getProperty("test.subnetId"); - if (subnetId == null) { - // Skip test and return - return; - } - SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) - .getSecurityGroupServices(); - - KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) - .getKeyPairServices(); - - InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) - .getInstanceServices(); - - String tag = this.tag + "g"; - - TemplateOptions options = client.templateOptions(); - - // options.as(EC2TemplateOptions.class).securityGroups(tag); - options.as(EC2TemplateOptions.class).keyPair(tag); - options.as(EC2TemplateOptions.class).subnetId(subnetId); - - String startedId = null; - String nodeId = null; - try { - cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); - - // create the security group - // securityGroupClient.createSecurityGroupInRegion(null, tag, tag); - - // create a keypair to pass in as well - keyPairClient.createKeyPairInRegion(null, tag); - - Set nodes = client.runNodesWithTag(tag, 1, options); - - NodeMetadata first = Iterables.get(nodes, 0); - assert first.getCredentials() != null : first; - assert first.getCredentials().identity != null : first; - - startedId = Iterables.getOnlyElement(nodes).getProviderId(); - nodeId = Iterables.getOnlyElement(nodes).getId(); - - RunningInstance instance = getInstance(instanceClient, startedId); - - assertEquals(instance.getSubnetId(), subnetId); - - } finally { - if (nodeId != null) - client.destroyNode(nodeId); - if (startedId != null) { - // ensure we didn't delete these resources! - assertEquals(keyPairClient.describeKeyPairsInRegion(null, tag).size(), 1); - } - cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); - } - } - - private RunningInstance getInstance(InstanceClient instanceClient, String id) { + protected RunningInstance getInstance(InstanceClient instanceClient, String id) { RunningInstance instance = Iterables.getOnlyElement(Iterables.getOnlyElement(instanceClient .describeInstancesInRegion(null, id))); return instance; } - private void cleanupExtendedStuff(SecurityGroupClient securityGroupClient, KeyPairClient keyPairClient, String tag) + protected void cleanupExtendedStuff(SecurityGroupClient securityGroupClient, KeyPairClient keyPairClient, String tag) throws InterruptedException { try { for (SecurityGroup group : securityGroupClient.describeSecurityGroupsInRegion(null)) diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceTest.java deleted file mode 100644 index 5e61476aea..0000000000 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * - * 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.ec2.compute; - -import static org.easymock.EasyMock.expect; -import static org.easymock.classextension.EasyMock.createMock; -import static org.easymock.classextension.EasyMock.replay; -import static org.easymock.classextension.EasyMock.verify; - -import java.util.Map; -import java.util.concurrent.ExecutorService; - -import javax.inject.Provider; - -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; -import org.jclouds.compute.strategy.DestroyNodeStrategy; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap; -import org.jclouds.compute.strategy.ListNodesStrategy; -import org.jclouds.compute.strategy.RebootNodeStrategy; -import org.jclouds.compute.strategy.ResumeNodeStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; -import org.jclouds.compute.strategy.SuspendNodeStrategy; -import org.jclouds.ec2.EC2Client; -import org.jclouds.ec2.services.PlacementGroupClient; -import org.testng.annotations.Test; - -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; - -/** - * @author Adrian Cole - */ -@Test(groups = "unit") -public class EC2ComputeServiceTest { - - @SuppressWarnings( { "unchecked" }) - public void testUnsupportedOperationOkForPlacementGroups() { - EC2Client client = createMock(EC2Client.class); - EC2ComputeService service = new EC2ComputeService(createMock(ComputeServiceContext.class), createMock(Map.class), - createMock(Supplier.class), createMock(Supplier.class), createMock(Supplier.class), - createMock(ListNodesStrategy.class), createMock(GetNodeMetadataStrategy.class), - createMock(RunNodesAndAddToSetStrategy.class), createMock(RebootNodeStrategy.class), - createMock(DestroyNodeStrategy.class), createMock(ResumeNodeStrategy.class), - createMock(SuspendNodeStrategy.class), createMock(Provider.class), createMock(Provider.class), - createMock(Predicate.class), createMock(Predicate.class), createMock(Predicate.class), - createMock(InitializeRunScriptOnNodeOrPlaceInBadMap.Factory.class), - createMock(Timeouts.class), createMock(ExecutorService.class), client, createMock(Map.class), - createMock(Map.class), createMock(Map.class), createMock(Predicate.class)); - - PlacementGroupClient placementClient = createMock(PlacementGroupClient.class); - - // setup expectations - expect(client.getPlacementGroupServices()).andReturn(placementClient).atLeastOnce(); - expect(placementClient.describePlacementGroupsInRegion("us-west-1", "jclouds#tag#us-west-1")).andThrow( - new UnsupportedOperationException()); - - // replay mocks - replay(client); - replay(placementClient); - // run - service.deletePlacementGroup("us-west-1", "tag"); - - // verify mocks - verify(client); - verify(placementClient); - - } -} diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java index b8246cc91c..5d17292245 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java @@ -76,14 +76,14 @@ public class RunningInstanceToNodeMetadataTest { RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet . of(), ImmutableSet. of(), ImmutableMap. of( - "node#us-east-1/i-9slweygo", creds)); + "node#us-east-1/i-0799056f", creds)); - RunningInstance server = firstInstanceFromResource("/describe_instances_nova.xml"); + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); - assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.TERMINATED).publicAddresses( - ImmutableSet. of()).privateAddresses(ImmutableSet.of("10.128.207.5")).tag("NOTAG#i-9slweygo") - .credentials(creds).imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-9slweygo") - .providerId("i-9slweygo").build()); + assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).publicAddresses( + ImmutableSet. of()).privateAddresses(ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f") + .credentials(creds).imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f") + .providerId("i-0799056f").build()); } @Test @@ -91,11 +91,11 @@ public class RunningInstanceToNodeMetadataTest { RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet . of(), ImmutableSet. of(), ImmutableMap. of()); - RunningInstance server = firstInstanceFromResource("/describe_instances_nova.xml"); + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); - assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.TERMINATED).publicAddresses( - ImmutableSet. of()).privateAddresses(ImmutableSet.of("10.128.207.5")).tag("NOTAG#i-9slweygo") - .imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-9slweygo").providerId("i-9slweygo").build()); + assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).publicAddresses( + ImmutableSet. of()).privateAddresses(ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f") + .imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f").providerId("i-0799056f").build()); } @Test @@ -103,11 +103,11 @@ public class RunningInstanceToNodeMetadataTest { RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet.of(provider), ImmutableSet. of(), ImmutableMap. of()); - RunningInstance server = firstInstanceFromResource("/describe_instances_nova.xml"); + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); - assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.TERMINATED).privateAddresses( - ImmutableSet.of("10.128.207.5")).tag("NOTAG#i-9slweygo").imageId("us-east-1/ami-82e4b5c7").id( - "us-east-1/i-9slweygo").providerId("i-9slweygo").location(provider).build()); + assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).privateAddresses( + ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7").id( + "us-east-1/i-0799056f").providerId("i-0799056f").location(provider).build()); } @Test @@ -115,14 +115,14 @@ public class RunningInstanceToNodeMetadataTest { RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet.of(provider), EC2ImageParserTest.convertImages("/amzn_images.xml"), ImmutableMap. of()); - RunningInstance server = firstInstanceFromResource("/describe_instances_nova.xml"); + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); - assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.TERMINATED).privateAddresses( - ImmutableSet.of("10.128.207.5")).tag("NOTAG#i-9slweygo").imageId("us-east-1/ami-82e4b5c7") + assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).privateAddresses( + ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7") .operatingSystem( new OperatingSystemBuilder().family(OsFamily.UNRECOGNIZED).version("").arch("paravirtual") .description("137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()).id( - "us-east-1/i-9slweygo").providerId("i-9slweygo").location(provider).build()); + "us-east-1/i-0799056f").providerId("i-0799056f").location(provider).build()); } @Test @@ -131,14 +131,14 @@ public class RunningInstanceToNodeMetadataTest { .of(provider), EC2ImageParserTest.convertImages("/amzn_images.xml"), ImmutableMap . of()); - RunningInstance server = firstInstanceFromResource("/describe_instances_nova.xml"); + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); - assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.TERMINATED).privateAddresses( - ImmutableSet.of("10.128.207.5")).tag("NOTAG#i-9slweygo").imageId("us-east-1/ami-82e4b5c7").hardware( + assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).privateAddresses( + ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7").hardware( m1_small().build()).operatingSystem( new OperatingSystemBuilder().family(OsFamily.UNRECOGNIZED).version("").arch("paravirtual").description( - "137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()).id("us-east-1/i-9slweygo") - .providerId("i-9slweygo").location(provider).build()); + "137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()).id("us-east-1/i-0799056f") + .providerId("i-0799056f").location(provider).build()); } @Test @@ -160,11 +160,12 @@ public class RunningInstanceToNodeMetadataTest { .of(provider), ImmutableMap. of(), EC2ComputeServiceDependenciesModule.instanceToNodeState, instanceToImage); - RunningInstance server = firstInstanceFromResource("/describe_instances_nova.xml"); + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); - assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.TERMINATED).privateAddresses( - ImmutableSet.of("10.128.207.5")).tag("NOTAG#i-9slweygo").imageId("us-east-1/ami-82e4b5c7").id( - "us-east-1/i-9slweygo").providerId("i-9slweygo").hardware(m1_small().build()).location(provider).build()); + assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).privateAddresses( + ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag( + "NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f") + .providerId("i-0799056f").hardware(m1_small().build()).location(provider).build()); } protected RunningInstance firstInstanceFromResource(String resource) { diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/options/EC2TemplateOptionsTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/options/EC2TemplateOptionsTest.java index 070cf275ec..1de6ded869 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/options/EC2TemplateOptionsTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/options/EC2TemplateOptionsTest.java @@ -21,7 +21,6 @@ package org.jclouds.ec2.compute.options; import static org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.authorizePublicKey; import static org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.blockOnPort; -import static org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.enableMonitoring; import static org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.inboundPorts; import static org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.installPrivateKey; import static org.jclouds.ec2.compute.options.EC2TemplateOptions.Builder.keyPair; @@ -172,26 +171,6 @@ public class EC2TemplateOptionsTest { assert !options.shouldAutomaticallyCreateKeyPair(); } - @Test - public void testMonitoringEnabledDefault() { - EC2TemplateOptions options = new EC2TemplateOptions(); - assert !options.isMonitoringEnabled(); - } - - @Test - public void testMonitoringEnabled() { - EC2TemplateOptions options = new EC2TemplateOptions(); - options.enableMonitoring(); - assert options.isMonitoringEnabled(); - } - - @Test - public void testEnableMonitoringStatic() { - EC2TemplateOptions options = enableMonitoring(); - assertEquals(options.getKeyPair(), null); - assert options.isMonitoringEnabled(); - } - // superclass tests @Test(expectedExceptions = IllegalArgumentException.class) public void testinstallPrivateKeyBadFormat() { diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java new file mode 100644 index 0000000000..5b20782e9a --- /dev/null +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java @@ -0,0 +1,442 @@ +/** + * + * 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.ec2.compute.strategy; + +import static org.easymock.EasyMock.expect; +import static org.easymock.classextension.EasyMock.createMock; +import static org.easymock.classextension.EasyMock.replay; +import static org.easymock.classextension.EasyMock.verify; +import static org.testng.Assert.assertEquals; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Set; + +import javax.inject.Provider; + +import org.jclouds.aws.domain.Region; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.ec2.compute.domain.EC2HardwareBuilder; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules; +import org.jclouds.ec2.compute.functions.CreateSecurityGroupIfNeeded; +import org.jclouds.ec2.compute.functions.CreateUniqueKeyPair; +import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.ec2.domain.BlockDeviceMapping; +import org.jclouds.ec2.domain.KeyPair; +import org.jclouds.ec2.options.RunInstancesOptions; +import org.jclouds.encryption.internal.Base64; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit") +public class CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptionsTest { + + private static final Provider OPTIONS_PROVIDER = new javax.inject.Provider() { + + @Override + public RunInstancesOptions get() { + return new RunInstancesOptions(); + } + + }; + + public void testExecuteWithDefaultOptionsEC2() throws SecurityException, NoSuchMethodException { + // setup constants + String region = Region.AP_SOUTHEAST_1; + String tag = "tag"; + Hardware size = EC2HardwareBuilder.m1_small().build(); + String systemGeneratedKeyPairName = "systemGeneratedKeyPair"; + String generatedGroup = "group"; + Set generatedGroups = ImmutableSet.of(generatedGroup); + + // create mocks + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock( + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class, new Method[] { + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getOptionsProvider"), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getSecurityGroupsForTagAndOptions", String.class, String.class, + TemplateOptions.class) }); + + EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + Template template = createMock(Template.class); + + // setup expectations + expect(strategy.getOptionsProvider()).andReturn(OPTIONS_PROVIDER); + expect(template.getHardware()).andReturn(size).atLeastOnce(); + expect(template.getOptions()).andReturn(options).atLeastOnce(); + expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet. of()).atLeastOnce(); + expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options)).andReturn( + systemGeneratedKeyPairName); + expect(strategy.getSecurityGroupsForTagAndOptions(region, tag, options)).andReturn(generatedGroups); + expect(options.getUserData()).andReturn(null); + + // replay mocks + replay(options); + replay(template); + replay(strategy); + + // run + RunInstancesOptions customize = strategy.execute(region, tag, template); + assertEquals(customize.buildQueryParameters(), ImmutableMultimap. of()); + assertEquals(customize.buildFormParameters().entries(), ImmutableMultimap. of("InstanceType", + size.getProviderId(), "SecurityGroup.1", generatedGroup, "KeyName", systemGeneratedKeyPairName) + .entries()); + assertEquals(customize.buildMatrixParameters(), ImmutableMultimap. of()); + assertEquals(customize.buildRequestHeaders(), ImmutableMultimap. of()); + assertEquals(customize.buildStringPayload(), null); + + // verify mocks + verify(options); + verify(template); + verify(strategy); + } + + public void testExecuteWithUserData() throws SecurityException, NoSuchMethodException { + // setup constants + String region = Region.AP_SOUTHEAST_1; + String tag = "tag"; + Hardware size = EC2HardwareBuilder.m1_small().build(); + String systemGeneratedKeyPairName = "systemGeneratedKeyPair"; + String generatedGroup = "group"; + Set generatedGroups = ImmutableSet.of(generatedGroup); + + // create mocks + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock( + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class, new Method[] { + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getOptionsProvider"), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getSecurityGroupsForTagAndOptions", String.class, String.class, + TemplateOptions.class) }); + + EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + Template template = createMock(Template.class); + + // setup expectations + expect(strategy.getOptionsProvider()).andReturn(OPTIONS_PROVIDER); + expect(template.getHardware()).andReturn(size).atLeastOnce(); + expect(template.getOptions()).andReturn(options).atLeastOnce(); + expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet. of()).atLeastOnce(); + expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options)).andReturn( + systemGeneratedKeyPairName); + expect(strategy.getSecurityGroupsForTagAndOptions(region, tag, options)).andReturn(generatedGroups); + expect(options.getUserData()).andReturn("hello".getBytes()); + + // replay mocks + replay(options); + replay(template); + replay(strategy); + + // run + RunInstancesOptions customize = strategy.execute(region, tag, template); + assertEquals(customize.buildQueryParameters(), ImmutableMultimap. of()); + assertEquals(customize.buildFormParameters().entries(), ImmutableMultimap. of("InstanceType", + size.getProviderId(), "SecurityGroup.1", "group", "KeyName", systemGeneratedKeyPairName, "UserData", + Base64.encodeBytes("hello".getBytes())).entries()); + assertEquals(customize.buildMatrixParameters(), ImmutableMultimap. of()); + assertEquals(customize.buildRequestHeaders(), ImmutableMultimap. of()); + assertEquals(customize.buildStringPayload(), null); + + // verify mocks + verify(options); + verify(template); + verify(strategy); + } + + public void testCreateNewKeyPairUnlessUserSpecifiedOtherwise_reusesKeyWhenToldTo() { + // setup constants + String region = Region.AP_SOUTHEAST_1; + String tag = "tag"; + String userSuppliedKeyPair = "myKeyPair"; + + // create mocks + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); + EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + KeyPair keyPair = createMock(KeyPair.class); + + // setup expectations + expect(options.getKeyPair()).andReturn(userSuppliedKeyPair); + + // replay mocks + replay(options); + replay(keyPair); + replayStrategy(strategy); + + // run + assertEquals(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options), userSuppliedKeyPair); + + // verify mocks + verify(options); + verify(keyPair); + verifyStrategy(strategy); + } + + public void testCreateNewKeyPairUnlessUserSpecifiedOtherwise_createsNewKeyPairAndReturnsItsNameByDefault() { + // setup constants + String region = Region.AP_SOUTHEAST_1; + String tag = "tag"; + String userSuppliedKeyPair = null; + boolean shouldAutomaticallyCreateKeyPair = true; + String systemGeneratedKeyPairName = "systemGeneratedKeyPair"; + + // create mocks + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); + EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + KeyPair keyPair = createMock(KeyPair.class); + + // setup expectations + expect(options.getKeyPair()).andReturn(userSuppliedKeyPair); + expect(options.shouldAutomaticallyCreateKeyPair()).andReturn(shouldAutomaticallyCreateKeyPair); + expect(strategy.createUniqueKeyPair.apply(new RegionAndName(region, tag))).andReturn(keyPair); + expect(keyPair.getKeyName()).andReturn(systemGeneratedKeyPairName).atLeastOnce(); + expect(strategy.credentialsMap.put(new RegionAndName(region, systemGeneratedKeyPairName), keyPair)).andReturn( + null); + + // replay mocks + replay(options); + replay(keyPair); + replayStrategy(strategy); + + // run + assertEquals(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options), + systemGeneratedKeyPairName); + + // verify mocks + verify(options); + verify(keyPair); + verifyStrategy(strategy); + } + + public void testCreateNewKeyPairUnlessUserSpecifiedOtherwise_doesntCreateAKeyPairAndReturnsNullWhenToldNotTo() { + // setup constants + String region = Region.AP_SOUTHEAST_1; + String tag = "tag"; + String userSuppliedKeyPair = null; + boolean shouldAutomaticallyCreateKeyPair = false; // here's the important + // part! + + // create mocks + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); + EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + KeyPair keyPair = createMock(KeyPair.class); + + // setup expectations + expect(options.getKeyPair()).andReturn(userSuppliedKeyPair); + expect(options.shouldAutomaticallyCreateKeyPair()).andReturn(shouldAutomaticallyCreateKeyPair); + + // replay mocks + replay(options); + replay(keyPair); + replayStrategy(strategy); + + // run + assertEquals(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options), null); + + // verify mocks + verify(options); + verify(keyPair); + verifyStrategy(strategy); + } + + public void testGetSecurityGroupsForTagAndOptions_createsNewGroupByDefaultWhenNoPortsAreSpecifiedWhenDoesntExist() { + // setup constants + String region = Region.AP_SOUTHEAST_1; + String tag = "tag"; + String generatedMarkerGroup = "jclouds#tag#" + Region.AP_SOUTHEAST_1; + Set groupIds = ImmutableSet. of(); + int[] ports = new int[] {}; + boolean shouldAuthorizeSelf = true; + boolean groupExisted = false; + Set returnVal = ImmutableSet. of(generatedMarkerGroup); + + // create mocks + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); + EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + + // setup expectations + expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); + expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); + RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, + ports, shouldAuthorizeSelf); + expect(strategy.securityGroupMap.containsKey(regionNameAndIngressRules)).andReturn(groupExisted); + expect(strategy.createSecurityGroupIfNeeded.apply(regionNameAndIngressRules)).andReturn(generatedMarkerGroup); + expect(strategy.securityGroupMap.put(regionNameAndIngressRules, generatedMarkerGroup)).andReturn(null); + + // replay mocks + replay(options); + replayStrategy(strategy); + + // run + assertEquals(strategy.getSecurityGroupsForTagAndOptions(region, tag, options), returnVal); + + // verify mocks + verify(options); + verifyStrategy(strategy); + } + + public void testGetSecurityGroupsForTagAndOptions_createsNewGroupByDefaultWhenPortsAreSpecifiedWhenDoesntExist() { + // setup constants + String region = Region.AP_SOUTHEAST_1; + String tag = "tag"; + String generatedMarkerGroup = "jclouds#tag#" + Region.AP_SOUTHEAST_1; + Set groupIds = ImmutableSet. of(); + int[] ports = new int[] { 22, 80 }; + boolean shouldAuthorizeSelf = true; + boolean groupExisted = false; + Set returnVal = ImmutableSet. of(generatedMarkerGroup); + + // create mocks + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); + EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + + // setup expectations + expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); + expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); + RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, + ports, shouldAuthorizeSelf); + expect(strategy.securityGroupMap.containsKey(regionNameAndIngressRules)).andReturn(groupExisted); + expect(strategy.createSecurityGroupIfNeeded.apply(regionNameAndIngressRules)).andReturn(generatedMarkerGroup); + expect(strategy.securityGroupMap.put(regionNameAndIngressRules, generatedMarkerGroup)).andReturn(null); + + // replay mocks + replay(options); + replayStrategy(strategy); + + // run + assertEquals(strategy.getSecurityGroupsForTagAndOptions(region, tag, options), returnVal); + + // verify mocks + verify(options); + verifyStrategy(strategy); + } + + public void testGetSecurityGroupsForTagAndOptions_reusesGroupByDefaultWhenNoPortsAreSpecifiedWhenDoesExist() { + // setup constants + String region = Region.AP_SOUTHEAST_1; + String tag = "tag"; + String generatedMarkerGroup = "jclouds#tag#" + Region.AP_SOUTHEAST_1; + Set groupIds = ImmutableSet. of(); + int[] ports = new int[] {}; + boolean shouldAuthorizeSelf = true; + boolean groupExisted = true; + Set returnVal = ImmutableSet. of(generatedMarkerGroup); + + // create mocks + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); + EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + + // setup expectations + expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); + expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); + RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, + ports, shouldAuthorizeSelf); + expect(strategy.securityGroupMap.containsKey(regionNameAndIngressRules)).andReturn(groupExisted); + + // replay mocks + replay(options); + replayStrategy(strategy); + + // run + assertEquals(strategy.getSecurityGroupsForTagAndOptions(region, tag, options), returnVal); + + // verify mocks + verify(options); + verifyStrategy(strategy); + } + + public void testGetSecurityGroupsForTagAndOptions_reusesGroupByDefaultWhenNoPortsAreSpecifiedWhenDoesExistAndAcceptsUserSuppliedGroups() { + // setup constants + String region = Region.AP_SOUTHEAST_1; + String tag = "tag"; + String generatedMarkerGroup = "jclouds#tag#" + Region.AP_SOUTHEAST_1; + Set groupIds = ImmutableSet. of("group1", "group2"); + int[] ports = new int[] {}; + boolean shouldAuthorizeSelf = true; + boolean groupExisted = true; + Set returnVal = ImmutableSet. of(generatedMarkerGroup, "group1", "group2"); + + // create mocks + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); + EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + + // setup expectations + expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); + RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, + ports, shouldAuthorizeSelf); // note + // this + // works + // since + // there's + // no equals on portsq + expect(strategy.securityGroupMap.containsKey(regionNameAndIngressRules)).andReturn(groupExisted); + + // replay mocks + replay(options); + replayStrategy(strategy); + + // run + assertEquals(strategy.getSecurityGroupsForTagAndOptions(region, tag, options), returnVal); + + // verify mocks + verify(options); + verifyStrategy(strategy); + } + + private void verifyStrategy(CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy) { + verify(strategy.credentialsMap); + verify(strategy.securityGroupMap); + verify(strategy.createUniqueKeyPair); + verify(strategy.createSecurityGroupIfNeeded); + } + + @SuppressWarnings("unchecked") + private CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions setupStrategy() { + Map credentialsMap = createMock(Map.class); + Map securityGroupMap = createMock(Map.class); + CreateUniqueKeyPair createUniqueKeyPair = createMock(CreateUniqueKeyPair.class); + CreateSecurityGroupIfNeeded createSecurityGroupIfNeeded = createMock(CreateSecurityGroupIfNeeded.class); + + return new CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions(credentialsMap, securityGroupMap, + createUniqueKeyPair, createSecurityGroupIfNeeded, OPTIONS_PROVIDER); + } + + private void replayStrategy(CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions strategy) { + replay(strategy.credentialsMap); + replay(strategy.securityGroupMap); + replay(strategy.createUniqueKeyPair); + replay(strategy.createSecurityGroupIfNeeded); + } + +} diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java index f584ed933d..60e98f350f 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java @@ -127,7 +127,6 @@ public class EC2RunNodesAndAddToSetStrategyTest { expect(strategy.instancePresent.apply(instance)).andReturn(true); expect(input.template.getOptions()).andReturn(input.options).atLeastOnce(); - expect(input.options.isMonitoringEnabled()).andReturn(false); expect(strategy.runningInstanceToNodeMetadata.apply(instance)).andReturn(nodeMetadata); expect( @@ -212,7 +211,7 @@ public class EC2RunNodesAndAddToSetStrategyTest { @SuppressWarnings("unchecked") private EC2RunNodesAndAddToSetStrategy setupStrategy() { EC2Client client = createMock(EC2Client.class); - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize = createMock(CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class); + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize = createMock(CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class); Predicate instanceStateRunning = createMock(Predicate.class); RunningInstanceToNodeMetadata runningInstanceToNodeMetadata = createMock(RunningInstanceToNodeMetadata.class); Function instanceToCredentials = createMock(Function.class); diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/options/RunInstancesOptionsTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/options/RunInstancesOptionsTest.java index e94200e161..86671e087d 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/options/RunInstancesOptionsTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/options/RunInstancesOptionsTest.java @@ -20,14 +20,12 @@ package org.jclouds.ec2.options; import static org.jclouds.ec2.options.RunInstancesOptions.Builder.asType; -import static org.jclouds.ec2.options.RunInstancesOptions.Builder.enableMonitoring; +import static org.jclouds.ec2.options.RunInstancesOptions.Builder.withBlockDeviceMappings; import static org.jclouds.ec2.options.RunInstancesOptions.Builder.withKernelId; import static org.jclouds.ec2.options.RunInstancesOptions.Builder.withKeyName; import static org.jclouds.ec2.options.RunInstancesOptions.Builder.withRamdisk; import static org.jclouds.ec2.options.RunInstancesOptions.Builder.withSecurityGroup; -import static org.jclouds.ec2.options.RunInstancesOptions.Builder.withSubnetId; import static org.jclouds.ec2.options.RunInstancesOptions.Builder.withUserData; -import static org.jclouds.ec2.options.RunInstancesOptions.Builder.withBlockDeviceMappings; import static org.testng.Assert.assertEquals; import java.util.Collections; @@ -183,49 +181,6 @@ public class RunInstancesOptionsTest { withKernelId(null); } - @Test - public void testWithMonitoringEnabled() { - RunInstancesOptions options = new RunInstancesOptions(); - options.enableMonitoring(); - assertEquals(options.buildFormParameters().get("Monitoring.Enabled"), Collections.singletonList("true")); - } - - @Test - public void testNullWithMonitoringEnabled() { - RunInstancesOptions options = new RunInstancesOptions(); - assertEquals(options.buildFormParameters().get("Monitoring.Enabled"), Collections.EMPTY_LIST); - } - - @Test - public void testWithMonitoringEnabledStatic() { - RunInstancesOptions options = enableMonitoring(); - assertEquals(options.buildFormParameters().get("Monitoring.Enabled"), Collections.singletonList("true")); - } - - @Test - public void testWithSubnetId() { - RunInstancesOptions options = new RunInstancesOptions(); - options.withSubnetId("test"); - assertEquals(options.buildFormParameters().get("SubnetId"), Collections.singletonList("test")); - } - - @Test - public void testNullWithSubnetId() { - RunInstancesOptions options = new RunInstancesOptions(); - assertEquals(options.buildFormParameters().get("SubnetId"), Collections.EMPTY_LIST); - } - - @Test - public void testWithSubnetIdStatic() { - RunInstancesOptions options = withSubnetId("test"); - assertEquals(options.buildFormParameters().get("SubnetId"), Collections.singletonList("test")); - } - - @Test(expectedExceptions = NullPointerException.class) - public void testWithSubnetIdNPE() { - withSubnetId(null); - } - @Test public void testWithRamdisk() { RunInstancesOptions options = new RunInstancesOptions(); @@ -255,17 +210,20 @@ public class RunInstancesOptionsTest { RunInstancesOptions options = new RunInstancesOptions(); assertEquals(options.buildFormParameters().get("BlockDeviceMapping.VirtualName"), Collections.EMPTY_LIST); } - + @Test public void testWithBlockDeviceMapping() { RunInstancesOptions options = new RunInstancesOptions(); BlockDeviceMapping mapping = new BlockDeviceMapping("/dev/sda1", null, null, 120, null, true); - Set mappings = new HashSet(); + Set mappings = new HashSet(); mappings.add(mapping); options.withBlockDeviceMappings(mappings); - assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.DeviceName"), Collections.singletonList("/dev/sda1")); - assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.VolumeSize"), Collections.singletonList("120")); - assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.DeleteOnTermination"), Collections.singletonList("true")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.DeviceName"), Collections + .singletonList("/dev/sda1")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.VolumeSize"), Collections + .singletonList("120")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.DeleteOnTermination"), Collections + .singletonList("true")); } @Test @@ -277,17 +235,20 @@ public class RunInstancesOptionsTest { @Test public void testWithBlockDeviceMappingStatic() { BlockDeviceMapping mapping = new BlockDeviceMapping("/dev/sda1", null, null, 120, null, true); - Set mappings = new HashSet(); + Set mappings = new HashSet(); mappings.add(mapping); RunInstancesOptions options = withBlockDeviceMappings(mappings); - assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.DeviceName"), Collections.singletonList("/dev/sda1")); - assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.VolumeSize"), Collections.singletonList("120")); - assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.DeleteOnTermination"), Collections.singletonList("true")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.DeviceName"), Collections + .singletonList("/dev/sda1")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.VolumeSize"), Collections + .singletonList("120")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.DeleteOnTermination"), Collections + .singletonList("true")); } @Test(expectedExceptions = NullPointerException.class) public void testWithBlockDeviceMappingNPE() { - withBlockDeviceMappings(null); + withBlockDeviceMappings(null); } } diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/services/AMIAsyncClientTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/services/AMIAsyncClientTest.java index 5d5afa3766..d63ca92ec9 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/services/AMIAsyncClientTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/services/AMIAsyncClientTest.java @@ -33,7 +33,6 @@ import org.jclouds.ec2.xml.BlockDeviceMappingHandler; import org.jclouds.ec2.xml.DescribeImagesResponseHandler; import org.jclouds.ec2.xml.ImageIdHandler; import org.jclouds.ec2.xml.PermissionHandler; -import org.jclouds.ec2.xml.ProductCodesHandler; import org.jclouds.http.HttpRequest; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ReleasePayloadAndReturn; @@ -222,23 +221,6 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest { checkFilters(request); } - public void testGetProductCodesForImage() throws SecurityException, NoSuchMethodException, IOException { - Method method = AMIAsyncClient.class.getMethod("getProductCodesForImageInRegion", String.class, String.class); - HttpRequest request = processor.createRequest(method, null, "imageId"); - - assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); - assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); - assertPayloadEquals(request, - "Version=2010-06-15&Action=DescribeImageAttribute&Attribute=productCodes&ImageId=imageId", - "application/x-www-form-urlencoded", false); - - assertResponseParserClassEquals(method, request, ParseSax.class); - assertSaxResponseParserClassEquals(method, ProductCodesHandler.class); - assertExceptionParserClassEquals(method, null); - - checkFilters(request); - } - public void testGetBlockDeviceMappingsForImage() throws SecurityException, NoSuchMethodException, IOException { Method method = AMIAsyncClient.class.getMethod("getBlockDeviceMappingsForImageInRegion", String.class, String.class); @@ -335,44 +317,6 @@ public class AMIAsyncClientTest extends BaseEC2AsyncClientTest { checkFilters(request); } - public void testAddProductCodesToImage() throws SecurityException, NoSuchMethodException, IOException { - Method method = AMIAsyncClient.class.getMethod("addProductCodesToImageInRegion", String.class, Iterable.class, - String.class); - HttpRequest request = processor.createRequest(method, null, ImmutableList.of("code1", "code2"), "imageId"); - - assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); - assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); - assertPayloadEquals( - request, - "Version=2010-06-15&Action=ModifyImageAttribute&OperationType=add&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2", - "application/x-www-form-urlencoded", false); - - assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); - assertSaxResponseParserClassEquals(method, null); - assertExceptionParserClassEquals(method, null); - - checkFilters(request); - } - - public void testRemoveProductCodesFromImage() throws SecurityException, NoSuchMethodException, IOException { - Method method = AMIAsyncClient.class.getMethod("removeProductCodesFromImageInRegion", String.class, - Iterable.class, String.class); - HttpRequest request = processor.createRequest(method, null, ImmutableList.of("code1", "code2"), "imageId"); - - assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); - assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); - assertPayloadEquals( - request, - "Version=2010-06-15&Action=ModifyImageAttribute&OperationType=remove&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2", - "application/x-www-form-urlencoded", false); - - assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); - assertSaxResponseParserClassEquals(method, null); - assertExceptionParserClassEquals(method, null); - - checkFilters(request); - } - @Override protected TypeLiteral> createTypeLiteral() { return new TypeLiteral>() { diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/services/AMIClientLiveTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/services/AMIClientLiveTest.java index 4703aadc0c..7e6a7208a8 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/services/AMIClientLiveTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/services/AMIClientLiveTest.java @@ -37,8 +37,8 @@ import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.ec2.EC2AsyncClient; import org.jclouds.ec2.EC2Client; import org.jclouds.ec2.domain.Image; -import org.jclouds.ec2.domain.Image.ImageType; import org.jclouds.ec2.domain.RootDeviceType; +import org.jclouds.ec2.domain.Image.ImageType; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; import org.testng.annotations.AfterTest; @@ -101,8 +101,8 @@ public class AMIClientLiveTest { 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().getAMIServices(); } @@ -223,10 +223,6 @@ public class AMIClientLiveTest { System.out.println(client.getLaunchPermissionForImageInRegion(null, imageId)); } - public void testGetProductCodesForImage() { - System.out.println(client.getProductCodesForImageInRegion(null, imageId)); - } - @Test(enabled = false) // awaiting ebs support public void testGetBlockDeviceMappingsForImage() { diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/services/BaseEC2AsyncClientTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/services/BaseEC2AsyncClientTest.java index f9eff08931..9aec3ddb74 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/services/BaseEC2AsyncClientTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/services/BaseEC2AsyncClientTest.java @@ -29,6 +29,8 @@ import java.util.Properties; import org.jclouds.aws.domain.Region; import org.jclouds.aws.filters.FormSigner; import org.jclouds.date.DateService; +import org.jclouds.ec2.EC2AsyncClient; +import org.jclouds.ec2.EC2Client; import org.jclouds.ec2.config.EC2RestClientModule; import org.jclouds.ec2.domain.AvailabilityZone; import org.jclouds.http.HttpRequest; @@ -50,7 +52,11 @@ import com.google.inject.Module; public abstract class BaseEC2AsyncClientTest extends RestClientTest { @RequiresHttp @ConfiguresRestClient - protected static class StubEC2RestClientModule extends EC2RestClientModule { + protected static class StubEC2RestClientModule extends EC2RestClientModule { + + public StubEC2RestClientModule() { + super(EC2Client.class, EC2AsyncClient.class, DELEGATE_MAP); + } @Override protected String provideTimeStamp(DateService dateService, int expiration) { diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/services/InstanceAsyncClientTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/services/InstanceAsyncClientTest.java index 6fdbbf9a5f..3088a7ffd7 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/services/InstanceAsyncClientTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/services/InstanceAsyncClientTest.java @@ -64,7 +64,7 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest mapping = Maps.newLinkedHashMap(); mapping.put("/dev/sda1", new BlockDevice("vol-test1", true)); @@ -478,14 +476,14 @@ public class InstanceAsyncClientTest extends BaseEC2AsyncClientTest> contents = Sets.newLinkedHashSet(); - - contents.add(new Reservation(defaultRegion, ImmutableSet.of("adriancole.ec2ingress"), - ImmutableSet.of(new RunningInstance(defaultRegion, ImmutableSet.of("adriancole.ec2ingress"), "0", - "ec2-174-129-81-68.compute-1.amazonaws.com", "ami-1fd73376", "i-0799056f", InstanceState.RUNNING, - InstanceType.M1_SMALL, "174.129.81.68", "aki-a71cf9ce", "adriancole.ec21", dateService - .iso8601DateParse("2009-11-09T03:00:34.000Z"), MonitoringState.DISABLED, - AvailabilityZone.US_EAST_1C, null, "paravirtual", null, "ip-10-243-42-70.ec2.internal", - "10.243.42.70", ImmutableSet. of(), "ari-a51cf9cc", null, null, null, null, - RootDeviceType.INSTANCE_STORE, null, ImmutableMap. of())), "993194456877", - null, "r-a3c508cb")); + Set> contents = ImmutableSet.of(new Reservation(defaultRegion, + ImmutableSet.of("adriancole.ec2ingress"), ImmutableSet.of(new RunningInstance.Builder().region( + defaultRegion).groupId("adriancole.ec2ingress").amiLaunchIndex("0").dnsName( + "ec2-174-129-81-68.compute-1.amazonaws.com").imageId("ami-82e4b5c7").instanceId("i-0799056f") + .instanceState(InstanceState.RUNNING).instanceType(InstanceType.M1_SMALL).ipAddress( + "174.129.81.68").kernelId("aki-a71cf9ce").keyName("adriancole.ec21").launchTime( + dateService.iso8601DateParse("2009-11-09T03:00:34.000Z")) + // MonitoringState.DISABLED, + .availabilityZone(AvailabilityZone.US_EAST_1C).virtualizationType("paravirtual") + .privateDnsName("ip-10-243-42-70.ec2.internal").privateIpAddress("10.243.42.70").ramdiskId( + "ari-a51cf9cc").rootDeviceType(RootDeviceType.INSTANCE_STORE).build()), + "993194456877", null, "r-a3c508cb")); Set> result = parseRunningInstances("/describe_instances_running.xml"); @@ -86,82 +85,54 @@ public class DescribeInstancesResponseHandlerTest extends BaseEC2HandlerTest { } public void testApplyInputStream() { - - Set> contents = Sets.newLinkedHashSet(); - - contents.add(new Reservation(defaultRegion, ImmutableSet.of("default"), ImmutableSet.of( - new RunningInstance(defaultRegion, ImmutableSet.of("default"), "23", - "ec2-72-44-33-4.compute-1.amazonaws.com", "ami-6ea54007", "i-28a64341", InstanceState.RUNNING, - InstanceType.M1_LARGE, (String) null, "aki-ba3adfd3", "example-key-name", dateService - .iso8601DateParse("2007-08-07T11:54:42.000Z"), MonitoringState.DISABLED, - AvailabilityZone.US_EAST_1B, null, "paravirtual", null, "10-251-50-132.ec2.internal", null, - ImmutableSet.of("774F4FF8"), "ari-badbad00", null, null, null, null, RootDeviceType.INSTANCE_STORE, - null, ImmutableMap. of()), - new RunningInstance(defaultRegion, ImmutableSet.of("default"), "23", - "ec2-72-44-33-6.compute-1.amazonaws.com", "ami-6ea54007", "i-28a64435", InstanceState.RUNNING, - InstanceType.M1_LARGE, (String) null, "aki-ba3adfd3", "example-key-name", dateService - .iso8601DateParse("2007-08-07T11:54:42.000Z"), MonitoringState.DISABLED, - AvailabilityZone.US_EAST_1B, null, "paravirtual", null, "10-251-50-134.ec2.internal", null, - ImmutableSet.of("774F4FF8"), "ari-badbad00", null, null, null, null, RootDeviceType.INSTANCE_STORE, - null, ImmutableMap. of())), "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM", null, - "r-44a5402d")); + Set> contents = ImmutableSet.of(new Reservation(defaultRegion, + ImmutableSet.of("default"), ImmutableSet.of(new RunningInstance.Builder().region(defaultRegion).groupId( + "default").amiLaunchIndex("23").dnsName("ec2-72-44-33-4.compute-1.amazonaws.com").imageId( + "ami-6ea54007").instanceId("i-28a64341").instanceState(InstanceState.RUNNING).instanceType( + InstanceType.M1_LARGE).kernelId("aki-ba3adfd3").keyName("example-key-name").launchTime( + dateService.iso8601DateParse("2007-08-07T11:54:42.000Z")) + // MonitoringState.DISABLED, + .availabilityZone(AvailabilityZone.US_EAST_1B).virtualizationType("paravirtual") + .privateDnsName("10-251-50-132.ec2.internal")// product codes + // ImmutableSet.of("774F4FF8") + .ramdiskId("ari-badbad00").rootDeviceType(RootDeviceType.INSTANCE_STORE).build(), + new RunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("23") + .dnsName("ec2-72-44-33-6.compute-1.amazonaws.com").imageId("ami-6ea54007").instanceId( + "i-28a64435").instanceState(InstanceState.RUNNING).instanceType( + InstanceType.M1_LARGE).kernelId("aki-ba3adfd3").keyName("example-key-name") + .launchTime(dateService.iso8601DateParse("2007-08-07T11:54:42.000Z")) + // MonitoringState.DISABLED, + .availabilityZone(AvailabilityZone.US_EAST_1B).virtualizationType("paravirtual") + .privateDnsName("10-251-50-134.ec2.internal")// product codes + // ImmutableSet.of("774F4FF8") + .ramdiskId("ari-badbad00").rootDeviceType(RootDeviceType.INSTANCE_STORE).build()), + "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM", null, "r-44a5402d")); Set> result = parseRunningInstances("/describe_instances.xml"); assertEquals(result, contents); } - @Test(enabled = false) - // TODO not sure why equals fails - public void testApplyInputStreamEuc() { - - Set> contents = Sets.newLinkedHashSet(); - - contents.add(new Reservation(defaultRegion, ImmutableSet.of("default"), ImmutableSet - .of(new RunningInstance(defaultRegion, ImmutableSet.of("jclouds#euc"), "1", null, "emi-9ACB1363", - "i-3FFA0762", InstanceState.SHUTTING_DOWN, InstanceType.M1_LARGE, null, "eki-6CBD12F2", - "jclouds#euc-17", dateService.iso8601DateParse("2010-06-16T03:06:19.000Z"), MonitoringState.DISABLED, - "open", null, "paravirtual", null, "10.7.0.179", null, ImmutableSet. of(), "eri-A97113E4", - null, null, null, null, RootDeviceType.INSTANCE_STORE, null, ImmutableMap - . of())), "jclouds", null, "r-4D2A08AD")); - - Set> result = parseRunningInstances("/describe_instances_euc.xml"); - - assertEquals(result, contents); - } - - public void testApplyInputStreamNovaNoAvailabilityZone() { - Set> contents = Sets.newLinkedHashSet(); - - contents.add(new Reservation(defaultRegion, ImmutableSet.of("default"), ImmutableSet - .of(new RunningInstance(defaultRegion, ImmutableSet. of(), "0", null, "ami-82e4b5c7", "i-9slweygo", - InstanceState.TERMINATED, InstanceType.M1_SMALL, null, null, "nebulatanimislam", dateService - .iso8601SecondsDateParse("2010-09-09T18:09:42Z"), null, null, null, "paravirtual", null, null, - "10.128.207.5", ImmutableSet. of("None"), null, null, null, null, null, - RootDeviceType.INSTANCE_STORE, null, ImmutableMap. of())), "tislam1", null, - "r-opqeylmj")); - - Set> result = parseRunningInstances("/describe_instances_nova.xml"); - - assertEquals(result, contents); - } - public void testEBS() throws UnknownHostException { - Set> contents = Sets.newLinkedHashSet(); - - contents.add(new Reservation(defaultRegion, ImmutableSet.of("adriancole.ec2ebsingress"), - ImmutableSet.of(new RunningInstance(defaultRegion, ImmutableSet.of("adriancole.ec2ebsingress"), "0", - "ec2-75-101-203-146.compute-1.amazonaws.com", "ami-849875ed", "i-e564438d", InstanceState.RUNNING, - InstanceType.M1_SMALL, "75.101.203.146", "aki-a71cf9ce", "adriancole.ec2ebs1", dateService - .iso8601DateParse("2009-12-30T04:06:23.000Z"), MonitoringState.DISABLED, - AvailabilityZone.US_EAST_1B, "placement", "hvm", null, "domU-12-31-39-09-CE-53.compute-1.internal", - "10.210.209.157", ImmutableSet. of(), "ari-a51cf9cc", null, null, null, null, - RootDeviceType.EBS, "/dev/sda1", ImmutableMap. of( - "/dev/sda1", - new BlockDevice("vol-dc6ca8b5", Attachment.Status.ATTACHED, dateService - .iso8601DateParse("2009-12-30T04:06:29.000Z"), true)))), "993194456877", null, - "r-596dd731")); + Set> contents = ImmutableSet.of(new Reservation(defaultRegion, + ImmutableSet.of("adriancole.ec2ebsingress"), ImmutableSet.of(new RunningInstance.Builder().region( + defaultRegion).groupId("adriancole.ec2ebsingress").amiLaunchIndex("0").dnsName( + "ec2-75-101-203-146.compute-1.amazonaws.com").imageId("ami-849875ed").instanceId("i-e564438d") + .instanceState(InstanceState.RUNNING).instanceType(InstanceType.M1_SMALL).ipAddress( + "75.101.203.146").kernelId("aki-a71cf9ce") + .keyName("adriancole.ec2ebs1") + .launchTime(dateService.iso8601DateParse("2009-12-30T04:06:23.000Z")) + // MonitoringState.DISABLED + .availabilityZone(AvailabilityZone.US_EAST_1B) + // "placement" + .virtualizationType("hvm").privateDnsName("domU-12-31-39-09-CE-53.compute-1.internal") + .privateIpAddress("10.210.209.157").ramdiskId("ari-a51cf9cc") + .rootDeviceType(RootDeviceType.EBS).rootDeviceName("/dev/sda1").device( + "/dev/sda1", + new BlockDevice("vol-dc6ca8b5", Attachment.Status.ATTACHED, dateService + .iso8601DateParse("2009-12-30T04:06:29.000Z"), true)).build()), + "993194456877", null, "r-596dd731")); Set> result = parseRunningInstances("/describe_instances_ebs.xml"); @@ -178,7 +149,8 @@ public class DescribeInstancesResponseHandlerTest extends BaseEC2HandlerTest { }); ParseSax>> parser = (ParseSax>>) injector - .getInstance(ParseSax.Factory.class).create(injector.getInstance(DescribeInstancesResponseHandler.class)); + .getInstance(ParseSax.Factory.class) + .create(injector.getInstance(DescribeInstancesResponseHandler.class)); return parser; } diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/xml/RunInstancesResponseHandlerTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/xml/RunInstancesResponseHandlerTest.java index 9988a14e38..a35063aaf5 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/xml/RunInstancesResponseHandlerTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/xml/RunInstancesResponseHandlerTest.java @@ -26,31 +26,26 @@ import static org.testng.Assert.assertEquals; import java.io.InputStream; +import org.jclouds.date.DateService; import org.jclouds.ec2.domain.AvailabilityZone; -import org.jclouds.ec2.domain.BlockDevice; import org.jclouds.ec2.domain.InstanceState; import org.jclouds.ec2.domain.InstanceType; -import org.jclouds.ec2.domain.MonitoringState; import org.jclouds.ec2.domain.Reservation; -import org.jclouds.ec2.domain.RootDeviceType; import org.jclouds.ec2.domain.RunningInstance; -import org.jclouds.date.DateService; import org.jclouds.http.functions.ParseSax; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; /** * Tests behavior of {@code RunInstancesResponseHandler} * * @author Adrian Cole */ -//NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire @Test(groups = "unit", testName = "RunInstancesResponseHandlerTest") public class RunInstancesResponseHandlerTest extends BaseEC2HandlerTest { @@ -69,24 +64,27 @@ public class RunInstancesResponseHandlerTest extends BaseEC2HandlerTest { InputStream is = getClass().getResourceAsStream("/run_instances.xml"); Reservation expected = new Reservation(defaultRegion, ImmutableSet - .of("default"), ImmutableSet.of(new RunningInstance(defaultRegion, ImmutableSet.of("default"), "0", - null, "ami-60a54009", "i-2ba64342", InstanceState.PENDING, InstanceType.M1_SMALL, (String) null, null, - "example-key-name", dateService.iso8601DateParse("2007-08-07T11:51:50.000Z"), MonitoringState.ENABLED, - AvailabilityZone.US_EAST_1B, null, "paravirtual", null, (String) null, null, Sets - . newLinkedHashSet(), null, null, null, null, null, RootDeviceType.INSTANCE_STORE, - null, ImmutableMap. of()), new RunningInstance(defaultRegion, ImmutableSet - .of("default"), "1", null, "ami-60a54009", "i-2bc64242", InstanceState.PENDING, InstanceType.M1_SMALL, - (String) null, null, "example-key-name", dateService.iso8601DateParse("2007-08-07T11:51:50.000Z"), - MonitoringState.ENABLED, AvailabilityZone.US_EAST_1B, null, "paravirtual", null, (String) null, null, - Sets. newLinkedHashSet(), null, null, null, null, null, RootDeviceType.INSTANCE_STORE, null, - ImmutableMap. of()), new RunningInstance(defaultRegion, ImmutableSet - .of("default"), "2", null, "ami-60a54009", "i-2be64332", InstanceState.PENDING, InstanceType.M1_SMALL, - (String) null, null, "example-key-name", dateService.iso8601DateParse("2007-08-07T11:51:50.000Z"), - MonitoringState.ENABLED, AvailabilityZone.US_EAST_1B, null, "paravirtual", null, (String) null, null, - Sets. newLinkedHashSet(), null, null, null, null, null, RootDeviceType.INSTANCE_STORE, null, - ImmutableMap. of()) + .of("default"), ImmutableSet.of( - ), "AIDADH4IGTRXXKCD", null, "r-47a5402e"); + new RunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("0") + .imageId("ami-60a54009").instanceId("i-2ba64342").instanceState(InstanceState.PENDING).instanceType( + InstanceType.M1_SMALL).keyName("example-key-name").launchTime( + dateService.iso8601DateParse("2007-08-07T11:51:50.000Z"))// MonitoringState.ENABLED, + .availabilityZone(AvailabilityZone.US_EAST_1B).build(), + + new RunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("1") + .imageId("ami-60a54009").instanceId("i-2bc64242").instanceState(InstanceState.PENDING).instanceType( + InstanceType.M1_SMALL).keyName("example-key-name").launchTime( + dateService.iso8601DateParse("2007-08-07T11:51:50.000Z"))// MonitoringState.ENABLED, + .availabilityZone(AvailabilityZone.US_EAST_1B).build(), + + new RunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("2") + .imageId("ami-60a54009").instanceId("i-2be64332").instanceState(InstanceState.PENDING).instanceType( + InstanceType.M1_SMALL).keyName("example-key-name").launchTime( + dateService.iso8601DateParse("2007-08-07T11:51:50.000Z"))// MonitoringState.ENABLED, + .availabilityZone(AvailabilityZone.US_EAST_1B).build()) + + , "AIDADH4IGTRXXKCD", null, "r-47a5402e"); RunInstancesResponseHandler handler = injector.getInstance(RunInstancesResponseHandler.class); addDefaultRegionToHandler(handler); @@ -96,7 +94,7 @@ public class RunInstancesResponseHandlerTest extends BaseEC2HandlerTest { private void addDefaultRegionToHandler(ParseSax.HandlerWithResult handler) { GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); - expect(request.getArgs()).andReturn(ImmutableList.of()).atLeastOnce(); + expect(request.getArgs()).andReturn(ImmutableList. of()).atLeastOnce(); replay(request); handler.setContext(request); } diff --git a/apis/ec2/src/test/resources/describe_instances_euc.xml b/apis/ec2/src/test/resources/describe_instances_euc.xml deleted file mode 100644 index 7ee16645a2..0000000000 --- a/apis/ec2/src/test/resources/describe_instances_euc.xml +++ /dev/null @@ -1,39 +0,0 @@ - - e323d0bd-48a2-401b-aeee-1cbf653bc6db - - - r-4D2A08AD - jclouds - - - jclouds#euc - - - - - i-3FFA0762 - emi-9ACB1363 - - 32 - shutting-down - - 10.7.0.179 - 0.0.0.0 - jclouds#euc-17 - 1 - - m1.large - 2010-06-16T03:06:19Z - - open - - eki-6CBD12F2 - eri-A97113E4 - - false - - - - - - \ No newline at end of file diff --git a/apis/ec2/src/test/resources/describe_instances_nova.xml b/apis/ec2/src/test/resources/describe_instances_nova.xml deleted file mode 100644 index f38353fc12..0000000000 --- a/apis/ec2/src/test/resources/describe_instances_nova.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - G7PDD1DNVLO7DZS6AFZH - - - - - 10.128.207.5 - 0 - m1.small - - 2010-09-09T18:09:42Z - i-9slweygo - ami-82e4b5c7 - - 1 - shutdown - - nebulatanimislam - 10.128.207.5 - - - None - - - - - r-opqeylmj - - - default - - - tislam1 - - - \ No newline at end of file diff --git a/apis/ec2/src/test/resources/describe_instances_running.xml b/apis/ec2/src/test/resources/describe_instances_running.xml index 41332fd38a..d3813d4356 100644 --- a/apis/ec2/src/test/resources/describe_instances_running.xml +++ b/apis/ec2/src/test/resources/describe_instances_running.xml @@ -12,7 +12,7 @@ i-0799056f - ami-1fd73376 + ami-82e4b5c7 16 running diff --git a/apis/eucalyptus/src/main/java/org/jclouds/eucalyptus/EucalyptusPropertiesBuilder.java b/apis/eucalyptus/src/main/java/org/jclouds/eucalyptus/EucalyptusPropertiesBuilder.java index d8048aa959..d9de27819c 100644 --- a/apis/eucalyptus/src/main/java/org/jclouds/eucalyptus/EucalyptusPropertiesBuilder.java +++ b/apis/eucalyptus/src/main/java/org/jclouds/eucalyptus/EucalyptusPropertiesBuilder.java @@ -22,7 +22,6 @@ package org.jclouds.eucalyptus; import static org.jclouds.Constants.PROPERTY_ENDPOINT; import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_PORT_OPEN; import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; -import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; import java.util.Properties; @@ -38,12 +37,9 @@ public class EucalyptusPropertiesBuilder extends EC2PropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_ENDPOINT, - "http://173.205.188.130:8773/services/Eucalyptus"); + properties.setProperty(PROPERTY_ENDPOINT, "http://173.205.188.130:8773/services/Eucalyptus"); properties.setProperty(PROPERTY_REGIONS, "Eucalyptus"); properties.setProperty(PROPERTY_EC2_AMI_OWNERS, "admin"); - // amis that work with the cluster instances - properties.setProperty(PROPERTY_EC2_CC_AMIs, ""); properties.setProperty(PROPERTY_TIMEOUT_PORT_OPEN, 5 * 60 * 1000 + ""); return properties; diff --git a/apis/eucalyptus/src/test/java/org/jclouds/eucalyptus/compute/EucalyptusComputeServiceLiveTest.java b/apis/eucalyptus/src/test/java/org/jclouds/eucalyptus/compute/EucalyptusComputeServiceLiveTest.java index 91ea635f07..48d600754d 100644 --- a/apis/eucalyptus/src/test/java/org/jclouds/eucalyptus/compute/EucalyptusComputeServiceLiveTest.java +++ b/apis/eucalyptus/src/test/java/org/jclouds/eucalyptus/compute/EucalyptusComputeServiceLiveTest.java @@ -25,6 +25,7 @@ import static org.testng.Assert.assertEquals; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; import org.jclouds.ec2.compute.EC2ComputeServiceLiveTest; +import org.jclouds.http.HttpResponseException; import org.testng.annotations.Test; /** @@ -60,4 +61,33 @@ public class EucalyptusComputeServiceLiveTest extends EC2ComputeServiceLiveTest assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } + @Override + @Test(enabled = true, dependsOnMethods = "testReboot") + public void testSuspendResume() throws Exception { + try { + super.testSuspendResume(); + assert false; + } catch (HttpResponseException e) { + // ebs backed not yet available + } + } + + @Override + @Test(enabled = true, dependsOnMethods = "testSuspendResume") + public void testListNodes() throws Exception { + super.testListNodes(); + } + + @Override + @Test(enabled = true, dependsOnMethods = "testSuspendResume") + public void testGetNodesWithDetails() throws Exception { + super.testGetNodesWithDetails(); + } + + @Override + @Test(enabled = true, dependsOnMethods = { "testListNodes", "testGetNodesWithDetails" }) + public void testDestroyNodes() { + super.testDestroyNodes(); + } + } diff --git a/common/aws/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java b/common/aws/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java index 3e1613b4fc..76c06390d7 100755 --- a/common/aws/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java +++ b/common/aws/src/main/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContent.java @@ -82,7 +82,7 @@ public class ParseAWSErrorFromXmlContent implements HttpErrorHandler { } } message = message != null ? message : String.format("%s -> %s", command.getCurrentRequest().getRequestLine(), - response.getStatusLine()); + response.getStatusLine()); exception = refineException(command, response, exception, error, message); } finally { releasePayload(response); @@ -91,33 +91,36 @@ public class ParseAWSErrorFromXmlContent implements HttpErrorHandler { } protected Exception refineException(HttpCommand command, HttpResponse response, Exception exception, AWSError error, - String message) { + String message) { switch (response.getStatusCode()) { - case 400: - if (error != null && error.getCode() != null && (error.getCode().equals("UnsupportedOperation"))) - exception = new UnsupportedOperationException(message, exception); - 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")) + case 400: + if (error != null && error.getCode() != null && (error.getCode().equals("UnsupportedOperation"))) + exception = new UnsupportedOperationException(message, exception); + 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") + | error.getCode().endsWith(".InUse"))) + || (message != null && (message.indexOf("already exists") != -1 || message.indexOf("is in use") != -1))) + exception = new IllegalStateException(message, exception); + else if (error != null && error.getCode() != null && error.getCode().equals("AuthFailure")) + exception = new AuthorizationException(message, exception); + else if (message != null + && (message.indexOf("Invalid id") != -1 || message.indexOf("Failed to bind") != -1)) + exception = new IllegalArgumentException(message, exception); + break; + case 401: + case 403: exception = new AuthorizationException(message, exception); - 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(message, exception); - break; - case 404: - if (!command.getCurrentRequest().getMethod().equals("DELETE")) { - exception = new ResourceNotFoundException(message, exception); - } - break; - case 409: - exception = new IllegalStateException(message, exception); + break; + case 404: + if (!command.getCurrentRequest().getMethod().equals("DELETE")) { + exception = new ResourceNotFoundException(message, exception); + } + break; + case 409: + exception = new IllegalStateException(message, exception); } return exception; } diff --git a/common/aws/src/test/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContentTest.java b/common/aws/src/test/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContentTest.java index 00fd23b35c..fee547ece9 100644 --- a/common/aws/src/test/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContentTest.java +++ b/common/aws/src/test/java/org/jclouds/aws/handlers/ParseAWSErrorFromXmlContentTest.java @@ -54,87 +54,106 @@ public class ParseAWSErrorFromXmlContentTest { @Test public void test400WithNotFoundSetsResourceNotFoundException() { assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "", - "Monster.NotFound", ResourceNotFoundException.class); + "Monster.NotFound", ResourceNotFoundException.class); + } + + @Test + public void test400WithInvalidIdIllegalArgumentException() { + assertCodeMakes("POST", URI.create("https://ec2.us-east-1.amazonaws.com"), 400, "HTTP/1.1 400", "", + "Invalid id: \"asdaasdsa\" (expecting \"ami-...\")", IllegalArgumentException.class); } @Test public void test400WithLoadBalancerNotFoundSetsResourceNotFoundException() { assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "", - "LoadBalancerNotFound", ResourceNotFoundException.class); + "LoadBalancerNotFound", ResourceNotFoundException.class); } @Test public void test400WithUnsupportedCodeMakesUnsupportedOperationException() { assertCodeMakes("POST", URI.create("https://ec2.us-west-1.amazonaws.com/"), 400, "", - "UnsupportedOperation", UnsupportedOperationException.class); + "UnsupportedOperation", UnsupportedOperationException.class); + } + + @Test + public void test400WithInUseCodeSetsIllegalStateException() { + assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "", + "InvalidPlacementGroup.InUse", IllegalStateException.class); } @Test public void test400WithUnknownSetsResourceNotFoundException() { assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "", - "InvalidPlacementGroup.Unknown", ResourceNotFoundException.class); + "InvalidPlacementGroup.Unknown", ResourceNotFoundException.class); } @Test public void test400WithIncorrectStateSetsIllegalStateException() { assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "", - "IncorrectState", IllegalStateException.class); + "IncorrectState", IllegalStateException.class); + } + + @Test + public void test400WithInUseSetsIllegalStateException() { + assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "", "text/plain", + "The placement group 'jclouds#adriancoleec2cccluster#us-east-1' is in use and may not be deleted.", + 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); + "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() { assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "Bad Request", "application/unknown", - "InvalidGroup.Duplicate", IllegalStateException.class); + "InvalidGroup.Duplicate", IllegalStateException.class); } @Test public void test400WithInvalidKeyPairGroupDuplicateIllegalStateException() { assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "Bad Request", "application/unknown", - "InvalidKeyPair.Duplicate", IllegalStateException.class); + "InvalidKeyPair.Duplicate", IllegalStateException.class); } @Test public void test400WithTextPlainIllegalArgumentException() { assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "Bad Request", "text/plain", - "Failure: 400 Bad Request\nFailed to bind the following fields\nMonitoring.Enabled = true\n\n\n", - IllegalArgumentException.class); + "Failure: 400 Bad Request\nFailed to bind the following fields\nMonitoring.Enabled = true\n\n\n", + IllegalArgumentException.class); } @Test public void test400WithGroupAlreadyExistsEucalyptusIllegalStateException() { assertCodeMakes( - "GET", - URI.create("https://amazonaws.com/foo"), - 400, - "", - "Groups\nError adding network group: group named jclouds#eucrun#Eucalyptus already exists\nError adding network group: group named jclouds#eucrun#Eucalyptus already existse0133975-3bc5-456d-9753-1d61b27e07e9", - IllegalStateException.class); + "GET", + URI.create("https://amazonaws.com/foo"), + 400, + "", + "Groups\nError adding network group: group named jclouds#eucrun#Eucalyptus already exists\nError adding network group: group named jclouds#eucrun#Eucalyptus already existse0133975-3bc5-456d-9753-1d61b27e07e9", + IllegalStateException.class); } @Test public void test400WithAuthFailureSetsAuthorizationException() { assertCodeMakes("GET", URI.create("https://amazonaws.com/foo"), 400, "", - "AuthFailure", AuthorizationException.class); + "AuthFailure", AuthorizationException.class); } private void assertCodeMakes(String method, URI uri, int statusCode, String message, String content, - Class expected) { + Class expected) { assertCodeMakes(method, uri, statusCode, message, "text/xml", content, expected); } private void assertCodeMakes(String method, URI uri, int statusCode, String message, String contentType, - String content, Class expected) { + String content, Class expected) { ParseAWSErrorFromXmlContent function = Guice.createInjector(new SaxParserModule(), new AbstractModule() { @@ -149,7 +168,7 @@ public class ParseAWSErrorFromXmlContentTest { HttpCommand command = createMock(HttpCommand.class); HttpRequest request = new HttpRequest(method, uri); HttpResponse response = new HttpResponse(statusCode, message, Payloads.newInputStreamPayload(Strings2 - .toInputStream(content))); + .toInputStream(content))); response.getPayload().getContentMetadata().setContentType(contentType); expect(command.getCurrentRequest()).andReturn(request).atLeastOnce(); diff --git a/common/azure/src/test/java/org/jclouds/azure/storage/handlers/ParseAzureErrorFromXmlContentTest.java b/common/azure/src/test/java/org/jclouds/azure/storage/handlers/ParseAzureErrorFromXmlContentTest.java index 052fab388e..d9ed86b50c 100644 --- a/common/azure/src/test/java/org/jclouds/azure/storage/handlers/ParseAzureErrorFromXmlContentTest.java +++ b/common/azure/src/test/java/org/jclouds/azure/storage/handlers/ParseAzureErrorFromXmlContentTest.java @@ -63,6 +63,7 @@ public class ParseAzureErrorFromXmlContentTest { "", IllegalArgumentException.class); } + @Test public void test412WithTextHtmlHttpResponseException() { assertCodeMakes( diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2AsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2AsyncClient.java new file mode 100644 index 0000000000..c556e487f7 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2AsyncClient.java @@ -0,0 +1,63 @@ +package org.jclouds.aws.ec2; + +/** + * + * 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. + * ==================================================================== + */ + +import org.jclouds.aws.ec2.services.AWSAMIAsyncClient; +import org.jclouds.aws.ec2.services.AWSInstanceAsyncClient; +import org.jclouds.aws.ec2.services.MonitoringAsyncClient; +import org.jclouds.aws.ec2.services.PlacementGroupAsyncClient; +import org.jclouds.ec2.EC2AsyncClient; +import org.jclouds.rest.annotations.Delegate; + +/** + * Provides asynchronous access to EC2 services. + * + * @author Adrian Cole + */ +public interface AWSEC2AsyncClient extends EC2AsyncClient { + public final static String VERSION = "2010-06-15"; + + /** + * {@inheritDoc} + */ + @Delegate + @Override + AWSInstanceAsyncClient getInstanceServices(); + + /** + * {@inheritDoc} + */ + @Delegate + @Override + AWSAMIAsyncClient getAMIServices(); + + /** + * Provides asynchronous access to PlacementGroup services. + */ + @Delegate + PlacementGroupAsyncClient getPlacementGroupServices(); + + /** + * Provides asynchronous access to Monitoring services. + */ + @Delegate + MonitoringAsyncClient getMonitoringServices(); + +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2Client.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2Client.java new file mode 100644 index 0000000000..8bd8ea53f7 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2Client.java @@ -0,0 +1,66 @@ +/** + * + * 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.aws.ec2; + +import java.util.concurrent.TimeUnit; + +import org.jclouds.aws.ec2.services.AWSAMIClient; +import org.jclouds.aws.ec2.services.AWSInstanceClient; +import org.jclouds.aws.ec2.services.MonitoringClient; +import org.jclouds.aws.ec2.services.PlacementGroupClient; +import org.jclouds.concurrent.Timeout; +import org.jclouds.ec2.EC2Client; +import org.jclouds.rest.annotations.Delegate; + +/** + * Provides synchronous access to EC2 services. + * + * @author Adrian Cole + */ +@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) +public interface AWSEC2Client extends EC2Client { + + /** + * {@inheritDoc} + */ + @Delegate + @Override + AWSInstanceClient getInstanceServices(); + + /** + * {@inheritDoc} + */ + @Delegate + @Override + AWSAMIClient getAMIServices(); + + /** + * Provides synchronous access to PlacementGroup services. + */ + @Delegate + PlacementGroupClient getPlacementGroupServices(); + + /** + * Provides synchronous access to Monitoring services. + */ + @Delegate + MonitoringClient getMonitoringServices(); + +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2ContextBuilder.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2ContextBuilder.java index d92b6632fd..94430969a4 100644 --- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2ContextBuilder.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2ContextBuilder.java @@ -22,7 +22,8 @@ package org.jclouds.aws.ec2; import java.util.List; import java.util.Properties; -import org.jclouds.aws.ec2.config.AWSEC2ComputeServiceContextModule; +import org.jclouds.aws.ec2.compute.config.AWSEC2ComputeServiceContextModule; +import org.jclouds.aws.ec2.config.AWSEC2RestClientModule; import org.jclouds.ec2.EC2ContextBuilder; import com.google.inject.Module; @@ -37,6 +38,11 @@ public class AWSEC2ContextBuilder extends EC2ContextBuilder { super(props); } + @Override + protected void addClientModule(List modules) { + modules.add(new AWSEC2RestClientModule()); + } + @Override protected void addContextModule(List modules) { modules.add(new AWSEC2ComputeServiceContextModule()); diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2PropertiesBuilder.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2PropertiesBuilder.java index 5a76413779..f204f096b2 100644 --- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2PropertiesBuilder.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2PropertiesBuilder.java @@ -25,7 +25,7 @@ import static org.jclouds.aws.domain.Region.US_EAST_1; import static org.jclouds.aws.domain.Region.US_WEST_1; import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_NODE_SUSPENDED; import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; -import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; +import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMIs; import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; import java.util.Properties; diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeService.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeService.java new file mode 100644 index 0000000000..2acde48a95 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeService.java @@ -0,0 +1,132 @@ +/** + * + * 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.aws.ec2.compute; + +import static com.google.common.base.Preconditions.checkState; + +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; +import java.util.concurrent.ExecutorService; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.aws.ec2.AWSEC2Client; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.domain.PlacementGroup.State; +import org.jclouds.collect.Memoized; +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.TemplateBuilder; +import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; +import org.jclouds.compute.strategy.DestroyNodeStrategy; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap; +import org.jclouds.compute.strategy.ListNodesStrategy; +import org.jclouds.compute.strategy.RebootNodeStrategy; +import org.jclouds.compute.strategy.ResumeNodeStrategy; +import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.SuspendNodeStrategy; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; +import org.jclouds.ec2.compute.EC2ComputeService; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.ec2.domain.KeyPair; +import org.jclouds.util.Preconditions2; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; + +/** + * @author Adrian Cole + */ +@Singleton +public class AWSEC2ComputeService extends EC2ComputeService { + + private final Map placementGroupMap; + private final Predicate placementGroupDeleted; + private final AWSEC2Client ec2Client; + + @Inject + protected AWSEC2ComputeService(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, + InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory, Timeouts timeouts, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, AWSEC2Client 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, initScriptRunnerFactory, timeouts, executor, ec2Client, credentialsMap, securityGroupMap); + this.ec2Client = ec2Client; + this.placementGroupMap = placementGroupMap; + this.placementGroupDeleted = placementGroupDeleted; + } + + @VisibleForTesting + void deletePlacementGroup(String region, String tag) { + Preconditions2.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, group)); + logger.debug("<< deleted placementGroup(%s)", group); + } catch (IllegalStateException e) { + logger.debug("<< inUse placementGroup(%s)", group); + } + } + } + + protected void cleanUpIncidentalResources(Entry regionTag) { + super.cleanUpIncidentalResources(regionTag); + deletePlacementGroup(regionTag.getKey(), regionTag.getValue()); + } + + /** + * returns template options, except of type {@link EC2TemplateOptions}. + */ + @Override + public EC2TemplateOptions templateOptions() { + return EC2TemplateOptions.class.cast(super.templateOptions()); + } + +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java new file mode 100644 index 0000000000..fd41fc3a84 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderImpl.java @@ -0,0 +1,72 @@ +/** + * + * 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.aws.ec2.compute; + +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Provider; + +import org.jclouds.collect.Memoized; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.TemplateBuilder; +import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.domain.Location; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.internal.EC2TemplateBuilderImpl; + +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + */ +public class AWSEC2TemplateBuilderImpl extends EC2TemplateBuilderImpl { + + @Inject + protected AWSEC2TemplateBuilderImpl(@Memoized Supplier> locations, + @Memoized Supplier> images, @Memoized Supplier> sizes, + Supplier defaultLocation, Provider optionsProvider, + @Named("DEFAULT") Provider defaultTemplateProvider, Map imageMap) { + super(locations, images, sizes, defaultLocation, optionsProvider, defaultTemplateProvider, imageMap); + } + + @Override + protected void copyTemplateOptions(TemplateOptions from, TemplateOptions to) { + super.copyTemplateOptions(from, to); + if (from instanceof AWSEC2TemplateOptions) { + AWSEC2TemplateOptions eFrom = AWSEC2TemplateOptions.class.cast(from); + AWSEC2TemplateOptions eTo = AWSEC2TemplateOptions.class.cast(to); + + if (eFrom.getSubnetId() != null) + eTo.subnetId(eFrom.getSubnetId()); + if (eFrom.isMonitoringEnabled()) + eTo.enableMonitoring(); + if (!eFrom.shouldAutomaticallyCreatePlacementGroup()) + eTo.noPlacementGroup(); + if (eFrom.getPlacementGroup() != null) + eTo.placementGroup(eFrom.getPlacementGroup()); + } + } + +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateOptions.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateOptions.java new file mode 100644 index 0000000000..a3688d7f2d --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateOptions.java @@ -0,0 +1,423 @@ +/** + * + * 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.aws.ec2.compute; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +import java.util.Arrays; + +import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.domain.Credentials; +import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.io.Payload; +import org.jclouds.scriptbuilder.domain.Statement; +import org.jclouds.util.Preconditions2; + +/** + * Contains options supported in the {@code ComputeService#runNode} operation on the "ec2" provider. + *

+ * Usage

The recommended way to instantiate a AWSEC2TemplateOptions object is to statically + * import AWSEC2TemplateOptions.* and invoke a static creation method followed by an instance + * mutator (if needed): + *

+ * + * import static org.jclouds.aws.ec2.compute.options.AWSEC2TemplateOptions.Builder.*; + *

+ * ComputeService client = // get connection + * templateBuilder.options(inboundPorts(22, 80, 8080, 443)); + * Set set = client.runNodesWithTag(tag, 2, templateBuilder.build()); + * + * + * @author Adrian Cole + */ +public class AWSEC2TemplateOptions extends EC2TemplateOptions { + + private boolean monitoringEnabled; + private String placementGroup = null; + private boolean noPlacementGroup; + private String subnetId; + + public static final AWSEC2TemplateOptions NONE = new AWSEC2TemplateOptions(); + + /** + * Enable Cloudwatch monitoring + * + * @see CloudWatchClient + */ + public AWSEC2TemplateOptions enableMonitoring() { + this.monitoringEnabled = true; + return this; + } + + /** + * Specifies the keypair used to run instances with + */ + public AWSEC2TemplateOptions placementGroup(String placementGroup) { + checkNotNull(placementGroup, "use noPlacementGroup option to request boot without a keypair"); + checkState(!noPlacementGroup, "you cannot specify both options placementGroup and noPlacementGroup"); + Preconditions2.checkNotEmpty(placementGroup, "placementGroup must be non-empty"); + this.placementGroup = placementGroup; + return this; + } + + /** + * Do not use a keypair on instances + */ + public AWSEC2TemplateOptions noPlacementGroup() { + checkState(placementGroup == null, "you cannot specify both options placementGroup and noPlacementGroup"); + this.noPlacementGroup = true; + return this; + } + + /** + * Specifies the subnetId used to run instances in + */ + public AWSEC2TemplateOptions subnetId(String subnetId) { + checkNotNull(subnetId, "subnetId cannot be null"); + Preconditions2.checkNotEmpty(subnetId, "subnetId must be non-empty"); + this.subnetId = subnetId; + return this; + } + + public static class Builder { + + /** + * @see AWSEC2TemplateOptions#securityGroups(Iterable) + */ + public static AWSEC2TemplateOptions securityGroups(String... groupIds) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.securityGroups(groupIds)); + } + + /** + * @see AWSEC2TemplateOptions#securityGroups(Iterable) + */ + public static AWSEC2TemplateOptions securityGroups(Iterable groupIds) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.securityGroups(groupIds)); + } + + /** + * @see AWSEC2TemplateOptions#keyPair + */ + public static AWSEC2TemplateOptions keyPair(String keyPair) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.keyPair(keyPair)); + } + + /** + * @see AWSEC2TemplateOptions#userData + */ + public static AWSEC2TemplateOptions userData(byte[] unencodedData) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.userData(unencodedData)); + } + + /** + * @see AWSEC2TemplateOptions#noKeyPair + */ + public static AWSEC2TemplateOptions noKeyPair() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.noKeyPair()); + } + + /** + * @see AWSEC2TemplateOptions#placementGroup + */ + public static AWSEC2TemplateOptions placementGroup(String placementGroup) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.placementGroup(placementGroup)); + } + + /** + * @see AWSEC2TemplateOptions#noPlacementGroup + */ + public static AWSEC2TemplateOptions noPlacementGroup() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.noPlacementGroup()); + } + + /** + * @see AWSEC2TemplateOptions#enableMonitoring + */ + public static AWSEC2TemplateOptions enableMonitoring() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.enableMonitoring()); + } + + // methods that only facilitate returning the correct object type + /** + * @see TemplateOptions#inboundPorts + */ + public static AWSEC2TemplateOptions inboundPorts(int... ports) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.inboundPorts(ports)); + } + + /** + * @see TemplateOptions#port + */ + public static AWSEC2TemplateOptions blockOnPort(int port, int seconds) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.blockOnPort(port, seconds)); + } + + /** + * @see TemplateOptions#runScript + */ + public static AWSEC2TemplateOptions runScript(byte[] script) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.runScript(script)); + } + + /** + * @see TemplateOptions#installPrivateKey + */ + public static AWSEC2TemplateOptions installPrivateKey(String rsaKey) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.installPrivateKey(rsaKey)); + } + + /** + * @see TemplateOptions#authorizePublicKey + */ + public static AWSEC2TemplateOptions authorizePublicKey(String rsaKey) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.authorizePublicKey(rsaKey)); + } + + /** + * @see TemplateOptions#withDetails + */ + public static AWSEC2TemplateOptions withDetails() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.withMetadata()); + } + + /** + * @see TemplateOptions#withSubnetId + */ + public static AWSEC2TemplateOptions subnetId(String subnetId) { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + return AWSEC2TemplateOptions.class.cast(options.subnetId(subnetId)); + } + } + + // methods that only facilitate returning the correct object type + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions blockOnPort(int port, int seconds) { + return AWSEC2TemplateOptions.class.cast(super.blockOnPort(port, seconds)); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions inboundPorts(int... ports) { + return AWSEC2TemplateOptions.class.cast(super.inboundPorts(ports)); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions authorizePublicKey(String publicKey) { + return AWSEC2TemplateOptions.class.cast(super.authorizePublicKey(publicKey)); + } + + /** + * {@inheritDoc} + */ + @Override + @Deprecated + public AWSEC2TemplateOptions authorizePublicKey(Payload publicKey) { + return AWSEC2TemplateOptions.class.cast(super.authorizePublicKey(publicKey)); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions installPrivateKey(String privateKey) { + return AWSEC2TemplateOptions.class.cast(super.installPrivateKey(privateKey)); + } + + /** + * {@inheritDoc} + */ + @Override + @Deprecated + public AWSEC2TemplateOptions installPrivateKey(Payload privateKey) { + return AWSEC2TemplateOptions.class.cast(super.installPrivateKey(privateKey)); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions runScript(Payload script) { + return AWSEC2TemplateOptions.class.cast(super.runScript(script)); + } + + /** + * {@inheritDoc} + */ + @Override + @Deprecated + public AWSEC2TemplateOptions runScript(byte[] script) { + return AWSEC2TemplateOptions.class.cast(super.runScript(script)); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions withMetadata() { + return AWSEC2TemplateOptions.class.cast(super.withMetadata()); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions blockUntilRunning(boolean blockUntilRunning) { + return AWSEC2TemplateOptions.class.cast(super.blockUntilRunning(blockUntilRunning)); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions dontAuthorizePublicKey() { + return AWSEC2TemplateOptions.class.cast(super.dontAuthorizePublicKey()); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions nameTask(String name) { + return AWSEC2TemplateOptions.class.cast(super.nameTask(name)); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions runAsRoot(boolean runAsRoot) { + return AWSEC2TemplateOptions.class.cast(super.runAsRoot(runAsRoot)); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions runScript(Statement script) { + return AWSEC2TemplateOptions.class.cast(super.runScript(script)); + } + + /** + * {@inheritDoc} + */ + @Override + public AWSEC2TemplateOptions withOverridingCredentials(Credentials overridingCredentials) { + return AWSEC2TemplateOptions.class.cast(super.withOverridingCredentials(overridingCredentials)); + } + + /** + * @return placementGroup to use when running the instance or null, to generate a placementGroup. + */ + public String getPlacementGroup() { + return placementGroup; + } + + /** + * @return true (default) if we are supposed to use a placementGroup + */ + public boolean shouldAutomaticallyCreatePlacementGroup() { + return !noPlacementGroup; + } + + /** + * @return true (default) if we are supposed to enable cloudwatch + */ + public boolean isMonitoringEnabled() { + return monitoringEnabled; + } + + /** + * @return subnetId to use when running the instance or null. + */ + public String getSubnetId() { + return subnetId; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + (monitoringEnabled ? 1231 : 1237); + result = prime * result + (noPlacementGroup ? 1231 : 1237); + result = prime * result + ((placementGroup == null) ? 0 : placementGroup.hashCode()); + result = prime * result + ((subnetId == null) ? 0 : subnetId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + AWSEC2TemplateOptions other = (AWSEC2TemplateOptions) obj; + if (monitoringEnabled != other.monitoringEnabled) + return false; + if (noPlacementGroup != other.noPlacementGroup) + return false; + if (placementGroup == null) { + if (other.placementGroup != null) + return false; + } else if (!placementGroup.equals(other.placementGroup)) + return false; + if (subnetId == null) { + if (other.subnetId != null) + return false; + } else if (!subnetId.equals(other.subnetId)) + return false; + return true; + } + + @Override + public String toString() { + + return "AWSEC2TemplateOptions [groupIds=" + getGroupIds() + ", keyPair=" + getKeyPair() + ", noKeyPair=" + + !shouldAutomaticallyCreateKeyPair() + ", monitoringEnabled=" + monitoringEnabled + ", placementGroup=" + + placementGroup + ", noPlacementGroup=" + noPlacementGroup + ", subnetId=" + subnetId + ", userData=" + + Arrays.toString(getUserData()) + ", blockDeviceMappings=" + getBlockDeviceMappings() + "]"; + } + +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2ComputeServiceContextModule.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java similarity index 50% rename from providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2ComputeServiceContextModule.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java index 4d93da2c86..6d189a42c5 100644 --- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2ComputeServiceContextModule.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModule.java @@ -17,14 +17,24 @@ * ==================================================================== */ -package org.jclouds.aws.ec2.config; +package org.jclouds.aws.ec2.compute.config; import static org.jclouds.compute.domain.OsFamily.AMZN_LINUX; -import org.jclouds.aws.ec2.strategy.AWSEC2ReviseParsedImage; +import org.jclouds.aws.ec2.compute.AWSEC2TemplateBuilderImpl; +import org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions; +import org.jclouds.aws.ec2.compute.strategy.AWSEC2ReviseParsedImage; +import org.jclouds.aws.ec2.compute.strategy.CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions; +import org.jclouds.aws.ec2.compute.suppliers.AWSEC2HardwareSupplier; +import org.jclouds.aws.ec2.compute.suppliers.AWSRegionAndNameToImageSupplier; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.ec2.compute.config.EC2ComputeServiceContextModule; +import org.jclouds.ec2.compute.internal.EC2TemplateBuilderImpl; +import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.ec2.compute.strategy.CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions; import org.jclouds.ec2.compute.strategy.ReviseParsedImage; +import org.jclouds.ec2.compute.suppliers.EC2HardwareSupplier; +import org.jclouds.ec2.compute.suppliers.RegionAndNameToImageSupplier; import com.google.inject.Injector; @@ -43,6 +53,17 @@ public class AWSEC2ComputeServiceContextModule extends EC2ComputeServiceContextM protected void configure() { super.configure(); bind(ReviseParsedImage.class).to(AWSEC2ReviseParsedImage.class); + bind(CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class).to( + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class); + bind(EC2HardwareSupplier.class).to(AWSEC2HardwareSupplier.class); + bind(RegionAndNameToImageSupplier.class).to(AWSRegionAndNameToImageSupplier.class); + bind(EC2TemplateBuilderImpl.class).to(AWSEC2TemplateBuilderImpl.class); + bind(EC2TemplateOptions.class).to(AWSEC2TemplateOptions.class); + } + + @Override + protected void installDependencies() { + install(new AWSEC2ComputeServiceDependenciesModule()); } } diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceDependenciesModule.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceDependenciesModule.java new file mode 100644 index 0000000000..b8f0b723c3 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceDependenciesModule.java @@ -0,0 +1,117 @@ +/** + * + * 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.aws.ec2.compute.config; + +import static com.google.common.collect.Iterables.toArray; +import static com.google.common.collect.Maps.newLinkedHashMap; +import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMIs; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.aws.ec2.AWSEC2AsyncClient; +import org.jclouds.aws.ec2.AWSEC2Client; +import org.jclouds.aws.ec2.compute.AWSEC2ComputeService; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.predicates.PlacementGroupAvailable; +import org.jclouds.aws.ec2.predicates.PlacementGroupDeleted; +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.TemplateBuilder; +import org.jclouds.compute.internal.ComputeServiceContextImpl; +import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.domain.Credentials; +import org.jclouds.ec2.compute.config.EC2ComputeServiceDependenciesModule; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.functions.CreateSecurityGroupIfNeeded; +import org.jclouds.ec2.compute.functions.CredentialsForInstance; +import org.jclouds.ec2.compute.functions.RunningInstanceToNodeMetadata; +import org.jclouds.ec2.compute.internal.EC2TemplateBuilderImpl; +import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.predicates.RetryablePredicate; +import org.jclouds.rest.RestContext; +import org.jclouds.rest.internal.RestContextImpl; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Splitter; +import com.google.inject.Provides; +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; + +/** + * + * @author Adrian Cole + */ +public class AWSEC2ComputeServiceDependenciesModule extends EC2ComputeServiceDependenciesModule { + @Override + protected void configure() { + bind(TemplateBuilder.class).to(EC2TemplateBuilderImpl.class); + bind(TemplateOptions.class).to(EC2TemplateOptions.class); + bind(ComputeService.class).to(AWSEC2ComputeService.class); + bind(new TypeLiteral>() { + }).to(RunningInstanceToNodeMetadata.class); + bind(new TypeLiteral>() { + }).to(CredentialsForInstance.class); + bind(new TypeLiteral() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + bind(new TypeLiteral>() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + } + + @Provides + @Singleton + @Named("AVAILABLE") + protected Predicate placementGroupAvailable(PlacementGroupAvailable available) { + return new RetryablePredicate(available, 60, 1, TimeUnit.SECONDS); + } + + @Provides + @Singleton + @Named("DELETED") + protected Predicate placementGroupDeleted(PlacementGroupDeleted deleted) { + return new RetryablePredicate(deleted, 60, 1, TimeUnit.SECONDS); + } + + @Provides + @Singleton + @Named("PLACEMENT") + protected Map placementGroupMap(CreateSecurityGroupIfNeeded in) { + // doesn't seem to clear when someone issues remove(key) + // return new MapMaker().makeComputingMap(in); + return newLinkedHashMap(); + } + + @Provides + @Singleton + @Named(PROPERTY_EC2_CC_AMIs) + protected String[] ccAmis(@Named(PROPERTY_EC2_CC_AMIs) String ccAmis) { + if (ccAmis.trim().equals("")) + return new String[] {}; + return toArray(Splitter.on(',').split(ccAmis), String.class); + } +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/strategy/AWSEC2ReviseParsedImage.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ReviseParsedImage.java similarity index 99% rename from providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/strategy/AWSEC2ReviseParsedImage.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ReviseParsedImage.java index 88824475a6..83a894594b 100644 --- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/strategy/AWSEC2ReviseParsedImage.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ReviseParsedImage.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.aws.ec2.strategy; +package org.jclouds.aws.ec2.compute.strategy; import static com.google.common.base.Preconditions.checkNotNull; diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java new file mode 100644 index 0000000000..35913beb32 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java @@ -0,0 +1,113 @@ +/** + * + * 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.aws.ec2.compute.strategy; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions; +import org.jclouds.aws.ec2.functions.CreatePlacementGroupIfNeeded; +import org.jclouds.aws.ec2.options.AWSRunInstancesOptions; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.functions.CreateSecurityGroupIfNeeded; +import org.jclouds.ec2.compute.functions.CreateUniqueKeyPair; +import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.ec2.compute.strategy.CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions; +import org.jclouds.ec2.domain.KeyPair; +import org.jclouds.ec2.options.RunInstancesOptions; + +import com.google.common.annotations.VisibleForTesting; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions extends + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions { + + @VisibleForTesting + final Map placementGroupMap; + @VisibleForTesting + final CreatePlacementGroupIfNeeded createPlacementGroupIfNeeded; + + @Inject + public CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions( + Map credentialsMap, @Named("SECURITY") Map securityGroupMap, + @Named("PLACEMENT") Map placementGroupMap, CreateUniqueKeyPair createUniqueKeyPair, + CreateSecurityGroupIfNeeded createSecurityGroupIfNeeded, + javax.inject.Provider optionsProvider, + CreatePlacementGroupIfNeeded createPlacementGroupIfNeeded) { + super(credentialsMap, securityGroupMap, createUniqueKeyPair, createSecurityGroupIfNeeded, optionsProvider); + this.placementGroupMap = placementGroupMap; + this.createPlacementGroupIfNeeded = createPlacementGroupIfNeeded; + } + + public AWSRunInstancesOptions execute(String region, String tag, Template template) { + AWSRunInstancesOptions instanceOptions = AWSRunInstancesOptions.class.cast(super.execute(region, tag, template)); + + String placementGroupName = template.getHardware().getId().startsWith("cc") ? createNewPlacementGroupUnlessUserSpecifiedOtherwise( + region, tag, template.getOptions()) + : null; + + if (placementGroupName != null) + instanceOptions.inPlacementGroup(placementGroupName); + + if (AWSEC2TemplateOptions.class.cast(template.getOptions()).isMonitoringEnabled()) + instanceOptions.enableMonitoring(); + + return instanceOptions; + } + + @VisibleForTesting + String createNewPlacementGroupUnlessUserSpecifiedOtherwise(String region, String tag, TemplateOptions options) { + String placementGroupName = null; + boolean shouldAutomaticallyCreatePlacementGroup = true; + if (options instanceof EC2TemplateOptions) { + placementGroupName = AWSEC2TemplateOptions.class.cast(options).getPlacementGroup(); + if (placementGroupName == null) + shouldAutomaticallyCreatePlacementGroup = AWSEC2TemplateOptions.class.cast(options) + .shouldAutomaticallyCreatePlacementGroup(); + } + if (placementGroupName == null && shouldAutomaticallyCreatePlacementGroup) { + placementGroupName = String.format("jclouds#%s#%s", tag, region); + RegionAndName regionAndName = new RegionAndName(region, placementGroupName); + if (!placementGroupMap.containsKey(regionAndName)) { + placementGroupMap.put(regionAndName, createPlacementGroupIfNeeded.apply(regionAndName)); + } + } + return placementGroupName; + } + + @Override + protected void addSecurityGroups(String region, String tag, Template template, RunInstancesOptions instanceOptions) { + String subnetId = AWSEC2TemplateOptions.class.cast(template.getOptions()).getSubnetId(); + if (subnetId != null) { + AWSRunInstancesOptions.class.cast(instanceOptions).withSubnetId(subnetId); + } else { + super.addSecurityGroups(region, tag, template, instanceOptions); + } + } +} \ No newline at end of file diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/suppliers/AWSEC2HardwareSupplier.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/suppliers/AWSEC2HardwareSupplier.java new file mode 100644 index 0000000000..c1c6316a56 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/suppliers/AWSEC2HardwareSupplier.java @@ -0,0 +1,90 @@ +/** + * + * 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.aws.ec2.compute.suppliers; + +import static com.google.common.collect.Iterables.find; +import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMIs; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.c1_medium; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.c1_xlarge; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.cc1_4xlarge; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_large; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_small; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_xlarge; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m2_2xlarge; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m2_4xlarge; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m2_xlarge; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.t1_micro; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.collect.Memoized; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; +import org.jclouds.ec2.compute.suppliers.EC2HardwareSupplier; +import org.jclouds.location.Provider; + +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet.Builder; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class AWSEC2HardwareSupplier extends EC2HardwareSupplier { + + private final Supplier> locations; + private final String[] ccAmis; + + @Inject + public AWSEC2HardwareSupplier(@Memoized Supplier> locations, @Provider String providerName, + @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis) { + this.locations = locations; + this.ccAmis = ccAmis; + } + + @Override + public Set get() { + Builder sizes = ImmutableSet.builder(); + for (String ccAmi : ccAmis) { + final String region = ccAmi.split("/")[0]; + Location location = find(locations.get(), new Predicate() { + + @Override + public boolean apply(Location input) { + return input.getScope() == LocationScope.REGION && input.getId().equals(region); + } + + }); + 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(), m1_small().build(), m1_xlarge().build(), m2_xlarge().build(), m2_2xlarge().build(), + m2_4xlarge().build())); + return sizes.build(); + } +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/suppliers/AWSRegionAndNameToImageSupplier.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/suppliers/AWSRegionAndNameToImageSupplier.java new file mode 100644 index 0000000000..be88ce886e --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/suppliers/AWSRegionAndNameToImageSupplier.java @@ -0,0 +1,93 @@ +/** + * + * 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.aws.ec2.compute.suppliers; + +/** + * + * + * ==================================================================== + * 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. + * ==================================================================== + */ + +import static com.google.common.collect.Iterables.concat; +import static com.google.common.collect.Maps.newLinkedHashMap; +import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMIs; +import static org.jclouds.ec2.options.DescribeImagesOptions.Builder.imageIds; +import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; + +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Image; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.functions.EC2ImageParser; +import org.jclouds.ec2.compute.strategy.DescribeImagesParallel; +import org.jclouds.ec2.compute.suppliers.RegionAndNameToImageSupplier; +import org.jclouds.ec2.options.DescribeImagesOptions; +import org.jclouds.location.Region; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class AWSRegionAndNameToImageSupplier extends RegionAndNameToImageSupplier { + + private final String[] ccAmis; + + @Inject + AWSRegionAndNameToImageSupplier(@Region Set regions, DescribeImagesParallel describer, + @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis, @Named(PROPERTY_EC2_AMI_OWNERS) String[] amiOwners, + EC2ImageParser parser, Map images) { + super(regions, describer, amiOwners, parser, images); + this.ccAmis = ccAmis; + } + + public Iterable> getDescribeQueriesForOwnersInRegions(Set regions, + String[] amiOwners) { + return concat(super.getDescribeQueriesForOwnersInRegions(regions, amiOwners), ccAmisToDescribeQueries(ccAmis) + .entrySet()); + } + + static Map ccAmisToDescribeQueries(String[] ccAmis) { + Map queries = newLinkedHashMap(); + for (String from : ccAmis) { + queries.put(from.split("/")[0], imageIds(from.split("/")[1])); + } + return queries; + } + +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2RestClientModule.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2RestClientModule.java new file mode 100644 index 0000000000..ad0866e6d2 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/config/AWSEC2RestClientModule.java @@ -0,0 +1,133 @@ +/** + * + * 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.aws.ec2.config; + +import java.util.Map; + +import javax.inject.Singleton; + +import org.jclouds.aws.ec2.AWSEC2AsyncClient; +import org.jclouds.aws.ec2.AWSEC2Client; +import org.jclouds.aws.ec2.domain.AWSRunningInstance; +import org.jclouds.aws.ec2.options.AWSRunInstancesOptions; +import org.jclouds.aws.ec2.services.AWSAMIAsyncClient; +import org.jclouds.aws.ec2.services.AWSAMIClient; +import org.jclouds.aws.ec2.services.AWSInstanceAsyncClient; +import org.jclouds.aws.ec2.services.AWSInstanceClient; +import org.jclouds.aws.ec2.services.MonitoringAsyncClient; +import org.jclouds.aws.ec2.services.MonitoringClient; +import org.jclouds.aws.ec2.services.PlacementGroupAsyncClient; +import org.jclouds.aws.ec2.services.PlacementGroupClient; +import org.jclouds.ec2.EC2AsyncClient; +import org.jclouds.ec2.EC2Client; +import org.jclouds.ec2.config.EC2RestClientModule; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.ec2.options.RunInstancesOptions; +import org.jclouds.ec2.services.AMIAsyncClient; +import org.jclouds.ec2.services.AMIClient; +import org.jclouds.ec2.services.AvailabilityZoneAndRegionAsyncClient; +import org.jclouds.ec2.services.AvailabilityZoneAndRegionClient; +import org.jclouds.ec2.services.ElasticBlockStoreAsyncClient; +import org.jclouds.ec2.services.ElasticBlockStoreClient; +import org.jclouds.ec2.services.ElasticIPAddressAsyncClient; +import org.jclouds.ec2.services.ElasticIPAddressClient; +import org.jclouds.ec2.services.InstanceAsyncClient; +import org.jclouds.ec2.services.InstanceClient; +import org.jclouds.ec2.services.KeyPairAsyncClient; +import org.jclouds.ec2.services.KeyPairClient; +import org.jclouds.ec2.services.SecurityGroupAsyncClient; +import org.jclouds.ec2.services.SecurityGroupClient; +import org.jclouds.ec2.services.WindowsAsyncClient; +import org.jclouds.ec2.services.WindowsClient; +import org.jclouds.http.RequiresHttp; +import org.jclouds.rest.ConfiguresRestClient; + +import com.google.common.collect.ImmutableMap; +import com.google.inject.Provides; + +/** + * Configures the EC2 connection. + * + * @author Adrian Cole + */ +@RequiresHttp +@ConfiguresRestClient +public class AWSEC2RestClientModule extends EC2RestClientModule { + + public static final Map, Class> DELEGATE_MAP = ImmutableMap., Class> builder()// + .put(AWSAMIClient.class, AWSAMIAsyncClient.class)// + .put(ElasticIPAddressClient.class, ElasticIPAddressAsyncClient.class)// + .put(AWSInstanceClient.class, AWSInstanceAsyncClient.class)// + .put(KeyPairClient.class, KeyPairAsyncClient.class)// + .put(SecurityGroupClient.class, SecurityGroupAsyncClient.class)// + .put(PlacementGroupClient.class, PlacementGroupAsyncClient.class)// + .put(MonitoringClient.class, MonitoringAsyncClient.class)// + .put(WindowsClient.class, WindowsAsyncClient.class)// + .put(AvailabilityZoneAndRegionClient.class, AvailabilityZoneAndRegionAsyncClient.class)// + .put(ElasticBlockStoreClient.class, ElasticBlockStoreAsyncClient.class)// + .build(); + + public AWSEC2RestClientModule() { + super(AWSEC2Client.class, AWSEC2AsyncClient.class, DELEGATE_MAP); + } + + @Singleton + @Provides + EC2Client provide(AWSEC2Client in) { + return in; + } + + @Singleton + @Provides + EC2AsyncClient provide(AWSEC2AsyncClient in) { + return in; + } + + @Singleton + @Provides + InstanceClient getInstanceServices(AWSEC2Client in) { + return in.getInstanceServices(); + } + + @Singleton + @Provides + InstanceAsyncClient getInstanceServices(AWSEC2AsyncClient in) { + return in.getInstanceServices(); + } + + @Singleton + @Provides + AMIClient getAMIServices(AWSEC2Client in) { + return in.getAMIServices(); + } + + @Singleton + @Provides + AMIAsyncClient getAMIServices(AWSEC2AsyncClient in) { + return in.getAMIServices(); + } + + @Override + protected void configure() { + bind(RunningInstance.Builder.class).to(AWSRunningInstance.Builder.class); + bind(RunInstancesOptions.class).to(AWSRunInstancesOptions.class); + super.configure(); + } +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/AWSRunningInstance.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/AWSRunningInstance.java new file mode 100644 index 0000000000..03f4ad0e75 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/AWSRunningInstance.java @@ -0,0 +1,354 @@ +/** + * + * 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.aws.ec2.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Date; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.jclouds.ec2.domain.BlockDevice; +import org.jclouds.ec2.domain.InstanceState; +import org.jclouds.ec2.domain.RootDeviceType; +import org.jclouds.ec2.domain.RunningInstance; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; + +/** + * + * @see + * @author Adrian Cole + */ +public class AWSRunningInstance extends RunningInstance { + + public static class Builder extends org.jclouds.ec2.domain.RunningInstance.Builder { + private MonitoringState monitoringState; + private String placementGroup; + private Set productCodes = Sets.newLinkedHashSet(); + private String subnetId; + private String spotInstanceRequestId; + private String vpcId; + + public Builder monitoringState(MonitoringState monitoringState) { + this.monitoringState = monitoringState; + return this; + } + + public Builder placementGroup(String placementGroup) { + this.placementGroup = placementGroup; + return this; + } + + public Builder productCodes(Iterable productCodes) { + this.productCodes = ImmutableSet.copyOf(checkNotNull(productCodes, "productCodes")); + return this; + } + + public Builder productCode(String productCode) { + if (productCode != null) + this.productCodes.add(productCode); + return this; + } + + public Builder subnetId(String subnetId) { + this.subnetId = subnetId; + return this; + } + + public Builder spotInstanceRequestId(String spotInstanceRequestId) { + this.spotInstanceRequestId = spotInstanceRequestId; + return this; + } + + public Builder vpcId(String vpcId) { + this.vpcId = vpcId; + return this; + } + + @Override + public Builder amiLaunchIndex(String amiLaunchIndex) { + return Builder.class.cast(super.amiLaunchIndex(amiLaunchIndex)); + } + + @Override + public Builder availabilityZone(String availabilityZone) { + return Builder.class.cast(super.availabilityZone(availabilityZone)); + } + + @Override + public Builder devices(Map ebsBlockDevices) { + return Builder.class.cast(super.devices(ebsBlockDevices)); + } + + @Override + public Builder dnsName(String dnsName) { + return Builder.class.cast(super.dnsName(dnsName)); + } + + @Override + public Builder imageId(String imageId) { + return Builder.class.cast(super.imageId(imageId)); + } + + @Override + public Builder instanceId(String instanceId) { + return Builder.class.cast(super.instanceId(instanceId)); + } + + @Override + public Builder instanceState(InstanceState instanceState) { + return Builder.class.cast(super.instanceState(instanceState)); + } + + @Override + public Builder instanceType(String instanceType) { + return Builder.class.cast(super.instanceType(instanceType)); + } + + @Override + public Builder ipAddress(String ipAddress) { + return Builder.class.cast(super.ipAddress(ipAddress)); + } + + @Override + public Builder kernelId(String kernelId) { + return Builder.class.cast(super.kernelId(kernelId)); + } + + @Override + public Builder keyName(String keyName) { + return Builder.class.cast(super.keyName(keyName)); + } + + @Override + public Builder launchTime(Date launchTime) { + return Builder.class.cast(super.launchTime(launchTime)); + } + + @Override + public Builder platform(String platform) { + return Builder.class.cast(super.platform(platform)); + } + + @Override + public Builder privateDnsName(String privateDnsName) { + return Builder.class.cast(super.privateDnsName(privateDnsName)); + } + + @Override + public Builder privateIpAddress(String privateIpAddress) { + return Builder.class.cast(super.privateIpAddress(privateIpAddress)); + } + + @Override + public Builder ramdiskId(String ramdiskId) { + return Builder.class.cast(super.ramdiskId(ramdiskId)); + } + + @Override + public Builder reason(String reason) { + return Builder.class.cast(super.reason(reason)); + } + + @Override + public Builder region(String region) { + return Builder.class.cast(super.region(region)); + } + + @Override + public Builder rootDeviceName(String rootDeviceName) { + return Builder.class.cast(super.rootDeviceName(rootDeviceName)); + } + + @Override + public Builder rootDeviceType(RootDeviceType rootDeviceType) { + return Builder.class.cast(super.rootDeviceType(rootDeviceType)); + } + + @Override + public Builder virtualizationType(String virtualizationType) { + return Builder.class.cast(super.virtualizationType(virtualizationType)); + } + + @Override + public Builder device(String key, BlockDevice value) { + return Builder.class.cast(super.device(key, value)); + } + + @Override + public Builder groupId(String groupId) { + return Builder.class.cast(super.groupId(groupId)); + } + + @Override + public Builder groupIds(Iterable groupIds) { + return Builder.class.cast(super.groupIds(groupIds)); + } + + @Override + public AWSRunningInstance build() { + return new AWSRunningInstance(region, groupIds, amiLaunchIndex, dnsName, imageId, instanceId, instanceState, + instanceType, ipAddress, kernelId, keyName, launchTime, availabilityZone, virtualizationType, + platform, privateDnsName, privateIpAddress, ramdiskId, reason, rootDeviceType, rootDeviceName, + ebsBlockDevices, monitoringState, placementGroup, productCodes, subnetId, spotInstanceRequestId, + vpcId); + } + + } + + private final MonitoringState monitoringState; + @Nullable + private final String placementGroup; + private final Set productCodes; + @Nullable + private final String subnetId; + @Nullable + private final String spotInstanceRequestId; + @Nullable + private final String vpcId; + + protected AWSRunningInstance(String region, Iterable groupIds, String amiLaunchIndex, String dnsName, + String imageId, String instanceId, InstanceState instanceState, String instanceType, String ipAddress, + String kernelId, String keyName, Date launchTime, String availabilityZone, String virtualizationType, + String platform, String privateDnsName, String privateIpAddress, String ramdiskId, String reason, + RootDeviceType rootDeviceType, String rootDeviceName, Map ebsBlockDevices, + MonitoringState monitoringState, String placementGroup, Iterable productCodes, String subnetId, + String spotInstanceRequestId, String vpcId) { + super(region, groupIds, amiLaunchIndex, dnsName, imageId, instanceId, instanceState, instanceType, ipAddress, + kernelId, keyName, launchTime, availabilityZone, virtualizationType, platform, privateDnsName, + privateIpAddress, ramdiskId, reason, rootDeviceType, rootDeviceName, ebsBlockDevices); + this.monitoringState = checkNotNull(monitoringState, "monitoringState"); + this.placementGroup = placementGroup; + this.productCodes = ImmutableSet.copyOf(checkNotNull(groupIds, "groupIds")); + this.subnetId = subnetId; + this.spotInstanceRequestId = spotInstanceRequestId; + this.vpcId = vpcId; + } + + /** + * State of monitoring for the instance. + */ + public MonitoringState getMonitoringState() { + return monitoringState; + } + + /** + * The name of the placement group the instance is in (for cluster compute instances). + */ + public String getPlacementGroup() { + return placementGroup; + } + + /** + * Product codes attached to this instance. + */ + public Set getProductCodes() { + return productCodes; + } + + /** + * The ID of the Spot Instance request + */ + public String getSpotInstanceRequestId() { + return spotInstanceRequestId; + } + + /** + * Specifies the VPC in which the instance is running (Amazon Virtual Private Cloud). + */ + public String getVpcId() { + return vpcId; + } + + /** + * Specifies the subnet ID in which the instance is running (Amazon Virtual Private Cloud). + */ + public String getSubnetId() { + return subnetId; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((placementGroup == null) ? 0 : placementGroup.hashCode()); + result = prime * result + ((productCodes == null) ? 0 : productCodes.hashCode()); + result = prime * result + ((spotInstanceRequestId == null) ? 0 : spotInstanceRequestId.hashCode()); + result = prime * result + ((subnetId == null) ? 0 : subnetId.hashCode()); + result = prime * result + ((vpcId == null) ? 0 : vpcId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + AWSRunningInstance other = (AWSRunningInstance) obj; + if (placementGroup == null) { + if (other.placementGroup != null) + return false; + } else if (!placementGroup.equals(other.placementGroup)) + return false; + if (productCodes == null) { + if (other.productCodes != null) + return false; + } else if (!productCodes.equals(other.productCodes)) + return false; + if (spotInstanceRequestId == null) { + if (other.spotInstanceRequestId != null) + return false; + } else if (!spotInstanceRequestId.equals(other.spotInstanceRequestId)) + return false; + if (subnetId == null) { + if (other.subnetId != null) + return false; + } else if (!subnetId.equals(other.subnetId)) + return false; + if (vpcId == null) { + if (other.vpcId != null) + return false; + } else if (!vpcId.equals(other.vpcId)) + return false; + return true; + } + + @Override + public String toString() { + return "[region=" + region + ", availabilityZone=" + availabilityZone + ", instanceId=" + instanceId + + ", instanceState=" + instanceState + ", instanceType=" + instanceType + ", virtualizationType=" + + virtualizationType + ", imageId=" + imageId + ", ipAddress=" + ipAddress + ", dnsName=" + dnsName + + ", privateIpAddress=" + privateIpAddress + ", privateDnsName=" + privateDnsName + ", keyName=" + + keyName + ", platform=" + platform + ", launchTime=" + launchTime + ", rootDeviceName=" + + rootDeviceName + ", rootDeviceType=" + rootDeviceType + ", ebsBlockDevices=" + ebsBlockDevices + + ", monitoringState=" + monitoringState + ", placementGroup=" + placementGroup + ", productCodes=" + + productCodes + ", spotInstanceRequestId=" + spotInstanceRequestId + ", subnetId=" + subnetId + + ", vpcId=" + vpcId + "]"; + } + +} diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/domain/MonitoringState.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/MonitoringState.java similarity index 86% rename from apis/ec2/src/main/java/org/jclouds/ec2/domain/MonitoringState.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/MonitoringState.java index cdf7a2a669..0facfdd784 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/domain/MonitoringState.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/MonitoringState.java @@ -17,12 +17,12 @@ * ==================================================================== */ -package org.jclouds.ec2.domain; +package org.jclouds.aws.ec2.domain; import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.aws.ec2.services.MonitoringClient; import org.jclouds.ec2.services.InstanceClient; -import org.jclouds.ec2.services.MonitoringClient; /** * @@ -47,13 +47,6 @@ public enum MonitoringState { } public static MonitoringState fromValue(String state) { - /** - * Eucalyptus - */ - if ("false".endsWith(state)) - return DISABLED; - if ("true".endsWith(state)) - return ENABLED; try { return valueOf(checkNotNull(state, "state").toUpperCase()); } catch (IllegalArgumentException e) { diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/domain/PlacementGroup.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/PlacementGroup.java similarity index 99% rename from apis/ec2/src/main/java/org/jclouds/ec2/domain/PlacementGroup.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/PlacementGroup.java index 2d2f5cd6cd..467b8a6498 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/domain/PlacementGroup.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/domain/PlacementGroup.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.domain; +package org.jclouds.aws.ec2.domain; import static com.google.common.base.Preconditions.checkNotNull; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/CreatePlacementGroupIfNeeded.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/CreatePlacementGroupIfNeeded.java similarity index 90% rename from apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/CreatePlacementGroupIfNeeded.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/CreatePlacementGroupIfNeeded.java index 549582a5c1..584a04bb38 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/CreatePlacementGroupIfNeeded.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/functions/CreatePlacementGroupIfNeeded.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.compute.functions; +package org.jclouds.aws.ec2.functions; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; @@ -28,11 +28,11 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.aws.AWSResponseException; +import org.jclouds.aws.ec2.AWSEC2Client; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.domain.PlacementGroup.State; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.ec2.EC2Client; import org.jclouds.ec2.compute.domain.RegionAndName; -import org.jclouds.ec2.domain.PlacementGroup; -import org.jclouds.ec2.domain.PlacementGroup.State; import org.jclouds.logging.Logger; import com.google.common.base.Function; @@ -47,11 +47,11 @@ public class CreatePlacementGroupIfNeeded implements Function placementGroupAvailable; @Inject - public CreatePlacementGroupIfNeeded(EC2Client ec2Client, + public CreatePlacementGroupIfNeeded(AWSEC2Client ec2Client, @Named("AVAILABLE") Predicate placementGroupAvailable) { this.ec2Client = ec2Client; this.placementGroupAvailable = placementGroupAvailable; diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java new file mode 100644 index 0000000000..a4cf04183c --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptions.java @@ -0,0 +1,220 @@ +/** + * + * 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.aws.ec2.options; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Set; + +import org.jclouds.ec2.domain.BlockDeviceMapping; +import org.jclouds.ec2.domain.InstanceType; +import org.jclouds.ec2.options.RunInstancesOptions; + +/** + * Contains options supported in the Form API for the RunInstances operation.

+ * Usage

The recommended way to instantiate a RunInstancesOptions object is to statically + * import RunInstancesOptions.Builder.* and invoke a static creation method followed by an instance + * mutator (if needed): + *

+ * + * import static org.jclouds.aws.ec2.options.RunInstancesOptions.Builder.* + *

+ * EC2Client connection = // get connection + * Future instances = connection.runInstances(executableBy("123125").imageIds(1000, 1004)); + * + * + * @author Adrian Cole + * @see + */ +public class AWSRunInstancesOptions extends RunInstancesOptions { + public static final AWSRunInstancesOptions NONE = new AWSRunInstancesOptions(); + + /** + * Specifies the name of an existing placement group you want to launch the instance into (for + * cluster compute instances). + * + * @param placementGroup + * name of an existing placement group + */ + public AWSRunInstancesOptions inPlacementGroup(String placementGroup) { + formParameters.put("Placement.GroupName", checkNotNull(placementGroup, "placementGroup")); + return this; + } + + String getPlacementGroup() { + return getFirstFormOrNull("Placement.GroupName"); + } + + /** + * Enables monitoring for the instance. + */ + public AWSRunInstancesOptions enableMonitoring() { + formParameters.put("Monitoring.Enabled", "true"); + return this; + } + + String getMonitoringEnabled() { + return getFirstFormOrNull("Monitoring.Enabled"); + } + + /** + * Specifies the subnet ID within which to launch the instance(s) for Amazon Virtual Private + * Cloud. + */ + public AWSRunInstancesOptions withSubnetId(String subnetId) { + formParameters.put("SubnetId", checkNotNull(subnetId, "subnetId")); + return this; + } + + String getSubnetId() { + return getFirstFormOrNull("SubnetId"); + } + + public static class Builder extends RunInstancesOptions.Builder { + + /** + * @see AWSRunInstancesOptions#inPlacementGroup(String) + */ + public static AWSRunInstancesOptions inPlacementGroup(String placementGroup) { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.inPlacementGroup(placementGroup); + } + + /** + * @see AWSRunInstancesOptions#enableMonitoring() + */ + public static AWSRunInstancesOptions enableMonitoring() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.enableMonitoring(); + } + + /** + * @see AWSRunInstancesOptions#withSubnetId(String) + */ + public static AWSRunInstancesOptions withSubnetId(String subnetId) { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.withSubnetId(subnetId); + } + + /** + * @see AWSRunInstancesOptions#withKeyName(String) + */ + public static AWSRunInstancesOptions withKeyName(String keyName) { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.withKeyName(keyName); + } + + /** + * @see AWSRunInstancesOptions#withSecurityGroup(String) + */ + public static AWSRunInstancesOptions withSecurityGroup(String securityGroup) { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.withSecurityGroup(securityGroup); + } + + /** + * @see AWSRunInstancesOptions#withUserData(byte []) + */ + public static AWSRunInstancesOptions withUserData(byte[] unencodedData) { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.withUserData(unencodedData); + } + + /** + * @see AWSRunInstancesOptions#asType(InstanceType) + */ + public static AWSRunInstancesOptions asType(String instanceType) { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.asType(instanceType); + } + + /** + * @see AWSRunInstancesOptions#withKernelId(String) + */ + public static AWSRunInstancesOptions withKernelId(String kernelId) { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.withKernelId(kernelId); + } + + /** + * @see AWSRunInstancesOptions#withRamdisk(String) + */ + public static AWSRunInstancesOptions withRamdisk(String ramdiskId) { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.withRamdisk(ramdiskId); + } + + /** + * @see AWSRunInstancesOptions#withBlockDeviceMappings(Set mappings) + */ + public static AWSRunInstancesOptions withBlockDeviceMappings(Set mappings) { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + return options.withBlockDeviceMappings(mappings); + } + + } + + @Override + public AWSRunInstancesOptions withBlockDeviceMappings(Set mappings) { + return AWSRunInstancesOptions.class.cast(super.withBlockDeviceMappings(mappings)); + } + + @Override + public AWSRunInstancesOptions withKernelId(String kernelId) { + return AWSRunInstancesOptions.class.cast(super.withKernelId(kernelId)); + } + + @Override + public AWSRunInstancesOptions withKeyName(String keyName) { + return AWSRunInstancesOptions.class.cast(super.withKeyName(keyName)); + } + + @Override + public AWSRunInstancesOptions withRamdisk(String ramDiskId) { + return AWSRunInstancesOptions.class.cast(super.withRamdisk(ramDiskId)); + } + + @Override + public AWSRunInstancesOptions withSecurityGroup(String securityGroup) { + return AWSRunInstancesOptions.class.cast(super.withSecurityGroup(securityGroup)); + } + + @Override + public AWSRunInstancesOptions withSecurityGroups(Iterable securityGroups) { + return AWSRunInstancesOptions.class.cast(super.withSecurityGroups(securityGroups)); + } + + @Override + public AWSRunInstancesOptions withSecurityGroups(String... securityGroups) { + return AWSRunInstancesOptions.class.cast(super.withSecurityGroups(securityGroups)); + } + + @Override + public AWSRunInstancesOptions withUserData(byte[] unencodedData) { + return AWSRunInstancesOptions.class.cast(super.withUserData(unencodedData)); + } + + @Override + public AWSRunInstancesOptions asType(String type) { + return AWSRunInstancesOptions.class.cast(super.asType(type)); + } +} diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/predicates/PlacementGroupAvailable.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupAvailable.java similarity index 90% rename from apis/ec2/src/main/java/org/jclouds/ec2/predicates/PlacementGroupAvailable.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupAvailable.java index 21ebc2057c..9acdd978cd 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/predicates/PlacementGroupAvailable.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupAvailable.java @@ -17,15 +17,15 @@ * ==================================================================== */ -package org.jclouds.ec2.predicates; +package org.jclouds.aws.ec2.predicates; import java.util.NoSuchElementException; import javax.annotation.Resource; import javax.inject.Singleton; -import org.jclouds.ec2.EC2Client; -import org.jclouds.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.AWSEC2Client; +import org.jclouds.aws.ec2.domain.PlacementGroup; import org.jclouds.logging.Logger; import org.jclouds.rest.ResourceNotFoundException; @@ -41,13 +41,13 @@ import com.google.inject.Inject; @Singleton public class PlacementGroupAvailable implements Predicate { - private final EC2Client client; + private final AWSEC2Client client; @Resource protected Logger logger = Logger.NULL; @Inject - public PlacementGroupAvailable(EC2Client client) { + public PlacementGroupAvailable(AWSEC2Client client) { this.client = client; } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/predicates/PlacementGroupDeleted.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupDeleted.java similarity index 89% rename from apis/ec2/src/main/java/org/jclouds/ec2/predicates/PlacementGroupDeleted.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupDeleted.java index e3cfa0bfdd..b8e6c86564 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/predicates/PlacementGroupDeleted.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/predicates/PlacementGroupDeleted.java @@ -17,15 +17,15 @@ * ==================================================================== */ -package org.jclouds.ec2.predicates; +package org.jclouds.aws.ec2.predicates; import java.util.NoSuchElementException; import javax.annotation.Resource; import javax.inject.Singleton; -import org.jclouds.ec2.EC2Client; -import org.jclouds.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.AWSEC2Client; +import org.jclouds.aws.ec2.domain.PlacementGroup; import org.jclouds.logging.Logger; import com.google.common.base.Predicate; @@ -40,13 +40,13 @@ import com.google.inject.Inject; @Singleton public class PlacementGroupDeleted implements Predicate { - private final EC2Client client; + private final AWSEC2Client client; @Resource protected Logger logger = Logger.NULL; @Inject - public PlacementGroupDeleted(EC2Client client) { + public PlacementGroupDeleted(AWSEC2Client client) { this.client = client; } diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/reference/AWSEC2Constants.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/reference/AWSEC2Constants.java new file mode 100644 index 0000000000..a410666c32 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/reference/AWSEC2Constants.java @@ -0,0 +1,58 @@ +/** + * + * 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.aws.ec2.reference; + +/** + * + * 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. + * ==================================================================== + */ + +import org.jclouds.ec2.domain.InstanceType; +import org.jclouds.ec2.reference.EC2Constants; + +/** + * Configuration properties and constants used in EC2 connections. + * + * @author Adrian Cole + */ +public interface AWSEC2Constants extends EC2Constants { + + /** + * amis that work on the cluster instance type + * + * @see InstanceType.CC1_4XLARGE + */ + public static final String PROPERTY_EC2_CC_AMIs = "jclouds.ec2.cc-amis"; + +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClient.java new file mode 100644 index 0000000000..9962e31246 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClient.java @@ -0,0 +1,94 @@ +/** + * + * 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.aws.ec2.services; + +import static org.jclouds.aws.reference.FormParameters.ACTION; +import static org.jclouds.aws.reference.FormParameters.VERSION; + +import java.util.Set; + +import javax.annotation.Nullable; +import javax.ws.rs.FormParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; + +import org.jclouds.aws.ec2.AWSEC2AsyncClient; +import org.jclouds.aws.ec2.xml.ProductCodesHandler; +import org.jclouds.aws.filters.FormSigner; +import org.jclouds.ec2.binders.BindProductCodesToIndexedFormParams; +import org.jclouds.ec2.services.AMIAsyncClient; +import org.jclouds.ec2.services.AMIClient; +import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull; +import org.jclouds.rest.annotations.BinderParam; +import org.jclouds.rest.annotations.EndpointParam; +import org.jclouds.rest.annotations.FormParams; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.VirtualHost; +import org.jclouds.rest.annotations.XMLResponseParser; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Provides access to AMI Services. + *

+ * + * @author Adrian Cole + */ +@RequestFilters(FormSigner.class) +@FormParams(keys = VERSION, values = AWSEC2AsyncClient.VERSION) +@VirtualHost +public interface AWSAMIAsyncClient extends AMIAsyncClient { + // TODO make AWSImage as it has product codes... + + /** + * @see AMIClient#getProductCodesForImageInRegion + */ + @POST + @Path("/") + @FormParams(keys = { ACTION, "Attribute" }, values = { "DescribeImageAttribute", "productCodes" }) + @XMLResponseParser(ProductCodesHandler.class) + ListenableFuture> getProductCodesForImageInRegion( + @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, + @FormParam("ImageId") String imageId); + + /** + * @see AMIClient#addProductCodesToImageInRegion + */ + @POST + @Path("/") + @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "add", + "productCodes" }) + ListenableFuture addProductCodesToImageInRegion( + @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, + @BinderParam(BindProductCodesToIndexedFormParams.class) Iterable productCodes, + @FormParam("ImageId") String imageId); + + /** + * @see AMIClient#removeProductCodesToImageInRegion + */ + @POST + @Path("/") + @FormParams(keys = { ACTION, "OperationType", "Attribute" }, values = { "ModifyImageAttribute", "remove", + "productCodes" }) + ListenableFuture removeProductCodesFromImageInRegion( + @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, + @BinderParam(BindProductCodesToIndexedFormParams.class) Iterable productCodes, + @FormParam("ImageId") String imageId); +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIClient.java new file mode 100644 index 0000000000..aa66609d9a --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSAMIClient.java @@ -0,0 +1,94 @@ +/** + * + * 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.aws.ec2.services; + +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nullable; + +import org.jclouds.concurrent.Timeout; +import org.jclouds.ec2.options.DescribeImagesOptions; +import org.jclouds.ec2.services.AMIClient; + +/** + * Provides access to EC2 via their REST API. + *

+ * + * @author Adrian Cole + */ +@Timeout(duration = 45, timeUnit = TimeUnit.SECONDS) +public interface AWSAMIClient extends AMIClient{ + + + /** + * Returns the Product Codes of an image. + * + * @param region + * AMIs are tied to the Region where its files are located within Amazon S3. + * @param imageId + * The ID of the AMI for which an attribute will be described + * @see #describeImages + * @see #modifyImageAttribute + * @see #resetImageAttribute + * @see + * @see DescribeImagesOptions + */ + Set getProductCodesForImageInRegion(@Nullable String region, String imageId); + + + /** + * Adds {@code productCode}s to an AMI. + * + * @param region + * AMIs are tied to the Region where its files are located within Amazon S3. + * @param productCodes + * Product Codes + * @param imageId + * The AMI ID. + * + * @see #removeProductCodesFromImage + * @see #describeImageAttribute + * @see #resetImageAttribute + * @see + */ + void addProductCodesToImageInRegion(@Nullable String region, Iterable productCodes, String imageId); + + /** + * Removes {@code productCode}s from an AMI. + * + * @param region + * AMIs are tied to the Region where its files are located within Amazon S3. + * @param productCodes + * Product Codes + * @param imageId + * The AMI ID. + * + * @see #addProductCodesToImage + * @see #describeImageAttribute + * @see #resetImageAttribute + * @see + */ + void removeProductCodesFromImageInRegion(@Nullable String region, Iterable productCodes, + String imageId); +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClient.java new file mode 100644 index 0000000000..f01ecedbfd --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClient.java @@ -0,0 +1,92 @@ +/** + * + * 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.aws.ec2.services; + +import static org.jclouds.aws.reference.FormParameters.ACTION; +import static org.jclouds.aws.reference.FormParameters.VERSION; + +import java.util.Set; + +import javax.annotation.Nullable; +import javax.ws.rs.FormParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; + +import org.jclouds.aws.ec2.AWSEC2AsyncClient; +import org.jclouds.aws.ec2.domain.AWSRunningInstance; +import org.jclouds.aws.ec2.xml.AWSDescribeInstancesResponseHandler; +import org.jclouds.aws.ec2.xml.AWSRunInstancesResponseHandler; +import org.jclouds.aws.filters.FormSigner; +import org.jclouds.ec2.binders.BindInstanceIdsToIndexedFormParams; +import org.jclouds.ec2.binders.IfNotNullBindAvailabilityZoneToFormParam; +import org.jclouds.ec2.domain.Reservation; +import org.jclouds.ec2.options.RunInstancesOptions; +import org.jclouds.ec2.services.InstanceAsyncClient; +import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull; +import org.jclouds.rest.annotations.BinderParam; +import org.jclouds.rest.annotations.EndpointParam; +import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.rest.annotations.FormParams; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.VirtualHost; +import org.jclouds.rest.annotations.XMLResponseParser; +import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Provides access to EC2 Instance Services via their REST API. + *

+ * + * @author Adrian Cole + */ +@RequestFilters(FormSigner.class) +@FormParams(keys = VERSION, values = AWSEC2AsyncClient.VERSION) +@VirtualHost +public interface AWSInstanceAsyncClient extends InstanceAsyncClient { + + /** + * @see AWSInstanceClient#describeInstancesInRegion + */ + @Override + @POST + @Path("/") + @FormParams(keys = ACTION, values = "DescribeInstances") + @XMLResponseParser(AWSDescribeInstancesResponseHandler.class) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture>> describeInstancesInRegion( + @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, + @BinderParam(BindInstanceIdsToIndexedFormParams.class) String... instanceIds); + + /** + * @see AWSInstanceClient#runInstancesInRegion + */ + @Override + @POST + @Path("/") + @FormParams(keys = ACTION, values = "RunInstances") + @XMLResponseParser(AWSRunInstancesResponseHandler.class) + ListenableFuture> runInstancesInRegion( + @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, + @Nullable @BinderParam(IfNotNullBindAvailabilityZoneToFormParam.class) String nullableAvailabilityZone, + @FormParam("ImageId") String imageId, @FormParam("MinCount") int minCount, + @FormParam("MaxCount") int maxCount, RunInstancesOptions... options); + +} diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceClient.java new file mode 100644 index 0000000000..185fb04567 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/AWSInstanceClient.java @@ -0,0 +1,51 @@ +/** + * + * 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.aws.ec2.services; + +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nullable; + +import org.jclouds.aws.ec2.domain.AWSRunningInstance; +import org.jclouds.concurrent.Timeout; +import org.jclouds.ec2.domain.Reservation; +import org.jclouds.ec2.options.RunInstancesOptions; +import org.jclouds.ec2.services.InstanceClient; + +/** + * Provides access to EC2 via their REST API. + *

+ * + * @author Adrian Cole + */ +@Timeout(duration = 90, timeUnit = TimeUnit.SECONDS) +public interface AWSInstanceClient extends InstanceClient { + + @Override + Set> describeInstancesInRegion(@Nullable String region, + String... instanceIds); + + @Override + Reservation runInstancesInRegion(@Nullable String region, + @Nullable String nullableAvailabilityZone, String imageId, int minCount, int maxCount, + RunInstancesOptions... options); + +} diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/services/MonitoringAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringAsyncClient.java similarity index 95% rename from apis/ec2/src/main/java/org/jclouds/ec2/services/MonitoringAsyncClient.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringAsyncClient.java index 6e3264d3c1..0c42604f61 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/services/MonitoringAsyncClient.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringAsyncClient.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.services; +package org.jclouds.aws.ec2.services; import static org.jclouds.aws.reference.FormParameters.ACTION; import static org.jclouds.aws.reference.FormParameters.VERSION; @@ -29,11 +29,11 @@ import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; +import org.jclouds.aws.ec2.domain.MonitoringState; +import org.jclouds.aws.ec2.xml.MonitoringStateHandler; import org.jclouds.aws.filters.FormSigner; import org.jclouds.ec2.EC2AsyncClient; import org.jclouds.ec2.binders.BindInstanceIdsToIndexedFormParams; -import org.jclouds.ec2.domain.MonitoringState; -import org.jclouds.ec2.xml.MonitoringStateHandler; import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull; import org.jclouds.rest.annotations.BinderParam; import org.jclouds.rest.annotations.EndpointParam; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/services/MonitoringClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringClient.java similarity index 94% rename from apis/ec2/src/main/java/org/jclouds/ec2/services/MonitoringClient.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringClient.java index a9b11bfae5..2b272216fb 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/services/MonitoringClient.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/MonitoringClient.java @@ -17,14 +17,15 @@ * ==================================================================== */ -package org.jclouds.ec2.services; +package org.jclouds.aws.ec2.services; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; -import org.jclouds.ec2.domain.MonitoringState; +import org.jclouds.ec2.services.InstanceClient; +import org.jclouds.aws.ec2.domain.MonitoringState; import org.jclouds.concurrent.Timeout; /** diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/services/PlacementGroupAsyncClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClient.java similarity index 96% rename from apis/ec2/src/main/java/org/jclouds/ec2/services/PlacementGroupAsyncClient.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClient.java index a5f431cf88..45adce9236 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/services/PlacementGroupAsyncClient.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClient.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.services; +package org.jclouds.aws.ec2.services; import static org.jclouds.aws.reference.FormParameters.ACTION; import static org.jclouds.aws.reference.FormParameters.VERSION; @@ -29,11 +29,11 @@ import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.xml.DescribePlacementGroupsResponseHandler; import org.jclouds.aws.filters.FormSigner; import org.jclouds.ec2.EC2AsyncClient; import org.jclouds.ec2.binders.BindGroupNamesToIndexedFormParams; -import org.jclouds.ec2.domain.PlacementGroup; -import org.jclouds.ec2.xml.DescribePlacementGroupsResponseHandler; import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull; import org.jclouds.rest.annotations.BinderParam; import org.jclouds.rest.annotations.EndpointParam; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/services/PlacementGroupClient.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupClient.java similarity index 97% rename from apis/ec2/src/main/java/org/jclouds/ec2/services/PlacementGroupClient.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupClient.java index 4e07ee137c..b02357839a 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/services/PlacementGroupClient.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/services/PlacementGroupClient.java @@ -17,14 +17,14 @@ * ==================================================================== */ -package org.jclouds.ec2.services; +package org.jclouds.aws.ec2.services; import java.util.Set; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; -import org.jclouds.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.domain.PlacementGroup; import org.jclouds.concurrent.Timeout; /** diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/AWSDescribeInstancesResponseHandler.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/AWSDescribeInstancesResponseHandler.java new file mode 100644 index 0000000000..40553a7302 --- /dev/null +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/AWSDescribeInstancesResponseHandler.java @@ -0,0 +1,71 @@ +/** + * + * 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.aws.ec2.xml; + +import java.util.Set; + +import javax.inject.Inject; + +import org.jclouds.date.DateService; +import org.jclouds.ec2.domain.Reservation; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.ec2.domain.RunningInstance.Builder; +import org.jclouds.location.Region; + +import com.google.common.collect.Sets; +import com.google.inject.Provider; + +/** + * Parses the following XML document: + *

+ * DescribeImagesResponse xmlns="http: + * + * @author Adrian Cole + * @see + * RunInstancesResponse xmlns="http: + * + * @author Adrian Cole + * @see extends BaseReservationHandler { + + public BaseAWSReservationHandler(DateService dateService, String defaultRegion, Provider builderProvider) { + super(dateService, defaultRegion, builderProvider); + } + + protected String currentOrNull() { + String returnVal = currentText.toString().trim(); + return returnVal.equals("") ? null : returnVal; + } + + public void endElement(String uri, String name, String qName) { + if (qName.equals("state")) { + builder().monitoringState(MonitoringState.fromValue(currentOrNull())); + } else if (qName.equals("groupName")) { + builder().placementGroup(currentOrNull()); + } else if (qName.equals("subnetId")) { + builder().subnetId(currentOrNull()); + } else if (qName.equals("spotInstanceRequestId")) { + builder().spotInstanceRequestId(currentOrNull()); + } else if (qName.equals("vpcId")) { + builder().vpcId(currentOrNull()); + } else if (qName.equals("productCode")) { + builder().productCode(currentOrNull()); + } + super.endElement(uri, name, qName); + } + + @Override + protected AWSRunningInstance.Builder builder() { + return AWSRunningInstance.Builder.class.cast(builder); + } + + public void characters(char ch[], int start, int length) { + super.characters(ch, start, length); + } + +} diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribePlacementGroupsResponseHandler.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/DescribePlacementGroupsResponseHandler.java similarity index 96% rename from apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribePlacementGroupsResponseHandler.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/DescribePlacementGroupsResponseHandler.java index 38f6484a45..7596b05957 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribePlacementGroupsResponseHandler.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/DescribePlacementGroupsResponseHandler.java @@ -17,13 +17,13 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import java.util.Set; import javax.inject.Inject; -import org.jclouds.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.domain.PlacementGroup; import org.jclouds.http.HttpRequest; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax.HandlerWithResult; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeReservedInstancesOfferingResponseHandler.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/DescribeReservedInstancesOfferingResponseHandler.java similarity index 98% rename from apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeReservedInstancesOfferingResponseHandler.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/DescribeReservedInstancesOfferingResponseHandler.java index 9b3f2b1590..c036d71c47 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/DescribeReservedInstancesOfferingResponseHandler.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/DescribeReservedInstancesOfferingResponseHandler.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import java.util.Set; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/MonitoringStateHandler.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/MonitoringStateHandler.java similarity index 95% rename from apis/ec2/src/main/java/org/jclouds/ec2/xml/MonitoringStateHandler.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/MonitoringStateHandler.java index cfa7e8ec60..9e6e6626b6 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/MonitoringStateHandler.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/MonitoringStateHandler.java @@ -17,11 +17,11 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import java.util.Map; -import org.jclouds.ec2.domain.MonitoringState; +import org.jclouds.aws.ec2.domain.MonitoringState; import org.jclouds.http.functions.ParseSax; import com.google.common.collect.Maps; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/PlacementGroupHandler.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/PlacementGroupHandler.java similarity index 94% rename from apis/ec2/src/main/java/org/jclouds/ec2/xml/PlacementGroupHandler.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/PlacementGroupHandler.java index ce2cc6cf66..e466204b6c 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/PlacementGroupHandler.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/PlacementGroupHandler.java @@ -17,12 +17,12 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import javax.inject.Inject; -import org.jclouds.ec2.domain.PlacementGroup; -import org.jclouds.ec2.domain.PlacementGroup.State; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.domain.PlacementGroup.State; import org.jclouds.aws.util.AWSUtils; import org.jclouds.date.DateService; import org.jclouds.http.functions.ParseSax; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/ProductCodesHandler.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/ProductCodesHandler.java similarity index 98% rename from apis/ec2/src/main/java/org/jclouds/ec2/xml/ProductCodesHandler.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/ProductCodesHandler.java index 820fe74ad1..6f9e76722d 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/ProductCodesHandler.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/ProductCodesHandler.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import java.util.Set; diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/xml/ReservedInstancesOfferingHandler.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/ReservedInstancesOfferingHandler.java similarity index 99% rename from apis/ec2/src/main/java/org/jclouds/ec2/xml/ReservedInstancesOfferingHandler.java rename to providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/ReservedInstancesOfferingHandler.java index f29c1fb567..c09d409b4b 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/xml/ReservedInstancesOfferingHandler.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/xml/ReservedInstancesOfferingHandler.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import javax.inject.Inject; diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/AWSEC2AsyncClientTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/AWSEC2AsyncClientTest.java new file mode 100644 index 0000000000..d17725be56 --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/AWSEC2AsyncClientTest.java @@ -0,0 +1,91 @@ +/** + * + * 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.aws.ec2; + +import java.io.IOException; +import java.util.concurrent.ExecutionException; + +import org.jclouds.aws.ec2.services.BaseAWSEC2AsyncClientTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.internal.RestAnnotationProcessor; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import com.google.inject.TypeLiteral; + +/** + * Tests behavior of {@code AWSEC2AsyncClient} + * + * @author Adrian Cole + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +@Test(groups = "unit", testName = "AWSEC2AsyncClientTest") +public class AWSEC2AsyncClientTest extends BaseAWSEC2AsyncClientTest { + + private AWSEC2AsyncClient asyncClient; + private AWSEC2Client syncClient; + + public void testSync() throws SecurityException, NoSuchMethodException, InterruptedException, ExecutionException { + assert syncClient.getAMIServices() != null; + assert syncClient.getAvailabilityZoneAndRegionServices() != null; + assert syncClient.getElasticBlockStoreServices() != null; + assert syncClient.getElasticIPAddressServices() != null; + assert syncClient.getInstanceServices() != null; + assert syncClient.getKeyPairServices() != null; + assert syncClient.getMonitoringServices() != null; + assert syncClient.getSecurityGroupServices() != null; + assert syncClient.getPlacementGroupServices() != null; + assert syncClient.getWindowsServices() != null; + + } + + public void testAsync() throws SecurityException, NoSuchMethodException, InterruptedException, ExecutionException { + assert asyncClient.getAMIServices() != null; + assert asyncClient.getAvailabilityZoneAndRegionServices() != null; + assert asyncClient.getElasticBlockStoreServices() != null; + assert asyncClient.getElasticIPAddressServices() != null; + assert asyncClient.getInstanceServices() != null; + assert asyncClient.getKeyPairServices() != null; + assert asyncClient.getMonitoringServices() != null; + assert asyncClient.getSecurityGroupServices() != null; + assert asyncClient.getPlacementGroupServices() != null; + assert asyncClient.getWindowsServices() != null; + } + + @Override + protected TypeLiteral> createTypeLiteral() { + return new TypeLiteral>() { + }; + } + + @BeforeClass + @Override + protected void setupFactory() throws IOException { + super.setupFactory(); + asyncClient = injector.getInstance(AWSEC2AsyncClient.class); + syncClient = injector.getInstance(AWSEC2Client.class); + } + + @Override + protected void checkFilters(HttpRequest request) { + + } + +} diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java index bf214e6507..aa4327621f 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java @@ -19,9 +19,30 @@ package org.jclouds.aws.ec2.compute; +import static org.testng.Assert.assertEquals; + +import java.util.Set; + +import org.jclouds.aws.ec2.domain.AWSRunningInstance; +import org.jclouds.aws.ec2.domain.MonitoringState; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.compute.predicates.NodePredicates; +import org.jclouds.domain.Credentials; +import org.jclouds.ec2.EC2Client; import org.jclouds.ec2.compute.EC2ComputeServiceLiveTest; +import org.jclouds.ec2.domain.IpProtocol; +import org.jclouds.ec2.domain.KeyPair; +import org.jclouds.ec2.domain.SecurityGroup; +import org.jclouds.ec2.services.InstanceClient; +import org.jclouds.ec2.services.KeyPairClient; +import org.jclouds.ec2.services.SecurityGroupClient; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; + /** * * @author Adrian Cole @@ -34,4 +55,149 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest { tag = "ec2"; } + @Override + @Test(enabled = true, dependsOnMethods = "testCompareSizes") + public void testExtendedOptionsAndLogin() throws Exception { + SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getSecurityGroupServices(); + + KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getKeyPairServices(); + + InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getInstanceServices(); + + String tag = this.tag + "o"; + + TemplateOptions options = client.templateOptions(); + + // Date before = new Date(); + + options.as(AWSEC2TemplateOptions.class).securityGroups(tag); + options.as(AWSEC2TemplateOptions.class).keyPair(tag); + options.as(AWSEC2TemplateOptions.class).enableMonitoring(); + + String startedId = null; + try { + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + + // create a security group that allows ssh in so that our scripts later + // will work + securityGroupClient.createSecurityGroupInRegion(null, tag, tag); + securityGroupClient.authorizeSecurityGroupIngressInRegion(null, tag, IpProtocol.TCP, 22, 22, "0.0.0.0/0"); + + // create a keypair to pass in as well + KeyPair result = keyPairClient.createKeyPairInRegion(null, tag); + + Set nodes = client.runNodesWithTag(tag, 1, options); + NodeMetadata first = Iterables.get(nodes, 0); + assert first.getCredentials() != null : first; + assert first.getCredentials().identity != null : first; + + startedId = Iterables.getOnlyElement(nodes).getProviderId(); + + AWSRunningInstance instance = AWSRunningInstance.class.cast(getInstance(instanceClient, startedId)); + + assertEquals(instance.getKeyName(), tag); + assertEquals(instance.getMonitoringState(), MonitoringState.ENABLED); + + // TODO when the cloudwatchclient is finished + + // RestContext monitoringContext = new + // RestContextFactory().createContext( + // "cloudwatch", identity, credential, ImmutableSet. of(new Log4JLoggingModule())); + // + // try { + // Set datapoints = + // monitoringContext.getApi().getMetricStatisticsInRegion(instance.getRegion(), + // "CPUUtilization", before, new Date(), 60, "Average"); + // assert datapoints != null; + // } finally { + // monitoringContext.close(); + // } + + // make sure we made our dummy group and also let in the user's group + 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())); + 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())); + + } finally { + client.destroyNodesMatching(NodePredicates.withTag(tag)); + if (startedId != null) { + // ensure we didn't delete these resources! + assertEquals(keyPairClient.describeKeyPairsInRegion(null, tag).size(), 1); + assertEquals(securityGroupClient.describeSecurityGroupsInRegion(null, tag).size(), 1); + } + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + } + + } + @Test(enabled = true, dependsOnMethods = "testCompareSizes") + public void testExtendedOptionsWithSubnetId() throws Exception { + + String subnetId = System.getProperty("test.subnetId"); + if (subnetId == null) { + // Skip test and return + return; + } + SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getSecurityGroupServices(); + + KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getKeyPairServices(); + + InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getInstanceServices(); + + String tag = this.tag + "g"; + + TemplateOptions options = client.templateOptions(); + + // options.as(AWSEC2TemplateOptions.class).securityGroups(tag); + options.as(AWSEC2TemplateOptions.class).keyPair(tag); + options.as(AWSEC2TemplateOptions.class).subnetId(subnetId); + + String startedId = null; + String nodeId = null; + try { + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + + // create the security group + // securityGroupClient.createSecurityGroupInRegion(null, tag, tag); + + // create a keypair to pass in as well + keyPairClient.createKeyPairInRegion(null, tag); + + Set nodes = client.runNodesWithTag(tag, 1, options); + + NodeMetadata first = Iterables.get(nodes, 0); + assert first.getCredentials() != null : first; + assert first.getCredentials().identity != null : first; + + startedId = Iterables.getOnlyElement(nodes).getProviderId(); + nodeId = Iterables.getOnlyElement(nodes).getId(); + + AWSRunningInstance instance = AWSRunningInstance.class.cast(getInstance(instanceClient, startedId)); + + assertEquals(instance.getSubnetId(), subnetId); + + } finally { + if (nodeId != null) + client.destroyNode(nodeId); + if (startedId != null) { + // ensure we didn't delete these resources! + assertEquals(keyPairClient.describeKeyPairsInRegion(null, tag).size(), 1); + } + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + } + } + } diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java index e0267fbf55..55617fb968 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java @@ -58,8 +58,8 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { @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]")); + (input.family == OsFamily.CENTOS && !input.version.matches("5.[42]")) || // + (input.family == OsFamily.WINDOWS && !input.version.matches("200[38]")); } }; @@ -69,13 +69,13 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { public void testTemplateBuilderM1SMALLWithDescription() { Template template = context.getComputeService().templateBuilder().hardwareId(InstanceType.M1_SMALL) - .osVersionMatches("10.10").imageDescriptionMatches("ubuntu-images").osFamily(OsFamily.UBUNTU).build(); + .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(), "20110122"); + assertEquals(template.getImage().getVersion(), "20110126"); assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store"); assertEquals(template.getLocation().getId(), "us-east-1"); assertEquals(getCores(template.getHardware()), 1.0d); @@ -86,8 +86,8 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { @Test public void testTemplateBuilderCanUseImageIdAndhardwareId() { - Template template = context.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; @@ -119,11 +119,12 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { @Test public void testTemplateBuilderMicro() throws IOException { - Template microTemplate = context.getComputeService().templateBuilder().hardwareId(InstanceType.T1_MICRO).build(); + Template microTemplate = context.getComputeService().templateBuilder().hardwareId(InstanceType.T1_MICRO) + .osFamily(OsFamily.UBUNTU).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().getVersion(), "10.04"); + assertEquals(microTemplate.getImage().getOperatingSystem().is64Bit(), true); assertEquals(microTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); assertEquals(microTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs"); assertEquals(microTemplate.getLocation().getId(), "us-east-1"); @@ -139,8 +140,8 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { // set owners to nothing overrides.setProperty(EC2Constants.PROPERTY_EC2_AMI_OWNERS, ""); - context = new ComputeServiceContextFactory().createContext(provider, - ImmutableSet. of(new Log4JLoggingModule()), overrides); + context = new ComputeServiceContextFactory().createContext(provider, ImmutableSet + . of(new Log4JLoggingModule()), overrides); assertEquals(context.getComputeService().listImages().size(), 0); diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/options/AWSEC2TemplateOptionsTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/options/AWSEC2TemplateOptionsTest.java new file mode 100644 index 0000000000..1445940736 --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/options/AWSEC2TemplateOptionsTest.java @@ -0,0 +1,313 @@ +/** + * + * 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.aws.ec2.compute.options; + +import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.authorizePublicKey; +import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.blockOnPort; +import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.enableMonitoring; +import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.inboundPorts; +import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.installPrivateKey; +import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.keyPair; +import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.noKeyPair; +import static org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions.Builder.securityGroups; +import static org.testng.Assert.assertEquals; + +import java.io.IOException; + +import org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions; +import org.jclouds.compute.options.TemplateOptions; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; + +/** + * Tests possible uses of AWSEC2TemplateOptions and AWSEC2TemplateOptions.Builder.* + * + * @author Adrian Cole + */ +public class AWSEC2TemplateOptionsTest { + + public void testAs() { + TemplateOptions options = new AWSEC2TemplateOptions(); + assertEquals(options.as(AWSEC2TemplateOptions.class), options); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testsecurityGroupsIterableBadFormat() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.securityGroups(ImmutableSet.of("group1", "")); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testsecurityGroupsIterableEmptyNotOk() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.securityGroups(ImmutableSet. of()); + } + + @Test + public void testsecurityGroupsIterable() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.securityGroups(ImmutableSet.of("group1", "group2")); + assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); + + } + + @Test + public void testsecurityGroupsIterableStatic() { + AWSEC2TemplateOptions options = securityGroups(ImmutableSet.of("group1", "group2")); + assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testsecurityGroupsVarArgsBadFormat() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.securityGroups("mygroup", ""); + } + + @Test + public void testsecurityGroupsVarArgs() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.securityGroups("group1", "group2"); + assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); + + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testsecurityGroupsVarArgsEmptyNotOk() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.securityGroups(); + } + + @Test + public void testDefaultGroupsVarArgsEmpty() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + assertEquals(options.getGroupIds(), ImmutableSet.of()); + } + + @Test + public void testsecurityGroupsVarArgsStatic() { + AWSEC2TemplateOptions options = securityGroups("group1", "group2"); + assertEquals(options.getGroupIds(), ImmutableSet.of("group1", "group2")); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testkeyPairBadFormat() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.keyPair(""); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testkeyPairAndNoKeyPair() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.keyPair("mykeypair"); + options.noKeyPair(); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testNoKeyPairAndKeyPair() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.noKeyPair(); + options.keyPair("mykeypair"); + } + + @Test + public void testkeyPair() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.keyPair("mykeypair"); + assertEquals(options.getKeyPair(), "mykeypair"); + } + + @Test + public void testNullkeyPair() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + assertEquals(options.getKeyPair(), null); + } + + @Test + public void testkeyPairStatic() { + AWSEC2TemplateOptions options = keyPair("mykeypair"); + assertEquals(options.getKeyPair(), "mykeypair"); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testkeyPairNPE() { + keyPair(null); + } + + @Test + public void testnoKeyPair() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.noKeyPair(); + assertEquals(options.getKeyPair(), null); + assert !options.shouldAutomaticallyCreateKeyPair(); + } + + @Test + public void testFalsenoKeyPair() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + assertEquals(options.getKeyPair(), null); + assert options.shouldAutomaticallyCreateKeyPair(); + } + + @Test + public void testnoKeyPairStatic() { + AWSEC2TemplateOptions options = noKeyPair(); + assertEquals(options.getKeyPair(), null); + assert !options.shouldAutomaticallyCreateKeyPair(); + } + + @Test + public void testMonitoringEnabledDefault() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + assert !options.isMonitoringEnabled(); + } + + @Test + public void testMonitoringEnabled() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.enableMonitoring(); + assert options.isMonitoringEnabled(); + } + + @Test + public void testEnableMonitoringStatic() { + AWSEC2TemplateOptions options = enableMonitoring(); + assertEquals(options.getKeyPair(), null); + assert options.isMonitoringEnabled(); + } + + // superclass tests + @Test(expectedExceptions = IllegalArgumentException.class) + public void testinstallPrivateKeyBadFormat() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.installPrivateKey("whompy"); + } + + @Test + public void testinstallPrivateKey() throws IOException { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.installPrivateKey("-----BEGIN RSA PRIVATE KEY-----"); + assertEquals(options.getPrivateKey(), "-----BEGIN RSA PRIVATE KEY-----"); + } + + @Test + public void testNullinstallPrivateKey() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + assertEquals(options.getPrivateKey(), null); + } + + @Test + public void testinstallPrivateKeyStatic() throws IOException { + AWSEC2TemplateOptions options = installPrivateKey("-----BEGIN RSA PRIVATE KEY-----"); + assertEquals(options.getPrivateKey(), "-----BEGIN RSA PRIVATE KEY-----"); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testinstallPrivateKeyNPE() { + installPrivateKey(null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testauthorizePublicKeyBadFormat() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.authorizePublicKey("whompy"); + } + + @Test + public void testauthorizePublicKey() throws IOException { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.authorizePublicKey("ssh-rsa"); + assertEquals(options.getPublicKey(), "ssh-rsa"); + } + + @Test + public void testNullauthorizePublicKey() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + assertEquals(options.getPublicKey(), null); + } + + @Test + public void testauthorizePublicKeyStatic() throws IOException { + AWSEC2TemplateOptions options = authorizePublicKey("ssh-rsa"); + assertEquals(options.getPublicKey(), "ssh-rsa"); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testauthorizePublicKeyNPE() { + authorizePublicKey(null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testblockOnPortBadFormat() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.blockOnPort(-1, -1); + } + + @Test + public void testblockOnPort() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.blockOnPort(22, 30); + assertEquals(options.getPort(), 22); + assertEquals(options.getSeconds(), 30); + + } + + @Test + public void testNullblockOnPort() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + assertEquals(options.getPort(), -1); + assertEquals(options.getSeconds(), -1); + } + + @Test + public void testblockOnPortStatic() { + AWSEC2TemplateOptions options = blockOnPort(22, 30); + assertEquals(options.getPort(), 22); + assertEquals(options.getSeconds(), 30); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testinboundPortsBadFormat() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.inboundPorts(-1, -1); + } + + @Test + public void testinboundPorts() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + options.inboundPorts(22, 30); + assertEquals(options.getInboundPorts()[0], 22); + assertEquals(options.getInboundPorts()[1], 30); + + } + + @Test + public void testDefaultOpen22() { + AWSEC2TemplateOptions options = new AWSEC2TemplateOptions(); + assertEquals(options.getInboundPorts()[0], 22); + } + + @Test + public void testinboundPortsStatic() { + AWSEC2TemplateOptions options = inboundPorts(22, 30); + assertEquals(options.getInboundPorts()[0], 22); + assertEquals(options.getInboundPorts()[1], 30); + } +} diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/strategy/AWSEC2ImageParserTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java similarity index 98% rename from providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/strategy/AWSEC2ImageParserTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java index 2de043d677..bcff702c96 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/strategy/AWSEC2ImageParserTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java @@ -17,13 +17,14 @@ * ==================================================================== */ -package org.jclouds.aws.ec2.strategy; +package org.jclouds.aws.ec2.compute.strategy; import static org.testng.Assert.assertEquals; import java.util.Map; import java.util.Set; +import org.jclouds.aws.ec2.compute.strategy.AWSEC2ReviseParsedImage; import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystemBuilder; diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java similarity index 71% rename from apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java index b023e570d0..244f481b2a 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.compute.strategy; +package org.jclouds.aws.ec2.compute.strategy; import static org.easymock.EasyMock.expect; import static org.easymock.classextension.EasyMock.createMock; @@ -29,7 +29,13 @@ import java.lang.reflect.Method; import java.util.Map; import java.util.Set; +import javax.inject.Provider; + import org.jclouds.aws.domain.Region; +import org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.functions.CreatePlacementGroupIfNeeded; +import org.jclouds.aws.ec2.options.AWSRunInstancesOptions; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Template; import org.jclouds.compute.options.TemplateOptions; @@ -37,13 +43,11 @@ import org.jclouds.ec2.compute.EC2TemplateBuilderTest; import org.jclouds.ec2.compute.domain.EC2HardwareBuilder; import org.jclouds.ec2.compute.domain.RegionAndName; import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules; -import org.jclouds.ec2.compute.functions.CreatePlacementGroupIfNeeded; import org.jclouds.ec2.compute.functions.CreateSecurityGroupIfNeeded; import org.jclouds.ec2.compute.functions.CreateUniqueKeyPair; -import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.ec2.compute.strategy.CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions; import org.jclouds.ec2.domain.BlockDeviceMapping; import org.jclouds.ec2.domain.KeyPair; -import org.jclouds.ec2.domain.PlacementGroup; import org.jclouds.ec2.options.RunInstancesOptions; import org.jclouds.encryption.internal.Base64; import org.testng.annotations.Test; @@ -56,6 +60,14 @@ import com.google.common.collect.ImmutableSet; */ @Test(groups = "unit") public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest { + private static final Provider OPTIONS_PROVIDER = new javax.inject.Provider() { + + @Override + public RunInstancesOptions get() { + return new AWSRunInstancesOptions(); + } + + }; public void testExecuteWithDefaultOptionsEC2() throws SecurityException, NoSuchMethodException { // setup constants @@ -68,31 +80,33 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock( - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, - new Method[] { - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class - .getDeclaredMethod("getProvider"), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "getSecurityGroupsForTagAndOptions", String.class, String.class, TemplateOptions.class) }); + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, new Method[] { + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getOptionsProvider"), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getSecurityGroupsForTagAndOptions", String.class, String.class, + TemplateOptions.class) }); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); Template template = createMock(Template.class); // setup expectations + expect(strategy.getOptionsProvider()).andReturn(OPTIONS_PROVIDER); expect(template.getHardware()).andReturn(size).atLeastOnce(); expect(template.getOptions()).andReturn(options).atLeastOnce(); expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet. of()).atLeastOnce(); expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options)).andReturn( - systemGeneratedKeyPairName); + systemGeneratedKeyPairName); expect(strategy.getSecurityGroupsForTagAndOptions(region, tag, options)).andReturn(generatedGroups); expect(options.getSubnetId()).andReturn(null); expect(options.getUserData()).andReturn(null); + expect(options.isMonitoringEnabled()).andReturn(false); // replay mocks replay(options); @@ -102,10 +116,9 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // run RunInstancesOptions customize = strategy.execute(region, tag, template); assertEquals(customize.buildQueryParameters(), ImmutableMultimap. of()); - assertEquals( - customize.buildFormParameters().entries(), - ImmutableMultimap. of("InstanceType", size.getProviderId(), "SecurityGroup.1", - generatedGroup, "KeyName", systemGeneratedKeyPairName).entries()); + assertEquals(customize.buildFormParameters().entries(), ImmutableMultimap. of("InstanceType", + size.getProviderId(), "SecurityGroup.1", generatedGroup, "KeyName", systemGeneratedKeyPairName) + .entries()); assertEquals(customize.buildMatrixParameters(), ImmutableMultimap. of()); assertEquals(customize.buildRequestHeaders(), ImmutableMultimap. of()); assertEquals(customize.buildStringPayload(), null); @@ -127,31 +140,35 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock( - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, - new Method[] { - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "getSecurityGroupsForTagAndOptions", String.class, String.class, TemplateOptions.class) }); + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, new Method[] { + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getOptionsProvider"), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getSecurityGroupsForTagAndOptions", String.class, String.class, + TemplateOptions.class) }); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); Template template = createMock(Template.class); // setup expectations + expect(strategy.getOptionsProvider()).andReturn(OPTIONS_PROVIDER); expect(template.getHardware()).andReturn(size).atLeastOnce(); expect(template.getOptions()).andReturn(options).atLeastOnce(); expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet. of()).atLeastOnce(); expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options)).andReturn( - systemGeneratedKeyPairName); + systemGeneratedKeyPairName); expect(strategy.createNewPlacementGroupUnlessUserSpecifiedOtherwise(region, tag, options)).andReturn( - generatedGroup); + generatedGroup); expect(strategy.getSecurityGroupsForTagAndOptions(region, tag, options)).andReturn(generatedGroups); expect(options.getSubnetId()).andReturn(null); expect(options.getUserData()).andReturn(null); + expect(options.isMonitoringEnabled()).andReturn(false); // replay mocks replay(options); @@ -161,11 +178,9 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // run RunInstancesOptions customize = strategy.execute(region, tag, template); assertEquals(customize.buildQueryParameters(), ImmutableMultimap. of()); - assertEquals( - customize.buildFormParameters().entries(), - ImmutableMultimap. of("InstanceType", size.getProviderId(), "SecurityGroup.1", - generatedGroup, "KeyName", systemGeneratedKeyPairName, "Placement.GroupName", generatedGroup) - .entries()); + assertEquals(customize.buildFormParameters().entries(), ImmutableMultimap. of("InstanceType", + size.getProviderId(), "SecurityGroup.1", generatedGroup, "KeyName", systemGeneratedKeyPairName, + "Placement.GroupName", generatedGroup).entries()); assertEquals(customize.buildMatrixParameters(), ImmutableMultimap. of()); assertEquals(customize.buildRequestHeaders(), ImmutableMultimap. of()); assertEquals(customize.buildStringPayload(), null); @@ -187,31 +202,35 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock( - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, - new Method[] { - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "getSecurityGroupsForTagAndOptions", String.class, String.class, TemplateOptions.class) }); + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, new Method[] { + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getOptionsProvider"), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getSecurityGroupsForTagAndOptions", String.class, String.class, + TemplateOptions.class) }); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); Template template = createMock(Template.class); // setup expectations + expect(strategy.getOptionsProvider()).andReturn(OPTIONS_PROVIDER); expect(template.getHardware()).andReturn(size).atLeastOnce(); expect(template.getOptions()).andReturn(options).atLeastOnce(); expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet. of()).atLeastOnce(); expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options)).andReturn( - systemGeneratedKeyPairName); + systemGeneratedKeyPairName); expect(strategy.createNewPlacementGroupUnlessUserSpecifiedOtherwise(region, tag, options)).andReturn( - generatedGroup); + generatedGroup); expect(strategy.getSecurityGroupsForTagAndOptions(region, tag, options)).andReturn(generatedGroups); expect(options.getSubnetId()).andReturn(null); expect(options.getUserData()).andReturn(null); + expect(options.isMonitoringEnabled()).andReturn(false); // replay mocks replay(options); @@ -221,11 +240,9 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // run RunInstancesOptions customize = strategy.execute(region, tag, template); assertEquals(customize.buildQueryParameters(), ImmutableMultimap. of()); - assertEquals( - customize.buildFormParameters().entries(), - ImmutableMultimap. of("InstanceType", size.getProviderId(), "SecurityGroup.1", - generatedGroup, "KeyName", systemGeneratedKeyPairName, "Placement.GroupName", generatedGroup) - .entries()); + assertEquals(customize.buildFormParameters().entries(), ImmutableMultimap. of("InstanceType", + size.getProviderId(), "SecurityGroup.1", generatedGroup, "KeyName", systemGeneratedKeyPairName, + "Placement.GroupName", generatedGroup).entries()); assertEquals(customize.buildMatrixParameters(), ImmutableMultimap. of()); assertEquals(customize.buildRequestHeaders(), ImmutableMultimap. of()); assertEquals(customize.buildStringPayload(), null); @@ -245,28 +262,32 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock( - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, - new Method[] { - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "getSecurityGroupsForTagAndOptions", String.class, String.class, TemplateOptions.class) }); + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, new Method[] { + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getOptionsProvider"), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getSecurityGroupsForTagAndOptions", String.class, String.class, + TemplateOptions.class) }); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); Template template = createMock(Template.class); // setup expectations + expect(strategy.getOptionsProvider()).andReturn(OPTIONS_PROVIDER); expect(template.getHardware()).andReturn(size).atLeastOnce(); expect(template.getOptions()).andReturn(options).atLeastOnce(); expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet. of()).atLeastOnce(); expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options)).andReturn( - systemGeneratedKeyPairName); + systemGeneratedKeyPairName); expect(options.getSubnetId()).andReturn("1"); expect(options.getUserData()).andReturn(null); + expect(options.isMonitoringEnabled()).andReturn(false); // replay mocks replay(options); @@ -276,10 +297,8 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // run RunInstancesOptions customize = strategy.execute(region, tag, template); assertEquals(customize.buildQueryParameters(), ImmutableMultimap. of()); - assertEquals( - customize.buildFormParameters().entries(), - ImmutableMultimap. of("InstanceType", size.getProviderId(), "SubnetId", "1", "KeyName", - systemGeneratedKeyPairName).entries()); + assertEquals(customize.buildFormParameters().entries(), ImmutableMultimap. of("InstanceType", + size.getProviderId(), "SubnetId", "1", "KeyName", systemGeneratedKeyPairName).entries()); assertEquals(customize.buildMatrixParameters(), ImmutableMultimap. of()); assertEquals(customize.buildRequestHeaders(), ImmutableMultimap. of()); assertEquals(customize.buildStringPayload(), null); @@ -301,29 +320,33 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = createMock( - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, - new Method[] { - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, - TemplateOptions.class), - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( - "getSecurityGroupsForTagAndOptions", String.class, String.class, TemplateOptions.class) }); + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class, new Method[] { + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getOptionsProvider"), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewKeyPairUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class.getDeclaredMethod( + "createNewPlacementGroupUnlessUserSpecifiedOtherwise", String.class, String.class, + TemplateOptions.class), + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.class + .getDeclaredMethod("getSecurityGroupsForTagAndOptions", String.class, String.class, + TemplateOptions.class) }); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); Template template = createMock(Template.class); // setup expectations + expect(strategy.getOptionsProvider()).andReturn(OPTIONS_PROVIDER); expect(template.getHardware()).andReturn(size).atLeastOnce(); expect(template.getOptions()).andReturn(options).atLeastOnce(); expect(options.getBlockDeviceMappings()).andReturn(ImmutableSet. of()).atLeastOnce(); expect(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options)).andReturn( - systemGeneratedKeyPairName); + systemGeneratedKeyPairName); expect(strategy.getSecurityGroupsForTagAndOptions(region, tag, options)).andReturn(generatedGroups); expect(options.getSubnetId()).andReturn(null); expect(options.getUserData()).andReturn("hello".getBytes()); + expect(options.isMonitoringEnabled()).andReturn(false); // replay mocks replay(options); @@ -333,10 +356,9 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // run RunInstancesOptions customize = strategy.execute(region, tag, template); assertEquals(customize.buildQueryParameters(), ImmutableMultimap. of()); - assertEquals( - customize.buildFormParameters().entries(), - ImmutableMultimap. of("InstanceType", size.getProviderId(), "SecurityGroup.1", "group", - "KeyName", systemGeneratedKeyPairName, "UserData", Base64.encodeBytes("hello".getBytes())).entries()); + assertEquals(customize.buildFormParameters().entries(), ImmutableMultimap. of("InstanceType", + size.getProviderId(), "SecurityGroup.1", "group", "KeyName", systemGeneratedKeyPairName, "UserData", + Base64.encodeBytes("hello".getBytes())).entries()); assertEquals(customize.buildMatrixParameters(), ImmutableMultimap. of()); assertEquals(customize.buildRequestHeaders(), ImmutableMultimap. of()); assertEquals(customize.buildStringPayload(), null); @@ -355,7 +377,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); KeyPair keyPair = createMock(KeyPair.class); // setup expectations @@ -385,7 +407,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); KeyPair keyPair = createMock(KeyPair.class); // setup expectations @@ -394,7 +416,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT expect(strategy.createUniqueKeyPair.apply(new RegionAndName(region, tag))).andReturn(keyPair); expect(keyPair.getKeyName()).andReturn(systemGeneratedKeyPairName).atLeastOnce(); expect(strategy.credentialsMap.put(new RegionAndName(region, systemGeneratedKeyPairName), keyPair)).andReturn( - null); + null); // replay mocks replay(options); @@ -403,7 +425,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // run assertEquals(strategy.createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, options), - systemGeneratedKeyPairName); + systemGeneratedKeyPairName); // verify mocks verify(options); @@ -421,7 +443,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); KeyPair keyPair = createMock(KeyPair.class); // setup expectations @@ -455,13 +477,13 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); // setup expectations expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, - ports, shouldAuthorizeSelf); + ports, shouldAuthorizeSelf); expect(strategy.securityGroupMap.containsKey(regionNameAndIngressRules)).andReturn(groupExisted); expect(strategy.createSecurityGroupIfNeeded.apply(regionNameAndIngressRules)).andReturn(generatedMarkerGroup); expect(strategy.securityGroupMap.put(regionNameAndIngressRules, generatedMarkerGroup)).andReturn(null); @@ -491,13 +513,13 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); // setup expectations expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, - ports, shouldAuthorizeSelf); + ports, shouldAuthorizeSelf); expect(strategy.securityGroupMap.containsKey(regionNameAndIngressRules)).andReturn(groupExisted); expect(strategy.createSecurityGroupIfNeeded.apply(regionNameAndIngressRules)).andReturn(generatedMarkerGroup); expect(strategy.securityGroupMap.put(regionNameAndIngressRules, generatedMarkerGroup)).andReturn(null); @@ -527,13 +549,13 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); // setup expectations expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); expect(options.getInboundPorts()).andReturn(ports).atLeastOnce(); RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, - ports, shouldAuthorizeSelf); + ports, shouldAuthorizeSelf); expect(strategy.securityGroupMap.containsKey(regionNameAndIngressRules)).andReturn(groupExisted); // replay mocks @@ -561,12 +583,12 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); // setup expectations expect(options.getGroupIds()).andReturn(groupIds).atLeastOnce(); RegionNameAndIngressRules regionNameAndIngressRules = new RegionNameAndIngressRules(region, generatedMarkerGroup, - ports, shouldAuthorizeSelf); // note + ports, shouldAuthorizeSelf); // note // this // works // since @@ -594,7 +616,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); PlacementGroup placementGroup = createMock(PlacementGroup.class); // setup expectations @@ -607,7 +629,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // run assertEquals(strategy.createNewPlacementGroupUnlessUserSpecifiedOtherwise(region, tag, options), - userSuppliedPlacementGroup); + userSuppliedPlacementGroup); // verify mocks verify(options); @@ -625,16 +647,16 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); // setup expectations expect(options.getPlacementGroup()).andReturn(userSuppliedPlacementGroup); expect(options.shouldAutomaticallyCreatePlacementGroup()).andReturn(shouldAutomaticallyCreatePlacementGroup); expect(strategy.placementGroupMap.containsKey(new RegionAndName(region, generatedMarkerGroup))).andReturn(false); expect(strategy.createPlacementGroupIfNeeded.apply(new RegionAndName(region, generatedMarkerGroup))).andReturn( - generatedMarkerGroup); + generatedMarkerGroup); expect(strategy.placementGroupMap.put(new RegionAndName(region, generatedMarkerGroup), generatedMarkerGroup)) - .andReturn(null); + .andReturn(null); // replay mocks replay(options); @@ -642,7 +664,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // run assertEquals(strategy.createNewPlacementGroupUnlessUserSpecifiedOtherwise(region, tag, options), - generatedMarkerGroup); + generatedMarkerGroup); // verify mocks verify(options); @@ -659,7 +681,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // create mocks CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy = setupStrategy(); - EC2TemplateOptions options = createMock(EC2TemplateOptions.class); + AWSEC2TemplateOptions options = createMock(AWSEC2TemplateOptions.class); PlacementGroup placementGroup = createMock(PlacementGroup.class); // setup expectations @@ -689,12 +711,8 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT verify(strategy.createPlacementGroupIfNeeded); } - private CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions setupStrategy() { - return setupStrategy("ec2"); - } - @SuppressWarnings("unchecked") - private CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions setupStrategy(String provider) { + private CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions setupStrategy() { Map credentialsMap = createMock(Map.class); Map securityGroupMap = createMock(Map.class); Map placementGroupMap = createMock(Map.class); @@ -702,9 +720,9 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT CreateSecurityGroupIfNeeded createSecurityGroupIfNeeded = createMock(CreateSecurityGroupIfNeeded.class); CreatePlacementGroupIfNeeded createPlacementGroupIfNeeded = createMock(CreatePlacementGroupIfNeeded.class); - return new CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions(provider, credentialsMap, - securityGroupMap, placementGroupMap, createUniqueKeyPair, createSecurityGroupIfNeeded, - createPlacementGroupIfNeeded); + return new CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions(credentialsMap, securityGroupMap, + placementGroupMap, createUniqueKeyPair, createSecurityGroupIfNeeded, OPTIONS_PROVIDER, + createPlacementGroupIfNeeded); } private void replayStrategy(CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions strategy) { diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptionsTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptionsTest.java new file mode 100644 index 0000000000..daf8e3928d --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/options/AWSRunInstancesOptionsTest.java @@ -0,0 +1,293 @@ +/** + * + * 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.aws.ec2.options; + +import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.asType; +import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.enableMonitoring; +import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withBlockDeviceMappings; +import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withKernelId; +import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withKeyName; +import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withRamdisk; +import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSecurityGroup; +import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withSubnetId; +import static org.jclouds.aws.ec2.options.AWSRunInstancesOptions.Builder.withUserData; +import static org.testng.Assert.assertEquals; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.jclouds.ec2.domain.BlockDeviceMapping; +import org.jclouds.ec2.domain.InstanceType; +import org.jclouds.http.options.HttpRequestOptions; +import org.testng.annotations.Test; + +/** + * Tests possible uses of AWSRunInstancesOptions and AWSRunInstancesOptions.Builder.* + * + * @author Adrian Cole + */ +public class AWSRunInstancesOptionsTest { + + @Test + public void testAssignability() { + assert HttpRequestOptions.class.isAssignableFrom(AWSRunInstancesOptions.class); + assert !String.class.isAssignableFrom(AWSRunInstancesOptions.class); + } + + @Test + public void testWithKeyName() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + options.withKeyName("test"); + assertEquals(options.buildFormParameters().get("KeyName"), Collections.singletonList("test")); + } + + @Test + public void testNullWithKeyName() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("KeyName"), Collections.EMPTY_LIST); + } + + @Test + public void testWithKeyNameStatic() { + AWSRunInstancesOptions options = withKeyName("test"); + assertEquals(options.buildFormParameters().get("KeyName"), Collections.singletonList("test")); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testWithKeyNameNPE() { + withKeyName(null); + } + + @Test + public void testWithSecurityGroup() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + options.withSecurityGroup("test"); + assertEquals(options.buildFormParameters().get("SecurityGroup.1"), Collections.singletonList("test")); + } + + @Test + public void testNullWithSecurityGroup() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("SecurityGroup"), Collections.EMPTY_LIST); + } + + @Test + public void testWithSecurityGroupStatic() { + AWSRunInstancesOptions options = withSecurityGroup("test"); + assertEquals(options.buildFormParameters().get("SecurityGroup.1"), Collections.singletonList("test")); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testWithSecurityGroupNPE() { + withSecurityGroup(null); + } + + @Test + public void testNullWithAdditionalInfo() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("AdditionalInfo"), Collections.EMPTY_LIST); + } + + @Test + public void testWithUserData() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + options.withUserData("test".getBytes()); + assertEquals(options.buildFormParameters().get("UserData"), Collections.singletonList("dGVzdA==")); + } + + @Test + public void testNullWithUserData() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("UserData"), Collections.EMPTY_LIST); + } + + @Test + public void testWithUserDataStatic() { + AWSRunInstancesOptions options = withUserData("test".getBytes()); + assertEquals(options.buildFormParameters().get("UserData"), Collections.singletonList("dGVzdA==")); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testWithUserDataNPE() { + withUserData(null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testWithUserDataEmpty() { + withUserData("".getBytes()); + } + + @Test + public void testWithInstanceType() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + options.asType(InstanceType.C1_XLARGE); + assertEquals(options.buildFormParameters().get("InstanceType"), Collections.singletonList("c1.xlarge")); + } + + @Test + public void testNullWithInstanceType() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("InstanceType"), Collections.EMPTY_LIST); + } + + @Test + public void testWithInstanceTypeStatic() { + AWSRunInstancesOptions options = asType(InstanceType.C1_XLARGE); + assertEquals(options.buildFormParameters().get("InstanceType"), Collections.singletonList("c1.xlarge")); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testWithInstanceTypeNPE() { + asType(null); + } + + @Test + public void testWithKernelId() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + options.withKernelId("test"); + assertEquals(options.buildFormParameters().get("KernelId"), Collections.singletonList("test")); + } + + @Test + public void testNullWithKernelId() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("KernelId"), Collections.EMPTY_LIST); + } + + @Test + public void testWithKernelIdStatic() { + AWSRunInstancesOptions options = withKernelId("test"); + assertEquals(options.buildFormParameters().get("KernelId"), Collections.singletonList("test")); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testWithKernelIdNPE() { + withKernelId(null); + } + + @Test + public void testWithMonitoringEnabled() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + options.enableMonitoring(); + assertEquals(options.buildFormParameters().get("Monitoring.Enabled"), Collections.singletonList("true")); + } + + @Test + public void testNullWithMonitoringEnabled() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("Monitoring.Enabled"), Collections.EMPTY_LIST); + } + + @Test + public void testWithMonitoringEnabledStatic() { + AWSRunInstancesOptions options = enableMonitoring(); + assertEquals(options.buildFormParameters().get("Monitoring.Enabled"), Collections.singletonList("true")); + } + + @Test + public void testWithSubnetId() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + options.withSubnetId("test"); + assertEquals(options.buildFormParameters().get("SubnetId"), Collections.singletonList("test")); + } + + @Test + public void testNullWithSubnetId() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("SubnetId"), Collections.EMPTY_LIST); + } + + @Test + public void testWithSubnetIdStatic() { + AWSRunInstancesOptions options = withSubnetId("test"); + assertEquals(options.buildFormParameters().get("SubnetId"), Collections.singletonList("test")); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testWithSubnetIdNPE() { + withSubnetId(null); + } + + @Test + public void testWithRamdisk() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + options.withRamdisk("test"); + assertEquals(options.buildFormParameters().get("RamdiskId"), Collections.singletonList("test")); + } + + @Test + public void testNullWithRamdisk() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("RamdiskId"), Collections.EMPTY_LIST); + } + + @Test + public void testWithRamdiskStatic() { + AWSRunInstancesOptions options = withRamdisk("test"); + assertEquals(options.buildFormParameters().get("RamdiskId"), Collections.singletonList("test")); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testWithRamdiskNPE() { + withRamdisk(null); + } + + @Test + public void testNullWithVirtualName() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.VirtualName"), Collections.EMPTY_LIST); + } + + @Test + public void testWithBlockDeviceMapping() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + BlockDeviceMapping mapping = new BlockDeviceMapping("/dev/sda1", null, null, 120, null, true); + Set mappings = new HashSet(); + mappings.add(mapping); + options.withBlockDeviceMappings(mappings); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.DeviceName"), Collections.singletonList("/dev/sda1")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.VolumeSize"), Collections.singletonList("120")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.DeleteOnTermination"), Collections.singletonList("true")); + } + + @Test + public void testNullWithBlockDeviceMapping() { + AWSRunInstancesOptions options = new AWSRunInstancesOptions(); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping"), Collections.EMPTY_LIST); + } + + @Test + public void testWithBlockDeviceMappingStatic() { + BlockDeviceMapping mapping = new BlockDeviceMapping("/dev/sda1", null, null, 120, null, true); + Set mappings = new HashSet(); + mappings.add(mapping); + AWSRunInstancesOptions options = withBlockDeviceMappings(mappings); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.DeviceName"), Collections.singletonList("/dev/sda1")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.VolumeSize"), Collections.singletonList("120")); + assertEquals(options.buildFormParameters().get("BlockDeviceMapping.1.Ebs.DeleteOnTermination"), Collections.singletonList("true")); + } + + @Test(expectedExceptions = NullPointerException.class) + public void testWithBlockDeviceMappingNPE() { + withBlockDeviceMappings(null); + } + +} diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClientTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClientTest.java new file mode 100644 index 0000000000..55e59271ab --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSAMIAsyncClientTest.java @@ -0,0 +1,386 @@ +/** + * + * 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.aws.ec2.services; + +import static org.jclouds.ec2.options.DescribeImagesOptions.Builder.executableBy; + +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Method; + +import org.jclouds.aws.ec2.xml.ProductCodesHandler; +import org.jclouds.ec2.options.CreateImageOptions; +import org.jclouds.ec2.options.DescribeImagesOptions; +import org.jclouds.ec2.options.RegisterImageBackedByEbsOptions; +import org.jclouds.ec2.options.RegisterImageOptions; +import org.jclouds.ec2.xml.BlockDeviceMappingHandler; +import org.jclouds.ec2.xml.DescribeImagesResponseHandler; +import org.jclouds.ec2.xml.ImageIdHandler; +import org.jclouds.ec2.xml.PermissionHandler; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ReleasePayloadAndReturn; +import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; +import org.jclouds.rest.internal.RestAnnotationProcessor; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.inject.TypeLiteral; + +/** + * Tests behavior of {@code AWSAMIAsyncClient} + * + * @author Adrian Cole + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +@Test(groups = "unit", testName = "AWSAMIAsyncClientTest") +public class AWSAMIAsyncClientTest extends BaseAWSEC2AsyncClientTest { + public AWSAMIAsyncClientTest() { + provider = "aws-ec2"; + } + + public void testCreateImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("createImageInRegion", String.class, String.class, + String.class, Array.newInstance(CreateImageOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "name", "instanceId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=CreateImage&InstanceId=instanceId&Name=name", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, ImageIdHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testCreateImageOptions() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("createImageInRegion", String.class, String.class, + String.class, Array.newInstance(CreateImageOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "name", "instanceId", new CreateImageOptions() + .withDescription("description").noReboot()); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=CreateImage&InstanceId=instanceId&Name=name&Description=description&NoReboot=true", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, ImageIdHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testDescribeImages() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("describeImagesInRegion", String.class, Array.newInstance( + DescribeImagesOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, (String) null); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=DescribeImages", "application/x-www-form-urlencoded", + false); + filter.filter(request); + assertPayloadEquals( + request, + "Action=DescribeImages&Signature=qE4vexSFJqS0UWK%2BccV3s%2BP9woL3M5HI5bTBoM7s%2FLY%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Version=2010-06-15&AWSAccessKeyId=identity", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, DescribeImagesResponseHandler.class); + assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testDescribeImagesOptions() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("describeImagesInRegion", String.class, Array.newInstance( + DescribeImagesOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, executableBy("me").ownedBy("fred", "nancy").imageIds( + "1", "2")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=DescribeImages&ExecutableBy=me&Owner.1=fred&Owner.2=nancy&ImageId.1=1&ImageId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, DescribeImagesResponseHandler.class); + assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testDeregisterImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("deregisterImageInRegion", String.class, String.class); + HttpRequest request = processor.createRequest(method, null, "imageId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=DeregisterImage&ImageId=imageId", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testRegisterImageFromManifest() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("registerImageFromManifestInRegion", String.class, + String.class, String.class, Array.newInstance(RegisterImageOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "name", "pathToManifest"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=RegisterImage&ImageLocation=pathToManifest&Name=name", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, ImageIdHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testRegisterImageFromManifestOptions() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("registerImageFromManifestInRegion", String.class, + String.class, String.class, Array.newInstance(RegisterImageOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "name", "pathToManifest", new RegisterImageOptions() + .withDescription("description")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=RegisterImage&ImageLocation=pathToManifest&Name=name&Description=description", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, ImageIdHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testRegisterImageBackedByEBS() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("registerUnixImageBackedByEbsInRegion", String.class, + String.class, String.class, Array.newInstance(RegisterImageBackedByEbsOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "imageName", "snapshotId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=RegisterImage&RootDeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.Ebs.SnapshotId=snapshotId&Name=imageName", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, ImageIdHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testRegisterImageBackedByEBSOptions() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("registerUnixImageBackedByEbsInRegion", String.class, + String.class, String.class, Array.newInstance(RegisterImageBackedByEbsOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "imageName", "snapshotId", + new RegisterImageBackedByEbsOptions().withDescription("description").addBlockDeviceFromSnapshot( + "/dev/device", null, "snapshot").addNewBlockDevice("/dev/newdevice", "newblock", 100)); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=RegisterImage&RootDeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.0.Ebs.SnapshotId=snapshotId&Name=imageName&Description=description&BlockDeviceMapping.1.Ebs.DeleteOnTermination=false&BlockDeviceMapping.1.DeviceName=%2Fdev%2Fdevice&BlockDeviceMapping.1.Ebs.SnapshotId=snapshot&BlockDeviceMapping.2.Ebs.DeleteOnTermination=false&BlockDeviceMapping.2.DeviceName=%2Fdev%2Fnewdevice&BlockDeviceMapping.2.VirtualName=newblock&BlockDeviceMapping.2.Ebs.VolumeSize=100", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, ImageIdHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetProductCodesForImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("getProductCodesForImageInRegion", String.class, String.class); + HttpRequest request = processor.createRequest(method, null, "imageId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=DescribeImageAttribute&Attribute=productCodes&ImageId=imageId", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, ProductCodesHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetBlockDeviceMappingsForImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("getBlockDeviceMappingsForImageInRegion", String.class, + String.class); + HttpRequest request = processor.createRequest(method, null, "imageId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=DescribeImageAttribute&Attribute=blockDeviceMapping&ImageId=imageId", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, BlockDeviceMappingHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetLaunchPermissionForImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("getLaunchPermissionForImageInRegion", String.class, + String.class); + HttpRequest request = processor.createRequest(method, null, "imageId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=DescribeImageAttribute&Attribute=launchPermission&ImageId=imageId", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, PermissionHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testAddLaunchPermissionsToImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("addLaunchPermissionsToImageInRegion", String.class, + Iterable.class, Iterable.class, String.class); + HttpRequest request = processor.createRequest(method, null, ImmutableList.of("bob", "sue"), ImmutableList + .of("all"), "imageId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=ModifyImageAttribute&OperationType=add&Attribute=launchPermission&ImageId=imageId&UserGroup.1=all&UserId.1=bob&UserId.2=sue", + "application/x-www-form-urlencoded", false); + filter.filter(request); + assertPayloadEquals( + request, + "Action=ModifyImageAttribute&Attribute=launchPermission&ImageId=imageId&OperationType=add&Signature=WZzNWOC1KHbuySvXEuLTiBA%2BVUfKpSBN2Lud6MrhlCQ%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&UserGroup.1=all&UserId.1=bob&UserId.2=sue&Version=2010-06-15&AWSAccessKeyId=identity", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testRemoveLaunchPermissionsFromImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("removeLaunchPermissionsFromImageInRegion", String.class, + Iterable.class, Iterable.class, String.class); + HttpRequest request = processor.createRequest(method, null, ImmutableList.of("bob", "sue"), ImmutableList + .of("all"), "imageId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=ModifyImageAttribute&OperationType=remove&Attribute=launchPermission&ImageId=imageId&UserGroup.1=all&UserId.1=bob&UserId.2=sue", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testResetLaunchPermissionsOnImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("resetLaunchPermissionsOnImageInRegion", String.class, + String.class); + HttpRequest request = processor.createRequest(method, null, "imageId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=ResetImageAttribute&Attribute=launchPermission&ImageId=imageId", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testAddProductCodesToImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("addProductCodesToImageInRegion", String.class, Iterable.class, + String.class); + HttpRequest request = processor.createRequest(method, null, ImmutableList.of("code1", "code2"), "imageId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=ModifyImageAttribute&OperationType=add&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testRemoveProductCodesFromImage() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSAMIAsyncClient.class.getMethod("removeProductCodesFromImageInRegion", String.class, + Iterable.class, String.class); + HttpRequest request = processor.createRequest(method, null, ImmutableList.of("code1", "code2"), "imageId"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=ModifyImageAttribute&OperationType=remove&Attribute=productCodes&ImageId=imageId&ProductCode.1=code1&ProductCode.2=code2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + @Override + protected TypeLiteral> createTypeLiteral() { + return new TypeLiteral>() { + }; + } + +} diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSAMIClientLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSAMIClientLiveTest.java new file mode 100644 index 0000000000..93670a523a --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSAMIClientLiveTest.java @@ -0,0 +1,243 @@ +/** + * + * 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.aws.ec2.services; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.ec2.options.DescribeImagesOptions.Builder.imageIds; +import static org.jclouds.ec2.options.RegisterImageBackedByEbsOptions.Builder.addNewBlockDevice; +import static org.jclouds.ec2.options.RegisterImageOptions.Builder.withDescription; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.Iterator; +import java.util.Properties; +import java.util.Set; + +import org.jclouds.Constants; +import org.jclouds.aws.domain.Region; +import org.jclouds.aws.ec2.AWSEC2AsyncClient; +import org.jclouds.aws.ec2.AWSEC2Client; +import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.ec2.domain.Image; +import org.jclouds.ec2.domain.RootDeviceType; +import org.jclouds.ec2.domain.Image.ImageType; +import org.jclouds.logging.log4j.config.Log4JLoggingModule; +import org.jclouds.rest.AuthorizationException; +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.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.google.inject.Module; + +/** + * Tests behavior of {@code AWSAMIClient} + * + * @author Adrian Cole + */ +@Test(groups = "live", sequential = true) +public class AWSAMIClientLiveTest { + + private AWSAMIClient client; + private String imageId = "ami-7ea24a17"; + private static final String DEFAULT_MANIFEST = "adrianimages/image.manifest.xml"; + private static final String DEFAULT_SNAPSHOT = "TODO"; + private RestContext context; + + private Set imagesToDeregister = Sets.newHashSet(); + + protected String provider = "aws-ec2"; + protected String identity; + protected String credential; + protected String endpoint; + protected String apiversion; + + @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"); + } + + 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; + } + + @BeforeGroups(groups = { "live" }) + public void setupClient() { + setupCredentials(); + Properties overrides = setupProperties(); + context = new ComputeServiceContextFactory().createContext(provider, + ImmutableSet. of(new Log4JLoggingModule()), overrides).getProviderSpecificContext(); + client = context.getApi().getAMIServices(); + } + + public void testDescribeImageNotExists() { + assertEquals(client.describeImagesInRegion(null, imageIds("ami-cdf819a3")).size(), 0); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testDescribeImageBadId() { + client.describeImagesInRegion(null, imageIds("asdaasdsa")); + } + + public void testDescribeImages() { + 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.describeImagesInRegion(region)); + assertNotNull(allResults); + assert allResults.size() >= 2 : allResults.size(); + Iterator iterator = allResults.iterator(); + String id1 = iterator.next().getId(); + String id2 = iterator.next().getId(); + Set twoResults = Sets.newLinkedHashSet(client.describeImagesInRegion(region, imageIds(id1, id2))); + assertNotNull(twoResults); + assertEquals(twoResults.size(), 2); + iterator = twoResults.iterator(); + assertEquals(iterator.next().getId(), id1); + assertEquals(iterator.next().getId(), id2); + } + } + + @Test(enabled = false) + public void testRegisterImageFromManifest() { + String imageRegisteredId = client.registerImageFromManifestInRegion(null, "jcloudstest1", DEFAULT_MANIFEST); + imagesToDeregister.add(imageRegisteredId); + Image imageRegisteredFromManifest = Iterables.getOnlyElement(client.describeImagesInRegion(null, + imageIds(imageRegisteredId))); + assertEquals(imageRegisteredFromManifest.getName(), "jcloudstest1"); + assertEquals(imageRegisteredFromManifest.getImageLocation(), DEFAULT_MANIFEST); + assertEquals(imageRegisteredFromManifest.getImageType(), ImageType.MACHINE); + assertEquals(imageRegisteredFromManifest.getRootDeviceType(), RootDeviceType.INSTANCE_STORE); + assertEquals(imageRegisteredFromManifest.getRootDeviceName(), "/dev/sda1"); + } + + @Test(enabled = false) + public void testRegisterImageFromManifestOptions() { + String imageRegisteredWithOptionsId = client.registerImageFromManifestInRegion(null, "jcloudstest2", + DEFAULT_MANIFEST, withDescription("adrian")); + imagesToDeregister.add(imageRegisteredWithOptionsId); + Image imageRegisteredFromManifestWithOptions = Iterables.getOnlyElement(client.describeImagesInRegion(null, + imageIds(imageRegisteredWithOptionsId))); + assertEquals(imageRegisteredFromManifestWithOptions.getName(), "jcloudstest2"); + assertEquals(imageRegisteredFromManifestWithOptions.getImageLocation(), DEFAULT_MANIFEST); + assertEquals(imageRegisteredFromManifestWithOptions.getImageType(), ImageType.MACHINE); + assertEquals(imageRegisteredFromManifestWithOptions.getRootDeviceType(), RootDeviceType.INSTANCE_STORE); + assertEquals(imageRegisteredFromManifestWithOptions.getRootDeviceName(), "/dev/sda1"); + assertEquals(imageRegisteredFromManifestWithOptions.getDescription(), "adrian"); + } + + @Test(enabled = false) + // awaiting EBS functionality to be added to jclouds + public void testRegisterImageBackedByEBS() { + String imageRegisteredId = client.registerUnixImageBackedByEbsInRegion(null, "jcloudstest1", DEFAULT_MANIFEST); + imagesToDeregister.add(imageRegisteredId); + Image imageRegistered = Iterables + .getOnlyElement(client.describeImagesInRegion(null, imageIds(imageRegisteredId))); + assertEquals(imageRegistered.getName(), "jcloudstest1"); + assertEquals(imageRegistered.getImageType(), ImageType.MACHINE); + assertEquals(imageRegistered.getRootDeviceType(), RootDeviceType.EBS); + assertEquals(imageRegistered.getRootDeviceName(), "/dev/sda1"); + } + + @Test(enabled = false) + // awaiting EBS functionality to be added to jclouds + public void testRegisterImageBackedByEBSOptions() { + String imageRegisteredWithOptionsId = client.registerUnixImageBackedByEbsInRegion(null, "jcloudstest2", + DEFAULT_SNAPSHOT, addNewBlockDevice("/dev/sda2", "myvirtual", 1).withDescription("adrian")); + imagesToDeregister.add(imageRegisteredWithOptionsId); + Image imageRegisteredWithOptions = Iterables.getOnlyElement(client.describeImagesInRegion(null, + imageIds(imageRegisteredWithOptionsId))); + assertEquals(imageRegisteredWithOptions.getName(), "jcloudstest2"); + assertEquals(imageRegisteredWithOptions.getImageType(), ImageType.MACHINE); + assertEquals(imageRegisteredWithOptions.getRootDeviceType(), RootDeviceType.EBS); + assertEquals(imageRegisteredWithOptions.getRootDeviceName(), "/dev/sda1"); + assertEquals(imageRegisteredWithOptions.getDescription(), "adrian"); + assertEquals(imageRegisteredWithOptions.getEbsBlockDevices().entrySet(), ImmutableMap.of("/dev/sda1", + new Image.EbsBlockDevice("/dev/sda1", 30, true), "/dev/sda2", + new Image.EbsBlockDevice("/dev/sda2", 1, true)).entrySet()); + } + + @Test(enabled = false) + public void testCreateImage() { + // TODO client.createImageInRegion(null, name, instanceId, options); + } + + @Test(enabled = false) + public void testAddProductCodesToImage() { + // TODO client.addProductCodesToImageInRegion(null, productCodes, imageId); + } + + @Test(enabled = false) + public void testAddLaunchPermissionsToImage() { + // TODO client.addLaunchPermissionsToImageInRegion(null, userIds, userGroups, + // imageId); + } + + @Test(enabled = false) + public void testRemoveLaunchPermissionsFromImage() { + // TODO client.removeLaunchPermissionsFromImageInRegion(null, userIds, userGroups, + // imageId); + } + + @Test(enabled = false) + public void testResetLaunchPermissionsOnImage() { + // TODO client.resetLaunchPermissionsOnImageInRegion(null, imageId); + } + + @Test(expectedExceptions = AuthorizationException.class) + public void testGetLaunchPermissionForImage() { + System.out.println(client.getLaunchPermissionForImageInRegion(null, imageId)); + } + + @Test(expectedExceptions = AuthorizationException.class) + public void testGetProductCodesForImage() { + System.out.println(client.getProductCodesForImageInRegion(null, imageId)); + } + + @Test(enabled = false) + // awaiting ebs support + public void testGetBlockDeviceMappingsForImage() { + System.out.println(client.getBlockDeviceMappingsForImageInRegion(null, imageId)); + } + + @AfterTest + public void deregisterImages() { + for (String imageId : imagesToDeregister) + client.deregisterImageInRegion(null, imageId); + } +} diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClientTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClientTest.java new file mode 100644 index 0000000000..6ba5b680a7 --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSInstanceAsyncClientTest.java @@ -0,0 +1,505 @@ +/** + * + * 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.aws.ec2.services; + +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.util.Map; + +import org.jclouds.aws.domain.Region; +import org.jclouds.aws.ec2.options.AWSRunInstancesOptions; +import org.jclouds.aws.ec2.xml.AWSDescribeInstancesResponseHandler; +import org.jclouds.aws.ec2.xml.AWSRunInstancesResponseHandler; +import org.jclouds.ec2.domain.AvailabilityZone; +import org.jclouds.ec2.domain.BlockDevice; +import org.jclouds.ec2.domain.InstanceType; +import org.jclouds.ec2.domain.Volume.InstanceInitiatedShutdownBehavior; +import org.jclouds.ec2.options.RunInstancesOptions; +import org.jclouds.ec2.xml.BlockDeviceMappingHandler; +import org.jclouds.ec2.xml.BooleanValueHandler; +import org.jclouds.ec2.xml.InstanceInitiatedShutdownBehaviorHandler; +import org.jclouds.ec2.xml.InstanceStateChangeHandler; +import org.jclouds.ec2.xml.InstanceTypeHandler; +import org.jclouds.ec2.xml.StringValueHandler; +import org.jclouds.ec2.xml.UnencodeStringValueHandler; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ReleasePayloadAndReturn; +import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; +import org.jclouds.rest.internal.RestAnnotationProcessor; +import org.testng.annotations.Test; + +import com.google.common.collect.Maps; +import com.google.inject.TypeLiteral; + +/** + * Tests behavior of {@code AWSInstanceAsyncClient} + * + * @author Adrian Cole + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +@Test(groups = "unit", testName = "AWSInstanceAsyncClientTest") +public class AWSInstanceAsyncClientTest extends BaseAWSEC2AsyncClientTest { + public void testDescribeInstances() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("describeInstancesInRegion", String.class, String[].class); + HttpRequest request = processor.createRequest(method, (String) null); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=DescribeInstances", "application/x-www-form-urlencoded", + false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, AWSDescribeInstancesResponseHandler.class); + assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testDescribeInstancesArgs() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("describeInstancesInRegion", String.class, String[].class); + HttpRequest request = processor.createRequest(method, null, "1", "2"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=DescribeInstances&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, AWSDescribeInstancesResponseHandler.class); + assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testTerminateInstances() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("terminateInstancesInRegion", String.class, Array + .newInstance(String.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "1", "2"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=TerminateInstances&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceStateChangeHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testRunInstances() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("runInstancesInRegion", String.class, String.class, + String.class, int.class, int.class, Array.newInstance(RunInstancesOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, null, "ami-voo", 1, 1); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + try { + assertPayloadEquals(request, "Version=2010-06-15&Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=1", + "application/x-www-form-urlencoded", false); + } catch (AssertionError e) { + // mvn 3.0 osx 10.6.5 somehow sorts differently + assertPayloadEquals(request, "Version=2010-06-15&Action=RunInstances&ImageId=ami-voo&MaxCount=1&MinCount=1", + "application/x-www-form-urlencoded", false); + } + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, AWSRunInstancesResponseHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testRunInstancesOptions() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("runInstancesInRegion", String.class, String.class, + String.class, int.class, int.class, Array.newInstance(RunInstancesOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, Region.EU_WEST_1, AvailabilityZone.EU_WEST_1A, "ami-voo", + 1, 5, new AWSRunInstancesOptions().withKernelId("kernelId").enableMonitoring().withSecurityGroups( + "group1", "group2")); + + assertRequestLineEquals(request, "POST https://ec2.eu-west-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.eu-west-1.amazonaws.com\n"); + try { + assertPayloadEquals( + request, + "Version=2010-06-15&Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=5&KernelId=kernelId&Monitoring.Enabled=true&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.AvailabilityZone=eu-west-1a", + "application/x-www-form-urlencoded", false); + } catch (AssertionError e) { + // mvn 3.0 osx 10.6.5 somehow sorts differently + assertPayloadEquals( + request, + "Version=2010-06-15&Action=RunInstances&ImageId=ami-voo&MaxCount=5&MinCount=1&KernelId=kernelId&Monitoring.Enabled=true&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.AvailabilityZone=eu-west-1a", + "application/x-www-form-urlencoded", false); + } + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, AWSRunInstancesResponseHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testStopInstances() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("stopInstancesInRegion", String.class, boolean.class, + Array.newInstance(String.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, true, "1", "2"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=StopInstances&Force=true&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceStateChangeHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testRebootInstances() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("rebootInstancesInRegion", String.class, Array + .newInstance(String.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "1", "2"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=RebootInstances&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testStartInstances() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("startInstancesInRegion", String.class, Array.newInstance( + String.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "1", "2"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=StartInstances&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceStateChangeHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetUserDataForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("getUserDataForInstanceInRegion", String.class, + String.class); + HttpRequest request = processor.createRequest(method, null, "1"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=DescribeInstanceAttribute&Attribute=userData&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, UnencodeStringValueHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetRootDeviceNameForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("getRootDeviceNameForInstanceInRegion", String.class, + String.class); + HttpRequest request = processor.createRequest(method, null, "1"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=DescribeInstanceAttribute&Attribute=rootDeviceName&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, StringValueHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetRamdiskForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("getRamdiskForInstanceInRegion", String.class, + String.class); + HttpRequest request = processor.createRequest(method, null, "1"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=DescribeInstanceAttribute&Attribute=ramdisk&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, StringValueHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetDisableApiTerminationForInstanceInRegion() throws SecurityException, NoSuchMethodException, + IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("isApiTerminationDisabledForInstanceInRegion", + String.class, String.class); + HttpRequest request = processor.createRequest(method, null, "1"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=DescribeInstanceAttribute&Attribute=disableApiTermination&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, BooleanValueHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetKernelForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class + .getMethod("getKernelForInstanceInRegion", String.class, String.class); + HttpRequest request = processor.createRequest(method, null, "1"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Version=2010-06-15&Action=DescribeInstanceAttribute&Attribute=kernel&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, StringValueHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetInstanceTypeForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("getInstanceTypeForInstanceInRegion", String.class, + String.class); + HttpRequest request = processor.createRequest(method, null, "1"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=DescribeInstanceAttribute&Attribute=instanceType&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceTypeHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetInstanceInitiatedShutdownBehaviorForInstanceInRegion() throws SecurityException, + NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("getInstanceInitiatedShutdownBehaviorForInstanceInRegion", + String.class, String.class); + HttpRequest request = processor.createRequest(method, null, "1"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=DescribeInstanceAttribute&Attribute=instanceInitiatedShutdownBehavior&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceInitiatedShutdownBehaviorHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetBlockDeviceMappingForInstanceInRegion() throws SecurityException, NoSuchMethodException, + IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("getBlockDeviceMappingForInstanceInRegion", String.class, + String.class); + HttpRequest request = processor.createRequest(method, null, "1"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=DescribeInstanceAttribute&Attribute=blockDeviceMapping&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, BlockDeviceMappingHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testSetUserDataForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("setUserDataForInstanceInRegion", String.class, + String.class, Array.newInstance(byte.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, null, "1", "test".getBytes()); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=ModifyInstanceAttribute&Attribute=userData&Value=dGVzdA%3D%3D&InstanceId=1", + "application/x-www-form-urlencoded", false); + filter.filter(request);// ensure encoding worked properly + assertPayloadEquals( + request, + "Action=ModifyInstanceAttribute&Attribute=userData&InstanceId=1&Signature=LfUmzLM5DsACR5nQcEfGF5FPdznOwwhJ7tjhBWfHtGs%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Value=dGVzdA%3D%3D&Version=2010-06-15&AWSAccessKeyId=identity", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testSetRamdiskForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("setRamdiskForInstanceInRegion", String.class, + String.class, String.class); + HttpRequest request = processor.createRequest(method, null, "1", "test"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=ModifyInstanceAttribute&Attribute=ramdisk&Value=test&InstanceId=1", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testSetKernelForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("setKernelForInstanceInRegion", String.class, + String.class, String.class); + HttpRequest request = processor.createRequest(method, null, "1", "test"); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=ModifyInstanceAttribute&Attribute=kernel&Value=test&InstanceId=1", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testSetApiTerminationDisabledForInstanceInRegion() throws SecurityException, NoSuchMethodException, + IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("setApiTerminationDisabledForInstanceInRegion", + String.class, String.class, boolean.class); + HttpRequest request = processor.createRequest(method, null, "1", true); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=ModifyInstanceAttribute&Attribute=disableApiTermination&Value=true&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testSetInstanceTypeForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("setInstanceTypeForInstanceInRegion", String.class, + String.class, String.class); + HttpRequest request = processor.createRequest(method, null, "1", InstanceType.C1_MEDIUM); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Version=2010-06-15&Action=ModifyInstanceAttribute&Attribute=instanceType&Value=c1.medium&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testSetInstanceInitiatedShutdownBehaviorForInstanceInRegion() throws SecurityException, + NoSuchMethodException, IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("setInstanceInitiatedShutdownBehaviorForInstanceInRegion", + String.class, String.class, InstanceInitiatedShutdownBehavior.class); + HttpRequest request = processor.createRequest(method, null, "1", InstanceInitiatedShutdownBehavior.TERMINATE); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=ModifyInstanceAttribute&Attribute=instanceInitiatedShutdownBehavior&Value=terminate&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testSetBlockDeviceMappingForInstanceInRegion() throws SecurityException, NoSuchMethodException, + IOException { + Method method = AWSInstanceAsyncClient.class.getMethod("setBlockDeviceMappingForInstanceInRegion", String.class, + String.class, Map.class); + + Map mapping = Maps.newLinkedHashMap(); + mapping.put("/dev/sda1", new BlockDevice("vol-test1", true)); + HttpRequest request = processor.createRequest(method, null, "1", mapping); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Version=2010-06-15&Action=ModifyInstanceAttribute&InstanceId=1&BlockDeviceMapping.1.Ebs.VolumeId=vol-test1&BlockDeviceMapping.1.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.1.Ebs.DeleteOnTermination=true", + "application/x-www-form-urlencoded", false); + filter.filter(request);// ensure encoding worked properly + assertPayloadEquals( + request, + "Action=ModifyInstanceAttribute&BlockDeviceMapping.1.DeviceName=%2Fdev%2Fsda1&BlockDeviceMapping.1.Ebs.DeleteOnTermination=true&BlockDeviceMapping.1.Ebs.VolumeId=vol-test1&InstanceId=1&Signature=RwY8lVPHSQxQkd5efUKccHdSTkN4OxMIMFiYAe3rrUE%3D&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2009-11-08T15%3A54%3A08.897Z&Version=2010-06-15&AWSAccessKeyId=identity", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + @Override + protected TypeLiteral> createTypeLiteral() { + return new TypeLiteral>() { + }; + } + +} diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSInstanceClientLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSInstanceClientLiveTest.java new file mode 100644 index 0000000000..a6e801a9aa --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/AWSInstanceClientLiveTest.java @@ -0,0 +1,106 @@ +/** + * + * 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.aws.ec2.services; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.testng.Assert.assertNotNull; + +import java.util.Properties; +import java.util.Set; + +import org.jclouds.Constants; +import org.jclouds.aws.domain.Region; +import org.jclouds.aws.ec2.AWSEC2AsyncClient; +import org.jclouds.aws.ec2.AWSEC2Client; +import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.ec2.domain.Reservation; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.logging.log4j.config.Log4JLoggingModule; +import org.jclouds.rest.RestContext; +import org.testng.annotations.AfterTest; +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.inject.Module; + +/** + * Tests behavior of {@code EC2Client} + * + * @author Adrian Cole + */ +@Test(groups = "live", sequential = true) +public class AWSInstanceClientLiveTest { + public static final String PREFIX = System.getProperty("user.name") + "-ec2"; + + private AWSInstanceClient client; + private RestContext context; + protected String provider = "aws-ec2"; + protected String identity; + protected String credential; + protected String endpoint; + protected String apiversion; + + 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"); + } + + 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); + overrides.setProperty(provider + ".credential", credential); + overrides.setProperty(provider + ".endpoint", endpoint); + overrides.setProperty(provider + ".apiversion", apiversion); + return overrides; + } + + @BeforeGroups(groups = { "live" }) + public void setupClient() { + setupCredentials(); + Properties overrides = setupProperties(); + context = new ComputeServiceContextFactory().createContext(provider, + ImmutableSet. of(new Log4JLoggingModule()), overrides).getProviderSpecificContext(); + client = context.getApi().getInstanceServices(); + + } + + @Test + void testDescribeInstances() { + 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.describeInstancesInRegion(region); + assertNotNull(allResults); + assert allResults.size() >= 0 : allResults.size(); + } + } + + @AfterTest + public void shutdown() { + context.close(); + } +} diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/BaseAWSEC2AsyncClientTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/BaseAWSEC2AsyncClientTest.java new file mode 100644 index 0000000000..69f40e6e61 --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/BaseAWSEC2AsyncClientTest.java @@ -0,0 +1,93 @@ +package org.jclouds.aws.ec2.services; + +import static org.testng.Assert.assertEquals; + +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.Properties; + +import org.jclouds.aws.domain.Region; +import org.jclouds.aws.ec2.config.AWSEC2RestClientModule; +import org.jclouds.aws.filters.FormSigner; +import org.jclouds.date.DateService; +import org.jclouds.ec2.domain.AvailabilityZone; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.RequiresHttp; +import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.RestClientTest; +import org.jclouds.rest.RestContextFactory; +import org.jclouds.rest.RestContextSpec; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.inject.Module; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit") +public abstract class BaseAWSEC2AsyncClientTest extends RestClientTest { + @RequiresHttp + @ConfiguresRestClient + protected static class StubAWSEC2RestClientModule extends AWSEC2RestClientModule { + + @Override + protected String provideTimeStamp(DateService dateService, int expiration) { + return "2009-11-08T15:54:08.897Z"; + } + + protected void bindRegionsToProvider() { + bindRegionsToProvider(Regions.class); + } + + static class Regions implements javax.inject.Provider> { + @Override + public Map get() { + return ImmutableMap. of(Region.EU_WEST_1, URI.create("https://ec2.eu-west-1.amazonaws.com"), + Region.US_EAST_1, URI.create("https://ec2.us-east-1.amazonaws.com"), Region.US_WEST_1, URI + .create("https://ec2.us-west-1.amazonaws.com")); + } + } + + protected void bindZonesToProvider() { + bindZonesToProvider(Zones.class); + } + + static class Zones implements javax.inject.Provider> { + @Override + public Map get() { + return ImmutableMap. of(AvailabilityZone.US_EAST_1A, Region.US_EAST_1); + } + } + } + + protected FormSigner filter; + + @Override + protected void checkFilters(HttpRequest request) { + assertEquals(request.getFilters().size(), 1); + assertEquals(request.getFilters().get(0).getClass(), FormSigner.class); + } + + @Override + @BeforeTest + protected void setupFactory() throws IOException { + super.setupFactory(); + this.filter = injector.getInstance(FormSigner.class); + } + + @Override + protected Module createModule() { + return new StubAWSEC2RestClientModule(); + } + + protected String provider = "aws-ec2"; + + @Override + public RestContextSpec createContextSpec() { + return new RestContextFactory().createContextSpec(provider, "identity", "credential", new Properties()); + } + +} diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/services/MonitoringAsyncClientTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/MonitoringAsyncClientTest.java similarity index 94% rename from apis/ec2/src/test/java/org/jclouds/ec2/services/MonitoringAsyncClientTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/MonitoringAsyncClientTest.java index e3aa9399c6..1a576a4e1c 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/services/MonitoringAsyncClientTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/MonitoringAsyncClientTest.java @@ -17,13 +17,13 @@ * ==================================================================== */ -package org.jclouds.ec2.services; +package org.jclouds.aws.ec2.services; import java.io.IOException; import java.lang.reflect.Array; import java.lang.reflect.Method; -import org.jclouds.ec2.xml.MonitoringStateHandler; +import org.jclouds.aws.ec2.xml.MonitoringStateHandler; import org.jclouds.http.HttpRequest; import org.jclouds.http.functions.ParseSax; import org.jclouds.rest.internal.RestAnnotationProcessor; @@ -38,7 +38,7 @@ import com.google.inject.TypeLiteral; */ // NOTE:without testName, this will not call @Before* and fail w/NPE during surefire @Test(groups = "unit", testName = "MonitoringAsyncClientTest") -public class MonitoringAsyncClientTest extends BaseEC2AsyncClientTest { +public class MonitoringAsyncClientTest extends BaseAWSEC2AsyncClientTest { public void testUnmonitorInstances() throws SecurityException, NoSuchMethodException, IOException { Method method = MonitoringAsyncClient.class.getMethod("unmonitorInstancesInRegion", String.class, String.class, diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/services/MonitoringClientLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/MonitoringClientLiveTest.java similarity index 92% rename from apis/ec2/src/test/java/org/jclouds/ec2/services/MonitoringClientLiveTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/MonitoringClientLiveTest.java index b05a8b4152..f8f58f1fe6 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/services/MonitoringClientLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/MonitoringClientLiveTest.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.services; +package org.jclouds.aws.ec2.services; import static com.google.common.base.Preconditions.checkNotNull; import static org.testng.Assert.assertEquals; @@ -26,9 +26,9 @@ import java.util.Map; import java.util.Properties; import org.jclouds.Constants; -import org.jclouds.ec2.EC2AsyncClient; -import org.jclouds.ec2.EC2Client; -import org.jclouds.ec2.domain.MonitoringState; +import org.jclouds.aws.ec2.AWSEC2AsyncClient; +import org.jclouds.aws.ec2.AWSEC2Client; +import org.jclouds.aws.ec2.domain.MonitoringState; import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; @@ -48,8 +48,8 @@ public class MonitoringClientLiveTest { private MonitoringClient client; private static final String DEFAULT_INSTANCE = "i-TODO"; - private RestContext context; - protected String provider = "ec2"; + private RestContext context; + protected String provider = "aws-ec2"; protected String identity; protected String credential; protected String endpoint; diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/services/PlacementGroupAsyncClientTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClientTest.java similarity index 96% rename from apis/ec2/src/test/java/org/jclouds/ec2/services/PlacementGroupAsyncClientTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClientTest.java index 237135ffb5..421d885e23 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/services/PlacementGroupAsyncClientTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupAsyncClientTest.java @@ -17,12 +17,12 @@ * ==================================================================== */ -package org.jclouds.ec2.services; +package org.jclouds.aws.ec2.services; import java.io.IOException; import java.lang.reflect.Method; -import org.jclouds.ec2.xml.DescribePlacementGroupsResponseHandler; +import org.jclouds.aws.ec2.xml.DescribePlacementGroupsResponseHandler; import org.jclouds.http.HttpRequest; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ReleasePayloadAndReturn; @@ -40,7 +40,7 @@ import com.google.inject.TypeLiteral; */ // NOTE:without testName, this will not call @Before* and fail w/NPE during surefire @Test(groups = "unit", testName = "PlacementGroupAsyncClientTest") -public class PlacementGroupAsyncClientTest extends BaseEC2AsyncClientTest { +public class PlacementGroupAsyncClientTest extends BaseAWSEC2AsyncClientTest { public void testDeletePlacementGroup() throws SecurityException, NoSuchMethodException, IOException { Method method = PlacementGroupAsyncClient.class.getMethod("deletePlacementGroupInRegion", String.class, diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/services/PlacementGroupClientLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java similarity index 89% rename from apis/ec2/src/test/java/org/jclouds/ec2/services/PlacementGroupClientLiveTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java index cd7e5e64b4..de12ec2d0a 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/services/PlacementGroupClientLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.services; +package org.jclouds.aws.ec2.services; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.any; @@ -38,8 +38,12 @@ 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.AWSEC2Client; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.domain.PlacementGroup.State; +import org.jclouds.aws.ec2.predicates.PlacementGroupAvailable; +import org.jclouds.aws.ec2.predicates.PlacementGroupDeleted; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.compute.RunNodesException; @@ -48,12 +52,7 @@ import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; import org.jclouds.compute.predicates.NodePredicates; -import org.jclouds.ec2.EC2Client; import org.jclouds.ec2.domain.InstanceType; -import org.jclouds.ec2.domain.PlacementGroup; -import org.jclouds.ec2.domain.PlacementGroup.State; -import org.jclouds.ec2.predicates.PlacementGroupAvailable; -import org.jclouds.ec2.predicates.PlacementGroupDeleted; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.ssh.jsch.config.JschSshClientModule; @@ -75,13 +74,13 @@ import com.google.inject.Module; @Test(groups = "live", sequential = true) public class PlacementGroupClientLiveTest { - private EC2Client client; + private AWSEC2Client client; private ComputeServiceContext context; private RetryablePredicate availableTester; private RetryablePredicate deletedTester; private PlacementGroup group; private Map keyPair; - protected String provider = "ec2"; + protected String provider = "aws-ec2"; protected String identity; protected String credential; protected String endpoint; @@ -113,14 +112,14 @@ public class PlacementGroupClientLiveTest { public void setupClient() throws FileNotFoundException, IOException { setupCredentials(); Properties overrides = setupProperties(); - context = new ComputeServiceContextFactory().createContext(provider, - ImmutableSet. of(new Log4JLoggingModule(), new JschSshClientModule()), overrides); + context = new ComputeServiceContextFactory().createContext(provider, ImmutableSet. of( + new Log4JLoggingModule(), new JschSshClientModule()), overrides); keyPair = setupKeyPair(); - client = EC2Client.class.cast(context.getProviderSpecificContext().getApi()); + client = AWSEC2Client.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); } @@ -129,12 +128,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); @@ -145,8 +144,7 @@ public class PlacementGroupClientLiveTest { try { client.getPlacementGroupServices().describePlacementGroupsInRegion(region); assert false : "should be unsupported"; - } catch (AWSResponseException e) { - assertEquals(e.getError().getCode(), "UnsupportedOperation"); + } catch (UnsupportedOperationException e) { } } } @@ -163,7 +161,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(); @@ -199,7 +197,7 @@ 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)); @@ -211,7 +209,7 @@ public class PlacementGroupClientLiveTest { 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/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/AWSDescribeInstancesResponseHandlerTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/AWSDescribeInstancesResponseHandlerTest.java new file mode 100644 index 0000000000..ff2099e669 --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/AWSDescribeInstancesResponseHandlerTest.java @@ -0,0 +1,161 @@ +/** + * + * 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.aws.ec2.xml; + +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; +import java.net.UnknownHostException; +import java.util.Set; + +import org.jclouds.aws.ec2.domain.AWSRunningInstance; +import org.jclouds.aws.ec2.domain.MonitoringState; +import org.jclouds.date.DateService; +import org.jclouds.ec2.domain.Attachment; +import org.jclouds.ec2.domain.AvailabilityZone; +import org.jclouds.ec2.domain.BlockDevice; +import org.jclouds.ec2.domain.InstanceState; +import org.jclouds.ec2.domain.InstanceType; +import org.jclouds.ec2.domain.Reservation; +import org.jclouds.ec2.domain.RootDeviceType; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.ec2.xml.BaseEC2HandlerTest; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.location.Region; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; + +/** + * Tests behavior of {@code AWSDescribeInstancesResponseHandler} + * + * @author Adrian Cole + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +@Test(groups = "unit", testName = "AWSDescribeInstancesResponseHandlerTest") +public class AWSDescribeInstancesResponseHandlerTest extends BaseEC2HandlerTest { + + private DateService dateService; + + @BeforeTest + @Override + protected void setUpInjector() { + super.setUpInjector(); + dateService = injector.getInstance(DateService.class); + assert dateService != null; + } + + public void testWhenRunning() throws UnknownHostException { + + Set> contents = ImmutableSet.of(new Reservation( + defaultRegion, ImmutableSet.of("adriancole.ec2ingress"), ImmutableSet + .of(new AWSRunningInstance.Builder().region(defaultRegion).groupId("adriancole.ec2ingress") + .amiLaunchIndex("0").dnsName("ec2-174-129-81-68.compute-1.amazonaws.com").imageId( + "ami-82e4b5c7").instanceId("i-0799056f").instanceState(InstanceState.RUNNING) + .instanceType(InstanceType.M1_SMALL).ipAddress("174.129.81.68").kernelId( + "aki-a71cf9ce").keyName("adriancole.ec21").launchTime( + dateService.iso8601DateParse("2009-11-09T03:00:34.000Z")).monitoringState( + MonitoringState.DISABLED).availabilityZone(AvailabilityZone.US_EAST_1C) + .virtualizationType("paravirtual").privateDnsName("ip-10-243-42-70.ec2.internal") + .privateIpAddress("10.243.42.70").ramdiskId("ari-a51cf9cc").rootDeviceType( + RootDeviceType.INSTANCE_STORE).build()), "993194456877", null, "r-a3c508cb")); + + Set> result = parseAWSRunningInstances("/describe_instances_running.xml"); + + assertEquals(result, contents); + } + + public void testApplyInputStream() { + Set> contents = ImmutableSet.of(new Reservation( + defaultRegion, ImmutableSet.of("default"), ImmutableSet.of(new AWSRunningInstance.Builder().region( + defaultRegion).groupId("default").amiLaunchIndex("23").dnsName( + "ec2-72-44-33-4.compute-1.amazonaws.com").imageId("ami-6ea54007").instanceId("i-28a64341") + .instanceState(InstanceState.RUNNING).instanceType(InstanceType.M1_LARGE).kernelId( + "aki-ba3adfd3").keyName("example-key-name").launchTime( + dateService.iso8601DateParse("2007-08-07T11:54:42.000Z")).monitoringState( + MonitoringState.DISABLED).availabilityZone(AvailabilityZone.US_EAST_1B) + .virtualizationType("paravirtual").privateDnsName("10-251-50-132.ec2.internal").productCode( + "774F4FF8").ramdiskId("ari-badbad00").rootDeviceType(RootDeviceType.INSTANCE_STORE) + .build(), new AWSRunningInstance.Builder().region(defaultRegion).groupId("default") + .amiLaunchIndex("23").dnsName("ec2-72-44-33-6.compute-1.amazonaws.com").imageId("ami-6ea54007") + .instanceId("i-28a64435").instanceState(InstanceState.RUNNING).instanceType( + InstanceType.M1_LARGE).kernelId("aki-ba3adfd3").keyName("example-key-name") + .launchTime(dateService.iso8601DateParse("2007-08-07T11:54:42.000Z")).monitoringState( + MonitoringState.DISABLED).availabilityZone(AvailabilityZone.US_EAST_1B) + .virtualizationType("paravirtual").privateDnsName("10-251-50-134.ec2.internal").productCode( + "774F4FF8").ramdiskId("ari-badbad00").rootDeviceType(RootDeviceType.INSTANCE_STORE) + .build()), "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM", null, "r-44a5402d")); + + Set> result = parseAWSRunningInstances("/describe_instances.xml"); + + assertEquals(result, contents); + } + + public void testEBS() throws UnknownHostException { + + Set> contents = ImmutableSet.of(new Reservation( + defaultRegion, ImmutableSet.of("adriancole.ec2ebsingress"), ImmutableSet + .of(new AWSRunningInstance.Builder().region(defaultRegion).groupId("adriancole.ec2ebsingress") + .amiLaunchIndex("0").dnsName("ec2-75-101-203-146.compute-1.amazonaws.com").imageId( + "ami-849875ed").instanceId("i-e564438d").instanceState(InstanceState.RUNNING) + .instanceType(InstanceType.M1_SMALL).ipAddress("75.101.203.146").kernelId( + "aki-a71cf9ce").keyName("adriancole.ec2ebs1").launchTime( + dateService.iso8601DateParse("2009-12-30T04:06:23.000Z")).monitoringState( + MonitoringState.DISABLED).availabilityZone(AvailabilityZone.US_EAST_1B) + .placementGroup("placement").virtualizationType("hvm").privateDnsName( + "domU-12-31-39-09-CE-53.compute-1.internal").privateIpAddress( + "10.210.209.157").ramdiskId("ari-a51cf9cc") + .rootDeviceType(RootDeviceType.EBS).rootDeviceName("/dev/sda1").device( + "/dev/sda1", + new BlockDevice("vol-dc6ca8b5", Attachment.Status.ATTACHED, dateService + .iso8601DateParse("2009-12-30T04:06:29.000Z"), true)).build()), + "993194456877", null, "r-596dd731")); + + Set> result = parseAWSRunningInstances("/describe_instances_ebs.xml"); + + assertEquals(result, contents); + } + + static ParseSax>> createParser() { + Injector injector = Guice.createInjector(new SaxParserModule(), new AbstractModule() { + + @Override + protected void configure() { + bind(String.class).annotatedWith(Region.class).toInstance("us-east-1"); + bind(RunningInstance.Builder.class).to(AWSRunningInstance.Builder.class); + } + + }); + ParseSax>> parser = (ParseSax>>) injector + .getInstance(ParseSax.Factory.class).create( + injector.getInstance(AWSDescribeInstancesResponseHandler.class)); + return parser; + } + + public static Set> parseAWSRunningInstances(String resource) { + InputStream is = AWSDescribeInstancesResponseHandlerTest.class.getResourceAsStream(resource); + return createParser().parse(is); + } +} diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribePlacementGroupsResponseHandlerTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/DescribePlacementGroupsResponseHandlerTest.java similarity index 92% rename from apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribePlacementGroupsResponseHandlerTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/DescribePlacementGroupsResponseHandlerTest.java index 22b2c6d28b..0b84c608a3 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribePlacementGroupsResponseHandlerTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/DescribePlacementGroupsResponseHandlerTest.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import static org.easymock.EasyMock.expect; import static org.easymock.classextension.EasyMock.createMock; @@ -26,7 +26,9 @@ import static org.testng.Assert.assertEquals; import java.io.InputStream; -import org.jclouds.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.xml.DescribePlacementGroupsResponseHandler; +import org.jclouds.ec2.xml.BaseEC2HandlerTest; import org.jclouds.http.functions.ParseSax; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.testng.annotations.Test; diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeReservedInstancesOfferingResponseHandlerTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/DescribeReservedInstancesOfferingResponseHandlerTest.java similarity index 97% rename from apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeReservedInstancesOfferingResponseHandlerTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/DescribeReservedInstancesOfferingResponseHandlerTest.java index da9c2475c2..2f27a2b59a 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/xml/DescribeReservedInstancesOfferingResponseHandlerTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/DescribeReservedInstancesOfferingResponseHandlerTest.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import static org.easymock.EasyMock.expect; import static org.easymock.classextension.EasyMock.createMock; @@ -27,6 +27,7 @@ import static org.testng.Assert.assertEquals; import java.io.InputStream; import org.jclouds.ec2.domain.ReservedInstancesOffering; +import org.jclouds.ec2.xml.BaseEC2HandlerTest; import org.jclouds.http.functions.ParseSax; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.testng.annotations.Test; diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/xml/MonitoringStateHandlerTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/MonitoringStateHandlerTest.java similarity index 92% rename from apis/ec2/src/test/java/org/jclouds/ec2/xml/MonitoringStateHandlerTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/MonitoringStateHandlerTest.java index 02fac61471..23f1778902 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/xml/MonitoringStateHandlerTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/MonitoringStateHandlerTest.java @@ -17,14 +17,15 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import static org.testng.Assert.assertEquals; import java.io.InputStream; import java.util.Map; -import org.jclouds.ec2.domain.MonitoringState; +import org.jclouds.aws.ec2.domain.MonitoringState; +import org.jclouds.aws.ec2.xml.MonitoringStateHandler; import org.jclouds.http.functions.BaseHandlerTest; import org.testng.annotations.Test; diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/xml/ProductCodesHandlerTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/ProductCodesHandlerTest.java similarity index 95% rename from apis/ec2/src/test/java/org/jclouds/ec2/xml/ProductCodesHandlerTest.java rename to providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/ProductCodesHandlerTest.java index 64996fa507..0db3680dd1 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/xml/ProductCodesHandlerTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/ProductCodesHandlerTest.java @@ -17,13 +17,14 @@ * ==================================================================== */ -package org.jclouds.ec2.xml; +package org.jclouds.aws.ec2.xml; import static org.testng.Assert.assertEquals; import java.io.InputStream; import java.util.Set; +import org.jclouds.aws.ec2.xml.ProductCodesHandler; import org.jclouds.http.functions.BaseHandlerTest; import org.testng.annotations.Test; diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/RunInstancesResponseHandlerTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/RunInstancesResponseHandlerTest.java new file mode 100644 index 0000000000..77cee3c388 --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/xml/RunInstancesResponseHandlerTest.java @@ -0,0 +1,117 @@ +/** + * + * 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.aws.ec2.xml; + +import static org.easymock.EasyMock.expect; +import static org.easymock.classextension.EasyMock.createMock; +import static org.easymock.classextension.EasyMock.replay; +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; + +import org.jclouds.aws.ec2.domain.AWSRunningInstance; +import org.jclouds.aws.ec2.domain.MonitoringState; +import org.jclouds.date.DateService; +import org.jclouds.ec2.domain.AvailabilityZone; +import org.jclouds.ec2.domain.InstanceState; +import org.jclouds.ec2.domain.InstanceType; +import org.jclouds.ec2.domain.Reservation; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.ec2.xml.BaseEC2HandlerTest; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.location.Region; +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; + +/** + * Tests behavior of {@code RunInstancesResponseHandler} + * + * @author Adrian Cole + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +@Test(groups = "unit", testName = "RunInstancesResponseHandlerTest") +public class RunInstancesResponseHandlerTest extends BaseEC2HandlerTest { + + private DateService dateService; + + @BeforeTest + @Override + protected void setUpInjector() { + injector = Guice.createInjector(new SaxParserModule(), new AbstractModule() { + + @Override + protected void configure() { + bind(String.class).annotatedWith(Region.class).toInstance("us-east-1"); + bind(RunningInstance.Builder.class).to(AWSRunningInstance.Builder.class); + } + + }); + factory = injector.getInstance(ParseSax.Factory.class); + dateService = injector.getInstance(DateService.class); + assert dateService != null; + } + + public void testApplyInputStream() { + + InputStream is = getClass().getResourceAsStream("/run_instances.xml"); + + Reservation expected = new Reservation(defaultRegion, + ImmutableSet.of("default"), ImmutableSet.of( + + new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("0").imageId( + "ami-60a54009").instanceId("i-2ba64342").instanceState(InstanceState.PENDING).instanceType( + InstanceType.M1_SMALL).keyName("example-key-name").launchTime( + dateService.iso8601DateParse("2007-08-07T11:51:50.000Z")).monitoringState( + MonitoringState.ENABLED).availabilityZone(AvailabilityZone.US_EAST_1B).build(), + + new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("1").imageId( + "ami-60a54009").instanceId("i-2bc64242").instanceState(InstanceState.PENDING).instanceType( + InstanceType.M1_SMALL).keyName("example-key-name").launchTime( + dateService.iso8601DateParse("2007-08-07T11:51:50.000Z")).monitoringState( + MonitoringState.ENABLED).availabilityZone(AvailabilityZone.US_EAST_1B).build(), + + new AWSRunningInstance.Builder().region(defaultRegion).groupId("default").amiLaunchIndex("2").imageId( + "ami-60a54009").instanceId("i-2be64332").instanceState(InstanceState.PENDING).instanceType( + InstanceType.M1_SMALL).keyName("example-key-name").launchTime( + dateService.iso8601DateParse("2007-08-07T11:51:50.000Z")).monitoringState( + MonitoringState.ENABLED).availabilityZone(AvailabilityZone.US_EAST_1B).build()) + + , "AIDADH4IGTRXXKCD", null, "r-47a5402e"); + + AWSRunInstancesResponseHandler handler = injector.getInstance(AWSRunInstancesResponseHandler.class); + addDefaultRegionToHandler(handler); + Reservation result = factory.create(handler).parse(is); + assertEquals(result, expected); + } + + private void addDefaultRegionToHandler(ParseSax.HandlerWithResult handler) { + GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); + expect(request.getArgs()).andReturn(ImmutableList. of()).atLeastOnce(); + replay(request); + handler.setContext(request); + } +} diff --git a/apis/ec2/src/test/resources/describe_image_attribute_productCodes.xml b/providers/aws-ec2/src/test/resources/describe_image_attribute_productCodes.xml similarity index 100% rename from apis/ec2/src/test/resources/describe_image_attribute_productCodes.xml rename to providers/aws-ec2/src/test/resources/describe_image_attribute_productCodes.xml diff --git a/apis/ec2/src/test/resources/describe_placement_groups.xml b/providers/aws-ec2/src/test/resources/describe_placement_groups.xml similarity index 100% rename from apis/ec2/src/test/resources/describe_placement_groups.xml rename to providers/aws-ec2/src/test/resources/describe_placement_groups.xml diff --git a/apis/ec2/src/test/resources/describe_reserved_instances_offerings.xml b/providers/aws-ec2/src/test/resources/describe_reserved_instances_offerings.xml similarity index 100% rename from apis/ec2/src/test/resources/describe_reserved_instances_offerings.xml rename to providers/aws-ec2/src/test/resources/describe_reserved_instances_offerings.xml diff --git a/apis/ec2/src/test/resources/monitoring.xml b/providers/aws-ec2/src/test/resources/monitoring.xml similarity index 100% rename from apis/ec2/src/test/resources/monitoring.xml rename to providers/aws-ec2/src/test/resources/monitoring.xml diff --git a/providers/eucalyptus-partnercloud-ec2/pom.xml b/providers/eucalyptus-partnercloud-ec2/pom.xml index d1c9c17be8..6511371856 100644 --- a/providers/eucalyptus-partnercloud-ec2/pom.xml +++ b/providers/eucalyptus-partnercloud-ec2/pom.xml @@ -39,6 +39,8 @@ 2010-06-15 FIXME_IDENTITY FIXME_CREDENTIAL + + kvm @@ -134,6 +136,10 @@ test.eucalyptus-partnercloud-ec2.credential ${test.eucalyptus-partnercloud-ec2.credential} + + test.eucalyptus-partnercloud-ec2.virtualization-type + ${test.eucalyptus-partnercloud-ec2.virtualization-type} + diff --git a/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudPropertiesBuilder.java b/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudPropertiesBuilder.java index 558a44af07..06183ae7a8 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudPropertiesBuilder.java +++ b/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudPropertiesBuilder.java @@ -34,6 +34,7 @@ public class EucalyptusPartnerCloudPropertiesBuilder extends EucalyptusPropertie @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty("eucalyptus-partnercloud-ec2.virtualization-type", "kvm"); properties.setProperty(PROPERTY_ENDPOINT, "http://partnercloud.eucalyptus.com:8773/services/Eucalyptus"); return properties; } diff --git a/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/config/EucalyptusPartnerCloudComputeServiceContextModule.java b/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/config/EucalyptusPartnerCloudComputeServiceContextModule.java index b98308ac77..e840573ffc 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/config/EucalyptusPartnerCloudComputeServiceContextModule.java +++ b/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/config/EucalyptusPartnerCloudComputeServiceContextModule.java @@ -27,6 +27,8 @@ import org.jclouds.ec2.compute.strategy.ReviseParsedImage; import org.jclouds.epc.strategy.EucalyptusPartnerCloudReviseParsedImage; import com.google.inject.Injector; +import com.google.inject.Key; +import com.google.inject.name.Names; /** * @@ -36,7 +38,9 @@ public class EucalyptusPartnerCloudComputeServiceContextModule extends EC2Comput @Override protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { - return template.osFamily(CENTOS).locationId("xen-cluster").osDescriptionMatches("xen"); + String virt = injector.getInstance(Key.get(String.class, Names + .named("eucalyptus-partnercloud-ec2.virtualization-type"))); + return template.osFamily(CENTOS).locationId(virt + "-cluster").osDescriptionMatches(virt); } @Override diff --git a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusComputeServiceLiveTest.java b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusComputeServiceLiveTest.java index ac2adc6b76..3f93f1c81d 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusComputeServiceLiveTest.java +++ b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusComputeServiceLiveTest.java @@ -19,12 +19,9 @@ package org.jclouds.epc.compute; -import static org.jclouds.compute.util.ComputeServiceUtils.getCores; -import static org.testng.Assert.assertEquals; +import java.util.Properties; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.Template; -import org.jclouds.ec2.compute.EC2ComputeServiceLiveTest; +import org.jclouds.eucalyptus.compute.EucalyptusComputeServiceLiveTest; import org.testng.annotations.Test; /** @@ -32,7 +29,7 @@ import org.testng.annotations.Test; * @author Adrian Cole */ @Test(groups = "live", sequential = true, testName = "EucalyptusPartnerCloudEucalyptusComputeServiceLiveTest") -public class EucalyptusPartnerCloudEucalyptusComputeServiceLiveTest extends EC2ComputeServiceLiveTest { +public class EucalyptusPartnerCloudEucalyptusComputeServiceLiveTest extends EucalyptusComputeServiceLiveTest { public EucalyptusPartnerCloudEucalyptusComputeServiceLiveTest() { provider = "eucalyptus-partnercloud-ec2"; @@ -41,23 +38,11 @@ public class EucalyptusPartnerCloudEucalyptusComputeServiceLiveTest extends EC2C } @Override - @Test(enabled = false) - public void testExtendedOptionsAndLogin() throws Exception { - // euc does not support monitoring + protected Properties setupProperties() { + Properties overrides = super.setupProperties(); + if (System.getProperties().containsKey("test.eucalyptus-partnercloud-ec2.virtualization-type")) + overrides.setProperty("eucalyptus-partnercloud-ec2.virtualization-type", System + .getProperty("test.eucalyptus-partnercloud-ec2.virtualization-type")); + return overrides; } - - @Override - @Test(enabled = false) - public void testExtendedOptionsNoKeyPair() throws Exception { - // euc does not support multiple security groups - } - - @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()), 1.0d); - } - } diff --git a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java index 23bce83fd2..ec7612aeca 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java +++ b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java @@ -68,7 +68,7 @@ public class EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest extends Bas assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS); assertEquals(defaultTemplate.getImage().getUserMetadata().get("rootDeviceType"), "instance-store"); - assertEquals(defaultTemplate.getLocation().getId(), "xen-cluster"); + assertEquals(defaultTemplate.getLocation().getId(), "kvm-cluster"); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } diff --git a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/domain/InterpretableStatement.java b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/domain/InterpretableStatement.java index e9de1ee074..a423a105f9 100644 --- a/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/domain/InterpretableStatement.java +++ b/scriptbuilder/src/main/java/org/jclouds/scriptbuilder/domain/InterpretableStatement.java @@ -72,4 +72,9 @@ public class InterpretableStatement implements Statement { return false; return true; } + + @Override + public String toString() { + return "[statements=" + Arrays.toString(statements) + "]"; + } } \ No newline at end of file From 142aec45cb6d6da6283a7d1b63d94a0880a21b0a Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 28 Jan 2011 10:41:40 -0800 Subject: [PATCH 02/81] walrus: workaroud date parse issue, more intelligently deduce containernotfoundexception when s3 is in 'path' mode, and adjust base test classes --- .../EucalyptusPropertiesBuilder.java | 1 - .../handlers/ParseS3ErrorFromXmlContent.java | 59 ++++++--- .../ParseS3ErrorFromXmlContentTest.java | 122 ++++++++++++++++++ .../WalrusBlobIntegrationLiveTest.java | 12 +- .../walrus/blobstore/WalrusBlobLiveTest.java | 4 +- .../WalrusBlobMapIntegrationLiveTest.java | 4 +- .../blobstore/WalrusBlobSignerLiveTest.java | 4 +- .../WalrusContainerIntegrationLiveTest.java | 4 +- .../blobstore/WalrusContainerLiveTest.java | 4 +- ...lrusInputStreamMapIntegrationLiveTest.java | 4 +- .../WalrusServiceIntegrationLiveTest.java | 4 +- .../blobstore/WalrusTestInitializer.java | 19 +-- ...ParseSystemAndUserMetadataFromHeaders.java | 2 +- ...eSystemAndUserMetadataFromHeadersTest.java | 12 ++ 14 files changed, 197 insertions(+), 58 deletions(-) create mode 100644 apis/s3/src/test/java/org/jclouds/s3/handlers/ParseS3ErrorFromXmlContentTest.java diff --git a/apis/eucalyptus/src/main/java/org/jclouds/eucalyptus/EucalyptusPropertiesBuilder.java b/apis/eucalyptus/src/main/java/org/jclouds/eucalyptus/EucalyptusPropertiesBuilder.java index d9de27819c..794eaa9d27 100644 --- a/apis/eucalyptus/src/main/java/org/jclouds/eucalyptus/EucalyptusPropertiesBuilder.java +++ b/apis/eucalyptus/src/main/java/org/jclouds/eucalyptus/EucalyptusPropertiesBuilder.java @@ -41,7 +41,6 @@ public class EucalyptusPropertiesBuilder extends EC2PropertiesBuilder { properties.setProperty(PROPERTY_REGIONS, "Eucalyptus"); properties.setProperty(PROPERTY_EC2_AMI_OWNERS, "admin"); properties.setProperty(PROPERTY_TIMEOUT_PORT_OPEN, 5 * 60 * 1000 + ""); - return properties; } diff --git a/apis/s3/src/main/java/org/jclouds/s3/handlers/ParseS3ErrorFromXmlContent.java b/apis/s3/src/main/java/org/jclouds/s3/handlers/ParseS3ErrorFromXmlContent.java index 58fa59666c..a2ac6396f8 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/handlers/ParseS3ErrorFromXmlContent.java +++ b/apis/s3/src/main/java/org/jclouds/s3/handlers/ParseS3ErrorFromXmlContent.java @@ -19,7 +19,17 @@ package org.jclouds.s3.handlers; +import static com.google.common.base.Predicates.equalTo; +import static com.google.common.base.Predicates.not; +import static com.google.common.collect.Iterables.filter; +import static com.google.common.collect.Lists.newArrayList; +import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_SERVICE_PATH; +import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_VIRTUAL_HOST_BUCKETS; + +import java.util.List; + import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.aws.domain.AWSError; @@ -31,6 +41,9 @@ import org.jclouds.http.HttpCommand; import org.jclouds.http.HttpResponse; import org.jclouds.rest.ResourceNotFoundException; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; + /** * @author Adrian Cole * @@ -38,27 +51,43 @@ import org.jclouds.rest.ResourceNotFoundException; @Singleton public class ParseS3ErrorFromXmlContent extends ParseAWSErrorFromXmlContent { + private final String servicePath; + private final boolean isVhostStyle; + @Inject - ParseS3ErrorFromXmlContent(AWSUtils utils) { + ParseS3ErrorFromXmlContent(AWSUtils utils, @Named(PROPERTY_S3_VIRTUAL_HOST_BUCKETS) boolean isVhostStyle, + @Named(PROPERTY_S3_SERVICE_PATH) String servicePath) { super(utils); + this.servicePath = servicePath; + this.isVhostStyle = isVhostStyle; } protected Exception refineException(HttpCommand command, HttpResponse response, Exception exception, AWSError error, - String message) { + String message) { switch (response.getStatusCode()) { - case 404: - if (!command.getCurrentRequest().getMethod().equals("DELETE")) { - exception = new ResourceNotFoundException(message, exception); - String container = command.getCurrentRequest().getEndpoint().getHost(); - String key = command.getCurrentRequest().getEndpoint().getPath(); - if (key == null || key.equals("/")) - exception = new ContainerNotFoundException(container, message); - else - exception = new KeyNotFoundException(container, key, message); - } - return exception; - default: - return super.refineException(command, response, exception, error, message); + case 404: + if (!command.getCurrentRequest().getMethod().equals("DELETE")) { + exception = new ResourceNotFoundException(message, exception); + if (isVhostStyle) { + String container = command.getCurrentRequest().getEndpoint().getHost(); + String key = command.getCurrentRequest().getEndpoint().getPath(); + if (key == null || key.equals("/")) + exception = new ContainerNotFoundException(container, message); + else + exception = new KeyNotFoundException(container, key, message); + } else if (command.getCurrentRequest().getEndpoint().getPath().indexOf(servicePath + "/") == 0) { + String path = command.getCurrentRequest().getEndpoint().getPath().substring(servicePath.length()); + List parts = newArrayList(filter(Splitter.on('/').split(path), not(equalTo("")))); + if (parts.size() == 1) { + exception = new ContainerNotFoundException(parts.get(0), message); + } else if (parts.size() > 1) { + exception = new KeyNotFoundException(parts.remove(0), Joiner.on('/').join(parts), message); + } + } + } + return exception; + default: + return super.refineException(command, response, exception, error, message); } } } \ No newline at end of file diff --git a/apis/s3/src/test/java/org/jclouds/s3/handlers/ParseS3ErrorFromXmlContentTest.java b/apis/s3/src/test/java/org/jclouds/s3/handlers/ParseS3ErrorFromXmlContentTest.java new file mode 100644 index 0000000000..8ce7e2541c --- /dev/null +++ b/apis/s3/src/test/java/org/jclouds/s3/handlers/ParseS3ErrorFromXmlContentTest.java @@ -0,0 +1,122 @@ +/** + * + * 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.s3.handlers; + +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.easymock.classextension.EasyMock.verify; +import static org.jclouds.aws.reference.AWSConstants.PROPERTY_HEADER_TAG; +import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_SERVICE_PATH; +import static org.jclouds.s3.reference.S3Constants.PROPERTY_S3_VIRTUAL_HOST_BUCKETS; + +import java.net.URI; + +import org.easymock.IArgumentMatcher; +import org.jclouds.blobstore.ContainerNotFoundException; +import org.jclouds.blobstore.KeyNotFoundException; +import org.jclouds.http.HttpCommand; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.io.Payloads; +import org.jclouds.rest.RequestSigner; +import org.jclouds.util.Strings2; +import org.testng.annotations.Test; + +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.name.Names; + +/** + * + * @author Adrian Cole + */ +@Test(groups = { "unit" }) +public class ParseS3ErrorFromXmlContentTest { + private static final String SERVICE_PATH = "/services/Walrus"; + + @Test + public void test404ContainerNotFoundExceptionPath() { + assertCodeMakes("GET", URI + .create("http://partnercloud.eucalyptus.com:8773/services/Walrus/adriancole-blobstore58/"), 404, "HTTP/1.1 404 Not Found", false, + "Monster.NotFound", ContainerNotFoundException.class); + } + + + @Test + public void test404KeyNotFoundExceptionPath() { + assertCodeMakes("GET", URI + .create("http://partnercloud.eucalyptus.com:8773/services/Walrus/adriancole-blobstore58/apples"), 404, "HTTP/1.1 404 Not Found", false, + "Monster.NotFound", KeyNotFoundException.class); + } + + private void assertCodeMakes(String method, URI uri, int statusCode, String message, final boolean virtualHost, + String content, Class expected) { + + ParseS3ErrorFromXmlContent function = Guice.createInjector(new SaxParserModule(), new AbstractModule() { + + @Override + protected void configure() { + bind(RequestSigner.class).toInstance(createMock(RequestSigner.class)); + bindConstant().annotatedWith(Names.named(PROPERTY_HEADER_TAG)).to("amz"); + bindConstant().annotatedWith(Names.named(PROPERTY_S3_SERVICE_PATH)).to(SERVICE_PATH); + bindConstant().annotatedWith(Names.named(PROPERTY_S3_VIRTUAL_HOST_BUCKETS)).to(virtualHost); + } + + }).getInstance(ParseS3ErrorFromXmlContent.class); + + HttpCommand command = createMock(HttpCommand.class); + HttpRequest request = new HttpRequest(method, uri); + HttpResponse response = new HttpResponse(statusCode, message, Payloads.newInputStreamPayload(Strings2 + .toInputStream(content))); + response.getPayload().getContentMetadata().setContentType("application/xml"); + + expect(command.getCurrentRequest()).andReturn(request).atLeastOnce(); + command.setException(classEq(expected)); + + replay(command); + + function.handleError(command, response); + + verify(command); + } + + public static Exception classEq(final Class in) { + reportMatcher(new IArgumentMatcher() { + + @Override + public void appendTo(StringBuffer buffer) { + buffer.append("classEq("); + buffer.append(in); + buffer.append(")"); + } + + @Override + public boolean matches(Object arg) { + return arg.getClass() == in; + } + + }); + return null; + } + +} \ No newline at end of file diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobIntegrationLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobIntegrationLiveTest.java index 1165423a4c..f0aabbf0fc 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobIntegrationLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobIntegrationLiveTest.java @@ -19,22 +19,14 @@ package org.jclouds.walrus.blobstore; -import java.io.IOException; -import java.util.concurrent.ExecutionException; - -import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest; +import org.jclouds.s3.blobstore.integration.S3BlobIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "WalrusBlobIntegrationLiveTest") -public class WalrusBlobIntegrationLiveTest extends BaseBlobIntegrationTest { +public class WalrusBlobIntegrationLiveTest extends S3BlobIntegrationLiveTest { - @Override - @Test(expectedExceptions = IllegalArgumentException.class) - public void testPutObjectStream() throws InterruptedException, IOException, ExecutionException { - super.testPutObjectStream(); - } } diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobLiveTest.java index 26473d2c10..75dc0cec0e 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobLiveTest.java @@ -19,13 +19,13 @@ package org.jclouds.walrus.blobstore; -import org.jclouds.blobstore.integration.internal.BaseBlobLiveTest; +import org.jclouds.s3.blobstore.integration.S3BlobLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "WalrusBlobLiveTest") -public class WalrusBlobLiveTest extends BaseBlobLiveTest { +public class WalrusBlobLiveTest extends S3BlobLiveTest { } diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobMapIntegrationLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobMapIntegrationLiveTest.java index 9e5e4966a8..ade5069f70 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobMapIntegrationLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobMapIntegrationLiveTest.java @@ -19,13 +19,13 @@ package org.jclouds.walrus.blobstore; -import org.jclouds.blobstore.integration.internal.BaseBlobMapIntegrationTest; +import org.jclouds.s3.blobstore.integration.S3BlobMapIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "WalrusBlobMapIntegrationLiveTest") -public class WalrusBlobMapIntegrationLiveTest extends BaseBlobMapIntegrationTest { +public class WalrusBlobMapIntegrationLiveTest extends S3BlobMapIntegrationLiveTest { } diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobSignerLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobSignerLiveTest.java index aa8a20ec47..1cdcab7280 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobSignerLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobSignerLiveTest.java @@ -19,7 +19,7 @@ package org.jclouds.walrus.blobstore; -import org.jclouds.blobstore.integration.internal.BaseBlobSignerLiveTest; +import org.jclouds.s3.blobstore.integration.S3BlobSignerLiveTest; import org.testng.annotations.Test; /** @@ -27,6 +27,6 @@ import org.testng.annotations.Test; * @author Adrian Cole */ @Test(groups = "live", testName = "WalrusBlobSignerLiveTest") -public class WalrusBlobSignerLiveTest extends BaseBlobSignerLiveTest { +public class WalrusBlobSignerLiveTest extends S3BlobSignerLiveTest { } diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusContainerIntegrationLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusContainerIntegrationLiveTest.java index 39c47ed82f..3e38fd5031 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusContainerIntegrationLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusContainerIntegrationLiveTest.java @@ -19,13 +19,13 @@ package org.jclouds.walrus.blobstore; -import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest; +import org.jclouds.s3.blobstore.integration.S3ContainerIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "WalrusContainerIntegrationLiveTest") -public class WalrusContainerIntegrationLiveTest extends BaseContainerIntegrationTest { +public class WalrusContainerIntegrationLiveTest extends S3ContainerIntegrationLiveTest { } diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusContainerLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusContainerLiveTest.java index ad39f9eb7c..e4ea2231a2 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusContainerLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusContainerLiveTest.java @@ -19,13 +19,13 @@ package org.jclouds.walrus.blobstore; -import org.jclouds.blobstore.integration.internal.BaseContainerLiveTest; +import org.jclouds.s3.blobstore.integration.S3ContainerLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "WalrusContainerLiveTest") -public class WalrusContainerLiveTest extends BaseContainerLiveTest { +public class WalrusContainerLiveTest extends S3ContainerLiveTest { } diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusInputStreamMapIntegrationLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusInputStreamMapIntegrationLiveTest.java index d861cac1e1..26795181bd 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusInputStreamMapIntegrationLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusInputStreamMapIntegrationLiveTest.java @@ -19,13 +19,13 @@ package org.jclouds.walrus.blobstore; -import org.jclouds.blobstore.integration.internal.BaseInputStreamMapIntegrationTest; +import org.jclouds.s3.blobstore.integration.S3InputStreamMapIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "WalrusInputStreamMapIntegrationLiveTest") -public class WalrusInputStreamMapIntegrationLiveTest extends BaseInputStreamMapIntegrationTest { +public class WalrusInputStreamMapIntegrationLiveTest extends S3InputStreamMapIntegrationLiveTest { } diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusServiceIntegrationLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusServiceIntegrationLiveTest.java index 90c612cbf9..4b02493cf2 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusServiceIntegrationLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusServiceIntegrationLiveTest.java @@ -19,13 +19,13 @@ package org.jclouds.walrus.blobstore; -import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest; +import org.jclouds.s3.blobstore.integration.S3ServiceIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "WalrusServiceIntegrationLiveTest") -public class WalrusServiceIntegrationLiveTest extends BaseServiceIntegrationTest { +public class WalrusServiceIntegrationLiveTest extends S3ServiceIntegrationLiveTest { } diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusTestInitializer.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusTestInitializer.java index 78eb23c1b9..3d729d9a29 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusTestInitializer.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusTestInitializer.java @@ -19,33 +19,18 @@ package org.jclouds.walrus.blobstore; -import java.io.IOException; +import org.jclouds.s3.blobstore.integration.S3TestInitializer; -import org.jclouds.blobstore.BlobStoreContext; -import org.jclouds.blobstore.BlobStoreContextFactory; -import org.jclouds.blobstore.integration.TransientBlobStoreTestInitializer; -import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest; -import org.jclouds.logging.log4j.config.Log4JLoggingModule; - -import com.google.common.collect.ImmutableSet; -import com.google.inject.Module; /** * * @author Adrian Cole */ -public class WalrusTestInitializer extends TransientBlobStoreTestInitializer { +public class WalrusTestInitializer extends S3TestInitializer { public WalrusTestInitializer() { provider = "walrus"; - BaseBlobStoreIntegrationTest.SANITY_CHECK_RETURNED_BUCKET_NAME = true; } - @Override - protected BlobStoreContext createLiveContext(Module configurationModule, String endpoint, String apiversion, - String app, String identity, String credential) throws IOException { - return new BlobStoreContextFactory().createContext(provider, ImmutableSet.of(configurationModule, - new Log4JLoggingModule()), setupProperties(endpoint, apiversion, identity, credential)); - } } diff --git a/blobstore/src/main/java/org/jclouds/blobstore/functions/ParseSystemAndUserMetadataFromHeaders.java b/blobstore/src/main/java/org/jclouds/blobstore/functions/ParseSystemAndUserMetadataFromHeaders.java index f7f75cab64..d925af97d7 100755 --- a/blobstore/src/main/java/org/jclouds/blobstore/functions/ParseSystemAndUserMetadataFromHeaders.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/functions/ParseSystemAndUserMetadataFromHeaders.java @@ -97,7 +97,7 @@ public class ParseSystemAndUserMetadataFromHeaders implements Function Date: Fri, 28 Jan 2011 12:04:24 -0800 Subject: [PATCH 03/81] modify yaml format: list of nodes --- .../src/main/java/org/jclouds/byon/Node.java | 16 ++++--- .../byon/functions/NodeToNodeMetadata.java | 2 +- .../jclouds/byon/functions/NodesFromYaml.java | 44 +++++++++++-------- .../byon/BYONComputeServiceLiveTest.java | 26 +++++------ .../functions/NodeToNodeMetadataTest.java | 2 +- .../byon/functions/NodesFromYamlTest.java | 2 +- .../NodesParsedFromSupplierTest.java | 7 --- .../byon/src/test/resources/test1.yaml | 28 ++++++------ 8 files changed, 66 insertions(+), 61 deletions(-) diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java index e5032843f6..7a7b32ead9 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java @@ -35,9 +35,10 @@ public class Node { public Node() { } - public Node(String id, String description, String hostname, String osArch, String osFamily, String osName, + public Node(String id, String name, String description, String hostname, String osArch, String osFamily, String osName, String osVersion, String group, List tags, String username, String credential, String sudo_password) { this.id = id; + this.name = name; this.description = description; this.hostname = hostname; this.os_arch = osArch; @@ -53,6 +54,7 @@ public class Node { // public due to snakeyaml public String id; + public String name; public String description; public String hostname; public String os_arch; @@ -69,6 +71,10 @@ public class Node { return id; } + public String getName() { + return name; + } + public String getGroup() { return group; } @@ -130,10 +136,10 @@ public class Node { @Override public String toString() { - return Objects.toStringHelper(this).add("id", id).add("description", description).add("hostname", hostname).add( - "osArch", os_arch).add("osFamily", os_family).add("osName", os_name).add("osVersion", os_version).add( - "group", group).add("tags", tags).add("username", username).add("hasCredential", credential != null) - .add("hasSudoPassword", sudo_password != null).toString(); + return Objects.toStringHelper(this).add("id", id).add("name", name).add("description", description).add( + "hostname", hostname).add("osArch", os_arch).add("osFamily", os_family).add("osName", os_name).add( + "osVersion", os_version).add("group", group).add("tags", tags).add("username", username).add( + "hasCredential", credential != null).add("hasSudoPassword", sudo_password != null).toString(); } } diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java index 078a2ede31..96cbde980f 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java @@ -59,7 +59,7 @@ public class NodeToNodeMetadata implements Function { public NodeMetadata apply(Node from) { NodeMetadataBuilder builder = new NodeMetadataBuilder(); builder.ids(from.getId()); - builder.name(from.getDescription()); + builder.name(from.getName()); builder.location(location.get()); builder.tag(from.getGroup()); // TODO add tags! diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java index 1dcfa29295..c27cc27b7c 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java @@ -22,6 +22,7 @@ package org.jclouds.byon.functions; import static com.google.common.base.Preconditions.checkState; import java.io.InputStream; +import java.util.List; import java.util.Map; import javax.inject.Singleton; @@ -33,26 +34,27 @@ import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; import com.google.common.base.Function; +import com.google.common.collect.Maps; /** * Parses the following syntax. * *
  * nodes:
- *     cluster-1:
- *         id: cluster-1
- *         description: xyz
- *         hostname: cluster-1.mydomain.com
- *         os_arch: x86
- *         os_family: linux
- *         os_name: redhat
- *         os_version: 5.3
- *         group: hadoop
- *         tags:
- *             - vanilla
- *         username: kelvin
- *         credential: password_or_rsa_in_base64
- *         sudo_password: password_in_base64
+ *     - id: cluster-1:
+ *       name: cluster-1
+ *       description: xyz
+ *       hostname: cluster-1.mydomain.com
+ *       os_arch: x86
+ *       os_family: linux
+ *       os_name: redhat
+ *       os_version: 5.3
+ *       group: hadoop
+ *       tags:
+ *           - vanilla
+ *       username: kelvin
+ *       credential: password_or_rsa_in_base64
+ *       sudo_password: password_in_base64
  * 
* * @author Kelvin Kakugawa @@ -65,7 +67,7 @@ public class NodesFromYaml implements Function> { * */ public static class Config { - public Map nodes; + public List nodes; } @Override @@ -77,12 +79,16 @@ public class NodesFromYaml implements Function> { constructor.addTypeDescription(nodeDesc); TypeDescription configDesc = new TypeDescription(Config.class); - configDesc.putMapPropertyType("nodes", String.class, Node.class); + configDesc.putListPropertyType("nodes", Node.class); constructor.addTypeDescription(configDesc); Yaml yaml = new Yaml(new Loader(constructor)); Config config = (Config) yaml.load(source); - checkState(config != null, "missing nodes: collection"); - return config.nodes; + checkState(config != null, "missing config: class"); + checkState(config.nodes != null, "missing nodes: collection"); + + return Maps.uniqueIndex(config.nodes, new Function(){ + public String apply(Node node) { return node.getId(); } + }); } -} \ No newline at end of file +} diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/BYONComputeServiceLiveTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/BYONComputeServiceLiveTest.java index 9e58366318..0fd3a2fd67 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/BYONComputeServiceLiveTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/BYONComputeServiceLiveTest.java @@ -60,19 +60,19 @@ public class BYONComputeServiceLiveTest { StringBuilder nodes = new StringBuilder(); nodes.append("nodes:\n"); - nodes.append(" mymachine:\n"); - nodes.append(" id: mymachine\n"); - nodes.append(" description: my local machine\n"); - nodes.append(" hostname: localhost\n"); - nodes.append(" os_arch: ").append(System.getProperty("os.arch")).append("\n"); - nodes.append(" os_family: ").append(OsFamily.UNIX).append("\n"); - nodes.append(" os_name: ").append(System.getProperty("os.name")).append("\n"); - nodes.append(" os_version: ").append(System.getProperty("os.version")).append("\n"); - nodes.append(" group: ").append("ssh").append("\n"); - nodes.append(" tags:\n"); - nodes.append(" - local\n"); - nodes.append(" username: ").append(System.getProperty("user.name")).append("\n"); - nodes.append(" credential: ").append(base64(ComputeTestUtils.setupKeyPair().get("private").getBytes())) + nodes.append(" - id: mymachine\n"); + nodes.append(" name: mymachine\n"); + nodes.append(" description: my local machine\n"); + nodes.append(" hostname: localhost\n"); + nodes.append(" os_arch: ").append(System.getProperty("os.arch")).append("\n"); + nodes.append(" os_family: ").append(OsFamily.UNIX).append("\n"); + nodes.append(" os_name: ").append(System.getProperty("os.name")).append("\n"); + nodes.append(" os_version: ").append(System.getProperty("os.version")).append("\n"); + nodes.append(" group: ").append("ssh").append("\n"); + nodes.append(" tags:\n"); + nodes.append(" - local\n"); + nodes.append(" username: ").append(System.getProperty("user.name")).append("\n"); + nodes.append(" credential: ").append(base64(ComputeTestUtils.setupKeyPair().get("private").getBytes())) .append("\n"); contextProperties.setProperty("byon.nodes", nodes.toString()); diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java index f7ab227b0a..e316785b1e 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java @@ -46,7 +46,7 @@ import com.google.common.collect.Maps; public class NodeToNodeMetadataTest { public static final Location location = new LocationImpl(LocationScope.PROVIDER, "byon", "byon", null); - public static final NodeMetadata TEST1 = new NodeMetadataBuilder().ids("cluster-1").tag("hadoop").name("xyz").location( + public static final NodeMetadata TEST1 = new NodeMetadataBuilder().ids("cluster-1").tag("hadoop").name("cluster-1").location( location).state(NodeState.RUNNING).operatingSystem( new OperatingSystemBuilder().name("redhat").family(OsFamily.RHEL).arch("x86").version("5.3").description( "xyz").build()).publicAddresses(ImmutableSet.of("cluster-1.mydomain.com")).credentials( diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java index 12e20a9e7b..7cd3fc5671 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java @@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableMap; */ public class NodesFromYamlTest { - public static final Node TEST1 = new Node("cluster-1", "xyz", "cluster-1.mydomain.com", "x86", "rhel", "redhat", + public static final Node TEST1 = new Node("cluster-1", "cluster-1", "xyz", "cluster-1.mydomain.com", "x86", "rhel", "redhat", "5.3", "hadoop", ImmutableList.of("vanilla"), "myUser", CryptoStreams.base64("fancyfoot".getBytes()), CryptoStreams.base64("sudo".getBytes())); diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/suppliers/NodesParsedFromSupplierTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/suppliers/NodesParsedFromSupplierTest.java index cfb036a1f8..c94e008db5 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/suppliers/NodesParsedFromSupplierTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/suppliers/NodesParsedFromSupplierTest.java @@ -37,11 +37,4 @@ public class NodesParsedFromSupplierTest { new NodesParsedFromSupplier(Suppliers.ofInstance(Strings2.toInputStream("nodes:\n")), new NodesFromYaml()).get(); } - - public void testCanParseSomething() throws Exception { - - new NodesParsedFromSupplier(Suppliers.ofInstance(Strings2.toInputStream("nodes:\n first:\n")), - new NodesFromYaml()).get(); - - } } diff --git a/sandbox-apis/byon/src/test/resources/test1.yaml b/sandbox-apis/byon/src/test/resources/test1.yaml index 4a611af553..8588db64d7 100644 --- a/sandbox-apis/byon/src/test/resources/test1.yaml +++ b/sandbox-apis/byon/src/test/resources/test1.yaml @@ -1,15 +1,15 @@ nodes: - cluster-1: - id: cluster-1 - description: xyz - hostname: cluster-1.mydomain.com - os_arch: x86 - os_family: rhel - os_name: redhat - os_version: 5.3 - group: hadoop - tags: - - vanilla - username: myUser - credential: ZmFuY3lmb290 - sudo_password: c3Vkbw== \ No newline at end of file + - id: cluster-1 + name: cluster-1 + description: xyz + hostname: cluster-1.mydomain.com + os_arch: x86 + os_family: rhel + os_name: redhat + os_version: 5.3 + group: hadoop + tags: + - vanilla + username: myUser + credential: ZmFuY3lmb290 + sudo_password: c3Vkbw== From ce82c05222ea669fecc11911daef31ea642375d4 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 28 Jan 2011 15:47:24 -0800 Subject: [PATCH 04/81] Issue 452: renamed description -> name made nodes a list instead of a map added credential_url --- sandbox-apis/byon/README.txt | 76 +++++++++++++++++++ .../src/main/java/org/jclouds/byon/Node.java | 23 +++--- .../BYONComputeServiceContextModule.java | 3 + .../byon/functions/NodeToNodeMetadata.java | 42 ++++++++-- .../jclouds/byon/functions/NodesFromYaml.java | 8 +- .../SupplyFromProviderURIOrNodesProperty.java | 26 ++++--- .../byon/BYONComputeServiceLiveTest.java | 7 +- .../jclouds/byon/BYONComputeServiceTest.java | 12 ++- .../functions/NodeToNodeMetadataTest.java | 18 +++-- .../byon/functions/NodesFromYamlTest.java | 15 +++- ...plyFromProviderURIOrNodesPropertyTest.java | 11 +++ .../byon/src/test/resources/test1.yaml | 1 - .../src/test/resources/test_with_url.yaml | 14 ++++ .../byon/src/test/resources/testkey.txt | 1 + 14 files changed, 210 insertions(+), 47 deletions(-) create mode 100644 sandbox-apis/byon/README.txt create mode 100644 sandbox-apis/byon/src/test/resources/test_with_url.yaml create mode 100644 sandbox-apis/byon/src/test/resources/testkey.txt diff --git a/sandbox-apis/byon/README.txt b/sandbox-apis/byon/README.txt new file mode 100644 index 0000000000..1b65a0620e --- /dev/null +++ b/sandbox-apis/byon/README.txt @@ -0,0 +1,76 @@ += Bring Your Own Nodes to the jclouds ComputeService = +The bring your own node provider (byon) allows you to specify a source which jclouds will read +nodes from. Using this, you can have jclouds control your standalone machines, or even cloud +hosts that are sitting idle. + +== Constraints == +The byon provider only supports the following functions of ComputeService: + * listNodes + * listNodesDetailsMatching + * getNodeMetadata + * runScriptOnNodesMatching + +== How to use the byon provider == +The byon provider requires you supply a list of nodes using a property. Here are +the valid properties you can use: + * byon.endpoint - url to access the list, can be http://, file://, classpath:// + * byon.nodes - inline defined yaml in string form. + +Note: + +The identity and credential fields of the ComputeServiceContextFactory are ignored. + +=== Java example === + +Properties props = new Properties(); + +// if you built the yaml string by hand +props.setProperty("byon.nodes", stringLiteral); + +// or you can specify an external reference +props.setProperty("byon.endpoint", "file://path/to/byon.yaml"); + +// or you can specify a file in your classpath +props.setProperty("byon.endpoint", "classpath:///byon.yaml"); + +context = new ComputeServiceContextFactory().createContext("byon", "foo", "bar", + ImmutableSet. of(new JschSshClientModule()), props); + +== File format == +You must define your nodes in yaml, and they must be in a collection called nodes. + +Here are the properties: + * id - opaque unique id + * name - optional; user specified name + * hostname - name or ip address to contact the node on + * os_arch - ex. x86 + * os_family - must conform to org.jclouds.compute.domain.OsFamily in lower-hyphen format + ex. rhel, ubuntu, centos, debian, amzn-linux + * os_name - ex. redhat + * os_version - normalized to numbers when possible. ex. for centos: 5.3, ubuntu: 10.10 + * group - primary group of the machine. ex. hadoop + * tags - list of arbitrary tags. * note this list is not yet in jclouds NodeMetadata + * username - primary login user to the os. ex. ubuntu, vcloud, root + * sudo_password - optional; base 64 encoded sudo password (ex. input to sudo -S) + one of: + * credential - base 64 encoded RSA private key or password + * credential_url - location of plain-text RSA private key or password. + ex. file:///home/me/.ssh/id_rsa + classpath:///id_rsa + +=== Example File === + +nodes: + - id: cluster-1 + name: cluster-1 + hostname: cluster-1.mydomain.com + os_arch: x86 + os_family: rhel + os_name: redhat + os_version: 5.3 + group: hadoop + tags: + - vanilla + username: myUser + credential: ZmFuY3lmb290 + sudo_password: c3Vkbw== diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java index 7a7b32ead9..6e2f954657 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java @@ -19,6 +19,7 @@ package org.jclouds.byon; +import java.net.URI; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -35,11 +36,11 @@ public class Node { public Node() { } - public Node(String id, String name, String description, String hostname, String osArch, String osFamily, String osName, - String osVersion, String group, List tags, String username, String credential, String sudo_password) { + public Node(String id, String name, String hostname, String osArch, String osFamily, + String osName, String osVersion, String group, List tags, String username, String credential, + URI credentialUrl, String sudo_password) { this.id = id; this.name = name; - this.description = description; this.hostname = hostname; this.os_arch = osArch; this.os_family = osFamily; @@ -49,13 +50,13 @@ public class Node { this.tags = ImmutableList.copyOf(tags); this.username = username; this.credential = credential; + this.credential_url = credentialUrl != null ? credentialUrl.toASCIIString() : null; this.sudo_password = sudo_password; } // public due to snakeyaml public String id; public String name; - public String description; public String hostname; public String os_arch; public String os_family; @@ -65,6 +66,7 @@ public class Node { public List tags; public String username; public String credential; + public String credential_url; public String sudo_password; public String getId() { @@ -79,10 +81,6 @@ public class Node { return group; } - public String getDescription() { - return description; - } - public String getHostname() { return hostname; } @@ -118,6 +116,10 @@ public class Node { return credential; } + public URI getCredentialUrl() { + return credential_url != null ? URI.create(credential_url) : null; + } + @Override public int hashCode() { return Objects.hashCode(id); @@ -136,10 +138,11 @@ public class Node { @Override public String toString() { - return Objects.toStringHelper(this).add("id", id).add("name", name).add("description", description).add( + return Objects.toStringHelper(this).add("id", id).add("name", name).add( "hostname", hostname).add("osArch", os_arch).add("osFamily", os_family).add("osName", os_name).add( "osVersion", os_version).add("group", group).add("tags", tags).add("username", username).add( - "hasCredential", credential != null).add("hasSudoPassword", sudo_password != null).toString(); + "hasCredential", credential != null || credential_url != null).add("hasSudoPassword", + sudo_password != null).toString(); } } diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/config/BYONComputeServiceContextModule.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/config/BYONComputeServiceContextModule.java index dc7cdb1cd1..231c43af34 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/config/BYONComputeServiceContextModule.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/config/BYONComputeServiceContextModule.java @@ -20,6 +20,7 @@ package org.jclouds.byon.config; import java.io.InputStream; +import java.net.URI; import java.util.Map; import javax.inject.Singleton; @@ -65,6 +66,8 @@ public class BYONComputeServiceContextModule extends }).to(NodesParsedFromSupplier.class); bind(new TypeLiteral>() { }).annotatedWith(Provider.class).to(SupplyFromProviderURIOrNodesProperty.class); + bind(new TypeLiteral>() { + }).to(SupplyFromProviderURIOrNodesProperty.class); // TODO make this somehow overridable via user request bind(new TypeLiteral>>() { }).to(NodesFromYaml.class); diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java index 96cbde980f..f1fa633b7a 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java @@ -21,8 +21,12 @@ package org.jclouds.byon.functions; import static com.google.common.base.Preconditions.checkNotNull; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; import java.util.Map; +import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Singleton; @@ -35,6 +39,8 @@ import org.jclouds.compute.domain.OsFamily; import org.jclouds.crypto.CryptoStreams; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; +import org.jclouds.logging.Logger; +import org.jclouds.util.Strings2; import com.google.common.base.Charsets; import com.google.common.base.Function; @@ -46,13 +52,19 @@ import com.google.common.collect.ImmutableSet; */ @Singleton public class NodeToNodeMetadata implements Function { + @Resource + protected Logger logger = Logger.NULL; + private final Supplier location; private final Map credentialStore; + private final Function slurp; @Inject - NodeToNodeMetadata(Supplier location, Map credentialStore) { + NodeToNodeMetadata(Supplier location, Function slurp, + Map credentialStore) { this.location = checkNotNull(location, "location"); this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.slurp = checkNotNull(slurp, "slurp"); } @Override @@ -64,17 +76,31 @@ public class NodeToNodeMetadata implements Function { builder.tag(from.getGroup()); // TODO add tags! builder.operatingSystem(new OperatingSystemBuilder().arch(from.getOsArch()).family( - OsFamily.fromValue(from.getOsFamily())).name(from.getOsName()).version(from.getOsVersion()).description( - from.getDescription()).build()); + OsFamily.fromValue(from.getOsFamily())).name(from.getOsName()).description(from.getOsName()).version( + from.getOsVersion()).build()); builder.state(NodeState.RUNNING); builder.publicAddresses(ImmutableSet. of(from.getHostname())); - Credentials creds = new Credentials(from.getUsername(), new String(CryptoStreams.base64(from.getCredential()), - Charsets.UTF_8)); - builder.credentials(creds); + + if (from.getUsername() != null) { + Credentials creds = null; + if (from.getCredentialUrl() != null) { + try { + creds = new Credentials(from.getUsername(), Strings2.toStringAndClose(slurp.apply(from + .getCredentialUrl()))); + } catch (IOException e) { + logger.error(e, "URI could not be read: %s", from.getCredentialUrl()); + } + } else if (from.getCredential() != null) { + creds = new Credentials(from.getUsername(), new String(CryptoStreams.base64(from.getCredential()), + Charsets.UTF_8)); + } + if (creds != null) + builder.credentials(creds); + credentialStore.put("node#" + from.getId(), creds); + } + if (from.getSudoPassword() != null) builder.adminPassword(new String(CryptoStreams.base64(from.getSudoPassword()), Charsets.UTF_8)); - credentialStore.put("node#" + from.getId(), creds); return builder.build(); } - } diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java index c27cc27b7c..6f5855218e 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java @@ -54,6 +54,8 @@ import com.google.common.collect.Maps; * - vanilla * username: kelvin * credential: password_or_rsa_in_base64 + * or + * credential_url: password_or_rsa_file ex. resource:///id_rsa will get the classpath /id_rsa.pub; file://path/to/id_rsa * sudo_password: password_in_base64 * * @@ -87,8 +89,10 @@ public class NodesFromYaml implements Function> { checkState(config != null, "missing config: class"); checkState(config.nodes != null, "missing nodes: collection"); - return Maps.uniqueIndex(config.nodes, new Function(){ - public String apply(Node node) { return node.getId(); } + return Maps.uniqueIndex(config.nodes, new Function() { + public String apply(Node node) { + return node.getId(); + } }); } } diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/suppliers/SupplyFromProviderURIOrNodesProperty.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/suppliers/SupplyFromProviderURIOrNodesProperty.java index b54fcceb21..0bbd3f5b61 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/suppliers/SupplyFromProviderURIOrNodesProperty.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/suppliers/SupplyFromProviderURIOrNodesProperty.java @@ -32,6 +32,7 @@ import org.jclouds.logging.Logger; import org.jclouds.util.Strings2; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.base.Throwables; import com.google.inject.Inject; @@ -40,7 +41,7 @@ import com.google.inject.name.Named; /** * @author Adrian Cole */ -public class SupplyFromProviderURIOrNodesProperty implements Supplier { +public class SupplyFromProviderURIOrNodesProperty implements Supplier, Function { @Resource protected Logger logger = Logger.NULL; private final URI url; @@ -51,7 +52,7 @@ public class SupplyFromProviderURIOrNodesProperty implements Supplier credentialStore = Maps.newLinkedHashMap(); - NodeToNodeMetadata parser = new NodeToNodeMetadata(Suppliers.ofInstance(location), credentialStore); + NodeToNodeMetadata parser = new NodeToNodeMetadata(Suppliers.ofInstance(location), + new SupplyFromProviderURIOrNodesProperty(URI.create("test")), credentialStore); assertEquals(parser.apply(NodesFromYamlTest.TEST1), TEST1); - assertEquals(credentialStore, ImmutableMap.of("node#cluster-1", new Credentials("myUser", "fancyfoot"))); + assertEquals(credentialStore, ImmutableMap.of("node#cluster-1", new Credentials("myUser", "fancyfoot"))); } } diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java index 7cd3fc5671..efbe233bdc 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java @@ -37,9 +37,9 @@ import com.google.common.collect.ImmutableMap; */ public class NodesFromYamlTest { - public static final Node TEST1 = new Node("cluster-1", "cluster-1", "xyz", "cluster-1.mydomain.com", "x86", "rhel", "redhat", - "5.3", "hadoop", ImmutableList.of("vanilla"), "myUser", CryptoStreams.base64("fancyfoot".getBytes()), - CryptoStreams.base64("sudo".getBytes())); + public static final Node TEST1 = new Node("cluster-1", "cluster-1", "cluster-1.mydomain.com", "x86", "rhel", + "redhat", "5.3", "hadoop", ImmutableList.of("vanilla"), "myUser", CryptoStreams.base64("fancyfoot" + .getBytes()), null, CryptoStreams.base64("sudo".getBytes())); @Test public void testNodesParse() throws Exception { @@ -50,6 +50,15 @@ public class NodesFromYamlTest { assertEquals(parser.apply(is), ImmutableMap.of(TEST1.getId(), TEST1)); } + @Test + public void testNodesParseWhenCredentialInUrl() throws Exception { + + InputStream is = getClass().getResourceAsStream("/test_with_url.yaml"); + NodesFromYaml parser = new NodesFromYaml(); + + assertEquals(parser.apply(is), ImmutableMap.of(TEST1.getId(), TEST1)); + } + @Test(expectedExceptions = IllegalStateException.class) public void testMustParseSomething() throws Exception { new NodesFromYaml().apply(Strings2.toInputStream("")); diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/suppliers/SupplyFromProviderURIOrNodesPropertyTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/suppliers/SupplyFromProviderURIOrNodesPropertyTest.java index 0ad987aa76..9bbfae02c0 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/suppliers/SupplyFromProviderURIOrNodesPropertyTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/suppliers/SupplyFromProviderURIOrNodesPropertyTest.java @@ -44,6 +44,17 @@ public class SupplyFromProviderURIOrNodesPropertyTest { } + @Test + public void testFromURIClasspath() throws Exception { + + SupplyFromProviderURIOrNodesProperty supplier = new SupplyFromProviderURIOrNodesProperty(URI + .create("classpath:///test1.yaml")); + + assertEquals(Strings2.toStringAndClose(supplier.get()), Strings2.toStringAndClose(getClass().getResourceAsStream( + "/test1.yaml"))); + + } + @Test public void testFromProperty() throws Exception { diff --git a/sandbox-apis/byon/src/test/resources/test1.yaml b/sandbox-apis/byon/src/test/resources/test1.yaml index 8588db64d7..1fc884fe49 100644 --- a/sandbox-apis/byon/src/test/resources/test1.yaml +++ b/sandbox-apis/byon/src/test/resources/test1.yaml @@ -1,7 +1,6 @@ nodes: - id: cluster-1 name: cluster-1 - description: xyz hostname: cluster-1.mydomain.com os_arch: x86 os_family: rhel diff --git a/sandbox-apis/byon/src/test/resources/test_with_url.yaml b/sandbox-apis/byon/src/test/resources/test_with_url.yaml new file mode 100644 index 0000000000..acb556f166 --- /dev/null +++ b/sandbox-apis/byon/src/test/resources/test_with_url.yaml @@ -0,0 +1,14 @@ +nodes: + - id: cluster-1 + name: cluster-1 + hostname: cluster-1.mydomain.com + os_arch: x86 + os_family: rhel + os_name: redhat + os_version: 5.3 + group: hadoop + tags: + - vanilla + username: myUser + credential_url: classpath:///testkey.txt + sudo_password: c3Vkbw== diff --git a/sandbox-apis/byon/src/test/resources/testkey.txt b/sandbox-apis/byon/src/test/resources/testkey.txt new file mode 100644 index 0000000000..adebd2d619 --- /dev/null +++ b/sandbox-apis/byon/src/test/resources/testkey.txt @@ -0,0 +1 @@ +fancyfoot \ No newline at end of file From f0a4a232658f95c58466c367f778f25599c05318 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 28 Jan 2011 16:22:57 -0800 Subject: [PATCH 05/81] Issue 452 os_name -> os_description, +description --- sandbox-apis/byon/README.txt | 32 +++++++++++-------- .../src/main/java/org/jclouds/byon/Node.java | 28 +++++++++------- .../byon/functions/NodeToNodeMetadata.java | 2 +- .../jclouds/byon/functions/NodesFromYaml.java | 2 +- .../byon/BYONComputeServiceLiveTest.java | 2 +- .../functions/NodeToNodeMetadataTest.java | 2 +- .../byon/functions/NodesFromYamlTest.java | 7 ++-- .../byon/src/test/resources/test1.yaml | 3 +- .../src/test/resources/test_with_url.yaml | 3 +- 9 files changed, 47 insertions(+), 34 deletions(-) diff --git a/sandbox-apis/byon/README.txt b/sandbox-apis/byon/README.txt index 1b65a0620e..2eeda5bf07 100644 --- a/sandbox-apis/byon/README.txt +++ b/sandbox-apis/byon/README.txt @@ -40,18 +40,21 @@ context = new ComputeServiceContextFactory().createContext("byon", "foo", "bar", You must define your nodes in yaml, and they must be in a collection called nodes. Here are the properties: - * id - opaque unique id - * name - optional; user specified name - * hostname - name or ip address to contact the node on - * os_arch - ex. x86 - * os_family - must conform to org.jclouds.compute.domain.OsFamily in lower-hyphen format - ex. rhel, ubuntu, centos, debian, amzn-linux - * os_name - ex. redhat - * os_version - normalized to numbers when possible. ex. for centos: 5.3, ubuntu: 10.10 - * group - primary group of the machine. ex. hadoop - * tags - list of arbitrary tags. * note this list is not yet in jclouds NodeMetadata - * username - primary login user to the os. ex. ubuntu, vcloud, root - * sudo_password - optional; base 64 encoded sudo password (ex. input to sudo -S) + * id - opaque unique id + * name - optional; user specified name + * description - optional; long description of this node + * note this is not yet in jclouds NodeMetadata + * hostname - name or ip address to contact the node on + * os_arch - ex. x86 + * os_family - must conform to org.jclouds.compute.domain.OsFamily in lower-hyphen format + ex. rhel, ubuntu, centos, debian, amzn-linux + * os_description - long description of the os ex. Ubuntu with lamp stack + * os_version - normalized to numbers when possible. ex. for centos: 5.3, ubuntu: 10.10 + * group - primary group of the machine. ex. hadoop + * tags - optional; list of arbitrary tags. + * note this list is not yet in jclouds NodeMetadata + * username - primary login user to the os. ex. ubuntu, vcloud, root + * sudo_password - optional; base 64 encoded sudo password (ex. input to sudo -S) one of: * credential - base 64 encoded RSA private key or password * credential_url - location of plain-text RSA private key or password. @@ -61,12 +64,13 @@ Here are the properties: === Example File === nodes: - - id: cluster-1 + - id: i-sdfkjh7 name: cluster-1 + description: accounting analytics cluster hostname: cluster-1.mydomain.com os_arch: x86 os_family: rhel - os_name: redhat + os_description: redhat with CDH os_version: 5.3 group: hadoop tags: diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java index 6e2f954657..9eecd2e87b 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/Node.java @@ -36,15 +36,16 @@ public class Node { public Node() { } - public Node(String id, String name, String hostname, String osArch, String osFamily, - String osName, String osVersion, String group, List tags, String username, String credential, - URI credentialUrl, String sudo_password) { + public Node(String id, String name, String description, String hostname, String osArch, String osFamily, + String osDescription, String osVersion, String group, List tags, String username, + String credential, URI credentialUrl, String sudo_password) { this.id = id; this.name = name; + this.description = description; this.hostname = hostname; this.os_arch = osArch; this.os_family = osFamily; - this.os_name = osName; + this.os_description = osDescription; this.os_version = osVersion; this.group = group; this.tags = ImmutableList.copyOf(tags); @@ -57,10 +58,11 @@ public class Node { // public due to snakeyaml public String id; public String name; + public String description; public String hostname; public String os_arch; public String os_family; - public String os_name; + public String os_description; public String os_version; public String group; public List tags; @@ -77,6 +79,10 @@ public class Node { return name; } + public String getDescription() { + return description; + } + public String getGroup() { return group; } @@ -93,8 +99,8 @@ public class Node { return os_family; } - public String getOsName() { - return os_name; + public String getOsDescription() { + return os_description; } public String getOsVersion() { @@ -138,10 +144,10 @@ public class Node { @Override public String toString() { - return Objects.toStringHelper(this).add("id", id).add("name", name).add( - "hostname", hostname).add("osArch", os_arch).add("osFamily", os_family).add("osName", os_name).add( - "osVersion", os_version).add("group", group).add("tags", tags).add("username", username).add( - "hasCredential", credential != null || credential_url != null).add("hasSudoPassword", + return Objects.toStringHelper(this).add("id", id).add("name", name).add("description", description).add( + "hostname", hostname).add("osArch", os_arch).add("osFamily", os_family).add("osDescription", + os_description).add("osVersion", os_version).add("group", group).add("tags", tags).add("username", + username).add("hasCredential", credential != null || credential_url != null).add("hasSudoPassword", sudo_password != null).toString(); } diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java index f1fa633b7a..1c9ca1b8c5 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java @@ -76,7 +76,7 @@ public class NodeToNodeMetadata implements Function { builder.tag(from.getGroup()); // TODO add tags! builder.operatingSystem(new OperatingSystemBuilder().arch(from.getOsArch()).family( - OsFamily.fromValue(from.getOsFamily())).name(from.getOsName()).description(from.getOsName()).version( + OsFamily.fromValue(from.getOsFamily())).description(from.getOsDescription()).version( from.getOsVersion()).build()); builder.state(NodeState.RUNNING); builder.publicAddresses(ImmutableSet. of(from.getHostname())); diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java index 6f5855218e..40a63e6012 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java @@ -47,7 +47,7 @@ import com.google.common.collect.Maps; * hostname: cluster-1.mydomain.com * os_arch: x86 * os_family: linux - * os_name: redhat + * os_description: redhat * os_version: 5.3 * group: hadoop * tags: diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/BYONComputeServiceLiveTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/BYONComputeServiceLiveTest.java index 5225abb50d..67be1189e7 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/BYONComputeServiceLiveTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/BYONComputeServiceLiveTest.java @@ -63,7 +63,7 @@ public class BYONComputeServiceLiveTest { nodes.append(" hostname: localhost\n"); nodes.append(" os_arch: ").append(System.getProperty("os.arch")).append("\n"); nodes.append(" os_family: ").append(OsFamily.UNIX).append("\n"); - nodes.append(" os_name: ").append(System.getProperty("os.name")).append("\n"); + nodes.append(" os_description: ").append(System.getProperty("os.name")).append("\n"); nodes.append(" os_version: ").append(System.getProperty("os.version")).append("\n"); nodes.append(" group: ").append("ssh").append("\n"); nodes.append(" tags:\n"); diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java index 1f17cbe0c5..d70a248f96 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java @@ -50,7 +50,7 @@ public class NodeToNodeMetadataTest { public static final NodeMetadata TEST1 = new NodeMetadataBuilder().ids("cluster-1").tag("hadoop").name("cluster-1") .location(location).state(NodeState.RUNNING).operatingSystem( - new OperatingSystemBuilder().name("redhat").description("redhat").family(OsFamily.RHEL) + new OperatingSystemBuilder().description("redhat").family(OsFamily.RHEL) .arch("x86").version("5.3").build()).publicAddresses( ImmutableSet.of("cluster-1.mydomain.com")).credentials(new Credentials("myUser", "fancyfoot")) .adminPassword("sudo").build(); diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java index efbe233bdc..ab0095b09e 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java @@ -37,9 +37,10 @@ import com.google.common.collect.ImmutableMap; */ public class NodesFromYamlTest { - public static final Node TEST1 = new Node("cluster-1", "cluster-1", "cluster-1.mydomain.com", "x86", "rhel", - "redhat", "5.3", "hadoop", ImmutableList.of("vanilla"), "myUser", CryptoStreams.base64("fancyfoot" - .getBytes()), null, CryptoStreams.base64("sudo".getBytes())); + public static final Node TEST1 = new Node("cluster-1", "cluster-1", "accounting analytics cluster", + "cluster-1.mydomain.com", "x86", "rhel", "redhat", "5.3", "hadoop", ImmutableList + .of("vanilla"), "myUser", CryptoStreams.base64("fancyfoot".getBytes()), null, CryptoStreams + .base64("sudo".getBytes())); @Test public void testNodesParse() throws Exception { diff --git a/sandbox-apis/byon/src/test/resources/test1.yaml b/sandbox-apis/byon/src/test/resources/test1.yaml index 1fc884fe49..52082bc4d3 100644 --- a/sandbox-apis/byon/src/test/resources/test1.yaml +++ b/sandbox-apis/byon/src/test/resources/test1.yaml @@ -1,10 +1,11 @@ nodes: - id: cluster-1 name: cluster-1 + description: accounting analytics cluster hostname: cluster-1.mydomain.com os_arch: x86 os_family: rhel - os_name: redhat + os_description: redhat os_version: 5.3 group: hadoop tags: diff --git a/sandbox-apis/byon/src/test/resources/test_with_url.yaml b/sandbox-apis/byon/src/test/resources/test_with_url.yaml index acb556f166..b41f08b790 100644 --- a/sandbox-apis/byon/src/test/resources/test_with_url.yaml +++ b/sandbox-apis/byon/src/test/resources/test_with_url.yaml @@ -1,10 +1,11 @@ nodes: - id: cluster-1 name: cluster-1 + description: accounting analytics cluster hostname: cluster-1.mydomain.com os_arch: x86 os_family: rhel - os_name: redhat + os_description: redhat os_version: 5.3 group: hadoop tags: From 48e9f6b7bba3c34d724efc76a497965396830835 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 28 Jan 2011 16:49:37 -0800 Subject: [PATCH 06/81] Issue 452: removed need to base64 --- sandbox-apis/byon/README.txt | 15 +++++++++++---- .../byon/functions/NodeToNodeMetadata.java | 11 ++++------- .../org/jclouds/byon/functions/NodesFromYaml.java | 6 +++--- .../byon/functions/NodeToNodeMetadataTest.java | 9 ++++----- .../jclouds/byon/functions/NodesFromYamlTest.java | 11 +++++++---- sandbox-apis/byon/src/test/resources/test1.yaml | 9 +++++++-- .../byon/src/test/resources/test_with_url.yaml | 2 +- sandbox-apis/byon/src/test/resources/testkey.txt | 6 +++++- 8 files changed, 42 insertions(+), 27 deletions(-) diff --git a/sandbox-apis/byon/README.txt b/sandbox-apis/byon/README.txt index 2eeda5bf07..f066da6fa6 100644 --- a/sandbox-apis/byon/README.txt +++ b/sandbox-apis/byon/README.txt @@ -54,9 +54,11 @@ Here are the properties: * tags - optional; list of arbitrary tags. * note this list is not yet in jclouds NodeMetadata * username - primary login user to the os. ex. ubuntu, vcloud, root - * sudo_password - optional; base 64 encoded sudo password (ex. input to sudo -S) + * sudo_password - optional; sudo password (ex. input to sudo -S) + * if not set and an sudo command is attempted, it will attempt + without a password one of: - * credential - base 64 encoded RSA private key or password + * credential - RSA private key or password * credential_url - location of plain-text RSA private key or password. ex. file:///home/me/.ssh/id_rsa classpath:///id_rsa @@ -76,5 +78,10 @@ nodes: tags: - vanilla username: myUser - credential: ZmFuY3lmb290 - sudo_password: c3Vkbw== + credential: | + -----BEGIN RSA PRIVATE KEY----- + MIIEowIBAAKCAQEAuzaE6azgUxwESX1rCGdJ5xpdrc1XC311bOGZBCE8NA+CpFh2 + u01Vfv68NC4u6LFgdXSY1vQt6hiA5TNqQk0TyVfFAunbXgTekF6XqDPQUf1nq9aZ + lMvo4vlaLDKBkhG5HJE/pIa0iB+RMZLS0GhxsIWerEDmYdHKM25o + -----END RSA PRIVATE KEY----- + sudo_password: go panthers! diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java index 1c9ca1b8c5..c51b6d9f2e 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodeToNodeMetadata.java @@ -36,13 +36,11 @@ import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.OperatingSystemBuilder; import org.jclouds.compute.domain.OsFamily; -import org.jclouds.crypto.CryptoStreams; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.util.Strings2; -import com.google.common.base.Charsets; import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; @@ -76,8 +74,8 @@ public class NodeToNodeMetadata implements Function { builder.tag(from.getGroup()); // TODO add tags! builder.operatingSystem(new OperatingSystemBuilder().arch(from.getOsArch()).family( - OsFamily.fromValue(from.getOsFamily())).description(from.getOsDescription()).version( - from.getOsVersion()).build()); + OsFamily.fromValue(from.getOsFamily())).description(from.getOsDescription()) + .version(from.getOsVersion()).build()); builder.state(NodeState.RUNNING); builder.publicAddresses(ImmutableSet. of(from.getHostname())); @@ -91,8 +89,7 @@ public class NodeToNodeMetadata implements Function { logger.error(e, "URI could not be read: %s", from.getCredentialUrl()); } } else if (from.getCredential() != null) { - creds = new Credentials(from.getUsername(), new String(CryptoStreams.base64(from.getCredential()), - Charsets.UTF_8)); + creds = new Credentials(from.getUsername(), from.getCredential()); } if (creds != null) builder.credentials(creds); @@ -100,7 +97,7 @@ public class NodeToNodeMetadata implements Function { } if (from.getSudoPassword() != null) - builder.adminPassword(new String(CryptoStreams.base64(from.getSudoPassword()), Charsets.UTF_8)); + builder.adminPassword(from.getSudoPassword()); return builder.build(); } } diff --git a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java index 40a63e6012..fd6d15843b 100644 --- a/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java +++ b/sandbox-apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYaml.java @@ -53,10 +53,10 @@ import com.google.common.collect.Maps; * tags: * - vanilla * username: kelvin - * credential: password_or_rsa_in_base64 + * credential: password_or_rsa * or - * credential_url: password_or_rsa_file ex. resource:///id_rsa will get the classpath /id_rsa.pub; file://path/to/id_rsa - * sudo_password: password_in_base64 + * credential_url: password_or_rsa_file ex. resource:///id_rsa will get the classpath /id_rsa; file://path/to/id_rsa + * sudo_password: password * * * @author Kelvin Kakugawa diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java index d70a248f96..f4fb3d828a 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodeToNodeMetadataTest.java @@ -50,10 +50,9 @@ public class NodeToNodeMetadataTest { public static final NodeMetadata TEST1 = new NodeMetadataBuilder().ids("cluster-1").tag("hadoop").name("cluster-1") .location(location).state(NodeState.RUNNING).operatingSystem( - new OperatingSystemBuilder().description("redhat").family(OsFamily.RHEL) - .arch("x86").version("5.3").build()).publicAddresses( - ImmutableSet.of("cluster-1.mydomain.com")).credentials(new Credentials("myUser", "fancyfoot")) - .adminPassword("sudo").build(); + new OperatingSystemBuilder().description("redhat").family(OsFamily.RHEL).arch("x86") + .version("5.3").build()).publicAddresses(ImmutableSet.of("cluster-1.mydomain.com")) + .credentials(new Credentials("myUser", NodesFromYamlTest.key)).adminPassword("happy bear").build(); @Test public void testNodesParse() throws Exception { @@ -64,7 +63,7 @@ public class NodeToNodeMetadataTest { new SupplyFromProviderURIOrNodesProperty(URI.create("test")), credentialStore); assertEquals(parser.apply(NodesFromYamlTest.TEST1), TEST1); - assertEquals(credentialStore, ImmutableMap.of("node#cluster-1", new Credentials("myUser", "fancyfoot"))); + assertEquals(credentialStore, ImmutableMap.of("node#cluster-1", new Credentials("myUser", NodesFromYamlTest.key))); } } diff --git a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java index ab0095b09e..614e67acee 100644 --- a/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java +++ b/sandbox-apis/byon/src/test/java/org/jclouds/byon/functions/NodesFromYamlTest.java @@ -24,7 +24,6 @@ import static org.testng.Assert.assertEquals; import java.io.InputStream; import org.jclouds.byon.Node; -import org.jclouds.crypto.CryptoStreams; import org.jclouds.util.Strings2; import org.testng.annotations.Test; @@ -36,11 +35,15 @@ import com.google.common.collect.ImmutableMap; * @author Adrian Cole */ public class NodesFromYamlTest { + public static final String key = new StringBuilder().append("-----BEGIN RSA PRIVATE KEY-----\n").append( + "MIIEowIBAAKCAQEAuzaE6azgUxwESX1rCGdJ5xpdrc1XC311bOGZBCE8NA+CpFh2\n").append( + "u01Vfv68NC4u6LFgdXSY1vQt6hiA5TNqQk0TyVfFAunbXgTekF6XqDPQUf1nq9aZ\n").append( + "lMvo4vlaLDKBkhG5HJE/pIa0iB+RMZLS0GhxsIWerEDmYdHKM25o\n").append("-----END RSA PRIVATE KEY-----\n") + .toString(); public static final Node TEST1 = new Node("cluster-1", "cluster-1", "accounting analytics cluster", - "cluster-1.mydomain.com", "x86", "rhel", "redhat", "5.3", "hadoop", ImmutableList - .of("vanilla"), "myUser", CryptoStreams.base64("fancyfoot".getBytes()), null, CryptoStreams - .base64("sudo".getBytes())); + "cluster-1.mydomain.com", "x86", "rhel", "redhat", "5.3", "hadoop", ImmutableList.of("vanilla"), "myUser", + key, null, "happy bear"); @Test public void testNodesParse() throws Exception { diff --git a/sandbox-apis/byon/src/test/resources/test1.yaml b/sandbox-apis/byon/src/test/resources/test1.yaml index 52082bc4d3..2711c5989b 100644 --- a/sandbox-apis/byon/src/test/resources/test1.yaml +++ b/sandbox-apis/byon/src/test/resources/test1.yaml @@ -11,5 +11,10 @@ nodes: tags: - vanilla username: myUser - credential: ZmFuY3lmb290 - sudo_password: c3Vkbw== + credential: | + -----BEGIN RSA PRIVATE KEY----- + MIIEowIBAAKCAQEAuzaE6azgUxwESX1rCGdJ5xpdrc1XC311bOGZBCE8NA+CpFh2 + u01Vfv68NC4u6LFgdXSY1vQt6hiA5TNqQk0TyVfFAunbXgTekF6XqDPQUf1nq9aZ + lMvo4vlaLDKBkhG5HJE/pIa0iB+RMZLS0GhxsIWerEDmYdHKM25o + -----END RSA PRIVATE KEY----- + sudo_password: happy bear diff --git a/sandbox-apis/byon/src/test/resources/test_with_url.yaml b/sandbox-apis/byon/src/test/resources/test_with_url.yaml index b41f08b790..4819f1ffa8 100644 --- a/sandbox-apis/byon/src/test/resources/test_with_url.yaml +++ b/sandbox-apis/byon/src/test/resources/test_with_url.yaml @@ -12,4 +12,4 @@ nodes: - vanilla username: myUser credential_url: classpath:///testkey.txt - sudo_password: c3Vkbw== + sudo_password: happy bear diff --git a/sandbox-apis/byon/src/test/resources/testkey.txt b/sandbox-apis/byon/src/test/resources/testkey.txt index adebd2d619..4402ea1f8c 100644 --- a/sandbox-apis/byon/src/test/resources/testkey.txt +++ b/sandbox-apis/byon/src/test/resources/testkey.txt @@ -1 +1,5 @@ -fancyfoot \ No newline at end of file +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAuzaE6azgUxwESX1rCGdJ5xpdrc1XC311bOGZBCE8NA+CpFh2 +u01Vfv68NC4u6LFgdXSY1vQt6hiA5TNqQk0TyVfFAunbXgTekF6XqDPQUf1nq9aZ +lMvo4vlaLDKBkhG5HJE/pIa0iB+RMZLS0GhxsIWerEDmYdHKM25o +-----END RSA PRIVATE KEY----- \ No newline at end of file From 81223bcbcae9dab0939b4366c2d7915f699aabc5 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 28 Jan 2011 17:10:38 -0800 Subject: [PATCH 07/81] Issue 452: clarified sudo docs --- sandbox-apis/byon/README.txt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sandbox-apis/byon/README.txt b/sandbox-apis/byon/README.txt index f066da6fa6..b8ceed5891 100644 --- a/sandbox-apis/byon/README.txt +++ b/sandbox-apis/byon/README.txt @@ -40,6 +40,7 @@ context = new ComputeServiceContextFactory().createContext("byon", "foo", "bar", You must define your nodes in yaml, and they must be in a collection called nodes. Here are the properties: + * id - opaque unique id * name - optional; user specified name * description - optional; long description of this node @@ -53,11 +54,14 @@ Here are the properties: * group - primary group of the machine. ex. hadoop * tags - optional; list of arbitrary tags. * note this list is not yet in jclouds NodeMetadata - * username - primary login user to the os. ex. ubuntu, vcloud, root - * sudo_password - optional; sudo password (ex. input to sudo -S) - * if not set and an sudo command is attempted, it will attempt - without a password + * username - primary login user. ex. ubuntu, vcloud, toor, root + * sudo_password - optional; when a script is run with the "runAsRoot" option true, yet the + username is not root, a sudo command is invoked. If sudo_password + is set, the contents will be passed to sudo -S. + Ex. echo 'foobar'| sudo -S init 5 + one of: + * credential - RSA private key or password * credential_url - location of plain-text RSA private key or password. ex. file:///home/me/.ssh/id_rsa From 68baca40624e84ce2c62f35f143c05ff1f6cf85b Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 29 Jan 2011 10:12:42 -0800 Subject: [PATCH 08/81] googlestorage supports streaming --- .../java/org/jclouds/s3/S3ContextBuilder.java | 2 +- .../jclouds/s3/config/S3RestClientModule.java | 12 +- .../jclouds/s3/ProvidersInPropertiesTest.java | 6 +- .../org/jclouds/s3/S3AsyncClientTest.java | 135 +++++++++--------- .../s3/blobstore/S3BlobRequestSignerTest.java | 13 +- .../s3/config/S3RestClientModuleTest.java | 4 +- apis/s3/src/test/resources/log4j.xml | 11 +- core/src/main/resources/rest.properties | 4 +- ...nerCloudWalrusBlobIntegrationLiveTest.java | 16 +-- ...alyptusPartnerCloudWalrusBlobLiveTest.java | 8 +- ...CloudWalrusBlobMapIntegrationLiveTest.java | 7 +- ...sPartnerCloudWalrusBlobSignerLiveTest.java | 8 +- ...oudWalrusContainerIntegrationLiveTest.java | 8 +- ...usPartnerCloudWalrusContainerLiveTest.java | 8 +- ...lrusInputStreamMapIntegrationLiveTest.java | 8 +- ...CloudWalrusServiceIntegrationLiveTest.java | 8 +- ...ptusPartnerCloudWalrusTestInitializer.java | 19 +-- .../GoogleStorageContextBuilder.java | 45 ++++++ ...dGoogleStorageObjectMetadataToRequest.java | 78 ++++++++++ .../config/GoogleStorageRestClientModule.java | 29 ++++ ...gleStorageObjectMetadataToRequestTest.java | 113 +++++++++++++++ .../GoogleStorageBlobIntegrationLiveTest.java | 8 ++ 22 files changed, 390 insertions(+), 160 deletions(-) create mode 100644 providers/googlestorage/src/main/java/org/jclouds/googlestorage/GoogleStorageContextBuilder.java create mode 100644 providers/googlestorage/src/main/java/org/jclouds/googlestorage/binders/BindGoogleStorageObjectMetadataToRequest.java create mode 100644 providers/googlestorage/src/main/java/org/jclouds/googlestorage/config/GoogleStorageRestClientModule.java create mode 100644 providers/googlestorage/src/test/java/org/jclouds/googlestorage/binders/BindGoogleStorageObjectMetadataToRequestTest.java diff --git a/apis/s3/src/main/java/org/jclouds/s3/S3ContextBuilder.java b/apis/s3/src/main/java/org/jclouds/s3/S3ContextBuilder.java index 40a7126146..ed1135bb4c 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/S3ContextBuilder.java +++ b/apis/s3/src/main/java/org/jclouds/s3/S3ContextBuilder.java @@ -57,6 +57,6 @@ public class S3ContextBuilder extends BlobStoreContextBuilder modules) { - modules.add(new S3RestClientModule()); + modules.add(S3RestClientModule.create()); } } diff --git a/apis/s3/src/main/java/org/jclouds/s3/config/S3RestClientModule.java b/apis/s3/src/main/java/org/jclouds/s3/config/S3RestClientModule.java index e1615ac10c..6a582368d6 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/config/S3RestClientModule.java +++ b/apis/s3/src/main/java/org/jclouds/s3/config/S3RestClientModule.java @@ -52,9 +52,13 @@ import com.google.inject.Scopes; */ @ConfiguresRestClient @RequiresHttp -public class S3RestClientModule extends AWSRestClientModule { - public S3RestClientModule() { - super(S3Client.class, S3AsyncClient.class); +public class S3RestClientModule extends AWSRestClientModule { + public static S3RestClientModule create() { + return new S3RestClientModule(S3Client.class, S3AsyncClient.class); + } + + public S3RestClientModule(Class sync, Class async) { + super(sync, async); } @Override @@ -91,7 +95,7 @@ public class S3RestClientModule extends AWSRestClientModule provideTimeStampCache(@Named(Constants.PROPERTY_SESSION_INTERVAL) long seconds, - final DateService dateService) { + final DateService dateService) { return Suppliers.memoizeWithExpiration(new Supplier() { public String get() { return dateService.rfc822DateFormat(); diff --git a/apis/s3/src/test/java/org/jclouds/s3/ProvidersInPropertiesTest.java b/apis/s3/src/test/java/org/jclouds/s3/ProvidersInPropertiesTest.java index bfba916200..2b35260166 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/ProvidersInPropertiesTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/ProvidersInPropertiesTest.java @@ -36,17 +36,13 @@ public class ProvidersInPropertiesTest { @Test public void testSupportedProviders() { Iterable providers = Providers.getSupportedProviders(); - assert Iterables.contains(providers, "s3") : providers; - assert Iterables.contains(providers, "walrus") : providers; - assert Iterables.contains(providers, "googlestorage") : providers; + assert Iterables.contains(providers, "s3") : providers;; } @Test public void testSupportedBlobStoreProviders() { Iterable providers = BlobStoreUtils.getSupportedProviders(); assert Iterables.contains(providers, "s3") : providers; - assert Iterables.contains(providers, "walrus") : providers; - assert Iterables.contains(providers, "googlestorage") : providers; } } diff --git a/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java b/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java index 0e2124d8f3..1d95667b76 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java @@ -26,6 +26,22 @@ import java.lang.reflect.Array; import java.lang.reflect.Method; import org.jclouds.aws.domain.Region; +import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest; +import org.jclouds.blobstore.functions.ReturnFalseOnContainerNotFound; +import org.jclouds.blobstore.functions.ReturnFalseOnKeyNotFound; +import org.jclouds.blobstore.functions.ReturnNullOnKeyNotFound; +import org.jclouds.blobstore.functions.ThrowContainerNotFoundOn404; +import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404; +import org.jclouds.date.TimeStamp; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.RequiresHttp; +import org.jclouds.http.functions.ParseETagHeader; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ReleasePayloadAndReturn; +import org.jclouds.http.functions.ReturnTrueIf2xx; +import org.jclouds.http.options.GetOptions; +import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.s3.config.S3RestClientModule; import org.jclouds.s3.domain.AccessControlList; import org.jclouds.s3.domain.BucketLogging; @@ -50,22 +66,6 @@ import org.jclouds.s3.xml.ListAllMyBucketsHandler; import org.jclouds.s3.xml.ListBucketHandler; import org.jclouds.s3.xml.LocationConstraintHandler; import org.jclouds.s3.xml.PayerHandler; -import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest; -import org.jclouds.blobstore.functions.ReturnFalseOnContainerNotFound; -import org.jclouds.blobstore.functions.ReturnFalseOnKeyNotFound; -import org.jclouds.blobstore.functions.ReturnNullOnKeyNotFound; -import org.jclouds.blobstore.functions.ThrowContainerNotFoundOn404; -import org.jclouds.blobstore.functions.ThrowKeyNotFoundOn404; -import org.jclouds.date.TimeStamp; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.RequiresHttp; -import org.jclouds.http.functions.ParseETagHeader; -import org.jclouds.http.functions.ParseSax; -import org.jclouds.http.functions.ReleasePayloadAndReturn; -import org.jclouds.http.functions.ReturnTrueIf2xx; -import org.jclouds.http.options.GetOptions; -import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.util.Strings2; import org.testng.annotations.Test; @@ -85,8 +85,8 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { protected String url = "s3.amazonaws.com"; public void testAllRegions() throws SecurityException, NoSuchMethodException, IOException { - Method method = S3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, - Array.newInstance(PutBucketOptions.class, 0).getClass()); + Method method = S3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, Array.newInstance( + PutBucketOptions.class, 0).getClass()); for (String region : Region.ALL_S3) { processor.createRequest(method, region, "bucket-name"); } @@ -104,8 +104,8 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { assertRequestLineEquals(request, "GET https://bucket." + url + "/?location HTTP/1.1"); assertNonPayloadHeadersEqual(request, - "Authorization: AWS identity:2fFTeYJTDwiJmaAkKj732RjNbOg=\nDate: 2009-11-08T15:54:08.897Z\nHost: bucket." - + url + "\n"); + "Authorization: AWS identity:2fFTeYJTDwiJmaAkKj732RjNbOg=\nDate: 2009-11-08T15:54:08.897Z\nHost: bucket." + + url + "\n"); assertPayloadEquals(request, null, null, false); assertResponseParserClassEquals(method, request, ParseSax.class); @@ -137,7 +137,7 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { assertRequestLineEquals(request, "PUT https://bucket." + url + "/?requestPayment HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); assertPayloadEquals(request, "BucketOwner", "text/xml", false); + + "/doc/2006-03-01/\">BucketOwner", "text/xml", false); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertSaxResponseParserClassEquals(method, null); @@ -153,7 +153,7 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { assertRequestLineEquals(request, "PUT https://bucket." + url + "/?requestPayment HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); assertPayloadEquals(request, "Requester", "text/xml", false); + + "/doc/2006-03-01/\">Requester", "text/xml", false); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertSaxResponseParserClassEquals(method, null); @@ -163,8 +163,8 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { } public void testListBucket() throws SecurityException, NoSuchMethodException, IOException { - Method method = S3AsyncClient.class.getMethod("listBucket", String.class, - Array.newInstance(ListBucketOptions.class, 0).getClass()); + Method method = S3AsyncClient.class.getMethod("listBucket", String.class, Array.newInstance( + ListBucketOptions.class, 0).getClass()); HttpRequest request = processor.createRequest(method, "bucket"); assertRequestLineEquals(request, "GET https://bucket." + url + "/ HTTP/1.1"); @@ -195,23 +195,23 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { @Test(expectedExceptions = IllegalArgumentException.class) public void testCopyObjectInvalidName() throws ArrayIndexOutOfBoundsException, SecurityException, - IllegalArgumentException, NoSuchMethodException, IOException { + IllegalArgumentException, NoSuchMethodException, IOException { Method method = S3AsyncClient.class.getMethod("copyObject", String.class, String.class, String.class, - String.class, Array.newInstance(CopyObjectOptions.class, 0).getClass()); + String.class, Array.newInstance(CopyObjectOptions.class, 0).getClass()); processor.createRequest(method, "sourceBucket", "sourceObject", "destinationBucket", "destinationObject"); } public void testCopyObject() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException, - NoSuchMethodException, IOException { + NoSuchMethodException, IOException { Method method = S3AsyncClient.class.getMethod("copyObject", String.class, String.class, String.class, - String.class, Array.newInstance(CopyObjectOptions.class, 0).getClass()); + String.class, Array.newInstance(CopyObjectOptions.class, 0).getClass()); HttpRequest request = processor.createRequest(method, "sourceBucket", "sourceObject", "destinationbucket", - "destinationObject"); + "destinationObject"); assertRequestLineEquals(request, "PUT https://destinationbucket." + url + "/destinationObject HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Host: destinationbucket." + url - + "\nx-amz-copy-source: /sourceBucket/sourceObject\n"); + + "\nx-amz-copy-source: /sourceBucket/sourceObject\n"); assertPayloadEquals(request, null, null, false); assertResponseParserClassEquals(method, request, ParseSax.class); @@ -268,7 +268,7 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { } public void testGetObject() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException, - NoSuchMethodException, IOException { + NoSuchMethodException, IOException { Method method = S3AsyncClient.class.getMethod("getObject", String.class, String.class, GetOptions[].class); HttpRequest request = processor.createRequest(method, "bucket", "object"); @@ -353,17 +353,17 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { public void testPutBucketACL() throws SecurityException, NoSuchMethodException, IOException { Method method = S3AsyncClient.class.getMethod("putBucketACL", String.class, AccessControlList.class); - HttpRequest request = processor.createRequest(method, "bucket", - AccessControlList.fromCannedAccessPolicy(CannedAccessPolicy.PRIVATE, "1234")); + HttpRequest request = processor.createRequest(method, "bucket", AccessControlList.fromCannedAccessPolicy( + CannedAccessPolicy.PRIVATE, "1234")); assertRequestLineEquals(request, "PUT https://bucket." + url + "/?acl HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); assertPayloadEquals( - request, - "12341234FULL_CONTROL", - "text/xml", false); + request, + "12341234FULL_CONTROL", + "text/xml", false); assertResponseParserClassEquals(method, request, ReturnTrueIf2xx.class); assertSaxResponseParserClassEquals(method, null); @@ -373,9 +373,9 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { } public void testPutBucketDefault() throws ArrayIndexOutOfBoundsException, SecurityException, - IllegalArgumentException, NoSuchMethodException, IOException { - Method method = S3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, - Array.newInstance(PutBucketOptions.class, 0).getClass()); + IllegalArgumentException, NoSuchMethodException, IOException { + Method method = S3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, Array.newInstance( + PutBucketOptions.class, 0).getClass()); HttpRequest request = processor.createRequest(method, (String) null, "bucket"); assertRequestLineEquals(request, "PUT https://bucket." + url + "/ HTTP/1.1"); @@ -390,16 +390,16 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { } public void testPutBucketEu() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException, - NoSuchMethodException, IOException { - Method method = S3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, - Array.newInstance(PutBucketOptions.class, 0).getClass()); + NoSuchMethodException, IOException { + Method method = S3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, Array.newInstance( + PutBucketOptions.class, 0).getClass()); HttpRequest request = processor.createRequest(method, "EU", "bucket"); assertRequestLineEquals(request, "PUT https://bucket." + url + "/ HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); assertPayloadEquals(request, - "EU", - "text/xml", false); + "EU", + "text/xml", false); assertResponseParserClassEquals(method, request, ReturnTrueIf2xx.class); assertSaxResponseParserClassEquals(method, null); @@ -409,12 +409,12 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { } public void testPutObject() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException, - NoSuchMethodException, IOException { + NoSuchMethodException, IOException { Method method = S3AsyncClient.class - .getMethod("putObject", String.class, S3Object.class, PutObjectOptions[].class); - HttpRequest request = processor.createRequest(method, "bucket", - blobToS3Object.apply(BindBlobToMultipartFormTest.TEST_BLOB)); + .getMethod("putObject", String.class, S3Object.class, PutObjectOptions[].class); + HttpRequest request = processor.createRequest(method, "bucket", blobToS3Object + .apply(BindBlobToMultipartFormTest.TEST_BLOB)); assertRequestLineEquals(request, "PUT https://bucket." + url + "/hello HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); @@ -429,18 +429,18 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { public void testPutObjectACL() throws SecurityException, NoSuchMethodException, IOException { Method method = S3AsyncClient.class - .getMethod("putObjectACL", String.class, String.class, AccessControlList.class); - HttpRequest request = processor.createRequest(method, "bucket", "key", - AccessControlList.fromCannedAccessPolicy(CannedAccessPolicy.PRIVATE, "1234")); + .getMethod("putObjectACL", String.class, String.class, AccessControlList.class); + HttpRequest request = processor.createRequest(method, "bucket", "key", AccessControlList.fromCannedAccessPolicy( + CannedAccessPolicy.PRIVATE, "1234")); assertRequestLineEquals(request, "PUT https://bucket." + url + "/key?acl HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); assertPayloadEquals( - request, - "12341234FULL_CONTROL", - "text/xml", false); + request, + "12341234FULL_CONTROL", + "text/xml", false); assertResponseParserClassEquals(method, request, ReturnTrueIf2xx.class); assertSaxResponseParserClassEquals(method, null); @@ -471,7 +471,7 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { assertRequestLineEquals(request, "PUT https://bucket." + url + "/?logging HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); assertPayloadEquals(request, "", "text/xml", - false); + false); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertSaxResponseParserClassEquals(method, null); @@ -483,16 +483,13 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { public void testEnableBucketLoggingOwner() throws SecurityException, NoSuchMethodException, IOException { Method method = S3AsyncClient.class.getMethod("enableBucketLogging", String.class, BucketLogging.class); HttpRequest request = processor - .createRequest( - method, - "bucket", - new BucketLogging("mylogs", "access_log-", ImmutableSet. of(new Grant(new EmailAddressGrantee( - "adrian@jclouds.org"), Permission.FULL_CONTROL)))); + .createRequest(method, "bucket", new BucketLogging("mylogs", "access_log-", ImmutableSet + . of(new Grant(new EmailAddressGrantee("adrian@jclouds.org"), Permission.FULL_CONTROL)))); assertRequestLineEquals(request, "PUT https://bucket." + url + "/?logging HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); assertPayloadEquals(request, Strings2.toStringAndClose(getClass().getResourceAsStream("/bucket_logging.xml")), - "text/xml", false); + "text/xml", false); assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); assertSaxResponseParserClassEquals(method, null); @@ -503,10 +500,10 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { @RequiresHttp @ConfiguresRestClient - protected static final class TestS3RestClientModule extends S3RestClientModule { - @Override - protected void configure() { - super.configure(); + private static final class TestS3RestClientModule extends S3RestClientModule { + + public TestS3RestClientModule() { + super(S3Client.class, S3AsyncClient.class); } @Override diff --git a/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobRequestSignerTest.java b/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobRequestSignerTest.java index a527128016..f9f1b1a393 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobRequestSignerTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/blobstore/S3BlobRequestSignerTest.java @@ -24,8 +24,6 @@ import static org.testng.Assert.assertEquals; import java.io.IOException; import java.util.Properties; -import org.jclouds.s3.S3AsyncClient; -import org.jclouds.s3.config.S3RestClientModule; import org.jclouds.blobstore.BlobRequestSigner; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.Blob.Factory; @@ -38,6 +36,9 @@ import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; +import org.jclouds.s3.S3AsyncClient; +import org.jclouds.s3.S3Client; +import org.jclouds.s3.config.S3RestClientModule; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -128,10 +129,10 @@ public class S3BlobRequestSignerTest extends RestClientTest { @RequiresHttp @ConfiguresRestClient - private static final class TestS3RestClientModule extends S3RestClientModule { - @Override - protected void configure() { - super.configure(); + private static final class TestS3RestClientModule extends S3RestClientModule { + + public TestS3RestClientModule() { + super(S3Client.class, S3AsyncClient.class); } @Override diff --git a/apis/s3/src/test/java/org/jclouds/s3/config/S3RestClientModuleTest.java b/apis/s3/src/test/java/org/jclouds/s3/config/S3RestClientModuleTest.java index 5547c73e46..27ed3f04f3 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/config/S3RestClientModuleTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/config/S3RestClientModuleTest.java @@ -33,6 +33,8 @@ import org.jclouds.http.handlers.DelegatingRetryHandler; import org.jclouds.logging.config.NullLoggingModule; import org.jclouds.rest.BaseRestClientTest.MockModule; import org.jclouds.rest.RestContextFactory; +import org.jclouds.s3.S3AsyncClient; +import org.jclouds.s3.S3Client; import org.jclouds.s3.handlers.ParseS3ErrorFromXmlContent; import org.testng.annotations.Test; @@ -55,7 +57,7 @@ public class S3RestClientModuleTest { @Test void testUpdatesOnlyOncePerSecond() throws NoSuchMethodException, InterruptedException { - S3RestClientModule module = new S3RestClientModule(); + S3RestClientModule module = S3RestClientModule.create(); Supplier map = module.provideTimeStampCache(1, new SimpleDateFormatDateService()); String timeStamp = map.get(); diff --git a/apis/s3/src/test/resources/log4j.xml b/apis/s3/src/test/resources/log4j.xml index 8799a8dd70..6279530639 100644 --- a/apis/s3/src/test/resources/log4j.xml +++ b/apis/s3/src/test/resources/log4j.xml @@ -105,12 +105,11 @@ - - - - - - + diff --git a/core/src/main/resources/rest.properties b/core/src/main/resources/rest.properties index 78c11b841f..57cca36a13 100644 --- a/core/src/main/resources/rest.properties +++ b/core/src/main/resources/rest.properties @@ -174,13 +174,13 @@ cloudfiles-us.propertiesbuilder=org.jclouds.rackspace.cloudfiles.CloudFilesUSPro cloudfiles-uk.contextbuilder=org.jclouds.cloudfiles.CloudFilesContextBuilder cloudfiles-uk.propertiesbuilder=org.jclouds.rackspace.cloudfiles.CloudFilesUKPropertiesBuilder -walrus.contextbuilder=org.jclouds.s3.S3ContextBuilder +walrus.contextbuilder=org.jclouds.walrus.WalrusContextBuilder walrus.propertiesbuilder=org.jclouds.walrus.WalrusPropertiesBuilder eucalyptus-partnercloud-s3.contextbuilder=org.jclouds.s3.S3ContextBuilder eucalyptus-partnercloud-s3.propertiesbuilder=org.jclouds.epc.EucalyptusPartnerCloudWalrusPropertiesBuilder -googlestorage.contextbuilder=org.jclouds.s3.S3ContextBuilder +googlestorage.contextbuilder=org.jclouds.googlestorage.GoogleStorageContextBuilder googlestorage.propertiesbuilder=org.jclouds.googlestorage.GoogleStoragePropertiesBuilder scaleup-storage.contextbuilder=org.jclouds.scaleup.storage.ScaleUpStorageContextBuilder diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobIntegrationLiveTest.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobIntegrationLiveTest.java index a4720f50fd..51547cd440 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobIntegrationLiveTest.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobIntegrationLiveTest.java @@ -19,25 +19,13 @@ package org.jclouds.epc.blobstore; -import java.io.IOException; -import java.util.concurrent.ExecutionException; - -import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest; +import org.jclouds.walrus.blobstore.WalrusBlobIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusBlobIntegrationLiveTest") -public class EucalyptusPartnerCloudWalrusBlobIntegrationLiveTest extends BaseBlobIntegrationTest { - public EucalyptusPartnerCloudWalrusBlobIntegrationLiveTest() { - containerCount = 5; - } - - @Override - @Test(expectedExceptions = IllegalArgumentException.class) - public void testPutObjectStream() throws InterruptedException, IOException, ExecutionException { - super.testPutObjectStream(); - } +public class EucalyptusPartnerCloudWalrusBlobIntegrationLiveTest extends WalrusBlobIntegrationLiveTest { } diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobLiveTest.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobLiveTest.java index 3cc03d39b3..8fb7328b54 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobLiveTest.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobLiveTest.java @@ -19,15 +19,13 @@ package org.jclouds.epc.blobstore; -import org.jclouds.blobstore.integration.internal.BaseBlobLiveTest; +import org.jclouds.walrus.blobstore.WalrusBlobLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusBlobLiveTest") -public class EucalyptusPartnerCloudWalrusBlobLiveTest extends BaseBlobLiveTest { - public EucalyptusPartnerCloudWalrusBlobLiveTest() { - containerCount = 5; - } +public class EucalyptusPartnerCloudWalrusBlobLiveTest extends WalrusBlobLiveTest { + } diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobMapIntegrationLiveTest.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobMapIntegrationLiveTest.java index 7740ca934b..7a1e6eb25b 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobMapIntegrationLiveTest.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobMapIntegrationLiveTest.java @@ -19,15 +19,12 @@ package org.jclouds.epc.blobstore; -import org.jclouds.blobstore.integration.internal.BaseBlobMapIntegrationTest; +import org.jclouds.walrus.blobstore.WalrusBlobMapIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusBlobMapIntegrationLiveTest") -public class EucalyptusPartnerCloudWalrusBlobMapIntegrationLiveTest extends BaseBlobMapIntegrationTest { - public EucalyptusPartnerCloudWalrusBlobMapIntegrationLiveTest() { - containerCount = 5; - } +public class EucalyptusPartnerCloudWalrusBlobMapIntegrationLiveTest extends WalrusBlobMapIntegrationLiveTest { } diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobSignerLiveTest.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobSignerLiveTest.java index 390dc18611..1f79a93061 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobSignerLiveTest.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusBlobSignerLiveTest.java @@ -19,7 +19,7 @@ package org.jclouds.epc.blobstore; -import org.jclouds.blobstore.integration.internal.BaseBlobSignerLiveTest; +import org.jclouds.walrus.blobstore.WalrusBlobSignerLiveTest; import org.testng.annotations.Test; /** @@ -27,8 +27,6 @@ import org.testng.annotations.Test; * @author Adrian Cole */ @Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusBlobSignerLiveTest") -public class EucalyptusPartnerCloudWalrusBlobSignerLiveTest extends BaseBlobSignerLiveTest { - public EucalyptusPartnerCloudWalrusBlobSignerLiveTest() { - containerCount = 5; - } +public class EucalyptusPartnerCloudWalrusBlobSignerLiveTest extends WalrusBlobSignerLiveTest { + } diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusContainerIntegrationLiveTest.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusContainerIntegrationLiveTest.java index 8945d3b6dd..cc1ff07d57 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusContainerIntegrationLiveTest.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusContainerIntegrationLiveTest.java @@ -19,15 +19,13 @@ package org.jclouds.epc.blobstore; -import org.jclouds.blobstore.integration.internal.BaseContainerIntegrationTest; +import org.jclouds.walrus.blobstore.WalrusContainerIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusContainerIntegrationLiveTest") -public class EucalyptusPartnerCloudWalrusContainerIntegrationLiveTest extends BaseContainerIntegrationTest { - public EucalyptusPartnerCloudWalrusContainerIntegrationLiveTest() { - containerCount = 5; - } +public class EucalyptusPartnerCloudWalrusContainerIntegrationLiveTest extends WalrusContainerIntegrationLiveTest { + } diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusContainerLiveTest.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusContainerLiveTest.java index ef4794091b..41f7ee6a7b 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusContainerLiveTest.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusContainerLiveTest.java @@ -19,15 +19,13 @@ package org.jclouds.epc.blobstore; -import org.jclouds.blobstore.integration.internal.BaseContainerLiveTest; +import org.jclouds.walrus.blobstore.WalrusContainerLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusContainerLiveTest") -public class EucalyptusPartnerCloudWalrusContainerLiveTest extends BaseContainerLiveTest { - public EucalyptusPartnerCloudWalrusContainerLiveTest() { - containerCount = 5; - } +public class EucalyptusPartnerCloudWalrusContainerLiveTest extends WalrusContainerLiveTest { + } diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusInputStreamMapIntegrationLiveTest.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusInputStreamMapIntegrationLiveTest.java index 356a37f635..32b9e9a44c 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusInputStreamMapIntegrationLiveTest.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusInputStreamMapIntegrationLiveTest.java @@ -19,15 +19,13 @@ package org.jclouds.epc.blobstore; -import org.jclouds.blobstore.integration.internal.BaseInputStreamMapIntegrationTest; +import org.jclouds.walrus.blobstore.WalrusInputStreamMapIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusInputStreamMapIntegrationLiveTest") -public class EucalyptusPartnerCloudWalrusInputStreamMapIntegrationLiveTest extends BaseInputStreamMapIntegrationTest { - public EucalyptusPartnerCloudWalrusInputStreamMapIntegrationLiveTest() { - containerCount = 5; - } +public class EucalyptusPartnerCloudWalrusInputStreamMapIntegrationLiveTest extends WalrusInputStreamMapIntegrationLiveTest { + } diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest.java index f744789c74..a71550469a 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest.java @@ -19,15 +19,13 @@ package org.jclouds.epc.blobstore; -import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest; +import org.jclouds.walrus.blobstore.WalrusServiceIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ @Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest") -public class EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest extends BaseServiceIntegrationTest { - public EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest() { - containerCount = 5; - } +public class EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest extends WalrusServiceIntegrationLiveTest { + } diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusTestInitializer.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusTestInitializer.java index c980b81344..757a57d623 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusTestInitializer.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusTestInitializer.java @@ -19,33 +19,18 @@ package org.jclouds.epc.blobstore; -import java.io.IOException; +import org.jclouds.walrus.blobstore.WalrusTestInitializer; -import org.jclouds.blobstore.BlobStoreContext; -import org.jclouds.blobstore.BlobStoreContextFactory; -import org.jclouds.blobstore.integration.TransientBlobStoreTestInitializer; -import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest; -import org.jclouds.logging.log4j.config.Log4JLoggingModule; - -import com.google.common.collect.ImmutableSet; -import com.google.inject.Module; /** * * @author Adrian Cole */ -public class EucalyptusPartnerCloudWalrusTestInitializer extends TransientBlobStoreTestInitializer { +public class EucalyptusPartnerCloudWalrusTestInitializer extends WalrusTestInitializer { public EucalyptusPartnerCloudWalrusTestInitializer() { provider = "eucalyptus-partnercloud-s3"; - BaseBlobStoreIntegrationTest.SANITY_CHECK_RETURNED_BUCKET_NAME = true; } - @Override - protected BlobStoreContext createLiveContext(Module configurationModule, String endpoint, String apiversion, - String app, String identity, String credential) throws IOException { - return new BlobStoreContextFactory().createContext(provider, ImmutableSet.of(configurationModule, - new Log4JLoggingModule()), setupProperties(endpoint, apiversion, identity, credential)); - } } diff --git a/providers/googlestorage/src/main/java/org/jclouds/googlestorage/GoogleStorageContextBuilder.java b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/GoogleStorageContextBuilder.java new file mode 100644 index 0000000000..9ecbbb9c68 --- /dev/null +++ b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/GoogleStorageContextBuilder.java @@ -0,0 +1,45 @@ +/** + * + * 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.googlestorage; + +import java.util.List; +import java.util.Properties; + +import org.jclouds.googlestorage.config.GoogleStorageRestClientModule; +import org.jclouds.s3.S3ContextBuilder; + +import com.google.inject.Module; + +/** + * + * + * @author Adrian Cole + */ +public class GoogleStorageContextBuilder extends S3ContextBuilder { + + public GoogleStorageContextBuilder(Properties props) { + super(props); + } + + @Override + protected void addClientModule(List modules) { + modules.add(new GoogleStorageRestClientModule()); + } +} diff --git a/providers/googlestorage/src/main/java/org/jclouds/googlestorage/binders/BindGoogleStorageObjectMetadataToRequest.java b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/binders/BindGoogleStorageObjectMetadataToRequest.java new file mode 100644 index 0000000000..4273e546ca --- /dev/null +++ b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/binders/BindGoogleStorageObjectMetadataToRequest.java @@ -0,0 +1,78 @@ +/** + * + * 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.googlestorage.binders; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; +import javax.inject.Singleton; +import javax.ws.rs.core.HttpHeaders; + +import org.jclouds.blobstore.binders.BindUserMetadataToHeadersWithPrefix; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.utils.ModifyRequest; +import org.jclouds.s3.binders.BindS3ObjectMetadataToRequest; +import org.jclouds.s3.blobstore.functions.ObjectToBlob; +import org.jclouds.s3.domain.S3Object; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class BindGoogleStorageObjectMetadataToRequest extends BindS3ObjectMetadataToRequest { + private final BindUserMetadataToHeadersWithPrefix blobBinder; + private final ObjectToBlob object2Blob; + + @Inject + public BindGoogleStorageObjectMetadataToRequest(ObjectToBlob object2Blob, + BindUserMetadataToHeadersWithPrefix blobBinder) { + super(object2Blob, blobBinder); + this.blobBinder = checkNotNull(blobBinder, "blobBinder"); + this.object2Blob = checkNotNull(object2Blob, "object2Blob"); + } + + @Override + public R bindToRequest(R request, Object input) { + checkArgument(checkNotNull(input, "input") instanceof S3Object, "this binder is only valid for S3Object!"); + checkNotNull(request, "request"); + + S3Object s3Object = S3Object.class.cast(input); + checkArgument(s3Object.getMetadata().getKey() != null, "s3Object.getMetadata().getKey() must be set!"); + + if (s3Object.getPayload().getContentMetadata().getContentLength() != null + && s3Object.getPayload().getContentMetadata().getContentLength() >= 0) { + checkArgument(s3Object.getPayload().getContentMetadata().getContentLength() <= 5l * 1024 * 1024 * 1024, + "maximum size for put object is 5GB"); + } else { + // Enable "chunked"/"streamed" data, where the size needn't be known in advance. + request = ModifyRequest.replaceHeader(request, "Transfer-Encoding", "chunked"); + } + + request = blobBinder.bindToRequest(request, object2Blob.apply(s3Object)); + + if (s3Object.getMetadata().getCacheControl() != null) { + request = ModifyRequest.replaceHeader(request, HttpHeaders.CACHE_CONTROL, s3Object.getMetadata() + .getCacheControl()); + } + return request; + } +} diff --git a/providers/googlestorage/src/main/java/org/jclouds/googlestorage/config/GoogleStorageRestClientModule.java b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/config/GoogleStorageRestClientModule.java new file mode 100644 index 0000000000..13ab516d5d --- /dev/null +++ b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/config/GoogleStorageRestClientModule.java @@ -0,0 +1,29 @@ +package org.jclouds.googlestorage.config; + +import org.jclouds.googlestorage.binders.BindGoogleStorageObjectMetadataToRequest; +import org.jclouds.http.RequiresHttp; +import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.s3.S3AsyncClient; +import org.jclouds.s3.S3Client; +import org.jclouds.s3.binders.BindS3ObjectMetadataToRequest; +import org.jclouds.s3.config.S3RestClientModule; + +/** + * + * @author Adrian Cole + */ +@ConfiguresRestClient +@RequiresHttp +public class GoogleStorageRestClientModule extends S3RestClientModule { + + public GoogleStorageRestClientModule() { + super(S3Client.class, S3AsyncClient.class); + } + + @Override + protected void configure() { + bind(BindS3ObjectMetadataToRequest.class).to(BindGoogleStorageObjectMetadataToRequest.class); + super.configure(); + } + +} diff --git a/providers/googlestorage/src/test/java/org/jclouds/googlestorage/binders/BindGoogleStorageObjectMetadataToRequestTest.java b/providers/googlestorage/src/test/java/org/jclouds/googlestorage/binders/BindGoogleStorageObjectMetadataToRequestTest.java new file mode 100644 index 0000000000..90d2673220 --- /dev/null +++ b/providers/googlestorage/src/test/java/org/jclouds/googlestorage/binders/BindGoogleStorageObjectMetadataToRequestTest.java @@ -0,0 +1,113 @@ +package org.jclouds.googlestorage.binders; + +import static org.testng.Assert.assertEquals; + +import java.io.File; +import java.net.URI; + +import javax.ws.rs.HttpMethod; + +import org.jclouds.http.HttpRequest; +import org.jclouds.io.Payload; +import org.jclouds.io.Payloads; +import org.jclouds.s3.BaseS3AsyncClientTest; +import org.jclouds.s3.domain.S3Object; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; + +/** + * Tests behavior of {@code BindGoogleStorageObjectMetadataToRequest} + * + * @author Adrian Cole + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +@Test(groups = "unit", testName = "BindGoogleStorageObjectMetadataToRequestTest") +public class BindGoogleStorageObjectMetadataToRequestTest extends BaseS3AsyncClientTest { + + + @Test + public void testPassWithMinimumDetailsAndPayload5GB() { + S3Object object = injector.getInstance(S3Object.Factory.class).create(null); + Payload payload = Payloads.newStringPayload(""); + payload.getContentMetadata().setContentLength(5 * 1024 * 1024 * 1024l); + object.setPayload(payload); + object.getMetadata().setKey("foo"); + + HttpRequest request = HttpRequest.builder().method("PUT").endpoint(URI.create("http://localhost")).build(); + BindGoogleStorageObjectMetadataToRequest binder = injector.getInstance(BindGoogleStorageObjectMetadataToRequest.class); + + assertEquals(binder.bindToRequest(request, object), HttpRequest.builder().method("PUT").endpoint( + URI.create("http://localhost")).build()); + } + + @Test + public void testExtendedPropertiesBind() { + S3Object object = injector.getInstance(S3Object.Factory.class).create(null); + Payload payload = Payloads.newStringPayload(""); + payload.getContentMetadata().setContentLength(5 * 1024 * 1024 * 1024l); + object.setPayload(payload); + object.getMetadata().setKey("foo"); + object.getMetadata().getUserMetadata().putAll(ImmutableMap.of("foo", "bar")); + + HttpRequest request = HttpRequest.builder().method("PUT").endpoint(URI.create("http://localhost")).build(); + BindGoogleStorageObjectMetadataToRequest binder = injector.getInstance(BindGoogleStorageObjectMetadataToRequest.class); + + assertEquals(binder.bindToRequest(request, object), HttpRequest.builder().method("PUT").endpoint( + URI.create("http://localhost")).headers(ImmutableMultimap.of("x-amz-meta-foo", "bar")).build()); + } + + public void testNoContentLengthIsChunked() { + S3Object object = injector.getInstance(S3Object.Factory.class).create(null); + Payload payload = Payloads.newStringPayload(""); + payload.getContentMetadata().setContentLength(null); + object.setPayload(payload); + object.getMetadata().setKey("foo"); + + HttpRequest request = HttpRequest.builder().method("PUT").endpoint(URI.create("http://localhost")).build(); + BindGoogleStorageObjectMetadataToRequest binder = injector.getInstance(BindGoogleStorageObjectMetadataToRequest.class); + + assertEquals(binder.bindToRequest(request, object), HttpRequest.builder().method("PUT").endpoint( + URI.create("http://localhost")).headers(ImmutableMultimap.of("Transfer-Encoding", "chunked")).build()); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testNoNameIsBad() { + S3Object object = injector.getInstance(S3Object.Factory.class).create(null); + Payload payload = Payloads.newStringPayload(""); + payload.getContentMetadata().setContentLength(5368709120000l); + object.setPayload(payload); + + HttpRequest request = HttpRequest.builder().method("PUT").endpoint(URI.create("http://localhost")).build(); + BindGoogleStorageObjectMetadataToRequest binder = injector.getInstance(BindGoogleStorageObjectMetadataToRequest.class); + binder.bindToRequest(request, object); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testOver5GBIsBad() { + S3Object object = injector.getInstance(S3Object.Factory.class).create(null); + Payload payload = Payloads.newStringPayload(""); + payload.getContentMetadata().setContentLength(5 * 1024 * 1024 * 1024l + 1); + object.setPayload(payload); + object.getMetadata().setKey("foo"); + + HttpRequest request = HttpRequest.builder().method("PUT").endpoint(URI.create("http://localhost")).build(); + BindGoogleStorageObjectMetadataToRequest binder = injector.getInstance(BindGoogleStorageObjectMetadataToRequest.class); + binder.bindToRequest(request, object); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testMustBeS3Object() { + HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost")); + injector.getInstance(BindGoogleStorageObjectMetadataToRequest.class).bindToRequest(request, new File("foo")); + } + + @Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class }) + public void testNullIsBad() { + BindGoogleStorageObjectMetadataToRequest binder = injector.getInstance(BindGoogleStorageObjectMetadataToRequest.class); + HttpRequest request = HttpRequest.builder().method("GET").endpoint(URI.create("http://momma")).build(); + binder.bindToRequest(request, null); + } + +} diff --git a/providers/googlestorage/src/test/java/org/jclouds/googlestorage/blobstore/GoogleStorageBlobIntegrationLiveTest.java b/providers/googlestorage/src/test/java/org/jclouds/googlestorage/blobstore/GoogleStorageBlobIntegrationLiveTest.java index 632e103479..aa80883d98 100644 --- a/providers/googlestorage/src/test/java/org/jclouds/googlestorage/blobstore/GoogleStorageBlobIntegrationLiveTest.java +++ b/providers/googlestorage/src/test/java/org/jclouds/googlestorage/blobstore/GoogleStorageBlobIntegrationLiveTest.java @@ -19,6 +19,8 @@ package org.jclouds.googlestorage.blobstore; +import java.io.IOException; + import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.integration.internal.BaseBlobIntegrationTest; import org.testng.annotations.Test; @@ -35,4 +37,10 @@ public class GoogleStorageBlobIntegrationLiveTest extends BaseBlobIntegrationTes assert blob.getPayload().getContentMetadata().getContentLanguage() == null; assert blob.getMetadata().getContentMetadata().getContentLanguage() == null; } + + // double range not supported + @Test(groups = { "integration", "live" }) + public void testGetTwoRanges() throws InterruptedException, IOException { + + } } From 9dc155d0c230338b174a3a0f3281a947383977f9 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 29 Jan 2011 10:13:46 -0800 Subject: [PATCH 09/81] Walrus doesn't seem to support HEAD bucket --- .../org/jclouds/walrus/WalrusAsyncClient.java | 64 +++++++++++++++++++ .../jclouds/walrus/WalrusContextBuilder.java | 45 +++++++++++++ .../walrus/config/WalrusRestClientModule.java | 40 ++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 apis/walrus/src/main/java/org/jclouds/walrus/WalrusAsyncClient.java create mode 100644 apis/walrus/src/main/java/org/jclouds/walrus/WalrusContextBuilder.java create mode 100644 apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java diff --git a/apis/walrus/src/main/java/org/jclouds/walrus/WalrusAsyncClient.java b/apis/walrus/src/main/java/org/jclouds/walrus/WalrusAsyncClient.java new file mode 100644 index 0000000000..dc94936a7c --- /dev/null +++ b/apis/walrus/src/main/java/org/jclouds/walrus/WalrusAsyncClient.java @@ -0,0 +1,64 @@ +/** + * + * 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.walrus; + +import static org.jclouds.blobstore.attr.BlobScopes.CONTAINER; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +import org.jclouds.blobstore.attr.BlobScope; +import org.jclouds.blobstore.functions.ReturnFalseOnContainerNotFound; +import org.jclouds.rest.annotations.BinderParam; +import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.rest.annotations.ParamValidators; +import org.jclouds.rest.annotations.QueryParams; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.SkipEncoding; +import org.jclouds.s3.Bucket; +import org.jclouds.s3.S3AsyncClient; +import org.jclouds.s3.S3Client; +import org.jclouds.s3.binders.BindAsHostPrefixIfConfigured; +import org.jclouds.s3.filters.RequestAuthorizeSignature; +import org.jclouds.s3.predicates.validators.BucketNameValidator; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * + * @author Adrian Cole + */ +@SkipEncoding('/') +@RequestFilters(RequestAuthorizeSignature.class) +@BlobScope(CONTAINER) +public interface WalrusAsyncClient extends S3AsyncClient { + + /** + * @see S3Client#bucketExists + */ + @Override + @GET + @Path("/") + @QueryParams(keys = "max-keys", values = "0") + @ExceptionParser(ReturnFalseOnContainerNotFound.class) + ListenableFuture bucketExists( + @Bucket @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators( { BucketNameValidator.class }) String bucketName); + +} diff --git a/apis/walrus/src/main/java/org/jclouds/walrus/WalrusContextBuilder.java b/apis/walrus/src/main/java/org/jclouds/walrus/WalrusContextBuilder.java new file mode 100644 index 0000000000..6e7309fac3 --- /dev/null +++ b/apis/walrus/src/main/java/org/jclouds/walrus/WalrusContextBuilder.java @@ -0,0 +1,45 @@ +/** + * + * 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.walrus; + +import java.util.List; +import java.util.Properties; + +import org.jclouds.s3.S3ContextBuilder; +import org.jclouds.walrus.config.WalrusRestClientModule; + +import com.google.inject.Module; + +/** + * + * + * @author Adrian Cole + */ +public class WalrusContextBuilder extends S3ContextBuilder { + + public WalrusContextBuilder(Properties props) { + super(props); + } + + @Override + protected void addClientModule(List modules) { + modules.add(new WalrusRestClientModule()); + } +} diff --git a/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java b/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java new file mode 100644 index 0000000000..1a8ccedfee --- /dev/null +++ b/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java @@ -0,0 +1,40 @@ +/** + * + * 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.walrus.config; + +import org.jclouds.http.RequiresHttp; +import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.s3.S3Client; +import org.jclouds.s3.config.S3RestClientModule; +import org.jclouds.walrus.WalrusAsyncClient; + +/** + * + * @author Adrian Cole + */ +@ConfiguresRestClient +@RequiresHttp +public class WalrusRestClientModule extends S3RestClientModule { + + public WalrusRestClientModule() { + super(S3Client.class, WalrusAsyncClient.class); + } + +} From 4eefd0dfa12215600b89bbb14db1b4c5f60f7356 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 29 Jan 2011 10:39:03 -0800 Subject: [PATCH 10/81] Walrus doesn't seem to support HEAD bucket --- .../jclouds/walrus/config/WalrusRestClientModule.java | 11 +++++++++++ core/src/main/resources/rest.properties | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java b/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java index 1a8ccedfee..76d6722280 100644 --- a/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java +++ b/apis/walrus/src/main/java/org/jclouds/walrus/config/WalrusRestClientModule.java @@ -19,12 +19,17 @@ package org.jclouds.walrus.config; +import javax.inject.Singleton; + import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.s3.S3AsyncClient; import org.jclouds.s3.S3Client; import org.jclouds.s3.config.S3RestClientModule; import org.jclouds.walrus.WalrusAsyncClient; +import com.google.inject.Provides; + /** * * @author Adrian Cole @@ -37,4 +42,10 @@ public class WalrusRestClientModule extends S3RestClientModule Date: Sat, 29 Jan 2011 16:15:51 -0800 Subject: [PATCH 11/81] Issue 456: add new InsufficientResourcesException --- .../rest/InsufficientResourcesException.java | 43 +++++++++++++++++++ .../java/org/jclouds/util/Throwables2.java | 12 +++--- .../org/jclouds/util/Throwables2Test.java | 9 +++- 3 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 core/src/main/java/org/jclouds/rest/InsufficientResourcesException.java diff --git a/core/src/main/java/org/jclouds/rest/InsufficientResourcesException.java b/core/src/main/java/org/jclouds/rest/InsufficientResourcesException.java new file mode 100644 index 0000000000..32ab424460 --- /dev/null +++ b/core/src/main/java/org/jclouds/rest/InsufficientResourcesException.java @@ -0,0 +1,43 @@ +/** + * + * 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.rest; + +/** + * Thrown when there is a quota or otherwise limit preventing the operation from occurring. + * + * @author Adrian Cole + */ +public class InsufficientResourcesException extends RuntimeException { + + /** The serialVersionUID */ + private static final long serialVersionUID = -2272965726680821281L; + + public InsufficientResourcesException() { + super(); + } + + public InsufficientResourcesException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + + public InsufficientResourcesException(Throwable arg0) { + super(arg0); + } +} diff --git a/core/src/main/java/org/jclouds/util/Throwables2.java b/core/src/main/java/org/jclouds/util/Throwables2.java index d9cc364bb2..1327234c46 100644 --- a/core/src/main/java/org/jclouds/util/Throwables2.java +++ b/core/src/main/java/org/jclouds/util/Throwables2.java @@ -28,13 +28,13 @@ import java.util.NoSuchElementException; import org.jclouds.http.HttpResponseException; import org.jclouds.rest.AuthorizationException; +import org.jclouds.rest.InsufficientResourcesException; import org.jclouds.rest.ResourceNotFoundException; import com.google.common.base.Throwables; import com.google.inject.ProvisionException; import com.google.inject.spi.Message; - /** * General utilities used in jclouds code. * @@ -72,9 +72,9 @@ public class Throwables2 { } // Note this needs to be kept up-to-date with all top-level exceptions jclouds works against - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings( { "unchecked", "rawtypes" }) public static Exception returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(Class[] exceptionTypes, - Exception exception) throws Exception { + Exception exception) throws Exception { for (Class type : exceptionTypes) { Throwable throwable = getFirstThrowableOfType(exception, type); if (throwable != null) { @@ -82,8 +82,8 @@ public class Throwables2 { } } for (Class propagatableExceptionType : new Class[] { IllegalStateException.class, - UnsupportedOperationException.class, IllegalArgumentException.class, AuthorizationException.class, - ResourceNotFoundException.class, HttpResponseException.class }) { + UnsupportedOperationException.class, IllegalArgumentException.class, AuthorizationException.class, + ResourceNotFoundException.class, InsufficientResourcesException.class, HttpResponseException.class }) { Throwable throwable = getFirstThrowableOfType(exception, propagatableExceptionType); if (throwable != null) { throw (Exception) throwable; @@ -101,7 +101,5 @@ public class Throwables2 { assert false : "exception should have propogated " + e; return null; } - - } diff --git a/core/src/test/java/org/jclouds/util/Throwables2Test.java b/core/src/test/java/org/jclouds/util/Throwables2Test.java index ab54c99202..8a8e2992ed 100644 --- a/core/src/test/java/org/jclouds/util/Throwables2Test.java +++ b/core/src/test/java/org/jclouds/util/Throwables2Test.java @@ -30,6 +30,7 @@ import java.util.concurrent.TimeoutException; import org.jclouds.http.HttpCommand; import org.jclouds.http.HttpResponseException; import org.jclouds.rest.AuthorizationException; +import org.jclouds.rest.InsufficientResourcesException; import org.jclouds.rest.ResourceNotFoundException; import org.testng.annotations.Test; @@ -115,7 +116,13 @@ public class Throwables2Test { Exception e = new AuthorizationException(); returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e)); } - + + @Test(expectedExceptions = InsufficientResourcesException.class) + public void testPropagateStandardExceptionInsufficientResourcesException() throws Exception { + Exception e = new InsufficientResourcesException(); + returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e)); + } + @Test(expectedExceptions = ResourceNotFoundException.class) public void testPropagateStandardExceptionResourceNotFoundException() throws Exception { Exception e = new ResourceNotFoundException(); From 2d888fb18e368c5dc7787def7681425410dac368 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 29 Jan 2011 20:55:31 -0800 Subject: [PATCH 12/81] template test predicate refactor --- .../CloudServersTemplateBuilderLiveTest.java | 57 -------------- .../ElasticStackTemplateBuilderLiveTest.java | 56 -------------- .../EucalyptusTemplateBuilderLiveTest.java | 76 ------------------- .../ImageForVCloudExpressVAppTemplate.java | 34 ++------- .../ParseOsFromVAppTemplateName.java | 66 ++++++++++++++++ .../compute/BaseTemplateBuilderLiveTest.java | 32 +++++--- .../AWSEC2TemplateBuilderLiveTest.java | 18 +++-- ...VCloudDirectorTemplateBuilderLiveTest.java | 52 +++++++++++++ ...CloudServersUKTemplateBuilderLiveTest.java | 17 +++-- ...CloudServersUSTemplateBuilderLiveTest.java | 17 +++-- .../CloudSigmaTemplateBuilderLiveTest.java | 22 ++++-- ...ueSquareLondonTemplateBuilderLiveTest.java | 18 +++-- ...stsPeer1LondonTemplateBuilderLiveTest.java | 18 +++-- ...eer1SanAntonioTemplateBuilderLiveTest.java | 18 +++-- ...loudEucalyptusTemplateBuilderLiveTest.java | 14 ++-- .../GoGridTemplateBuilderLiveTest.java | 19 +++-- ...enHostingEast1TemplateBuilderLiveTest.java | 15 ++-- ...loveManchesterTemplateBuilderLiveTest.java | 18 +++-- ...iCloudMalaysiaTemplateBuilderLiveTest.java | 16 ++-- .../SlicehostTemplateBuilderLiveTest.java | 22 ++++-- ...erremarkECloudTemplateBuilderLiveTest.java | 22 ++++-- ...kVCloudExpressTemplateBuilderLiveTest.java | 18 +++-- 22 files changed, 330 insertions(+), 315 deletions(-) delete mode 100644 apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/CloudServersTemplateBuilderLiveTest.java delete mode 100644 apis/elasticstack/src/test/java/org/jclouds/elasticstack/compute/ElasticStackTemplateBuilderLiveTest.java delete mode 100644 apis/eucalyptus/src/test/java/org/jclouds/eucalyptus/compute/EucalyptusTemplateBuilderLiveTest.java create mode 100644 apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/functions/ParseOsFromVAppTemplateName.java create mode 100644 providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorTemplateBuilderLiveTest.java diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/CloudServersTemplateBuilderLiveTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/CloudServersTemplateBuilderLiveTest.java deleted file mode 100644 index 6ef10ca2b4..0000000000 --- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/CloudServersTemplateBuilderLiveTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * - * 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.cloudservers.compute; - -import org.jclouds.compute.BaseTemplateBuilderLiveTest; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; -import org.testng.annotations.Test; - -import com.google.common.base.Predicate; - -/** - * - * @author Adrian Cole - */ -@Test(groups = "live") -public class CloudServersTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { - - public CloudServersTemplateBuilderLiveTest() { - provider = "cloudservers"; - } - - @Override - protected Predicate defineUnsupportedOperatingSystems() { - return new Predicate() { - - @Override - public boolean apply(OsFamilyVersion64Bit input) { - return (input.family != OsFamily.WINDOWS && !input.is64Bit) || // - input.family == OsFamily.RHEL || // - (input.family == OsFamily.UBUNTU && input.version.equals("11.04")) || // - (input.family == OsFamily.CENTOS && input.version.matches("5.[23]")) || // - (input.family == OsFamily.WINDOWS && input.version.equals("2008")) || // - (input.family == OsFamily.WINDOWS && input.version.equals("2008 R2") && !input.is64Bit); - } - - }; - } - -} diff --git a/apis/elasticstack/src/test/java/org/jclouds/elasticstack/compute/ElasticStackTemplateBuilderLiveTest.java b/apis/elasticstack/src/test/java/org/jclouds/elasticstack/compute/ElasticStackTemplateBuilderLiveTest.java deleted file mode 100644 index 1808c71a83..0000000000 --- a/apis/elasticstack/src/test/java/org/jclouds/elasticstack/compute/ElasticStackTemplateBuilderLiveTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * - * 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.elasticstack.compute; - -import org.jclouds.compute.BaseTemplateBuilderLiveTest; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; -import org.testng.annotations.Test; - -import com.google.common.base.Predicate; - -/** - * - * @author Adrian Cole - */ -@Test(groups = "live") -public class ElasticStackTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { - - public ElasticStackTemplateBuilderLiveTest() { - provider = "elasticstack"; - } - - @Override - protected Predicate defineUnsupportedOperatingSystems() { - return new Predicate() { - - @Override - public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL) || // - (input.family == OsFamily.CENTOS && !(input.version.equals("5.5") && input.is64Bit)) || // - (input.family == OsFamily.UBUNTU && !(input.version.equals("10.04") && input.is64Bit)) || // - (input.family == OsFamily.WINDOWS && !((input.version.equals("2008") || input.version.equals("2008 R2")) && input.is64Bit)) // - ); - } - - }; - } - -} \ No newline at end of file diff --git a/apis/eucalyptus/src/test/java/org/jclouds/eucalyptus/compute/EucalyptusTemplateBuilderLiveTest.java b/apis/eucalyptus/src/test/java/org/jclouds/eucalyptus/compute/EucalyptusTemplateBuilderLiveTest.java deleted file mode 100644 index 2c98b25e91..0000000000 --- a/apis/eucalyptus/src/test/java/org/jclouds/eucalyptus/compute/EucalyptusTemplateBuilderLiveTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * - * 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.eucalyptus.compute; - -import static org.jclouds.compute.util.ComputeServiceUtils.getCores; -import static org.testng.Assert.assertEquals; - -import java.io.IOException; - -import org.jclouds.compute.BaseTemplateBuilderLiveTest; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; -import org.testng.annotations.Test; - -import com.google.common.base.Predicate; - -/** - * - * @author Adrian Cole - */ -@Test(groups = "live") -public class EucalyptusTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { - - public EucalyptusTemplateBuilderLiveTest() { - provider = "eucalyptus"; - } - - @Override - protected Predicate defineUnsupportedOperatingSystems() { - return new Predicate() { - - @Override - public boolean apply(OsFamilyVersion64Bit input) { - return input.family == OsFamily.RHEL || // - (input.family == OsFamily.CENTOS && !input.version.equals("5.3") || !input.is64Bit) || // - input.family == OsFamily.WINDOWS || // - input.family == OsFamily.UBUNTU; - - } - - }; - } - - @Test - public void testDefaultTemplateBuilder() throws IOException { - - Template defaultTemplate = context.getComputeService().templateBuilder().build(); - assert (defaultTemplate.getImage().getProviderId().startsWith("emi-")) : defaultTemplate; - assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "5.3"); - assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); - assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS); - assertEquals(defaultTemplate.getImage().getUserMetadata().get("rootDeviceType"), "instance-store"); - assertEquals(defaultTemplate.getLocation().getId(), "Eucalyptus"); - assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); - - } - -} diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVCloudExpressVAppTemplate.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVCloudExpressVAppTemplate.java index 7320daed15..66b613333b 100644 --- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVCloudExpressVAppTemplate.java +++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVCloudExpressVAppTemplate.java @@ -20,21 +20,14 @@ package org.jclouds.vcloud.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseOsFamilyOrUnrecognized; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.inject.Inject; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.OperatingSystemBuilder; -import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; -import org.jclouds.compute.util.ComputeServiceUtils; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.VCloudExpressVAppTemplate; @@ -46,17 +39,16 @@ import com.google.common.base.Function; public class ImageForVCloudExpressVAppTemplate implements Function { private final FindLocationForResource findLocationForResource; private final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; - private ReferenceType parent; + private final Function osParser; - private final Map> osVersionMap; + private ReferenceType parent; @Inject protected ImageForVCloudExpressVAppTemplate(FindLocationForResource findLocationForResource, - PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, - Map> osVersionMap) { - this.osVersionMap = osVersionMap; + PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, Function osParser) { this.findLocationForResource = checkNotNull(findLocationForResource, "findLocationForResource"); this.credentialsProvider = checkNotNull(credentialsProvider, "credentialsProvider"); + this.osParser = osParser; } public ImageForVCloudExpressVAppTemplate withParent(ReferenceType parent) { @@ -72,24 +64,8 @@ public class ImageForVCloudExpressVAppTemplate implements Function + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.vcloud.compute.functions; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.util.ComputeServiceUtils.parseOsFamilyOrUnrecognized; + +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OperatingSystemBuilder; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.util.ComputeServiceUtils; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class ParseOsFromVAppTemplateName implements Function { + protected static final Pattern OS_PATTERN = Pattern.compile("(([^ ]*) ([0-9.]+) ?.*)"); + + protected final Map> osVersionMap; + + @Inject + protected ParseOsFromVAppTemplateName(Map> osVersionMap) { + this.osVersionMap = checkNotNull(osVersionMap, "osVersionMap"); + } + + @Override + public OperatingSystem apply(String from) { + OperatingSystemBuilder builder = new OperatingSystemBuilder(); + OsFamily osFamily = parseOsFamilyOrUnrecognized(checkNotNull(from, "vapp template name")); + builder.family(osFamily); + builder.description(from); + builder.is64Bit(from.indexOf("64") != -1); + Matcher matcher = OS_PATTERN.matcher(from); + if (matcher.find()) { + builder.version(ComputeServiceUtils.parseVersionOrReturnEmptyString(osFamily, matcher.group(3), osVersionMap)); + } + return builder.build(); + } +} \ No newline at end of file diff --git a/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java b/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java index 3da0c3d7ed..9d19ff1539 100644 --- a/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java @@ -25,10 +25,10 @@ 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.Map.Entry; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -36,6 +36,7 @@ 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.domain.TemplateBuilder; import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.json.Json; @@ -91,14 +92,14 @@ public abstract class BaseTemplateBuilderLiveTest { @BeforeClass public void setupClient() throws InterruptedException, ExecutionException, TimeoutException, IOException { setupCredentials(); - context = new ComputeServiceContextFactory().createContext(provider, - ImmutableSet. of(new Log4JLoggingModule()), setupProperties()); + context = new ComputeServiceContextFactory().createContext(provider, ImmutableSet + . of(new Log4JLoggingModule()), setupProperties()); } @DataProvider(name = "osSupported") public Object[][] osSupported() { - return convertToArray(Sets.filter(provideAllOperatingSystems(), - Predicates.not(defineUnsupportedOperatingSystems()))); + return convertToArray(Sets.filter(provideAllOperatingSystems(), Predicates + .not(defineUnsupportedOperatingSystems()))); } protected Object[][] convertToArray(Set supportedOperatingSystems) { @@ -121,7 +122,7 @@ public abstract class BaseTemplateBuilderLiveTest { protected Set provideAllOperatingSystems() { Map> map = new BaseComputeServiceContextModule() { }.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule()) - .getInstance(Json.class)); + .getInstance(Json.class)); Set supportedOperatingSystems = Sets.newHashSet(); for (Entry> osVersions : map.entrySet()) { @@ -135,17 +136,24 @@ public abstract class BaseTemplateBuilderLiveTest { @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); + TemplateBuilder builder = context.getComputeService().templateBuilder().osFamily(matrix.family).os64Bit( + matrix.is64Bit); + if (!matrix.version.equals("")) + builder.osVersionMatches("^" + matrix.version + "$"); + Template template = builder.build(); + if (!matrix.version.equals("")) + 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(); + TemplateBuilder builder = context.getComputeService().templateBuilder().osFamily(matrix.family).os64Bit( + matrix.is64Bit); + if (!matrix.version.equals("")) + builder.osVersionMatches("^" + matrix.version + "$"); + builder.build(); } @Test @@ -153,7 +161,7 @@ public abstract class BaseTemplateBuilderLiveTest { Template defaultTemplate = context.getComputeService().templateBuilder().build(); Template template = context.getComputeService().templateBuilder().imageId(defaultTemplate.getImage().getId()) - .build(); + .build(); assertEquals(template.getImage(), defaultTemplate.getImage()); } diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java index 55617fb968..2c20f1f5d5 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java @@ -57,9 +57,16 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { @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]")); + switch (input.family) { + case UBUNTU: + return false; + case CENTOS: + return !(input.version.matches("5.[42]") || input.version.equals("")); + case WINDOWS: + return !(input.version.matches("200[38]") || input.version.equals("")); + default: + return true; + } } }; @@ -75,7 +82,6 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { assertEquals(template.getImage().getOperatingSystem().getVersion(), "10.10"); assertEquals(template.getImage().getOperatingSystem().is64Bit(), false); assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(template.getImage().getVersion(), "20110126"); assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store"); assertEquals(template.getLocation().getId(), "us-east-1"); assertEquals(getCores(template.getHardware()), 1.0d); @@ -120,10 +126,10 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { public void testTemplateBuilderMicro() throws IOException { Template microTemplate = context.getComputeService().templateBuilder().hardwareId(InstanceType.T1_MICRO) - .osFamily(OsFamily.UBUNTU).build(); + .osFamily(OsFamily.UBUNTU).osVersionMatches("10.10").os64Bit(true).build(); assert (microTemplate.getImage().getProviderId().startsWith("ami-")) : microTemplate; - assertEquals(microTemplate.getImage().getOperatingSystem().getVersion(), "10.04"); + assertEquals(microTemplate.getImage().getOperatingSystem().getVersion(), "10.10"); assertEquals(microTemplate.getImage().getOperatingSystem().is64Bit(), true); assertEquals(microTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); assertEquals(microTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs"); diff --git a/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorTemplateBuilderLiveTest.java b/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorTemplateBuilderLiveTest.java new file mode 100644 index 0000000000..80399dc6b9 --- /dev/null +++ b/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorTemplateBuilderLiveTest.java @@ -0,0 +1,52 @@ +package org.jclouds.vcloud.bluelock.compute; + +import static org.jclouds.compute.util.ComputeServiceUtils.getCores; +import static org.testng.Assert.assertEquals; + +import java.io.IOException; + +import org.jclouds.compute.BaseTemplateBuilderLiveTest; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; +import org.testng.annotations.Test; + +import com.google.common.base.Predicate; + +/** + * + * @author Adrian Cole + */ +@Test(groups = "live") +public class BlueLockVCloudDirectorTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { + + public BlueLockVCloudDirectorTemplateBuilderLiveTest() { + provider = "bluelock-vcdirector"; + } + + @Override + protected Predicate defineUnsupportedOperatingSystems() { + return new Predicate() { + + @Override + public boolean apply(OsFamilyVersion64Bit input) { + switch (input.family) { + case UBUNTU: + return !input.version.equals(""); + default: + return true; + } + } + + }; + } + + @Override + public void testDefaultTemplateBuilder() throws IOException { + Template defaultTemplate = context.getComputeService().templateBuilder().build(); + assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), ""); + assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); + assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); + assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); + } +} \ No newline at end of file diff --git a/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKTemplateBuilderLiveTest.java b/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKTemplateBuilderLiveTest.java index bcd71630f6..86a8d4019c 100644 --- a/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKTemplateBuilderLiveTest.java +++ b/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKTemplateBuilderLiveTest.java @@ -47,12 +47,17 @@ public class CloudServersUKTemplateBuilderLiveTest extends BaseTemplateBuilderLi @Override public boolean apply(OsFamilyVersion64Bit input) { - return (input.family != OsFamily.WINDOWS && !input.is64Bit) || // - input.family == OsFamily.RHEL || // - (input.family == OsFamily.UBUNTU && input.version.equals("11.04")) || // - (input.family == OsFamily.CENTOS && input.version.matches("5.[23]")) || // - (input.family == OsFamily.WINDOWS && input.version.equals("2008")) || // - (input.family == OsFamily.WINDOWS && input.version.equals("2008 R2") && !input.is64Bit); + switch (input.family) { + case UBUNTU: + return input.version.equals("11.04") || input.version.equals("8.04") || !input.is64Bit; + case CENTOS: + return input.version.matches("5.[023]") || !input.is64Bit; + case WINDOWS: + return input.version.equals("2008") || input.version.indexOf("2003") != -1 + || (input.version.equals("2008 R2") && !input.is64Bit); + default: + return true; + } } }; diff --git a/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSTemplateBuilderLiveTest.java b/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSTemplateBuilderLiveTest.java index c58e96e237..5b8e199b7b 100644 --- a/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSTemplateBuilderLiveTest.java +++ b/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSTemplateBuilderLiveTest.java @@ -47,12 +47,17 @@ public class CloudServersUSTemplateBuilderLiveTest extends BaseTemplateBuilderLi @Override public boolean apply(OsFamilyVersion64Bit input) { - return (input.family != OsFamily.WINDOWS && !input.is64Bit) || // - input.family == OsFamily.RHEL || // - (input.family == OsFamily.UBUNTU && input.version.equals("11.04")) || // - (input.family == OsFamily.CENTOS && input.version.matches("5.[23]")) || // - (input.family == OsFamily.WINDOWS && input.version.equals("2008")) || // - (input.family == OsFamily.WINDOWS && input.version.equals("2008 R2") && !input.is64Bit); + switch (input.family) { + case UBUNTU: + return input.version.equals("11.04") || input.version.equals("8.04") || !input.is64Bit; + case CENTOS: + return input.version.matches("5.[023]") || !input.is64Bit; + case WINDOWS: + return input.version.equals("2008") || input.version.indexOf("2003") != -1 + || (input.version.equals("2008 R2") && !input.is64Bit); + default: + return true; + } } }; diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderLiveTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderLiveTest.java index b380e5e03e..b782e551a6 100644 --- a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderLiveTest.java +++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderLiveTest.java @@ -46,20 +46,26 @@ public class CloudSigmaTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTe @Override protected Predicate defineUnsupportedOperatingSystems() { return new Predicate() { - @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL) || // - (input.family == OsFamily.CENTOS && !(input.version.equals("5.5") && input.is64Bit)) || // - (input.family == OsFamily.UBUNTU && !(input.version.matches("10.10") && input.is64Bit)) || // - (input.family == OsFamily.WINDOWS && !((input.version.equals("2008 R2") && input.is64Bit) - || (input.version.equals("2008") && !input.is64Bit) || (input.version.equals("2003")))) // - ); + switch (input.family) { + case UBUNTU: + return !input.version.equals("") && !(input.version.equals("10.10") && input.is64Bit); + case CENTOS: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("5.5") && input.is64Bit); + case WINDOWS: + return !((input.version.equals("2008 R2") && input.is64Bit) + || (input.version.equals("2008") && !input.is64Bit) || input.version.equals("") || (input.version + .equals("2003"))); + default: + return true; + } } }; } - + @Override public void testDefaultTemplateBuilder() throws IOException { Template defaultTemplate = context.getComputeService().templateBuilder().build(); diff --git a/providers/elastichosts-lon-b/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsBlueSquareLondonTemplateBuilderLiveTest.java b/providers/elastichosts-lon-b/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsBlueSquareLondonTemplateBuilderLiveTest.java index 8f8424415e..e4eae7a638 100644 --- a/providers/elastichosts-lon-b/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsBlueSquareLondonTemplateBuilderLiveTest.java +++ b/providers/elastichosts-lon-b/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsBlueSquareLondonTemplateBuilderLiveTest.java @@ -47,11 +47,19 @@ public class ElasticHostsBlueSquareLondonTemplateBuilderLiveTest extends BaseTem @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL) || // - (input.family == OsFamily.CENTOS && !(input.version.equals("5.5") && input.is64Bit)) || // - (input.family == OsFamily.UBUNTU && !(input.version.equals("10.04") && input.is64Bit)) || // - (input.family == OsFamily.WINDOWS && !((input.version.equals("2008") || input.version.equals("2008 R2")) && input.is64Bit)) // - ); + switch (input.family) { + case UBUNTU: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("10.04") && input.is64Bit); + case CENTOS: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("5.5") && input.is64Bit); + case WINDOWS: + return !(input.version.equals("") && input.is64Bit) + && !((input.version.equals("2008 R2") && input.is64Bit) || (input.version.equals("2008") && input.is64Bit)); + default: + return true; + } } }; diff --git a/providers/elastichosts-lon-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1LondonTemplateBuilderLiveTest.java b/providers/elastichosts-lon-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1LondonTemplateBuilderLiveTest.java index 7646f8b5c4..12da914a2f 100644 --- a/providers/elastichosts-lon-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1LondonTemplateBuilderLiveTest.java +++ b/providers/elastichosts-lon-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1LondonTemplateBuilderLiveTest.java @@ -47,11 +47,19 @@ public class ElasticHostsPeer1LondonTemplateBuilderLiveTest extends BaseTemplate @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL) || // - (input.family == OsFamily.CENTOS && !(input.version.equals("5.5") && input.is64Bit)) || // - (input.family == OsFamily.UBUNTU && !(input.version.equals("10.04") && input.is64Bit)) || // - (input.family == OsFamily.WINDOWS && !((input.version.equals("2008") || input.version.equals("2008 R2")) && input.is64Bit)) // - ); + switch (input.family) { + case UBUNTU: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("10.04") && input.is64Bit); + case CENTOS: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("5.5") && input.is64Bit); + case WINDOWS: + return !(input.version.equals("") && input.is64Bit) + && !((input.version.equals("2008 R2") && input.is64Bit) || (input.version.equals("2008") && input.is64Bit)); + default: + return true; + } } }; diff --git a/providers/elastichosts-sat-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest.java b/providers/elastichosts-sat-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest.java index ae43a8ab2f..88ba53c96c 100644 --- a/providers/elastichosts-sat-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest.java +++ b/providers/elastichosts-sat-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest.java @@ -47,11 +47,19 @@ public class ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest extends BaseTemp @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL) || // - (input.family == OsFamily.CENTOS && !(input.version.equals("5.5") && input.is64Bit)) || // - (input.family == OsFamily.UBUNTU && !(input.version.equals("10.04") && input.is64Bit)) || // - (input.family == OsFamily.WINDOWS && !((input.version.equals("2008") || input.version.equals("2008 R2")) && input.is64Bit)) // - ); + switch (input.family) { + case UBUNTU: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("10.04") && input.is64Bit); + case CENTOS: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("5.5") && input.is64Bit); + case WINDOWS: + return !(input.version.equals("") && input.is64Bit) + && !((input.version.equals("2008 R2") && input.is64Bit) || (input.version.equals("2008") && input.is64Bit)); + default: + return true; + } } }; diff --git a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java index ec7612aeca..ff01e37790 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java +++ b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java @@ -49,11 +49,15 @@ public class EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest extends Bas @Override public boolean apply(OsFamilyVersion64Bit input) { - return input.family == OsFamily.RHEL || // - (input.family == OsFamily.CENTOS && !input.version.equals("5.3") || !input.is64Bit) || // - (input.family == OsFamily.WINDOWS && !(input.version.equals("2008") && input.is64Bit)) || // - input.family == OsFamily.UBUNTU; - + switch (input.family) { + case CENTOS: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("5.3") && input.is64Bit); + case WINDOWS: + return !(input.version.equals("") && input.is64Bit); + default: + return true; + } } }; diff --git a/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/GoGridTemplateBuilderLiveTest.java b/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/GoGridTemplateBuilderLiveTest.java index 0eb0a51291..41cedbf423 100644 --- a/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/GoGridTemplateBuilderLiveTest.java +++ b/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/GoGridTemplateBuilderLiveTest.java @@ -46,17 +46,20 @@ public class GoGridTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { @Override protected Predicate defineUnsupportedOperatingSystems() { return new Predicate() { - @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL && !input.version.equals("5.4")) || // - (input.family == OsFamily.CENTOS && input.version.matches("5.[542]")) || // - (input.family == OsFamily.CENTOS && input.is64Bit && input.version.equals("5.[42]")) || // - (input.family == OsFamily.UBUNTU) || // - (input.family == OsFamily.WINDOWS && input.version.equals("2008 SP2") || // - (input.family == OsFamily.WINDOWS && input.version.equals("2008 R2")))); + switch (input.family) { + case RHEL: + return !input.version.equals("") && !input.version.equals("5.4"); + case CENTOS: + return !input.version.equals("") && !input.version.equals("5.3"); + case WINDOWS: + return !input.version.equals("") && (input.is64Bit && !input.version.matches("200[38]")) + || (input.version.matches("200[38] [RS]P?2") && !input.is64Bit); + default: + return true; + } } - }; } diff --git a/providers/openhosting-east1/src/test/java/org/jclouds/openhosting/compute/OpenHostingEast1TemplateBuilderLiveTest.java b/providers/openhosting-east1/src/test/java/org/jclouds/openhosting/compute/OpenHostingEast1TemplateBuilderLiveTest.java index 99d1075fb4..e03674d214 100644 --- a/providers/openhosting-east1/src/test/java/org/jclouds/openhosting/compute/OpenHostingEast1TemplateBuilderLiveTest.java +++ b/providers/openhosting-east1/src/test/java/org/jclouds/openhosting/compute/OpenHostingEast1TemplateBuilderLiveTest.java @@ -49,11 +49,16 @@ public class OpenHostingEast1TemplateBuilderLiveTest extends BaseTemplateBuilder @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL) || // - (input.family == OsFamily.CENTOS && !(input.version.equals("5.5") && input.is64Bit)) || // - (input.family == OsFamily.UBUNTU && !(input.version.equals("10.10") && input.is64Bit)) || // - (input.family == OsFamily.WINDOWS) // - ); + switch (input.family) { + case UBUNTU: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("10.10") && input.is64Bit); + case CENTOS: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("5.5") && input.is64Bit); + default: + return true; + } } }; diff --git a/providers/serverlove-z1-man/src/test/java/org/jclouds/serverlove/compute/ServerloveManchesterTemplateBuilderLiveTest.java b/providers/serverlove-z1-man/src/test/java/org/jclouds/serverlove/compute/ServerloveManchesterTemplateBuilderLiveTest.java index adc78a24c9..c2ddf3588c 100644 --- a/providers/serverlove-z1-man/src/test/java/org/jclouds/serverlove/compute/ServerloveManchesterTemplateBuilderLiveTest.java +++ b/providers/serverlove-z1-man/src/test/java/org/jclouds/serverlove/compute/ServerloveManchesterTemplateBuilderLiveTest.java @@ -47,11 +47,19 @@ public class ServerloveManchesterTemplateBuilderLiveTest extends BaseTemplateBui @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL) || // - (input.family == OsFamily.CENTOS && !(input.version.equals("5.5") && input.is64Bit)) || // - (input.family == OsFamily.UBUNTU && !(input.version.equals("10.04") && input.is64Bit)) || // - (input.family == OsFamily.WINDOWS && !(input.version.equals("2008 R2") && input.is64Bit)) // - ); + switch (input.family) { + case UBUNTU: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("10.04") && input.is64Bit); + case CENTOS: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("5.5") && input.is64Bit); + case WINDOWS: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("2008 R2") && input.is64Bit); + default: + return true; + } } }; diff --git a/providers/skalicloud-sdg-my/src/test/java/org/jclouds/skalicloud/compute/SkaliCloudMalaysiaTemplateBuilderLiveTest.java b/providers/skalicloud-sdg-my/src/test/java/org/jclouds/skalicloud/compute/SkaliCloudMalaysiaTemplateBuilderLiveTest.java index 92d2713c98..d49cc01cd4 100644 --- a/providers/skalicloud-sdg-my/src/test/java/org/jclouds/skalicloud/compute/SkaliCloudMalaysiaTemplateBuilderLiveTest.java +++ b/providers/skalicloud-sdg-my/src/test/java/org/jclouds/skalicloud/compute/SkaliCloudMalaysiaTemplateBuilderLiveTest.java @@ -49,11 +49,17 @@ public class SkaliCloudMalaysiaTemplateBuilderLiveTest extends BaseTemplateBuild @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL) || // - (input.family == OsFamily.CENTOS && !input.version.equals("5.5")) || // - (input.family == OsFamily.UBUNTU && !input.version.equals("10.10")) || // - (input.family == OsFamily.WINDOWS && !(input.version.equals("2008 R2") && input.is64Bit)) // - ); + switch (input.family) { + case UBUNTU: + return !input.version.equals("") && !input.version.equals("10.10"); + case CENTOS: + return !input.version.equals("") && !input.version.equals("5.5"); + case WINDOWS: + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("2008 R2") && input.is64Bit); + default: + return true; + } } }; diff --git a/providers/slicehost/src/test/java/org/jclouds/slicehost/compute/SlicehostTemplateBuilderLiveTest.java b/providers/slicehost/src/test/java/org/jclouds/slicehost/compute/SlicehostTemplateBuilderLiveTest.java index 5e348c75c2..f4995e9f52 100644 --- a/providers/slicehost/src/test/java/org/jclouds/slicehost/compute/SlicehostTemplateBuilderLiveTest.java +++ b/providers/slicehost/src/test/java/org/jclouds/slicehost/compute/SlicehostTemplateBuilderLiveTest.java @@ -49,11 +49,23 @@ public class SlicehostTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTes @Override public boolean apply(OsFamilyVersion64Bit input) { - return (input.family == OsFamily.RHEL || // - (input.family == OsFamily.UBUNTU && input.version.equals("11.04")) || // - (input.family == OsFamily.CENTOS && input.version.matches("5.[23]")) || // - (input.family == OsFamily.WINDOWS && !(input.is64Bit && input.version.equals("2008 R2"))// - && !(!input.is64Bit && input.version.equals("2008 SP2")))); + switch (input.family) { + case UBUNTU: + return !input.version.equals("") && !(input.version.equals("10.04") || input.version.endsWith(".10")); + case RHEL: + return !(input.version.equals("") && input.is64Bit); + case CENTOS: + return !input.version.equals("") && input.version.matches("5.[23]") + || (input.version.equals("5.0") && !input.is64Bit); + case WINDOWS: + return !input.version.equals("") + && input.version.startsWith("2008") + && !(input.version.startsWith("2008 R2") && input.is64Bit || input.version + .startsWith("2008 SP2") + && !input.is64Bit) || input.version.indexOf("2003") != -1; + default: + return true; + } } }; diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudTemplateBuilderLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudTemplateBuilderLiveTest.java index 7d4a6675a6..5a6161bc43 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudTemplateBuilderLiveTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudTemplateBuilderLiveTest.java @@ -49,12 +49,23 @@ public class TerremarkECloudTemplateBuilderLiveTest extends BaseTemplateBuilderL @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL) || // - (input.family == OsFamily.CENTOS && !input.version.equals("5.5")) || // - (input.family == OsFamily.UBUNTU &&( !input.version.equals("10.04")&&!input.version.equals("8.04"))) || // - (input.family == OsFamily.WINDOWS && (input.version.equals("2008 SP2") || input.version.equals("2008 R2")))); + switch (input.family) { + case RHEL: + return !input.version.equals("") && !input.version.matches("5.[50]"); + case SOLARIS: + return !input.is64Bit; + case CENTOS: + return !input.version.equals("") && !input.version.matches("5.[50]"); + case UBUNTU: + return !input.version.equals("") && !input.version.equals("10.04") && !input.version.equals("8.04"); + case WINDOWS: + return !input.version.equals("") && !input.version.equals("2003 R2") // + && !(input.version.equals("2008") && !input.is64Bit) // + && !(input.version.matches("2008( R2)?") && input.is64Bit); + default: + return true; + } } - }; } @@ -65,7 +76,6 @@ public class TerremarkECloudTemplateBuilderLiveTest extends BaseTemplateBuilderL assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); - } } \ No newline at end of file diff --git a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressTemplateBuilderLiveTest.java b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressTemplateBuilderLiveTest.java index 573d37206f..a7648d7aae 100644 --- a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressTemplateBuilderLiveTest.java +++ b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressTemplateBuilderLiveTest.java @@ -46,14 +46,22 @@ public class TerremarkVCloudExpressTemplateBuilderLiveTest extends BaseTemplateB @Override protected Predicate defineUnsupportedOperatingSystems() { return new Predicate() { - @Override public boolean apply(OsFamilyVersion64Bit input) { - return ((input.family == OsFamily.RHEL || input.family == OsFamily.CENTOS) || // - (input.family == OsFamily.UBUNTU && !input.version.equals("9.10")) || // - (input.family == OsFamily.WINDOWS && (input.version.equals("2008 SP2") || input.version.equals("2008 R2")))); + switch (input.family) { + case RHEL: + return !input.version.equals("") && !input.version.equals("5.0"); + case CENTOS: + return !input.version.equals("") && !input.version.matches("5.0"); + case UBUNTU: + return !input.version.equals("") && !(input.version.equals("9.04") || input.version.equals("9.10")); + case WINDOWS: + return !input.version.equals("") && !input.version.equals("2003") // + && !input.version.equals("2008"); + default: + return true; + } } - }; } From b351223f5e79f39245fc667a7755453fff5c17a3 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 29 Jan 2011 20:58:51 -0800 Subject: [PATCH 13/81] removed provider-specific image parsing from base classes --- .../ec2/compute/functions/EC2ImageParser.java | 10 +++----- .../compute/functions/EC2ImageParserTest.java | 2 +- .../compute/util/ComputeServiceUtils.java | 9 +++---- .../strategy/AWSEC2ImageParserTest.java | 2 +- ...ptusPartnerCloudReviseParsedImageTest.java | 2 +- .../deltacloud/DeltacloudClientLiveTest.java | 2 +- .../nova/ec2/NovaEC2PropertiesBuilder.java | 2 -- ...rEncodeTagIntoNameRunNodesAndAddToSet.java | 25 ++++++++++++------- .../IBMDeveloperCloudClientLiveTest.java | 6 ++--- 9 files changed, 30 insertions(+), 30 deletions(-) diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2ImageParser.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2ImageParser.java index a000772aa3..1c6fa2ceb0 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2ImageParser.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2ImageParser.java @@ -45,7 +45,6 @@ import org.jclouds.domain.internal.LocationImpl; import org.jclouds.ec2.compute.strategy.ReviseParsedImage; import org.jclouds.ec2.domain.Image.Architecture; import org.jclouds.ec2.domain.Image.ImageType; -import org.jclouds.location.Provider; import org.jclouds.logging.Logger; import com.google.common.base.Function; @@ -66,19 +65,16 @@ public class EC2ImageParser implements Function> locations; private final Supplier defaultLocation; - private final String provider; private final Map> osVersionMap; private final ReviseParsedImage reviseParsedImage; @Inject - public - EC2ImageParser(PopulateDefaultLoginCredentialsForImageStrategy credentialProvider, + public EC2ImageParser(PopulateDefaultLoginCredentialsForImageStrategy credentialProvider, Map> osVersionMap, @Memoized Supplier> locations, - Supplier defaultLocation, @Provider String provider, ReviseParsedImage reviseParsedImage) { + Supplier defaultLocation, ReviseParsedImage reviseParsedImage) { this.credentialProvider = checkNotNull(credentialProvider, "credentialProvider"); this.locations = checkNotNull(locations, "locations"); this.defaultLocation = checkNotNull(defaultLocation, "defaultLocation"); - this.provider = checkNotNull(provider, "provider"); this.osVersionMap = checkNotNull(osVersionMap, "osVersionMap"); this.reviseParsedImage = checkNotNull(reviseParsedImage, "reviseParsedImage"); } @@ -98,7 +94,7 @@ public class EC2ImageParser implements Function result = DescribeImagesResponseHandlerTest.parseImages(resource); EC2ImageParser parser = new EC2ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), map, Suppliers.> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "ec2", new ReviseParsedImage.NoopReviseParsedImage()); + .ofInstance(defaultLocation), new ReviseParsedImage.NoopReviseParsedImage()); return Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(result, parser), Predicates.notNull())); } 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 90cd456c49..8c14032bb6 100644 --- a/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java +++ b/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java @@ -132,17 +132,14 @@ public class ComputeServiceUtils { return total; } - public static org.jclouds.compute.domain.OsFamily parseOsFamilyOrUnrecognized(String provider, String in) { + public static org.jclouds.compute.domain.OsFamily parseOsFamilyOrUnrecognized(String in) { org.jclouds.compute.domain.OsFamily myOs = null; for (org.jclouds.compute.domain.OsFamily os : org.jclouds.compute.domain.OsFamily.values()) { if (in.toLowerCase().replaceAll("\\s", "").indexOf(os.toString()) != -1) { myOs = os; } } - if (myOs == null && provider.indexOf("nebula") != -1) { - myOs = OsFamily.UBUNTU; - } - return OsFamily.UNRECOGNIZED; + return myOs != null ? myOs : OsFamily.UNRECOGNIZED; } public static String createExecutionErrorMessage(Map executionExceptions) { @@ -209,6 +206,8 @@ public class ComputeServiceUtils { if (osVersionMap.containsKey(family)) { if (osVersionMap.get(family).containsKey(in)) return osVersionMap.get(family).get(in); + if (osVersionMap.get(family).containsValue(in)) + return in; CONTAINS_SUBSTRING contains = new CONTAINS_SUBSTRING(in.replace('-', '.')); try { String key = Iterables.find(osVersionMap.get(family).keySet(), contains); diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java index bcff702c96..247c15933f 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java @@ -165,7 +165,7 @@ public class AWSEC2ImageParserTest { Set result = DescribeImagesResponseHandlerTest.parseImages(resource); EC2ImageParser parser = new EC2ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), map, Suppliers.> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "ec2", new AWSEC2ReviseParsedImage(map)); + .ofInstance(defaultLocation), new AWSEC2ReviseParsedImage(map)); return Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(result, parser), Predicates.notNull())); } } diff --git a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/strategy/EucalyptusPartnerCloudReviseParsedImageTest.java b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/strategy/EucalyptusPartnerCloudReviseParsedImageTest.java index 4c9af8ba85..3a8443ba0f 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/strategy/EucalyptusPartnerCloudReviseParsedImageTest.java +++ b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/strategy/EucalyptusPartnerCloudReviseParsedImageTest.java @@ -97,7 +97,7 @@ public class EucalyptusPartnerCloudReviseParsedImageTest { Set result = DescribeImagesResponseHandlerTest.parseImages(resource); EC2ImageParser parser = new EC2ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), map, Suppliers.> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "ec2", new EucalyptusPartnerCloudReviseParsedImage(map)); + .ofInstance(defaultLocation), new EucalyptusPartnerCloudReviseParsedImage(map)); return Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(result, parser), Predicates.notNull())); } diff --git a/sandbox-apis/deltacloud/src/test/java/org/jclouds/deltacloud/DeltacloudClientLiveTest.java b/sandbox-apis/deltacloud/src/test/java/org/jclouds/deltacloud/DeltacloudClientLiveTest.java index d8840471d9..d530fdaf14 100644 --- a/sandbox-apis/deltacloud/src/test/java/org/jclouds/deltacloud/DeltacloudClientLiveTest.java +++ b/sandbox-apis/deltacloud/src/test/java/org/jclouds/deltacloud/DeltacloudClientLiveTest.java @@ -24,6 +24,7 @@ import static org.testng.Assert.assertEquals; import java.io.IOException; import java.util.logging.Logger; +import org.jclouds.compute.domain.ExecResponse; import org.jclouds.deltacloud.domain.Instance; import org.jclouds.deltacloud.domain.InstanceAction; import org.jclouds.deltacloud.domain.InstanceState; @@ -31,7 +32,6 @@ import org.jclouds.deltacloud.options.CreateInstanceOptions; import org.jclouds.domain.Credentials; import org.jclouds.http.HttpRequest; import org.jclouds.net.IPSocket; -import org.jclouds.ssh.ExecResponse; import org.jclouds.ssh.SshClient; import org.jclouds.ssh.jsch.config.JschSshClientModule; import org.testng.annotations.AfterGroups; diff --git a/sandbox-apis/nova-ec2/src/main/java/org/jclouds/nova/ec2/NovaEC2PropertiesBuilder.java b/sandbox-apis/nova-ec2/src/main/java/org/jclouds/nova/ec2/NovaEC2PropertiesBuilder.java index 8a6cbca0e7..09563a1177 100644 --- a/sandbox-apis/nova-ec2/src/main/java/org/jclouds/nova/ec2/NovaEC2PropertiesBuilder.java +++ b/sandbox-apis/nova-ec2/src/main/java/org/jclouds/nova/ec2/NovaEC2PropertiesBuilder.java @@ -21,7 +21,6 @@ package org.jclouds.nova.ec2; import static org.jclouds.Constants.PROPERTY_ENDPOINT; import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; -import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; import java.util.Properties; @@ -38,7 +37,6 @@ public class NovaEC2PropertiesBuilder extends EC2PropertiesBuilder { Properties properties = super.defaultProperties(); properties.setProperty(PROPERTY_ENDPOINT, "YOU_MUST_SET_" + PROPERTY_ENDPOINT); properties.setProperty(PROPERTY_EC2_AMI_OWNERS, "*"); - properties.setProperty(PROPERTY_EC2_CC_AMIs, ""); return properties; } diff --git a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet.java b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet.java index 131c69f59e..ba489734b8 100644 --- a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet.java +++ b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet.java @@ -31,14 +31,17 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.Constants; +import org.jclouds.compute.config.CustomizationResponse; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap; import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; -import org.jclouds.compute.util.ComputeUtils; import org.jclouds.ibmdev.IBMDeveloperCloudClient; +import com.google.common.collect.Multimap; + /** * @author Adrian Cole */ @@ -48,18 +51,22 @@ public class CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet extends EncodeTag private final Map credentialsMap; @Inject - protected CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet(AddNodeWithTagStrategy addNodeWithTagStrategy, - ListNodesStrategy listNodesStrategy, @Named("NAMING_CONVENTION") String nodeNamingConvention, - ComputeUtils utils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, - IBMDeveloperCloudClient client, @Named("CREDENTIALS") Map credentialsMap) { - super(addNodeWithTagStrategy, listNodesStrategy, nodeNamingConvention, utils, executor); + protected CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet( + AddNodeWithTagStrategy addNodeWithTagStrategy, + ListNodesStrategy listNodesStrategy, + @Named("NAMING_CONVENTION") String nodeNamingConvention, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, + CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory, + IBMDeveloperCloudClient client, @Named("CREDENTIALS") Map credentialsMap) { + super(addNodeWithTagStrategy, listNodesStrategy, nodeNamingConvention, executor, + customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory); this.client = checkNotNull(client, "client"); this.credentialsMap = checkNotNull(credentialsMap, "credentialsMap"); } @Override - public Map> execute(String tag, int count, Template template, Set nodes, - Map badNodes) { + public Map> execute(String tag, int count, Template template, Set goodNodes, + Map badNodes, Multimap customizationResponses) { String keyAsText = template.getOptions().getPublicKey(); if (keyAsText != null) { template.getOptions().dontAuthorizePublicKey(); @@ -72,7 +79,7 @@ public class CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet extends EncodeTag } else { credentialsMap.put(tag, client.generateKeyPair(tag).getKeyMaterial()); } - return super.execute(tag, count, template, nodes, badNodes); + return super.execute(tag, count, template, goodNodes, badNodes, customizationResponses); } } \ No newline at end of file diff --git a/sandbox-providers/ibmdev/src/test/java/org/jclouds/ibmdev/IBMDeveloperCloudClientLiveTest.java b/sandbox-providers/ibmdev/src/test/java/org/jclouds/ibmdev/IBMDeveloperCloudClientLiveTest.java index 8c952e9237..809a3ade41 100644 --- a/sandbox-providers/ibmdev/src/test/java/org/jclouds/ibmdev/IBMDeveloperCloudClientLiveTest.java +++ b/sandbox-providers/ibmdev/src/test/java/org/jclouds/ibmdev/IBMDeveloperCloudClientLiveTest.java @@ -35,20 +35,21 @@ import java.util.Properties; import java.util.Set; import java.util.concurrent.TimeUnit; +import org.jclouds.compute.domain.ExecResponse; import org.jclouds.domain.Credentials; import org.jclouds.http.HttpResponseException; import org.jclouds.http.handlers.BackoffLimitedRetryHandler; import org.jclouds.ibmdev.domain.Address; import org.jclouds.ibmdev.domain.Image; import org.jclouds.ibmdev.domain.Instance; -import org.jclouds.ibmdev.domain.Instance.Software; import org.jclouds.ibmdev.domain.InstanceType; import org.jclouds.ibmdev.domain.Key; import org.jclouds.ibmdev.domain.Location; import org.jclouds.ibmdev.domain.Offering; import org.jclouds.ibmdev.domain.StorageOffering; -import org.jclouds.ibmdev.domain.StorageOffering.Format; import org.jclouds.ibmdev.domain.Volume; +import org.jclouds.ibmdev.domain.Instance.Software; +import org.jclouds.ibmdev.domain.StorageOffering.Format; import org.jclouds.ibmdev.predicates.AddressFree; import org.jclouds.ibmdev.predicates.InstanceActive; import org.jclouds.ibmdev.predicates.InstanceActiveOrFailed; @@ -60,7 +61,6 @@ import org.jclouds.predicates.InetSocketAddressConnect; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.RestContext; import org.jclouds.rest.RestContextFactory; -import org.jclouds.ssh.ExecResponse; import org.jclouds.ssh.SshClient; import org.jclouds.ssh.SshException; import org.jclouds.ssh.jsch.JschSshClient; From c8d4008c98a1713905a3825ef02a194b91a67045 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 29 Jan 2011 21:06:22 -0800 Subject: [PATCH 14/81] fixed pattern to id windows 2008 --- .../compute/util/VCloudComputeUtils.java | 2 +- ...oudExpressComputeServiceContextModule.java | 4 +++ .../terremark/TerremarkVCloudClient.java | 16 +++++++++- ...eTerremarkVCloudErrorFromHttpResponse.java | 4 +++ .../terremark/TerremarkClientLiveTest.java | 9 ++---- ...remarkVCloudErrorFromHttpResponseTest.java | 12 ++++++-- .../jclouds/vcloud/xml/CatalogHandler.java | 3 +- .../reference/ComputeServiceConstants.java | 2 +- .../compute/util/ComputeServiceUtils.java | 2 +- providers/trmk-ecloud/pom.xml | 2 +- .../terremark/TerremarkECloudClient.java | 2 ++ .../TerremarkECloudPropertiesBuilder.java | 4 +-- ...markECloudComputeServiceContextModule.java | 16 ++++++---- ...rnetServiceAndPublicIpAddressSupplier.java | 29 +++++++------------ .../TerremarkECloudAsyncClientTest.java | 12 ++++---- ...TerremarkECloudClientLiveTestDisabled.java | 20 +++++-------- .../TerremarkVCloudExpressClientLiveTest.java | 23 +++++---------- 17 files changed, 87 insertions(+), 75 deletions(-) diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/util/VCloudComputeUtils.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/util/VCloudComputeUtils.java index d2c195257e..f17fdb4e8e 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/util/VCloudComputeUtils.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/util/VCloudComputeUtils.java @@ -63,7 +63,7 @@ public class VCloudComputeUtils { } public static CIMOperatingSystem toComputeOs(org.jclouds.vcloud.domain.ovf.OperatingSystemSection os) { - return new CIMOperatingSystem(CIMOperatingSystem.OSType.fromValue(os.getId()), null, null, os.getDescription()); + return new CIMOperatingSystem(CIMOperatingSystem.OSType.fromValue(os.getId()), "", null, os.getDescription()); } public static Credentials getCredentialsFrom(VApp vApp) { diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java index 9eb35ffdf7..a156a564e7 100755 --- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java +++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java @@ -26,6 +26,7 @@ import org.jclouds.compute.config.BindComputeStrategiesByClass; import org.jclouds.compute.config.BindComputeSuppliersByClass; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; @@ -33,6 +34,7 @@ import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.compute.CommonVCloudComputeClient; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.compute.functions.ImagesInVCloudExpressOrg; +import org.jclouds.vcloud.compute.functions.ParseOsFromVAppTemplateName; import org.jclouds.vcloud.compute.functions.VCloudExpressVAppToNodeMetadata; import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; import org.jclouds.vcloud.domain.Org; @@ -64,6 +66,8 @@ public class VCloudExpressComputeServiceContextModule extends CommonVCloudComput bind(new TypeLiteral>>() { }).to(new TypeLiteral() { }); + bind(new TypeLiteral>() { + }).to(ParseOsFromVAppTemplateName.class); } protected void bindVAppConverter() { diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java index bb6d3d5955..3239407105 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java @@ -51,19 +51,33 @@ import org.jclouds.vcloud.terremark.options.AddNodeOptions; */ @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) public interface TerremarkVCloudClient extends VCloudExpressClient { - + /** + * {@inheritDoc} + */ @Override TerremarkCatalogItem getCatalogItem(URI catalogItem); + /** + * {@inheritDoc} + */ @Override TerremarkVDC getVDC(URI catalogItem); + /** + * {@inheritDoc} + */ @Override TerremarkCatalogItem findCatalogItemInOrgCatalogNamed(String orgName, String catalogName, String itemName); + /** + * {@inheritDoc} + */ @Override TerremarkOrg getOrg(URI orgId); + /** + * {@inheritDoc} + */ @Override TerremarkOrg findOrgNamed(String orgName); diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/handlers/ParseTerremarkVCloudErrorFromHttpResponse.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/handlers/ParseTerremarkVCloudErrorFromHttpResponse.java index 2426af62cf..482d0500c0 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/handlers/ParseTerremarkVCloudErrorFromHttpResponse.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/handlers/ParseTerremarkVCloudErrorFromHttpResponse.java @@ -34,6 +34,7 @@ import org.jclouds.http.HttpResponse; import org.jclouds.http.HttpResponseException; import org.jclouds.logging.Logger; import org.jclouds.rest.AuthorizationException; +import org.jclouds.rest.InsufficientResourcesException; import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.util.Strings2; @@ -61,6 +62,9 @@ public class ParseTerremarkVCloudErrorFromHttpResponse implements HttpErrorHandl || (response.getMessage().indexOf("because it is already powered off") != -1) || (response.getMessage().indexOf("exists") != -1))) exception = new IllegalStateException(response.getMessage(), exception); + else if (response.getMessage() != null + && ((response.getMessage().indexOf("There are no additional Public IPs available") != -1))) + exception = new InsufficientResourcesException(response.getMessage(), exception); else switch (response.getStatusCode()) { case 400: diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java index 8baf7694bf..5c58625632 100644 --- a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java +++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java @@ -220,16 +220,13 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes abstract TerremarkInstantiateVAppTemplateOptions createInstantiateOptions(); - protected abstract Entry getNewInternetServiceAndIpForSSH(URI vdc); + protected abstract Entry getNewInternetServiceAndIpForSSH(VCloudExpressVApp vApp); - @Test + @Test(enabled = true, dependsOnMethods = "testInstantiateAndPowerOn") public void testAddInternetService() throws InterruptedException, ExecutionException, TimeoutException, IOException { - - Entry entry = getNewInternetServiceAndIpForSSH(tmClient.findVDCInOrgNamed(null, - null).getHref()); + Entry entry = getNewInternetServiceAndIpForSSH(vApp); is = entry.getKey(); publicIp = entry.getValue().getAddress(); - } @Test(enabled = true, dependsOnMethods = "testInstantiateAndPowerOn") diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/handlers/ParseTerremarkVCloudErrorFromHttpResponseTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/handlers/ParseTerremarkVCloudErrorFromHttpResponseTest.java index 1c1365a1cc..b43b5c1650 100644 --- a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/handlers/ParseTerremarkVCloudErrorFromHttpResponseTest.java +++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/handlers/ParseTerremarkVCloudErrorFromHttpResponseTest.java @@ -24,6 +24,7 @@ import java.net.URI; import org.jclouds.http.BaseHttpErrorHandlerTest; import org.jclouds.http.HttpErrorHandler; import org.jclouds.rest.AuthorizationException; +import org.jclouds.rest.InsufficientResourcesException; import org.jclouds.rest.ResourceNotFoundException; import org.testng.annotations.Test; @@ -71,6 +72,12 @@ public class ParseTerremarkVCloudErrorFromHttpResponseTest extends BaseHttpError "", "", AuthorizationException.class); } + @Test + public void test403SetsInsufficientResourcesException() { + assertCodeMakes("GET", URI.create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32"), 403, + "There are no additional Public IPs available", "", InsufficientResourcesException.class); + } + @Test public void test501SetsNotImplementedMakesUnsupportedOperationException() { assertCodeMakes("POST", URI @@ -87,11 +94,12 @@ public class ParseTerremarkVCloudErrorFromHttpResponseTest extends BaseHttpError @Test public void testKeyAlreadyExistsSetsIllegalStateException() { - assertCodeMakes("POST", URI.create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/extensions/org/48/keys"), 400, + assertCodeMakes("POST", URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/extensions/org/48/keys"), 400, "Security key with name livetest exists.", "Security key with name livetest exists.", IllegalStateException.class); } - + @Override protected Class getHandlerClass() { return ParseTerremarkVCloudErrorFromHttpResponse.class; diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/xml/CatalogHandler.java b/common/vcloud/src/main/java/org/jclouds/vcloud/xml/CatalogHandler.java index aa478c5b73..74541aeb9d 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/xml/CatalogHandler.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/xml/CatalogHandler.java @@ -25,7 +25,6 @@ import static org.jclouds.vcloud.util.Utils.putReferenceType; import java.util.List; import java.util.Map; -import java.util.SortedMap; import javax.inject.Inject; @@ -56,7 +55,7 @@ public class CatalogHandler extends ParseSax.HandlerWithResult { private StringBuilder currentText = new StringBuilder(); private ReferenceType catalog; - private SortedMap contents = Maps.newTreeMap(); + private Map contents = Maps.newLinkedHashMap(); protected List tasks = Lists.newArrayList(); private String description; private ReferenceType org; 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 18c983fbee..65f5c4dfe3 100644 --- a/compute/src/main/java/org/jclouds/compute/reference/ComputeServiceConstants.java +++ b/compute/src/main/java/org/jclouds/compute/reference/ComputeServiceConstants.java @@ -58,7 +58,7 @@ public interface ComputeServiceConstants { 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\"}}"; + public String osVersionMapJson = "{\"centos\":{\"\":\"\",\"5\":\"5.0\",\"5.2\":\"5.2\",\"5.3\":\"5.3\",\"5.4\":\"5.4\",\"5.5\":\"5.5\"},\"rhel\":{\"\":\"\",\"5\":\"5.0\",\"5.2\":\"5.2\",\"5.3\":\"5.3\",\"5.4\":\"5.4\",\"5.5\":\"5.5\"},\"solaris\":{\"\":\"\",\"10\":\"10\"},\"ubuntu\":{\"\":\"\",\"hardy\":\"8.04\",\"karmic\":\"9.10\",\"lucid\":\"10.04\",\"maverick\":\"10.10\",\"natty\":\"11.04\"},\"windows\":{\"\":\"\",\"2003\":\"2003\",\"2003 Standard\":\"2003\",\"2003 R2\":\"2003 R2\",\"2008\":\"2008\",\"2008 Web\":\"2008\",\"2008 Server\":\"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 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 8c14032bb6..e0bcc661a2 100644 --- a/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java +++ b/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java @@ -201,7 +201,7 @@ public class ComputeServiceUtils { "node does not have IP addresses configured: " + node); } - public static String parseVersionOrReturnEmptyString(org.jclouds.compute.domain.OsFamily family, final String in, + public static String parseVersionOrReturnEmptyString(org.jclouds.compute.domain.OsFamily family, String in, Map> osVersionMap) { if (osVersionMap.containsKey(family)) { if (osVersionMap.get(family).containsKey(in)) diff --git a/providers/trmk-ecloud/pom.xml b/providers/trmk-ecloud/pom.xml index eef065ac0d..f3e4b855f5 100644 --- a/providers/trmk-ecloud/pom.xml +++ b/providers/trmk-ecloud/pom.xml @@ -36,7 +36,7 @@ https://services.enterprisecloud.terremark.com/api - 0.8b-ext2.6 + 0.8b-ext2.7 FIXME FIXME diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudClient.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudClient.java index a317c1921a..f8e1bf97f1 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudClient.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudClient.java @@ -44,6 +44,8 @@ public interface TerremarkECloudClient extends TerremarkVCloudClient { * * @param vDCId * @return + * @throws org.jclouds.rest.InsufficientResourcesException + * if there's no additional ips available */ PublicIpAddress activatePublicIpInVDC(URI vDCId); diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java index a6fc4a6514..fcac949205 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java @@ -36,10 +36,10 @@ public class TerremarkECloudPropertiesBuilder extends TerremarkVCloudPropertiesB @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_API_VERSION, "0.8b-ext2.6"); + properties.setProperty(PROPERTY_API_VERSION, "0.8b-ext2.7"); properties.setProperty(PROPERTY_ENDPOINT, "https://services.enterprisecloud.terremark.com/api"); properties.setProperty(PROPERTY_TERREMARK_EXTENSION_NAME, "eCloudExtensions"); - properties.setProperty(PROPERTY_TERREMARK_EXTENSION_VERSION, "2.6"); + properties.setProperty(PROPERTY_TERREMARK_EXTENSION_VERSION, "2.7"); // for some reason the centos template is very slow to deploy properties.setProperty(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED, 720l * 1000l + ""); return properties; diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkECloudComputeServiceContextModule.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkECloudComputeServiceContextModule.java index b3386085aa..25c5138557 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkECloudComputeServiceContextModule.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkECloudComputeServiceContextModule.java @@ -22,6 +22,8 @@ package org.jclouds.vcloud.terremark.compute.config; import static org.jclouds.compute.domain.OsFamily.CENTOS; import org.jclouds.compute.domain.TemplateBuilder; +import org.jclouds.vcloud.compute.functions.ParseOsFromVAppTemplateName; +import org.jclouds.vcloud.terremark.compute.functions.TerremarkECloudParseOsFromVAppTemplateName; import org.jclouds.vcloud.terremark.suppliers.InternetServiceAndPublicIpAddressSupplier; import org.jclouds.vcloud.terremark.suppliers.TerremarkECloudInternetServiceAndPublicIpAddressSupplier; @@ -32,6 +34,14 @@ import com.google.inject.Injector; */ public class TerremarkECloudComputeServiceContextModule extends TerremarkVCloudComputeServiceContextModule { + @Override + protected void configure() { + bind(InternetServiceAndPublicIpAddressSupplier.class).to( + TerremarkECloudInternetServiceAndPublicIpAddressSupplier.class); + bind(ParseOsFromVAppTemplateName.class).to(TerremarkECloudParseOsFromVAppTemplateName.class); + super.configure(); + } + // as of 6-nov-2010 only centos has ssh key injection in the images. // ssh key injection in ubuntu is targeted for dec-2010 or sooner @Override @@ -39,10 +49,4 @@ public class TerremarkECloudComputeServiceContextModule extends TerremarkVCloudC return template.osFamily(CENTOS).os64Bit(true); } - @Override - protected void configure() { - bind(InternetServiceAndPublicIpAddressSupplier.class).to( - TerremarkECloudInternetServiceAndPublicIpAddressSupplier.class); - super.configure(); - } } diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/suppliers/TerremarkECloudInternetServiceAndPublicIpAddressSupplier.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/suppliers/TerremarkECloudInternetServiceAndPublicIpAddressSupplier.java index 7154b57445..d19d6c6cd5 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/suppliers/TerremarkECloudInternetServiceAndPublicIpAddressSupplier.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/suppliers/TerremarkECloudInternetServiceAndPublicIpAddressSupplier.java @@ -31,14 +31,13 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.http.HttpResponseException; import org.jclouds.logging.Logger; +import org.jclouds.rest.InsufficientResourcesException; import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.terremark.TerremarkECloudClient; import org.jclouds.vcloud.terremark.domain.InternetService; import org.jclouds.vcloud.terremark.domain.Protocol; import org.jclouds.vcloud.terremark.domain.PublicIpAddress; -import org.jclouds.vcloud.terremark.suppliers.InternetServiceAndPublicIpAddressSupplier; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -64,28 +63,22 @@ public class TerremarkECloudInternetServiceAndPublicIpAddressSupplier implements public Entry getNewInternetServiceAndIp(VCloudExpressVApp vApp, int port, Protocol protocol) { logger.debug(">> creating InternetService in vDC %s:%s:%d", vApp.getVDC().getName(), protocol, port); - // http://support.theenterprisecloud.com/kb/default.asp?id=706&Lang=1&SID= - // response with a 500 error code means we should look for an existing public ip to - // use InternetService is = null; PublicIpAddress ip = null; try { ip = client.activatePublicIpInVDC(vApp.getVDC().getHref()); - } catch (HttpResponseException e) { - if (e.getResponse().getStatusCode() == 500) { - logger.warn(">> no more ip addresses available, looking for one to re-use"); - for (PublicIpAddress existingIp : client.getPublicIpsAssociatedWithVDC(vApp.getVDC().getHref())) { - Set services = client.getInternetServicesOnPublicIp(existingIp.getId()); - if (services.size() == 0) { - ip = existingIp; - break; - } + } catch (InsufficientResourcesException e) { + logger.warn(">> no more ip addresses available, looking for one to re-use"); + for (PublicIpAddress existingIp : client.getPublicIpsAssociatedWithVDC(vApp.getVDC().getHref())) { + Set services = client.getInternetServicesOnPublicIp(existingIp.getId()); + if (services.size() == 0) { + ip = existingIp; + break; } - if (ip == null) - throw e; - } else { - throw e; } + if (ip == null) + throw e; + } is = client.addInternetServiceToExistingIp(ip.getId(), vApp.getName() + "-" + port, protocol, port, withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp.getName(), vApp diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java index 09784f608b..72ced2e021 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java @@ -285,7 +285,7 @@ public class TerremarkECloudAsyncClientTest extends RestClientTestnametrueeggs", + "nametrueeggs", "application/vnd.tmrk.vCloud.nodeService+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, NodeHandler.class); @@ -399,7 +399,7 @@ public class TerremarkECloudAsyncClientTest extends RestClientTestnametrue", + "nametrue", "application/vnd.tmrk.vCloud.nodeService+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, NodeHandler.class); diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudClientLiveTestDisabled.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudClientLiveTestDisabled.java index 97c4051ec6..948926ad93 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudClientLiveTestDisabled.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudClientLiveTestDisabled.java @@ -21,34 +21,32 @@ package org.jclouds.vcloud.terremark; import static org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions.Builder.processorCount; -import java.net.URI; -import java.util.Map; import java.util.Map.Entry; import org.jclouds.domain.Credentials; import org.jclouds.net.IPSocket; import org.jclouds.ssh.SshClient; +import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.terremark.domain.InternetService; import org.jclouds.vcloud.terremark.domain.Protocol; import org.jclouds.vcloud.terremark.domain.PublicIpAddress; import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions; +import org.jclouds.vcloud.terremark.suppliers.TerremarkECloudInternetServiceAndPublicIpAddressSupplier; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; - /** * Tests behavior of {@code TerremarkVCloudClient} * * @author Adrian Cole */ -@Test(groups = "live", enabled = false, sequential = true) +@Test(groups = "live", enabled = true, sequential = true) public class TerremarkECloudClientLiveTestDisabled extends TerremarkClientLiveTest { @BeforeClass void setProvider() { this.provider = "trmk-ecloud"; this.itemName = "Ubuntu 8.04 LTS (x86)"; + expectedOs = "Ubuntu Linux (32-bit)"; } @Override @@ -62,13 +60,9 @@ public class TerremarkECloudClientLiveTestDisabled extends TerremarkClientLiveTe } @Override - protected Entry getNewInternetServiceAndIpForSSH(URI vdc) { - PublicIpAddress ip = TerremarkECloudClient.class.cast(tmClient).activatePublicIpInVDC( - tmClient.findVDCInOrgNamed(null, null).getHref()); - InternetService is = tmClient.addInternetServiceToExistingIp(ip.getId(), "SSH", Protocol.TCP, 22); - Map result = ImmutableMap. of(is, ip); - Entry entry = Iterables.getOnlyElement(result.entrySet()); - return entry; + protected Entry getNewInternetServiceAndIpForSSH(VCloudExpressVApp vApp) { + return new TerremarkECloudInternetServiceAndPublicIpAddressSupplier(TerremarkECloudClient.class.cast(tmClient)) + .getNewInternetServiceAndIp(vApp, 22, Protocol.TCP); } } diff --git a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClientLiveTest.java b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClientLiveTest.java index a01b730154..9901ecb592 100644 --- a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClientLiveTest.java +++ b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClientLiveTest.java @@ -23,8 +23,6 @@ import static org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTempl import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; -import java.net.URI; -import java.util.Map; import java.util.Set; import java.util.Map.Entry; import java.util.concurrent.ExecutionException; @@ -33,18 +31,17 @@ import java.util.concurrent.TimeoutException; import org.jclouds.domain.Credentials; import org.jclouds.net.IPSocket; import org.jclouds.ssh.SshClient; +import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.terremark.domain.InternetService; import org.jclouds.vcloud.terremark.domain.KeyPair; import org.jclouds.vcloud.terremark.domain.Protocol; import org.jclouds.vcloud.terremark.domain.PublicIpAddress; import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions; +import org.jclouds.vcloud.terremark.suppliers.TerremarkVCloudExpressInternetServiceAndPublicIpAddressSupplier; import org.testng.annotations.AfterTest; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; - /** * Tests behavior of {@code TerremarkVCloudClient} * @@ -53,16 +50,6 @@ import com.google.common.collect.Iterables; @Test(groups = "live", sequential = true) public class TerremarkVCloudExpressClientLiveTest extends TerremarkClientLiveTest { - @Override - protected Entry getNewInternetServiceAndIpForSSH(URI vdc) { - InternetService is = TerremarkVCloudExpressClient.class.cast(tmClient).addInternetServiceToVDC( - tmClient.findVDCInOrgNamed(null, null).getHref(), "SSH", Protocol.TCP, 22); - PublicIpAddress ip = is.getPublicIpAddress(); - Map result = ImmutableMap. of(is, ip); - Entry entry = Iterables.getOnlyElement(result.entrySet()); - return entry; - } - KeyPair key; @Test @@ -114,4 +101,10 @@ public class TerremarkVCloudExpressClientLiveTest extends TerremarkClientLiveTes protected TerremarkInstantiateVAppTemplateOptions createInstantiateOptions() { return processorCount(1).memory(512).sshKeyFingerprint(key.getFingerPrint()); } + + @Override + protected Entry getNewInternetServiceAndIpForSSH(VCloudExpressVApp vApp) { + return new TerremarkVCloudExpressInternetServiceAndPublicIpAddressSupplier(TerremarkVCloudExpressClient.class + .cast(tmClient)).getNewInternetServiceAndIp(vApp, 22, Protocol.TCP); + } } From d306dcbdeca1f8b748839c8f54b31980abdc7f42 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 29 Jan 2011 21:07:00 -0800 Subject: [PATCH 15/81] updated to parse ecloud images --- ...markECloudParseOsFromVAppTemplateName.java | 73 ++++++++ ...ECloudParseOsFromVAppTemplateNameTest.java | 169 ++++++++++++++++++ .../src/test/resources/catalog-ecloud.xml | 104 +++++++++++ 3 files changed, 346 insertions(+) create mode 100644 providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateName.java create mode 100644 providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateNameTest.java create mode 100755 providers/trmk-ecloud/src/test/resources/catalog-ecloud.xml diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateName.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateName.java new file mode 100644 index 0000000000..06cf7cf131 --- /dev/null +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateName.java @@ -0,0 +1,73 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.vcloud.terremark.compute.functions; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.util.ComputeServiceUtils.parseOsFamilyOrUnrecognized; + +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OperatingSystemBuilder; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.util.ComputeServiceUtils; +import org.jclouds.vcloud.compute.functions.ParseOsFromVAppTemplateName; + +/** + * @author Adrian Cole + */ +@Singleton +public class TerremarkECloudParseOsFromVAppTemplateName extends ParseOsFromVAppTemplateName { + // CentOS 5 (x64) + public static final Pattern OS_PATTERN = Pattern.compile("^-?([^ ]*) ([0-9.]+)( R[1-9])? ?.*"); + + @Inject + protected TerremarkECloudParseOsFromVAppTemplateName(Map> osVersionMap) { + super(osVersionMap); + } + + @Override + public OperatingSystem apply(String from) { + checkNotNull(from, "vapp template name"); + OperatingSystemBuilder builder = new OperatingSystemBuilder(); + builder.description(from); + if (from.equals("-Windows 2003 Std. R2 SQL 2005 Std. (x64)")) + System.out.print(';'); + builder.is64Bit(from.indexOf("64") != -1); + from = from.replace("Red Hat Enterprise Linux", "RHEL").replace("Sun Solaris", "SOLARIS").replace( + " Server", "").replace("Std. ", ""); + Matcher matcher = OS_PATTERN.matcher(from); + if (matcher.find()) { + OsFamily osFamily = parseOsFamilyOrUnrecognized(matcher.group(1)); + builder.family(osFamily); + String version = (matcher.group(3) != null) ? matcher.group(2) + matcher.group(3) : matcher.group(2); + builder.version(ComputeServiceUtils.parseVersionOrReturnEmptyString(osFamily, version, osVersionMap)); + } else { + OsFamily osFamily = parseOsFamilyOrUnrecognized(from); + builder.family(osFamily); + } + return builder.build(); + } +} \ No newline at end of file diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateNameTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateNameTest.java new file mode 100644 index 0000000000..e0d0bb3ef4 --- /dev/null +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateNameTest.java @@ -0,0 +1,169 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.vcloud.terremark.compute.functions; + +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; +import java.util.Map; +import java.util.Set; + +import org.jclouds.compute.domain.OperatingSystemBuilder; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ParseSax.Factory; +import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.json.Json; +import org.jclouds.json.config.GsonModule; +import org.jclouds.vcloud.xml.CatalogHandler; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.TypeLiteral; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "TerremarkECloudParseOsFromVAppTemplateNameTest") +public class TerremarkECloudParseOsFromVAppTemplateNameTest { + + public Set parseNames(String resource) { + InputStream is = getClass().getResourceAsStream(resource); + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + return factory.create(injector.getInstance(CatalogHandler.class)).parse(is).keySet(); + } + + public void test() { + + TerremarkECloudParseOsFromVAppTemplateName function = new TerremarkECloudParseOsFromVAppTemplateName(Guice + .createInjector(new GsonModule()).getInstance(Json.class).>> fromJson( + new ComputeServiceConstants.ReferenceData().osVersionMapJson, + new TypeLiteral>>() { + }.getType())); + Set names = parseNames("/catalog-ecloud.xml"); + assertEquals(Sets.newLinkedHashSet(Iterables.transform(names, function)), ImmutableSet.of( + + // CentOS 5 (x64) + new OperatingSystemBuilder().family(OsFamily.CENTOS).version("5.0").description("CentOS 5 (x64)") + .is64Bit(true).build(), + // CentOS 5 (x86) + new OperatingSystemBuilder().family(OsFamily.CENTOS).version("5.0").description("CentOS 5 (x86)") + .is64Bit(false).build(), + // CentOS 5.5 x32 + new OperatingSystemBuilder().family(OsFamily.CENTOS).version("5.5").description("CentOS 5.5 x32") + .is64Bit(false).build(), + // CentOS 5.5 x64 + new OperatingSystemBuilder().family(OsFamily.CENTOS).version("5.5").description("CentOS 5.5 x64") + .is64Bit(true).build(), + // Red Hat Enterprise Linux 5 (x64) + new OperatingSystemBuilder().family(OsFamily.RHEL).version("5.0").description( + "Red Hat Enterprise Linux 5 (x64)").is64Bit(true).build(), + // Red Hat Enterprise Linux 5 (x86) + new OperatingSystemBuilder().family(OsFamily.RHEL).version("5.0").description( + "Red Hat Enterprise Linux 5 (x86)").is64Bit(false).build(), + // Red Hat Enterprise Linux 5.5 x32 + new OperatingSystemBuilder().family(OsFamily.RHEL).version("5.5").description( + "Red Hat Enterprise Linux 5.5 x32").is64Bit(false).build(), + // Red Hat Enterprise Linux 5.5 x64 + new OperatingSystemBuilder().family(OsFamily.RHEL).version("5.5").description( + "Red Hat Enterprise Linux 5.5 x64").is64Bit(true).build(), + // Sun Solaris 10 (x64) + new OperatingSystemBuilder().family(OsFamily.SOLARIS).version("10").description("Sun Solaris 10 (x64)") + .is64Bit(true).build(), + // Ubuntu 8.04 LTS (x64) + new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("8.04") + .description("Ubuntu 8.04 LTS (x64)").is64Bit(true).build(), + // Ubuntu 8.04 LTS (x86) + new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("8.04") + .description("Ubuntu 8.04 LTS (x86)").is64Bit(false).build(), + // Ubuntu Server 10.04 x32 + new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("10.04").description( + "Ubuntu Server 10.04 x32").is64Bit(false).build(), + // Ubuntu Server 10.04 x64 + new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("10.04").description( + "Ubuntu Server 10.04 x64").is64Bit(true).build(), + // -Windows 2003 Std. R2 SQL 2005 Std. (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description( + "-Windows 2003 Std. R2 SQL 2005 Std. (x64)").is64Bit(true).build(), + // -Windows 2003 Std. R2 SQL 2008 Std. (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description( + "-Windows 2003 Std. R2 SQL 2008 Std. (x64)").is64Bit(true).build(), + // -Windows 2008 R2 Std wSQL 2008 R2 Std (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description( + "-Windows 2008 R2 Std wSQL 2008 R2 Std (x64)").is64Bit(true).build(), + // -Windows 2008 R2 Std wSQL 2008 R2 Web (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description( + "-Windows 2008 R2 Std wSQL 2008 R2 Web (x64)").is64Bit(true).build(), + // -Windows 2008 Std wSQL 2008 Std (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description( + "-Windows 2008 Std wSQL 2008 Std (x64)").is64Bit(true).build(), + // -Windows 2008 Std wSQL 2008 Web (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description( + "-Windows 2008 Std wSQL 2008 Web (x64)").is64Bit(true).build(), + // -Windows Server 2003 R2 Enterprise Edition (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description( + "-Windows Server 2003 R2 Enterprise Edition (x64)").is64Bit(true).build(), + // -Windows Server 2003 R2 Enterprise Edition (x86) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description( + "-Windows Server 2003 R2 Enterprise Edition (x86)").is64Bit(false).build(), + // -Windows Server 2003 R2 Standard Edition (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description( + "-Windows Server 2003 R2 Standard Edition (x64)").is64Bit(true).build(), + // -Windows Server 2003 R2 Standard Edition (x86) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description( + "-Windows Server 2003 R2 Standard Edition (x86)").is64Bit(false).build(), + // -Windows Server 2008 Enterprise Edition (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description( + "-Windows Server 2008 Enterprise Edition (x64)").is64Bit(true).build(), + // -Windows Server 2008 Enterprise Edition (x86) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description( + "-Windows Server 2008 Enterprise Edition (x86)").is64Bit(false).build(), + // -Windows Server 2008 R2 Enterprise Edition (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description( + "-Windows Server 2008 R2 Enterprise Edition (x64)").is64Bit(true).build(), + // -Windows Server 2008 R2 Standard Edition (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description( + "-Windows Server 2008 R2 Standard Edition (x64)").is64Bit(true).build(), + // -Windows Server 2008 R2 Web Edition (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description( + "-Windows Server 2008 R2 Web Edition (x64)").is64Bit(true).build(), + // -Windows Server 2008 Standard Edition (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description( + "-Windows Server 2008 Standard Edition (x64)").is64Bit(true).build(), + // -Windows Server 2008 Standard Edition (x86) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description( + "-Windows Server 2008 Standard Edition (x86)").is64Bit(false).build(), + // -Windows Server 2008 Web Edition (x64) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description( + "-Windows Server 2008 Web Edition (x64)").is64Bit(true).build(), + // -Windows Server 2008 Web Edition (x86) + new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description( + "-Windows Server 2008 Web Edition (x86)").is64Bit(false).build() + + )); + + } +} diff --git a/providers/trmk-ecloud/src/test/resources/catalog-ecloud.xml b/providers/trmk-ecloud/src/test/resources/catalog-ecloud.xml new file mode 100755 index 0000000000..8f8adbf5d7 --- /dev/null +++ b/providers/trmk-ecloud/src/test/resources/catalog-ecloud.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 7fd6cb3673276dd503518db8150ec8aa34cf22c1 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 30 Jan 2011 00:32:15 -0800 Subject: [PATCH 16/81] fixed tokenizing of copy and put object options for non-aws s3 clients --- .../jclouds/s3/options/CopyObjectOptions.java | 2 +- .../jclouds/s3/options/PutObjectOptions.java | 2 +- .../java/org/jclouds/s3/S3ClientLiveTest.java | 26 +++++-- .../jclouds/walrus/WalrusClientLiveTest.java | 23 +++++++ ...loudEucalyptusTemplateBuilderLiveTest.java | 3 +- .../GoogleStorageAsyncClient.java | 69 +++++++++++++++++++ .../config/GoogleStorageRestClientModule.java | 15 +++- 7 files changed, 128 insertions(+), 12 deletions(-) create mode 100644 providers/googlestorage/src/main/java/org/jclouds/googlestorage/GoogleStorageAsyncClient.java diff --git a/apis/s3/src/main/java/org/jclouds/s3/options/CopyObjectOptions.java b/apis/s3/src/main/java/org/jclouds/s3/options/CopyObjectOptions.java index 5b3bb5606c..349b092ecb 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/options/CopyObjectOptions.java +++ b/apis/s3/src/main/java/org/jclouds/s3/options/CopyObjectOptions.java @@ -262,7 +262,7 @@ public class CopyObjectOptions extends BaseHttpRequestOptions { checkState(metadataPrefix != null, "metadataPrefix should have been injected!"); Multimap returnVal = LinkedHashMultimap.create(); for (Entry entry : headers.entries()) { - returnVal.put(entry.getKey().replace("aws", headerTag), entry.getValue()); + returnVal.put(entry.getKey().replace("amz", headerTag), entry.getValue()); } if (metadata != null) { for (String key : metadata.keySet()) { diff --git a/apis/s3/src/main/java/org/jclouds/s3/options/PutObjectOptions.java b/apis/s3/src/main/java/org/jclouds/s3/options/PutObjectOptions.java index adbbf7d777..e78396b74e 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/options/PutObjectOptions.java +++ b/apis/s3/src/main/java/org/jclouds/s3/options/PutObjectOptions.java @@ -73,7 +73,7 @@ public class PutObjectOptions extends BaseHttpRequestOptions { checkState(headerTag != null, "headerTag should have been injected!"); Multimap returnVal = LinkedHashMultimap.create(); for (Entry entry : headers.entries()) { - returnVal.put(entry.getKey().replace("aws", headerTag), entry.getValue()); + returnVal.put(entry.getKey().replace("amz", headerTag), entry.getValue()); } return returnVal; } diff --git a/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java b/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java index 8bedba9ad3..f5a51cf783 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java @@ -86,6 +86,12 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest { } } + protected URL getObjectURL(String containerName, String key) throws Exception { + URL url = new URL(String.format("http://%s.%s/%s", containerName, context.getProviderSpecificContext() + .getEndpoint().getHost(), key)); + return url; + } + public void testPutCannedAccessPolicyPublic() throws Exception { String containerName = getContainerName(); try { @@ -97,7 +103,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest { withAcl(CannedAccessPolicy.PUBLIC_READ)); - URL url = new URL(String.format("http://%1$s.s3.amazonaws.com/%2$s", containerName, key)); + URL url = this.getObjectURL(containerName, key); Strings2.toStringAndClose(url.openStream()); } finally { returnContainer(containerName); @@ -117,7 +123,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest { validateContent(destinationContainer, destinationKey); - URL url = new URL(String.format("http://%1$s.s3.amazonaws.com/%2$s", destinationContainer, destinationKey)); + URL url = getObjectURL(destinationContainer, destinationKey); Strings2.toStringAndClose(url.openStream()); } finally { @@ -292,9 +298,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest { getApi().putObject(containerName, object); S3Object newObject = validateObject(containerName, key); - - assert (newObject.getMetadata().getCacheControl().indexOf("no-cache") != -1) : newObject.getMetadata() - .getCacheControl(); + assertCacheControl(newObject, "no-cache"); assertEquals(newObject.getMetadata().getContentMetadata().getContentDisposition(), "attachment; filename=hello.txt"); } finally { @@ -302,6 +306,15 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest { } } + protected void assertCacheControl(S3Object newObject, String string) { + assert (newObject.getMetadata().getCacheControl().indexOf(string) != -1) : newObject.getMetadata() + .getCacheControl(); + } + + protected void assertContentEncoding(S3Object newObject, String string) { + assertEquals(newObject.getMetadata().getContentMetadata().getContentEncoding(), string); + } + @Test(groups = { "integration", "live" }) public void testMetadataContentEncoding() throws Exception { String key = "hello"; @@ -314,8 +327,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest { try { getApi().putObject(containerName, object); S3Object newObject = validateObject(containerName, key); - - assertEquals(newObject.getMetadata().getContentMetadata().getContentEncoding(), "x-compress"); + assertContentEncoding(newObject, "x-compress"); } finally { returnContainer(containerName); } diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/WalrusClientLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/WalrusClientLiveTest.java index f6a5b4cf2e..473dec6d7c 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/WalrusClientLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/WalrusClientLiveTest.java @@ -19,7 +19,12 @@ package org.jclouds.walrus; +import static org.testng.Assert.assertEquals; + +import java.net.URL; + import org.jclouds.s3.S3ClientLiveTest; +import org.jclouds.s3.domain.S3Object; import org.testng.annotations.Test; /** @@ -29,5 +34,23 @@ import org.testng.annotations.Test; */ @Test(groups = "live", sequential = true, testName = "WalrusClientLiveTest") public class WalrusClientLiveTest extends S3ClientLiveTest { + // path based, not virtual host + @Override + protected URL getObjectURL(String containerName, String key) throws Exception { + URL url = new URL(String.format(context.getProviderSpecificContext().getEndpoint().toASCIIString() + + "/services/Walrus/%s/%s", containerName, key)); + return url; + } + // no support for content encoding + @Override + protected void assertContentEncoding(S3Object newObject, String string) { + assertEquals(newObject.getMetadata().getContentMetadata().getContentEncoding(), null); + } + + // no support for cache control + @Override + protected void assertCacheControl(S3Object newObject, String string) { + assertEquals(newObject.getMetadata().getCacheControl(), null); + } } diff --git a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java index ff01e37790..e8e4540dfe 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java +++ b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java @@ -54,7 +54,8 @@ public class EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest extends Bas return !(input.version.equals("") && input.is64Bit) && !(input.version.equals("5.3") && input.is64Bit); case WINDOWS: - return !(input.version.equals("") && input.is64Bit); + return !(input.version.equals("") && input.is64Bit) + && !(input.version.equals("2008") && input.is64Bit); default: return true; } diff --git a/providers/googlestorage/src/main/java/org/jclouds/googlestorage/GoogleStorageAsyncClient.java b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/GoogleStorageAsyncClient.java new file mode 100644 index 0000000000..8e41061a1e --- /dev/null +++ b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/GoogleStorageAsyncClient.java @@ -0,0 +1,69 @@ +/** + * + * 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.googlestorage; + +import static org.jclouds.blobstore.attr.BlobScopes.CONTAINER; + +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +import org.jclouds.blobstore.attr.BlobScope; +import org.jclouds.rest.annotations.BinderParam; +import org.jclouds.rest.annotations.Headers; +import org.jclouds.rest.annotations.ParamValidators; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.SkipEncoding; +import org.jclouds.rest.annotations.XMLResponseParser; +import org.jclouds.s3.Bucket; +import org.jclouds.s3.S3AsyncClient; +import org.jclouds.s3.S3Client; +import org.jclouds.s3.binders.BindAsHostPrefixIfConfigured; +import org.jclouds.s3.domain.ObjectMetadata; +import org.jclouds.s3.filters.RequestAuthorizeSignature; +import org.jclouds.s3.options.CopyObjectOptions; +import org.jclouds.s3.predicates.validators.BucketNameValidator; +import org.jclouds.s3.xml.CopyObjectHandler; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * + * @author Adrian Cole + */ +@SkipEncoding('/') +@RequestFilters(RequestAuthorizeSignature.class) +@BlobScope(CONTAINER) +public interface GoogleStorageAsyncClient extends S3AsyncClient { + /** + * @see S3Client#copyObject + */ + @Override + @PUT + @Path("/{destinationObject}") + @Headers(keys = "x-goog-copy-source", values = "/{sourceBucket}/{sourceObject}") + @XMLResponseParser(CopyObjectHandler.class) + ListenableFuture copyObject( + @PathParam("sourceBucket") String sourceBucket, + @PathParam("sourceObject") String sourceObject, + @Bucket @BinderParam(BindAsHostPrefixIfConfigured.class) @ParamValidators( { BucketNameValidator.class }) String destinationBucket, + @PathParam("destinationObject") String destinationObject, CopyObjectOptions... options); + +} diff --git a/providers/googlestorage/src/main/java/org/jclouds/googlestorage/config/GoogleStorageRestClientModule.java b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/config/GoogleStorageRestClientModule.java index 13ab516d5d..cdaebeb2bf 100644 --- a/providers/googlestorage/src/main/java/org/jclouds/googlestorage/config/GoogleStorageRestClientModule.java +++ b/providers/googlestorage/src/main/java/org/jclouds/googlestorage/config/GoogleStorageRestClientModule.java @@ -1,5 +1,8 @@ package org.jclouds.googlestorage.config; +import javax.inject.Singleton; + +import org.jclouds.googlestorage.GoogleStorageAsyncClient; import org.jclouds.googlestorage.binders.BindGoogleStorageObjectMetadataToRequest; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; @@ -8,16 +11,18 @@ import org.jclouds.s3.S3Client; import org.jclouds.s3.binders.BindS3ObjectMetadataToRequest; import org.jclouds.s3.config.S3RestClientModule; +import com.google.inject.Provides; + /** * * @author Adrian Cole */ @ConfiguresRestClient @RequiresHttp -public class GoogleStorageRestClientModule extends S3RestClientModule { +public class GoogleStorageRestClientModule extends S3RestClientModule { public GoogleStorageRestClientModule() { - super(S3Client.class, S3AsyncClient.class); + super(S3Client.class, GoogleStorageAsyncClient.class); } @Override @@ -26,4 +31,10 @@ public class GoogleStorageRestClientModule extends S3RestClientModule Date: Sun, 30 Jan 2011 00:55:33 -0800 Subject: [PATCH 17/81] walrus doesn't support range requests, content encoding or language --- .../WalrusBlobIntegrationLiveTest.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobIntegrationLiveTest.java b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobIntegrationLiveTest.java index f0aabbf0fc..291124de11 100644 --- a/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobIntegrationLiveTest.java +++ b/apis/walrus/src/test/java/org/jclouds/walrus/blobstore/WalrusBlobIntegrationLiveTest.java @@ -19,14 +19,42 @@ package org.jclouds.walrus.blobstore; +import java.io.IOException; + +import org.jclouds.blobstore.domain.Blob; import org.jclouds.s3.blobstore.integration.S3BlobIntegrationLiveTest; import org.testng.annotations.Test; /** * @author Adrian Cole */ -@Test(groups = "live", testName = "WalrusBlobIntegrationLiveTest") +@Test(groups = "live", testName = "WalrusBlobIntegrationLiveTest") public class WalrusBlobIntegrationLiveTest extends S3BlobIntegrationLiveTest { + // no support for content encoding + @Override + protected void checkContentEncoding(Blob blob, String contentEncoding) { + assert blob.getPayload().getContentMetadata().getContentEncoding() == null; + assert blob.getMetadata().getContentMetadata().getContentEncoding() == null; + } + // no support for content language + @Override + protected void checkContentLanguage(Blob blob, String contentLanguage) { + assert blob.getPayload().getContentMetadata().getContentLanguage() == null; + assert blob.getMetadata().getContentMetadata().getContentLanguage() == null; + } + + // double range not supported + @Test(groups = { "integration", "live" }) + @Override + public void testGetTwoRanges() throws InterruptedException, IOException { + + } + + // range not supported + @Test(groups = { "integration", "live" }) + @Override + public void testGetRange() throws InterruptedException, IOException { + } } From b62a6309bec7c6b3a04feb00441cea3cc9b34ea9 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 30 Jan 2011 02:32:00 -0800 Subject: [PATCH 18/81] workaround to walrus not having NextMarker in bucket listing --- .../internal/ListBucketResponseImpl.java | 10 ++++------ .../org/jclouds/s3/xml/ListBucketHandler.java | 5 +++-- ...rseObjectInfoListFromJsonResponseTest.java | 2 +- .../domain/internal/PageSetImpl.java | 4 ++-- .../BaseContainerIntegrationTest.java | 19 ++++++++++++++++++- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/apis/s3/src/main/java/org/jclouds/s3/domain/internal/ListBucketResponseImpl.java b/apis/s3/src/main/java/org/jclouds/s3/domain/internal/ListBucketResponseImpl.java index fc301db1f0..3cac79fc34 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/domain/internal/ListBucketResponseImpl.java +++ b/apis/s3/src/main/java/org/jclouds/s3/domain/internal/ListBucketResponseImpl.java @@ -19,7 +19,7 @@ package org.jclouds.s3.domain.internal; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; import org.jclouds.s3.domain.ListBucketResponse; @@ -32,8 +32,7 @@ import com.google.common.collect.Iterables; * @author Adrian Cole * */ -public class ListBucketResponseImpl extends HashSet implements - ListBucketResponse { +public class ListBucketResponseImpl extends LinkedHashSet implements ListBucketResponse { /** The serialVersionUID */ private static final long serialVersionUID = -4475709781001190244L; protected final String name; @@ -45,9 +44,8 @@ public class ListBucketResponseImpl extends HashSet implements protected final Set commonPrefixes; protected final boolean truncated; - public ListBucketResponseImpl(String name, Iterable contents, String prefix, - String marker, String nextMarker, int maxKeys, String delimiter, boolean isTruncated, - Set commonPrefixes) { + public ListBucketResponseImpl(String name, Iterable contents, String prefix, String marker, + String nextMarker, int maxKeys, String delimiter, boolean isTruncated, Set commonPrefixes) { Iterables.addAll(this, contents); this.name = name; this.prefix = prefix; diff --git a/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java b/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java index 5979fa392c..0c3d322868 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java +++ b/apis/s3/src/main/java/org/jclouds/s3/xml/ListBucketHandler.java @@ -71,8 +71,9 @@ public class ListBucketHandler extends ParseSax.HandlerWithResult expects = Sets.newHashSet(); + Set expects = Sets.newLinkedHashSet(); ObjectInfoImpl one = i.getInstance(ObjectInfoImpl.class); one.name = "test_obj_1"; one.hash = CryptoStreams.hex("4281c348eaf83e70ddce0e07221c3d28"); diff --git a/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/PageSetImpl.java b/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/PageSetImpl.java index 1297a00715..413b62bed5 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/PageSetImpl.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/PageSetImpl.java @@ -19,7 +19,7 @@ package org.jclouds.blobstore.domain.internal; -import java.util.HashSet; +import java.util.LinkedHashSet; import javax.annotation.Nullable; @@ -27,7 +27,7 @@ import org.jclouds.blobstore.domain.PageSet; import com.google.common.collect.Iterables; -public class PageSetImpl extends HashSet implements PageSet { +public class PageSetImpl extends LinkedHashSet implements PageSet { /** The serialVersionUID */ private static final long serialVersionUID = -7133632087734650835L; diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java index b4d1321ceb..4d0dcfccc8 100755 --- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java +++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseContainerIntegrationTest.java @@ -93,7 +93,8 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest { BlobMetadata metadata = BlobMetadata.class.cast(get(container, 0)); - assert metadata.getContentMetadata().getContentType().startsWith("text/plain") : metadata.getContentMetadata().getContentType(); + assert metadata.getContentMetadata().getContentType().startsWith("text/plain") : metadata.getContentMetadata() + .getContentType(); assertEquals(metadata.getContentMetadata().getContentLength(), new Long(TEST_STRING.length())); assertEquals(metadata.getUserMetadata().get("adrian"), "powderpuff"); checkMD5(metadata); @@ -123,6 +124,7 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest { String containerName = getContainerName(); try { addAlphabetUnderRoot(containerName); + PageSet container = context.getBlobStore().list(containerName, maxResults(1)); assert container.getNextMarker() != null; @@ -255,6 +257,7 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest { String containerName = getContainerName(); try { addAlphabetUnderRoot(containerName); + PageSet container = context.getBlobStore().list(containerName, maxResults(5)); assertEquals(container.size(), 5); assert container.getNextMarker() != null; @@ -330,6 +333,20 @@ public class BaseContainerIntegrationTest extends BaseBlobStoreIntegrationTest { blob.setPayload(letter + "content"); context.getBlobStore().putBlob(containerName, blob); } + assertContainerSize(containerName, 26); + + } + + protected void assertContainerSize(final String containerName, final int size) throws InterruptedException { + assertConsistencyAware(new Runnable() { + public void run() { + try { + assertEquals(context.getBlobStore().countBlobs(containerName), size); + } catch (Exception e) { + propagateIfPossible(e); + } + } + }); } protected void add15UnderRoot(String containerName) throws InterruptedException { From 3263d22bfcaacce1a34d497f872b540214c0075f Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 30 Jan 2011 13:41:21 -0800 Subject: [PATCH 19/81] renamed properties builder for aws-elb --- core/src/main/resources/rest.properties | 2 +- ...PropertiesBuilder.java => AWSELBPropertiesBuilder.java} | 7 ++++--- .../java/org/jclouds/aws/elb/AWSELBClientLiveTest.java | 6 +++--- .../test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) rename providers/aws-elb/src/main/java/org/jclouds/aws/elb/{ELBPropertiesBuilder.java => AWSELBPropertiesBuilder.java} (93%) diff --git a/core/src/main/resources/rest.properties b/core/src/main/resources/rest.properties index e78b61cffd..10edf17aad 100644 --- a/core/src/main/resources/rest.properties +++ b/core/src/main/resources/rest.properties @@ -48,7 +48,7 @@ elb.contextbuilder=org.jclouds.elb.ELBContextBuilder elb.propertiesbuilder=org.jclouds.elb.ELBPropertiesBuilder aws-elb.contextbuilder=org.jclouds.elb.ELBContextBuilder -aws-elb.propertiesbuilder=org.jclouds.aws.elb.ELBPropertiesBuilder +aws-elb.propertiesbuilder=org.jclouds.aws.elb.AWSELBPropertiesBuilder cloudwatch.contextbuilder=org.jclouds.cloudwatch.CloudWatchContextBuilder cloudwatch.propertiesbuilder=org.jclouds.cloudwatch.CloudWatchPropertiesBuilder diff --git a/providers/aws-elb/src/main/java/org/jclouds/aws/elb/ELBPropertiesBuilder.java b/providers/aws-elb/src/main/java/org/jclouds/aws/elb/AWSELBPropertiesBuilder.java similarity index 93% rename from providers/aws-elb/src/main/java/org/jclouds/aws/elb/ELBPropertiesBuilder.java rename to providers/aws-elb/src/main/java/org/jclouds/aws/elb/AWSELBPropertiesBuilder.java index 47bf2c04af..8a2c2c0c88 100644 --- a/providers/aws-elb/src/main/java/org/jclouds/aws/elb/ELBPropertiesBuilder.java +++ b/providers/aws-elb/src/main/java/org/jclouds/aws/elb/AWSELBPropertiesBuilder.java @@ -35,6 +35,7 @@ import java.util.Set; import org.jclouds.aws.domain.Region; import org.jclouds.elb.ELBAsyncClient; +import org.jclouds.elb.ELBPropertiesBuilder; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableSet; @@ -44,7 +45,7 @@ import com.google.common.collect.ImmutableSet; * * @author Adrian Cole */ -public class ELBPropertiesBuilder extends org.jclouds.elb.ELBPropertiesBuilder { +public class AWSELBPropertiesBuilder extends ELBPropertiesBuilder { public static Set DEFAULT_REGIONS = ImmutableSet.of(EU_WEST_1, US_EAST_1, US_WEST_1, AP_SOUTHEAST_1); @Override @@ -66,11 +67,11 @@ public class ELBPropertiesBuilder extends org.jclouds.elb.ELBPropertiesBuilder { return properties; } - public ELBPropertiesBuilder() { + public AWSELBPropertiesBuilder() { super(); } - public ELBPropertiesBuilder(Properties properties) { + public AWSELBPropertiesBuilder(Properties properties) { super(properties); } diff --git a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java b/providers/aws-elb/src/test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java index db714aa936..1fd4ffebd8 100644 --- a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java +++ b/providers/aws-elb/src/test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java @@ -35,21 +35,21 @@ public class AWSELBClientLiveTest extends ELBClientLiveTest { @Test public void testCreateLoadBalancer() { - for (String region : ELBPropertiesBuilder.DEFAULT_REGIONS) { + for (String region : AWSELBPropertiesBuilder.DEFAULT_REGIONS) { createLoadBalancerInRegionZone(region, region + "a", name); } } @Test(dependsOnMethods = "testCreateLoadBalancer") public void testDescribeLoadBalancers() { - for (String region : ELBPropertiesBuilder.DEFAULT_REGIONS) { + for (String region : AWSELBPropertiesBuilder.DEFAULT_REGIONS) { describeLoadBalancerInRegion(region); } } @Test public void testDeleteLoadBalancer() { - for (String region : ELBPropertiesBuilder.DEFAULT_REGIONS) { + for (String region : AWSELBPropertiesBuilder.DEFAULT_REGIONS) { deleteLoadBalancerInRegion(region); } } diff --git a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java b/providers/aws-elb/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java index f015b30d35..f2732b4857 100644 --- a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java +++ b/providers/aws-elb/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java @@ -19,7 +19,7 @@ package org.jclouds.aws.elb; -import static org.jclouds.aws.elb.ELBPropertiesBuilder.DEFAULT_REGIONS; +import static org.jclouds.aws.elb.AWSELBPropertiesBuilder.DEFAULT_REGIONS; import java.io.IOException; import java.lang.reflect.Method; From 19d7f32eeaf907ef389fc366d50882aae16d407c Mon Sep 17 00:00:00 2001 From: Lili Nader Date: Sun, 30 Jan 2011 17:54:33 -0800 Subject: [PATCH 20/81] Live tests for BlockDeviceMapping at instance creation time --- .../compute/EC2ComputeServiceLiveTest.java | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceLiveTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceLiveTest.java index 94959534b5..fb17edaca1 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceLiveTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceLiveTest.java @@ -21,7 +21,10 @@ package org.jclouds.ec2.compute; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.assertNotNull; +import java.util.Map; import java.util.Set; import org.jclouds.compute.BaseComputeServiceLiveTest; @@ -33,10 +36,15 @@ import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.domain.Credentials; import org.jclouds.ec2.EC2Client; import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.ec2.domain.AvailabilityZone; +import org.jclouds.ec2.domain.BlockDevice; import org.jclouds.ec2.domain.IpProtocol; import org.jclouds.ec2.domain.KeyPair; import org.jclouds.ec2.domain.RunningInstance; import org.jclouds.ec2.domain.SecurityGroup; +import org.jclouds.ec2.domain.Snapshot; +import org.jclouds.ec2.domain.Volume; +import org.jclouds.ec2.services.ElasticBlockStoreClient; import org.jclouds.ec2.services.InstanceClient; import org.jclouds.ec2.services.KeyPairClient; import org.jclouds.ec2.services.SecurityGroupClient; @@ -204,6 +212,181 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest { cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); } } + + @Test(enabled = true) + public void testMapNewVolumeToDeviceName() throws Exception { + SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getSecurityGroupServices(); + + KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getKeyPairServices(); + + InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getInstanceServices(); + + String tag = this.tag + "BDM1"; + int volumeSize = 120; + TemplateOptions options = client.templateOptions(); + + options.as(EC2TemplateOptions.class).securityGroups(tag); + options.as(EC2TemplateOptions.class).noKeyPair(); + options.as(EC2TemplateOptions.class).mapNewVolumeToDeviceName("/dev/sda1", volumeSize, true); + + String startedId = null; + try { + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + + // create the security group + securityGroupClient.createSecurityGroupInRegion(null, tag, tag); + + Set nodes = client.runNodesWithTag(tag, 1, options); + Credentials creds = nodes.iterator().next().getCredentials(); + assert creds == null; + + NodeMetadata node = nodes.iterator().next(); + startedId = node.getId(); + + Map devices = instanceClient + .getBlockDeviceMappingForInstanceInRegion(node.getLocation() + .getParent().getId(), node.getProviderId()); + + BlockDevice device = devices.get("/dev/sda1"); + //check delete on termination + assertTrue(device.isDeleteOnTermination()); + ElasticBlockStoreClient ebsClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getElasticBlockStoreServices(); + + Set volumes = ebsClient.describeVolumesInRegion(node + .getLocation().getParent().getId(), device.getVolumeId()); + // check volume size + assertEquals(volumeSize, volumes.iterator().next().getSize()); + + } finally { + client.destroyNodesMatching(NodePredicates.withTag(tag)); + if (startedId != null) { + // ensure we didn't delete these resources! + assertEquals(securityGroupClient.describeSecurityGroupsInRegion(null, tag).size(), 1); + } + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + } + } + + @Test(enabled = true) + public void testMapEBSSnapshotToDeviceName() throws Exception { + SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getSecurityGroupServices(); + + KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getKeyPairServices(); + + InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getInstanceServices(); + + ElasticBlockStoreClient ebsClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getElasticBlockStoreServices(); + //create snapshot + Volume volume = ebsClient.createVolumeInAvailabilityZone(AvailabilityZone.US_EAST_1A, 4); + Snapshot snapshot = ebsClient.createSnapshotInRegion(volume.getRegion(), volume.getId()); + + String tag = this.tag + "BDM2"; + int volumeSize = 120; + TemplateOptions options = client.templateOptions(); + + options.as(EC2TemplateOptions.class).securityGroups(tag); + options.as(EC2TemplateOptions.class).noKeyPair(); + options.as(EC2TemplateOptions.class).mapEBSSnapshotToDeviceName("/dev/sda1", snapshot.getId(), 120, true); + + String startedId = null; + try { + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + + // create the security group + securityGroupClient.createSecurityGroupInRegion(null, tag, tag); + + Set nodes = client.runNodesWithTag(tag, 1, options); + Credentials creds = nodes.iterator().next().getCredentials(); + assert creds == null; + + NodeMetadata node = nodes.iterator().next(); + + Map devices = instanceClient + .getBlockDeviceMappingForInstanceInRegion(node.getLocation() + .getParent().getId(), node.getProviderId()); + + BlockDevice device = devices.get("/dev/sda1"); + //check delete on termination + assertTrue(device.isDeleteOnTermination()); + + Set volumes = ebsClient.describeVolumesInRegion(node + .getLocation().getParent().getId(), device.getVolumeId()); + // check volume size + assertEquals(volumeSize, volumes.iterator().next().getSize()); + //check volume's snapshot id + assertEquals(snapshot.getId(), volumes.iterator().next().getSnapshotId()); + + + } finally { + client.destroyNodesMatching(NodePredicates.withTag(tag)); + ebsClient.deleteSnapshotInRegion(snapshot.getRegion(), snapshot.getId()); + ebsClient.deleteVolumeInRegion(volume.getRegion(), volume.getId()); + if (startedId != null) { + // ensure we didn't delete these resources! + assertEquals(securityGroupClient.describeSecurityGroupsInRegion(null, tag).size(), 1); + } + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + } + } + + @Test(enabled = true) + public void testMapEphemeralDeviceToDeviceName() throws Exception { + SecurityGroupClient securityGroupClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getSecurityGroupServices(); + + KeyPairClient keyPairClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getKeyPairServices(); + + InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) + .getInstanceServices(); + + String tag = this.tag + "BDM3"; + + TemplateOptions options = client.templateOptions(); + + options.as(EC2TemplateOptions.class).securityGroups(tag); + options.as(EC2TemplateOptions.class).noKeyPair(); + options.as(EC2TemplateOptions.class).mapEphemeralDeviceToDeviceName("/dev/sdh", "ephemeral0"); + + String startedId = null; + try { + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + + // create the security group + securityGroupClient.createSecurityGroupInRegion(null, tag, tag); + + Set nodes = client.runNodesWithTag(tag, 1, options); + Credentials creds = nodes.iterator().next().getCredentials(); + assert creds == null; + + NodeMetadata node = nodes.iterator().next(); + startedId = node.getId(); + + Map devices = instanceClient + .getBlockDeviceMappingForInstanceInRegion(node.getLocation() + .getParent().getId(), node.getProviderId()); + + BlockDevice device = devices.get("/dev/sdh"); + assertNotNull(device); + + } finally { + client.destroyNodesMatching(NodePredicates.withTag(tag)); + if (startedId != null) { + // ensure we didn't delete these resources! + assertEquals(securityGroupClient.describeSecurityGroupsInRegion(null, tag).size(), 1); + } + cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + } + } + protected RunningInstance getInstance(InstanceClient instanceClient, String id) { RunningInstance instance = Iterables.getOnlyElement(Iterables.getOnlyElement(instanceClient From 675563c96a6777f7b246835aa3b8cb1eac60fa19 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 31 Jan 2011 01:00:20 -0800 Subject: [PATCH 21/81] Issue 418: updated location object to include metadata and iso3166codes --- .../config/AtmosBlobStoreContextModule.java | 34 +- .../CloudFilesPropertiesBuilder.java | 47 -- ...oudServersBindComputeSuppliersByClass.java | 8 +- ...rversComputeServiceDependenciesModule.java | 5 - .../functions/ServerToNodeMetadata.java | 11 +- .../functions/FlavorToHardwareTest.java | 22 +- .../functions/ServerToNodeMetadataTest.java | 37 +- .../ec2/compute/functions/EC2ImageParser.java | 6 +- .../ec2/config/EC2RestClientModule.java | 26 +- .../ec2/compute/EC2TemplateBuilderTest.java | 5 +- .../compute/functions/EC2ImageParserTest.java | 5 +- .../RunningInstanceToNodeMetadataTest.java | 35 +- .../internal/EC2TemplateBuilderImplTest.java | 12 +- .../EC2RunNodesAndAddToSetStrategyTest.java | 12 +- .../ElasticStackComputeServiceAdapter.java | 19 +- ...asticStackComputeServiceContextModule.java | 4 + .../BindServerToPlainTextStringTest.java | 2 - .../FilesystemBlobStoreContextModule.java | 25 +- .../config/S3BlobStoreContextModule.java | 45 +- .../s3/functions/BindRegionToXmlPayload.java | 14 +- .../org/jclouds/s3/S3AsyncClientTest.java | 21 +- .../s3/internal/StubS3AsyncClient.java | 31 +- .../config/SwiftBlobStoreContextModule.java | 26 +- .../TransientBlobStoreContextModule.java | 24 +- .../internal/BaseServiceIntegrationTest.java | 24 +- .../aws/config/AWSRestClientModule.java | 6 +- .../jclouds/aws/filters/FormSignerTest.java | 2 +- .../SharedKeyLiteAuthenticationTest.java | 5 +- .../OpenStackAuthAsyncClientTest.java | 4 +- ...mmonVCloudComputeServiceContextModule.java | 15 +- .../OrgAndVDCToLocationSupplier.java | 57 ++- .../vcloud/VCloudLoginAsyncClientTest.java | 9 +- .../vcloud/VCloudVersionsAsyncClientTest.java | 5 +- .../src/main/clojure/org/jclouds/modules.clj | 2 +- .../StandaloneComputeServiceContextSpec.java | 33 +- .../BaseComputeServiceContextModule.java | 44 +- .../ComputeServiceAdapterContextModule.java | 59 +-- .../compute/domain/TemplateBuilder.java | 1 + .../domain/internal/TemplateBuilderImpl.java | 28 +- .../config/StubComputeServiceAdapter.java | 39 +- .../StubComputeServiceContextModule.java | 8 +- .../compute/BaseTemplateBuilderLiveTest.java | 49 +++ .../ComputeServiceContextFactoryTest.java | 6 +- .../StubTemplateBuilderIntegrationTest.java | 9 + core/src/main/java/org/jclouds/Constants.java | 13 + .../java/org/jclouds/PropertiesBuilder.java | 8 + .../collect/TransformingSetSupplier.java | 4 +- .../java/org/jclouds/domain/Location.java | 19 +- .../org/jclouds/domain/LocationBuilder.java | 77 ++++ .../jclouds/domain/internal/LocationImpl.java | 61 ++- .../java/org/jclouds/location/Iso3166.java | 30 +- .../config/JustProviderLocationModule.java | 40 +- .../location/config/LocationModule.java | 96 +++++ ...Iso3166CodesByLocationIdViaProperties.java | 86 ++++ .../ProvideRegionToURIViaProperties.java | 13 +- ...erties.java => RegionsLocationModule.java} | 35 +- .../location/reference/LocationConstants.java | 8 +- ...edefinedRegions.java => JustProvider.java} | 28 +- ...onOrFirstZoneOrRegionMatchingRegionId.java | 27 +- .../RegionToProviderOrJustProvider.java | 42 +- .../ZoneToRegionToProviderOrJustProvider.java | 49 ++- .../java/org/jclouds/rest/RestContext.java | 13 +- .../org/jclouds/rest/RestContextBuilder.java | 74 ++-- .../org/jclouds/rest/RestContextFactory.java | 105 ++--- .../org/jclouds/rest/RestContextSpec.java | 34 +- .../rest/internal/RestContextImpl.java | 50 ++- core/src/main/resources/rest.properties | 2 +- .../java/org/jclouds/http/BaseJettyTest.java | 2 +- .../jclouds/rest/InputParamValidatorTest.java | 6 +- .../jclouds/rest/RestContextFactoryTest.java | 57 +-- .../internal/RestAnnotationProcessorTest.java | 8 +- .../aws/ec2/AWSEC2PropertiesBuilder.java | 15 +- .../AWSEC2TemplateBuilderLiveTest.java | 39 ++ .../strategy/AWSEC2ImageParserTest.java | 10 +- .../aws/s3/AWSS3PropertiesBuilder.java | 24 +- .../jclouds/aws/s3/AWSS3AsyncClientTest.java | 27 ++ .../AWSS3ServiceIntegrationLiveTest.java | 14 +- .../azureblob/AzureBlobPropertiesBuilder.java | 2 + .../config/AzureBlobStoreContextModule.java | 29 +- .../AzureBlobServiceIntegrationLiveTest.java | 9 +- ...ueLockVCloudDirectorPropertiesBuilder.java | 2 + ...VCloudDirectorTemplateBuilderLiveTest.java | 7 + .../CloudFilesUKPropertiesBuilder.java | 2 + ...loudFilesUKServiceIntegrationLiveTest.java | 9 +- .../CloudFilesUSPropertiesBuilder.java | 2 + ...loudFilesUSServiceIntegrationLiveTest.java | 13 +- .../CloudOneStoragePropertiesBuilder.java | 2 + ...dOneStorageServiceIntegrationLiveTest.java | 11 +- .../CloudServersUKPropertiesBuilder.java | 4 +- ...CloudServersUKTemplateBuilderLiveTest.java | 9 +- .../CloudServersUSPropertiesBuilder.java | 4 +- ...CloudServersUSTemplateBuilderLiveTest.java | 10 +- .../CloudSigmaZurichPropertiesBuilder.java | 2 + .../CloudSigmaComputeServiceAdapter.java | 57 ++- ...CloudSigmaComputeServiceContextModule.java | 5 +- .../CloudSigmaTemplateBuilderLiveTest.java | 7 + ...ostsBlueSquareLondonPropertiesBuilder.java | 2 + ...ueSquareLondonTemplateBuilderLiveTest.java | 7 + ...sticHostsPeer1LondonPropertiesBuilder.java | 2 + ...stsPeer1LondonTemplateBuilderLiveTest.java | 7 + ...HostsPeer1SanAntonioPropertiesBuilder.java | 2 + ...eer1SanAntonioTemplateBuilderLiveTest.java | 7 + ...calyptusPartnerCloudPropertiesBuilder.java | 8 + ...loudEucalyptusTemplateBuilderLiveTest.java | 6 + ...ptusPartnerCloudReviseParsedImageTest.java | 5 +- ...usPartnerCloudWalrusPropertiesBuilder.java | 2 + ...CloudWalrusServiceIntegrationLiveTest.java | 12 +- .../gogrid/GoGridPropertiesBuilder.java | 8 + .../suppliers/GoGridLocationSupplier.java | 55 ++- .../GoGridTemplateBuilderLiveTest.java | 6 + .../functions/ServerToNodeMetadataTest.java | 7 +- .../GoogleStoragePropertiesBuilder.java | 5 +- ...ogleStorageServiceIntegrationLiveTest.java | 10 +- .../OpenHostingEast1PropertiesBuilder.java | 2 + ...enHostingEast1TemplateBuilderLiveTest.java | 6 + ...loveManchesterTemplateBuilderLiveTest.java | 7 + .../SkaliCloudMalaysiaPropertiesBuilder.java | 2 + ...iCloudMalaysiaTemplateBuilderLiveTest.java | 6 + .../slicehost/SlicehostPropertiesBuilder.java | 2 + .../SlicehostBindComputeSuppliersByClass.java | 7 + .../SlicehostComputeServiceContextModule.java | 22 - .../SlicehostTemplateBuilderLiveTest.java | 7 + .../functions/FlavorToHardwareTest.java | 4 +- .../functions/SliceToNodeMetadataTest.java | 4 +- .../functions/SlicehostImageToImageTest.java | 37 +- .../SynapticStoragePropertiesBuilder.java | 2 + ...pticStorageServiceIntegrationLiveTest.java | 11 +- .../TerremarkECloudPropertiesBuilder.java | 2 + ...erremarkECloudTemplateBuilderLiveTest.java | 6 + ...rremarkVCloudExpressPropertiesBuilder.java | 2 + ...kVCloudExpressTemplateBuilderLiveTest.java | 6 + .../internal/BYONComputeServiceAdapter.java | 12 +- .../functions/NodeToNodeMetadataTest.java | 5 +- .../java/org/jclouds/libvirt/Datacenter.java | 56 --- .../compute/LibvirtComputeService.java | 113 +++-- .../LibvirtComputeServiceContextSpec.java | 6 +- .../LibvirtComputeServiceContextModule.java | 12 +- .../LibvirtComputeServiceAdapter.java | 402 +++++++++--------- .../NovaEC2TemplateBuilderLiveTest.java | 76 ---- .../org/jclouds/sqs/xml/QueueHandler.java | 6 +- .../jclouds/vi/compute/ViComputeService.java | 83 ++-- .../compute/ViComputeServiceContextSpec.java | 6 +- .../functions/DatacenterToLocation.java | 17 +- .../boxdotnet/BoxDotNetAsyncClientTest.java | 4 +- .../IBMDeveloperCloudPropertiesBuilder.java | 10 + .../IBMDeveloperCloudImageSupplier.java | 2 +- .../IBMDeveloperCloudLocationSupplier.java | 63 +-- ...DeveloperCloudTemplateBuilderLiveTest.java | 12 +- .../rimuhosting/miro/RimuHostingClient.java | 6 +- .../miro/RimuHostingPropertiesBuilder.java | 10 + .../functions/ServerToNodeMetadata.java | 32 +- .../RimuHostingLocationSupplier.java | 68 +-- .../miro/RimuHostingClientLiveTest.java | 4 +- .../RimuHostingTemplateBuilderLiveTest.java | 12 +- ...verManagerComputeServiceContextModule.java | 4 +- .../functions/DatacenterToLocation.java | 17 +- ...nagerComputeServiceContextBuilderTest.java | 16 +- .../ServerManagerExperimentLiveTest.java | 6 +- 158 files changed, 2024 insertions(+), 1505 deletions(-) delete mode 100644 apis/cloudfiles/src/main/java/org/jclouds/cloudfiles/CloudFilesPropertiesBuilder.java create mode 100644 core/src/main/java/org/jclouds/domain/LocationBuilder.java rename sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DatacenterToLocation.java => core/src/main/java/org/jclouds/location/Iso3166.java (61%) rename sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtNodeToLocation.java => core/src/main/java/org/jclouds/location/config/JustProviderLocationModule.java (50%) create mode 100644 core/src/main/java/org/jclouds/location/config/LocationModule.java create mode 100644 core/src/main/java/org/jclouds/location/config/ProvideIso3166CodesByLocationIdViaProperties.java rename core/src/main/java/org/jclouds/location/config/{ProvideRegionsViaProperties.java => RegionsLocationModule.java} (57%) rename core/src/main/java/org/jclouds/location/suppliers/{SupplyPredefinedRegions.java => JustProvider.java} (61%) delete mode 100644 sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/Datacenter.java delete mode 100644 sandbox-apis/nova-ec2/src/test/java/org/jclouds/nova/ec2/compute/NovaEC2TemplateBuilderLiveTest.java diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/config/AtmosBlobStoreContextModule.java b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/config/AtmosBlobStoreContextModule.java index a2482df1e2..11514e1977 100644 --- a/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/config/AtmosBlobStoreContextModule.java +++ b/apis/atmos/src/main/java/org/jclouds/atmos/blobstore/config/AtmosBlobStoreContextModule.java @@ -19,10 +19,6 @@ package org.jclouds.atmos.blobstore.config; -import java.util.Set; - -import javax.inject.Singleton; - import org.jclouds.atmos.AtmosAsyncClient; import org.jclouds.atmos.AtmosClient; import org.jclouds.atmos.blobstore.AtmosAsyncBlobStore; @@ -37,17 +33,9 @@ import org.jclouds.blobstore.attr.ConsistencyModel; import org.jclouds.blobstore.config.BlobStoreMapModule; import org.jclouds.blobstore.internal.BlobStoreContextImpl; import org.jclouds.blobstore.strategy.ContainsValueInListStrategy; -import org.jclouds.collect.Memoized; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.location.Provider; +import org.jclouds.location.config.JustProviderLocationModule; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableSet; import com.google.inject.AbstractModule; -import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -64,24 +52,10 @@ public class AtmosBlobStoreContextModule extends AbstractModule { bind(ConsistencyModel.class).toInstance(ConsistencyModel.EVENTUAL); bind(AsyncBlobStore.class).to(AtmosAsyncBlobStore.class).in(Scopes.SINGLETON); bind(BlobStore.class).to(AtmosBlobStore.class).in(Scopes.SINGLETON); - bind(BlobStoreContext.class).to( - new TypeLiteral>() { - }).in(Scopes.SINGLETON); + bind(BlobStoreContext.class).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); bind(ContainsValueInListStrategy.class).to(FindMD5InUserMetadata.class); bind(BlobRequestSigner.class).to(AtmosBlobRequestSigner.class); - } - - @Provides - @Singleton - @Memoized - Supplier> provideLocations(Supplier defaultLocation) { - return Suppliers.> ofInstance(ImmutableSet.of(defaultLocation.get())); - } - - @Provides - @Singleton - Supplier provideDefaultLocation(@Provider String providerName) { - return Suppliers - . ofInstance(new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null)); + install(new JustProviderLocationModule()); } } diff --git a/apis/cloudfiles/src/main/java/org/jclouds/cloudfiles/CloudFilesPropertiesBuilder.java b/apis/cloudfiles/src/main/java/org/jclouds/cloudfiles/CloudFilesPropertiesBuilder.java deleted file mode 100644 index ee457e7855..0000000000 --- a/apis/cloudfiles/src/main/java/org/jclouds/cloudfiles/CloudFilesPropertiesBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * - * 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.cloudfiles; - -import static org.jclouds.Constants.PROPERTY_ENDPOINT; -import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; - -import java.util.Properties; - -import org.jclouds.openstack.swift.SwiftPropertiesBuilder; - -/** - * Builds properties used in CloudFiles Connections - * - * @author Adrian Cole - */ -public class CloudFilesPropertiesBuilder extends SwiftPropertiesBuilder { - @Override - protected Properties defaultProperties() { - Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_REGIONS, "US"); - properties.setProperty(PROPERTY_ENDPOINT, "https://auth.api.rackspacecloud.com"); - return properties; - } - - public CloudFilesPropertiesBuilder(Properties properties) { - super(properties); - } - -} diff --git a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersBindComputeSuppliersByClass.java b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersBindComputeSuppliersByClass.java index ba33a9b224..9e5e99b984 100644 --- a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersBindComputeSuppliersByClass.java +++ b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersBindComputeSuppliersByClass.java @@ -21,13 +21,13 @@ package org.jclouds.cloudservers.compute.config; import java.util.Set; +import org.jclouds.cloudservers.compute.suppliers.CloudServersHardwareSupplier; +import org.jclouds.cloudservers.compute.suppliers.CloudServersImageSupplier; import org.jclouds.compute.config.BindComputeSuppliersByClass; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.domain.Location; -import org.jclouds.cloudservers.compute.suppliers.CloudServersHardwareSupplier; -import org.jclouds.cloudservers.compute.suppliers.CloudServersImageSupplier; -import org.jclouds.location.suppliers.SupplyPredefinedRegions; +import org.jclouds.location.suppliers.JustProvider; import com.google.common.base.Supplier; @@ -49,6 +49,6 @@ public class CloudServersBindComputeSuppliersByClass extends BindComputeSupplier @Override protected Class>> defineLocationSupplier() { - return SupplyPredefinedRegions.class; + return JustProvider.class; } } diff --git a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersComputeServiceDependenciesModule.java b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersComputeServiceDependenciesModule.java index 684b7517f1..c9bda3e9c4 100644 --- a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersComputeServiceDependenciesModule.java +++ b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/config/CloudServersComputeServiceDependenciesModule.java @@ -20,7 +20,6 @@ package org.jclouds.cloudservers.compute.config; import java.util.Map; -import java.util.Set; import javax.inject.Singleton; @@ -41,8 +40,6 @@ import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.internal.BaseComputeService; import org.jclouds.compute.internal.ComputeServiceContextImpl; -import org.jclouds.location.Region; -import org.jclouds.location.config.ProvideRegionsViaProperties; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; @@ -82,8 +79,6 @@ public class CloudServersComputeServiceDependenciesModule extends AbstractModule bind(new TypeLiteral>() { }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); - bind(new TypeLiteral>() { - }).annotatedWith(Region.class).toProvider(ProvideRegionsViaProperties.class).in(Scopes.SINGLETON); } @VisibleForTesting diff --git a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadata.java b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadata.java index 968d9ca4d8..4d06f7cf30 100644 --- a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadata.java +++ b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadata.java @@ -31,6 +31,8 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.cloudservers.domain.Server; +import org.jclouds.cloudservers.domain.ServerStatus; import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; @@ -41,11 +43,9 @@ import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.logging.Logger; -import org.jclouds.cloudservers.domain.Server; -import org.jclouds.cloudservers.domain.ServerStatus; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -60,7 +60,7 @@ public class ServerToNodeMetadata implements Function { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; - + protected final Supplier location; protected final Map credentialStore; protected final Map serverToNodeState; @@ -109,7 +109,8 @@ public class ServerToNodeMetadata implements Function { NodeMetadataBuilder builder = new NodeMetadataBuilder(); builder.ids(from.getId() + ""); builder.name(from.getName()); - builder.location(new LocationImpl(LocationScope.HOST, from.getHostId(), from.getHostId(), location.get())); + builder.location(new LocationBuilder().scope(LocationScope.HOST).id(from.getHostId()).description( + from.getHostId()).parent(location.get()).build()); builder.userMetadata(from.getMetadata()); builder.tag(parseTagFromName(from.getName())); builder.imageId(from.getImageId() + ""); diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/functions/FlavorToHardwareTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/functions/FlavorToHardwareTest.java index 729be37094..d5974d371f 100644 --- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/functions/FlavorToHardwareTest.java +++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/functions/FlavorToHardwareTest.java @@ -23,16 +23,16 @@ import static org.testng.Assert.assertEquals; import java.net.UnknownHostException; +import org.jclouds.cloudservers.domain.Flavor; +import org.jclouds.cloudservers.functions.ParseFlavorFromJsonResponseTest; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.VolumeBuilder; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.cloudservers.domain.Flavor; -import org.jclouds.cloudservers.functions.ParseFlavorFromJsonResponseTest; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; @@ -42,20 +42,14 @@ import com.google.common.collect.ImmutableList; */ @Test(groups = "unit") public class FlavorToHardwareTest { - Location provider = new LocationImpl(LocationScope.ZONE, "dallas", "description", null); + Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build(); @Test public void test() throws UnknownHostException { - assertEquals( - convertFlavor(), - new HardwareBuilder() - .ids("1") - .name("256 MB Server") - .processors(ImmutableList.of(new Processor(1.0, 1.0))) - .ram(256) - .volumes( - ImmutableList.of(new VolumeBuilder().type(Volume.Type.LOCAL).size(10.0f).durable(true) - .bootDevice(true).build())).build()); + assertEquals(convertFlavor(), new HardwareBuilder().ids("1").name("256 MB Server").processors( + ImmutableList.of(new Processor(1.0, 1.0))).ram(256).volumes( + ImmutableList.of(new VolumeBuilder().type(Volume.Type.LOCAL).size(10.0f).durable(true).bootDevice(true) + .build())).build()); } public static Hardware convertFlavor() { diff --git a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadataTest.java b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadataTest.java index 47eb79ddaa..8714f52f68 100644 --- a/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadataTest.java +++ b/apis/cloudservers/src/test/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadataTest.java @@ -25,6 +25,10 @@ import java.net.UnknownHostException; import java.util.Map; import java.util.Set; +import org.jclouds.cloudservers.compute.config.CloudServersComputeServiceDependenciesModule; +import org.jclouds.cloudservers.domain.Server; +import org.jclouds.cloudservers.domain.ServerStatus; +import org.jclouds.cloudservers.functions.ParseServerFromJsonResponseTest; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.Image; @@ -38,12 +42,8 @@ import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.VolumeBuilder; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.cloudservers.compute.config.CloudServersComputeServiceDependenciesModule; -import org.jclouds.cloudservers.domain.Server; -import org.jclouds.cloudservers.domain.ServerStatus; -import org.jclouds.cloudservers.functions.ParseServerFromJsonResponseTest; import org.testng.annotations.Test; import com.google.common.base.Suppliers; @@ -56,7 +56,7 @@ import com.google.common.collect.ImmutableSet; */ @Test(groups = "unit") public class ServerToNodeMetadataTest { - Location provider = new LocationImpl(LocationScope.ZONE, "dallas", "description", null); + Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build(); @Test public void testApplyWhereImageAndHardwareNotFoundButCredentialsFound() throws UnknownHostException { @@ -68,18 +68,16 @@ public class ServerToNodeMetadataTest { Server server = ParseServerFromJsonResponseTest.parseServer(); ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, ImmutableMap - . of("node#1234", creds), Suppliers.> ofInstance(images), Suppliers - .ofInstance(provider), Suppliers.> ofInstance(hardwares)); + . of("node#1234", creds), Suppliers.> ofInstance(images), + Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); NodeMetadata metadata = parser.apply(server); assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( ImmutableSet.of("67.23.10.132", "67.23.10.131")).privateAddresses(ImmutableSet.of("10.176.42.16")).tag( "NOTAG#sample-server").imageId("2").id("1234").providerId("1234").name("sample-server").credentials( - creds).location( - new LocationImpl(LocationScope.HOST, "e4d909c290d0fb1ca068ffaddf22cbd0", - "e4d909c290d0fb1ca068ffaddf22cbd0", new LocationImpl(LocationScope.ZONE, "dallas", - "description", null))).userMetadata( + creds).location( new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0").description( + "e4d909c290d0fb1ca068ffaddf22cbd0").parent(provider).build()).userMetadata( ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } @@ -99,9 +97,8 @@ public class ServerToNodeMetadataTest { assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( ImmutableSet.of("67.23.10.132", "67.23.10.131")).privateAddresses(ImmutableSet.of("10.176.42.16")).tag( "NOTAG#sample-server").imageId("2").id("1234").providerId("1234").name("sample-server").location( - new LocationImpl(LocationScope.HOST, "e4d909c290d0fb1ca068ffaddf22cbd0", - "e4d909c290d0fb1ca068ffaddf22cbd0", new LocationImpl(LocationScope.ZONE, "dallas", - "description", null))).userMetadata( + new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0").description( + "e4d909c290d0fb1ca068ffaddf22cbd0").parent(provider).build()).userMetadata( ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } @@ -125,9 +122,8 @@ public class ServerToNodeMetadataTest { "NOTAG#sample-server").imageId("2").operatingSystem( new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").version("5.2").is64Bit( true).build()).id("1234").providerId("1234").name("sample-server").location( - new LocationImpl(LocationScope.HOST, "e4d909c290d0fb1ca068ffaddf22cbd0", - "e4d909c290d0fb1ca068ffaddf22cbd0", new LocationImpl(LocationScope.ZONE, "dallas", - "description", null))).userMetadata( + new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0").description( + "e4d909c290d0fb1ca068ffaddf22cbd0").parent(provider).build()).userMetadata( ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } @@ -154,9 +150,8 @@ public class ServerToNodeMetadataTest { .bootDevice(true).build())).build()).operatingSystem( new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").version("5.2").is64Bit( true).build()).id("1234").providerId("1234").name("sample-server").location( - new LocationImpl(LocationScope.HOST, "e4d909c290d0fb1ca068ffaddf22cbd0", - "e4d909c290d0fb1ca068ffaddf22cbd0", new LocationImpl(LocationScope.ZONE, "dallas", - "description", null))).userMetadata( + new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0").description( + "e4d909c290d0fb1ca068ffaddf22cbd0").parent(provider).build()).userMetadata( ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } } diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2ImageParser.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2ImageParser.java index 1c6fa2ceb0..17670dc8bd 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2ImageParser.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/functions/EC2ImageParser.java @@ -40,8 +40,8 @@ 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.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.ec2.compute.strategy.ReviseParsedImage; import org.jclouds.ec2.domain.Image.Architecture; import org.jclouds.ec2.domain.Image.ImageType; @@ -116,8 +116,8 @@ public class EC2ImageParser implements Function @Singleton public static class RegionIdsToURI implements javax.inject.Provider> { private final AvailabilityZoneAndRegionClient client; + private final Injector injector; @Inject - public RegionIdsToURI(EC2Client client) { + public RegionIdsToURI(EC2Client client, Injector injector) { this.client = client.getAvailabilityZoneAndRegionServices(); + this.injector = injector; } @Singleton @Region @Override public Map get() { + try { + String regionString = injector.getInstance(Key.get(String.class, Names.named(PROPERTY_REGIONS))); + Set regions = ImmutableSet.copyOf(Splitter.on(',').split(regionString)); + if (regions.size() > 0) + return Maps.filterKeys(client.describeRegions(), Predicates.in(regions)); + } catch (ConfigurationException e) { + // this happens if regions property isn't set + // services not run by AWS may not have regions, so this is ok. + } return client.describeRegions(); - } + } } @Singleton diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2TemplateBuilderTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2TemplateBuilderTest.java index 0a379d03bd..a5b3b0e463 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2TemplateBuilderTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2TemplateBuilderTest.java @@ -51,8 +51,8 @@ import org.jclouds.compute.domain.internal.TemplateBuilderImpl; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.testng.annotations.Test; import com.google.common.base.Function; @@ -71,7 +71,8 @@ import com.google.common.collect.ImmutableSet; * @author Oleksiy Yarmula */ public class EC2TemplateBuilderTest { - private static final Location location = new LocationImpl(LocationScope.REGION, "us-east-1", "us east", null); + private static final Location location = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1") + .description("us-east-1").build(); public static final Hardware CC1_4XLARGE = cc1_4xlarge().location(location).supportsImageIds("us-east-1/cc-image") .build(); diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/EC2ImageParserTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/EC2ImageParserTest.java index e7cf42acc7..d38db5275e 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/EC2ImageParserTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/EC2ImageParserTest.java @@ -31,8 +31,8 @@ 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.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.ec2.compute.strategy.EC2PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.ec2.compute.strategy.ReviseParsedImage; import org.jclouds.ec2.domain.Image; @@ -74,7 +74,8 @@ public class EC2ImageParserTest { ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).build()); } - static Location defaultLocation = new LocationImpl(LocationScope.REGION, "us-east-1", "us-east-1", null); + static Location defaultLocation = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1").description( + "us-east-1").build(); public static Set convertImages(String resource) { diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java index 5d17292245..2752a8cbf6 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java @@ -36,8 +36,8 @@ import org.jclouds.compute.domain.OperatingSystemBuilder; import org.jclouds.compute.domain.OsFamily; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.ec2.compute.config.EC2ComputeServiceDependenciesModule; import org.jclouds.ec2.compute.domain.RegionAndName; import org.jclouds.ec2.domain.InstanceState; @@ -67,7 +67,8 @@ public class RunningInstanceToNodeMetadataTest { } - Location provider = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); + static Location provider = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1") + .description("us-east-1").build(); @Test public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationNotFoundButCredentialsFound() @@ -81,9 +82,9 @@ public class RunningInstanceToNodeMetadataTest { RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).publicAddresses( - ImmutableSet. of()).privateAddresses(ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f") - .credentials(creds).imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f") - .providerId("i-0799056f").build()); + ImmutableSet. of()).privateAddresses(ImmutableSet.of("10.243.42.70")).publicAddresses( + ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f").credentials(creds).imageId( + "us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f").providerId("i-0799056f").build()); } @Test @@ -94,8 +95,9 @@ public class RunningInstanceToNodeMetadataTest { RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).publicAddresses( - ImmutableSet. of()).privateAddresses(ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f") - .imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f").providerId("i-0799056f").build()); + ImmutableSet. of()).privateAddresses(ImmutableSet.of("10.243.42.70")).publicAddresses( + ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7").id( + "us-east-1/i-0799056f").providerId("i-0799056f").build()); } @Test @@ -106,8 +108,9 @@ public class RunningInstanceToNodeMetadataTest { RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).privateAddresses( - ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7").id( - "us-east-1/i-0799056f").providerId("i-0799056f").location(provider).build()); + ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag( + "NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f") + .providerId("i-0799056f").location(provider).build()); } @Test @@ -118,11 +121,11 @@ public class RunningInstanceToNodeMetadataTest { RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).privateAddresses( - ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7") - .operatingSystem( - new OperatingSystemBuilder().family(OsFamily.UNRECOGNIZED).version("").arch("paravirtual") - .description("137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()).id( - "us-east-1/i-0799056f").providerId("i-0799056f").location(provider).build()); + ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag( + "NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7").operatingSystem( + new OperatingSystemBuilder().family(OsFamily.UNRECOGNIZED).version("").arch("paravirtual").description( + "137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()).id("us-east-1/i-0799056f") + .providerId("i-0799056f").location(provider).build()); } @Test @@ -134,8 +137,8 @@ public class RunningInstanceToNodeMetadataTest { RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); assertEquals(parser.apply(server), new NodeMetadataBuilder().state(NodeState.RUNNING).privateAddresses( - ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag("NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7").hardware( - m1_small().build()).operatingSystem( + ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")).tag( + "NOTAG#i-0799056f").imageId("us-east-1/ami-82e4b5c7").hardware(m1_small().build()).operatingSystem( new OperatingSystemBuilder().family(OsFamily.UNRECOGNIZED).version("").arch("paravirtual").description( "137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()).id("us-east-1/i-0799056f") .providerId("i-0799056f").location(provider).build()); diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java index 4c5b906f4c..42f03fb7bc 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/internal/EC2TemplateBuilderImplTest.java @@ -32,8 +32,6 @@ import java.util.concurrent.ConcurrentMap; import javax.inject.Provider; -import org.jclouds.ec2.compute.domain.RegionAndName; -import org.jclouds.ec2.compute.options.EC2TemplateOptions; import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; @@ -43,8 +41,10 @@ import org.jclouds.compute.domain.internal.TemplateBuilderImpl; import org.jclouds.compute.domain.internal.TemplateBuilderImplTest; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.options.EC2TemplateOptions; import org.testng.annotations.Test; import com.google.common.base.Function; @@ -89,7 +89,7 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { @SuppressWarnings("unchecked") @Test public void testParseOnDemand() { - Location location = new LocationImpl(LocationScope.REGION, "region", "region", null); + Location location = new LocationBuilder().scope(LocationScope.REGION).id("region").description("region").build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet . of(location)); @@ -142,7 +142,7 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { @SuppressWarnings("unchecked") @Test public void testParseOnDemandWithoutRegionEncodedIntoId() { - Location location = new LocationImpl(LocationScope.REGION, "region", "region", null); + Location location = new LocationBuilder().scope(LocationScope.REGION).id("region").description("region").build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet . of(location)); @@ -179,7 +179,7 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { @SuppressWarnings("unchecked") @Test(expectedExceptions = NoSuchElementException.class) public void testParseOnDemandNotFound() { - Location location = new LocationImpl(LocationScope.REGION, "region", "region", null); + Location location = new LocationBuilder().scope(LocationScope.REGION).id("region").description("region").build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet . of(location)); diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java index 60e98f350f..0fb031777e 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java @@ -39,8 +39,8 @@ import org.jclouds.compute.domain.Template; import org.jclouds.compute.util.ComputeUtils; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.ec2.EC2Client; import org.jclouds.ec2.compute.functions.RunningInstanceToNodeMetadata; import org.jclouds.ec2.compute.options.EC2TemplateOptions; @@ -154,10 +154,12 @@ public class EC2RunNodesAndAddToSetStrategyTest { verifyStrategy(strategy); } - private static final Location REGION_AP_SOUTHEAST_1 = new LocationImpl(LocationScope.REGION, Region.AP_SOUTHEAST_1, - Region.AP_SOUTHEAST_1, new LocationImpl(LocationScope.PROVIDER, "ec2", "ec2", null)); - private static final Location ZONE_AP_SOUTHEAST_1A = new LocationImpl(LocationScope.ZONE, - AvailabilityZone.AP_SOUTHEAST_1A, AvailabilityZone.AP_SOUTHEAST_1A, REGION_AP_SOUTHEAST_1); + private static final Location REGION_AP_SOUTHEAST_1 = new LocationBuilder().scope(LocationScope.REGION).id( + Region.AP_SOUTHEAST_1).description(Region.AP_SOUTHEAST_1).parent( + new LocationBuilder().scope(LocationScope.PROVIDER).id("ec2").description("ec2").build()).build(); + private static final Location ZONE_AP_SOUTHEAST_1A = new LocationBuilder().scope(LocationScope.ZONE).id( + AvailabilityZone.AP_SOUTHEAST_1A).description(AvailabilityZone.AP_SOUTHEAST_1A).parent( + REGION_AP_SOUTHEAST_1).build(); // ///////////////////////////////////////////////////////////////////// @SuppressWarnings("unchecked") diff --git a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/ElasticStackComputeServiceAdapter.java b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/ElasticStackComputeServiceAdapter.java index 1bce212142..1a3e31dd50 100644 --- a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/ElasticStackComputeServiceAdapter.java +++ b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/ElasticStackComputeServiceAdapter.java @@ -6,7 +6,6 @@ import static com.google.common.collect.Iterables.filter; import static org.jclouds.concurrent.FutureIterables.transformParallel; import static org.jclouds.elasticstack.util.Servers.small; -import java.net.URI; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; @@ -29,8 +28,6 @@ import org.jclouds.compute.domain.internal.VolumeImpl; 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.elasticstack.ElasticStackAsyncClient; import org.jclouds.elasticstack.ElasticStackClient; import org.jclouds.elasticstack.domain.Device; @@ -42,7 +39,7 @@ import org.jclouds.elasticstack.domain.ServerInfo; import org.jclouds.elasticstack.domain.ServerStatus; import org.jclouds.elasticstack.domain.WellKnownImage; import org.jclouds.elasticstack.reference.ElasticStackConstants; -import org.jclouds.location.Provider; +import org.jclouds.location.suppliers.JustProvider; import org.jclouds.logging.Logger; import com.google.common.base.Function; @@ -64,8 +61,7 @@ public class ElasticStackComputeServiceAdapter implements private final Predicate driveNotClaimed; private final Map preinstalledImages; private final Map cache; - private final String providerName; - private final URI providerURI; + private final JustProvider locationSupplier; private final String defaultVncPassword; private final ExecutorService executor; @@ -75,15 +71,14 @@ public class ElasticStackComputeServiceAdapter implements @Inject public ElasticStackComputeServiceAdapter(ElasticStackClient client, ElasticStackAsyncClient aclient, - Predicate driveNotClaimed, @Provider String providerName, @Provider URI providerURI, + Predicate driveNotClaimed, JustProvider locationSupplier, Map preinstalledImages, Map cache, @Named(ElasticStackConstants.PROPERTY_VNC_PASSWORD) String defaultVncPassword, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.client = checkNotNull(client, "client"); this.aclient = checkNotNull(aclient, "aclient"); this.driveNotClaimed = checkNotNull(driveNotClaimed, "driveNotClaimed"); - this.providerName = checkNotNull(providerName, "providerName"); - this.providerURI = checkNotNull(providerURI, "providerURI"); + this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier"); this.preinstalledImages = checkNotNull(preinstalledImages, "preinstalledImages"); this.cache = checkNotNull(cache, "cache"); this.defaultVncPassword = checkNotNull(defaultVncPassword, "defaultVncPassword"); @@ -168,11 +163,11 @@ public class ElasticStackComputeServiceAdapter implements public Iterable listNodes() { return (Iterable) client.listServerInfo(); } - + + @SuppressWarnings("unchecked") @Override public Iterable listLocations() { - return ImmutableSet. of(new LocationImpl(LocationScope.PROVIDER, providerName, providerURI - .toASCIIString(), null)); + return (Iterable) locationSupplier.get(); } @Override diff --git a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/config/ElasticStackComputeServiceContextModule.java b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/config/ElasticStackComputeServiceContextModule.java index 910e1f7244..5b50c45706 100644 --- a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/config/ElasticStackComputeServiceContextModule.java +++ b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/config/ElasticStackComputeServiceContextModule.java @@ -52,12 +52,14 @@ import org.jclouds.elasticstack.predicates.DriveClaimed; import org.jclouds.functions.IdentityFunction; import org.jclouds.json.Json; import org.jclouds.location.Provider; +import org.jclouds.location.suppliers.OnlyLocationOrFirstZone; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.util.Strings2; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.base.Supplier; import com.google.common.collect.MapMaker; import com.google.common.collect.Maps; import com.google.inject.Provides; @@ -97,6 +99,8 @@ public class ElasticStackComputeServiceContextModule }).to(FindImageForId.class); bind(new TypeLiteral>() { }).to(WellKnownImageToImage.class); + bind(new TypeLiteral>() { + }).to(OnlyLocationOrFirstZone.class); } @Provides diff --git a/apis/elasticstack/src/test/java/org/jclouds/elasticstack/binders/BindServerToPlainTextStringTest.java b/apis/elasticstack/src/test/java/org/jclouds/elasticstack/binders/BindServerToPlainTextStringTest.java index 3fb7bb89ed..874f7658cc 100644 --- a/apis/elasticstack/src/test/java/org/jclouds/elasticstack/binders/BindServerToPlainTextStringTest.java +++ b/apis/elasticstack/src/test/java/org/jclouds/elasticstack/binders/BindServerToPlainTextStringTest.java @@ -76,8 +76,6 @@ public class BindServerToPlainTextStringTest { protected void configure() { bind(new TypeLiteral>>() { }).to(ServerToMap.class); - bind(new TypeLiteral>>() { - }).to(ServerToMap.class); } }).getInstance(BindServerToPlainTextString.class); diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java index 548c216374..5493fdab26 100644 --- a/apis/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java +++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java @@ -19,8 +19,6 @@ package org.jclouds.filesystem.config; -import java.util.Set; - import org.jclouds.blobstore.AsyncBlobStore; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStoreContext; @@ -29,10 +27,6 @@ import org.jclouds.blobstore.config.BlobStoreMapModule; import org.jclouds.blobstore.config.BlobStoreObjectModule; import org.jclouds.blobstore.internal.BlobStoreContextImpl; import org.jclouds.blobstore.util.BlobUtils; -import org.jclouds.collect.Memoized; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.filesystem.FilesystemBlobStore; import org.jclouds.filesystem.predicates.validators.FilesystemBlobKeyValidator; import org.jclouds.filesystem.predicates.validators.FilesystemContainerNameValidator; @@ -41,10 +35,8 @@ import org.jclouds.filesystem.predicates.validators.internal.FilesystemContainer import org.jclouds.filesystem.strategy.FilesystemStorageStrategy; import org.jclouds.filesystem.strategy.internal.FilesystemStorageStrategyImpl; import org.jclouds.filesystem.util.internal.FileSystemBlobUtilsImpl; +import org.jclouds.location.config.JustProviderLocationModule; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableSet; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Scopes; @@ -69,6 +61,7 @@ public class FilesystemBlobStoreContextModule extends AbstractModule { bind(BlobUtils.class).to(FileSystemBlobUtilsImpl.class); bind(FilesystemBlobKeyValidator.class).to(FilesystemBlobKeyValidatorImpl.class); bind(FilesystemContainerNameValidator.class).to(FilesystemContainerNameValidatorImpl.class); + install(new JustProviderLocationModule()); } @Provides @@ -77,18 +70,4 @@ public class FilesystemBlobStoreContextModule extends AbstractModule { return in; } - @Provides - @Singleton - @Memoized - Supplier> provideLocations(Supplier defaultLocation) { - return Suppliers.> ofInstance(ImmutableSet.of(defaultLocation.get())); - } - - @Provides - @Singleton - Supplier provideDefaultLocation() { - return Suppliers - . ofInstance(new LocationImpl(LocationScope.PROVIDER, "filesystem", "filesystem", null)); - } - } diff --git a/apis/s3/src/main/java/org/jclouds/s3/blobstore/config/S3BlobStoreContextModule.java b/apis/s3/src/main/java/org/jclouds/s3/blobstore/config/S3BlobStoreContextModule.java index 85afa1b678..815d2e5ff6 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/blobstore/config/S3BlobStoreContextModule.java +++ b/apis/s3/src/main/java/org/jclouds/s3/blobstore/config/S3BlobStoreContextModule.java @@ -19,17 +19,6 @@ package org.jclouds.s3.blobstore.config; -import java.util.Set; - -import javax.inject.Singleton; - -import org.jclouds.s3.S3AsyncClient; -import org.jclouds.s3.S3Client; -import org.jclouds.s3.blobstore.S3AsyncBlobStore; -import org.jclouds.s3.blobstore.S3BlobRequestSigner; -import org.jclouds.s3.blobstore.S3BlobStore; -import org.jclouds.s3.blobstore.functions.LocationFromBucketLocation; -import org.jclouds.s3.domain.BucketMetadata; import org.jclouds.blobstore.AsyncBlobStore; import org.jclouds.blobstore.BlobRequestSigner; import org.jclouds.blobstore.BlobStore; @@ -37,20 +26,18 @@ import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.attr.ConsistencyModel; import org.jclouds.blobstore.config.BlobStoreMapModule; import org.jclouds.blobstore.internal.BlobStoreContextImpl; -import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.location.Provider; -import org.jclouds.location.Region; -import org.jclouds.location.suppliers.OnlyLocationOrFirstZoneOrRegionMatchingRegionId; +import org.jclouds.location.config.RegionsLocationModule; +import org.jclouds.s3.S3AsyncClient; +import org.jclouds.s3.S3Client; +import org.jclouds.s3.blobstore.S3AsyncBlobStore; +import org.jclouds.s3.blobstore.S3BlobRequestSigner; +import org.jclouds.s3.blobstore.S3BlobStore; +import org.jclouds.s3.blobstore.functions.LocationFromBucketLocation; +import org.jclouds.s3.domain.BucketMetadata; import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.Sets; import com.google.inject.AbstractModule; -import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -64,9 +51,7 @@ public class S3BlobStoreContextModule extends AbstractModule { @Override protected void configure() { install(new BlobStoreMapModule()); - bind(new TypeLiteral>() { - }).to(new TypeLiteral() { - }); + install(new RegionsLocationModule()); bind(ConsistencyModel.class).toInstance(ConsistencyModel.EVENTUAL); bind(AsyncBlobStore.class).to(S3AsyncBlobStore.class).in(Scopes.SINGLETON); bind(BlobStore.class).to(S3BlobStore.class).in(Scopes.SINGLETON); @@ -81,15 +66,5 @@ public class S3BlobStoreContextModule extends AbstractModule { }).to(LocationFromBucketLocation.class); } - @Provides - @Singleton - @Memoized - Supplier> provideLocations(@Region Set regions, @Provider String providerName) { - Set locations = Sets.newHashSet(); - Location s3 = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); - for (String zone : regions) { - locations.add(new LocationImpl(LocationScope.REGION, zone.toString(), zone.toString(), s3)); - } - return Suppliers.> ofInstance(locations); - } + } diff --git a/apis/s3/src/main/java/org/jclouds/s3/functions/BindRegionToXmlPayload.java b/apis/s3/src/main/java/org/jclouds/s3/functions/BindRegionToXmlPayload.java index 2936113903..1af55cd906 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/functions/BindRegionToXmlPayload.java +++ b/apis/s3/src/main/java/org/jclouds/s3/functions/BindRegionToXmlPayload.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkArgument; import java.util.Set; +import javax.annotation.Nullable; import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Singleton; @@ -49,14 +50,16 @@ public class BindRegionToXmlPayload extends BindToStringPayload { private final Set regions; @Inject - BindRegionToXmlPayload(@org.jclouds.location.Region String defaultRegion, - @org.jclouds.location.Region Set regions) { + BindRegionToXmlPayload(@org.jclouds.location.Region @Nullable String defaultRegion, + @org.jclouds.location.Region Set regions) { this.defaultRegion = defaultRegion; this.regions = regions; } @Override public R bindToRequest(R request, Object input) { + if (defaultRegion == null) + return request; input = input == null ? defaultRegion : input; checkArgument(input instanceof String, "this binder is only valid for Region!"); String constraint = (String) input; @@ -70,10 +73,9 @@ public class BindRegionToXmlPayload extends BindToStringPayload { logger.warn("region %s not in %s ", constraint, regions); value = constraint; } - String payload = String - .format( - "%s", - value); + String payload = String.format( + "%s", + value); request = super.bindToRequest(request, payload); request.getPayload().getContentMetadata().setContentType(MediaType.TEXT_XML); return request; diff --git a/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java b/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java index 1d95667b76..8e0c75475c 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/S3AsyncClientTest.java @@ -388,26 +388,7 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest { checkFilters(request); } - - public void testPutBucketEu() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException, - NoSuchMethodException, IOException { - Method method = S3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, Array.newInstance( - PutBucketOptions.class, 0).getClass()); - HttpRequest request = processor.createRequest(method, "EU", "bucket"); - - assertRequestLineEquals(request, "PUT https://bucket." + url + "/ HTTP/1.1"); - assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); - assertPayloadEquals(request, - "EU", - "text/xml", false); - - assertResponseParserClassEquals(method, request, ReturnTrueIf2xx.class); - assertSaxResponseParserClassEquals(method, null); - assertExceptionParserClassEquals(method, ReturnFalseIfBucketAlreadyOwnedByYouOrIllegalState.class); - - checkFilters(request); - } - + public void testPutObject() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException, NoSuchMethodException, IOException { diff --git a/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java b/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java index f8c1b5bd3c..0421743f9d 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java +++ b/apis/s3/src/test/java/org/jclouds/s3/internal/StubS3AsyncClient.java @@ -37,6 +37,20 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.aws.domain.Region; +import org.jclouds.blobstore.AsyncBlobStore; +import org.jclouds.blobstore.KeyNotFoundException; +import org.jclouds.blobstore.TransientAsyncBlobStore; +import org.jclouds.blobstore.domain.Blob; +import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.blobstore.domain.MutableBlobMetadata; +import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions; +import org.jclouds.blobstore.options.ListContainerOptions; +import org.jclouds.concurrent.Futures; +import org.jclouds.date.DateService; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; +import org.jclouds.domain.LocationScope; +import org.jclouds.http.options.GetOptions; import org.jclouds.s3.S3AsyncClient; import org.jclouds.s3.blobstore.S3AsyncBlobStore; import org.jclouds.s3.blobstore.functions.BlobToObject; @@ -59,20 +73,6 @@ import org.jclouds.s3.options.CopyObjectOptions; import org.jclouds.s3.options.ListBucketOptions; import org.jclouds.s3.options.PutBucketOptions; import org.jclouds.s3.options.PutObjectOptions; -import org.jclouds.blobstore.AsyncBlobStore; -import org.jclouds.blobstore.KeyNotFoundException; -import org.jclouds.blobstore.TransientAsyncBlobStore; -import org.jclouds.blobstore.domain.Blob; -import org.jclouds.blobstore.domain.BlobMetadata; -import org.jclouds.blobstore.domain.MutableBlobMetadata; -import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions; -import org.jclouds.blobstore.options.ListContainerOptions; -import org.jclouds.concurrent.Futures; -import org.jclouds.date.DateService; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.http.options.GetOptions; import com.google.common.base.Function; import com.google.common.collect.Iterables; @@ -140,7 +140,8 @@ public class StubS3AsyncClient implements S3AsyncClient { region = region == null ? Region.US_STANDARD : region; final PutBucketOptions options = (optionsList.length == 0) ? new PutBucketOptions() : optionsList[0]; keyToAcl.put(name, options.getAcl()); - return blobStore.createContainerInLocation(new LocationImpl(LocationScope.REGION, region, region, null), name); + return blobStore.createContainerInLocation(new LocationBuilder().scope(LocationScope.REGION).id(region) + .description(region).build(), name); } public ListenableFuture listBucket(final String name, ListBucketOptions... optionsList) { diff --git a/apis/swift/src/main/java/org/jclouds/openstack/swift/blobstore/config/SwiftBlobStoreContextModule.java b/apis/swift/src/main/java/org/jclouds/openstack/swift/blobstore/config/SwiftBlobStoreContextModule.java index f89cc468e5..041f31d250 100644 --- a/apis/swift/src/main/java/org/jclouds/openstack/swift/blobstore/config/SwiftBlobStoreContextModule.java +++ b/apis/swift/src/main/java/org/jclouds/openstack/swift/blobstore/config/SwiftBlobStoreContextModule.java @@ -19,10 +19,6 @@ package org.jclouds.openstack.swift.blobstore.config; -import java.util.Set; - -import javax.inject.Singleton; - import org.jclouds.blobstore.AsyncBlobStore; import org.jclouds.blobstore.BlobRequestSigner; import org.jclouds.blobstore.BlobStore; @@ -30,22 +26,14 @@ import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.attr.ConsistencyModel; import org.jclouds.blobstore.config.BlobStoreMapModule; import org.jclouds.blobstore.internal.BlobStoreContextImpl; -import org.jclouds.collect.Memoized; -import org.jclouds.domain.Location; -import org.jclouds.location.Region; -import org.jclouds.location.config.ProvideRegionsViaProperties; -import org.jclouds.location.suppliers.SupplyPredefinedRegions; +import org.jclouds.location.config.JustProviderLocationModule; import org.jclouds.openstack.swift.CommonSwiftAsyncClient; import org.jclouds.openstack.swift.CommonSwiftClient; import org.jclouds.openstack.swift.blobstore.SwiftAsyncBlobStore; import org.jclouds.openstack.swift.blobstore.SwiftBlobRequestSigner; import org.jclouds.openstack.swift.blobstore.SwiftBlobStore; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.Iterables; import com.google.inject.AbstractModule; -import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -60,12 +48,7 @@ public class SwiftBlobStoreContextModule extends AbstractModule { @Override protected void configure() { install(new BlobStoreMapModule()); - bind(new TypeLiteral>>() { - }).annotatedWith(Memoized.class).to(new TypeLiteral() { - }); - bind(new TypeLiteral>() { - }).annotatedWith(Region.class).toProvider(ProvideRegionsViaProperties.class).in(Scopes.SINGLETON); - + install(new JustProviderLocationModule()); bind(ConsistencyModel.class).toInstance(ConsistencyModel.STRICT); bind(AsyncBlobStore.class).to(SwiftAsyncBlobStore.class).in(Scopes.SINGLETON); bind(BlobStore.class).to(SwiftBlobStore.class).in(Scopes.SINGLETON); @@ -74,10 +57,5 @@ public class SwiftBlobStoreContextModule extends AbstractModule { bind(BlobRequestSigner.class).to(SwiftBlobRequestSigner.class); } - @Provides - @Singleton - protected Supplier getLocation(@Memoized Supplier> locations) { - return Suppliers. ofInstance(Iterables.get(locations.get(), 0)); - } } diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java b/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java index 8e42ca78c3..5eeaf238ca 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java @@ -19,7 +19,6 @@ package org.jclouds.blobstore.config; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -34,15 +33,9 @@ import org.jclouds.blobstore.TransientBlobRequestSigner; import org.jclouds.blobstore.attr.ConsistencyModel; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.internal.BlobStoreContextImpl; -import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.location.Provider; +import org.jclouds.location.config.JustProviderLocationModule; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableSet; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Scopes; @@ -70,6 +63,7 @@ public class TransientBlobStoreContextModule extends AbstractModule { }).toInstance(containerToLocation); install(new BlobStoreObjectModule()); install(new BlobStoreMapModule()); + install(new JustProviderLocationModule()); bind(ConsistencyModel.class).toInstance(ConsistencyModel.STRICT); bind(BlobRequestSigner.class).to(TransientBlobRequestSigner.class); } @@ -79,18 +73,4 @@ public class TransientBlobStoreContextModule extends AbstractModule { BlobStore provide(TransientBlobStore in) { return in; } - - @Provides - @Singleton - @Memoized - Supplier> provideLocations(Supplier defaultLocation) { - return Suppliers.> ofInstance(ImmutableSet.of(defaultLocation.get())); - } - - @Provides - @Singleton - Supplier provideDefaultLocation(@Provider String providerName) { - return Suppliers - . ofInstance(new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null)); - } } diff --git a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseServiceIntegrationTest.java b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseServiceIntegrationTest.java index 59c9818203..2578c20fdc 100755 --- a/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseServiceIntegrationTest.java +++ b/blobstore/src/test/java/org/jclouds/blobstore/integration/internal/BaseServiceIntegrationTest.java @@ -31,6 +31,7 @@ import org.jclouds.domain.LocationScope; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; /** @@ -61,11 +62,9 @@ public class BaseServiceIntegrationTest extends BaseBlobStoreIntegrationTest { PageSet list = context.getBlobStore().list(); assert Iterables.any(list, new Predicate() { public boolean apply(StorageMetadata md) { - return containerName.equals(md.getName()) - && location.equals(md.getLocation()); + return containerName.equals(md.getName()) && location.equals(md.getLocation()); } - }) : String.format("container %s/%s not found in list %s", location, - containerName, list); + }) : String.format("container %s/%s not found in list %s", location, containerName, list); } }); @@ -75,10 +74,14 @@ public class BaseServiceIntegrationTest extends BaseBlobStoreIntegrationTest { } } + protected Set getIso3166Codes() { + return ImmutableSet. of(); + } + @Test(groups = { "integration", "live" }) public void testGetAssignableLocations() throws Exception { - for (Location location : context.getBlobStore() - .listAssignableLocations()) { + assertProvider(context.getProviderSpecificContext()); + for (Location location : context.getBlobStore().listAssignableLocations()) { System.err.printf("location %s%n", location); assert location.getId() != null : location; assert location != location.getParent() : location; @@ -89,6 +92,9 @@ public class BaseServiceIntegrationTest extends BaseBlobStoreIntegrationTest { break; case REGION: assertProvider(location.getParent()); + assert location.getIso3166Codes().size() == 0 + || location.getParent().getIso3166Codes().containsAll(location.getIso3166Codes()) : location + + " ||" + location.getParent(); break; case ZONE: Location provider = location.getParent().getParent(); @@ -96,6 +102,9 @@ public class BaseServiceIntegrationTest extends BaseBlobStoreIntegrationTest { if (provider == null) provider = location.getParent(); assertProvider(provider); + assert location.getIso3166Codes().size() == 0 + || location.getParent().getIso3166Codes().containsAll(location.getIso3166Codes()) : location + + " ||" + location.getParent(); break; case HOST: Location provider2 = location.getParent().getParent().getParent(); @@ -108,9 +117,10 @@ public class BaseServiceIntegrationTest extends BaseBlobStoreIntegrationTest { } } - public void assertProvider(Location provider) { + void assertProvider(Location provider) { assertEquals(provider.getScope(), LocationScope.PROVIDER); assertEquals(provider.getParent(), null); + assertEquals(provider.getIso3166Codes(), getIso3166Codes()); } } \ No newline at end of file diff --git a/common/aws/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java b/common/aws/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java index 06075ba138..8dd375b5be 100644 --- a/common/aws/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java +++ b/common/aws/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java @@ -25,6 +25,7 @@ import java.net.URI; import java.util.Map; import java.util.Set; +import javax.annotation.Nullable; import javax.inject.Singleton; import org.jclouds.aws.handlers.AWSClientErrorRetryHandler; @@ -79,12 +80,13 @@ public class AWSRestClientModule extends RestClientModule { @Provides @Singleton + @Nullable @Region protected String getDefaultRegion(@Provider URI uri, @Region Map map, LoggerFactory logFactory) { String region = ImmutableBiMap.copyOf(map).inverse().get(uri); - if (region == null) { + if (region == null && map.size() > 0) { logFactory.getLogger(getClass().getName()).warn( - "failed to find region for current endpoint %s in %s; choosing first: %s", uri, map, region); + "failed to find region for current endpoint %s in %s; choosing first: %s", uri, map, region); region = get(map.keySet(), 0); } return region; diff --git a/common/aws/src/test/java/org/jclouds/aws/filters/FormSignerTest.java b/common/aws/src/test/java/org/jclouds/aws/filters/FormSignerTest.java index e30a6aa5c5..c52703e78a 100644 --- a/common/aws/src/test/java/org/jclouds/aws/filters/FormSignerTest.java +++ b/common/aws/src/test/java/org/jclouds/aws/filters/FormSignerTest.java @@ -51,7 +51,7 @@ import com.google.inject.name.Names; public class FormSignerTest { @SuppressWarnings("unchecked") public static final RestContextSpec DUMMY_SPEC = new RestContextSpec("provider", "endpoint", - "apiVersion", "identity", "credential", Map.class, List.class, PropertiesBuilder.class, + "apiVersion", "", "identity", "credential", Map.class, List.class, PropertiesBuilder.class, (Class) RestContextBuilder.class, ImmutableList. of(new MockModule(), new NullLoggingModule(), new AbstractModule() { @Override diff --git a/common/azure/src/test/java/org/jclouds/azure/storage/filters/SharedKeyLiteAuthenticationTest.java b/common/azure/src/test/java/org/jclouds/azure/storage/filters/SharedKeyLiteAuthenticationTest.java index 617900f00d..acf082ab5d 100755 --- a/common/azure/src/test/java/org/jclouds/azure/storage/filters/SharedKeyLiteAuthenticationTest.java +++ b/common/azure/src/test/java/org/jclouds/azure/storage/filters/SharedKeyLiteAuthenticationTest.java @@ -139,8 +139,9 @@ public class SharedKeyLiteAuthenticationTest { @SuppressWarnings("unchecked") public static final RestContextSpec DUMMY_SPEC = new RestContextSpec("provider", "endpoint", - "apiVersion", "identity", "credential", Map.class, List.class, PropertiesBuilder.class, + "apiVersion", "", "identity", "credential", Map.class, List.class, PropertiesBuilder.class, (Class) RestContextBuilder.class, ImmutableList. of(new MockModule(), new NullLoggingModule(), - new AzureStorageRestClientModule(Exception.class, RuntimeException.class))); + new AzureStorageRestClientModule(Exception.class, + RuntimeException.class))); } \ No newline at end of file diff --git a/common/openstack/src/test/java/org/jclouds/openstack/OpenStackAuthAsyncClientTest.java b/common/openstack/src/test/java/org/jclouds/openstack/OpenStackAuthAsyncClientTest.java index 281db9b27d..a77674bcdb 100755 --- a/common/openstack/src/test/java/org/jclouds/openstack/OpenStackAuthAsyncClientTest.java +++ b/common/openstack/src/test/java/org/jclouds/openstack/OpenStackAuthAsyncClientTest.java @@ -63,8 +63,8 @@ public class OpenStackAuthAsyncClientTest extends RestClientTest createContextSpec() { - return contextSpec("test", "http://localhost:8080", "1.0", "identity", "credential", OpenStackAuthClient.class, - OpenStackAuthAsyncClient.class); + return contextSpec("test", "http://localhost:8080", "1.0", "", "identity", "credential", + OpenStackAuthClient.class, OpenStackAuthAsyncClient.class); } @Override diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java b/common/vcloud/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java index c4936facfe..797a34c1f9 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java @@ -27,6 +27,7 @@ import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.config.BindComputeStrategiesByClass; import org.jclouds.compute.config.BindComputeSuppliersByClass; import org.jclouds.compute.domain.NodeState; +import org.jclouds.location.config.LocationModule; import org.jclouds.vcloud.domain.Status; import com.google.common.annotations.VisibleForTesting; @@ -42,13 +43,13 @@ import com.google.inject.Provides; public abstract class CommonVCloudComputeServiceContextModule extends BaseComputeServiceContextModule { @VisibleForTesting - static final Map vAppStatusToNodeState = ImmutableMap. builder() - .put(Status.OFF, NodeState.SUSPENDED).put(Status.ON, NodeState.RUNNING) - .put(Status.RESOLVED, NodeState.PENDING).put(Status.ERROR, NodeState.ERROR) - .put(Status.UNRECOGNIZED, NodeState.UNRECOGNIZED).put(Status.DEPLOYED, NodeState.PENDING) - .put(Status.INCONSISTENT, NodeState.PENDING).put(Status.UNKNOWN, NodeState.UNRECOGNIZED) - .put(Status.MIXED, NodeState.PENDING).put(Status.WAITING_FOR_INPUT, NodeState.PENDING) - .put(Status.SUSPENDED, NodeState.SUSPENDED).put(Status.UNRESOLVED, NodeState.PENDING).build(); + static final Map vAppStatusToNodeState = ImmutableMap. builder().put( + Status.OFF, NodeState.SUSPENDED).put(Status.ON, NodeState.RUNNING).put(Status.RESOLVED, NodeState.PENDING) + .put(Status.ERROR, NodeState.ERROR).put(Status.UNRECOGNIZED, NodeState.UNRECOGNIZED).put(Status.DEPLOYED, + NodeState.PENDING).put(Status.INCONSISTENT, NodeState.PENDING).put(Status.UNKNOWN, + NodeState.UNRECOGNIZED).put(Status.MIXED, NodeState.PENDING).put(Status.WAITING_FOR_INPUT, + NodeState.PENDING).put(Status.SUSPENDED, NodeState.SUSPENDED).put(Status.UNRESOLVED, + NodeState.PENDING).build(); @Singleton @Provides diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java b/common/vcloud/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java index f6d44f295b..2c94ab32d2 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java @@ -19,6 +19,9 @@ package org.jclouds.vcloud.compute.suppliers; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; import java.util.Map; import java.util.Set; @@ -26,43 +29,65 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.location.Iso3166; +import org.jclouds.location.Provider; +import org.jclouds.location.suppliers.JustProvider; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.ReferenceType; import com.google.common.base.Supplier; -import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.ImmutableSet.Builder; /** * @author Adrian Cole */ @Singleton -public class OrgAndVDCToLocationSupplier implements Supplier> { - private final String providerName; +public class OrgAndVDCToLocationSupplier extends JustProvider { + private final Supplier> orgNameToResource; private final Supplier> orgNameToVDCResource; + private final Map> isoCodesById; @Inject - OrgAndVDCToLocationSupplier(@org.jclouds.location.Provider String providerName, + OrgAndVDCToLocationSupplier(@Iso3166 Set isoCodes, @Provider String providerName, @Provider URI endpoint, @org.jclouds.vcloud.endpoints.Org Supplier> orgNameToResource, - Supplier> orgNameToVDCResource) { - this.providerName = providerName; - this.orgNameToResource = orgNameToResource; - this.orgNameToVDCResource = orgNameToVDCResource; + Supplier> orgNameToVDCResource, @Iso3166 Map> isoCodesById) { + super(isoCodes, providerName, endpoint); + this.orgNameToResource = checkNotNull(orgNameToResource, "orgNameToResource"); + this.orgNameToVDCResource = checkNotNull(orgNameToVDCResource, "orgNameToVDCResource"); + this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById"); } @Override public Set get() { - Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); - Set locations = Sets.newLinkedHashSet(); + return buildJustProviderOrVDCs().build(); + } - for (ReferenceType org : orgNameToResource.get().values()) { - Location orgL = new LocationImpl(LocationScope.REGION, org.getHref().toASCIIString(), org.getName(), provider); - for (ReferenceType vdc : orgNameToVDCResource.get().get(org.getName()).getVDCs().values()) { - locations.add(new LocationImpl(LocationScope.ZONE, vdc.getHref().toASCIIString(), vdc.getName(), orgL)); + protected Builder buildJustProviderOrVDCs() { + Builder locations = ImmutableSet.builder(); + Location provider = Iterables.getOnlyElement(super.get()); + if (orgNameToResource.get().size() == 0) + return locations.add(provider); + else + for (ReferenceType org : orgNameToResource.get().values()) { + LocationBuilder builder = new LocationBuilder().scope(LocationScope.REGION).id( + org.getHref().toASCIIString()).description((org.getName())).parent(provider); + if (isoCodesById.containsKey(org.getHref().toASCIIString())) + builder.iso3166Codes(isoCodesById.get(org.getHref().toASCIIString())); + Location orgL = builder.build(); + for (ReferenceType vdc : orgNameToVDCResource.get().get(org.getName()).getVDCs().values()) { + builder = new LocationBuilder().scope(LocationScope.ZONE).id(vdc.getHref().toASCIIString()).description( + (vdc.getName())).parent(orgL); + if (isoCodesById.containsKey(vdc.getHref().toASCIIString())) + builder.iso3166Codes(isoCodesById.get(vdc.getHref().toASCIIString())); + locations.add(builder.build()); + } } - } return locations; } + } \ No newline at end of file diff --git a/common/vcloud/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java b/common/vcloud/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java index 74dc73a6da..f98431d275 100755 --- a/common/vcloud/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java +++ b/common/vcloud/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java @@ -60,8 +60,7 @@ public class VCloudLoginAsyncClientTest extends RestClientTest createContextSpec() { - return contextSpec("test", "http://localhost:8080/login", "1", "identity", "credential", VCloudLoginClient.class, - VCloudLoginAsyncClient.class); + return contextSpec("test", "http://localhost:8080/login", "1", "", "identity", "credential", + VCloudLoginClient.class, VCloudLoginAsyncClient.class); } } diff --git a/common/vcloud/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java b/common/vcloud/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java index d7a3e70971..f88ed7cb2c 100644 --- a/common/vcloud/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java +++ b/common/vcloud/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java @@ -39,7 +39,6 @@ import org.testng.annotations.Test; import com.google.inject.TypeLiteral; - /** * Tests behavior of {@code VCloudVersionsAsyncClient} * @@ -83,8 +82,8 @@ public class VCloudVersionsAsyncClientTest extends RestClientTest createContextSpec() { - return contextSpec("test", "http://localhost:8080", "1", "identity", "credential", VCloudVersionsClient.class, - VCloudVersionsAsyncClient.class); + return contextSpec("test", "http://localhost:8080", "1", "", "identity", "credential", + VCloudVersionsClient.class, VCloudVersionsAsyncClient.class); } } diff --git a/compute/src/main/clojure/org/jclouds/modules.clj b/compute/src/main/clojure/org/jclouds/modules.clj index 53982b606c..1a81be2b06 100644 --- a/compute/src/main/clojure/org/jclouds/modules.clj +++ b/compute/src/main/clojure/org/jclouds/modules.clj @@ -65,7 +65,7 @@ (.createContext (ComputeServiceContextFactory.) spec)) (^RestContextSpec defn context-spec [^StandaloneComputeServiceContextModule module] - (StandaloneComputeServiceContextSpec. "servermanager", "http://host", "1", "identity", "credential", module, (ImmutableSet/of))) + (StandaloneComputeServiceContextSpec. "servermanager", "http://host", "1", "", "identity", "credential", module, (ImmutableSet/of))) (defrecord NodeListComputeService [node-list] diff --git a/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextSpec.java b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextSpec.java index 9d0ab8c5f4..7af4076318 100644 --- a/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextSpec.java +++ b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextSpec.java @@ -29,25 +29,26 @@ import com.google.inject.Module; * @author Adrian Cole */ public class StandaloneComputeServiceContextSpec extends RestContextSpec { - public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String identity, - String credential, Class driverClass, - Class> contextBuilderClass) { - this(provider, endpoint, apiVersion, identity, credential, driverClass, contextBuilderClass, ImmutableSet - . of()); + public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String iso3166Codes, + String identity, String credential, Class driverClass, + Class> contextBuilderClass) { + this(provider, endpoint, apiVersion, iso3166Codes, identity, credential, driverClass, contextBuilderClass, + ImmutableSet. of()); } - public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String identity, - String credential, Class driverClass, - Class> contextBuilderClass, Iterable modules) { - this(provider, endpoint, apiVersion, identity, credential, driverClass, PropertiesBuilder.class, - contextBuilderClass, modules); + public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String iso3166Codes, + String identity, String credential, Class driverClass, + Class> contextBuilderClass, Iterable modules) { + this(provider, endpoint, apiVersion, iso3166Codes, identity, credential, driverClass, PropertiesBuilder.class, + contextBuilderClass, modules); } - @SuppressWarnings({ "unchecked", "rawtypes" }) - public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String identity, - String credential, Class driverClass, Class propertiesBuilderClass, - Class> contextBuilderClass, Iterable modules) { - super(provider, endpoint, apiVersion, identity, credential, driverClass, driverClass, - (Class) propertiesBuilderClass, (Class) contextBuilderClass, modules); + @SuppressWarnings( { "unchecked", "rawtypes" }) + public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String iso3166Codes, + String identity, String credential, Class driverClass, + Class propertiesBuilderClass, + Class> contextBuilderClass, Iterable modules) { + super(provider, endpoint, apiVersion, iso3166Codes, identity, credential, driverClass, driverClass, + (Class) propertiesBuilderClass, (Class) contextBuilderClass, modules); } } \ No newline at end of file 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 3d2c4f0033..078766af95 100644 --- a/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java @@ -49,8 +49,8 @@ import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap; import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap; -import org.jclouds.domain.Location; import org.jclouds.json.Json; +import org.jclouds.location.config.LocationModule; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.scriptbuilder.domain.Statement; @@ -76,6 +76,7 @@ import com.google.inject.name.Names; public abstract class BaseComputeServiceContextModule extends AbstractModule { @Override protected void configure() { + install(new LocationModule(authException)); install(new ComputeServiceTimeoutsModule()); bind(new TypeLiteral>() { }).to(CreateSshClientOncePortIsListeningOnNode.class); @@ -127,9 +128,9 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { checkNotNull(node, "node"); checkNotNull(runScript, "runScript"); checkNotNull(options, "options"); - return !options.shouldWrapInInitScript() ? factory.exec(node, runScript, options) - : (options.shouldBlockOnComplete() ? factory.backgroundAndBlockOnComplete(node, runScript, options) - : factory.background(node, runScript, options)); + return !options.shouldWrapInInitScript() ? factory.exec(node, runScript, options) : (options + .shouldBlockOnComplete() ? factory.backgroundAndBlockOnComplete(node, runScript, options) : factory + .background(node, runScript, options)); } @Override @@ -206,41 +207,6 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { }); } - @Provides - @Singleton - protected Supplier> provideLocationMap( - @Memoized Supplier> locations) { - return Suppliers.compose(new Function, Map>() { - - @Override - public Map apply(Set from) { - return Maps.uniqueIndex(from, new Function() { - - @Override - public String apply(Location from) { - return from.getId(); - } - - }); - } - - }, locations); - } - - @Provides - @Singleton - @Memoized - protected Supplier> supplyLocationCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> locationSupplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, seconds, - new Supplier>() { - @Override - public Set get() { - return locationSupplier.get(); - } - }); - } - @Provides @Singleton protected Supplier> provideSizeMap(@Memoized Supplier> sizes) { diff --git a/compute/src/main/java/org/jclouds/compute/config/ComputeServiceAdapterContextModule.java b/compute/src/main/java/org/jclouds/compute/config/ComputeServiceAdapterContextModule.java index 5b203278a4..717d777576 100644 --- a/compute/src/main/java/org/jclouds/compute/config/ComputeServiceAdapterContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/ComputeServiceAdapterContextModule.java @@ -19,14 +19,11 @@ package org.jclouds.compute.config; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.Iterables.transform; -import static com.google.common.collect.Sets.newHashSet; - import java.util.Set; import javax.inject.Singleton; +import org.jclouds.collect.TransformingSetSupplier; import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.domain.Hardware; @@ -41,7 +38,6 @@ import org.jclouds.compute.strategy.ResumeNodeStrategy; import org.jclouds.compute.strategy.SuspendNodeStrategy; import org.jclouds.compute.strategy.impl.AdaptingComputeServiceStrategies; import org.jclouds.domain.Location; -import org.jclouds.location.suppliers.OnlyLocationOrFirstZone; import com.google.common.base.Function; import com.google.common.base.Supplier; @@ -64,36 +60,34 @@ public class ComputeServiceAdapterContextModule extends BaseCo this.asyncClientType = asyncClientType; } - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings( { "unchecked", "rawtypes" }) @Override protected void configure() { super.configure(); - bindDefaultLocation(); bind(new TypeLiteral() { - }).to((TypeLiteral) TypeLiteral.get(Types.newParameterizedType(ComputeServiceContextImpl.class, syncClientType, - asyncClientType))).in(Scopes.SINGLETON); + }).to( + (TypeLiteral) TypeLiteral.get(Types.newParameterizedType(ComputeServiceContextImpl.class, + syncClientType, asyncClientType))).in(Scopes.SINGLETON); } - public class TransformingSetSupplier implements Supplier> { - private final Supplier> backingSupplier; - private final Function converter; + @Provides + @Singleton + protected Supplier> provideLocations(final ComputeServiceAdapter adapter, + Function transformer) { + return new TransformingSetSupplier(new Supplier>() { - public TransformingSetSupplier(Supplier> backingSupplier, Function converter) { - this.backingSupplier = checkNotNull(backingSupplier, "backingSupplier"); - this.converter = checkNotNull(converter, "converter"); - } - - @Override - public Set get() { - return newHashSet(transform(backingSupplier.get(), converter)); - } + @Override + public Iterable get() { + return adapter.listLocations(); + } + }, transformer); } @Provides @Singleton protected Supplier> provideHardware(final ComputeServiceAdapter adapter, - Function transformer) { + Function transformer) { return new TransformingSetSupplier(new Supplier>() { @Override @@ -107,7 +101,7 @@ public class ComputeServiceAdapterContextModule extends BaseCo @Provides @Singleton protected Supplier> provideImages(final ComputeServiceAdapter adapter, - Function transformer) { + Function transformer) { return new TransformingSetSupplier(new Supplier>() { @Override @@ -118,25 +112,6 @@ public class ComputeServiceAdapterContextModule extends BaseCo }, transformer); } - protected void bindDefaultLocation() { - bind(new TypeLiteral>() { - }).to(OnlyLocationOrFirstZone.class); - } - - @Provides - @Singleton - protected Supplier> provideLocations(final ComputeServiceAdapter adapter, - Function transformer) { - return new TransformingSetSupplier(new Supplier>() { - - @Override - public Iterable get() { - return adapter.listLocations(); - } - - }, transformer); - } - @Provides @Singleton protected AddNodeWithTagStrategy defineAddNodeWithTagStrategy(AdaptingComputeServiceStrategies in) { diff --git a/compute/src/main/java/org/jclouds/compute/domain/TemplateBuilder.java b/compute/src/main/java/org/jclouds/compute/domain/TemplateBuilder.java index b8f07f9e3f..34ba375446 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/TemplateBuilder.java +++ b/compute/src/main/java/org/jclouds/compute/domain/TemplateBuilder.java @@ -155,4 +155,5 @@ public interface TemplateBuilder { * options such as inbound ports and run scripts. */ TemplateBuilder options(TemplateOptions options); + } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java b/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java index f51537a688..6204a3c089 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java +++ b/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java @@ -140,7 +140,8 @@ public class TemplateBuilderImpl implements TemplateBuilder { boolean returnVal = true; if (location != null && input.getLocation() != null) returnVal = location.equals(input.getLocation()) || location.getParent() != null - && location.getParent().equals(input.getLocation()); + && location.getParent().equals(input.getLocation()) || location.getParent().getParent() != null + && location.getParent().getParent().equals(input.getLocation()); return returnVal; } @@ -497,19 +498,24 @@ public class TemplateBuilderImpl implements TemplateBuilder { */ @Override public TemplateBuilder locationId(final String locationId) { - this.location = Iterables.find(locations.get(), new Predicate() { + Set locations = this.locations.get(); + try { + this.location = Iterables.find(locations, new Predicate() { - @Override - public boolean apply(Location input) { - return input.getId().equals(locationId); - } + @Override + public boolean apply(Location input) { + return input.getId().equals(locationId); + } - @Override - public String toString() { - return "locationId(" + locationId + ")"; - } + @Override + public String toString() { + return "locationId(" + locationId + ")"; + } - }); + }); + } catch (NoSuchElementException e) { + throw new NoSuchElementException(String.format("location id %s not found in: %s", locationId, locations)); + } return this; } 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 ce5db29dba..c96a3ad16c 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,8 +20,8 @@ package org.jclouds.compute.stub.config; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; +import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; import javax.inject.Inject; @@ -41,8 +41,7 @@ import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.location.suppliers.JustProvider; import org.jclouds.rest.ResourceNotFoundException; import com.google.common.base.Supplier; @@ -62,27 +61,27 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda private final String publicIpPrefix; private final String privateIpPrefix; private final String passwordPrefix; - private final String providerName; + private final Supplier> locationSupplier; 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.location.Provider String providerName, Map> osToVersionMap) { + @Named("NODE_ID") Provider idProvider, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix, + @Named("PRIVATE_IP_PREFIX") String privateIpPrefix, @Named("PASSWORD_PREFIX") String passwordPrefix, + JustProvider locationSupplier, Map> osToVersionMap) { this.nodes = nodes; this.location = location; this.idProvider = idProvider; this.publicIpPrefix = publicIpPrefix; this.privateIpPrefix = privateIpPrefix; this.passwordPrefix = passwordPrefix; - this.providerName = providerName; + this.locationSupplier = locationSupplier; 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); @@ -105,25 +104,22 @@ 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 public Iterable listImages() { - Location zone = location.get().getParent(); - String parentId = zone.getId(); Credentials defaultCredentials = new Credentials("root", null); 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())) { + for (String version : Sets.newLinkedHashSet(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()); + images.add(new ImageBuilder().ids(id++ + "").name(osVersions.getKey().name()).location(location.get()) + .operatingSystem(new OperatingSystem(osVersions.getKey(), desc, version, null, desc, is64Bit)) + .description(desc).defaultCredentials(defaultCredentials).build()); } } return images; @@ -134,13 +130,10 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda return nodes.values(); } + @SuppressWarnings("unchecked") @Override public Iterable listLocations() { - Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); - Location region = new LocationImpl(LocationScope.REGION, providerName + "region", providerName + "region", - provider); - return ImmutableSet. of(new LocationImpl(LocationScope.ZONE, providerName + "zone", providerName - + "zone", region)); + return (Iterable) locationSupplier.get(); } @Override diff --git a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceContextModule.java b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceContextModule.java index a9547a6192..e2fe0210a5 100644 --- a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceContextModule.java @@ -26,8 +26,12 @@ import javax.inject.Singleton; import org.jclouds.compute.config.JCloudsNativeComputeServiceAdapterContextModule; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.concurrent.SingleThreaded; +import org.jclouds.domain.Location; +import org.jclouds.location.suppliers.OnlyLocationOrFirstZone; +import com.google.common.base.Supplier; import com.google.inject.Provides; +import com.google.inject.TypeLiteral; /** * @@ -36,7 +40,7 @@ import com.google.inject.Provides; @SuppressWarnings("rawtypes") @SingleThreaded public class StubComputeServiceContextModule extends - JCloudsNativeComputeServiceAdapterContextModule { + JCloudsNativeComputeServiceAdapterContextModule { public StubComputeServiceContextModule() { super(ConcurrentMap.class, ConcurrentMap.class, StubComputeServiceAdapter.class); @@ -51,6 +55,8 @@ public class StubComputeServiceContextModule extends @Override protected void configure() { install(new StubComputeServiceDependenciesModule()); + bind(new TypeLiteral>() { + }).to(OnlyLocationOrFirstZone.class); super.configure(); } } diff --git a/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java b/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java index 9d19ff1539..9fc48f5276 100644 --- a/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/BaseTemplateBuilderLiveTest.java @@ -39,6 +39,8 @@ import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; import org.jclouds.json.Json; import org.jclouds.json.config.GsonModule; import org.jclouds.logging.log4j.config.Log4JLoggingModule; @@ -174,6 +176,53 @@ public abstract class BaseTemplateBuilderLiveTest { assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } + protected abstract Set getIso3166Codes(); + + @Test(groups = { "integration", "live" }) + public void testGetAssignableLocations() throws Exception { + assertProvider(context.getProviderSpecificContext()); + for (Location location : context.getComputeService().listAssignableLocations()) { + System.err.printf("location %s%n", location); + assert location.getId() != null : location; + assert location != location.getParent() : location; + assert location.getScope() != null : location; + switch (location.getScope()) { + case PROVIDER: + assertProvider(location); + break; + case REGION: + assertProvider(location.getParent()); + assert location.getIso3166Codes().size() == 0 + || location.getParent().getIso3166Codes().containsAll(location.getIso3166Codes()) : location + + " ||" + 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); + assert location.getIso3166Codes().size() == 0 + || location.getParent().getIso3166Codes().containsAll(location.getIso3166Codes()) : location + + " ||" + location.getParent(); + 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; + } + } + } + + void assertProvider(Location provider) { + assertEquals(provider.getScope(), LocationScope.PROVIDER); + assertEquals(provider.getParent(), null); + assertEquals(provider.getIso3166Codes(), getIso3166Codes()); + } + @AfterTest protected void cleanup() throws InterruptedException, ExecutionException, TimeoutException { context.close(); diff --git a/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java index a13843e384..16473f4e11 100644 --- a/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java +++ b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java @@ -43,9 +43,9 @@ public class ComputeServiceContextFactoryTest { public void testStandalone() { @SuppressWarnings("rawtypes") ComputeServiceContext context = new ComputeServiceContextFactory() - .createContext(new StandaloneComputeServiceContextSpec( - "stub", "stub", "1", "identity", "credential", ConcurrentMap.class, - StubComputeServiceContextBuilder.class, ImmutableSet. of())); + .createContext(new StandaloneComputeServiceContextSpec( + "stub", "stub", "1", "", "identity", "credential", ConcurrentMap.class, + StubComputeServiceContextBuilder.class, ImmutableSet. of())); context.getComputeService().listNodes(); } diff --git a/compute/src/test/java/org/jclouds/compute/StubTemplateBuilderIntegrationTest.java b/compute/src/test/java/org/jclouds/compute/StubTemplateBuilderIntegrationTest.java index 2ae0e58692..64d7f2cd4b 100644 --- a/compute/src/test/java/org/jclouds/compute/StubTemplateBuilderIntegrationTest.java +++ b/compute/src/test/java/org/jclouds/compute/StubTemplateBuilderIntegrationTest.java @@ -19,8 +19,12 @@ package org.jclouds.compute; +import java.util.Set; + import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; + /** * * @@ -38,4 +42,9 @@ public class StubTemplateBuilderIntegrationTest extends BaseTemplateBuilderLiveT identity = "stub"; credential = "stub"; } + + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of(); + } } \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/Constants.java b/core/src/main/java/org/jclouds/Constants.java index fd7dff67bb..fae9afb416 100644 --- a/core/src/main/java/org/jclouds/Constants.java +++ b/core/src/main/java/org/jclouds/Constants.java @@ -19,6 +19,9 @@ package org.jclouds; +import org.jclouds.domain.Location; +import org.jclouds.location.reference.LocationConstants; + /** * Constants used in jclouds services. * @@ -194,6 +197,7 @@ public interface Constants { * api. */ public static final String PROPERTY_ENDPOINT = "jclouds.endpoint"; + /** * String property. *

@@ -201,6 +205,15 @@ public interface Constants { */ public static final String PROPERTY_IDENTITY = "jclouds.identity"; + /** + * String property. default("") + *

+ * comma-delimited iso 3166 codes; ex. US-CA,US + * + * @see Location#getIso3166Codes + */ + public static final String PROPERTY_ISO3166_CODES = "jclouds." + LocationConstants.ISO3166_CODES; + /** * String property. *

diff --git a/core/src/main/java/org/jclouds/PropertiesBuilder.java b/core/src/main/java/org/jclouds/PropertiesBuilder.java index 21a312ca19..a543ff91b1 100755 --- a/core/src/main/java/org/jclouds/PropertiesBuilder.java +++ b/core/src/main/java/org/jclouds/PropertiesBuilder.java @@ -25,6 +25,7 @@ import static org.jclouds.Constants.PROPERTY_CREDENTIAL; import static org.jclouds.Constants.PROPERTY_ENDPOINT; import static org.jclouds.Constants.PROPERTY_IDENTITY; import static org.jclouds.Constants.PROPERTY_IO_WORKER_THREADS; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.Constants.PROPERTY_MAX_CONNECTIONS_PER_CONTEXT; import static org.jclouds.Constants.PROPERTY_MAX_CONNECTIONS_PER_HOST; import static org.jclouds.Constants.PROPERTY_MAX_CONNECTION_REUSE; @@ -48,6 +49,7 @@ import java.util.Properties; import javax.annotation.Nullable; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Joiner; /** * Builds properties used in Http engines @@ -201,6 +203,7 @@ public class PropertiesBuilder { protected Properties defaultProperties() { Properties props = new Properties(); + props.setProperty(PROPERTY_ISO3166_CODES, ""); props.setProperty(PROPERTY_MAX_CONNECTIONS_PER_CONTEXT, 20 + ""); props.setProperty(PROPERTY_MAX_CONNECTIONS_PER_HOST, 0 + ""); props.setProperty(PROPERTY_SO_TIMEOUT, 60000 + ""); @@ -228,6 +231,11 @@ public class PropertiesBuilder { return this; } + public PropertiesBuilder iso3166Codes(Iterable codes) { + properties.setProperty(PROPERTY_ISO3166_CODES, Joiner.on(',').join(codes)); + return this; + } + public PropertiesBuilder apiVersion(String apiVersion) { properties.setProperty(PROPERTY_API_VERSION, apiVersion); return this; diff --git a/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java b/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java index f7fc29acb0..1d69a2b2d0 100644 --- a/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java +++ b/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java @@ -21,7 +21,7 @@ package org.jclouds.collect; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.transform; -import static com.google.common.collect.Sets.newHashSet; +import static com.google.common.collect.Sets.newLinkedHashSet; import java.util.Set; @@ -43,7 +43,7 @@ public class TransformingSetSupplier implements Supplier> @Override public Set get() { - return newHashSet(transform(backingSupplier.get(), converter)); + return newLinkedHashSet(transform(backingSupplier.get(), converter)); } } diff --git a/core/src/main/java/org/jclouds/domain/Location.java b/core/src/main/java/org/jclouds/domain/Location.java index f9b9aed0cd..15918552cd 100644 --- a/core/src/main/java/org/jclouds/domain/Location.java +++ b/core/src/main/java/org/jclouds/domain/Location.java @@ -19,15 +19,18 @@ package org.jclouds.domain; +import java.util.Map; +import java.util.Set; + /** - * Running Operating system + * Description of where a resource is running. Note this can be physical or virtual. * * @author Adrian Cole */ public interface Location { /** - * Scope of the location, ex. region, datacenter + * Scope of the location, ex. region, zone, host * */ LocationScope getScope(); @@ -48,4 +51,16 @@ public interface Location { */ Location getParent(); + /** + * @return immutable set of metadata relating to this location + */ + Map getMetadata(); + + /** + * @return if known, the IS0 3166 or 3166-2 divisions where this service may run. ex. a set of + * strings like "US" or "US-CA"; otherwise returns an empty list. + * @see 3166 + */ + Set getIso3166Codes(); } \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/domain/LocationBuilder.java b/core/src/main/java/org/jclouds/domain/LocationBuilder.java new file mode 100644 index 0000000000..4a7207b8cc --- /dev/null +++ b/core/src/main/java/org/jclouds/domain/LocationBuilder.java @@ -0,0 +1,77 @@ +/** + * + * 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.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Map; +import java.util.Set; + +import org.jclouds.domain.internal.LocationImpl; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +/** + * + * @author Adrian Cole + */ +public class LocationBuilder { + protected LocationScope scope; + protected String id; + protected String description; + protected Location parent; + protected Set iso3166Codes = ImmutableSet.of(); + protected Map metadata = ImmutableMap.of(); + + public LocationBuilder scope(LocationScope scope) { + this.scope = scope; + return this; + } + + public LocationBuilder id(String id) { + this.id = id; + return this; + } + + public LocationBuilder description(String description) { + this.description = description; + return this; + } + + public LocationBuilder parent(Location parent) { + this.parent = parent; + return this; + } + + public LocationBuilder iso3166Codes(Iterable iso3166Codes) { + this.iso3166Codes = ImmutableSet.copyOf(checkNotNull(iso3166Codes, "iso3166Codes")); + return this; + } + + public LocationBuilder metadata(Map metadata) { + this.metadata = ImmutableMap.copyOf(checkNotNull(metadata, "metadata")); + return this; + } + + public Location build() { + return new LocationImpl(scope, id, description, parent, iso3166Codes, metadata); + } +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/domain/internal/LocationImpl.java b/core/src/main/java/org/jclouds/domain/internal/LocationImpl.java index d955704d21..a1e28fac1b 100644 --- a/core/src/main/java/org/jclouds/domain/internal/LocationImpl.java +++ b/core/src/main/java/org/jclouds/domain/internal/LocationImpl.java @@ -22,19 +22,22 @@ package org.jclouds.domain.internal; import static com.google.common.base.Preconditions.checkNotNull; import java.io.Serializable; +import java.util.Map; +import java.util.Set; import javax.annotation.Nullable; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + /** - * Idpayload of the object * * @author Adrian Cole */ public class LocationImpl implements Location, Serializable { - /** The serialVersionUID */ private static final long serialVersionUID = -280558162576368264L; @@ -42,36 +45,75 @@ public class LocationImpl implements Location, Serializable { private final String id; private final String description; private final Location parent; + private final Set iso3166Codes; + private final Map metadata; - public LocationImpl(LocationScope scope, String id, String description, @Nullable Location parent) { + public LocationImpl(LocationScope scope, String id, String description, @Nullable Location parent, + Iterable iso3166Codes, Map metadata) { this.scope = checkNotNull(scope, "scope"); this.id = checkNotNull(id, "id"); this.description = checkNotNull(description, "description"); + this.metadata = ImmutableMap.copyOf(checkNotNull(metadata, "metadata")); + this.iso3166Codes = ImmutableSet.copyOf(checkNotNull(iso3166Codes, "iso3166Codes")); this.parent = parent; } + /** + * {@inheritDoc} + */ + @Override public LocationScope getScope() { return scope; } + /** + * {@inheritDoc} + */ + @Override public String getId() { return id; } + /** + * {@inheritDoc} + */ + @Override public String getDescription() { return description; } + /** + * {@inheritDoc} + */ + @Override public Location getParent() { return parent; } + /** + * {@inheritDoc} + */ + @Override + public Set getIso3166Codes() { + return iso3166Codes; + } + + /** + * {@inheritDoc} + */ + @Override + public Map getMetadata() { + return metadata; + } + @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((description == null) ? 0 : description.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((iso3166Codes == null) ? 0 : iso3166Codes.hashCode()); + result = prime * result + ((metadata == null) ? 0 : metadata.hashCode()); result = prime * result + ((parent == null) ? 0 : parent.hashCode()); result = prime * result + ((scope == null) ? 0 : scope.hashCode()); return result; @@ -96,6 +138,16 @@ public class LocationImpl implements Location, Serializable { return false; } else if (!id.equals(other.id)) return false; + if (iso3166Codes == null) { + if (other.iso3166Codes != null) + return false; + } else if (!iso3166Codes.equals(other.iso3166Codes)) + return false; + if (metadata == null) { + if (other.metadata != null) + return false; + } else if (!metadata.equals(other.metadata)) + return false; if (parent == null) { if (other.parent != null) return false; @@ -112,7 +164,8 @@ public class LocationImpl implements Location, Serializable { @Override public String toString() { return "[id=" + id + ", scope=" + scope + ", description=" + description + ", parent=" - + ((parent == null) ? null : parent.getId()) + "]"; + + ((parent == null) ? null : parent.getId()) + ", iso3166Codes=" + iso3166Codes + ", metadata=" + + metadata + "]"; } } \ No newline at end of file diff --git a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DatacenterToLocation.java b/core/src/main/java/org/jclouds/location/Iso3166.java similarity index 61% rename from sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DatacenterToLocation.java rename to core/src/main/java/org/jclouds/location/Iso3166.java index abf2b4ccf2..4e59544fb0 100644 --- a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DatacenterToLocation.java +++ b/core/src/main/java/org/jclouds/location/Iso3166.java @@ -17,26 +17,24 @@ * ==================================================================== */ -package org.jclouds.libvirt.compute.functions; +package org.jclouds.location; -import javax.inject.Singleton; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.libvirt.Datacenter; - -import com.google.common.base.Function; +import javax.inject.Qualifier; /** + * Related to a Iso3166 code + * * @author Adrian Cole + * */ -@Singleton -public class DatacenterToLocation implements Function { +@Retention(value = RetentionPolicy.RUNTIME) +@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD }) +@Qualifier +public @interface Iso3166 { - @Override - public Location apply(Datacenter from) { - return new LocationImpl(LocationScope.ZONE, from.id + "", from.name, null); - } - -} +} \ No newline at end of file diff --git a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtNodeToLocation.java b/core/src/main/java/org/jclouds/location/config/JustProviderLocationModule.java similarity index 50% rename from sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtNodeToLocation.java rename to core/src/main/java/org/jclouds/location/config/JustProviderLocationModule.java index ac7e71d4f9..bda125d1fa 100644 --- a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtNodeToLocation.java +++ b/core/src/main/java/org/jclouds/location/config/JustProviderLocationModule.java @@ -17,26 +17,40 @@ * ==================================================================== */ -package org.jclouds.libvirt.compute.functions; +package org.jclouds.location.config; -import javax.inject.Singleton; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.libvirt.Datacenter; +import org.jclouds.location.suppliers.JustProvider; +import org.jclouds.location.suppliers.OnlyLocationOrFirstZone; +import org.jclouds.rest.AuthorizationException; -import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.inject.TypeLiteral; /** + * * @author Adrian Cole + * */ -@Singleton -public class LibvirtNodeToLocation implements Function { - - @Override - public Location apply(Datacenter from) { - return new LocationImpl(LocationScope.ZONE, from.id + "", from.name, null); +public class JustProviderLocationModule extends LocationModule { + public JustProviderLocationModule() { + super(); } -} + public JustProviderLocationModule(AtomicReference authException) { + super(authException); + } + + @Override + protected void configure() { + bind(new TypeLiteral>>() { + }).to(JustProvider.class); + bind(new TypeLiteral>() { + }).to(OnlyLocationOrFirstZone.class); + super.configure(); + } + +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/location/config/LocationModule.java b/core/src/main/java/org/jclouds/location/config/LocationModule.java new file mode 100644 index 0000000000..22bf018804 --- /dev/null +++ b/core/src/main/java/org/jclouds/location/config/LocationModule.java @@ -0,0 +1,96 @@ +/** + * + * 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.location.config; + +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.collect.Memoized; +import org.jclouds.domain.Location; +import org.jclouds.rest.AuthorizationException; +import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.Maps; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; + +/** + * + * @author Adrian Cole + */ +public class LocationModule extends AbstractModule { + protected final AtomicReference authException; + + public LocationModule() { + this(new AtomicReference()); + } + + public LocationModule(AtomicReference authException) { + this.authException = authException; + } + + @Provides + @Singleton + protected Supplier> provideLocationMap( + @Memoized Supplier> locations) { + return Suppliers.compose(new Function, Map>() { + + @Override + public Map apply(Set from) { + return Maps.uniqueIndex(from, new Function() { + + @Override + public String apply(Location from) { + return from.getId(); + } + + }); + } + + }, locations); + } + + @Provides + @Singleton + @Memoized + protected Supplier> supplyLocationCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final Supplier> locationSupplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, seconds, + new Supplier>() { + @Override + public Set get() { + return locationSupplier.get(); + } + }); + } + + @Override + protected void configure() { + } +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/location/config/ProvideIso3166CodesByLocationIdViaProperties.java b/core/src/main/java/org/jclouds/location/config/ProvideIso3166CodesByLocationIdViaProperties.java new file mode 100644 index 0000000000..33f27623ad --- /dev/null +++ b/core/src/main/java/org/jclouds/location/config/ProvideIso3166CodesByLocationIdViaProperties.java @@ -0,0 +1,86 @@ +/** + * + * 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.location.config; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.inject.name.Names.named; +import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGION; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONE; + +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.location.Iso3166; + +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableMap.Builder; +import com.google.inject.ConfigurationException; +import com.google.inject.Injector; +import com.google.inject.Key; + +/** + * + * looks for properties bound to the naming conventions jclouds.region.{@code regionId} + * .iso3166-codes and jclouds.zone.{@code zoneId}.iso3166-codes + * + * @author Adrian Cole + */ +@Singleton +public class ProvideIso3166CodesByLocationIdViaProperties implements javax.inject.Provider>> { + + private final Injector injector; + + @Inject + ProvideIso3166CodesByLocationIdViaProperties(Injector injector) { + this.injector = checkNotNull(injector, "injector"); + } + + @Singleton + @Iso3166 + @Override + public Map> get() { + Builder> codes = ImmutableMap.> builder(); + for (String key : ImmutableSet.of(PROPERTY_REGION, PROPERTY_ZONE)) + try { + String regionString = injector.getInstance(Key.get(String.class, named(key + "s"))); + for (String region : Splitter.on(',').split(regionString)) { + try { + codes.put(region, ImmutableSet.copyOf(Splitter.on(',') + .split( + injector.getInstance(Key.get(String.class, named(key + "." + region + "." + + ISO3166_CODES)))))); + } catch (ConfigurationException e) { + // this happens if regions property isn't set + // services not run by AWS may not have regions, so this is ok. + } + } + } catch (ConfigurationException e) { + // this happens if regions property isn't set + // services not run by AWS may not have regions, so this is ok. + } + return codes.build(); + } +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/location/config/ProvideRegionToURIViaProperties.java b/core/src/main/java/org/jclouds/location/config/ProvideRegionToURIViaProperties.java index 3c5efaf94e..13bb1c1a11 100644 --- a/core/src/main/java/org/jclouds/location/config/ProvideRegionToURIViaProperties.java +++ b/core/src/main/java/org/jclouds/location/config/ProvideRegionToURIViaProperties.java @@ -19,6 +19,7 @@ package org.jclouds.location.config; +import static org.jclouds.location.reference.LocationConstants.ENDPOINT; import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGION; import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; @@ -28,7 +29,6 @@ import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; -import org.jclouds.location.Provider; import org.jclouds.location.Region; import com.google.common.base.Splitter; @@ -41,7 +41,7 @@ import com.google.inject.name.Names; /** * - * looks for properties bound to the naming convention jclouds.location.region.{@code regionId}.endpoint + * looks for properties bound to the naming convention jclouds.region.{@code regionId}.endpoint * * @author Adrian Cole */ @@ -63,17 +63,14 @@ public class ProvideRegionToURIViaProperties implements javax.inject.Provider regions = ImmutableMap. builder(); for (String region : Splitter.on(',').split(regionString)) { - regions.put( - region, - URI.create(injector.getInstance(Key.get(String.class, - Names.named(PROPERTY_REGION + "." + region + ".endpoint"))))); + regions.put(region, URI.create(injector.getInstance(Key.get(String.class, Names.named(PROPERTY_REGION + "." + + region + "." + ENDPOINT))))); } return regions.build(); } catch (ConfigurationException e) { // this happens if regions property isn't set // services not run by AWS may not have regions, so this is ok. - return ImmutableMap.of(injector.getInstance(Key.get(String.class, Provider.class)), - injector.getInstance(Key.get(URI.class, Provider.class))); + return ImmutableMap.of(); } } diff --git a/core/src/main/java/org/jclouds/location/config/ProvideRegionsViaProperties.java b/core/src/main/java/org/jclouds/location/config/RegionsLocationModule.java similarity index 57% rename from core/src/main/java/org/jclouds/location/config/ProvideRegionsViaProperties.java rename to core/src/main/java/org/jclouds/location/config/RegionsLocationModule.java index 534951e85c..b23b28cbb5 100644 --- a/core/src/main/java/org/jclouds/location/config/ProvideRegionsViaProperties.java +++ b/core/src/main/java/org/jclouds/location/config/RegionsLocationModule.java @@ -19,38 +19,29 @@ package org.jclouds.location.config; -import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; - import java.util.Set; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; +import org.jclouds.domain.Location; +import org.jclouds.location.suppliers.OnlyLocationOrFirstZoneOrRegionMatchingRegionId; +import org.jclouds.location.suppliers.RegionToProviderOrJustProvider; -import org.jclouds.location.Region; - -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableSet; +import com.google.common.base.Supplier; +import com.google.inject.TypeLiteral; /** * * @author Adrian Cole + * */ -@Singleton -public class ProvideRegionsViaProperties implements javax.inject.Provider> { +public class RegionsLocationModule extends LocationModule { - private final Set regions; - - @Inject - ProvideRegionsViaProperties(@Named(PROPERTY_REGIONS) String regions) { - this.regions = ImmutableSet.copyOf(Splitter.on(',').split(regions)); - } - - @Singleton - @Region @Override - public Set get() { - return regions; + protected void configure() { + bind(new TypeLiteral>>() { + }).to(RegionToProviderOrJustProvider.class); + bind(new TypeLiteral>() { + }).to(OnlyLocationOrFirstZoneOrRegionMatchingRegionId.class); + super.configure(); } } \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/location/reference/LocationConstants.java b/core/src/main/java/org/jclouds/location/reference/LocationConstants.java index 19a6667d31..c023db0954 100644 --- a/core/src/main/java/org/jclouds/location/reference/LocationConstants.java +++ b/core/src/main/java/org/jclouds/location/reference/LocationConstants.java @@ -24,6 +24,10 @@ package org.jclouds.location.reference; * @author Adrian Cole */ public interface LocationConstants { - public static final String PROPERTY_REGIONS = "jclouds.location.regions"; - public static final String PROPERTY_REGION = "jclouds.location.region"; + public static final String ENDPOINT = "endpoint"; + public static final String ISO3166_CODES = "iso3166-codes"; + public static final String PROPERTY_REGIONS = "jclouds.regions"; + public static final String PROPERTY_REGION = "jclouds.region"; + public static final String PROPERTY_ZONES = "jclouds.zones"; + public static final String PROPERTY_ZONE = "jclouds.zone"; } diff --git a/core/src/main/java/org/jclouds/location/suppliers/SupplyPredefinedRegions.java b/core/src/main/java/org/jclouds/location/suppliers/JustProvider.java similarity index 61% rename from core/src/main/java/org/jclouds/location/suppliers/SupplyPredefinedRegions.java rename to core/src/main/java/org/jclouds/location/suppliers/JustProvider.java index 98c50a55be..9699cf99a2 100644 --- a/core/src/main/java/org/jclouds/location/suppliers/SupplyPredefinedRegions.java +++ b/core/src/main/java/org/jclouds/location/suppliers/JustProvider.java @@ -19,6 +19,8 @@ package org.jclouds.location.suppliers; +import static com.google.common.base.Preconditions.checkNotNull; + import java.net.URI; import java.util.Set; @@ -26,39 +28,35 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.location.Iso3166; import org.jclouds.location.Provider; -import org.jclouds.location.Region; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSet.Builder; /** * * @author Adrian Cole */ @Singleton -public class SupplyPredefinedRegions implements Supplier> { - private final Set regions; +public class JustProvider implements Supplier> { private final String providerName; private final URI endpoint; + private final Set isoCodes; @Inject - SupplyPredefinedRegions(@Region Set regions, @Provider String providerName, @Provider URI endpoint) { - this.regions = regions; - this.providerName = providerName; - this.endpoint = endpoint; + public JustProvider(@Iso3166 Set isoCodes, @Provider String providerName, @Provider URI endpoint) { + this.providerName = checkNotNull(providerName, "providerName"); + this.endpoint = checkNotNull(endpoint, "endpoint"); + this.isoCodes = checkNotNull(isoCodes, "isoCodes"); } @Override public Set get() { - Builder locations = ImmutableSet.builder(); - Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, endpoint.toASCIIString(), null); - for (String zone : regions) { - locations.add(new LocationImpl(LocationScope.REGION, zone.toString(), zone.toString(), provider)); - } - return locations.build(); + return ImmutableSet.of(new LocationBuilder().scope(LocationScope.PROVIDER).id(providerName).description( + endpoint.toASCIIString()).iso3166Codes(isoCodes).build()); } + } \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/location/suppliers/OnlyLocationOrFirstZoneOrRegionMatchingRegionId.java b/core/src/main/java/org/jclouds/location/suppliers/OnlyLocationOrFirstZoneOrRegionMatchingRegionId.java index 221693b836..65023641a6 100644 --- a/core/src/main/java/org/jclouds/location/suppliers/OnlyLocationOrFirstZoneOrRegionMatchingRegionId.java +++ b/core/src/main/java/org/jclouds/location/suppliers/OnlyLocationOrFirstZoneOrRegionMatchingRegionId.java @@ -36,6 +36,8 @@ import org.jclouds.location.Region; import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.collect.Iterables; +import com.google.inject.Injector; +import com.google.inject.Key; /** * @author Adrian Cole @@ -55,12 +57,12 @@ public class OnlyLocationOrFirstZoneOrRegionMatchingRegionId implements Supplier @Override public boolean apply(Location input) { switch (input.getScope()) { - case ZONE: - return input.getParent().getId().equals(region); - case REGION: - return input.getId().equals(region); - default: - return false; + case ZONE: + return input.getParent().getId().equals(region); + case REGION: + return input.getId().equals(region); + default: + return false; } } @@ -70,13 +72,13 @@ public class OnlyLocationOrFirstZoneOrRegionMatchingRegionId implements Supplier } } - private final IsRegionAndIdEqualsOrIsZoneParentIdEquals matcher; + private final Injector injector; private final Supplier> locationsSupplier; @Inject - OnlyLocationOrFirstZoneOrRegionMatchingRegionId(IsRegionAndIdEqualsOrIsZoneParentIdEquals matcher, - @Memoized Supplier> locationsSupplier) { - this.matcher = checkNotNull(matcher, "matcher"); + OnlyLocationOrFirstZoneOrRegionMatchingRegionId(Injector injector, + @Memoized Supplier> locationsSupplier) { + this.injector = checkNotNull(injector, "injector"); this.locationsSupplier = checkNotNull(locationsSupplier, "locationsSupplier"); } @@ -86,7 +88,12 @@ public class OnlyLocationOrFirstZoneOrRegionMatchingRegionId implements Supplier Set locations = locationsSupplier.get(); if (locationsSupplier.get().size() == 1) return getOnlyElement(locationsSupplier.get()); + IsRegionAndIdEqualsOrIsZoneParentIdEquals matcher = null; try { + String region = injector.getInstance(Key.get(String.class, Region.class)); + if (region == null) + return Iterables.get(locationsSupplier.get(), 0); + matcher = injector.getInstance(IsRegionAndIdEqualsOrIsZoneParentIdEquals.class); Location toReturn = Iterables.find(locations, matcher); return toReturn.getScope() == LocationScope.REGION ? toReturn : toReturn.getParent(); } catch (NoSuchElementException e) { diff --git a/core/src/main/java/org/jclouds/location/suppliers/RegionToProviderOrJustProvider.java b/core/src/main/java/org/jclouds/location/suppliers/RegionToProviderOrJustProvider.java index f4abd9c546..ee030b6521 100644 --- a/core/src/main/java/org/jclouds/location/suppliers/RegionToProviderOrJustProvider.java +++ b/core/src/main/java/org/jclouds/location/suppliers/RegionToProviderOrJustProvider.java @@ -21,50 +21,60 @@ package org.jclouds.location.suppliers; import static com.google.common.base.Preconditions.checkNotNull; +import java.net.URI; +import java.util.Map; import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.location.Iso3166; import org.jclouds.location.Provider; import org.jclouds.location.Region; -import com.google.common.base.Function; -import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.common.collect.ImmutableSet.Builder; /** * * @author Adrian Cole */ @Singleton -public class RegionToProviderOrJustProvider implements Supplier> { +public class RegionToProviderOrJustProvider extends JustProvider { private final Set regions; - private final String providerName; + private final Map> isoCodesById; @Inject - RegionToProviderOrJustProvider(@Region Set regions, @Provider String providerName) { + public RegionToProviderOrJustProvider(@Iso3166 Set isoCodes, @Provider String providerName, + @Provider URI endpoint, @Region Set regions, @Iso3166 Map> isoCodesById) { + super(isoCodes, providerName, endpoint); this.regions = checkNotNull(regions, "regions"); - this.providerName = checkNotNull(providerName, "providerName"); + this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById"); } @Override public Set get() { - final Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); + return buildJustProviderOrRegions().build(); + } + + protected Builder buildJustProviderOrRegions() { + Builder locations = ImmutableSet.builder(); + Location provider = Iterables.getOnlyElement(super.get()); if (regions.size() == 0) - return ImmutableSet.of(provider); - return ImmutableSet. copyOf(Iterables.transform(regions, new Function() { - - @Override - public Location apply(String input) { - return new LocationImpl(LocationScope.REGION, input, input, provider); + return locations.add(provider); + else + for (String region : regions) { + LocationBuilder builder = new LocationBuilder().scope(LocationScope.REGION).id(region).description(region) + .parent(provider); + if (isoCodesById.containsKey(region)) + builder.iso3166Codes(isoCodesById.get(region)); + locations.add(builder.build()); } - - })); + return locations; } } \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/location/suppliers/ZoneToRegionToProviderOrJustProvider.java b/core/src/main/java/org/jclouds/location/suppliers/ZoneToRegionToProviderOrJustProvider.java index 15dd7f661b..7735fa83f9 100644 --- a/core/src/main/java/org/jclouds/location/suppliers/ZoneToRegionToProviderOrJustProvider.java +++ b/core/src/main/java/org/jclouds/location/suppliers/ZoneToRegionToProviderOrJustProvider.java @@ -21,8 +21,8 @@ package org.jclouds.location.suppliers; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Maps.uniqueIndex; -import static com.google.common.collect.Sets.newLinkedHashSet; +import java.net.URI; import java.util.Map; import java.util.Set; @@ -30,50 +30,61 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.location.Iso3166; import org.jclouds.location.Provider; import org.jclouds.location.Zone; import com.google.common.base.Function; -import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet.Builder; /** * * @author Adrian Cole */ @Singleton -public class ZoneToRegionToProviderOrJustProvider implements Supplier> { +public class ZoneToRegionToProviderOrJustProvider extends RegionToProviderOrJustProvider { private final Map zoneToRegion; - private final String providerName; + private Map> isoCodesById; @Inject - ZoneToRegionToProviderOrJustProvider(@Zone Map zoneToRegion, @Provider String providerName) { - this.zoneToRegion = checkNotNull(zoneToRegion, "zoneToRegion"); - this.providerName = checkNotNull(providerName, "providerName"); + ZoneToRegionToProviderOrJustProvider(@Iso3166 Set isoCodes, @Provider String providerName, + @Provider URI endpoint, @Iso3166 Map> isoCodesById, + @Zone Map zoneToRegion) { + super(isoCodes, providerName, endpoint, ImmutableSet.copyOf(checkNotNull(zoneToRegion, "zoneToRegion").values()), + isoCodesById); + this.zoneToRegion = zoneToRegion; + this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById"); } @Override public Set get() { - Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); - if (zoneToRegion.size() == 0) - return ImmutableSet.of(provider); - Set providers = newLinkedHashSet(); - for (String region : newLinkedHashSet(zoneToRegion.values())) { - providers.add(new LocationImpl(LocationScope.REGION, region, region, provider)); - } - ImmutableMap idToLocation = uniqueIndex(providers, new Function() { + Builder locations = buildJustProviderOrRegions(); + ImmutableMap idToLocation = uniqueIndex(locations.build(), new Function() { @Override public String apply(Location from) { return from.getId(); } }); + if (zoneToRegion.size() == 1) + return locations.build(); for (String zone : zoneToRegion.keySet()) { - providers.add(new LocationImpl(LocationScope.ZONE, zone, zone, idToLocation.get(zoneToRegion.get(zone)))); + Location parent = idToLocation.get(zoneToRegion.get(zone)); + LocationBuilder builder = new LocationBuilder().scope(LocationScope.ZONE).id(zone).description(zone).parent( + parent); + if (isoCodesById.containsKey(zone)) + builder.iso3166Codes(isoCodesById.get(zone)); + // be cautious.. only inherit iso codes if the parent is a region + // regions may be added dynamically, and we prefer to inherit an + // empty set of codes from a region, then a provider, whose code + // are likely hard-coded. + else if (parent.getScope() == LocationScope.REGION) + builder.iso3166Codes(parent.getIso3166Codes()); + locations.add(builder.build()); } - return providers; + return locations.build(); } - } \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/rest/RestContext.java b/core/src/main/java/org/jclouds/rest/RestContext.java index 116e2313bd..0aca54a739 100755 --- a/core/src/main/java/org/jclouds/rest/RestContext.java +++ b/core/src/main/java/org/jclouds/rest/RestContext.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.concurrent.Future; import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; import org.jclouds.rest.internal.RestContextImpl; import com.google.common.annotations.Beta; @@ -40,7 +41,7 @@ import com.google.inject.ImplementedBy; * */ @ImplementedBy(RestContextImpl.class) -public interface RestContext { +public interface RestContext extends Location { /** * low-level api to the cloud. Threadsafe implementations will return a singleton. @@ -59,6 +60,10 @@ public interface RestContext { URI getEndpoint(); + String getApiVersion(); + + String getIdentity(); + /** * retrieves a list of credentials for resources created within this context, keyed on {@code id} * of the resource. We are testing this approach for resources such as compute nodes, where you @@ -71,12 +76,6 @@ public interface RestContext { @Beta Map credentialStore(); - String getIdentity(); - - String getProvider(); - - String getApiVersion(); - Utils getUtils(); /** diff --git a/core/src/main/java/org/jclouds/rest/RestContextBuilder.java b/core/src/main/java/org/jclouds/rest/RestContextBuilder.java index 3a8fe09510..8bfc110009 100755 --- a/core/src/main/java/org/jclouds/rest/RestContextBuilder.java +++ b/core/src/main/java/org/jclouds/rest/RestContextBuilder.java @@ -20,17 +20,30 @@ package org.jclouds.rest; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Predicates.equalTo; +import static com.google.common.base.Predicates.instanceOf; +import static com.google.common.base.Predicates.not; +import static com.google.common.base.Splitter.on; +import static com.google.common.collect.Iterables.addAll; +import static com.google.common.collect.Iterables.any; +import static com.google.common.collect.Iterables.filter; +import static com.google.inject.Scopes.SINGLETON; +import static com.google.inject.name.Names.bindProperties; +import static com.google.inject.util.Types.newParameterizedType; import static org.jclouds.Constants.PROPERTY_API; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_CREDENTIAL; import static org.jclouds.Constants.PROPERTY_ENDPOINT; import static org.jclouds.Constants.PROPERTY_IDENTITY; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.Constants.PROPERTY_PROVIDER; import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Properties; +import java.util.Set; import javax.inject.Inject; @@ -41,7 +54,9 @@ import org.jclouds.concurrent.config.ExecutorServiceModule; import org.jclouds.http.RequiresHttp; import org.jclouds.http.config.ConfiguresHttpCommandExecutorService; import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; +import org.jclouds.location.Iso3166; import org.jclouds.location.Provider; +import org.jclouds.location.config.ProvideIso3166CodesByLocationIdViaProperties; import org.jclouds.logging.config.LoggingModule; import org.jclouds.logging.jdk.config.JDKLoggingModule; import org.jclouds.rest.annotations.Api; @@ -55,17 +70,13 @@ import org.jclouds.rest.internal.RestContextImpl; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; -import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; +import com.google.common.collect.ImmutableSet; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; -import com.google.inject.Scopes; import com.google.inject.TypeLiteral; -import com.google.inject.name.Names; -import com.google.inject.util.Types; /** * Creates {@link RestContext} or {@link Injector} instances based on the most commonly requested @@ -94,18 +105,25 @@ public class RestContextBuilder { Properties toBind = new Properties(); toBind.putAll(checkNotNull(properties, "properties")); toBind.putAll(System.getProperties()); - Names.bindProperties(binder(), toBind); + bindProperties(binder(), toBind); bind(String.class).annotatedWith(Provider.class).toInstance( - checkNotNull(toBind.getProperty(PROPERTY_PROVIDER), PROPERTY_PROVIDER)); + checkNotNull(toBind.getProperty(PROPERTY_PROVIDER), PROPERTY_PROVIDER)); bind(URI.class).annotatedWith(Provider.class).toInstance( - URI.create(checkNotNull(toBind.getProperty(PROPERTY_ENDPOINT), PROPERTY_ENDPOINT))); + URI.create(checkNotNull(toBind.getProperty(PROPERTY_ENDPOINT), PROPERTY_ENDPOINT))); + bind(new TypeLiteral>() { + }).annotatedWith(Iso3166.class).toInstance( + ImmutableSet.copyOf(filter(on(',').split( + checkNotNull(toBind.getProperty(PROPERTY_ISO3166_CODES), PROPERTY_ISO3166_CODES)), + not(equalTo(""))))); + bind(new TypeLiteral>>() { + }).annotatedWith(Iso3166.class).toProvider(ProvideIso3166CodesByLocationIdViaProperties.class); if (toBind.containsKey(PROPERTY_API)) bind(String.class).annotatedWith(Api.class).toInstance(toBind.getProperty(PROPERTY_API)); if (toBind.containsKey(PROPERTY_API_VERSION)) bind(String.class).annotatedWith(ApiVersion.class).toInstance(toBind.getProperty(PROPERTY_API_VERSION)); if (toBind.containsKey(PROPERTY_IDENTITY)) bind(String.class).annotatedWith(Identity.class).toInstance( - checkNotNull(toBind.getProperty(PROPERTY_IDENTITY), PROPERTY_IDENTITY)); + checkNotNull(toBind.getProperty(PROPERTY_IDENTITY), PROPERTY_IDENTITY)); if (toBind.containsKey(PROPERTY_CREDENTIAL)) bind(String.class).annotatedWith(Credential.class).toInstance(toBind.getProperty(PROPERTY_CREDENTIAL)); } @@ -124,7 +142,7 @@ public class RestContextBuilder { } public RestContextBuilder withModules(Iterable modules) { - Iterables.addAll(this.modules, modules); + addAll(this.modules, modules); return this; } @@ -142,7 +160,7 @@ public class RestContextBuilder { @VisibleForTesting protected void addLoggingModuleIfNotPresent(List modules) { - if (!Iterables.any(modules, Predicates.instanceOf(LoggingModule.class))) + if (!any(modules, instanceOf(LoggingModule.class))) modules.add(new JDKLoggingModule()); } @@ -153,7 +171,7 @@ public class RestContextBuilder { } private boolean nothingConfiguresAnHttpService(List modules) { - return (!Iterables.any(modules, new Predicate() { + return (!any(modules, new Predicate() { public boolean apply(Module input) { return input.getClass().isAnnotationPresent(ConfiguresHttpCommandExecutorService.class); } @@ -163,7 +181,7 @@ public class RestContextBuilder { @VisibleForTesting protected void addContextModuleIfNotPresent(List modules) { - if (!Iterables.any(modules, new Predicate() { + if (!any(modules, new Predicate() { public boolean apply(Module input) { return input.getClass().isAnnotationPresent(ConfiguresRestContext.class); } @@ -177,20 +195,20 @@ public class RestContextBuilder { protected void addContextModule(List modules) { modules.add(new AbstractModule() { - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings( { "unchecked", "rawtypes" }) @Override protected void configure() { bind( - (TypeLiteral) TypeLiteral.get(Types.newParameterizedType(RestContext.class, syncClientType, - asyncClientType))).to( - TypeLiteral.get(Types.newParameterizedType(RestContextImpl.class, syncClientType, asyncClientType))) - .in(Scopes.SINGLETON); + (TypeLiteral) TypeLiteral.get(newParameterizedType(RestContext.class, syncClientType, + asyncClientType))).to( + TypeLiteral.get(newParameterizedType(RestContextImpl.class, syncClientType, asyncClientType))).in( + SINGLETON); } public String toString() { - return String.format("configure rest context %s->%s", syncClientType.getSimpleName(), - asyncClientType.getSimpleName()); + return String.format("configure rest context %s->%s", syncClientType.getSimpleName(), asyncClientType + .getSimpleName()); } }); @@ -208,7 +226,7 @@ public class RestContextBuilder { } private boolean atLeastOneModuleRequiresHttp(List modules) { - return Iterables.any(modules, new Predicate() { + return any(modules, new Predicate() { public boolean apply(Module input) { return input.getClass().isAnnotationPresent(RequiresHttp.class); } @@ -223,7 +241,7 @@ public class RestContextBuilder { } private boolean restClientModulePresent(List modules) { - return Iterables.any(modules, new Predicate() { + return any(modules, new Predicate() { public boolean apply(Module input) { return input.getClass().isAnnotationPresent(ConfiguresRestClient.class); } @@ -237,20 +255,20 @@ public class RestContextBuilder { @VisibleForTesting protected void addExecutorServiceIfNotPresent(List modules) { - if (!Iterables.any(modules, new Predicate() { + if (!any(modules, new Predicate() { public boolean apply(Module input) { return input.getClass().isAnnotationPresent(ConfiguresExecutorService.class); } } )) { - if (Iterables.any(modules, new Predicate() { + if (any(modules, new Predicate() { public boolean apply(Module input) { return input.getClass().isAnnotationPresent(SingleThreaded.class); } })) { modules.add(new ExecutorServiceModule(MoreExecutors.sameThreadExecutor(), MoreExecutors - .sameThreadExecutor())); + .sameThreadExecutor())); } else { modules.add(new ExecutorServiceModule()); } @@ -259,7 +277,7 @@ public class RestContextBuilder { @VisibleForTesting protected void addCredentialStoreIfNotPresent(List modules) { - if (!Iterables.any(modules, new Predicate() { + if (!any(modules, new Predicate() { public boolean apply(Module input) { return input.getClass().isAnnotationPresent(ConfiguresCredentialStore.class); } @@ -278,7 +296,7 @@ public class RestContextBuilder { @SuppressWarnings("unchecked") public > T buildContext() { Injector injector = buildInjector(); - return (T) injector.getInstance(Key.get(Types.newParameterizedType(RestContext.class, syncClientType, - asyncClientType))); + return (T) injector + .getInstance(Key.get(newParameterizedType(RestContext.class, syncClientType, asyncClientType))); } } diff --git a/core/src/main/java/org/jclouds/rest/RestContextFactory.java b/core/src/main/java/org/jclouds/rest/RestContextFactory.java index 727bea5e67..7632adeeaa 100644 --- a/core/src/main/java/org/jclouds/rest/RestContextFactory.java +++ b/core/src/main/java/org/jclouds/rest/RestContextFactory.java @@ -35,12 +35,14 @@ import javax.annotation.Nullable; import javax.inject.Inject; import org.jclouds.PropertiesBuilder; +import org.jclouds.location.reference.LocationConstants; import org.jclouds.util.Modules2; import org.jclouds.util.Strings2; import com.google.common.base.Charsets; import com.google.common.base.Function; import com.google.common.base.Joiner; +import com.google.common.base.Splitter; import com.google.common.collect.ImmutableSet; import com.google.common.io.Files; import com.google.inject.Module; @@ -70,23 +72,24 @@ import com.google.inject.Module; public class RestContextFactory { public static RestContextSpec contextSpec(String provider, String endpoint, String apiVersion, - String identity, String credential, Class sync, Class async, - Class propertiesBuilderClass, Class> contextBuilderClass, - Iterable modules) { - return new RestContextSpec(provider, endpoint, apiVersion, identity, credential, sync, async, - propertiesBuilderClass, contextBuilderClass, modules); + String iso3166Codes, String identity, String credential, Class sync, Class async, + Class propertiesBuilderClass, Class> contextBuilderClass, + Iterable modules) { + return new RestContextSpec(provider, endpoint, apiVersion, iso3166Codes, identity, credential, sync, async, + propertiesBuilderClass, contextBuilderClass, modules); } public static RestContextSpec contextSpec(String provider, String endpoint, String apiVersion, - String identity, String credential, Class sync, Class async) { - return new RestContextSpec(provider, endpoint, apiVersion, identity, credential, sync, async); + String iso3166Codes, String identity, String credential, Class sync, Class async) { + return new RestContextSpec(provider, endpoint, apiVersion, iso3166Codes, identity, credential, sync, async); } - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings( { "unchecked", "rawtypes" }) public static RestContextSpec contextSpec(String provider, String endpoint, String apiVersion, - String identity, String credential, Class sync, Class async, Iterable modules) { - return new RestContextSpec(provider, endpoint, apiVersion, identity, credential, sync, async, - PropertiesBuilder.class, (Class) RestContextBuilder.class, modules); + String iso3166Codes, String identity, String credential, Class sync, Class async, + Iterable modules) { + return new RestContextSpec(provider, endpoint, apiVersion, iso3166Codes, identity, credential, sync, async, + PropertiesBuilder.class, (Class) RestContextBuilder.class, modules); } private final static Properties NO_PROPERTIES = new Properties(); @@ -177,9 +180,9 @@ public class RestContextFactory { /** * - * Identity will be found by searching {@code jclouds.identity} failing that - * {@code provider.identity} where provider corresponds to the parameter. Same pattern is used - * for credential ({@code jclouds.credential} failing that {@code provider.credential}). + * Identity will be found by searching {@code jclouds.identity} failing that {@code + * provider.identity} where provider corresponds to the parameter. Same pattern is used for + * credential ({@code jclouds.credential} failing that {@code provider.credential}). * * @param * Type of the provider specific client @@ -195,18 +198,18 @@ public class RestContextFactory { * properties to pass to the context. */ public RestContextBuilder createContextBuilder(String provider, Iterable wiring, - Properties overrides) { + Properties overrides) { return createContextBuilder(provider, null, null, wiring, overrides); } @SuppressWarnings("unchecked") public RestContextBuilder createContextBuilder(String provider, @Nullable String identity, - @Nullable String credential, Properties properties) { + @Nullable String credential, Properties properties) { return createContextBuilder(provider, identity, credential, EMPTY_LIST, properties); } public RestContextBuilder createContextBuilder(String provider, @Nullable String identity, - @Nullable String credential, Iterable wiring) { + @Nullable String credential, Iterable wiring) { return createContextBuilder(provider, identity, credential, wiring, NO_PROPERTIES); } @@ -226,7 +229,7 @@ public class RestContextFactory { * @return initialized context ready for use */ public RestContextBuilder createContextBuilder(String providerName, @Nullable String identity, - @Nullable String credential, Iterable wiring, Properties _overrides) { + @Nullable String credential, Iterable wiring, Properties _overrides) { checkNotNull(wiring, "wiring"); RestContextSpec contextSpec = createContextSpec(providerName, identity, credential, wiring, _overrides); return createContextBuilder(contextSpec, _overrides); @@ -239,43 +242,44 @@ public class RestContextFactory { props.setProperty(contextSpec.provider + ".endpoint", contextSpec.endpoint); props.setProperty(contextSpec.provider + ".apiversion", contextSpec.apiVersion); + props.setProperty(contextSpec.provider + "." + LocationConstants.ISO3166_CODES, contextSpec.iso3166Codes); props.setProperty(contextSpec.provider + ".identity", contextSpec.identity); if (contextSpec.credential != null) props.setProperty(contextSpec.provider + ".credential", contextSpec.credential); if (contextSpec.sync != null) { props.setProperty(contextSpec.provider + ".sync", contextSpec.sync.getName()); props.setProperty(contextSpec.provider + ".async", checkNotNull(contextSpec.async, "contextSpec.async") - .getName()); + .getName()); } else { - props.setProperty(contextSpec.provider + ".contextbuilder", - checkNotNull(contextSpec.contextBuilderClass, "contextSpec.contextBuilderClass").getName()); + props.setProperty(contextSpec.provider + ".contextbuilder", checkNotNull(contextSpec.contextBuilderClass, + "contextSpec.contextBuilderClass").getName()); - props.setProperty(contextSpec.provider + ".propertiesbuilder", - checkNotNull(contextSpec.propertiesBuilderClass, "contextSpec.propertiesBuilderClass").getName()); + props.setProperty(contextSpec.provider + ".propertiesbuilder", checkNotNull( + contextSpec.propertiesBuilderClass, "contextSpec.propertiesBuilderClass").getName()); } if (size(contextSpec.modules) > 0) { - props.setProperty(contextSpec.provider + ".modules", - Joiner.on(',').join(transform(contextSpec.modules, new Function() { + props.setProperty(contextSpec.provider + ".modules", Joiner.on(',').join( + transform(contextSpec.modules, new Function() { - @Override - public String apply(Module from) { - return from.getClass().getName(); - } + @Override + public String apply(Module from) { + return from.getClass().getName(); + } - }))); + }))); } return props; } @SuppressWarnings("unchecked") public RestContextSpec createContextSpec(String providerName, String identity, String credential, - Properties _overrides) { + Properties _overrides) { return createContextSpec(providerName, identity, credential, EMPTY_LIST, _overrides); } @SuppressWarnings("unchecked") public RestContextSpec createContextSpec(String providerName, String identity, String credential, - Iterable wiring, Properties _overrides) { + Iterable wiring, Properties _overrides) { checkNotNull(providerName, "providerName"); checkNotNull(_overrides, "overrides"); @@ -283,11 +287,12 @@ public class RestContextFactory { props.putAll(this.properties); props.putAll(_overrides); - String endpoint = props.getProperty(providerName + ".endpoint", null); + String endpoint = props.getProperty(providerName + "." + LocationConstants.ENDPOINT, null); + String iso3166Codes = props.getProperty(providerName + "." + LocationConstants.ISO3166_CODES, null); String apiVersion = props.getProperty(providerName + ".apiversion", null); identity = props.getProperty(providerName + ".identity", props.getProperty("jclouds.identity", identity)); - credential = loadCredentialOrDefault(props, providerName + ".credential", - loadCredentialOrDefault(props, "jclouds.credential", credential)); + credential = loadCredentialOrDefault(props, providerName + ".credential", loadCredentialOrDefault(props, + "jclouds.credential", credential)); String syncClassName = props.getProperty(providerName + ".sync", null); String asyncClassName = props.getProperty(providerName + ".async", null); Iterable modules = concat(Modules2.modulesForProviderInProperties(providerName, props), wiring); @@ -306,8 +311,8 @@ public class RestContextFactory { assert false : "exception should have propogated " + e; return null; } - RestContextSpec contextSpec = new RestContextSpec(providerName, endpoint, apiVersion, identity, - credential, sync, async, propertiesBuilderClass, contextBuilderClass, modules); + RestContextSpec contextSpec = new RestContextSpec(providerName, endpoint, apiVersion, iso3166Codes, + identity, credential, sync, async, propertiesBuilderClass, contextBuilderClass, modules); return contextSpec; } @@ -316,8 +321,8 @@ public class RestContextFactory { return properties.getProperty(property); else if (properties.containsKey(property + ".resource")) try { - return Strings2.toStringAndClose(RestContextFactory.class.getResourceAsStream(properties.getProperty(property - + ".resource"))); + return Strings2.toStringAndClose(RestContextFactory.class.getResourceAsStream(properties + .getProperty(property + ".resource"))); } catch (IOException e) { throw new RuntimeException("error reading resource: " + properties.getProperty(property + ".resource")); } @@ -337,31 +342,33 @@ public class RestContextFactory { @SuppressWarnings("unchecked") public static RestContextBuilder createContextBuilder(RestContextSpec contextSpec, - Properties overrides) { + Properties overrides) { return createContextBuilder(contextSpec, EMPTY_LIST, overrides); } public static RestContextBuilder createContextBuilder(RestContextSpec contextSpec, - Iterable modules) { + Iterable modules) { return createContextBuilder(contextSpec, modules, NO_PROPERTIES); } public static RestContextBuilder createContextBuilder(RestContextSpec contextSpec, - Iterable modules, Properties overrides) { + Iterable modules, Properties overrides) { try { PropertiesBuilder builder = contextSpec.propertiesBuilderClass.getConstructor(Properties.class).newInstance( - overrides); + overrides); builder.provider(contextSpec.provider); if (contextSpec.apiVersion != null) builder.apiVersion(contextSpec.apiVersion); + if (contextSpec.iso3166Codes != null) + builder.iso3166Codes(Splitter.on('.').split(contextSpec.iso3166Codes)); if (contextSpec.identity != null) builder.credentials(contextSpec.identity, contextSpec.credential); if (contextSpec.endpoint != null) builder.endpoint(contextSpec.endpoint); RestContextBuilder contextBuilder = Providers.initContextBuilder(contextSpec.contextBuilderClass, - contextSpec.sync, contextSpec.async, builder.build()); + contextSpec.sync, contextSpec.async, builder.build()); contextBuilder.withModules(concat(modules, contextSpec.modules)); @@ -399,7 +406,7 @@ public class RestContextFactory { * @see RestContextFactory#createContextBuilder(String, Iterable) */ public RestContext createContext(String provider, Iterable wiring, - Properties overrides) { + Properties overrides) { RestContextBuilder builder = createContextBuilder(provider, wiring, overrides); return buildContextUnwrappingExceptions(builder); } @@ -408,7 +415,7 @@ public class RestContextFactory { * @see RestContextFactory#createContextBuilder(String, String,String, Properties) */ public RestContext createContext(String provider, @Nullable String identity, - @Nullable String credential, Properties properties) { + @Nullable String credential, Properties properties) { RestContextBuilder builder = createContextBuilder(provider, identity, credential, properties); return buildContextUnwrappingExceptions(builder); } @@ -417,7 +424,7 @@ public class RestContextFactory { * @see RestContextFactory#createContextBuilder(String, String,String, Iterable) */ public RestContext createContext(String provider, @Nullable String identity, - @Nullable String credential, Iterable wiring) { + @Nullable String credential, Iterable wiring) { RestContextBuilder builder = createContextBuilder(provider, identity, credential, wiring); return buildContextUnwrappingExceptions(builder); } @@ -426,7 +433,7 @@ public class RestContextFactory { * @see RestContextFactory#createContextBuilder(String, String,String, Iterable, Properties) */ public RestContext createContext(String provider, @Nullable String identity, - @Nullable String credential, Iterable wiring, Properties overrides) { + @Nullable String credential, Iterable wiring, Properties overrides) { RestContextBuilder builder = createContextBuilder(provider, identity, credential, wiring, overrides); return buildContextUnwrappingExceptions(builder); } @@ -459,7 +466,7 @@ public class RestContextFactory { * @see RestContextFactory#createContextBuilder(RestContextSpec, Iterable, Properties) */ public static RestContext createContext(RestContextSpec contextSpec, Iterable modules, - Properties overrides) { + Properties overrides) { RestContextBuilder builder = createContextBuilder(contextSpec, modules, overrides); return buildContextUnwrappingExceptions(builder); } diff --git a/core/src/main/java/org/jclouds/rest/RestContextSpec.java b/core/src/main/java/org/jclouds/rest/RestContextSpec.java index 9304443e8a..ad7361d277 100644 --- a/core/src/main/java/org/jclouds/rest/RestContextSpec.java +++ b/core/src/main/java/org/jclouds/rest/RestContextSpec.java @@ -36,6 +36,7 @@ public class RestContextSpec { protected final String provider; protected final String endpoint; protected final String apiVersion; + protected final String iso3166Codes; protected final String identity; protected final String credential; protected final Class sync; @@ -44,30 +45,31 @@ public class RestContextSpec { protected final Class> contextBuilderClass; protected final Iterable modules; - public RestContextSpec(String provider, String endpoint, String apiVersion, String identity, String credential, - Class sync, Class async, Class propertiesBuilderClass, - Class> contextBuilderClass, Iterable modules) { + public RestContextSpec(String provider, String endpoint, String apiVersion, String iso3166Codes, String identity, + String credential, Class sync, Class async, Class propertiesBuilderClass, + Class> contextBuilderClass, Iterable modules) { this.provider = checkNotNull(provider, "provider"); this.endpoint = endpoint; this.apiVersion = apiVersion; this.identity = identity; this.credential = credential; + this.iso3166Codes = iso3166Codes; this.sync = sync; this.async = async; checkArgument(RestContextBuilder.class.isAssignableFrom(contextBuilderClass), contextBuilderClass.getName() - + " is not a subclass of " + RestContextBuilder.class.getName()); + + " is not a subclass of " + RestContextBuilder.class.getName()); checkArgument(PropertiesBuilder.class.isAssignableFrom(propertiesBuilderClass), propertiesBuilderClass.getName() - + " is not a subclass of " + PropertiesBuilder.class.getName()); + + " is not a subclass of " + PropertiesBuilder.class.getName()); this.propertiesBuilderClass = propertiesBuilderClass; this.contextBuilderClass = contextBuilderClass; this.modules = ImmutableList.copyOf(modules); } - @SuppressWarnings({ "unchecked", "rawtypes" }) - public RestContextSpec(String provider, String endpoint, String apiVersion, String identity, String credential, - Class sync, Class async) { - this(provider, endpoint, apiVersion, identity, credential, sync, async, PropertiesBuilder.class, - (Class) RestContextBuilder.class, EMPTY_LIST); + @SuppressWarnings( { "unchecked", "rawtypes" }) + public RestContextSpec(String provider, String endpoint, String apiVersion, String iso3166Codes, String identity, + String credential, Class sync, Class async) { + this(provider, endpoint, apiVersion, iso3166Codes, identity, credential, sync, async, PropertiesBuilder.class, + (Class) RestContextBuilder.class, EMPTY_LIST); } /** @@ -76,8 +78,8 @@ public class RestContextSpec { */ @Override public int hashCode() { - return Objects.hashCode(provider, endpoint, apiVersion, identity, credential, sync, async, - propertiesBuilderClass, contextBuilderClass, modules); + return Objects.hashCode(provider, endpoint, apiVersion, iso3166Codes, identity, credential, sync, async, + propertiesBuilderClass, contextBuilderClass, modules); } /** @@ -97,10 +99,10 @@ public class RestContextSpec { */ @Override public String toString() { - return Objects.toStringHelper(this).add("provider", provider).add("endpoint", endpoint) - .add("apiVersion", apiVersion).add("identity", identity).add("sync", sync).add("async", async) - .add("propertiesBuilderClass", propertiesBuilderClass).add("contextBuilderClass", contextBuilderClass) - .add("modules", modules).toString(); + return Objects.toStringHelper(this).add("provider", provider).add("endpoint", endpoint).add("apiVersion", + apiVersion).add("iso3166Codes", iso3166Codes).add("identity", identity).add("sync", sync).add("async", + async).add("propertiesBuilderClass", propertiesBuilderClass).add("contextBuilderClass", + contextBuilderClass).add("modules", modules).toString(); } } \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java b/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java index 17f3d5c380..d51e4f5db1 100644 --- a/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java +++ b/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java @@ -22,12 +22,16 @@ package org.jclouds.rest.internal; import java.io.IOException; import java.net.URI; import java.util.Map; +import java.util.Set; import javax.annotation.Resource; import javax.inject.Inject; import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; import org.jclouds.lifecycle.Closer; +import org.jclouds.location.Iso3166; import org.jclouds.location.Provider; import org.jclouds.logging.Logger; import org.jclouds.rest.RestContext; @@ -35,6 +39,7 @@ import org.jclouds.rest.Utils; import org.jclouds.rest.annotations.ApiVersion; import org.jclouds.rest.annotations.Identity; +import com.google.common.collect.ImmutableMap; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Singleton; @@ -57,11 +62,12 @@ public class RestContextImpl implements RestContext { private final String apiVersion; private final Utils utils; private final Map credentialStore; + private final Set iso3166Codes; @Inject protected RestContextImpl(Closer closer, Map credentialStore, Utils utils, Injector injector, - TypeLiteral syncApi, TypeLiteral asyncApi, @Provider URI endpoint, @Provider String provider, - @Identity String identity, @ApiVersion String apiVersion) { + TypeLiteral syncApi, TypeLiteral asyncApi, @Provider URI endpoint, @Provider String provider, + @Identity String identity, @ApiVersion String apiVersion, @Iso3166 Set iso3166Codes) { this.credentialStore = credentialStore; this.utils = utils; this.asyncApi = injector.getInstance(Key.get(asyncApi)); @@ -71,6 +77,7 @@ public class RestContextImpl implements RestContext { this.identity = identity; this.provider = provider; this.apiVersion = apiVersion; + this.iso3166Codes = iso3166Codes; } /** @@ -122,11 +129,6 @@ public class RestContextImpl implements RestContext { return apiVersion; } - @Override - public String getProvider() { - return provider; - } - @Override public int hashCode() { final int prime = 31; @@ -172,8 +174,8 @@ public class RestContextImpl implements RestContext { @Override public String toString() { - return " [provider=" + provider + ", endpoint=" + endpoint + ", apiVersion=" + apiVersion + ", identity=" - + identity + "]"; + return " [id=" + provider + ", endpoint=" + endpoint + ", apiVersion=" + apiVersion + ", identity=" + identity + + ", iso3166Codes=" + iso3166Codes + "]"; } @Override @@ -185,4 +187,34 @@ public class RestContextImpl implements RestContext { public Map credentialStore() { return credentialStore; } + + @Override + public String getDescription() { + return null; + } + + @Override + public String getId() { + return provider; + } + + @Override + public Set getIso3166Codes() { + return iso3166Codes; + } + + @Override + public Map getMetadata() { + return ImmutableMap. of("endpoint", endpoint, "apiVersion", apiVersion, "identity", identity); + } + + @Override + public Location getParent() { + return null; + } + + @Override + public LocationScope getScope() { + return LocationScope.PROVIDER; + } } diff --git a/core/src/main/resources/rest.properties b/core/src/main/resources/rest.properties index 10edf17aad..478c72a795 100644 --- a/core/src/main/resources/rest.properties +++ b/core/src/main/resources/rest.properties @@ -166,7 +166,7 @@ swift.contextbuilder=org.jclouds.openstack.swift.SwiftContextBuilder swift.propertiesbuilder=org.jclouds.openstack.swift.SwiftPropertiesBuilder cloudfiles.contextbuilder=org.jclouds.cloudfiles.CloudFilesContextBuilder -cloudfiles.propertiesbuilder=org.jclouds.cloudfiles.CloudFilesPropertiesBuilder +cloudfiles.propertiesbuilder=org.jclouds.openstack.swift.SwiftPropertiesBuilder cloudfiles-us.contextbuilder=org.jclouds.cloudfiles.CloudFilesContextBuilder cloudfiles-us.propertiesbuilder=org.jclouds.rackspace.cloudfiles.CloudFilesUSPropertiesBuilder diff --git a/core/src/test/java/org/jclouds/http/BaseJettyTest.java b/core/src/test/java/org/jclouds/http/BaseJettyTest.java index 1b7079db08..e5d7eaee08 100644 --- a/core/src/test/java/org/jclouds/http/BaseJettyTest.java +++ b/core/src/test/java/org/jclouds/http/BaseJettyTest.java @@ -266,7 +266,7 @@ public abstract class BaseJettyTest { properties.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); properties.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); RestContextSpec contextSpec = contextSpec("test", - "http://localhost:" + testPort, "1", "identity", null, IntegrationTestClient.class, + "http://localhost:" + testPort, "1", "", "identity", null, IntegrationTestClient.class, IntegrationTestAsyncClient.class, ImmutableSet. copyOf(connectionModules)); return createContextBuilder(contextSpec, properties); } diff --git a/core/src/test/java/org/jclouds/rest/InputParamValidatorTest.java b/core/src/test/java/org/jclouds/rest/InputParamValidatorTest.java index 93af2dc92a..6120858a8f 100644 --- a/core/src/test/java/org/jclouds/rest/InputParamValidatorTest.java +++ b/core/src/test/java/org/jclouds/rest/InputParamValidatorTest.java @@ -51,12 +51,12 @@ public class InputParamValidatorTest { @SkipEncoding('/') class InputParamValidatorForm { @POST - @ParamValidators( { AllLowerCaseValidator.class }) + @ParamValidators( { AllLowerCaseValidator.class }) public void allParamsValidated(@PathParam("param1") String param1, @PathParam("param2") String param2) { } @POST - public void oneParamValidated(@PathParam("param1") String param1, + public void oneParamValidated(@PathParam("param1") String param1, @ParamValidators( { AllLowerCaseValidator.class }) @PathParam("param2") String param2) { } } @@ -142,7 +142,7 @@ public class InputParamValidatorTest { void setupFactory() { RestContextSpec contextSpec = contextSpec("test", - "http://localhost:9999", "1", "userFoo", null, IntegrationTestClient.class, + "http://localhost:9999", "1", "", "userFoo", null, IntegrationTestClient.class, IntegrationTestAsyncClient.class); injector = createContextBuilder(contextSpec).buildInjector(); diff --git a/core/src/test/java/org/jclouds/rest/RestContextFactoryTest.java b/core/src/test/java/org/jclouds/rest/RestContextFactoryTest.java index 292377bcb4..4d92265264 100644 --- a/core/src/test/java/org/jclouds/rest/RestContextFactoryTest.java +++ b/core/src/test/java/org/jclouds/rest/RestContextFactoryTest.java @@ -54,19 +54,22 @@ public class RestContextFactoryTest { public void testBuilder() { RestContextSpec contextSpec = contextSpec(provider, - "http://localhost", "1", "dummy", null, IntegrationTestClient.class, IntegrationTestAsyncClient.class); + "http://localhost", "1", "", "dummy", null, IntegrationTestClient.class, + IntegrationTestAsyncClient.class); createContextBuilder(contextSpec); } - public void testBuilderProperties() { + public void testBuilderPropertiesWithIso3166() { RestContextSpec contextSpec = contextSpec(provider, - "http://localhost", "1", "dummy", null, IntegrationTestClient.class, IntegrationTestAsyncClient.class); + "http://localhost", "1", "US-CA", "dummy", null, IntegrationTestClient.class, + IntegrationTestAsyncClient.class); Properties props = RestContextFactory.toProperties(contextSpec); assertEquals(props.getProperty("test.endpoint"), "http://localhost"); assertEquals(props.getProperty("test.apiversion"), "1"); assertEquals(props.getProperty("test.identity"), "dummy"); + assertEquals(props.getProperty("test.iso3166-codes"), "US-CA"); assertEquals(props.getProperty("test.credential"), null); assertEquals(props.getProperty("test.sync"), IntegrationTestClient.class.getName()); assertEquals(props.getProperty("test.async"), IntegrationTestAsyncClient.class.getName()); @@ -79,8 +82,8 @@ public class RestContextFactoryTest { public void testBuilderPropertiesWithCredential() { RestContextSpec contextSpec = contextSpec(provider, - "http://localhost", "1", "dummy", "credential", IntegrationTestClient.class, - IntegrationTestAsyncClient.class); + "http://localhost", "1", "", "dummy", "credential", IntegrationTestClient.class, + IntegrationTestAsyncClient.class); Properties props = RestContextFactory.toProperties(contextSpec); assertEquals(props.getProperty("test.endpoint"), "http://localhost"); @@ -100,8 +103,8 @@ public class RestContextFactoryTest { public void testBuilderPropertiesWithContextBuilder() { @SuppressWarnings("rawtypes") RestContextSpec contextSpec = contextSpec(provider, - "http://localhost", "1", "dummy", null, (Class) null, (Class) null, PropertiesBuilder.class, - (Class) IntegrationTestContextBuilder.class, Collections.EMPTY_LIST); + "http://localhost", "1", "", "dummy", null, (Class) null, (Class) null, PropertiesBuilder.class, + (Class) IntegrationTestContextBuilder.class, Collections.EMPTY_LIST); Properties props = RestContextFactory.toProperties(contextSpec); assertEquals(props.getProperty("test.endpoint"), "http://localhost"); @@ -121,8 +124,8 @@ public class RestContextFactoryTest { public void testBuilderPropertiesWithModule() { @SuppressWarnings("rawtypes") RestContextSpec contextSpec = contextSpec(provider, - "http://localhost", "1", "dummy", null, (Class) null, (Class) null, PropertiesBuilder.class, - (Class) IntegrationTestContextBuilder.class, Collections. singleton(new A())); + "http://localhost", "1", "", "dummy", null, (Class) null, (Class) null, PropertiesBuilder.class, + (Class) IntegrationTestContextBuilder.class, Collections. singleton(new A())); Properties props = RestContextFactory.toProperties(contextSpec); assertEquals(props.getProperty("test.endpoint"), "http://localhost"); @@ -142,8 +145,8 @@ public class RestContextFactoryTest { public void testBuilderPropertiesWithModules() { @SuppressWarnings("rawtypes") RestContextSpec contextSpec = contextSpec(provider, - "http://localhost", "1", "dummy", null, (Class) null, (Class) null, PropertiesBuilder.class, - (Class) IntegrationTestContextBuilder.class, Arrays. asList(new A(), new B())); + "http://localhost", "1", "", "dummy", null, (Class) null, (Class) null, PropertiesBuilder.class, + (Class) IntegrationTestContextBuilder.class, Arrays. asList(new A(), new B())); Properties props = RestContextFactory.toProperties(contextSpec); assertEquals(props.getProperty("test.endpoint"), "http://localhost"); @@ -155,7 +158,7 @@ public class RestContextFactoryTest { assertEquals(props.getProperty("test.propertiesbuilder"), PropertiesBuilder.class.getName()); assertEquals(props.getProperty("test.contextbuilder"), IntegrationTestContextBuilder.class.getName()); assertEquals(props.getProperty("test.modules"), - "org.jclouds.rest.RestContextFactoryTest$A,org.jclouds.rest.RestContextFactoryTest$B"); + "org.jclouds.rest.RestContextFactoryTest$A,org.jclouds.rest.RestContextFactoryTest$B"); new RestContextFactory().createContext(provider, props); } @@ -164,21 +167,24 @@ public class RestContextFactoryTest { Properties props = new Properties(); props.setProperty("test.endpoint", "http://localhost"); props.setProperty("test.apiversion", "1"); + props.setProperty("test.iso3166-codes", "US"); props.setProperty("jclouds.identity", "foo"); props.setProperty("jclouds.credential", "bar"); props.setProperty("test.propertiesbuilder", PropertiesBuilder.class.getName()); props.setProperty("test.contextbuilder", IntegrationTestContextBuilder.class.getName()); props.setProperty("jclouds.modules", - "org.jclouds.rest.RestContextFactoryTest$A,org.jclouds.rest.RestContextFactoryTest$B"); + "org.jclouds.rest.RestContextFactoryTest$A,org.jclouds.rest.RestContextFactoryTest$B"); new RestContextFactory() { @SuppressWarnings("hiding") @Override public RestContextSpec createContextSpec(String providerName, String identity, String credential, - Iterable wiring, Properties _overrides) { - RestContextSpec spec = super.createContextSpec(providerName, identity, credential, wiring, _overrides); + Iterable wiring, Properties _overrides) { + RestContextSpec spec = super + .createContextSpec(providerName, identity, credential, wiring, _overrides); + assertEquals(spec.iso3166Codes, "US"); assertEquals(spec.identity, "foo"); assertEquals(spec.credential, "bar"); assertEquals(Iterables.size(spec.modules), 2); @@ -189,28 +195,31 @@ public class RestContextFactoryTest { } public void testBuilderPropertiesJCloudsScopeWithProviderIdentityAndFileCredential() throws IOException { - + File file = File.createTempFile("foo", "bar"); file.deleteOnExit(); Files.write("bar", file, Charsets.UTF_8); Properties props = new Properties(); props.setProperty("test.endpoint", "http://localhost"); props.setProperty("test.apiversion", "1"); + props.setProperty("test.iso3166-codes", "US"); props.setProperty("test.identity", "foo"); props.setProperty("test.credential.file", file.getAbsolutePath()); props.setProperty("test.propertiesbuilder", PropertiesBuilder.class.getName()); props.setProperty("test.contextbuilder", IntegrationTestContextBuilder.class.getName()); props.setProperty("jclouds.modules", - "org.jclouds.rest.RestContextFactoryTest$A,org.jclouds.rest.RestContextFactoryTest$B"); + "org.jclouds.rest.RestContextFactoryTest$A,org.jclouds.rest.RestContextFactoryTest$B"); new RestContextFactory() { @SuppressWarnings("hiding") @Override public RestContextSpec createContextSpec(String providerName, String identity, String credential, - Iterable wiring, Properties _overrides) { - RestContextSpec spec = super.createContextSpec(providerName, identity, credential, wiring, _overrides); + Iterable wiring, Properties _overrides) { + RestContextSpec spec = super + .createContextSpec(providerName, identity, credential, wiring, _overrides); + assertEquals(spec.iso3166Codes, "US"); assertEquals(spec.identity, "foo"); assertEquals(spec.credential, "bar"); assertEquals(Iterables.size(spec.modules), 2); @@ -241,16 +250,16 @@ public class RestContextFactoryTest { @SuppressWarnings("unchecked") @Test(expectedExceptions = IllegalArgumentException.class) public void testBuilderPropertiesWithWrongConfig() { - @SuppressWarnings({ "unused", "rawtypes" }) + @SuppressWarnings( { "unused", "rawtypes" }) RestContextSpec contextSpec = contextSpec(provider, - "http://localhost", "1", "dummy", null, (Class) null, (Class) null, - (Class) IntegrationTestContextBuilder.class, (Class) PropertiesBuilder.class, Collections.EMPTY_LIST); + "http://localhost", "1", "", "dummy", null, (Class) null, (Class) null, + (Class) IntegrationTestContextBuilder.class, (Class) PropertiesBuilder.class, Collections.EMPTY_LIST); } @RequiresHttp @ConfiguresRestClient public static class IntegrationTestRestClientModule extends - RestClientModule { + RestClientModule { public IntegrationTestRestClientModule() { super(IntegrationTestClient.class, IntegrationTestAsyncClient.class); @@ -259,7 +268,7 @@ public class RestContextFactoryTest { } public static class IntegrationTestContextBuilder extends - RestContextBuilder { + RestContextBuilder { public IntegrationTestContextBuilder(Properties props) { super(IntegrationTestClient.class, IntegrationTestAsyncClient.class, props); diff --git a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java index 450bf9c9b5..0b9c7f7904 100755 --- a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java +++ b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java @@ -280,8 +280,8 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest { private Injector injectorForClient() { - RestContextSpec contextSpec = contextSpec("test", "http://localhost:9999", "1", "userfoo", - null, Caller.class, AsyncCaller.class, ImmutableSet. of(new MockModule(), + RestContextSpec contextSpec = contextSpec("test", "http://localhost:9999", "1", "", + "userfoo", null, Caller.class, AsyncCaller.class, ImmutableSet. of(new MockModule(), new NullLoggingModule(), new CallerCalleeModule())); return createContextBuilder(contextSpec).buildInjector(); @@ -2100,8 +2100,8 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest { @BeforeClass void setupFactory() { - RestContextSpec contextSpec = contextSpec("test", "http://localhost:9999", "1", "userfoo", null, - String.class, Integer.class, ImmutableSet. of(new MockModule(), new NullLoggingModule(), + RestContextSpec contextSpec = contextSpec("test", "http://localhost:9999", "1", "", "userfoo", + null, String.class, Integer.class, ImmutableSet. of(new MockModule(), new NullLoggingModule(), new AbstractModule() { @Override diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2PropertiesBuilder.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2PropertiesBuilder.java index f204f096b2..456c3d57ba 100644 --- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2PropertiesBuilder.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/AWSEC2PropertiesBuilder.java @@ -19,13 +19,16 @@ package org.jclouds.aws.ec2; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.aws.domain.Region.AP_SOUTHEAST_1; import static org.jclouds.aws.domain.Region.EU_WEST_1; import static org.jclouds.aws.domain.Region.US_EAST_1; import static org.jclouds.aws.domain.Region.US_WEST_1; +import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMIs; import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_NODE_SUSPENDED; import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; -import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMIs; +import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGION; import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; import java.util.Properties; @@ -40,11 +43,17 @@ import com.google.common.collect.ImmutableSet; * @author Adrian Cole */ public class AWSEC2PropertiesBuilder extends org.jclouds.ec2.EC2PropertiesBuilder { - public static Set DEFAULT_REGIONS = ImmutableSet.of(EU_WEST_1, US_EAST_1, US_WEST_1, AP_SOUTHEAST_1); + public static Set DEFAULT_REGIONS = ImmutableSet.of(US_EAST_1, US_WEST_1, EU_WEST_1, AP_SOUTHEAST_1); @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-VA,US-CA,IE,SG"); + properties.setProperty(PROPERTY_REGION + "." + US_EAST_1 + "." + ISO3166_CODES, "US-VA"); + properties.setProperty(PROPERTY_REGION + "." + US_WEST_1 + "." + ISO3166_CODES, "US-CA"); + properties.setProperty(PROPERTY_REGION + "." + EU_WEST_1 + "." + ISO3166_CODES, "IE"); + properties.setProperty(PROPERTY_REGION + "." + AP_SOUTHEAST_1 + "." + ISO3166_CODES, "SG"); + // 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 @@ -53,7 +62,7 @@ public class AWSEC2PropertiesBuilder extends org.jclouds.ec2.EC2PropertiesBuilde // 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"); properties.setProperty(PROPERTY_REGIONS, Joiner.on(',').join(DEFAULT_REGIONS)); // amazon, alestic, canonical, and rightscale properties.setProperty(PROPERTY_EC2_AMI_OWNERS, "137112412989,063491364108,099720109477,411009282317"); diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java index 2c20f1f5d5..a67ffedbb5 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java @@ -20,11 +20,14 @@ package org.jclouds.aws.ec2.compute; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; import static org.testng.Assert.assertEquals; import java.io.IOException; import java.util.Properties; +import java.util.Set; +import org.jclouds.aws.domain.Region; import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeServiceContextFactory; @@ -173,4 +176,40 @@ public class AWSEC2TemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { } } + @Test + public void testTemplateBuilderWithLessRegions() throws IOException { + ComputeServiceContext context = null; + try { + Properties overrides = setupProperties(); + // set regions to only 1 + overrides.setProperty(PROPERTY_REGIONS, Region.US_EAST_1); + + context = new ComputeServiceContextFactory().createContext(provider, ImmutableSet + . of(new Log4JLoggingModule()), overrides); + + assert context.getComputeService().listImages().size() < this.context.getComputeService().listImages().size(); + + 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"); + 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()), 2.0d); + assertEquals(template.getHardware().getId(), "m1.large"); // because it is 64bit + + } finally { + if (context != null) + context.close(); + } + } + + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US-VA", "US-CA", "IE", "SG"); + } + } diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java index 247c15933f..cbb9dd98a0 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/strategy/AWSEC2ImageParserTest.java @@ -24,7 +24,6 @@ import static org.testng.Assert.assertEquals; import java.util.Map; import java.util.Set; -import org.jclouds.aws.ec2.compute.strategy.AWSEC2ReviseParsedImage; import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystemBuilder; @@ -32,8 +31,8 @@ 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.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.ec2.compute.functions.EC2ImageParser; import org.jclouds.ec2.compute.strategy.EC2PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.ec2.domain.Image; @@ -127,11 +126,11 @@ public class AWSEC2ImageParserTest { 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\"}}"); + "{\"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\",\"iso3166Codes\":[],\"metadata\":{}},\"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\"}}"); + "{\"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\",\"iso3166Codes\":[],\"metadata\":{}},\"userMetadata\":{\"owner\":\"411009282317\",\"rootDeviceType\":\"ebs\"}}"); } public void testParseAmznImage() { @@ -154,7 +153,8 @@ public class AWSEC2ImageParserTest { ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).build()); } - static Location defaultLocation = new LocationImpl(LocationScope.REGION, "us-east-1", "us-east-1", null); + static Location defaultLocation = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1").description( + "us-east-1").build(); public static Set convertImages(String resource) { diff --git a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3PropertiesBuilder.java b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3PropertiesBuilder.java index fe382ddbeb..92a6232cc8 100644 --- a/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3PropertiesBuilder.java +++ b/providers/aws-s3/src/main/java/org/jclouds/aws/s3/AWSS3PropertiesBuilder.java @@ -20,10 +20,13 @@ package org.jclouds.aws.s3; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.aws.domain.Region.AP_SOUTHEAST_1; import static org.jclouds.aws.domain.Region.EU_WEST_1; import static org.jclouds.aws.domain.Region.US_EAST_1; import static org.jclouds.aws.domain.Region.US_WEST_1; +import static org.jclouds.location.reference.LocationConstants.ENDPOINT; +import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES; import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGION; import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; @@ -46,15 +49,20 @@ public class AWSS3PropertiesBuilder extends org.jclouds.s3.S3PropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_REGIONS, - Joiner.on(',').join(Region.US_STANDARD, Region.US_WEST_1, "EU", Region.AP_SOUTHEAST_1)); + properties.setProperty(PROPERTY_ISO3166_CODES, "US,US-CA,IE,SG"); + properties.setProperty(PROPERTY_REGIONS, Joiner.on(',').join(Region.US_STANDARD, Region.US_WEST_1, "EU", + Region.AP_SOUTHEAST_1)); properties.setProperty(PROPERTY_ENDPOINT, "https://s3.amazonaws.com"); - properties.setProperty(PROPERTY_REGION + "." + Region.US_STANDARD + ".endpoint", "https://s3.amazonaws.com"); - properties.setProperty(PROPERTY_REGION + "." + Region.US_WEST_1 + ".endpoint", - "https://s3-us-west-1.amazonaws.com"); - properties.setProperty(PROPERTY_REGION + "." + "EU" + ".endpoint", "https://s3-eu-west-1.amazonaws.com"); - properties.setProperty(PROPERTY_REGION + "." + Region.AP_SOUTHEAST_1 + ".endpoint", - "https://s3-ap-southeast-1.amazonaws.com"); + properties.setProperty(PROPERTY_REGION + "." + Region.US_STANDARD + "." + ENDPOINT, "https://s3.amazonaws.com"); + properties.setProperty(PROPERTY_REGION + "." + Region.US_STANDARD + "." + ISO3166_CODES, "US"); + properties.setProperty(PROPERTY_REGION + "." + Region.US_WEST_1 + "." + ENDPOINT, + "https://s3-us-west-1.amazonaws.com"); + properties.setProperty(PROPERTY_REGION + "." + Region.US_WEST_1 + "." + ISO3166_CODES, "US-CA"); + properties.setProperty(PROPERTY_REGION + "." + "EU" + "." + ENDPOINT, "https://s3-eu-west-1.amazonaws.com"); + properties.setProperty(PROPERTY_REGION + "." + "EU" + "." + ISO3166_CODES, "IE"); + properties.setProperty(PROPERTY_REGION + "." + Region.AP_SOUTHEAST_1 + "." + ENDPOINT, + "https://s3-ap-southeast-1.amazonaws.com"); + properties.setProperty(PROPERTY_REGION + "." + Region.AP_SOUTHEAST_1 + "." + ISO3166_CODES, "SG"); return properties; } diff --git a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3AsyncClientTest.java b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3AsyncClientTest.java index 11a184bfd2..e2da9e7dd2 100644 --- a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3AsyncClientTest.java +++ b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/AWSS3AsyncClientTest.java @@ -19,6 +19,15 @@ package org.jclouds.aws.s3; +import java.io.IOException; +import java.lang.reflect.Array; +import java.lang.reflect.Method; + +import org.jclouds.http.HttpRequest; +import org.jclouds.http.functions.ReturnTrueIf2xx; +import org.jclouds.s3.S3AsyncClient; +import org.jclouds.s3.functions.ReturnFalseIfBucketAlreadyOwnedByYouOrIllegalState; +import org.jclouds.s3.options.PutBucketOptions; import org.testng.annotations.Test; /** @@ -32,4 +41,22 @@ public class AWSS3AsyncClientTest extends org.jclouds.s3.S3AsyncClientTest { this.provider = "aws-s3"; } + public void testPutBucketEu() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException, + NoSuchMethodException, IOException { + Method method = S3AsyncClient.class.getMethod("putBucketInRegion", String.class, String.class, Array.newInstance( + PutBucketOptions.class, 0).getClass()); + HttpRequest request = processor.createRequest(method, "EU", "bucket"); + + assertRequestLineEquals(request, "PUT https://bucket." + url + "/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: bucket." + url + "\n"); + assertPayloadEquals(request, + "EU", + "text/xml", false); + + assertResponseParserClassEquals(method, request, ReturnTrueIf2xx.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, ReturnFalseIfBucketAlreadyOwnedByYouOrIllegalState.class); + + checkFilters(request); + } } diff --git a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/integration/AWSS3ServiceIntegrationLiveTest.java b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/integration/AWSS3ServiceIntegrationLiveTest.java index c72241df84..465a46f522 100644 --- a/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/integration/AWSS3ServiceIntegrationLiveTest.java +++ b/providers/aws-s3/src/test/java/org/jclouds/aws/s3/blobstore/integration/AWSS3ServiceIntegrationLiveTest.java @@ -19,13 +19,21 @@ package org.jclouds.aws.s3.blobstore.integration; -import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest; +import java.util.Set; + +import org.jclouds.s3.blobstore.integration.S3ServiceIntegrationLiveTest; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; + /** * @author Adrian Cole */ -@Test(groups = "live", testName = "AWSS3ServiceIntegrationLiveTest") -public class AWSS3ServiceIntegrationLiveTest extends BaseServiceIntegrationTest { +@Test(groups = "live", testName = "AWSS3ServiceIntegrationLiveTest") +public class AWSS3ServiceIntegrationLiveTest extends S3ServiceIntegrationLiveTest { + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US", "US-CA", "IE", "SG"); + } } diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobPropertiesBuilder.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobPropertiesBuilder.java index 1eeacd790d..ae96bc0975 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobPropertiesBuilder.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/AzureBlobPropertiesBuilder.java @@ -21,6 +21,7 @@ package org.jclouds.azureblob; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.blobstore.reference.BlobStoreConstants.PROPERTY_USER_METADATA_PREFIX; import java.util.Properties; @@ -39,6 +40,7 @@ public class AzureBlobPropertiesBuilder extends AzureStoragePropertiesBuilder { properties.setProperty(PROPERTY_USER_METADATA_PREFIX, "x-ms-meta-"); properties.setProperty(PROPERTY_API_VERSION, "2009-09-19"); properties.setProperty(PROPERTY_ENDPOINT, "https://{identity}.blob.core.windows.net"); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-TX,US-IL,IE-D,SG,NL-NH,HK"); return properties; } diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/config/AzureBlobStoreContextModule.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/config/AzureBlobStoreContextModule.java index 1c55ee4d57..bf0fe95f51 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/config/AzureBlobStoreContextModule.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/config/AzureBlobStoreContextModule.java @@ -19,10 +19,6 @@ package org.jclouds.azureblob.blobstore.config; -import java.util.Set; - -import javax.inject.Singleton; - import org.jclouds.azureblob.AzureBlobAsyncClient; import org.jclouds.azureblob.AzureBlobClient; import org.jclouds.azureblob.blobstore.AzureAsyncBlobStore; @@ -37,17 +33,9 @@ import org.jclouds.blobstore.attr.ConsistencyModel; import org.jclouds.blobstore.config.BlobStoreMapModule; import org.jclouds.blobstore.internal.BlobStoreContextImpl; import org.jclouds.blobstore.strategy.ContainsValueInListStrategy; -import org.jclouds.collect.Memoized; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.location.Provider; +import org.jclouds.location.config.JustProviderLocationModule; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableSet; import com.google.inject.AbstractModule; -import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -61,6 +49,7 @@ public class AzureBlobStoreContextModule extends AbstractModule { @Override protected void configure() { install(new BlobStoreMapModule()); + install(new JustProviderLocationModule()); bind(ConsistencyModel.class).toInstance(ConsistencyModel.STRICT); bind(AsyncBlobStore.class).to(AzureAsyncBlobStore.class).in(Scopes.SINGLETON); bind(BlobStore.class).to(AzureBlobStore.class).in(Scopes.SINGLETON); @@ -70,18 +59,4 @@ public class AzureBlobStoreContextModule extends AbstractModule { bind(BlobRequestSigner.class).to(AzureBlobRequestSigner.class); } - @Provides - @Singleton - @Memoized - Supplier> provideLocations(Supplier defaultLocation) { - return Suppliers.> ofInstance(ImmutableSet.of(defaultLocation.get())); - } - - @Provides - @Singleton - Supplier provideDefaultLocation(@Provider String providerName) { - return Suppliers - . ofInstance(new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null)); - } - } diff --git a/providers/azureblob/src/test/java/org/jclouds/azureblob/blobstore/integration/AzureBlobServiceIntegrationLiveTest.java b/providers/azureblob/src/test/java/org/jclouds/azureblob/blobstore/integration/AzureBlobServiceIntegrationLiveTest.java index 9112bd6168..ba3188663a 100644 --- a/providers/azureblob/src/test/java/org/jclouds/azureblob/blobstore/integration/AzureBlobServiceIntegrationLiveTest.java +++ b/providers/azureblob/src/test/java/org/jclouds/azureblob/blobstore/integration/AzureBlobServiceIntegrationLiveTest.java @@ -19,13 +19,20 @@ package org.jclouds.azureblob.blobstore.integration; +import java.util.Set; + import org.jclouds.blobstore.integration.internal.BaseServiceIntegrationTest; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; + /** * @author Adrian Cole */ @Test(groups = "live") public class AzureBlobServiceIntegrationLiveTest extends BaseServiceIntegrationTest { - + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US-TX", "US-IL", "IE-D", "SG", "NL-NH", "HK"); + } } diff --git a/providers/bluelock-vcdirector/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java b/providers/bluelock-vcdirector/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java index 8b86f8aeb0..4f3f2d5cd8 100644 --- a/providers/bluelock-vcdirector/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java +++ b/providers/bluelock-vcdirector/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java @@ -20,6 +20,7 @@ package org.jclouds.vcloud.bluelock; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_NETWORK; import java.util.Properties; @@ -35,6 +36,7 @@ public class BlueLockVCloudDirectorPropertiesBuilder extends VCloudPropertiesBui @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-IN"); properties.setProperty(PROPERTY_ENDPOINT, "https://vcenterprise.bluelock.com/api"); properties.setProperty(PROPERTY_VCLOUD_DEFAULT_NETWORK, "internet01"); return properties; diff --git a/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorTemplateBuilderLiveTest.java b/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorTemplateBuilderLiveTest.java index 80399dc6b9..f3f9501cba 100644 --- a/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorTemplateBuilderLiveTest.java +++ b/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorTemplateBuilderLiveTest.java @@ -4,6 +4,7 @@ import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; import java.io.IOException; +import java.util.Set; import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.domain.OsFamily; @@ -12,6 +13,7 @@ import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; /** * @@ -49,4 +51,9 @@ public class BlueLockVCloudDirectorTemplateBuilderLiveTest extends BaseTemplateB assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } + + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US-IN"); + } } \ No newline at end of file diff --git a/providers/cloudfiles-uk/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesUKPropertiesBuilder.java b/providers/cloudfiles-uk/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesUKPropertiesBuilder.java index f20e176361..f0a927ccd1 100644 --- a/providers/cloudfiles-uk/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesUKPropertiesBuilder.java +++ b/providers/cloudfiles-uk/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesUKPropertiesBuilder.java @@ -20,6 +20,7 @@ package org.jclouds.rackspace.cloudfiles; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; import java.util.Properties; @@ -37,6 +38,7 @@ public class CloudFilesUKPropertiesBuilder extends SwiftPropertiesBuilder { Properties properties = super.defaultProperties(); properties.setProperty(PROPERTY_REGIONS, "UK"); properties.setProperty(PROPERTY_ENDPOINT, "https://lon.auth.api.rackspacecloud.com"); + properties.setProperty(PROPERTY_ISO3166_CODES, "GB-SLG"); return properties; } diff --git a/providers/cloudfiles-uk/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/integration/CloudFilesUKServiceIntegrationLiveTest.java b/providers/cloudfiles-uk/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/integration/CloudFilesUKServiceIntegrationLiveTest.java index 51f682cadb..48a3da874b 100644 --- a/providers/cloudfiles-uk/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/integration/CloudFilesUKServiceIntegrationLiveTest.java +++ b/providers/cloudfiles-uk/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/integration/CloudFilesUKServiceIntegrationLiveTest.java @@ -19,13 +19,20 @@ package org.jclouds.rackspace.cloudfiles.blobstore.integration; +import java.util.Set; + import org.jclouds.cloudfiles.blobstore.integration.CloudFilesServiceIntegrationLiveTest; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; + /** * @author Adrian Cole */ @Test(groups = "live", testName = "CloudFilesUKServiceIntegrationLiveTest") public class CloudFilesUKServiceIntegrationLiveTest extends CloudFilesServiceIntegrationLiveTest { - + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("GB-SLG"); + } } diff --git a/providers/cloudfiles-us/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesUSPropertiesBuilder.java b/providers/cloudfiles-us/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesUSPropertiesBuilder.java index 2db429c1c7..a710683c67 100644 --- a/providers/cloudfiles-us/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesUSPropertiesBuilder.java +++ b/providers/cloudfiles-us/src/main/java/org/jclouds/rackspace/cloudfiles/CloudFilesUSPropertiesBuilder.java @@ -20,6 +20,7 @@ package org.jclouds.rackspace.cloudfiles; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; import java.util.Properties; @@ -37,6 +38,7 @@ public class CloudFilesUSPropertiesBuilder extends SwiftPropertiesBuilder { Properties properties = super.defaultProperties(); properties.setProperty(PROPERTY_REGIONS, "US"); properties.setProperty(PROPERTY_ENDPOINT, "https://auth.api.rackspacecloud.com"); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-IL,US-TX"); return properties; } diff --git a/providers/cloudfiles-us/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/integration/CloudFilesUSServiceIntegrationLiveTest.java b/providers/cloudfiles-us/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/integration/CloudFilesUSServiceIntegrationLiveTest.java index 593a343890..c4eb029890 100644 --- a/providers/cloudfiles-us/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/integration/CloudFilesUSServiceIntegrationLiveTest.java +++ b/providers/cloudfiles-us/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/integration/CloudFilesUSServiceIntegrationLiveTest.java @@ -19,13 +19,20 @@ package org.jclouds.rackspace.cloudfiles.blobstore.integration; +import java.util.Set; + import org.jclouds.cloudfiles.blobstore.integration.CloudFilesServiceIntegrationLiveTest; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; + /** * @author Adrian Cole */ -@Test(groups = "live", testName = "CloudFilesUSServiceIntegrationLiveTest") +@Test(groups = "live", testName = "CloudFilesUSServiceIntegrationLiveTest") public class CloudFilesUSServiceIntegrationLiveTest extends CloudFilesServiceIntegrationLiveTest { - -} + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US-IL", "US-TX"); + } +} \ No newline at end of file diff --git a/providers/cloudonestorage/src/main/java/org/jclouds/cloudonestorage/CloudOneStoragePropertiesBuilder.java b/providers/cloudonestorage/src/main/java/org/jclouds/cloudonestorage/CloudOneStoragePropertiesBuilder.java index 079be57aeb..94efa2716f 100644 --- a/providers/cloudonestorage/src/main/java/org/jclouds/cloudonestorage/CloudOneStoragePropertiesBuilder.java +++ b/providers/cloudonestorage/src/main/java/org/jclouds/cloudonestorage/CloudOneStoragePropertiesBuilder.java @@ -21,6 +21,7 @@ package org.jclouds.cloudonestorage; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import java.util.Properties; @@ -37,6 +38,7 @@ public class CloudOneStoragePropertiesBuilder extends PropertiesBuilder { protected Properties defaultProperties() { Properties properties = super.defaultProperties(); properties.setProperty(PROPERTY_ENDPOINT, "https://cloudonestorage.peer1.com"); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-GA,US-TX"); properties.setProperty(PROPERTY_API_VERSION, "1.3.0"); return properties; } diff --git a/providers/cloudonestorage/src/test/java/org/jclouds/cloudonestorage/blobstore/integration/CloudOneStorageServiceIntegrationLiveTest.java b/providers/cloudonestorage/src/test/java/org/jclouds/cloudonestorage/blobstore/integration/CloudOneStorageServiceIntegrationLiveTest.java index 1b87e26f08..0019a78db8 100644 --- a/providers/cloudonestorage/src/test/java/org/jclouds/cloudonestorage/blobstore/integration/CloudOneStorageServiceIntegrationLiveTest.java +++ b/providers/cloudonestorage/src/test/java/org/jclouds/cloudonestorage/blobstore/integration/CloudOneStorageServiceIntegrationLiveTest.java @@ -19,13 +19,20 @@ package org.jclouds.cloudonestorage.blobstore.integration; +import java.util.Set; + import org.jclouds.atmos.blobstore.integration.AtmosServiceIntegrationLiveTest; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; + /** * @author Adrian Cole */ -@Test(groups = "live", testName = "CloudOneStorageServiceIntegrationLiveTest") +@Test(groups = "live", testName = "CloudOneStorageServiceIntegrationLiveTest") public class CloudOneStorageServiceIntegrationLiveTest extends AtmosServiceIntegrationLiveTest { - + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US-GA", "US-TX"); + } } diff --git a/providers/cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/CloudServersUKPropertiesBuilder.java b/providers/cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/CloudServersUKPropertiesBuilder.java index 81df7d9e66..8f32cb8481 100644 --- a/providers/cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/CloudServersUKPropertiesBuilder.java +++ b/providers/cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/CloudServersUKPropertiesBuilder.java @@ -21,7 +21,7 @@ package org.jclouds.rackspace.cloudservers; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; -import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import java.util.Properties; @@ -37,7 +37,7 @@ public class CloudServersUKPropertiesBuilder extends PropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_REGIONS, "UK"); + properties.setProperty(PROPERTY_ISO3166_CODES, "GB-SLG"); properties.setProperty(PROPERTY_ENDPOINT, "https://lon.auth.api.rackspacecloud.com"); properties.setProperty(PROPERTY_API_VERSION, OpenStackAuthAsyncClient.VERSION); return properties; diff --git a/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKTemplateBuilderLiveTest.java b/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKTemplateBuilderLiveTest.java index 86a8d4019c..c103555616 100644 --- a/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKTemplateBuilderLiveTest.java +++ b/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKTemplateBuilderLiveTest.java @@ -22,6 +22,8 @@ package org.jclouds.rackspace.cloudservers.compute; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; +import java.util.Set; + import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; @@ -29,6 +31,7 @@ import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; /** * @@ -69,8 +72,12 @@ public class CloudServersUKTemplateBuilderLiveTest extends BaseTemplateBuilderLi assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "10.04"); assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(defaultTemplate.getLocation().getId(), "UK"); + assertEquals(defaultTemplate.getLocation().getId(), provider); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("GB-SLG"); + } } diff --git a/providers/cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/CloudServersUSPropertiesBuilder.java b/providers/cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/CloudServersUSPropertiesBuilder.java index 688b685b9e..d363fa6954 100644 --- a/providers/cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/CloudServersUSPropertiesBuilder.java +++ b/providers/cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/CloudServersUSPropertiesBuilder.java @@ -21,7 +21,7 @@ package org.jclouds.rackspace.cloudservers; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; -import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import java.util.Properties; @@ -37,7 +37,7 @@ public class CloudServersUSPropertiesBuilder extends PropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_REGIONS, "US"); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-IL,US-TX"); properties.setProperty(PROPERTY_ENDPOINT, "https://auth.api.rackspacecloud.com"); properties.setProperty(PROPERTY_API_VERSION, OpenStackAuthAsyncClient.VERSION); return properties; diff --git a/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSTemplateBuilderLiveTest.java b/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSTemplateBuilderLiveTest.java index 5b8e199b7b..ce5f4f90e2 100644 --- a/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSTemplateBuilderLiveTest.java +++ b/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSTemplateBuilderLiveTest.java @@ -22,6 +22,8 @@ package org.jclouds.rackspace.cloudservers.compute; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; +import java.util.Set; + import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; @@ -29,6 +31,7 @@ import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; /** * @@ -69,7 +72,12 @@ public class CloudServersUSTemplateBuilderLiveTest extends BaseTemplateBuilderLi assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "10.04"); assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(defaultTemplate.getLocation().getId(), "US"); + assertEquals(defaultTemplate.getLocation().getId(), provider); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } + + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US-IL", "US-TX"); + } } diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaZurichPropertiesBuilder.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaZurichPropertiesBuilder.java index b66062e3eb..fbd07b5678 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaZurichPropertiesBuilder.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaZurichPropertiesBuilder.java @@ -20,6 +20,7 @@ package org.jclouds.cloudsigma; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import java.util.Properties; @@ -32,6 +33,7 @@ public class CloudSigmaZurichPropertiesBuilder extends CloudSigmaPropertiesBuild @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_ISO3166_CODES, "CH-ZH"); properties.setProperty(PROPERTY_ENDPOINT, "https://api.cloudsigma.com"); return properties; } diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaComputeServiceAdapter.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaComputeServiceAdapter.java index 24f9d0d3af..ec6fc4a9f2 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaComputeServiceAdapter.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaComputeServiceAdapter.java @@ -23,7 +23,6 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.filter; import static org.jclouds.concurrent.FutureIterables.transformParallel; -import java.net.URI; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; @@ -56,9 +55,7 @@ import org.jclouds.compute.domain.internal.VolumeImpl; 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.location.Provider; +import org.jclouds.location.suppliers.JustProvider; import org.jclouds.logging.Logger; import com.google.common.base.Function; @@ -75,21 +72,20 @@ import com.google.common.collect.ImmutableSet.Builder; */ @Singleton public class CloudSigmaComputeServiceAdapter implements - ComputeServiceAdapter { + ComputeServiceAdapter { private static final Predicate PREINSTALLED_DISK = Predicates.and(Predicates.notNull(), - new Predicate() { + new Predicate() { - @Override - public boolean apply(DriveInfo drive) { - return drive.getType().equals(DriveType.DISK) && drive.getDriveType().contains("preinstalled"); - } + @Override + public boolean apply(DriveInfo drive) { + return drive.getType().equals(DriveType.DISK) && drive.getDriveType().contains("preinstalled"); + } - }); + }); private final CloudSigmaClient client; private final CloudSigmaAsyncClient aclient; private final Predicate driveNotClaimed; - private final String providerName; - private final URI providerURI; + private final JustProvider locationSupplier; private final String defaultVncPassword; private final Map cache; private final ExecutorService executor; @@ -100,14 +96,13 @@ public class CloudSigmaComputeServiceAdapter implements @Inject public CloudSigmaComputeServiceAdapter(CloudSigmaClient client, CloudSigmaAsyncClient aclient, - Predicate driveNotClaimed, @Provider String providerName, @Provider URI providerURI, - @Named(CloudSigmaConstants.PROPERTY_VNC_PASSWORD) String defaultVncPassword, Map cache, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + Predicate driveNotClaimed, JustProvider locationSupplier, + @Named(CloudSigmaConstants.PROPERTY_VNC_PASSWORD) String defaultVncPassword, Map cache, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.client = checkNotNull(client, "client"); this.aclient = checkNotNull(aclient, "aclient"); this.driveNotClaimed = checkNotNull(driveNotClaimed, "driveNotClaimed"); - this.providerName = checkNotNull(providerName, "providerName"); - this.providerURI = checkNotNull(providerURI, "providerURI"); + this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier"); this.defaultVncPassword = checkNotNull(defaultVncPassword, "defaultVncPassword"); this.cache = checkNotNull(cache, "cache"); this.executor = checkNotNull(executor, "executor"); @@ -115,11 +110,11 @@ public class CloudSigmaComputeServiceAdapter implements @Override public ServerInfo runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, - Map credentialStore) { + Map credentialStore) { long bootSize = (long) (template.getHardware().getVolumes().get(0).getSize() * 1024 * 1024 * 1024l); logger.debug(">> imaging boot drive source(%s) bytes(%d)", template.getImage().getId(), bootSize); DriveInfo drive = client.cloneDrive(template.getImage().getId(), template.getImage().getId(), - new CloneDriveOptions().size(bootSize)); + new CloneDriveOptions().size(bootSize)); boolean success = driveNotClaimed.apply(drive); logger.debug("<< image(%s) complete(%s)", drive.getUuid(), success); if (!success) { @@ -127,7 +122,7 @@ public class CloudSigmaComputeServiceAdapter implements throw new IllegalStateException("could not image drive in time!"); } Server toCreate = Servers.small(name, drive.getUuid(), defaultVncPassword).mem(template.getHardware().getRam()) - .cpu((int) (template.getHardware().getProcessors().get(0).getSpeed())).build(); + .cpu((int) (template.getHardware().getProcessors().get(0).getSpeed())).build(); logger.debug(">> creating server"); ServerInfo from = client.createServer(toCreate); @@ -159,8 +154,8 @@ public class CloudSigmaComputeServiceAdapter implements return "sizeLessThanOrEqual(" + size + ")"; } - }).ids(id).ram(ram).processors(ImmutableList.of(new Processor(1, cpu))) - .volumes(ImmutableList. of(new VolumeImpl(size, true, true))).build()); + }).ids(id).ram(ram).processors(ImmutableList.of(new Processor(1, cpu))).volumes( + ImmutableList. of(new VolumeImpl(size, true, true))).build()); } return hardware.build(); } @@ -171,14 +166,14 @@ public class CloudSigmaComputeServiceAdapter implements @Override public Iterable listImages() { Iterable drives = transformParallel(client.listStandardDrives(), - new Function>() { + new Function>() { - @Override - public Future apply(String input) { - return aclient.getDriveInfo(input); - } + @Override + public Future apply(String input) { + return aclient.getDriveInfo(input); + } - }, executor, null, logger, "drives"); + }, executor, null, logger, "drives"); Iterable returnVal = filter(drives, PREINSTALLED_DISK); for (DriveInfo drive : returnVal) cache.put(drive.getUuid(), drive); @@ -191,10 +186,10 @@ public class CloudSigmaComputeServiceAdapter implements return (Iterable) client.listServerInfo(); } + @SuppressWarnings("unchecked") @Override public Iterable listLocations() { - return ImmutableSet. of(new LocationImpl(LocationScope.PROVIDER, providerName, providerURI - .toASCIIString(), null)); + return (Iterable) locationSupplier.get(); } @Override diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/config/CloudSigmaComputeServiceContextModule.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/config/CloudSigmaComputeServiceContextModule.java index 03ec5b677c..913e4bdcae 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/config/CloudSigmaComputeServiceContextModule.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/config/CloudSigmaComputeServiceContextModule.java @@ -52,11 +52,13 @@ import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; import org.jclouds.functions.IdentityFunction; +import org.jclouds.location.suppliers.OnlyLocationOrFirstZone; import org.jclouds.predicates.RetryablePredicate; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.base.Supplier; import com.google.common.collect.MapMaker; import com.google.inject.Injector; import com.google.inject.Provides; @@ -101,7 +103,8 @@ public class CloudSigmaComputeServiceContextModule }).to(FindImageForId.class); bind(new TypeLiteral>() { }).to(ParseOsFamilyVersion64BitFromImageName.class); - + bind(new TypeLiteral>() { + }).to(OnlyLocationOrFirstZone.class); } @Provides diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderLiveTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderLiveTest.java index b782e551a6..66982c9005 100644 --- a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderLiveTest.java +++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/compute/CloudSigmaTemplateBuilderLiveTest.java @@ -23,6 +23,7 @@ import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; import java.io.IOException; +import java.util.Set; import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.domain.OsFamily; @@ -31,6 +32,7 @@ import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; /** * @@ -74,4 +76,9 @@ public class CloudSigmaTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTe assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } + + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("CH-ZH"); + } } \ No newline at end of file diff --git a/providers/elastichosts-lon-b/src/main/java/org/jclouds/elastichosts/ElasticHostsBlueSquareLondonPropertiesBuilder.java b/providers/elastichosts-lon-b/src/main/java/org/jclouds/elastichosts/ElasticHostsBlueSquareLondonPropertiesBuilder.java index bbaf002b3c..f225c67050 100644 --- a/providers/elastichosts-lon-b/src/main/java/org/jclouds/elastichosts/ElasticHostsBlueSquareLondonPropertiesBuilder.java +++ b/providers/elastichosts-lon-b/src/main/java/org/jclouds/elastichosts/ElasticHostsBlueSquareLondonPropertiesBuilder.java @@ -21,6 +21,7 @@ package org.jclouds.elastichosts; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import java.util.Properties; @@ -35,6 +36,7 @@ public class ElasticHostsBlueSquareLondonPropertiesBuilder extends ElasticStackP @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_ISO3166_CODES, "GB-LND"); properties.setProperty(PROPERTY_ENDPOINT, "https://api.lon-p.elastichosts.com"); properties.setProperty(PROPERTY_API_VERSION, "1.0"); return properties; diff --git a/providers/elastichosts-lon-b/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsBlueSquareLondonTemplateBuilderLiveTest.java b/providers/elastichosts-lon-b/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsBlueSquareLondonTemplateBuilderLiveTest.java index e4eae7a638..41ce845c0d 100644 --- a/providers/elastichosts-lon-b/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsBlueSquareLondonTemplateBuilderLiveTest.java +++ b/providers/elastichosts-lon-b/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsBlueSquareLondonTemplateBuilderLiveTest.java @@ -22,6 +22,8 @@ package org.jclouds.elastichosts.compute; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; +import java.util.Set; + import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; @@ -29,6 +31,7 @@ import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; /** * @@ -75,4 +78,8 @@ public class ElasticHostsBlueSquareLondonTemplateBuilderLiveTest extends BaseTem assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("GB-LND"); + } } diff --git a/providers/elastichosts-lon-p/src/main/java/org/jclouds/elastichosts/ElasticHostsPeer1LondonPropertiesBuilder.java b/providers/elastichosts-lon-p/src/main/java/org/jclouds/elastichosts/ElasticHostsPeer1LondonPropertiesBuilder.java index ea501bd324..1d3a92ec97 100644 --- a/providers/elastichosts-lon-p/src/main/java/org/jclouds/elastichosts/ElasticHostsPeer1LondonPropertiesBuilder.java +++ b/providers/elastichosts-lon-p/src/main/java/org/jclouds/elastichosts/ElasticHostsPeer1LondonPropertiesBuilder.java @@ -21,6 +21,7 @@ package org.jclouds.elastichosts; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import java.util.Properties; @@ -35,6 +36,7 @@ public class ElasticHostsPeer1LondonPropertiesBuilder extends ElasticStackProper @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_ISO3166_CODES, "GB-LND"); properties.setProperty(PROPERTY_ENDPOINT, "https://api.lon-p.elastichosts.com"); properties.setProperty(PROPERTY_API_VERSION, "1.0"); return properties; diff --git a/providers/elastichosts-lon-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1LondonTemplateBuilderLiveTest.java b/providers/elastichosts-lon-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1LondonTemplateBuilderLiveTest.java index 12da914a2f..dfc8f57bcf 100644 --- a/providers/elastichosts-lon-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1LondonTemplateBuilderLiveTest.java +++ b/providers/elastichosts-lon-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1LondonTemplateBuilderLiveTest.java @@ -22,6 +22,8 @@ package org.jclouds.elastichosts.compute; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; +import java.util.Set; + import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; @@ -29,6 +31,7 @@ import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; /** * @@ -75,4 +78,8 @@ public class ElasticHostsPeer1LondonTemplateBuilderLiveTest extends BaseTemplate assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("GB-LND"); + } } diff --git a/providers/elastichosts-sat-p/src/main/java/org/jclouds/elastichosts/ElasticHostsPeer1SanAntonioPropertiesBuilder.java b/providers/elastichosts-sat-p/src/main/java/org/jclouds/elastichosts/ElasticHostsPeer1SanAntonioPropertiesBuilder.java index 13327f11ce..e4b9100ed1 100644 --- a/providers/elastichosts-sat-p/src/main/java/org/jclouds/elastichosts/ElasticHostsPeer1SanAntonioPropertiesBuilder.java +++ b/providers/elastichosts-sat-p/src/main/java/org/jclouds/elastichosts/ElasticHostsPeer1SanAntonioPropertiesBuilder.java @@ -21,6 +21,7 @@ package org.jclouds.elastichosts; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import java.util.Properties; @@ -35,6 +36,7 @@ public class ElasticHostsPeer1SanAntonioPropertiesBuilder extends ElasticStackPr @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-TX"); properties.setProperty(PROPERTY_ENDPOINT, "https://api.sat-p.elastichosts.com"); properties.setProperty(PROPERTY_API_VERSION, "1.0"); return properties; diff --git a/providers/elastichosts-sat-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest.java b/providers/elastichosts-sat-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest.java index 88ba53c96c..c85c7d8f98 100644 --- a/providers/elastichosts-sat-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest.java +++ b/providers/elastichosts-sat-p/src/test/java/org/jclouds/elastichosts/compute/ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest.java @@ -22,6 +22,8 @@ package org.jclouds.elastichosts.compute; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; +import java.util.Set; + import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; @@ -29,6 +31,7 @@ import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; /** * @@ -75,4 +78,8 @@ public class ElasticHostsPeer1SanAntonioTemplateBuilderLiveTest extends BaseTemp assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US-TX"); + } } diff --git a/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudPropertiesBuilder.java b/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudPropertiesBuilder.java index 06183ae7a8..813e12617f 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudPropertiesBuilder.java +++ b/providers/eucalyptus-partnercloud-ec2/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudPropertiesBuilder.java @@ -20,6 +20,10 @@ package org.jclouds.epc; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; +import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGION; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS; import java.util.Properties; @@ -31,9 +35,13 @@ import org.jclouds.eucalyptus.EucalyptusPropertiesBuilder; * @author Adrian Cole */ public class EucalyptusPartnerCloudPropertiesBuilder extends EucalyptusPropertiesBuilder { + @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_REGIONS, "Eucalyptus"); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-CA"); + properties.setProperty(PROPERTY_REGION + ".Eucalyptus." + ISO3166_CODES, "US-CA"); properties.setProperty("eucalyptus-partnercloud-ec2.virtualization-type", "kvm"); properties.setProperty(PROPERTY_ENDPOINT, "http://partnercloud.eucalyptus.com:8773/services/Eucalyptus"); return properties; diff --git a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java index e8e4540dfe..e4b42d70a0 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java +++ b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest.java @@ -23,6 +23,7 @@ import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; import java.io.IOException; +import java.util.Set; import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.domain.OsFamily; @@ -31,6 +32,7 @@ import org.jclouds.compute.domain.os.OsFamilyVersion64Bit; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; /** * @@ -78,4 +80,8 @@ public class EucalyptusPartnerCloudEucalyptusTemplateBuilderLiveTest extends Bas } + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US-CA"); + } } diff --git a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/strategy/EucalyptusPartnerCloudReviseParsedImageTest.java b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/strategy/EucalyptusPartnerCloudReviseParsedImageTest.java index 3a8443ba0f..1300dd44fd 100644 --- a/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/strategy/EucalyptusPartnerCloudReviseParsedImageTest.java +++ b/providers/eucalyptus-partnercloud-ec2/src/test/java/org/jclouds/epc/compute/strategy/EucalyptusPartnerCloudReviseParsedImageTest.java @@ -31,8 +31,8 @@ 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.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.ec2.compute.functions.EC2ImageParser; import org.jclouds.ec2.compute.strategy.EC2PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.ec2.domain.Image; @@ -86,7 +86,8 @@ public class EucalyptusPartnerCloudReviseParsedImageTest { .build()); } - static Location defaultLocation = new LocationImpl(LocationScope.REGION, "us-east-1", "us-east-1", null); + static Location defaultLocation = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1").description( + "us-east-1").build(); public static Set convertImages(String resource) { diff --git a/providers/eucalyptus-partnercloud-s3/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudWalrusPropertiesBuilder.java b/providers/eucalyptus-partnercloud-s3/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudWalrusPropertiesBuilder.java index e1dfd9c441..cbcc160853 100644 --- a/providers/eucalyptus-partnercloud-s3/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudWalrusPropertiesBuilder.java +++ b/providers/eucalyptus-partnercloud-s3/src/main/java/org/jclouds/epc/EucalyptusPartnerCloudWalrusPropertiesBuilder.java @@ -20,6 +20,7 @@ package org.jclouds.epc; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import java.util.Properties; @@ -34,6 +35,7 @@ public class EucalyptusPartnerCloudWalrusPropertiesBuilder extends WalrusPropert @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-CA"); properties.setProperty(PROPERTY_ENDPOINT, "http://partnercloud.eucalyptus.com:8773/services/Walrus"); return properties; } diff --git a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest.java b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest.java index a71550469a..a216e13544 100644 --- a/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest.java +++ b/providers/eucalyptus-partnercloud-s3/src/test/java/org/jclouds/epc/blobstore/EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest.java @@ -19,13 +19,21 @@ package org.jclouds.epc.blobstore; +import java.util.Set; + import org.jclouds.walrus.blobstore.WalrusServiceIntegrationLiveTest; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; + /** * @author Adrian Cole */ -@Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest") +@Test(groups = "live", testName = "EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest") public class EucalyptusPartnerCloudWalrusServiceIntegrationLiveTest extends WalrusServiceIntegrationLiveTest { - + @Override + protected Set getIso3166Codes() { + return ImmutableSet. of("US-CA"); + } + } diff --git a/providers/gogrid/src/main/java/org/jclouds/gogrid/GoGridPropertiesBuilder.java b/providers/gogrid/src/main/java/org/jclouds/gogrid/GoGridPropertiesBuilder.java index 02ef3cff94..90abfa1e3c 100644 --- a/providers/gogrid/src/main/java/org/jclouds/gogrid/GoGridPropertiesBuilder.java +++ b/providers/gogrid/src/main/java/org/jclouds/gogrid/GoGridPropertiesBuilder.java @@ -21,7 +21,11 @@ package org.jclouds.gogrid; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_ISO3166_CODES; import static org.jclouds.gogrid.reference.GoGridConstants.PROPERTY_GOGRID_DEFAULT_DC; +import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONE; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONES; import java.util.Properties; @@ -38,6 +42,10 @@ public class GoGridPropertiesBuilder extends PropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_ZONES, "1,2"); + properties.setProperty(PROPERTY_ISO3166_CODES, "US-CA,US-VA"); + properties.setProperty(PROPERTY_ZONE + ".1." + ISO3166_CODES, "US-CA"); + properties.setProperty(PROPERTY_ZONE + ".2." + ISO3166_CODES, "US-VA"); properties.setProperty(PROPERTY_API_VERSION, GoGridAsyncClient.VERSION); properties.setProperty(PROPERTY_ENDPOINT, "https://api.gogrid.com/api"); properties.setProperty(PROPERTY_GOGRID_DEFAULT_DC, "1"); diff --git a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridLocationSupplier.java b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridLocationSupplier.java index 3aadcc038a..01e1ea92d9 100644 --- a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridLocationSupplier.java +++ b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridLocationSupplier.java @@ -19,52 +19,61 @@ package org.jclouds.gogrid.compute.suppliers; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; import java.util.Set; -import javax.annotation.Resource; import javax.inject.Inject; -import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.gogrid.GoGridClient; import org.jclouds.gogrid.domain.Option; +import org.jclouds.location.Iso3166; import org.jclouds.location.Provider; -import org.jclouds.logging.Logger; +import org.jclouds.location.suppliers.JustProvider; -import com.google.common.base.Supplier; -import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.ImmutableSet.Builder; /** * * @author Adrian Cole */ @Singleton -public class GoGridLocationSupplier implements Supplier> { +public class GoGridLocationSupplier extends JustProvider { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - private final String providerName; private final GoGridClient sync; + private final Map> isoCodesById; @Inject - GoGridLocationSupplier(@Provider String providerName, GoGridClient sync) { - this.providerName = providerName; - this.sync = sync; + GoGridLocationSupplier(@Iso3166 Set isoCodes, @Provider String providerName, @Provider URI endpoint, + GoGridClient sync, @Iso3166 Map> isoCodesById) { + super(isoCodes, providerName, endpoint); + this.sync = checkNotNull(sync, "sync"); + this.isoCodesById = checkNotNull(isoCodesById, "isoCodesById"); } @Override public Set get() { - final Set locations = Sets.newHashSet(); - logger.debug(">> providing locations"); - Location parent = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); - for (Option dc : sync.getServerServices().getDatacenters()) - locations.add(new LocationImpl(LocationScope.ZONE, dc.getId() + "", dc.getDescription(), parent)); - logger.debug("<< locations(%d)", locations.size()); - return locations; + Builder locations = ImmutableSet.builder(); + Set

* @@ -119,7 +120,7 @@ public interface ComputeService { * If resources such as security groups are needed, they will be reused or created for you. * Inbound port 22 will always be opened up. * - * @param tag + * @param group * - common identifier to group nodes by, cannot contain hyphens * @param count * - how many to fire up. @@ -131,19 +132,38 @@ public interface ComputeService { * when there's a problem applying options to nodes. Note that successful and failed * nodes are a part of this exception, so be sure to inspect this carefully. */ + Set createNodesInGroup(String group, int count, Template template) throws RunNodesException; + + /** + * Like {@link ComputeService#createNodesInGroup(String,int,Template)}, except that the template + * is default, equivalent to {@code templateBuilder().any().options(templateOptions)}. + */ + Set createNodesInGroup(String group, int count, TemplateOptions templateOptions) + throws RunNodesException; + + /** + * Like {@link ComputeService#createNodesInGroup(String,int,TemplateOptions)}, except that the + * options are default, as specified in {@link ComputeService#templateOptions}. + */ + Set createNodesInGroup(String group, int count) throws RunNodesException; + + /** + * @see #createNodesInGroup(String , int , Template ) + */ + @Deprecated Set runNodesWithTag(String tag, int count, Template template) throws RunNodesException; /** - * Like {@link ComputeService#runNodesWithTag(String,int,Template)}, except that the template is - * default, equivalent to {@code templateBuilder().any().options(templateOptions)}. + * @see #createNodesInGroup(String , int , TemplateOptions ) */ + @Deprecated Set runNodesWithTag(String tag, int count, TemplateOptions templateOptions) throws RunNodesException; /** - * Like {@link ComputeService#runNodesWithTag(String,int,TemplateOptions)}, except that the - * options are default, as specified in {@link ComputeService#templateOptions}. + * @see #createNodesInGroup(String , int ) */ + @Deprecated Set runNodesWithTag(String tag, int count) throws RunNodesException; /** @@ -272,6 +292,13 @@ public interface ComputeService { Map runScriptOnNodesMatching(Predicate filter, Statement runScript) throws RunScriptOnNodesException; + /** + * + * @see ComputeService#runScriptOnNodesMatching(Predicate, Statement, RunScriptOptions) + */ + Map runScriptOnNodesMatching(Predicate filter, String runScript, + RunScriptOptions options) throws RunScriptOnNodesException; + /** * Run the script on all nodes with the specific predicate. * diff --git a/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java b/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java index 55ec6ad6b1..06f086b1dc 100644 --- a/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java +++ b/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java @@ -60,7 +60,7 @@ public interface ComputeServiceAdapter { * @see ComputeService#runNodesWithTag(String, int, Template) * @see ComputeServiceContext#getCredentialStore */ - N runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, + N createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template, Map credentialStore); /** diff --git a/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java b/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java index dfa70466ab..b39b19b5e8 100644 --- a/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java +++ b/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java @@ -40,7 +40,7 @@ public interface JCloudsNativeComputeServiceAdapter extends * {@inheritDoc} */ @Override - NodeMetadata runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, + NodeMetadata createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template, Map credentialStore); /** diff --git a/compute/src/main/java/org/jclouds/compute/config/BindComputeStrategiesByClass.java b/compute/src/main/java/org/jclouds/compute/config/BindComputeStrategiesByClass.java index 0e3264fa39..647d47273f 100644 --- a/compute/src/main/java/org/jclouds/compute/config/BindComputeStrategiesByClass.java +++ b/compute/src/main/java/org/jclouds/compute/config/BindComputeStrategiesByClass.java @@ -19,15 +19,15 @@ package org.jclouds.compute.config; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; 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.CreateNodesInGroupThenAddToSet; import org.jclouds.compute.strategy.ResumeNodeStrategy; import org.jclouds.compute.strategy.SuspendNodeStrategy; -import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThenAddToSet; import com.google.inject.AbstractModule; import com.google.inject.Scopes; @@ -49,15 +49,15 @@ public abstract class BindComputeStrategiesByClass extends AbstractModule { bindDestroyNodeStrategy(defineDestroyNodeStrategy()); } - protected void bindRunNodesAndAddToSetStrategy(Class clazz) { - bind(RunNodesAndAddToSetStrategy.class).to(clazz).in(Scopes.SINGLETON); + protected void bindRunNodesAndAddToSetStrategy(Class clazz) { + bind(CreateNodesInGroupThenAddToSet.class).to(clazz).in(Scopes.SINGLETON); } /** - * needed, if {@link RunNodesAndAddToSetStrategy} requires it + * needed, if {@link CreateNodesInGroupThenAddToSet} requires it */ - protected void bindAddNodeWithTagStrategy(Class clazz) { - bind(AddNodeWithTagStrategy.class).to(clazz).in(Scopes.SINGLETON); + protected void bindAddNodeWithTagStrategy(Class clazz) { + bind(CreateNodeWithGroupEncodedIntoName.class).to(clazz).in(Scopes.SINGLETON); } protected void bindDestroyNodeStrategy(Class clazz) { @@ -84,14 +84,14 @@ public abstract class BindComputeStrategiesByClass extends AbstractModule { bind(ListNodesStrategy.class).to(clazz).in(Scopes.SINGLETON); } - protected Class defineRunNodesAndAddToSetStrategy() { - return EncodeTagIntoNameRunNodesAndAddToSetStrategy.class; + protected Class defineRunNodesAndAddToSetStrategy() { + return CreateNodesWithGroupEncodedIntoNameThenAddToSet.class; } /** - * needed, if {@link RunNodesAndAddToSetStrategy} requires it + * needed, if {@link CreateNodesInGroupThenAddToSet} requires it */ - protected abstract Class defineAddNodeWithTagStrategy(); + protected abstract Class defineAddNodeWithTagStrategy(); protected abstract Class defineDestroyNodeStrategy(); diff --git a/compute/src/main/java/org/jclouds/compute/config/ComputeServiceAdapterContextModule.java b/compute/src/main/java/org/jclouds/compute/config/ComputeServiceAdapterContextModule.java index 717d777576..9d568e2efa 100644 --- a/compute/src/main/java/org/jclouds/compute/config/ComputeServiceAdapterContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/ComputeServiceAdapterContextModule.java @@ -29,7 +29,7 @@ import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.internal.ComputeServiceContextImpl; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.compute.strategy.DestroyNodeStrategy; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.compute.strategy.ListNodesStrategy; @@ -114,7 +114,7 @@ public class ComputeServiceAdapterContextModule extends BaseCo @Provides @Singleton - protected AddNodeWithTagStrategy defineAddNodeWithTagStrategy(AdaptingComputeServiceStrategies in) { + protected CreateNodeWithGroupEncodedIntoName defineAddNodeWithTagStrategy(AdaptingComputeServiceStrategies in) { return in; } diff --git a/compute/src/main/java/org/jclouds/compute/domain/NodeMetadata.java b/compute/src/main/java/org/jclouds/compute/domain/NodeMetadata.java index 7607904935..1ff3894820 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/NodeMetadata.java +++ b/compute/src/main/java/org/jclouds/compute/domain/NodeMetadata.java @@ -37,11 +37,17 @@ public interface NodeMetadata extends ComputeMetadata { /** * Tag used for all resources that belong to the same logical group. run, destroy commands are - * scoped to tag. + * scoped to group. * - * @return tag for this node, or null, if not a part of a group + * @return group for this node, or null, if not a part of a group * */ + String getGroup(); + + /** + * @see #getGroup + */ + @Deprecated String getTag(); /** diff --git a/compute/src/main/java/org/jclouds/compute/domain/NodeMetadataBuilder.java b/compute/src/main/java/org/jclouds/compute/domain/NodeMetadataBuilder.java index 0cb46e7d6a..a3a5efff55 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/NodeMetadataBuilder.java +++ b/compute/src/main/java/org/jclouds/compute/domain/NodeMetadataBuilder.java @@ -46,7 +46,7 @@ public class NodeMetadataBuilder extends ComputeMetadataBuilder { @Nullable private Credentials credentials; @Nullable - private String tag; + private String group; private int loginPort = 22; @Nullable private String imageId; @@ -89,8 +89,8 @@ public class NodeMetadataBuilder extends ComputeMetadataBuilder { return this; } - public NodeMetadataBuilder tag(@Nullable String tag) { - this.tag = tag; + public NodeMetadataBuilder group(@Nullable String group) { + this.group = group; return this; } @@ -146,13 +146,13 @@ public class NodeMetadataBuilder extends ComputeMetadataBuilder { @Override public NodeMetadata build() { - return new NodeMetadataImpl(providerId, name, id, location, uri, userMetadata, tag, hardware, imageId, os, state, + return new NodeMetadataImpl(providerId, name, id, location, uri, userMetadata, group, hardware, imageId, os, state, loginPort, publicAddresses, privateAddresses, adminPassword, credentials); } public static NodeMetadataBuilder fromNodeMetadata(NodeMetadata node) { return new NodeMetadataBuilder().providerId(node.getProviderId()).name(node.getName()).id(node.getId()).location( - node.getLocation()).uri(node.getUri()).userMetadata(node.getUserMetadata()).tag(node.getTag()).hardware( + node.getLocation()).uri(node.getUri()).userMetadata(node.getUserMetadata()).group(node.getGroup()).hardware( node.getHardware()).imageId(node.getImageId()).operatingSystem(node.getOperatingSystem()).state( node.getState()).loginPort(node.getLoginPort()).publicAddresses(node.getPublicAddresses()) .privateAddresses(node.getPrivateAddresses()).adminPassword(node.getAdminPassword()).credentials( diff --git a/compute/src/main/java/org/jclouds/compute/domain/internal/NodeMetadataImpl.java b/compute/src/main/java/org/jclouds/compute/domain/internal/NodeMetadataImpl.java index ad92ebda1f..e7f14b4f6b 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/internal/NodeMetadataImpl.java +++ b/compute/src/main/java/org/jclouds/compute/domain/internal/NodeMetadataImpl.java @@ -55,7 +55,7 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat @Nullable private final Credentials credentials; @Nullable - private final String tag; + private final String group; @Nullable private final String imageId; @Nullable @@ -64,12 +64,12 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat private final OperatingSystem os; public NodeMetadataImpl(String providerId, String name, String id, Location location, URI uri, - Map userMetadata, @Nullable String tag, @Nullable Hardware hardware, + Map userMetadata, @Nullable String group, @Nullable Hardware hardware, @Nullable String imageId, @Nullable OperatingSystem os, NodeState state, int loginPort, Iterable publicAddresses, Iterable privateAddresses, @Nullable String adminPassword, @Nullable Credentials credentials) { super(ComputeType.NODE, providerId, name, id, location, uri, userMetadata); - this.tag = tag; + this.group = group; this.hardware = hardware; this.imageId = imageId; this.os = os; @@ -86,7 +86,15 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat */ @Override public String getTag() { - return tag; + return getGroup(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getGroup() { + return group; } /** @@ -163,7 +171,7 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat @Override public String toString() { - return "[id=" + getId() + ", providerId=" + getProviderId() + ", tag=" + getTag() + ", name=" + getName() + return "[id=" + getId() + ", providerId=" + getProviderId() + ", group=" + getTag() + ", name=" + getName() + ", location=" + getLocation() + ", uri=" + getUri() + ", imageId=" + getImageId() + ", os=" + getOperatingSystem() + ", state=" + getState() + ", loginPort=" + getLoginPort() + ", privateAddresses=" + privateAddresses + ", publicAddresses=" + publicAddresses + ", hardware=" @@ -178,7 +186,7 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat result = prime * result + loginPort; result = prime * result + ((privateAddresses == null) ? 0 : privateAddresses.hashCode()); result = prime * result + ((publicAddresses == null) ? 0 : publicAddresses.hashCode()); - result = prime * result + ((tag == null) ? 0 : tag.hashCode()); + result = prime * result + ((group == null) ? 0 : group.hashCode()); result = prime * result + ((imageId == null) ? 0 : imageId.hashCode()); result = prime * result + ((hardware == null) ? 0 : hardware.hashCode()); result = prime * result + ((os == null) ? 0 : os.hashCode()); @@ -208,10 +216,10 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat return false; } else if (!publicAddresses.equals(other.publicAddresses)) return false; - if (tag == null) { - if (other.tag != null) + if (group == null) { + if (other.group != null) return false; - } else if (!tag.equals(other.tag)) + } else if (!group.equals(other.group)) return false; if (imageId == null) { if (other.imageId != null) diff --git a/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java b/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java index 4104e6821c..33be65a04c 100755 --- a/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java +++ b/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java @@ -76,7 +76,7 @@ import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap; import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.ResumeNodeStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet; import org.jclouds.compute.strategy.RunScriptOnNodeAndAddToGoodMapOrPutExceptionIntoBadMap; import org.jclouds.compute.strategy.SuspendNodeStrategy; import org.jclouds.domain.Credentials; @@ -116,7 +116,7 @@ public class BaseComputeService implements ComputeService { private final Supplier> locations; private final ListNodesStrategy listNodesStrategy; private final GetNodeMetadataStrategy getNodeMetadataStrategy; - private final RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy; + private final CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy; private final RebootNodeStrategy rebootNodeStrategy; private final DestroyNodeStrategy destroyNodeStrategy; private final ResumeNodeStrategy resumeNodeStrategy; @@ -135,7 +135,7 @@ public class BaseComputeService implements ComputeService { @Memoized Supplier> images, @Memoized Supplier> hardwareProfiles, @Memoized Supplier> locations, ListNodesStrategy listNodesStrategy, - GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, ResumeNodeStrategy resumeNodeStrategy, SuspendNodeStrategy suspendNodeStrategy, Provider templateBuilderProvider, Provider templateOptionsProvider, @@ -178,45 +178,63 @@ public class BaseComputeService implements ComputeService { * {@inheritDoc} */ @Override - public Set runNodesWithTag(String tag, int count, Template template) + public Set runNodesWithTag(String group, int count, Template template) throws RunNodesException { - checkNotNull(tag, "tag cannot be null"); + return createNodesInGroup(group, count, template); + } + + /** + * {@inheritDoc} + */ + @Override + public Set runNodesWithTag(String group, int count, TemplateOptions templateOptions) + throws RunNodesException { + return createNodesInGroup(group, count, templateBuilder().any().options(templateOptions).build()); + } + + /** + * {@inheritDoc} + */ + @Override + public Set runNodesWithTag(String group, int count) throws RunNodesException { + return createNodesInGroup(group, count, templateOptions()); + } + + @Override + public Set createNodesInGroup(String group, int count, Template template) + throws RunNodesException { + checkNotNull(group, "group cannot be null"); checkNotNull(template.getLocation(), "location"); - logger.debug(">> running %d node%s tag(%s) location(%s) image(%s) hardwareProfile(%s) options(%s)", count, - count > 1 ? "s" : "", tag, template.getLocation().getId(), template.getImage().getId(), template + logger.debug(">> running %d node%s group(%s) location(%s) image(%s) hardwareProfile(%s) options(%s)", count, + count > 1 ? "s" : "", group, template.getLocation().getId(), template.getImage().getId(), template .getHardware().getId(), template.getOptions()); Set goodNodes = newLinkedHashSet(); Map badNodes = newLinkedHashMap(); Multimap customizationResponses = LinkedHashMultimap.create(); - Map> responses = runNodesAndAddToSetStrategy.execute(tag, count, template, goodNodes, badNodes, + Map> responses = runNodesAndAddToSetStrategy.execute(group, count, template, goodNodes, badNodes, customizationResponses); Map executionExceptions = awaitCompletion(responses, executor, null, logger, "runNodesWithTag(" - + tag + ")"); + + group + ")"); for (NodeMetadata node : concat(goodNodes, badNodes.keySet())) if (node.getCredentials() != null) credentialStore.put("node#" + node.getId(), node.getCredentials()); if (executionExceptions.size() > 0 || badNodes.size() > 0) { - throw new RunNodesException(tag, count, template, goodNodes, executionExceptions, badNodes); + throw new RunNodesException(group, count, template, goodNodes, executionExceptions, badNodes); } return goodNodes; } - /** - * {@inheritDoc} - */ @Override - public Set runNodesWithTag(String tag, int count, TemplateOptions templateOptions) + public Set createNodesInGroup(String group, int count, TemplateOptions templateOptions) throws RunNodesException { - return runNodesWithTag(tag, count, templateBuilder().any().options(templateOptions).build()); + return createNodesInGroup(group, count, templateBuilder().any().options(templateOptions).build()); + } - /** - * {@inheritDoc} - */ @Override - public Set runNodesWithTag(String tag, int count) throws RunNodesException { - return runNodesWithTag(tag, count, templateOptions()); + public Set createNodesInGroup(String group, int count) throws RunNodesException { + return createNodesInGroup(group, count, templateOptions()); } /** @@ -492,6 +510,13 @@ public class BaseComputeService implements ComputeService { return runScriptOnNodesMatching(filter, runScript, RunScriptOptions.NONE); } + @Override + public Map runScriptOnNodesMatching(Predicate filter, + String runScript, RunScriptOptions options) throws RunScriptOnNodesException { + return runScriptOnNodesMatching(filter, Statements.exec(checkNotNull(runScript, "runScript")), + RunScriptOptions.NONE); + } + /** * {@inheritDoc} */ @@ -562,4 +587,5 @@ public class BaseComputeService implements ComputeService { return executor.submit(initScriptRunnerFactory.create(node, script, options, badNodes)); } } + } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java b/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java index 4b503c854c..6be88dc194 100644 --- a/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java +++ b/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java @@ -42,11 +42,10 @@ public class ComputeServiceContextImpl implements ComputeServiceContext { private final Utils utils; private final Map credentialStore; - @SuppressWarnings({ "unchecked" }) + @SuppressWarnings( { "unchecked" }) @Inject public ComputeServiceContextImpl(ComputeService computeService, Map credentialStore, - Utils utils, - @SuppressWarnings("rawtypes") RestContext providerSpecificContext) { + Utils utils, @SuppressWarnings("rawtypes") RestContext providerSpecificContext) { this.credentialStore = credentialStore; this.utils = utils; this.providerSpecificContext = providerSpecificContext; @@ -57,7 +56,7 @@ public class ComputeServiceContextImpl implements ComputeServiceContext { return computeService; } - @SuppressWarnings({ "unchecked", "hiding" }) + @SuppressWarnings( { "unchecked", "hiding" }) @Override public RestContext getProviderSpecificContext() { return (RestContext) providerSpecificContext; @@ -67,7 +66,7 @@ public class ComputeServiceContextImpl implements ComputeServiceContext { public void close() { providerSpecificContext.close(); } - + @Override public Utils getUtils() { return utils(); diff --git a/compute/src/main/java/org/jclouds/compute/predicates/NodePredicates.java b/compute/src/main/java/org/jclouds/compute/predicates/NodePredicates.java index e13fba7fc0..05bcaf1029 100644 --- a/compute/src/main/java/org/jclouds/compute/predicates/NodePredicates.java +++ b/compute/src/main/java/org/jclouds/compute/predicates/NodePredicates.java @@ -42,8 +42,7 @@ import com.google.common.collect.Sets; */ public class NodePredicates { - private static class ParentLocationId implements - Predicate { + private static class ParentLocationId implements Predicate { private final String id; private ParentLocationId(String id) { @@ -156,8 +155,7 @@ public class NodePredicates { } /** - * Return nodes with the specific ids Note: returns all nodes, regardless of - * the state. + * Return nodes with the specific ids Note: returns all nodes, regardless of the state. * * @param ids * ids of the resources @@ -187,51 +185,67 @@ public class NodePredicates { } /** - * Return nodes with specified tag. Note: returns all nodes, regardless of - * the state. + * Return nodes in the specified group. Note: returns all nodes, regardless of the state. * - * @param tag - * tag to match the items + * @param group + * group to match the items * @return predicate */ - public static Predicate withTag(final String tag) { - Preconditions2.checkNotEmpty(tag, "Tag must be defined"); + public static Predicate inGroup(final String group) { + Preconditions2.checkNotEmpty(group, "group must be defined"); return new Predicate() { @Override public boolean apply(NodeMetadata nodeMetadata) { - return tag.equals(nodeMetadata.getTag()); + return group.equals(nodeMetadata.getGroup()); } @Override public String toString() { - return "withTag(" + tag + ")"; + return "inGroup(" + group + ")"; } }; } /** - * Return nodes with specified tag that are in the NODE_RUNNING state. * - * @param tag - * tag to match the items + * @see #inGroup(String) + */ + @Deprecated + public static Predicate withTag(final String tag) { + return inGroup(tag); + } + + /** + * Return nodes with specified group that are in the NODE_RUNNING state. + * + * @param group + * group to match the items * @return predicate */ - public static Predicate runningWithTag(final String tag) { - Preconditions2.checkNotEmpty(tag, "Tag must be defined"); + public static Predicate runningInGroup(final String group) { + Preconditions2.checkNotEmpty(group, "Tag must be defined"); return new Predicate() { @Override public boolean apply(NodeMetadata nodeMetadata) { - return tag.equals(nodeMetadata.getTag()) - && nodeMetadata.getState() == NodeState.RUNNING; + return group.equals(nodeMetadata.getGroup()) && nodeMetadata.getState() == NodeState.RUNNING; } @Override public String toString() { - return "runningWithTag(" + tag + ")"; + return "runningInGroup(" + group + ")"; } }; } + /** + * + * @see #inGroup(String) + */ + @Deprecated + public static Predicate runningWithTag(final String tag) { + return runningInGroup(tag); + } + /** * Match nodes with State == RUNNING */ diff --git a/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/CreateNodeWithGroupEncodedIntoName.java similarity index 80% rename from compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java rename to compute/src/main/java/org/jclouds/compute/strategy/CreateNodeWithGroupEncodedIntoName.java index d4904ccf54..6d91e532cf 100644 --- a/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/CreateNodeWithGroupEncodedIntoName.java @@ -27,21 +27,21 @@ import org.jclouds.compute.domain.Template; * * @author Adrian Cole */ -public interface AddNodeWithTagStrategy { +public interface CreateNodeWithGroupEncodedIntoName { /** * create a node given the name and template parameters such as imageid, hardwareid, and * locationid. * - * @param tag - * tag supplied by the user + * @param group + * group name supplied by the user * @param name - * supplied by {@link RunNodesAndAddToSetStrategy } and must have the tag encoded into + * supplied by {@link CreateNodesInGroupThenAddToSet } and must have the tag encoded into * it. * @param template * supplied by the user * @return NodeMetadata from the new object, most likely in some pending state. */ - NodeMetadata addNodeWithTag(String tag, String name, Template template); + NodeMetadata createNodeWithGroupEncodedIntoName(String group, String name, Template template); } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/strategy/RunNodesAndAddToSetStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/CreateNodesInGroupThenAddToSet.java similarity index 79% rename from compute/src/main/java/org/jclouds/compute/strategy/RunNodesAndAddToSetStrategy.java rename to compute/src/main/java/org/jclouds/compute/strategy/CreateNodesInGroupThenAddToSet.java index bfdcb17b83..0b89940ea0 100644 --- a/compute/src/main/java/org/jclouds/compute/strategy/RunNodesAndAddToSetStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/CreateNodesInGroupThenAddToSet.java @@ -26,19 +26,18 @@ import java.util.concurrent.Future; import org.jclouds.compute.config.CustomizationResponse; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThenAddToSet; import com.google.common.collect.Multimap; import com.google.inject.ImplementedBy; /** - * creates futures that correlate to * * @author Adrian Cole */ -@ImplementedBy(EncodeTagIntoNameRunNodesAndAddToSetStrategy.class) -public interface RunNodesAndAddToSetStrategy { +@ImplementedBy(CreateNodesWithGroupEncodedIntoNameThenAddToSet.class) +public interface CreateNodesInGroupThenAddToSet { - Map> execute(String tag, int count, Template template, Set goodNodes, + Map> execute(String group, int count, Template template, Set goodNodes, Map badNodes, Multimap customizationResponses); } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/strategy/impl/AdaptingComputeServiceStrategies.java b/compute/src/main/java/org/jclouds/compute/strategy/impl/AdaptingComputeServiceStrategies.java index fcb601adce..6ec428006d 100644 --- a/compute/src/main/java/org/jclouds/compute/strategy/impl/AdaptingComputeServiceStrategies.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/impl/AdaptingComputeServiceStrategies.java @@ -36,7 +36,7 @@ import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.Template; import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.compute.strategy.DestroyNodeStrategy; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.compute.strategy.ListNodesStrategy; @@ -55,7 +55,7 @@ import com.google.common.collect.Iterables; * */ @Singleton -public class AdaptingComputeServiceStrategies implements AddNodeWithTagStrategy, DestroyNodeStrategy, +public class AdaptingComputeServiceStrategies implements CreateNodeWithGroupEncodedIntoName, DestroyNodeStrategy, GetNodeMetadataStrategy, ListNodesStrategy, RebootNodeStrategy, ResumeNodeStrategy, SuspendNodeStrategy { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) @@ -129,12 +129,12 @@ public class AdaptingComputeServiceStrategies implements AddNodeWith * {@inheritDoc} */ @Override - public NodeMetadata addNodeWithTag(String tag, String name, Template template) { - checkState(tag != null, "tag (that which groups identical nodes together) must be specified"); - checkState(name != null && name.indexOf(tag) != -1, "name should have %s encoded into it", tag); + public NodeMetadata createNodeWithGroupEncodedIntoName(String group, String name, Template template) { + checkState(group != null, "group (that which groups identical nodes together) must be specified"); + checkState(name != null && name.indexOf(group) != -1, "name should have %s encoded into it", group); checkState(template != null, "template must be specified"); - N from = client.runNodeWithTagAndNameAndStoreCredentials(tag, name, template, credentialStore); + N from = client.createNodeWithGroupEncodedIntoNameThenStoreCredentials(group, name, template, credentialStore); NodeMetadata node = nodeMetadataAdapter.apply(from); return node; } diff --git a/compute/src/main/java/org/jclouds/compute/strategy/impl/EncodeTagIntoNameRunNodesAndAddToSetStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/impl/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java similarity index 92% rename from compute/src/main/java/org/jclouds/compute/strategy/impl/EncodeTagIntoNameRunNodesAndAddToSetStrategy.java rename to compute/src/main/java/org/jclouds/compute/strategy/impl/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java index aaadaab3a3..939bbeda00 100755 --- a/compute/src/main/java/org/jclouds/compute/strategy/impl/EncodeTagIntoNameRunNodesAndAddToSetStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/impl/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java @@ -44,10 +44,10 @@ import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap; import org.jclouds.compute.strategy.ListNodesStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet; import org.jclouds.logging.Logger; import com.google.common.base.Predicate; @@ -59,7 +59,7 @@ import com.google.common.collect.Multimap; * @author Adrian Cole */ @Singleton -public class EncodeTagIntoNameRunNodesAndAddToSetStrategy implements RunNodesAndAddToSetStrategy { +public class CreateNodesWithGroupEncodedIntoNameThenAddToSet implements CreateNodesInGroupThenAddToSet { private class AddNode implements Callable { private final String name; @@ -78,7 +78,7 @@ public class EncodeTagIntoNameRunNodesAndAddToSetStrategy implements RunNodesAnd logger.debug(">> adding node location(%s) name(%s) image(%s) hardware(%s)", template.getLocation().getId(), name, template.getImage().getProviderId(), template.getHardware() .getProviderId()); - node = addNodeWithTagStrategy.addNodeWithTag(tag, name, template); + node = addNodeWithTagStrategy.createNodeWithGroupEncodedIntoName(tag, name, template); logger.debug("<< %s node(%s)", node.getState(), node.getId()); return node; } @@ -92,15 +92,15 @@ public class EncodeTagIntoNameRunNodesAndAddToSetStrategy implements RunNodesAnd @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; - protected final AddNodeWithTagStrategy addNodeWithTagStrategy; + protected final CreateNodeWithGroupEncodedIntoName addNodeWithTagStrategy; protected final ListNodesStrategy listNodesStrategy; protected final String nodeNamingConvention; protected final ExecutorService executor; protected final CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory; @Inject - protected EncodeTagIntoNameRunNodesAndAddToSetStrategy( - AddNodeWithTagStrategy addNodeWithTagStrategy, + protected CreateNodesWithGroupEncodedIntoNameThenAddToSet( + CreateNodeWithGroupEncodedIntoName addNodeWithTagStrategy, ListNodesStrategy listNodesStrategy, @Named("NAMING_CONVENTION") String nodeNamingConvention, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, 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 c96a3ad16c..6b85faf226 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 @@ -80,13 +80,13 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda } @Override - public NodeMetadata runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, + public NodeMetadata createNodeWithGroupEncodedIntoNameThenStoreCredentials(String group, String name, Template template, Map credentialStore) { NodeMetadataBuilder builder = new NodeMetadataBuilder(); String id = idProvider.get() + ""; builder.ids(id); builder.name(name); - builder.tag(tag); + builder.group(group); builder.location(location.get()); builder.imageId(template.getImage().getId()); builder.operatingSystem(template.getImage().getOperatingSystem()); 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 e0bcc661a2..86007ddb5b 100644 --- a/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java +++ b/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java @@ -103,12 +103,11 @@ public class ComputeServiceUtils { /** * - * - * @return NOTAG#+from if tag cannot be parsed + * @return null if group cannot be parsed */ - public static String parseTagFromName(String from) { + public static String parseGroupFromName(String from) { Matcher matcher = DELIMETED_BY_HYPHEN_ENDING_IN_HYPHEN_HEX.matcher(from); - return matcher.find() ? matcher.group(1) : "NOTAG#" + from; + return matcher.find() ? matcher.group(1) : null; } public static double getCores(Hardware input) { diff --git a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java index 843123647f..7b37036fb1 100755 --- a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java @@ -99,7 +99,7 @@ import com.google.inject.Module; @Test(groups = { "integration", "live" }, sequential = true) public abstract class BaseComputeServiceLiveTest { - protected String tag; + protected String group; protected RetryablePredicate socketTester; protected SortedSet nodes; @@ -132,10 +132,10 @@ public abstract class BaseComputeServiceLiveTest { @BeforeGroups(groups = { "integration", "live" }) public void setupClient() throws InterruptedException, ExecutionException, TimeoutException, IOException { setServiceDefaults(); - if (tag == null) - tag = checkNotNull(provider, "provider"); - if (tag.indexOf('-') == -1) - tag = tag + "-"; + if (group == null) + group = checkNotNull(provider, "provider"); + if (group.indexOf('-') == -1) + group = group + "-"; setupCredentials(); setupKeyPairForTest(); initializeContextAndClient(); @@ -215,7 +215,7 @@ public abstract class BaseComputeServiceLiveTest { // starting this one alphabetically before create2nodes.. @Test(enabled = true, dependsOnMethods = { "testCompareSizes" }) public void testAScriptExecutionAfterBootWithBasicTemplate() throws Exception { - String tag = this.tag + "r"; + String tag = this.group + "r"; try { client.destroyNodesMatching(withTag(tag)); } catch (Exception e) { @@ -267,19 +267,19 @@ public abstract class BaseComputeServiceLiveTest { @Test(enabled = true, dependsOnMethods = "testCompareSizes") public void testCreateTwoNodesWithRunScript() throws Exception { try { - client.destroyNodesMatching(withTag(tag)); + client.destroyNodesMatching(withTag(group)); } catch (NoSuchElementException e) { } refreshTemplate(); try { - nodes = newTreeSet(client.runNodesWithTag(tag, 2, template)); + nodes = newTreeSet(client.runNodesWithTag(group, 2, template)); } catch (RunNodesException e) { nodes = newTreeSet(concat(e.getSuccessfulNodes(), e.getNodeErrors().keySet())); throw e; } assertEquals(nodes.size(), 2); - checkNodes(nodes, tag); + checkNodes(nodes, group); NodeMetadata node1 = nodes.first(); NodeMetadata node2 = nodes.last(); // credentials aren't always the same @@ -324,8 +324,8 @@ public abstract class BaseComputeServiceLiveTest { public void testCreateAnotherNodeWithANewContextToEnsureSharedMemIsntRequired() throws Exception { initializeContextAndClient(); refreshTemplate(); - TreeSet nodes = newTreeSet(client.runNodesWithTag(tag, 1, template)); - checkNodes(nodes, tag); + TreeSet nodes = newTreeSet(client.runNodesWithTag(group, 1, template)); + checkNodes(nodes, group); NodeMetadata node = nodes.first(); this.nodes.add(node); assertEquals(nodes.size(), 1); @@ -375,7 +375,7 @@ 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))), + .listNodesDetailsMatching(all()), and(withTag(group), not(TERMINATED))), new Function() { @Override @@ -407,14 +407,14 @@ public abstract class BaseComputeServiceLiveTest { @Test(enabled = true, dependsOnMethods = "testGet") public void testReboot() throws Exception { - client.rebootNodesMatching(withTag(tag));// TODO test + client.rebootNodesMatching(withTag(group));// TODO test // validation testGet(); } @Test(enabled = true, dependsOnMethods = "testReboot") public void testSuspendResume() throws Exception { - client.suspendNodesMatching(withTag(tag)); + client.suspendNodesMatching(withTag(group)); Set stoppedNodes = refreshNodes(); @@ -430,7 +430,7 @@ public abstract class BaseComputeServiceLiveTest { }) : stoppedNodes; - client.resumeNodesMatching(withTag(tag)); + client.resumeNodesMatching(withTag(group)); testGet(); } @@ -467,22 +467,22 @@ public abstract class BaseComputeServiceLiveTest { @Test(enabled = true, dependsOnMethods = { "testListNodes", "testGetNodesWithDetails" }) public void testDestroyNodes() { int toDestroy = refreshNodes().size(); - Set destroyed = client.destroyNodesMatching(withTag(tag)); + Set destroyed = client.destroyNodesMatching(withTag(group)); assertEquals(toDestroy, destroyed.size()); - for (NodeMetadata node : filter(client.listNodesDetailsMatching(all()), withTag(tag))) { + for (NodeMetadata node : filter(client.listNodesDetailsMatching(all()), withTag(group))) { assert node.getState() == NodeState.TERMINATED : node; assertEquals(context.getCredentialStore().get("node#" + node.getId()), null); } } private Set refreshNodes() { - return filter(client.listNodesDetailsMatching(all()), and(withTag(tag), not(TERMINATED))); + return filter(client.listNodesDetailsMatching(all()), and(withTag(group), not(TERMINATED))); } @Test(enabled = true) public void testCreateAndRunAService() throws Exception { - String tag = this.tag + "s"; + String tag = this.group + "s"; try { client.destroyNodesMatching(withTag(tag)); } catch (Exception e) { @@ -554,7 +554,7 @@ public abstract class BaseComputeServiceLiveTest { } public void testOptionToNotBlock() throws Exception { - String tag = this.tag + "block"; + String tag = this.group + "block"; try { client.destroyNodesMatching(withTag(tag)); } catch (Exception e) { diff --git a/compute/src/test/java/org/jclouds/compute/util/ComputeServiceUtilsTest.java b/compute/src/test/java/org/jclouds/compute/util/ComputeServiceUtilsTest.java index cc008f9aae..89c2912b07 100644 --- a/compute/src/test/java/org/jclouds/compute/util/ComputeServiceUtilsTest.java +++ b/compute/src/test/java/org/jclouds/compute/util/ComputeServiceUtilsTest.java @@ -19,7 +19,7 @@ package org.jclouds.compute.util; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import static org.testng.Assert.assertEquals; import java.net.URI; @@ -41,7 +41,7 @@ public class ComputeServiceUtilsTest { @Test public void testParseTagFromName() { - assertEquals(parseTagFromName("gogrid--849"), "gogrid-"); + assertEquals(parseGroupFromName("gogrid--849"), "gogrid-"); } @Test diff --git a/loadbalancer/src/test/java/org/jclouds/loadbalancer/BaseLoadBalancerServiceLiveTest.java b/loadbalancer/src/test/java/org/jclouds/loadbalancer/BaseLoadBalancerServiceLiveTest.java index 9438b69af5..3f86e3a9ad 100644 --- a/loadbalancer/src/test/java/org/jclouds/loadbalancer/BaseLoadBalancerServiceLiveTest.java +++ b/loadbalancer/src/test/java/org/jclouds/loadbalancer/BaseLoadBalancerServiceLiveTest.java @@ -60,7 +60,7 @@ import com.google.inject.Module; public abstract class BaseLoadBalancerServiceLiveTest { protected SshClient.Factory sshFactory; - protected String tag; + protected String group; protected RetryablePredicate socketTester; protected Set nodes; @@ -126,8 +126,8 @@ public abstract class BaseLoadBalancerServiceLiveTest { @BeforeGroups(groups = { "integration", "live" }) public void setupClient() throws InterruptedException, ExecutionException, TimeoutException, IOException { setServiceDefaults(); - if (tag == null) - tag = checkNotNull(provider, "provider"); + if (group == null) + group = checkNotNull(provider, "provider"); setupCredentials(); initializeContext(); initializeComputeContext(); @@ -166,7 +166,7 @@ public abstract class BaseLoadBalancerServiceLiveTest { @BeforeGroups(groups = { "integration", "live" }, dependsOnMethods = "setupClient") public void createNodes() throws RunNodesException { try { - nodes = computeContext.getComputeService().runNodesWithTag(tag, 2); + nodes = computeContext.getComputeService().createNodesInGroup(group, 2); } catch (RunNodesException e) { nodes = e.getSuccessfulNodes(); throw e; @@ -177,7 +177,7 @@ public abstract class BaseLoadBalancerServiceLiveTest { public void testLoadBalanceNodesMatching() throws Exception { // create load balancers - loadbalancer = context.getLoadBalancerService().createLoadBalancerInLocation(null, tag, "HTTP", 80, 80, nodes); + loadbalancer = context.getLoadBalancerService().createLoadBalancerInLocation(null, group, "HTTP", 80, 80, nodes); assertNotNull(loadbalancer); validateNodesInLoadBalancer(); @@ -197,7 +197,7 @@ public abstract class BaseLoadBalancerServiceLiveTest { context.getLoadBalancerService().destroyLoadBalancer(loadbalancer.getId()); } if (nodes != null) { - computeContext.getComputeService().destroyNodesMatching(NodePredicates.withTag(tag)); + computeContext.getComputeService().destroyNodesMatching(NodePredicates.inGroup(group)); } computeContext.close(); context.close(); diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeService.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeService.java index a480b10105..57247c8ad1 100644 --- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeService.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeService.java @@ -49,7 +49,7 @@ import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap; import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.ResumeNodeStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet; import org.jclouds.compute.strategy.SuspendNodeStrategy; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; @@ -77,7 +77,7 @@ public class AWSEC2ComputeService extends EC2ComputeService { protected AWSEC2ComputeService(ComputeServiceContext context, Map credentialStore, @Memoized Supplier> images, @Memoized Supplier> sizes, @Memoized Supplier> locations, ListNodesStrategy listNodesStrategy, - GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, ResumeNodeStrategy startNodeStrategy, SuspendNodeStrategy stopNodeStrategy, Provider templateBuilderProvider, Provider templateOptionsProvider, diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java index aa4327621f..937339785f 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2ComputeServiceLiveTest.java @@ -52,7 +52,7 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest { public AWSEC2ComputeServiceLiveTest() { provider = "aws-ec2"; - tag = "ec2"; + group = "ec2"; } @Override @@ -67,29 +67,29 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest { InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) .getInstanceServices(); - String tag = this.tag + "o"; + String group = this.group + "o"; TemplateOptions options = client.templateOptions(); // Date before = new Date(); - options.as(AWSEC2TemplateOptions.class).securityGroups(tag); - options.as(AWSEC2TemplateOptions.class).keyPair(tag); + options.as(AWSEC2TemplateOptions.class).securityGroups(group); + options.as(AWSEC2TemplateOptions.class).keyPair(group); options.as(AWSEC2TemplateOptions.class).enableMonitoring(); String startedId = null; try { - cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + cleanupExtendedStuff(securityGroupClient, keyPairClient, group); // create a security group that allows ssh in so that our scripts later // will work - securityGroupClient.createSecurityGroupInRegion(null, tag, tag); - securityGroupClient.authorizeSecurityGroupIngressInRegion(null, tag, IpProtocol.TCP, 22, 22, "0.0.0.0/0"); + securityGroupClient.createSecurityGroupInRegion(null, group, group); + securityGroupClient.authorizeSecurityGroupIngressInRegion(null, group, IpProtocol.TCP, 22, 22, "0.0.0.0/0"); // create a keypair to pass in as well - KeyPair result = keyPairClient.createKeyPairInRegion(null, tag); + KeyPair result = keyPairClient.createKeyPairInRegion(null, group); - Set nodes = client.runNodesWithTag(tag, 1, options); + Set nodes = client.createNodesInGroup(group, 1, options); NodeMetadata first = Iterables.get(nodes, 0); assert first.getCredentials() != null : first; assert first.getCredentials().identity != null : first; @@ -98,7 +98,7 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest { AWSRunningInstance instance = AWSRunningInstance.class.cast(getInstance(instanceClient, startedId)); - assertEquals(instance.getKeyName(), tag); + assertEquals(instance.getKeyName(), group); assertEquals(instance.getMonitoringState(), MonitoringState.ENABLED); // TODO when the cloudwatchclient is finished @@ -117,26 +117,26 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest { // } // make sure we made our dummy group and also let in the user's group - assertEquals(Sets.newTreeSet(instance.getGroupIds()), ImmutableSortedSet. of("jclouds#" + tag + "#" - + instance.getRegion(), tag)); + assertEquals(Sets.newTreeSet(instance.getGroupIds()), ImmutableSortedSet. of("jclouds#" + group + "#" + + instance.getRegion(), group)); // make sure our dummy group has no rules - SecurityGroup group = Iterables.getOnlyElement(securityGroupClient.describeSecurityGroupsInRegion(null, - "jclouds#" + tag + "#" + instance.getRegion())); - assert group.getIpPermissions().size() == 0 : group; + SecurityGroup secgroup = Iterables.getOnlyElement(securityGroupClient.describeSecurityGroupsInRegion(null, + "jclouds#" +group + "#" + instance.getRegion())); + assert secgroup.getIpPermissions().size() == 0 : secgroup; // try to run a script with the original keyPair - runScriptWithCreds(tag, first.getOperatingSystem(), new Credentials(first.getCredentials().identity, result + runScriptWithCreds(group, first.getOperatingSystem(), new Credentials(first.getCredentials().identity, result .getKeyMaterial())); } finally { - client.destroyNodesMatching(NodePredicates.withTag(tag)); + client.destroyNodesMatching(NodePredicates.inGroup(group)); if (startedId != null) { // ensure we didn't delete these resources! - assertEquals(keyPairClient.describeKeyPairsInRegion(null, tag).size(), 1); - assertEquals(securityGroupClient.describeSecurityGroupsInRegion(null, tag).size(), 1); + assertEquals(keyPairClient.describeKeyPairsInRegion(null, group).size(), 1); + assertEquals(securityGroupClient.describeSecurityGroupsInRegion(null, group).size(), 1); } - cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + cleanupExtendedStuff(securityGroupClient, keyPairClient, group); } } @@ -157,26 +157,26 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest { InstanceClient instanceClient = EC2Client.class.cast(context.getProviderSpecificContext().getApi()) .getInstanceServices(); - String tag = this.tag + "g"; + String group = this.group + "g"; TemplateOptions options = client.templateOptions(); - // options.as(AWSEC2TemplateOptions.class).securityGroups(tag); - options.as(AWSEC2TemplateOptions.class).keyPair(tag); + // options.as(AWSEC2TemplateOptions.class).securityGroups(group); + options.as(AWSEC2TemplateOptions.class).keyPair(group); options.as(AWSEC2TemplateOptions.class).subnetId(subnetId); String startedId = null; String nodeId = null; try { - cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + cleanupExtendedStuff(securityGroupClient, keyPairClient, group); // create the security group - // securityGroupClient.createSecurityGroupInRegion(null, tag, tag); + // securityGroupClient.createSecurityGroupInRegion(null, group, group); // create a keypair to pass in as well - keyPairClient.createKeyPairInRegion(null, tag); + keyPairClient.createKeyPairInRegion(null, group); - Set nodes = client.runNodesWithTag(tag, 1, options); + Set nodes = client.createNodesInGroup(group, 1, options); NodeMetadata first = Iterables.get(nodes, 0); assert first.getCredentials() != null : first; @@ -194,9 +194,9 @@ public class AWSEC2ComputeServiceLiveTest extends EC2ComputeServiceLiveTest { client.destroyNode(nodeId); if (startedId != null) { // ensure we didn't delete these resources! - assertEquals(keyPairClient.describeKeyPairsInRegion(null, tag).size(), 1); + assertEquals(keyPairClient.describeKeyPairsInRegion(null, group).size(), 1); } - cleanupExtendedStuff(securityGroupClient, keyPairClient, tag); + cleanupExtendedStuff(securityGroupClient, keyPairClient, group); } } diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java index de12ec2d0a..c735d8750f 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/services/PlacementGroupClientLiveTest.java @@ -199,13 +199,13 @@ public class PlacementGroupClientLiveTest { template.getOptions().installPrivateKey(keyPair.get("private")).authorizePublicKey(keyPair.get("public")) .runScript(buildScript(template.getImage().getOperatingSystem())); - String tag = PREFIX + "cccluster"; - context.getComputeService().destroyNodesMatching(NodePredicates.withTag(tag)); + String group = PREFIX + "cccluster"; + context.getComputeService().destroyNodesMatching(NodePredicates.inGroup(group)); // TODO make this not lookup an explicit region - client.getPlacementGroupServices().deletePlacementGroupInRegion(null, "jclouds#" + tag + "#us-east-1"); + client.getPlacementGroupServices().deletePlacementGroupInRegion(null, "jclouds#" + group + "#us-east-1"); try { - Set nodes = context.getComputeService().runNodesWithTag(tag, 1, template); + Set nodes = context.getComputeService().createNodesInGroup(group, 1, template); NodeMetadata node = getOnlyElement(nodes); getOnlyElement(getOnlyElement(client.getInstanceServices().describeInstancesInRegion(null, @@ -215,7 +215,7 @@ public class PlacementGroupClientLiveTest { System.err.println(e.getNodeErrors().keySet()); Throwables.propagate(e); } finally { - context.getComputeService().destroyNodesMatching(NodePredicates.withTag(tag)); + context.getComputeService().destroyNodesMatching(NodePredicates.inGroup(group)); } } diff --git a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java b/providers/aws-elb/src/test/java/org/jclouds/aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java index 3e73cda334..0ca48925ee 100644 --- a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java +++ b/providers/aws-elb/src/test/java/org/jclouds/aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java @@ -32,7 +32,7 @@ public class AWSELBLoadBalancerServiceLiveTest extends ELBLoadBalancerServiceLiv public AWSELBLoadBalancerServiceLiveTest() { provider = "aws-elb"; computeProvider = "aws-ec2"; - tag = "elb"; + group = "elb"; } } diff --git a/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java b/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java index 4504a7f330..75e2b5717a 100644 --- a/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java +++ b/providers/bluelock-vcdirector/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java @@ -43,7 +43,7 @@ public class BlueLockVCloudDirectorComputeServiceLiveTest extends VCloudComputeS @Override public void setServiceDefaults() { - tag = "director"; + group = "director"; } @Test diff --git a/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKComputeServiceLiveTest.java b/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKComputeServiceLiveTest.java index 44c8307490..c8902508bb 100644 --- a/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKComputeServiceLiveTest.java +++ b/providers/cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUKComputeServiceLiveTest.java @@ -31,7 +31,7 @@ public class CloudServersUKComputeServiceLiveTest extends CloudServersComputeSer public CloudServersUKComputeServiceLiveTest() { provider = "cloudservers-uk"; - tag = "cs"; + group = "cs"; } } diff --git a/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSComputeServiceLiveTest.java b/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSComputeServiceLiveTest.java index 6ba4037c67..7efb40a8aa 100644 --- a/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSComputeServiceLiveTest.java +++ b/providers/cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/compute/CloudServersUSComputeServiceLiveTest.java @@ -31,7 +31,7 @@ public class CloudServersUSComputeServiceLiveTest extends CloudServersComputeSer public CloudServersUSComputeServiceLiveTest() { provider = "cloudservers-us"; - tag = "cs"; + group = "cs"; } } diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaComputeServiceAdapter.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaComputeServiceAdapter.java index ec6fc4a9f2..847d2586bd 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaComputeServiceAdapter.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/CloudSigmaComputeServiceAdapter.java @@ -109,7 +109,7 @@ public class CloudSigmaComputeServiceAdapter implements } @Override - public ServerInfo runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, + public ServerInfo createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template, Map credentialStore) { long bootSize = (long) (template.getHardware().getVolumes().get(0).getSize() * 1024 * 1024 * 1024l); logger.debug(">> imaging boot drive source(%s) bytes(%d)", template.getImage().getId(), bootSize); diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/functions/ServerInfoToNodeMetadata.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/functions/ServerInfoToNodeMetadata.java index 0d838a1b0a..6a2306fe51 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/functions/ServerInfoToNodeMetadata.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/compute/functions/ServerInfoToNodeMetadata.java @@ -20,7 +20,7 @@ package org.jclouds.cloudsigma.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import java.util.List; import java.util.Map; @@ -92,7 +92,7 @@ public class ServerInfoToNodeMetadata implements Function defineAddNodeWithTagStrategy() { - return GoGridAddNodeWithTagStrategy.class; + protected Class defineAddNodeWithTagStrategy() { + return FindPublicIpThenCreateNodeInGroup.class; } @Override diff --git a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java index 28670853c2..37c3a584b7 100644 --- a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java +++ b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java @@ -20,7 +20,7 @@ package org.jclouds.gogrid.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import java.util.Map; import java.util.NoSuchElementException; @@ -109,7 +109,7 @@ public class ServerToNodeMetadata implements Function { builder.ids(from.getId() + ""); builder.name(from.getName()); builder.location(locations.get().get(from.getDatacenter().getId() + "")); - builder.tag(parseTagFromName(from.getName())); + builder.group(parseGroupFromName(from.getName())); builder.hardware(parseHardware(from)); builder.imageId(from.getImage().getId() + ""); diff --git a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridAddNodeWithTagStrategy.java b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/FindPublicIpThenCreateNodeInGroup.java similarity index 93% rename from providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridAddNodeWithTagStrategy.java rename to providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/FindPublicIpThenCreateNodeInGroup.java index 221791acdd..a2a8788fb5 100644 --- a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridAddNodeWithTagStrategy.java +++ b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/FindPublicIpThenCreateNodeInGroup.java @@ -31,7 +31,7 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Template; import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.gogrid.GoGridClient; import org.jclouds.gogrid.domain.Ip; import org.jclouds.gogrid.domain.IpType; @@ -49,7 +49,7 @@ import com.google.common.collect.Iterables; * @author Oleksiy Yarmula */ @Singleton -public class GoGridAddNodeWithTagStrategy implements AddNodeWithTagStrategy { +public class FindPublicIpThenCreateNodeInGroup implements CreateNodeWithGroupEncodedIntoName { private final GoGridClient client; private final Function sizeToRam; private final Function serverToNodeMetadata; @@ -57,7 +57,7 @@ public class GoGridAddNodeWithTagStrategy implements AddNodeWithTagStrategy { private RetryablePredicate serverLatestJobCompletedShort; @Inject - protected GoGridAddNodeWithTagStrategy(GoGridClient client, + protected FindPublicIpThenCreateNodeInGroup(GoGridClient client, Function serverToNodeMetadata, Function sizeToRam, Timeouts timeouts) { this.client = client; @@ -71,7 +71,7 @@ public class GoGridAddNodeWithTagStrategy implements AddNodeWithTagStrategy { } @Override - public NodeMetadata addNodeWithTag(String tag, String name, Template template) { + public NodeMetadata createNodeWithGroupEncodedIntoName(String group, String name, Template template) { Server addedServer = null; boolean notStarted = true; int numOfRetries = 20; diff --git a/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadataTest.java b/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadataTest.java index 9fb673bc75..c6dcb174eb 100644 --- a/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadataTest.java +++ b/providers/gogrid/src/test/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadataTest.java @@ -73,7 +73,7 @@ public class ServerToNodeMetadataTest { Server server = createMock(Server.class); expect(server.getId()).andReturn(1000l).atLeastOnce(); - expect(server.getName()).andReturn("tag-ff").atLeastOnce(); + expect(server.getName()).andReturn("group-ff").atLeastOnce(); expect(server.getState()).andReturn(ServerState.ON).atLeastOnce(); expect(serverStateToNodeState.get(ServerState.ON)).andReturn(NodeState.RUNNING); @@ -83,7 +83,7 @@ public class ServerToNodeMetadataTest { Map credentialsMap = createMock(Map.class); expect(client.getServerCredentialsList()).andReturn(credentialsMap); - expect(credentialsMap.get("tag-ff")).andReturn(new Credentials("user", "pass")); + expect(credentialsMap.get("group-ff")).andReturn(new Credentials("user", "pass")); expect(server.getIp()).andReturn(new Ip("127.0.0.1")); @@ -112,7 +112,7 @@ public class ServerToNodeMetadataTest { NodeMetadata metadata = parser.apply(server); assertEquals(metadata.getLocation(), location); assertEquals(metadata.getImageId(), "2000"); - assertEquals(metadata.getTag(), "tag"); + assertEquals(metadata.getGroup(), "group"); assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); verify(caller); diff --git a/providers/openhosting-east1/src/test/java/org/jclouds/openhosting/compute/OpenHostingEast1ComputeServiceLiveTest.java b/providers/openhosting-east1/src/test/java/org/jclouds/openhosting/compute/OpenHostingEast1ComputeServiceLiveTest.java index 194eb058d2..9c3454acb0 100644 --- a/providers/openhosting-east1/src/test/java/org/jclouds/openhosting/compute/OpenHostingEast1ComputeServiceLiveTest.java +++ b/providers/openhosting-east1/src/test/java/org/jclouds/openhosting/compute/OpenHostingEast1ComputeServiceLiveTest.java @@ -31,7 +31,7 @@ public class OpenHostingEast1ComputeServiceLiveTest extends ElasticStackComputeS public OpenHostingEast1ComputeServiceLiveTest() { provider = "openhosting-east1"; - tag = "openhosting"; + group = "openhosting"; } } diff --git a/providers/serverlove-z1-man/src/test/java/org/jclouds/serverlove/compute/ServerloveManchesterComputeServiceLiveTest.java b/providers/serverlove-z1-man/src/test/java/org/jclouds/serverlove/compute/ServerloveManchesterComputeServiceLiveTest.java index b25780226e..f3376ae49b 100644 --- a/providers/serverlove-z1-man/src/test/java/org/jclouds/serverlove/compute/ServerloveManchesterComputeServiceLiveTest.java +++ b/providers/serverlove-z1-man/src/test/java/org/jclouds/serverlove/compute/ServerloveManchesterComputeServiceLiveTest.java @@ -31,7 +31,7 @@ public class ServerloveManchesterComputeServiceLiveTest extends ElasticStackComp public ServerloveManchesterComputeServiceLiveTest() { provider = "serverlove-z1-man"; - tag = "serverlove"; + group = "serverlove"; } } diff --git a/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeStrategiesByClass.java b/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeStrategiesByClass.java index 0e203eb781..91dd79dc81 100644 --- a/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeStrategiesByClass.java +++ b/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeStrategiesByClass.java @@ -20,14 +20,14 @@ package org.jclouds.slicehost.compute.config; import org.jclouds.compute.config.BindComputeStrategiesByClass; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; 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.ResumeNodeStrategy; import org.jclouds.compute.strategy.SuspendNodeStrategy; -import org.jclouds.slicehost.compute.strategy.SlicehostAddNodeWithTagStrategy; +import org.jclouds.slicehost.compute.strategy.SlicehostCreateNodeWithGroupEncodedIntoName; import org.jclouds.slicehost.compute.strategy.SlicehostDestroyNodeStrategy; import org.jclouds.slicehost.compute.strategy.SlicehostGetNodeMetadataStrategy; import org.jclouds.slicehost.compute.strategy.SlicehostListNodesStrategy; @@ -41,8 +41,8 @@ import org.jclouds.slicehost.compute.strategy.SlicehostLifeCycleStrategy; public class SlicehostBindComputeStrategiesByClass extends BindComputeStrategiesByClass { @Override - protected Class defineAddNodeWithTagStrategy() { - return SlicehostAddNodeWithTagStrategy.class; + protected Class defineAddNodeWithTagStrategy() { + return SlicehostCreateNodeWithGroupEncodedIntoName.class; } @Override diff --git a/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java b/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java index ed602dc4e6..eed42aa14b 100644 --- a/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java +++ b/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java @@ -20,7 +20,7 @@ package org.jclouds.slicehost.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import java.util.Map; import java.util.NoSuchElementException; @@ -104,7 +104,7 @@ public class SliceToNodeMetadata implements Function { builder.ids(from.getId() + ""); builder.name(from.getName()); builder.location(location.get()); - builder.tag(parseTagFromName(from.getName())); + builder.group(parseGroupFromName(from.getName())); builder.imageId(from.getImageId() + ""); builder.operatingSystem(parseOperatingSystem(from)); builder.hardware(parseHardware(from)); diff --git a/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java b/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostCreateNodeWithGroupEncodedIntoName.java similarity index 83% rename from providers/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java rename to providers/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostCreateNodeWithGroupEncodedIntoName.java index 4c3e94f0c6..5151f819b6 100644 --- a/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java +++ b/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostCreateNodeWithGroupEncodedIntoName.java @@ -28,7 +28,7 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.domain.Credentials; import org.jclouds.slicehost.SlicehostClient; import org.jclouds.slicehost.domain.Slice; @@ -40,13 +40,13 @@ import com.google.common.base.Function; * @author Adrian Cole */ @Singleton -public class SlicehostAddNodeWithTagStrategy implements AddNodeWithTagStrategy { +public class SlicehostCreateNodeWithGroupEncodedIntoName implements CreateNodeWithGroupEncodedIntoName { protected final SlicehostClient client; protected final Map credentialStore; protected final Function sliceToNodeMetadata; @Inject - protected SlicehostAddNodeWithTagStrategy(SlicehostClient client, Map credentialStore, + protected SlicehostCreateNodeWithGroupEncodedIntoName(SlicehostClient client, Map credentialStore, Function sliceToNodeMetadata) { this.client = checkNotNull(client, "client"); this.credentialStore = checkNotNull(credentialStore, "credentialStore"); @@ -54,7 +54,7 @@ public class SlicehostAddNodeWithTagStrategy implements AddNodeWithTagStrategy { } @Override - public NodeMetadata addNodeWithTag(String tag, String name, Template template) { + public NodeMetadata createNodeWithGroupEncodedIntoName(String group, String name, Template template) { Slice from = client.createSlice(name, Integer.parseInt(template.getImage().getProviderId()), Integer.parseInt(template.getHardware().getProviderId())); credentialStore.put("node#" + from.getId(), new Credentials("root", from.getRootPassword())); diff --git a/providers/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java b/providers/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java index 3051a0d225..553973a7ff 100644 --- a/providers/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java +++ b/providers/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java @@ -72,7 +72,7 @@ public class SliceToNodeMetadataTest { NodeMetadata metadata = parser.apply(slice); assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( - ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).tag("jclouds") + ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).group("jclouds") .imageId("2").id("1").providerId("1").name("jclouds-foo").location(provider).credentials(creds) .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } @@ -91,7 +91,7 @@ public class SliceToNodeMetadataTest { NodeMetadata metadata = parser.apply(slice); assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( - ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).tag("jclouds") + ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).group("jclouds") .imageId("2").id("1").providerId("1").name("jclouds-foo").location(provider).userMetadata( ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } @@ -110,7 +110,7 @@ public class SliceToNodeMetadataTest { NodeMetadata metadata = parser.apply(slice); assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( - ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).tag("jclouds") + ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).group("jclouds") .imageId("2").operatingSystem( new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").version("5.2") .is64Bit(true).build()).id("1").providerId("1").name("jclouds-foo").location(provider) @@ -130,7 +130,7 @@ public class SliceToNodeMetadataTest { NodeMetadata metadata = parser.apply(slice); assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( - ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).tag("jclouds") + ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).group("jclouds") .imageId("2").hardware( new HardwareBuilder().ids("1").name("256 slice").processors( ImmutableList.of(new Processor(0.25, 1.0))).ram(256).volumes( diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java index 5a6fe2e759..b4bdc74cf4 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java @@ -52,7 +52,7 @@ public class TerremarkECloudComputeServiceLiveTest extends BaseComputeServiceLiv @Override public void setServiceDefaults() { - tag = "te"; + group = "te"; } @Test diff --git a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java index 5887f2e4c1..3184af9fa4 100644 --- a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java +++ b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java @@ -52,7 +52,7 @@ public class TerremarkVCloudExpressComputeServiceLiveTest extends BaseComputeSer @Override public void setServiceDefaults() { - tag = "vcx"; + group = "vcx"; } @Test diff --git a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeService.java b/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeService.java index 9c2be3ef6b..b8a14ac0b8 100644 --- a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeService.java +++ b/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeService.java @@ -45,7 +45,7 @@ import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap; import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.ResumeNodeStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet; import org.jclouds.compute.strategy.SuspendNodeStrategy; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; @@ -73,7 +73,7 @@ public class LibvirtComputeService extends BaseComputeService { @Memoized Supplier> images, @Memoized Supplier> hardwareProfiles, @Memoized Supplier> locations, ListNodesStrategy listNodesStrategy, - GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, ResumeNodeStrategy resumeNodeStrategy, SuspendNodeStrategy suspendNodeStrategy, Provider templateBuilderProvider, Provider templateOptionsProvider, diff --git a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java b/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java index d4b0ced0a4..3d0bde6814 100644 --- a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java +++ b/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java @@ -20,7 +20,7 @@ package org.jclouds.libvirt.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import java.util.Map; import java.util.Set; @@ -88,7 +88,7 @@ public class DomainToNodeMetadata implements Function { builder.providerId(from.getID() + ""); builder.name(from.getName()); builder.location(findLocationForDomain.apply(from)); - builder.tag(parseTagFromName(from.getName())); + builder.group(parseGroupFromName(from.getName())); builder.operatingSystem(new OperatingSystemBuilder().description(from.getOSType()).build()); builder.hardware(findHardwareForDomain.apply(from)); diff --git a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java b/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java index 8c7d433e46..92d81acf6f 100644 --- a/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java +++ b/sandbox-apis/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java @@ -81,7 +81,7 @@ public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter credentialStore) { try { String domainName = tag; diff --git a/sandbox-apis/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtExperimentLiveTest.java b/sandbox-apis/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtExperimentLiveTest.java index 6f4647025d..e0c16bc8d8 100644 --- a/sandbox-apis/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtExperimentLiveTest.java +++ b/sandbox-apis/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtExperimentLiveTest.java @@ -77,7 +77,7 @@ public class LibvirtExperimentLiveTest { * the default template via overriding a method in standalonecomputeservicexontextmodule */ - Set nodeMetadataSet = context.getComputeService().runNodesWithTag("tty", 1); + Set nodeMetadataSet = context.getComputeService().createNodesInGroup("tty", 1); for (NodeMetadata nodeMetadata : nodeMetadataSet) { /* * context.getComputeService().suspendNode(nodeMetadata.getId()); diff --git a/sandbox-apis/nirvanix/src/test/java/org/jclouds/nirvanix/sdn/SDNAuthAsyncClientTest.java b/sandbox-apis/nirvanix/src/test/java/org/jclouds/nirvanix/sdn/SDNAuthAsyncClientTest.java index 1df1dc6c67..ce9b803b5e 100755 --- a/sandbox-apis/nirvanix/src/test/java/org/jclouds/nirvanix/sdn/SDNAuthAsyncClientTest.java +++ b/sandbox-apis/nirvanix/src/test/java/org/jclouds/nirvanix/sdn/SDNAuthAsyncClientTest.java @@ -47,7 +47,7 @@ public class SDNAuthAsyncClientTest extends RestClientTest { Method method = SDNAuthAsyncClient.class.getMethod("authenticate", String.class, String.class, String.class); HttpRequest httpRequest = processor.createRequest(method, "apple", "foo", "bar"); assertRequestLineEquals(httpRequest, - "GET http://localhost:8080/ws/Authentication/Login.ashx?output=json&appKey=apple&password=bar&username=foo HTTP/1.1"); + "GET http://localhost:8080/ws/Authentication/Login.ashx?output=json&appKey=apple&password=bar&username=foo HTTP/1.1"); assertNonPayloadHeadersEqual(httpRequest, ""); assertPayloadEquals(httpRequest, null, null, false); @@ -69,8 +69,8 @@ public class SDNAuthAsyncClientTest extends RestClientTest { @Override public RestContextSpec createContextSpec() { - return contextSpec("test", "http://localhost:8080", "1", "identity", "credential", SDNAuthClient.class, - SDNAuthAsyncClient.class); + return contextSpec("test", "http://localhost:8080", "1", "", "identity", "credential", SDNAuthClient.class, + SDNAuthAsyncClient.class); } } diff --git a/sandbox-apis/nirvanix/src/test/java/org/jclouds/nirvanix/sdn/SDNAuthenticationLiveTest.java b/sandbox-apis/nirvanix/src/test/java/org/jclouds/nirvanix/sdn/SDNAuthenticationLiveTest.java index f2f3f083db..e870a20312 100644 --- a/sandbox-apis/nirvanix/src/test/java/org/jclouds/nirvanix/sdn/SDNAuthenticationLiveTest.java +++ b/sandbox-apis/nirvanix/src/test/java/org/jclouds/nirvanix/sdn/SDNAuthenticationLiveTest.java @@ -74,7 +74,7 @@ public class SDNAuthenticationLiveTest { identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity"); credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential"); - RestContextSpec contextSpec = contextSpec("test", endpoint, "1", identity, + RestContextSpec contextSpec = contextSpec("test", endpoint, "1", "", identity, credential, SDNAuthClient.class, SDNAuthAsyncClient.class); context = createContextBuilder( diff --git a/sandbox-apis/vi/src/main/java/org/jclouds/vi/compute/ViComputeService.java b/sandbox-apis/vi/src/main/java/org/jclouds/vi/compute/ViComputeService.java index 566dab7489..d5b7c14798 100644 --- a/sandbox-apis/vi/src/main/java/org/jclouds/vi/compute/ViComputeService.java +++ b/sandbox-apis/vi/src/main/java/org/jclouds/vi/compute/ViComputeService.java @@ -44,7 +44,7 @@ import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap; import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.ResumeNodeStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet; import org.jclouds.compute.strategy.SuspendNodeStrategy; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; @@ -69,7 +69,7 @@ public class ViComputeService extends BaseComputeService { @Memoized Supplier> images, @Memoized Supplier> hardwareProfiles, @Memoized Supplier> locations, ListNodesStrategy listNodesStrategy, - GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, ResumeNodeStrategy resumeNodeStrategy, SuspendNodeStrategy suspendNodeStrategy, Provider templateBuilderProvider, Provider templateOptionsProvider, diff --git a/sandbox-apis/vi/src/main/java/org/jclouds/vi/compute/functions/VirtualMachineToNodeMetadata.java b/sandbox-apis/vi/src/main/java/org/jclouds/vi/compute/functions/VirtualMachineToNodeMetadata.java index f11883f2a9..21e91f94a5 100644 --- a/sandbox-apis/vi/src/main/java/org/jclouds/vi/compute/functions/VirtualMachineToNodeMetadata.java +++ b/sandbox-apis/vi/src/main/java/org/jclouds/vi/compute/functions/VirtualMachineToNodeMetadata.java @@ -20,7 +20,7 @@ package org.jclouds.vi.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import java.util.Map; import java.util.Set; @@ -83,7 +83,7 @@ public class VirtualMachineToNodeMetadata implements Function credentialStore) { try { diff --git a/sandbox-apis/vi/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java b/sandbox-apis/vi/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java index e1766f2ad2..bc7774eeaf 100644 --- a/sandbox-apis/vi/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java +++ b/sandbox-apis/vi/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java @@ -23,22 +23,17 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Set; -import javax.annotation.Resource; - import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; -import org.jclouds.logging.Logger; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; import com.google.inject.Module; -import com.google.inject.name.Named; /** * diff --git a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/config/IBMDeveloperCloudBindComputeStrategiesByClass.java b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/config/IBMDeveloperCloudBindComputeStrategiesByClass.java index 1091eeac93..a20bd01ec9 100644 --- a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/config/IBMDeveloperCloudBindComputeStrategiesByClass.java +++ b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/config/IBMDeveloperCloudBindComputeStrategiesByClass.java @@ -20,14 +20,14 @@ package org.jclouds.ibmdev.compute.config; import org.jclouds.compute.config.BindComputeStrategiesByClass; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; 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.ResumeNodeStrategy; import org.jclouds.compute.strategy.SuspendNodeStrategy; -import org.jclouds.ibmdev.compute.strategy.IBMDeveloperCloudAddNodeWithTagStrategy; +import org.jclouds.ibmdev.compute.strategy.IBMDeveloperCloudCreateNodeWithGroupEncodedIntoName; import org.jclouds.ibmdev.compute.strategy.IBMDeveloperCloudDestroyNodeStrategy; import org.jclouds.ibmdev.compute.strategy.IBMDeveloperCloudGetNodeMetadataStrategy; import org.jclouds.ibmdev.compute.strategy.IBMDeveloperCloudLifeCycleStrategy; @@ -39,8 +39,8 @@ import org.jclouds.ibmdev.compute.strategy.IBMDeveloperCloudListNodesStrategy; public class IBMDeveloperCloudBindComputeStrategiesByClass extends BindComputeStrategiesByClass { @Override - protected Class defineAddNodeWithTagStrategy() { - return IBMDeveloperCloudAddNodeWithTagStrategy.class; + protected Class defineAddNodeWithTagStrategy() { + return IBMDeveloperCloudCreateNodeWithGroupEncodedIntoName.class; } @Override diff --git a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/functions/InstanceToNodeMetadata.java b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/functions/InstanceToNodeMetadata.java index 9507b5134b..8f3147953f 100644 --- a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/functions/InstanceToNodeMetadata.java +++ b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/functions/InstanceToNodeMetadata.java @@ -20,7 +20,7 @@ package org.jclouds.ibmdev.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import java.util.Map; import java.util.Set; @@ -86,12 +86,12 @@ public class InstanceToNodeMetadata implements Function @Override public NodeMetadata apply(Instance from) { //TODO hardware - String tag = parseTagFromName(from.getName()); + String group = parseGroupFromName(from.getName()); Set ipSet = from.getIp() != null ? ImmutableSet.of(from.getIp()) : ImmutableSet. of(); Image image = images.get().get(from.getImageId()); - String key = tag != null ? credentialsMap.get(tag) : null; + String key = group != null ? credentialsMap.get(group) : null; return new NodeMetadataBuilder().ids(from.getId() + "").name(from.getName()) - .location(locations.get().get(image.getLocation())).tag(tag).imageId(from.getImageId()) + .location(locations.get().get(image.getLocation())).group(group).imageId(from.getImageId()) .state(instanceStateToNodeState.get(from.getStatus())) .operatingSystem(image != null ? image.getOperatingSystem() : null).publicAddresses(ipSet) .credentials(new Credentials(image.getDefaultCredentials().identity, key)).build(); diff --git a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet.java b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyCreateNodesWithGroupEncodedIntoNameThenAddToSet.java similarity index 77% rename from sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet.java rename to sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyCreateNodesWithGroupEncodedIntoNameThenAddToSet.java index ba489734b8..3c918fd156 100644 --- a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet.java +++ b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/CreateKeyCreateNodesWithGroupEncodedIntoNameThenAddToSet.java @@ -34,10 +34,10 @@ import org.jclouds.Constants; import org.jclouds.compute.config.CustomizationResponse; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap; import org.jclouds.compute.strategy.ListNodesStrategy; -import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThenAddToSet; import org.jclouds.ibmdev.IBMDeveloperCloudClient; import com.google.common.collect.Multimap; @@ -46,13 +46,13 @@ import com.google.common.collect.Multimap; * @author Adrian Cole */ @Singleton -public class CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet extends EncodeTagIntoNameRunNodesAndAddToSetStrategy { +public class CreateKeyCreateNodesWithGroupEncodedIntoNameThenAddToSet extends CreateNodesWithGroupEncodedIntoNameThenAddToSet { private final IBMDeveloperCloudClient client; private final Map credentialsMap; @Inject - protected CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet( - AddNodeWithTagStrategy addNodeWithTagStrategy, + protected CreateKeyCreateNodesWithGroupEncodedIntoNameThenAddToSet( + CreateNodeWithGroupEncodedIntoName addNodeWithTagStrategy, ListNodesStrategy listNodesStrategy, @Named("NAMING_CONVENTION") String nodeNamingConvention, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, @@ -65,21 +65,21 @@ public class CreateKeyPairEncodeTagIntoNameRunNodesAndAddToSet extends EncodeTag } @Override - public Map> execute(String tag, int count, Template template, Set goodNodes, + public Map> execute(String group, int count, Template template, Set goodNodes, Map badNodes, Multimap customizationResponses) { String keyAsText = template.getOptions().getPublicKey(); if (keyAsText != null) { template.getOptions().dontAuthorizePublicKey(); try { - client.addPublicKey(tag, keyAsText); + client.addPublicKey(group, keyAsText); } catch (IllegalStateException e) { // must not have been found - client.updatePublicKey(tag, keyAsText); + client.updatePublicKey(group, keyAsText); } } else { - credentialsMap.put(tag, client.generateKeyPair(tag).getKeyMaterial()); + credentialsMap.put(group, client.generateKeyPair(group).getKeyMaterial()); } - return super.execute(tag, count, template, goodNodes, badNodes, customizationResponses); + return super.execute(group, count, template, goodNodes, badNodes, customizationResponses); } } \ No newline at end of file diff --git a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/IBMDeveloperCloudAddNodeWithTagStrategy.java b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/IBMDeveloperCloudCreateNodeWithGroupEncodedIntoName.java similarity index 82% rename from sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/IBMDeveloperCloudAddNodeWithTagStrategy.java rename to sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/IBMDeveloperCloudCreateNodeWithGroupEncodedIntoName.java index b7ddecac5b..d5228bde8b 100644 --- a/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/IBMDeveloperCloudAddNodeWithTagStrategy.java +++ b/sandbox-providers/ibmdev/src/main/java/org/jclouds/ibmdev/compute/strategy/IBMDeveloperCloudCreateNodeWithGroupEncodedIntoName.java @@ -27,7 +27,7 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.ibmdev.IBMDeveloperCloudClient; import org.jclouds.ibmdev.domain.Instance; @@ -37,22 +37,22 @@ import com.google.common.base.Function; * @author Adrian Cole */ @Singleton -public class IBMDeveloperCloudAddNodeWithTagStrategy implements AddNodeWithTagStrategy { +public class IBMDeveloperCloudCreateNodeWithGroupEncodedIntoName implements CreateNodeWithGroupEncodedIntoName { private final IBMDeveloperCloudClient client; private final Function instanceToNodeMetadata; @Inject - protected IBMDeveloperCloudAddNodeWithTagStrategy(IBMDeveloperCloudClient client, + protected IBMDeveloperCloudCreateNodeWithGroupEncodedIntoName(IBMDeveloperCloudClient client, Function instanceToNodeMetadata) { this.client = checkNotNull(client, "client"); this.instanceToNodeMetadata = checkNotNull(instanceToNodeMetadata, "instanceToNodeMetadata"); } @Override - public NodeMetadata addNodeWithTag(String tag, String name, Template template) { + public NodeMetadata createNodeWithGroupEncodedIntoName(String group, String name, Template template) { Instance instance = client.createInstanceInLocation(template.getLocation().getId(), name, template.getImage() - .getProviderId(), template.getHardware().getProviderId(), authorizePublicKey(tag)); + .getProviderId(), template.getHardware().getProviderId(), authorizePublicKey(group)); return instanceToNodeMetadata.apply(client.getInstance(instance.getId())); } } \ No newline at end of file diff --git a/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeStrategiesByClass.java b/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeStrategiesByClass.java index aa1790a9a2..3785da058b 100644 --- a/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeStrategiesByClass.java +++ b/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeStrategiesByClass.java @@ -1,14 +1,14 @@ package org.jclouds.rimuhosting.miro.compute.config; import org.jclouds.compute.config.BindComputeStrategiesByClass; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; 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.ResumeNodeStrategy; import org.jclouds.compute.strategy.SuspendNodeStrategy; -import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingAddNodeWithTagStrategy; +import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingCreateNodeWithGroupEncodedIntoName; import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingDestroyNodeStrategy; import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingGetNodeMetadataStrategy; import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingLifeCycleStrategy; @@ -16,8 +16,8 @@ import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingListNodesStrateg public class RimuHostingBindComputeStrategiesByClass extends BindComputeStrategiesByClass { @Override - protected Class defineAddNodeWithTagStrategy() { - return RimuHostingAddNodeWithTagStrategy.class; + protected Class defineAddNodeWithTagStrategy() { + return RimuHostingCreateNodeWithGroupEncodedIntoName.class; } @Override diff --git a/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java b/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java index 62d0029fb6..3014fa7430 100644 --- a/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java +++ b/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java @@ -20,7 +20,7 @@ package org.jclouds.rimuhosting.miro.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import java.util.Map; import java.util.NoSuchElementException; @@ -97,7 +97,7 @@ public class ServerToNodeMetadata implements Function { builder.name(from.getName()); Location location = findLocationWithId(from.getLocation().getId()); builder.location(location); - builder.tag(parseTagFromName(from.getName())); + builder.group(parseGroupFromName(from.getName())); builder.imageId(from.getImageId() + ""); builder.operatingSystem(parseOperatingSystem(from, location)); builder.hardware(null);// TODO diff --git a/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java b/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingCreateNodeWithGroupEncodedIntoName.java similarity index 84% rename from sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java rename to sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingCreateNodeWithGroupEncodedIntoName.java index 22928ad679..eba0f63b56 100644 --- a/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java +++ b/sandbox-providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingCreateNodeWithGroupEncodedIntoName.java @@ -28,7 +28,7 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.domain.Credentials; import org.jclouds.rimuhosting.miro.RimuHostingClient; import org.jclouds.rimuhosting.miro.domain.NewServerResponse; @@ -41,13 +41,13 @@ import com.google.common.base.Function; * @author Adrian Cole */ @Singleton -public class RimuHostingAddNodeWithTagStrategy implements AddNodeWithTagStrategy { +public class RimuHostingCreateNodeWithGroupEncodedIntoName implements CreateNodeWithGroupEncodedIntoName { protected final RimuHostingClient client; protected final Map credentialStore; protected final Function serverToNodeMetadata; @Inject - protected RimuHostingAddNodeWithTagStrategy(RimuHostingClient client, Map credentialStore, + protected RimuHostingCreateNodeWithGroupEncodedIntoName(RimuHostingClient client, Map credentialStore, Function serverToNodeMetadata) { this.client = client; this.credentialStore = credentialStore; @@ -55,7 +55,7 @@ public class RimuHostingAddNodeWithTagStrategy implements AddNodeWithTagStrategy } @Override - public NodeMetadata addNodeWithTag(String tag, String name, Template template) { + public NodeMetadata createNodeWithGroupEncodedIntoName(String group, String name, Template template) { NewServerResponse serverResponse = client.createServer(name, checkNotNull(template.getImage().getProviderId(), "imageId"), checkNotNull(template.getHardware().getProviderId(), "hardwareId")); Server from = client.getServer(serverResponse.getServer().getId()); diff --git a/sandbox-providers/rimuhosting/src/test/java/org/jclouds/rimuhosting/miro/compute/RimuHostingComputeServiceLiveTest.java b/sandbox-providers/rimuhosting/src/test/java/org/jclouds/rimuhosting/miro/compute/RimuHostingComputeServiceLiveTest.java index f3ed959f14..86443924e8 100755 --- a/sandbox-providers/rimuhosting/src/test/java/org/jclouds/rimuhosting/miro/compute/RimuHostingComputeServiceLiveTest.java +++ b/sandbox-providers/rimuhosting/src/test/java/org/jclouds/rimuhosting/miro/compute/RimuHostingComputeServiceLiveTest.java @@ -41,7 +41,7 @@ public class RimuHostingComputeServiceLiveTest extends BaseComputeServiceLiveTes @BeforeClass @Override public void setServiceDefaults() { - tag = "rimuhosting.jclouds"; + group = "rimuhosting.jclouds"; } @Test diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerToNodeMetadata.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerToNodeMetadata.java index 8d29a0efda..1604203e8f 100644 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerToNodeMetadata.java +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerToNodeMetadata.java @@ -20,7 +20,7 @@ package org.jclouds.servermanager.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import java.util.Map; import java.util.Set; @@ -78,7 +78,7 @@ public class ServerToNodeMetadata implements Function { builder.ids(from.id + ""); builder.name(from.name); builder.location(findLocationForServer.apply(from)); - builder.tag(parseTagFromName(from.name)); + builder.group(parseGroupFromName(from.name)); builder.imageId(from.imageId + ""); Image image = findImageForServer.apply(from); if (image != null) diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerComputeServiceAdapter.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerComputeServiceAdapter.java index a1dbc73d43..1dea1816bd 100644 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerComputeServiceAdapter.java +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerComputeServiceAdapter.java @@ -34,7 +34,7 @@ public class ServerManagerComputeServiceAdapter implements ComputeServiceAdapter } @Override - public Server runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, + public Server createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template, Map credentialStore) { // create the backend object using parameters from the template. Server from = client.createServerInDC(template.getLocation().getId(), name, From 70f765be59eda4f17c120c79f319e4af7c401077 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 31 Jan 2011 19:44:14 -0800 Subject: [PATCH 29/81] Issue 457: redirected old clj syntax to new --- .../src/main/clojure/org/jclouds/compute.clj | 18 +++++++++ .../test/clojure/org/jclouds/compute_test.clj | 38 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/compute/src/main/clojure/org/jclouds/compute.clj b/compute/src/main/clojure/org/jclouds/compute.clj index a6ef16b1d8..158abd81da 100644 --- a/compute/src/main/clojure/org/jclouds/compute.clj +++ b/compute/src/main/clojure/org/jclouds/compute.clj @@ -82,6 +82,8 @@ See http://code.google.com/p/jclouds for details." :only [wall-hack-field] :rename {wall-hack-field get-field}]))) +(defmacro deprecate-fwd [old-name new-name] `(defn ~old-name {:deprecated "beta-9"} [& args#] (apply ~new-name args#))) + (defn compute-service "Create a logged in context." ([#^String provider #^String provider-identity #^String provider-credential @@ -150,6 +152,8 @@ See http://code.google.com/p/jclouds for details." ([#^String group #^ComputeService compute] (filter #(= (.getTag %) group) (nodes-with-details compute)))) +(deprecate-fwd nodes-with-tag nodes-in-group) + (defn images "Retrieve the available images for the compute context." ([] (images *compute*)) @@ -209,6 +213,8 @@ See http://code.google.com/p/jclouds for details." (seq (.createNodesInGroup compute group count template)))) +(deprecate-fwd run-nodes create-nodes) + (defn create-node "Create a node using the default or specified template. @@ -232,6 +238,8 @@ See http://code.google.com/p/jclouds for details." ([group template compute] (first (create-nodes group 1 template compute)))) +(deprecate-fwd run-node create-node) + (defn #^NodeMetadata node-details "Retrieve the node metadata, given its id." ([id] (node-details id *compute*)) @@ -244,6 +252,8 @@ See http://code.google.com/p/jclouds for details." ([#^String group #^ComputeService compute] (.suspendNodesMatching compute (NodePredicates/inGroup group)))) +(deprecate-fwd suspend-nodes-with-tag suspend-nodes-in-group) + (defn suspend-node "Suspend a node, given its id." ([id] (suspend-node id *compute*)) @@ -256,6 +266,8 @@ See http://code.google.com/p/jclouds for details." ([#^String group #^ComputeService compute] (.resumeNodesMatching compute (NodePredicates/inGroup group)))) +(deprecate-fwd resume-nodes-with-tag resume-nodes-in-group) + (defn resume-node "Resume a node, given its id." ([id] (resume-node id *compute*)) @@ -268,6 +280,8 @@ See http://code.google.com/p/jclouds for details." ([#^String group #^ComputeService compute] (.rebootNodesMatching compute (NodePredicates/inGroup group)))) +(deprecate-fwd reboot-nodes-with-tag reboot-nodes-in-group) + (defn reboot-node "Reboot a node, given its id." ([id] (reboot-node id *compute*)) @@ -280,6 +294,8 @@ See http://code.google.com/p/jclouds for details." ([#^String group #^ComputeService compute] (.destroyNodesMatching compute (NodePredicates/inGroup group)))) +(deprecate-fwd destroy-nodes-with-tag destroy-nodes-in-group) + (defn destroy-node "Destroy a node, given its id." ([id] (destroy-node id *compute*)) @@ -335,6 +351,8 @@ See http://code.google.com/p/jclouds for details." [#^NodeMetadata node] (.getGroup node)) +(deprecate-fwd tag group) + (defn hostname "Returns the compute node's name" [#^ComputeMetadata node] diff --git a/compute/src/test/clojure/org/jclouds/compute_test.clj b/compute/src/test/clojure/org/jclouds/compute_test.clj index 2fbe44b68d..382a1f81db 100644 --- a/compute/src/test/clojure/org/jclouds/compute_test.clj +++ b/compute/src/test/clojure/org/jclouds/compute_test.clj @@ -53,6 +53,44 @@ list, Alan Dipert and MeikelBrandmeyer." (is (compute-service? (as-compute-service *compute*))) (is (compute-service? (as-compute-service (compute-context *compute*))))) +(deftest nodes-test + (is (empty? (nodes))) + (is (create-node "fred" (build-template + *compute* {} ))) + (is (= 1 (count (nodes)))) + (is (= 1 (count (nodes-in-group "fred")))) + (suspend-nodes-in-group "fred") + (is (suspended? (first (nodes-in-group "fred")))) + (resume-nodes-in-group "fred") + (is (running? (first (nodes-in-group "fred")))) + (reboot-nodes-in-group "fred") + (is (running? (first (nodes-in-group "fred")))) + (is (create-nodes "fred" 2 (build-template + *compute* {} ))) + (is (= 3 (count (nodes-in-group "fred")))) + (is (= "fred" (group (first (nodes))))) + (destroy-nodes-in-group "fred") + (is (terminated? (first (nodes-in-group "fred"))))) + +(deftest nodes-test-deprecated + (is (empty? (nodes))) + (is (run-node "deprecated" (build-template + *compute* {} ))) + (is (= 1 (count (nodes)))) + (is (= 1 (count (nodes-with-tag "deprecated")))) + (suspend-nodes-with-tag "deprecated") + (is (suspended? (first (nodes-with-tag "deprecated")))) + (resume-nodes-with-tag "deprecated") + (is (running? (first (nodes-with-tag "deprecated")))) + (reboot-nodes-with-tag "deprecated") + (is (running? (first (nodes-with-tag "deprecated")))) + (is (run-nodes "deprecated" 2 (build-template + *compute* {} ))) + (is (= 3 (count (nodes-with-tag "deprecated")))) + (is (= "deprecated" (tag (first (nodes))))) + (destroy-nodes-with-tag "deprecated") + (is (terminated? (first (nodes-with-tag "deprecated"))))) + (deftest build-template-test (let [service (compute-service "stub" "user" "password")] (testing "nullary" From 38a04f671daf58b4764e8027ddf60c2d34a395a6 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 31 Jan 2011 19:45:51 -0800 Subject: [PATCH 30/81] moved elb to sandbox --- all/pom.xml | 5 ----- apis/pom.xml | 1 - providers/pom.xml | 1 - {apis => sandbox-apis}/elb/pom.xml | 0 .../elb/src/main/java/org/jclouds/elb/ELBAsyncClient.java | 0 .../elb/src/main/java/org/jclouds/elb/ELBClient.java | 0 .../elb/src/main/java/org/jclouds/elb/ELBContextBuilder.java | 0 .../src/main/java/org/jclouds/elb/ELBPropertiesBuilder.java | 0 .../binders/BindAvailabilityZonesToIndexedFormParams.java | 0 .../elb/binders/BindInstanceIdsToIndexedFormParams.java | 0 .../binders/BindLoadBalancerNamesToIndexedFormParams.java | 0 .../java/org/jclouds/elb/config/ELBRestClientModule.java | 0 .../src/main/java/org/jclouds/elb/domain/LoadBalancer.java | 0 .../config/ELBBindLoadBalancerStrategiesByClass.java | 0 .../config/ELBBindLoadBalancerSuppliersByClass.java | 0 .../loadbalancer/config/ELBLoadBalancerContextModule.java | 0 .../config/ELBLoadBalancerServiceDependenciesModule.java | 0 .../functions/LoadBalancerToLoadBalancerMetadata.java | 0 .../strategy/ELBDestroyLoadBalancerStrategy.java | 0 .../strategy/ELBGetLoadBalancerMetadataStrategy.java | 0 .../loadbalancer/strategy/ELBListLoadBalancersStrategy.java | 0 .../loadbalancer/strategy/ELBLoadBalanceNodesStrategy.java | 0 .../jclouds/elb/xml/CreateLoadBalancerResponseHandler.java | 0 .../elb/xml/DescribeLoadBalancersResponseHandler.java | 0 .../RegisterInstancesWithLoadBalancerResponseHandler.java | 0 .../src/test/java/org/jclouds/elb/ELBAsyncClientTest.java | 0 .../elb/src/test/java/org/jclouds/elb/ELBClientLiveTest.java | 0 .../test/java/org/jclouds/elb/ProvidersInPropertiesTest.java | 0 .../elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java | 0 .../elb/xml/DescribeLoadBalancerResponseHandlerTest.java | 0 ...RegisterInstancesWithLoadBalancerResponseHandlerTest.java | 0 .../elb/src/test/resources/describe_loadbalancers.xml | 0 {apis => sandbox-apis}/elb/src/test/resources/log4j.xml | 0 .../test/resources/register_instances_with_loadbalancer.xml | 0 {providers => sandbox-providers}/aws-elb/pom.xml | 0 .../java/org/jclouds/aws/elb/AWSELBPropertiesBuilder.java | 0 .../test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java | 0 .../test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java | 0 .../java/org/jclouds/aws/elb/ProvidersInPropertiesTest.java | 0 .../aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java | 0 40 files changed, 7 deletions(-) rename {apis => sandbox-apis}/elb/pom.xml (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/ELBAsyncClient.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/ELBClient.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/ELBContextBuilder.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/ELBPropertiesBuilder.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/binders/BindAvailabilityZonesToIndexedFormParams.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/binders/BindInstanceIdsToIndexedFormParams.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/binders/BindLoadBalancerNamesToIndexedFormParams.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/config/ELBRestClientModule.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/domain/LoadBalancer.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerStrategiesByClass.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerSuppliersByClass.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerContextModule.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerServiceDependenciesModule.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/loadbalancer/functions/LoadBalancerToLoadBalancerMetadata.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBDestroyLoadBalancerStrategy.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBGetLoadBalancerMetadataStrategy.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBListLoadBalancersStrategy.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBLoadBalanceNodesStrategy.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/xml/CreateLoadBalancerResponseHandler.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/xml/DescribeLoadBalancersResponseHandler.java (100%) rename {apis => sandbox-apis}/elb/src/main/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandler.java (100%) rename {apis => sandbox-apis}/elb/src/test/java/org/jclouds/elb/ELBAsyncClientTest.java (100%) rename {apis => sandbox-apis}/elb/src/test/java/org/jclouds/elb/ELBClientLiveTest.java (100%) rename {apis => sandbox-apis}/elb/src/test/java/org/jclouds/elb/ProvidersInPropertiesTest.java (100%) rename {apis => sandbox-apis}/elb/src/test/java/org/jclouds/elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java (100%) rename {apis => sandbox-apis}/elb/src/test/java/org/jclouds/elb/xml/DescribeLoadBalancerResponseHandlerTest.java (100%) rename {apis => sandbox-apis}/elb/src/test/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandlerTest.java (100%) rename {apis => sandbox-apis}/elb/src/test/resources/describe_loadbalancers.xml (100%) rename {apis => sandbox-apis}/elb/src/test/resources/log4j.xml (100%) rename {apis => sandbox-apis}/elb/src/test/resources/register_instances_with_loadbalancer.xml (100%) rename {providers => sandbox-providers}/aws-elb/pom.xml (100%) rename {providers => sandbox-providers}/aws-elb/src/main/java/org/jclouds/aws/elb/AWSELBPropertiesBuilder.java (100%) rename {providers => sandbox-providers}/aws-elb/src/test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java (100%) rename {providers => sandbox-providers}/aws-elb/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java (100%) rename {providers => sandbox-providers}/aws-elb/src/test/java/org/jclouds/aws/elb/ProvidersInPropertiesTest.java (100%) rename {providers => sandbox-providers}/aws-elb/src/test/java/org/jclouds/aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java (100%) diff --git a/all/pom.xml b/all/pom.xml index 4b2172267d..51f0aab3ea 100644 --- a/all/pom.xml +++ b/all/pom.xml @@ -39,10 +39,5 @@ jclouds-allblobstore ${project.version} - - org.jclouds.provider - aws-elb - ${project.version} - diff --git a/apis/pom.xml b/apis/pom.xml index 8f525fd211..37c7bfae37 100644 --- a/apis/pom.xml +++ b/apis/pom.xml @@ -37,7 +37,6 @@ byon s3 ec2 - elb walrus eucalyptus swift diff --git a/providers/pom.xml b/providers/pom.xml index 51b12888f8..1a3c32e337 100644 --- a/providers/pom.xml +++ b/providers/pom.xml @@ -37,7 +37,6 @@ slicehost cloudsigma-zrh azureblob - aws-elb aws-s3 aws-ec2 googlestorage diff --git a/apis/elb/pom.xml b/sandbox-apis/elb/pom.xml similarity index 100% rename from apis/elb/pom.xml rename to sandbox-apis/elb/pom.xml diff --git a/apis/elb/src/main/java/org/jclouds/elb/ELBAsyncClient.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/ELBAsyncClient.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/ELBAsyncClient.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/ELBAsyncClient.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/ELBClient.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/ELBClient.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/ELBClient.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/ELBClient.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/ELBContextBuilder.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/ELBContextBuilder.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/ELBContextBuilder.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/ELBContextBuilder.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/ELBPropertiesBuilder.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/ELBPropertiesBuilder.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/ELBPropertiesBuilder.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/ELBPropertiesBuilder.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/binders/BindAvailabilityZonesToIndexedFormParams.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/binders/BindAvailabilityZonesToIndexedFormParams.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/binders/BindAvailabilityZonesToIndexedFormParams.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/binders/BindAvailabilityZonesToIndexedFormParams.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/binders/BindInstanceIdsToIndexedFormParams.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/binders/BindInstanceIdsToIndexedFormParams.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/binders/BindInstanceIdsToIndexedFormParams.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/binders/BindInstanceIdsToIndexedFormParams.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/binders/BindLoadBalancerNamesToIndexedFormParams.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/binders/BindLoadBalancerNamesToIndexedFormParams.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/binders/BindLoadBalancerNamesToIndexedFormParams.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/binders/BindLoadBalancerNamesToIndexedFormParams.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/config/ELBRestClientModule.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/config/ELBRestClientModule.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/config/ELBRestClientModule.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/config/ELBRestClientModule.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/domain/LoadBalancer.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/domain/LoadBalancer.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/domain/LoadBalancer.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/domain/LoadBalancer.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerStrategiesByClass.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerStrategiesByClass.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerStrategiesByClass.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerStrategiesByClass.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerSuppliersByClass.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerSuppliersByClass.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerSuppliersByClass.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBBindLoadBalancerSuppliersByClass.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerContextModule.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerContextModule.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerContextModule.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerContextModule.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerServiceDependenciesModule.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerServiceDependenciesModule.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerServiceDependenciesModule.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/config/ELBLoadBalancerServiceDependenciesModule.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/loadbalancer/functions/LoadBalancerToLoadBalancerMetadata.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/functions/LoadBalancerToLoadBalancerMetadata.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/loadbalancer/functions/LoadBalancerToLoadBalancerMetadata.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/functions/LoadBalancerToLoadBalancerMetadata.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBDestroyLoadBalancerStrategy.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBDestroyLoadBalancerStrategy.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBDestroyLoadBalancerStrategy.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBDestroyLoadBalancerStrategy.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBGetLoadBalancerMetadataStrategy.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBGetLoadBalancerMetadataStrategy.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBGetLoadBalancerMetadataStrategy.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBGetLoadBalancerMetadataStrategy.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBListLoadBalancersStrategy.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBListLoadBalancersStrategy.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBListLoadBalancersStrategy.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBListLoadBalancersStrategy.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBLoadBalanceNodesStrategy.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBLoadBalanceNodesStrategy.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBLoadBalanceNodesStrategy.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBLoadBalanceNodesStrategy.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/xml/CreateLoadBalancerResponseHandler.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/xml/CreateLoadBalancerResponseHandler.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/xml/CreateLoadBalancerResponseHandler.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/xml/CreateLoadBalancerResponseHandler.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/xml/DescribeLoadBalancersResponseHandler.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/xml/DescribeLoadBalancersResponseHandler.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/xml/DescribeLoadBalancersResponseHandler.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/xml/DescribeLoadBalancersResponseHandler.java diff --git a/apis/elb/src/main/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandler.java b/sandbox-apis/elb/src/main/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandler.java similarity index 100% rename from apis/elb/src/main/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandler.java rename to sandbox-apis/elb/src/main/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandler.java diff --git a/apis/elb/src/test/java/org/jclouds/elb/ELBAsyncClientTest.java b/sandbox-apis/elb/src/test/java/org/jclouds/elb/ELBAsyncClientTest.java similarity index 100% rename from apis/elb/src/test/java/org/jclouds/elb/ELBAsyncClientTest.java rename to sandbox-apis/elb/src/test/java/org/jclouds/elb/ELBAsyncClientTest.java diff --git a/apis/elb/src/test/java/org/jclouds/elb/ELBClientLiveTest.java b/sandbox-apis/elb/src/test/java/org/jclouds/elb/ELBClientLiveTest.java similarity index 100% rename from apis/elb/src/test/java/org/jclouds/elb/ELBClientLiveTest.java rename to sandbox-apis/elb/src/test/java/org/jclouds/elb/ELBClientLiveTest.java diff --git a/apis/elb/src/test/java/org/jclouds/elb/ProvidersInPropertiesTest.java b/sandbox-apis/elb/src/test/java/org/jclouds/elb/ProvidersInPropertiesTest.java similarity index 100% rename from apis/elb/src/test/java/org/jclouds/elb/ProvidersInPropertiesTest.java rename to sandbox-apis/elb/src/test/java/org/jclouds/elb/ProvidersInPropertiesTest.java diff --git a/apis/elb/src/test/java/org/jclouds/elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java b/sandbox-apis/elb/src/test/java/org/jclouds/elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java similarity index 100% rename from apis/elb/src/test/java/org/jclouds/elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java rename to sandbox-apis/elb/src/test/java/org/jclouds/elb/loadbalancer/ELBLoadBalancerServiceLiveTest.java diff --git a/apis/elb/src/test/java/org/jclouds/elb/xml/DescribeLoadBalancerResponseHandlerTest.java b/sandbox-apis/elb/src/test/java/org/jclouds/elb/xml/DescribeLoadBalancerResponseHandlerTest.java similarity index 100% rename from apis/elb/src/test/java/org/jclouds/elb/xml/DescribeLoadBalancerResponseHandlerTest.java rename to sandbox-apis/elb/src/test/java/org/jclouds/elb/xml/DescribeLoadBalancerResponseHandlerTest.java diff --git a/apis/elb/src/test/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandlerTest.java b/sandbox-apis/elb/src/test/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandlerTest.java similarity index 100% rename from apis/elb/src/test/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandlerTest.java rename to sandbox-apis/elb/src/test/java/org/jclouds/elb/xml/RegisterInstancesWithLoadBalancerResponseHandlerTest.java diff --git a/apis/elb/src/test/resources/describe_loadbalancers.xml b/sandbox-apis/elb/src/test/resources/describe_loadbalancers.xml similarity index 100% rename from apis/elb/src/test/resources/describe_loadbalancers.xml rename to sandbox-apis/elb/src/test/resources/describe_loadbalancers.xml diff --git a/apis/elb/src/test/resources/log4j.xml b/sandbox-apis/elb/src/test/resources/log4j.xml similarity index 100% rename from apis/elb/src/test/resources/log4j.xml rename to sandbox-apis/elb/src/test/resources/log4j.xml diff --git a/apis/elb/src/test/resources/register_instances_with_loadbalancer.xml b/sandbox-apis/elb/src/test/resources/register_instances_with_loadbalancer.xml similarity index 100% rename from apis/elb/src/test/resources/register_instances_with_loadbalancer.xml rename to sandbox-apis/elb/src/test/resources/register_instances_with_loadbalancer.xml diff --git a/providers/aws-elb/pom.xml b/sandbox-providers/aws-elb/pom.xml similarity index 100% rename from providers/aws-elb/pom.xml rename to sandbox-providers/aws-elb/pom.xml diff --git a/providers/aws-elb/src/main/java/org/jclouds/aws/elb/AWSELBPropertiesBuilder.java b/sandbox-providers/aws-elb/src/main/java/org/jclouds/aws/elb/AWSELBPropertiesBuilder.java similarity index 100% rename from providers/aws-elb/src/main/java/org/jclouds/aws/elb/AWSELBPropertiesBuilder.java rename to sandbox-providers/aws-elb/src/main/java/org/jclouds/aws/elb/AWSELBPropertiesBuilder.java diff --git a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java b/sandbox-providers/aws-elb/src/test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java similarity index 100% rename from providers/aws-elb/src/test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java rename to sandbox-providers/aws-elb/src/test/java/org/jclouds/aws/elb/AWSELBClientLiveTest.java diff --git a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java b/sandbox-providers/aws-elb/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java similarity index 100% rename from providers/aws-elb/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java rename to sandbox-providers/aws-elb/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java diff --git a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/ProvidersInPropertiesTest.java b/sandbox-providers/aws-elb/src/test/java/org/jclouds/aws/elb/ProvidersInPropertiesTest.java similarity index 100% rename from providers/aws-elb/src/test/java/org/jclouds/aws/elb/ProvidersInPropertiesTest.java rename to sandbox-providers/aws-elb/src/test/java/org/jclouds/aws/elb/ProvidersInPropertiesTest.java diff --git a/providers/aws-elb/src/test/java/org/jclouds/aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java b/sandbox-providers/aws-elb/src/test/java/org/jclouds/aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java similarity index 100% rename from providers/aws-elb/src/test/java/org/jclouds/aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java rename to sandbox-providers/aws-elb/src/test/java/org/jclouds/aws/elb/config/AWSELBLoadBalancerServiceLiveTest.java From af16b30b4568bb59c5f894b582c48aa04101ff47 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 1 Feb 2011 03:06:49 +0100 Subject: [PATCH 31/81] Renamed core-jar-with-dependencies-descriptor -> jar-with-dependencies-descriptor Renamed jar-with-dependencies-descriptor -> jar-with-dependencies-no-core-no-apis-descriptor Added a provided-dependencies-descriptor to the default assemblies run with -Pdistribution --- .../jar-with-dependencies-descriptor.xml | 17 +--- ...ependencies-no-core-no-apis-descriptor.xml | 60 +++++++++++++ ...l => provided-dependencies-descriptor.xml} | 84 ++++++++++--------- core/pom.xml | 4 +- project/pom.xml | 39 ++++----- 5 files changed, 127 insertions(+), 77 deletions(-) create mode 100644 assemblies/src/main/resources/assemblies/jar-with-dependencies-no-core-no-apis-descriptor.xml rename assemblies/src/main/resources/assemblies/{core-jar-with-dependencies-descriptor.xml => provided-dependencies-descriptor.xml} (67%) diff --git a/assemblies/src/main/resources/assemblies/jar-with-dependencies-descriptor.xml b/assemblies/src/main/resources/assemblies/jar-with-dependencies-descriptor.xml index e55eb314bb..e07c7fcda0 100644 --- a/assemblies/src/main/resources/assemblies/jar-with-dependencies-descriptor.xml +++ b/assemblies/src/main/resources/assemblies/jar-with-dependencies-descriptor.xml @@ -29,13 +29,6 @@ true runtime - - org.jclouds:jclouds-core - org.jclouds:jclouds-blobstore - org.jclouds:jclouds-compute - - - true @@ -43,13 +36,5 @@ ${project.build.outputDirectory} - - - - pom.xml - - META-INF/maven/${project.groupId}/${project.artifactId} - - + \ No newline at end of file diff --git a/assemblies/src/main/resources/assemblies/jar-with-dependencies-no-core-no-apis-descriptor.xml b/assemblies/src/main/resources/assemblies/jar-with-dependencies-no-core-no-apis-descriptor.xml new file mode 100644 index 0000000000..b4bc50aa95 --- /dev/null +++ b/assemblies/src/main/resources/assemblies/jar-with-dependencies-no-core-no-apis-descriptor.xml @@ -0,0 +1,60 @@ + + + + jar-with-dependencies + + jar + + false + + + true + runtime + + org.jclouds:jclouds-core + org.jclouds:jclouds-blobstore + org.jclouds:jclouds-compute + org.jclouds:jclouds-loadbalancer + org.jclouds.api:* + + org.clojure:clojure* + + + true + false + + + + + ${project.build.outputDirectory} + + + + + + pom.xml + + META-INF/maven/${project.groupId}/${project.artifactId} + + + diff --git a/assemblies/src/main/resources/assemblies/core-jar-with-dependencies-descriptor.xml b/assemblies/src/main/resources/assemblies/provided-dependencies-descriptor.xml similarity index 67% rename from assemblies/src/main/resources/assemblies/core-jar-with-dependencies-descriptor.xml rename to assemblies/src/main/resources/assemblies/provided-dependencies-descriptor.xml index e07c7fcda0..3e7784bbe5 100644 --- a/assemblies/src/main/resources/assemblies/core-jar-with-dependencies-descriptor.xml +++ b/assemblies/src/main/resources/assemblies/provided-dependencies-descriptor.xml @@ -1,40 +1,44 @@ - - - - jar-with-dependencies - - jar - - false - - - true - runtime - - - - - ${project.build.outputDirectory} - - - - \ No newline at end of file + + + + provided-dependencies + + dir + + false + + + provided + false + + + + + + + pom.xml + + META-INF/maven/${project.groupId}/${project.artifactId} + + + diff --git a/core/pom.xml b/core/pom.xml index 94f2622f0e..8952d644ba 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -128,7 +128,7 @@ maven-assembly-plugin - + jar-with-dependencies package @@ -137,7 +137,7 @@ - core-jar-with-dependencies-descriptor.xml + jar-with-dependencies-descriptor.xml diff --git a/project/pom.xml b/project/pom.xml index c81667fd16..979c8cdeec 100644 --- a/project/pom.xml +++ b/project/pom.xml @@ -251,23 +251,23 @@ 2.4 test - - org.clojure - clojure - 1.2.0 - true - - - org.clojure - clojure-contrib - 1.2.0 - true - - swank-clojure - swank-clojure - 1.2.1 - test + org.clojure + clojure + 1.2.0 + true + + + org.clojure + clojure-contrib + 1.2.0 + true + + + swank-clojure + swank-clojure + 1.2.1 + test @@ -409,7 +409,7 @@ - -J-Xmx128m + -J-Xmx256m ${project.build.sourceEncoding} true @@ -628,14 +628,15 @@ pageTracker._trackPageview(); true src-descriptor.xml - jar-with-dependencies-descriptor.xml + provided-dependencies-descriptor.xml + jar-with-dependencies-no-core-no-apis-descriptor.xml - ${project.groupId} + org.jclouds jclouds-assemblies ${project.version} From c3eda7279eebe8cfdb65a8f2a2b3e1a64f37d1e3 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 1 Feb 2011 03:08:32 +0100 Subject: [PATCH 32/81] Made driver JARs that the driver projects provide to jclouds 'provided', and added READMEs --- drivers/apachehc/README.txt | 24 ++++++++++++++++++++++++ drivers/apachehc/pom.xml | 1 + drivers/bouncycastle/README.txt | 2 +- drivers/bouncycastle/pom.xml | 1 + drivers/enterprise/README.txt | 2 +- drivers/gae/README.txt | 2 +- drivers/gae/pom.xml | 1 + drivers/joda/README.txt | 2 +- drivers/joda/pom.xml | 1 + drivers/jsch/README.txt | 2 +- drivers/jsch/pom.xml | 2 ++ drivers/log4j/README.txt | 2 +- drivers/log4j/pom.xml | 1 + 13 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 drivers/apachehc/README.txt diff --git a/drivers/apachehc/README.txt b/drivers/apachehc/README.txt new file mode 100644 index 0000000000..3acff509ff --- /dev/null +++ b/drivers/apachehc/README.txt @@ -0,0 +1,24 @@ +==== + + 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. + ==================================================================== +==== + +# +# A driver to use the Apache HTTP Components Client (http://hc.apache.org/) +# as an encryption library in jclouds. +# +# TODO: Usage example. \ No newline at end of file diff --git a/drivers/apachehc/pom.xml b/drivers/apachehc/pom.xml index c86a731758..189e3e9334 100644 --- a/drivers/apachehc/pom.xml +++ b/drivers/apachehc/pom.xml @@ -63,6 +63,7 @@ org.apache.httpcomponents httpclient 4.0.3 + provided org.mortbay.jetty diff --git a/drivers/bouncycastle/README.txt b/drivers/bouncycastle/README.txt index ab70bc1683..9d9162d972 100644 --- a/drivers/bouncycastle/README.txt +++ b/drivers/bouncycastle/README.txt @@ -18,7 +18,7 @@ ==== # -# An extension to use the Bouncy Castle Crypto API (http://www.bouncycastle.org/) +# A driver to use the Bouncy Castle Crypto API (http://www.bouncycastle.org/) # as an encryption library in jclouds. # # TODO: Usage example. \ No newline at end of file diff --git a/drivers/bouncycastle/pom.xml b/drivers/bouncycastle/pom.xml index 8ee55fba32..3d361dab36 100644 --- a/drivers/bouncycastle/pom.xml +++ b/drivers/bouncycastle/pom.xml @@ -62,6 +62,7 @@ org.bouncycastle bcprov-jdk15 1.44 + provided diff --git a/drivers/enterprise/README.txt b/drivers/enterprise/README.txt index 4386890ebf..8796da30a6 100644 --- a/drivers/enterprise/README.txt +++ b/drivers/enterprise/README.txt @@ -18,6 +18,6 @@ ==== # -# Sets up most commonly requested options for enterprise java support +# Sets up most commonly requested options for enterprise Java support. # # TODO: Usage example. diff --git a/drivers/gae/README.txt b/drivers/gae/README.txt index 8726f7b8e3..2bdbee5984 100644 --- a/drivers/gae/README.txt +++ b/drivers/gae/README.txt @@ -18,6 +18,6 @@ ==== # -# An extension to run jclouds on Google App Engine (http://code.google.com/appengine/). +# A driver to run jclouds on Google App Engine (http://code.google.com/appengine/). # # TODO: Usage example. diff --git a/drivers/gae/pom.xml b/drivers/gae/pom.xml index dfecd54e23..7cda00072d 100644 --- a/drivers/gae/pom.xml +++ b/drivers/gae/pom.xml @@ -65,6 +65,7 @@ com.google.appengine appengine-api 1.3.5 + provided com.google.appengine diff --git a/drivers/joda/README.txt b/drivers/joda/README.txt index 30ec94fbb1..ab9c5234bd 100644 --- a/drivers/joda/README.txt +++ b/drivers/joda/README.txt @@ -18,7 +18,7 @@ ==== # -# An extension to use Joda (http://joda-time.sourceforge.net/) as a time and date library +# A driver to use Joda (http://joda-time.sourceforge.net/) as a time and date library # in jclouds. # # TODO: Usage example. \ No newline at end of file diff --git a/drivers/joda/pom.xml b/drivers/joda/pom.xml index 012ca0b3f7..91dbab2986 100644 --- a/drivers/joda/pom.xml +++ b/drivers/joda/pom.xml @@ -62,6 +62,7 @@ joda-time joda-time 1.6 + provided diff --git a/drivers/jsch/README.txt b/drivers/jsch/README.txt index 1bca4fb8c3..48c3e2eee0 100644 --- a/drivers/jsch/README.txt +++ b/drivers/jsch/README.txt @@ -18,7 +18,7 @@ ==== # -# An extension to use JSch (http://www.jcraft.com/jsch/) as the SSH connection provider +# A driver to use JSch (http://www.jcraft.com/jsch/) as the SSH connection provider # for jclouds. # # TODO: Usage example. \ No newline at end of file diff --git a/drivers/jsch/pom.xml b/drivers/jsch/pom.xml index f5323ee021..059ad63e17 100644 --- a/drivers/jsch/pom.xml +++ b/drivers/jsch/pom.xml @@ -67,11 +67,13 @@ com.jcraft jsch 0.1.42 + provided commons-io commons-io 1.4 + provided diff --git a/drivers/log4j/README.txt b/drivers/log4j/README.txt index 4539b3f32c..b124f0adbf 100644 --- a/drivers/log4j/README.txt +++ b/drivers/log4j/README.txt @@ -18,7 +18,7 @@ ==== # -# An extension to use Log4j (http://logging.apache.org/log4j/) as the logging provider +# A driver to use Log4j (http://logging.apache.org/log4j/) as the logging provider # for jclouds. # # Expects log4j to be present on your application's classpath. diff --git a/drivers/log4j/pom.xml b/drivers/log4j/pom.xml index bb73b46d65..e9ece377be 100644 --- a/drivers/log4j/pom.xml +++ b/drivers/log4j/pom.xml @@ -62,6 +62,7 @@ log4j log4j 1.2.14 + provided From 4f8e953184ba87ace0c4d2ff9ddd636762b21e02 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 1 Feb 2011 03:09:51 +0100 Subject: [PATCH 33/81] Added READMEs for APIs --- apis/atmos/README.txt | 2 +- apis/cloudfiles/README.txt | 25 +++++++++++++++++++++++++ apis/cloudservers/README.txt | 25 +++++++++++++++++++++++++ apis/ec2/README.txt | 25 +++++++++++++++++++++++++ apis/elasticstack/README.txt | 25 +++++++++++++++++++++++++ apis/elb/README.txt | 25 +++++++++++++++++++++++++ apis/eucalyptus/README.txt | 27 +++++++++++++++++++++++++++ apis/filesystem/README.txt | 25 +++++++++++++++++++++++++ apis/s3/README.txt | 25 +++++++++++++++++++++++++ apis/swift/README.txt | 25 +++++++++++++++++++++++++ apis/vcloud/README.txt | 2 +- apis/vcloudexpress/README.txt | 25 +++++++++++++++++++++++++ apis/walrus/README.txt | 27 +++++++++++++++++++++++++++ 13 files changed, 281 insertions(+), 2 deletions(-) create mode 100644 apis/cloudfiles/README.txt create mode 100644 apis/cloudservers/README.txt create mode 100644 apis/ec2/README.txt create mode 100644 apis/elasticstack/README.txt create mode 100644 apis/elb/README.txt create mode 100644 apis/eucalyptus/README.txt create mode 100644 apis/filesystem/README.txt create mode 100644 apis/s3/README.txt create mode 100644 apis/swift/README.txt create mode 100644 apis/vcloudexpress/README.txt create mode 100644 apis/walrus/README.txt diff --git a/apis/atmos/README.txt b/apis/atmos/README.txt index d4792984b6..e871588a07 100644 --- a/apis/atmos/README.txt +++ b/apis/atmos/README.txt @@ -18,7 +18,7 @@ ==== # -# The jclouds provider for EMC's Atmos Online Storage (http://www.emccis.com/). +# The jclouds API for EMC's Atmos Online Storage (http://www.emccis.com/). # # TODO: Implementation status. # TODO: Supported features. diff --git a/apis/cloudfiles/README.txt b/apis/cloudfiles/README.txt new file mode 100644 index 0000000000..f45ece8e49 --- /dev/null +++ b/apis/cloudfiles/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for Rackspace's Cloud Files (http://www.rackspacecloud.com/cloud_hosting_products/files/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/cloudservers/README.txt b/apis/cloudservers/README.txt new file mode 100644 index 0000000000..b89f80ab55 --- /dev/null +++ b/apis/cloudservers/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for Rackspace's Cloud Server (http://www.rackspacecloud.com/cloud_hosting_products/servers/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/ec2/README.txt b/apis/ec2/README.txt new file mode 100644 index 0000000000..92364d368a --- /dev/null +++ b/apis/ec2/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for Amazon's EC2 service (http://aws.amazon.com/ec2/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/elasticstack/README.txt b/apis/elasticstack/README.txt new file mode 100644 index 0000000000..32c2bfd6be --- /dev/null +++ b/apis/elasticstack/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for ElasticHosts' Cloud Servers API (http://www.elastichosts.com/cloud-hosting/api/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/elb/README.txt b/apis/elb/README.txt new file mode 100644 index 0000000000..0ee638b7f2 --- /dev/null +++ b/apis/elb/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for Amazon's Elastic Load Balancing service (http://aws.amazon.com/elasticloadbalancing/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/eucalyptus/README.txt b/apis/eucalyptus/README.txt new file mode 100644 index 0000000000..9646bcdad5 --- /dev/null +++ b/apis/eucalyptus/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for Eucalyptus Systems' EC2 flavour (http://www.eucalyptus.com/). +# +# Expects the jclouds EC2 API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/filesystem/README.txt b/apis/filesystem/README.txt new file mode 100644 index 0000000000..b97c1545fd --- /dev/null +++ b/apis/filesystem/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for accessing a local filesystem as a blobstore. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/s3/README.txt b/apis/s3/README.txt new file mode 100644 index 0000000000..7254aefa1d --- /dev/null +++ b/apis/s3/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for Amazon's S3 (http://aws.amazon.com/s3/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/swift/README.txt b/apis/swift/README.txt new file mode 100644 index 0000000000..2aaebfc87a --- /dev/null +++ b/apis/swift/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for OpenStack's Swift (http://swift.openstack.org/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/vcloud/README.txt b/apis/vcloud/README.txt index fa4b41984a..a898e09519 100644 --- a/apis/vcloud/README.txt +++ b/apis/vcloud/README.txt @@ -18,7 +18,7 @@ ==== # -# The jclouds provider for VMware vCloud (http://www.vmware.com/solutions/cloud-computing/vcloud.html). +# The jclouds API for VMware vCloud (http://www.vmware.com/products/vcloud/). # # TODO: Implementation status. # TODO: Supported features. diff --git a/apis/vcloudexpress/README.txt b/apis/vcloudexpress/README.txt new file mode 100644 index 0000000000..5bacd3d3c9 --- /dev/null +++ b/apis/vcloudexpress/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for VMware vCloud (http://www.vmware.com/solutions/cloud-computing/public-cloud/vcloud-express.html). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/apis/walrus/README.txt b/apis/walrus/README.txt new file mode 100644 index 0000000000..d866ca42ff --- /dev/null +++ b/apis/walrus/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds API for Walrus, Eucalyptus Systems' S3 flavour (http://www.eucalyptus.com/). +# +# Expects the jclouds S3 API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file From 0e90930ef7ca83933ed70cb963ebf46448f4a1bf Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 1 Feb 2011 03:53:09 +0100 Subject: [PATCH 34/81] Added READMEs for all providers, with information on which API JARs are expected on the classpath --- providers/aws-ec2/README.txt | 27 +++++++++++++++++++ providers/aws-elb/README.txt | 27 +++++++++++++++++++ providers/aws-s3/README.txt | 27 +++++++++++++++++++ providers/azureblob/README.txt | 25 +++++++++++++++++ providers/bluelock-vcdirector/README.txt | 4 ++- providers/cloudfiles-uk/README.txt | 27 +++++++++++++++++++ providers/cloudfiles-us/README.txt | 27 +++++++++++++++++++ providers/cloudonestorage/README.txt | 27 +++++++++++++++++++ providers/cloudservers-uk/README.txt | 27 +++++++++++++++++++ providers/cloudservers-us/README.txt | 27 +++++++++++++++++++ providers/cloudsigma-zrh/README.txt | 25 +++++++++++++++++ providers/elastichosts-lon-b/README.txt | 27 +++++++++++++++++++ providers/elastichosts-lon-p/README.txt | 27 +++++++++++++++++++ providers/elastichosts-sat-p/README.txt | 27 +++++++++++++++++++ .../eucalyptus-partnercloud-ec2/README.txt | 27 +++++++++++++++++++ .../eucalyptus-partnercloud-s3/README.txt | 27 +++++++++++++++++++ providers/gogrid/README.txt | 25 +++++++++++++++++ providers/googlestorage/README.txt | 27 +++++++++++++++++++ providers/openhosting-east1/README.txt | 27 +++++++++++++++++++ providers/scaleup-storage/README.txt | 27 +++++++++++++++++++ providers/serverlove-z1-man/README.txt | 27 +++++++++++++++++++ providers/skalicloud-sdg-my/README.txt | 27 +++++++++++++++++++ providers/slicehost/README.txt | 25 +++++++++++++++++ providers/synaptic-storage/README.txt | 27 +++++++++++++++++++ providers/trmk-ecloud/README.txt | 6 +++-- providers/trmk-vcloudexpress/README.txt | 27 +++++++++++++++++++ 26 files changed, 647 insertions(+), 3 deletions(-) create mode 100644 providers/aws-ec2/README.txt create mode 100644 providers/aws-elb/README.txt create mode 100644 providers/aws-s3/README.txt create mode 100644 providers/azureblob/README.txt create mode 100644 providers/cloudfiles-uk/README.txt create mode 100644 providers/cloudfiles-us/README.txt create mode 100644 providers/cloudonestorage/README.txt create mode 100644 providers/cloudservers-uk/README.txt create mode 100644 providers/cloudservers-us/README.txt create mode 100644 providers/cloudsigma-zrh/README.txt create mode 100644 providers/elastichosts-lon-b/README.txt create mode 100644 providers/elastichosts-lon-p/README.txt create mode 100644 providers/elastichosts-sat-p/README.txt create mode 100644 providers/eucalyptus-partnercloud-ec2/README.txt create mode 100644 providers/eucalyptus-partnercloud-s3/README.txt create mode 100644 providers/gogrid/README.txt create mode 100644 providers/googlestorage/README.txt create mode 100644 providers/openhosting-east1/README.txt create mode 100644 providers/scaleup-storage/README.txt create mode 100644 providers/serverlove-z1-man/README.txt create mode 100644 providers/skalicloud-sdg-my/README.txt create mode 100644 providers/slicehost/README.txt create mode 100644 providers/synaptic-storage/README.txt create mode 100644 providers/trmk-vcloudexpress/README.txt diff --git a/providers/aws-ec2/README.txt b/providers/aws-ec2/README.txt new file mode 100644 index 0000000000..3b176f44ff --- /dev/null +++ b/providers/aws-ec2/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Amazon's EC2 (http://aws.amazon.com/ec2/). +# +# Expects the jclouds ec2 API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. diff --git a/providers/aws-elb/README.txt b/providers/aws-elb/README.txt new file mode 100644 index 0000000000..ee604e0aba --- /dev/null +++ b/providers/aws-elb/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Amazon's Elastic Load Balancing (http://aws.amazon.com/elasticloadbalancing/). +# +# Expects the jclouds elb API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. diff --git a/providers/aws-s3/README.txt b/providers/aws-s3/README.txt new file mode 100644 index 0000000000..d3222f6f4a --- /dev/null +++ b/providers/aws-s3/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Amazon's S3 (http://aws.amazon.com/s3/). +# +# Expects the jclouds s3 API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. diff --git a/providers/azureblob/README.txt b/providers/azureblob/README.txt new file mode 100644 index 0000000000..b98cd153b3 --- /dev/null +++ b/providers/azureblob/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Windows Azure's Storage (http://www.microsoft.com/windowsazure/storage/default.aspx). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. diff --git a/providers/bluelock-vcdirector/README.txt b/providers/bluelock-vcdirector/README.txt index 3eb7e8335e..17cf4cf0bc 100644 --- a/providers/bluelock-vcdirector/README.txt +++ b/providers/bluelock-vcdirector/README.txt @@ -18,7 +18,9 @@ ==== # -# The jclouds provider for BlueLock's vCloud Director platform. +# The jclouds provider for BlueLock's vCloud Director (http://www.bluelock.com/bluelock-cloud-hosting/vcloud-datacenter/) platform. +# +# Expects the jclouds vcloud API to be present on your application's classpath. # # TODO: Implementation status. # TODO: Supported features. diff --git a/providers/cloudfiles-uk/README.txt b/providers/cloudfiles-uk/README.txt new file mode 100644 index 0000000000..b7be2a8ac6 --- /dev/null +++ b/providers/cloudfiles-uk/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Rackspace's UK Cloud Files (http://www.rackspacecloud.com/cloud_hosting_products/files/). +# +# Expects the jclouds cloudfiles API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/cloudfiles-us/README.txt b/providers/cloudfiles-us/README.txt new file mode 100644 index 0000000000..9b98f21ffb --- /dev/null +++ b/providers/cloudfiles-us/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Rackspace's US Cloud Files (http://www.rackspacecloud.com/cloud_hosting_products/files/). +# +# Expects the jclouds cloudfiles API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/cloudonestorage/README.txt b/providers/cloudonestorage/README.txt new file mode 100644 index 0000000000..e3d172f579 --- /dev/null +++ b/providers/cloudonestorage/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Peer1's CloudOne Storage (http://www.peer1.com/hosting/cloudone-storage.php) service. +# +# Expects the jclouds atmos API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/cloudservers-uk/README.txt b/providers/cloudservers-uk/README.txt new file mode 100644 index 0000000000..5d90f15cb8 --- /dev/null +++ b/providers/cloudservers-uk/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Rackspace's UK Cloud Servers (http://www.rackspacecloud.com/cloud_hosting_products/servers/). +# +# Expects the jclouds cloudservers API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/cloudservers-us/README.txt b/providers/cloudservers-us/README.txt new file mode 100644 index 0000000000..5a845903ec --- /dev/null +++ b/providers/cloudservers-us/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Rackspace's US Cloud Servers (http://www.rackspacecloud.com/cloud_hosting_products/servers/). +# +# Expects the jclouds cloudservers API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/cloudsigma-zrh/README.txt b/providers/cloudsigma-zrh/README.txt new file mode 100644 index 0000000000..8e25a9853c --- /dev/null +++ b/providers/cloudsigma-zrh/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for CloudSigma (http://www.cloudsigma.com/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/elastichosts-lon-b/README.txt b/providers/elastichosts-lon-b/README.txt new file mode 100644 index 0000000000..f33fb31e21 --- /dev/null +++ b/providers/elastichosts-lon-b/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for ElasticHosts' Peer1 London ElasticStack (http://www.elastichosts.com/). +# +# Expects the jclouds elasticstack API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/elastichosts-lon-p/README.txt b/providers/elastichosts-lon-p/README.txt new file mode 100644 index 0000000000..8bfc0016ca --- /dev/null +++ b/providers/elastichosts-lon-p/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for ElasticHosts' BlueSquare London ElasticStack (http://www.elastichosts.com/). +# +# Expects the jclouds elasticstack API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/elastichosts-sat-p/README.txt b/providers/elastichosts-sat-p/README.txt new file mode 100644 index 0000000000..941dcb8b82 --- /dev/null +++ b/providers/elastichosts-sat-p/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for ElasticHosts' Peer1 San Antonio ElasticStack (http://www.elastichosts.com/). +# +# Expects the jclouds elasticstack API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/eucalyptus-partnercloud-ec2/README.txt b/providers/eucalyptus-partnercloud-ec2/README.txt new file mode 100644 index 0000000000..ba64cee9e4 --- /dev/null +++ b/providers/eucalyptus-partnercloud-ec2/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Eucalyptus Partner Cloud's EC2 (http://www.eucalyptus.com/resources/AmazonAWS) service. +# +# Expects the jclouds ec2 API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/eucalyptus-partnercloud-s3/README.txt b/providers/eucalyptus-partnercloud-s3/README.txt new file mode 100644 index 0000000000..8aa505c37d --- /dev/null +++ b/providers/eucalyptus-partnercloud-s3/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Eucalyptus Partner Cloud's Walrus (http://www.eucalyptus.com/resources/AmazonAWS) service. +# +# Expects the jclouds walrus API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/gogrid/README.txt b/providers/gogrid/README.txt new file mode 100644 index 0000000000..7a8fec71e1 --- /dev/null +++ b/providers/gogrid/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for GoGrid (http://www.gogrid.com/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/googlestorage/README.txt b/providers/googlestorage/README.txt new file mode 100644 index 0000000000..907c36371f --- /dev/null +++ b/providers/googlestorage/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Google Storage for Developers (http://code.google.com/apis/storage/). +# +# Expects the jclouds s3 API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/openhosting-east1/README.txt b/providers/openhosting-east1/README.txt new file mode 100644 index 0000000000..ea747b074e --- /dev/null +++ b/providers/openhosting-east1/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Open Hosting's ElasticStack (http://openhosting.com/). +# +# Expects the jclouds elasticstack API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/scaleup-storage/README.txt b/providers/scaleup-storage/README.txt new file mode 100644 index 0000000000..15668aabbd --- /dev/null +++ b/providers/scaleup-storage/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for ScaleUp's Secure Cloud Storage (http://www.scaleupstorage.com/). +# +# Expects the jclouds s3 API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/serverlove-z1-man/README.txt b/providers/serverlove-z1-man/README.txt new file mode 100644 index 0000000000..04eac7e90e --- /dev/null +++ b/providers/serverlove-z1-man/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for serverlove's ElasticStack (http://www.serverlove.com/). +# +# Expects the jclouds elasticstack API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/skalicloud-sdg-my/README.txt b/providers/skalicloud-sdg-my/README.txt new file mode 100644 index 0000000000..79b3d29a9b --- /dev/null +++ b/providers/skalicloud-sdg-my/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for SKALI Cloud's ElasticStack (http://www.skalicloud.com/). +# +# Expects the jclouds elasticstack API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/slicehost/README.txt b/providers/slicehost/README.txt new file mode 100644 index 0000000000..a9d0737a29 --- /dev/null +++ b/providers/slicehost/README.txt @@ -0,0 +1,25 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Slicehost (http://www.slicehost.com/). +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/synaptic-storage/README.txt b/providers/synaptic-storage/README.txt new file mode 100644 index 0000000000..621bff3a68 --- /dev/null +++ b/providers/synaptic-storage/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for AT&T's Synaptic Storage as a Service (https://www.synaptic.att.com/staas/). +# +# Expects the jclouds atmos API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# TODO: Usage example. \ No newline at end of file diff --git a/providers/trmk-ecloud/README.txt b/providers/trmk-ecloud/README.txt index 350d911547..22b3ad8c7f 100644 --- a/providers/trmk-ecloud/README.txt +++ b/providers/trmk-ecloud/README.txt @@ -18,8 +18,10 @@ ==== # -# The jclouds provider for Terremark's vCloud Express (http://vcloudexpress.terremark.com/) platform. +# The jclouds provider for Terremark's Enterprise Cloud (http://www.terremark.com/services/cloudcomputing/theenterprisecloud.aspx) platform. +# +# Expects the jclouds vcloudexpress API to be present on your application's classpath. # # TODO: Implementation status. # TODO: Supported features. -# See http://code.google.com/p/jclouds/wiki/QuickStartTerremark for example usage. \ No newline at end of file +# See http://code.google.com/p/jclouds/wiki/QuickStartTerremarkECloud for example usage. \ No newline at end of file diff --git a/providers/trmk-vcloudexpress/README.txt b/providers/trmk-vcloudexpress/README.txt new file mode 100644 index 0000000000..203175da77 --- /dev/null +++ b/providers/trmk-vcloudexpress/README.txt @@ -0,0 +1,27 @@ +==== + + 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. + ==================================================================== +==== + +# +# The jclouds provider for Terremark's vCloud Express (http://vcloudexpress.terremark.com/) platform. +# +# Expects the jclouds vcloudexpress API to be present on your application's classpath. +# +# TODO: Implementation status. +# TODO: Supported features. +# See http://code.google.com/p/jclouds/wiki/QuickStartTerremark for example usage. \ No newline at end of file From 61e4b13abcc9e925b3737f0511f9970000b42f14 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 1 Feb 2011 03:55:17 +0100 Subject: [PATCH 35/81] [Issue 458] Updated the package assembly to match the API/provider split --- .../assemblies/package-descriptor.xml | 1561 +++++++++++++---- 1 file changed, 1173 insertions(+), 388 deletions(-) diff --git a/assemblies/src/main/resources/assemblies/package-descriptor.xml b/assemblies/src/main/resources/assemblies/package-descriptor.xml index b27ad79fda..06ae186542 100644 --- a/assemblies/src/main/resources/assemblies/package-descriptor.xml +++ b/assemblies/src/main/resources/assemblies/package-descriptor.xml @@ -28,39 +28,29 @@ LICENSE.txt README.txt core - + docs <- javadoc for core, blobstore, and compute - + lib <- core, blobstore, and compute jars and dependencies for core - + src <- expanded or source jar for core, blobstore, and compute - profiles - + enterprise - + README.txt <- how to use the profile - + lib <- not core - + docs <- not core - + src <- not core - extensions + + lib <- core, blobstore, compute and loadbalancer JARs and dependencies for core + + docs <- javadoc for core, blobstore, compute and loadbalancer + + src <- expanded or source jar for core, blobstore, compute and loadbalancer + drivers + log4j - + README.txt <- how to use the extension - + lib <- not core - + docs <- not core - + src <- not core + + README.txt <- how to use the driver + + lib <- excl. core + + docs <- excl. core + + src <- excl. core + apis + + s3 + + README.txt <- status of this API + + lib <- excl. core + + docs <- excl. core + + src <- excl. core providers - + rackspace + + trmk-vcloudexpress + README.txt <- status of this provider (what is implemented/not implemented) - + lib <- not core - + docs <- not core - + src <- not core - tools <- integrations with other tools - + antcontrib - + README.txt <- how to use the tool - + lib <- not core - + docs <- not core - + src <- not core - samples <- includes samples and demos - + tweetstore - + README.txt <- how to build and run the sample - + src <- just demo + + lib <- excl. core and implemented API(s) + + docs <- excl. core and implemented API(s) + + src <- excl. core and implemented API(s) - see http://code.google.com/p/jclouds/issues/detail?id=127 + see http://code.google.com/p/jclouds/issues/detail?id=458 --> @@ -77,6 +67,7 @@ LICENSE.txt true + @@ -101,6 +92,13 @@ core/lib + + loadbalancer/target + + jclouds-loadbalancer-${project.version}.jar + + core/lib + core/target @@ -122,6 +120,13 @@ core/src + + loadbalancer/target + + jclouds-loadbalancer-${project.version}-sources.jar + + core/src + core/target/apidocs core/docs @@ -134,533 +139,1313 @@ compute/target/apidocs core/docs + + loadbalancer/target/apidocs + core/docs + - + - atmos/target + drivers/apachehc/target - jclouds-atmos-${project.version}.jar + jclouds-apachehc-${project.version}-jar-with-dependencies.jar - providers/atmos/lib + drivers/apachehc/lib - atmos/target + drivers/apachehc/target/jclouds-apachehc-${project.version}-provided-dependencies - jclouds-atmos-${project.version}-sources.jar + *.jar - providers/atmos/src + drivers/apachehc/lib - atmos/target/apidocs - providers/atmos/docs + drivers/apachehc/target + + jclouds-apachehc-${project.version}-sources.jar + + drivers/apachehc/src + + + drivers/apachehc/target/apidocs + drivers/apachehc/docs + + + drivers/apachehc + + README.txt + + drivers/apachehc + + + + + drivers/bouncycastle/target + + jclouds-bouncycastle-${project.version}-jar-with-dependencies.jar + + drivers/bouncycastle/lib + + + drivers/bouncycastle/target/jclouds-bouncycastle-${project.version}-provided-dependencies + + *.jar + + drivers/bouncycastle/lib + + + drivers/bouncycastle/target + + jclouds-bouncycastle-${project.version}-sources.jar + + drivers/bouncycastle/src + + + drivers/bouncycastle/target/apidocs + drivers/bouncycastle/docs + + + drivers/bouncycastle + + README.txt + + drivers/bouncycastle + + + + + drivers/enterprise/target + + jclouds-enterprise-${project.version}-jar-with-dependencies.jar + + drivers/enterprise/lib + + + drivers/enterprise/target + + jclouds-enterprise-${project.version}-sources.jar + + drivers/enterprise/src + + + drivers/enterprise/target/apidocs + drivers/enterprise/docs + + + drivers/enterprise + + README.txt + + drivers/enterprise + + + + + drivers/gae/target + + jclouds-gae-${project.version}-jar-with-dependencies.jar + + drivers/gae/lib + + + drivers/gae/target + + jclouds-gae-${project.version}-sources.jar + + drivers/gae/src + + + drivers/gae/target/apidocs + drivers/gae/docs + + + drivers/gae + + README.txt + + drivers/gae + + + + + drivers/joda/target + + jclouds-joda-${project.version}-jar-with-dependencies.jar + + drivers/joda/lib + + + drivers/joda/target/jclouds-joda-${project.version}-provided-dependencies + + *.jar + + drivers/joda/lib + + + drivers/joda/target + + jclouds-joda-${project.version}-sources.jar + + drivers/joda/src + + + drivers/joda/target/apidocs + drivers/joda/docs + + + drivers/joda + + README.txt + + drivers/joda + + + + + drivers/jsch/target + + jclouds-jsch-${project.version}-jar-with-dependencies.jar + + drivers/jsch/lib + + + drivers/jsch/target/jclouds-jsch-${project.version}-provided-dependencies + + *.jar + + drivers/jsch/lib + + + drivers/jsch/target + + jclouds-jsch-${project.version}-sources.jar + + drivers/jsch/src + + + drivers/jsch/target/apidocs + drivers/jsch/docs + + + drivers/jsch + + README.txt + + drivers/jsch + + + + + drivers/log4j/target + + jclouds-log4j-${project.version}-jar-with-dependencies.jar + + drivers/log4j/lib + + + drivers/log4j/target/jclouds-log4j-${project.version}-provided-dependencies + + *.jar + + drivers/log4j/lib + + + drivers/log4j/target + + jclouds-log4j-${project.version}-sources.jar + + drivers/log4j/src + + + drivers/log4j/target/apidocs + drivers/log4j/docs + + + drivers/log4j + + README.txt + + drivers/log4j + + + + + apis/atmos/target + + atmos-${project.version}-jar-with-dependencies.jar + + apis/atmos/lib + + + apis/atmos/target + + atmos-${project.version}-sources.jar + + apis/atmos/src + + + apis/atmos/target/apidocs + apis/atmos/docs - atmos + apis/atmos README.txt - providers/atmos - - - - - aws/core/target - - jclouds-aws-${project.version}.jar - - providers/aws/lib - - - aws/core/target - - jclouds-aws-${project.version}-sources.jar - - providers/aws/src - - - aws/core/target/apidocs - providers/aws/docs - - - aws/core - - README.txt - - providers/aws - - - - - azure/target - - jclouds-azure-${project.version}.jar - - providers/azure/lib - - - azure/target - - jclouds-azure-${project.version}-sources.jar - - providers/azure/src - - - azure/target/apidocs - providers/azure/docs - - - azure - - README.txt - - providers/azure + apis/atmos - + - slicehost/target + apis/byon/target - jclouds-slicehost-${project.version}.jar + byon-${project.version}-jar-with-dependencies.jar - providers/slicehost/lib + apis/byon/lib - slicehost/target + apis/byon/target - jclouds-slicehost-${project.version}-sources.jar + byon-${project.version}-sources.jar - providers/slicehost/src + apis/byon/src - slicehost/target/apidocs - providers/slicehost/docs - + apis/byon/target/apidocs + apis/byon/docs + - slicehost + apis/byon README.txt - providers/slicehost - + apis/byon + - + - rackspace/target + apis/cloudfiles/target - jclouds-rackspace-${project.version}.jar + cloudfiles-${project.version}-jar-with-dependencies.jar - providers/rackspace/lib + apis/cloudfiles/lib - rackspace/target + apis/cloudfiles/target - jclouds-rackspace-${project.version}-sources.jar + cloudfiles-${project.version}-sources.jar - providers/rackspace/src + apis/cloudfiles/src - rackspace/target/apidocs - providers/rackspace/docs - + apis/cloudfiles/target/apidocs + apis/cloudfiles/docs + - rackspace + apis/cloudfiles README.txt - providers/rackspace - + apis/cloudfiles + + + + + apis/cloudservers/target + + cloudservers-${project.version}-jar-with-dependencies.jar + + apis/cloudservers/lib + + + apis/cloudservers/target + + cloudservers-${project.version}-sources.jar + + apis/cloudservers/src + + + apis/cloudservers/target/apidocs + apis/cloudservers/docs + + + apis/cloudservers + + README.txt + + apis/cloudservers + + + + + apis/ec2/target + + ec2-${project.version}-jar-with-dependencies.jar + + apis/ec2/lib + + + apis/ec2/target + + ec2-${project.version}-sources.jar + + apis/ec2/src + + + apis/ec2/target/apidocs + apis/ec2/docs + + + apis/ec2 + + README.txt + + apis/ec2 + + + + + elasticstack/target + + elasticstack-${project.version}-jar-with-dependencies.jar + + apis/elasticstack/lib + + + elasticstack/target + + elasticstack-${project.version}-sources.jar + + apis/elasticstack/src + + + elasticstack/target/apidocs + apis/elasticstack/docs + + + elasticstack + + README.txt + + apis/elasticstack + + + + + apis/elb/target + + elb-${project.version}-jar-with-dependencies.jar + + apis/elb/lib + + + apis/elb/target + + elb-${project.version}-sources.jar + + apis/elb/src + + + apis/elb/target/apidocs + apis/elb/docs + + + apis/elb + + README.txt + + apis/elb + + + + + apis/eucalyptus/target + + eucalyptus-${project.version}-jar-with-dependencies.jar + + apis/eucalyptus/lib + + + apis/eucalyptus/target + + eucalyptus-${project.version}-sources.jar + + apis/eucalyptus/src + + + apis/eucalyptus/target/apidocs + apis/eucalyptus/docs + + + apis/eucalyptus + + README.txt + + apis/eucalyptus + + + + + apis/filesystem/target + + filesystem-${project.version}-jar-with-dependencies.jar + + apis/filesystem/lib + + + apis/filesystem/target + + filesystem-${project.version}-sources.jar + + apis/filesystem/src + + + apis/filesystem/target/apidocs + apis/filesystem/docs + + + apis/filesystem + + README.txt + + apis/filesystem + + + + + apis/s3/target + + s3-${project.version}-jar-with-dependencies.jar + + apis/s3/lib + + + apis/s3/target + + s3-${project.version}-sources.jar + + apis/s3/src + + + apis/s3/target/apidocs + apis/s3/docs + + + apis/s3 + + README.txt + + apis/s3 + + + + + apis/swift/target + + swift-${project.version}-jar-with-dependencies.jar + + apis/swift/lib + + + apis/swift/target + + swift-${project.version}-sources.jar + + apis/swift/src + + + apis/swift/target/apidocs + apis/swift/docs + + + apis/swift + + README.txt + + apis/swift + + + + + apis/vcloud/target + + vcloud-${project.version}-jar-with-dependencies.jar + + apis/vcloud/lib + + + apis/vcloud/target + + vcloud-${project.version}-sources.jar + + apis/vcloud/src + + + apis/vcloud/target/apidocs + apis/vcloud/docs + + + apis/vcloud + + README.txt + + apis/vcloud + + + + + apis/vcloudexpress/target + + vcloudexpress-${project.version}-jar-with-dependencies.jar + + apis/vcloudexpress/lib + + + apis/vcloudexpress/target + + vcloudexpress-${project.version}-sources.jar + + apis/vcloudexpress/src + + + apis/vcloudexpress/target/apidocs + apis/vcloudexpress/docs + + + apis/vcloudexpress + + README.txt + + apis/vcloudexpress + + + + + apis/walrus/target + + walrus-${project.version}-jar-with-dependencies.jar + + apis/walrus/lib + + + apis/walrus/target + + walrus-${project.version}-sources.jar + + apis/walrus/src + + + apis/walrus/target/apidocs + apis/walrus/docs + + + apis/walrus + + README.txt + + apis/walrus + + + + + providers/aws-ec2/target + + aws-ec2-${project.version}-jar-with-dependencies.jar + + providers/aws-ec2/lib + + + providers/aws-ec2/target + + aws-ec2-${project.version}-sources.jar + + providers/aws-ec2/src + + + providers/aws-ec2/target/apidocs + providers/aws-ec2/docs + + + providers/aws-ec2 + + README.txt + + providers/aws-ec2 + + + + + providers/aws-elb/target + + aws-elb-${project.version}-jar-with-dependencies.jar + + providers/aws-elb/lib + + + providers/aws-elb/target + + aws-elb-${project.version}-sources.jar + + providers/aws-elb/src + + + providers/aws-elb/target/apidocs + providers/aws-elb/docs + + + providers/aws-elb + + README.txt + + providers/aws-elb + + + + + providers/aws-s3/target + + aws-s3-${project.version}-jar-with-dependencies.jar + + providers/aws-s3/lib + + + providers/aws-s3/target + + aws-s3-${project.version}-sources.jar + + providers/aws-s3/src + + + providers/aws-s3/target/apidocs + providers/aws-s3/docs + + + providers/aws-s3 + + README.txt + + providers/aws-s3 + + + + + providers/azureblob/target + + azureblob-${project.version}-jar-with-dependencies.jar + + providers/azureblob/lib + + + providers/azureblob/target + + azureblob-${project.version}-sources.jar + + providers/azureblob/src + + + providers/azureblob/target/apidocs + providers/azureblob/docs + + + providers/azureblob + + README.txt + + providers/azureblob + + + + + providers/bluelock-vcdirector/target + + bluelock-vcdirector-${project.version}-jar-with-dependencies.jar + + providers/bluelock-vcdirector/lib + + + providers/bluelock-vcdirector/target + + bluelock-vcdirector-${project.version}-sources.jar + + providers/bluelock-vcdirector/src + + + providers/bluelock-vcdirector/target/apidocs + providers/bluelock-vcdirector/docs + + + providers/bluelock-vcdirector + + README.txt + + providers/bluelock-vcdirector + + + + + providers/cloudfiles-uk/target + + cloudfiles-uk-${project.version}-jar-with-dependencies.jar + + providers/cloudfiles-uk/lib + + + providers/cloudfiles-uk/target + + cloudfiles-uk-${project.version}-sources.jar + + providers/cloudfiles-uk/src + + + providers/cloudfiles-uk/target/apidocs + providers/cloudfiles-uk/docs + + + providers/cloudfiles-uk + + README.txt + + providers/cloudfiles-uk + + + + + providers/cloudfiles-us/target + + cloudfiles-us-${project.version}-jar-with-dependencies.jar + + providers/cloudfiles-us/lib + + + providers/cloudfiles-us/target + + cloudfiles-us-${project.version}-sources.jar + + providers/cloudfiles-us/src + + + providers/cloudfiles-us/target/apidocs + providers/cloudfiles-us/docs + + + providers/cloudfiles-us + + README.txt + + providers/cloudfiles-us + + + + + providers/cloudonestorage/target + + cloudonestorage-${project.version}-jar-with-dependencies.jar + + providers/cloudonestorage/lib + + + providers/cloudonestorage/target + + cloudonestorage-${project.version}-sources.jar + + providers/cloudonestorage/src + + + providers/cloudonestorage/target/apidocs + providers/cloudonestorage/docs + + + providers/cloudonestorage + + README.txt + + providers/cloudonestorage + + + + + providers/cloudservers-uk/target + + cloudservers-uk-${project.version}-jar-with-dependencies.jar + + providers/cloudservers-uk/lib + + + providers/cloudservers-uk/target + + cloudservers-uk-${project.version}-sources.jar + + providers/cloudservers-uk/src + + + providers/cloudservers-uk/target/apidocs + providers/cloudservers-uk/docs + + + providers/cloudservers-uk + + README.txt + + providers/cloudservers-uk + + + + + providers/cloudservers-us/target + + cloudservers-us-${project.version}-jar-with-dependencies.jar + + providers/cloudservers-us/lib + + + providers/cloudservers-us/target + + cloudservers-us-${project.version}-sources.jar + + providers/cloudservers-us/src + + + providers/cloudservers-us/target/apidocs + providers/cloudservers-us/docs + + + providers/cloudservers-us + + README.txt + + providers/cloudservers-us + + + + + providers/cloudsigma-zrh/target + + cloudsigma-zrh-${project.version}-jar-with-dependencies.jar + + providers/cloudsigma-zrh/lib + + + providers/cloudsigma-zrh/target + + cloudsigma-zrh-${project.version}-sources.jar + + providers/cloudsigma-zrh/src + + + providers/cloudsigma-zrh/target/apidocs + providers/cloudsigma-zrh/docs + + + providers/cloudsigma-zrh + + README.txt + + providers/cloudsigma-zrh + + + + + providers/elastichosts-lon-b/target + + elastichosts-lon-b-${project.version}-jar-with-dependencies.jar + + providers/elastichosts-lon-b/lib + + + providers/elastichosts-lon-b/target + + elastichosts-lon-b-${project.version}-sources.jar + + providers/elastichosts-lon-b/src + + + providers/elastichosts-lon-b/target/apidocs + providers/elastichosts-lon-b/docs + + + providers/elastichosts-lon-b + + README.txt + + providers/elastichosts-lon-b + + + + + providers/elastichosts-lon-p/target + + elastichosts-lon-p-${project.version}-jar-with-dependencies.jar + + providers/elastichosts-lon-p/lib + + + providers/elastichosts-lon-p/target + + elastichosts-lon-p-${project.version}-sources.jar + + providers/elastichosts-lon-p/src + + + providers/elastichosts-lon-p/target/apidocs + providers/elastichosts-lon-p/docs + + + providers/elastichosts-lon-p + + README.txt + + providers/elastichosts-lon-p + + + + + providers/elastichosts-sat-p/target + + elastichosts-sat-p-${project.version}-jar-with-dependencies.jar + + providers/elastichosts-sat-p/lib + + + providers/elastichosts-sat-p/target + + elastichosts-sat-p-${project.version}-sources.jar + + providers/elastichosts-sat-p/src + + + providers/elastichosts-sat-p/target/apidocs + providers/elastichosts-sat-p/docs + + + providers/elastichosts-sat-p + + README.txt + + providers/elastichosts-sat-p + + + + + providers/eucalyptus-partnercloud-ec2/target + + eucalyptus-partnercloud-ec2-${project.version}-jar-with-dependencies.jar + + providers/eucalyptus-partnercloud-ec2/lib + + + providers/eucalyptus-partnercloud-ec2/target + + eucalyptus-partnercloud-ec2-${project.version}-sources.jar + + providers/eucalyptus-partnercloud-ec2/src + + + providers/eucalyptus-partnercloud-ec2/target/apidocs + providers/eucalyptus-partnercloud-ec2/docs + + + providers/eucalyptus-partnercloud-ec2 + + README.txt + + providers/eucalyptus-partnercloud-ec2 + + + + + providers/eucalyptus-partnercloud-s3/target + + eucalyptus-partnercloud-s3-${project.version}-jar-with-dependencies.jar + + providers/eucalyptus-partnercloud-s3/lib + + + providers/eucalyptus-partnercloud-s3/target + + eucalyptus-partnercloud-s3-${project.version}-sources.jar + + providers/eucalyptus-partnercloud-s3/src + + + providers/eucalyptus-partnercloud-s3/target/apidocs + providers/eucalyptus-partnercloud-s3/docs + + + providers/eucalyptus-partnercloud-s3 + + README.txt + + providers/eucalyptus-partnercloud-s3 + - gogrid/target + providers/gogrid/target - jclouds-gogrid-${project.version}.jar + gogrid-${project.version}-jar-with-dependencies.jar providers/gogrid/lib - gogrid/target + providers/gogrid/target - jclouds-gogrid-${project.version}-sources.jar + gogrid-${project.version}-sources.jar providers/gogrid/src - gogrid/target/apidocs + providers/gogrid/target/apidocs providers/gogrid/docs - + - gogrid + providers/gogrid README.txt providers/gogrid - - - - - rimuhosting/target - - jclouds-rimuhosting-${project.version}.jar - - providers/rimuhosting/lib - - - rimuhosting/target - - jclouds-rimuhosting-${project.version}-sources.jar - - providers/rimuhosting/src - - - rimuhosting/target/apidocs - providers/rimuhosting/docs - - - rimuhosting - - README.txt - - providers/rimuhosting - - - - - vcloud/core/target - - jclouds-vcloud-${project.version}.jar - - providers/vcloud/lib - - - vcloud/core/target - - jclouds-vcloud-${project.version}-sources.jar - - providers/vcloud/src - - - vcloud/vcloud/target/apidocs - providers/vcloud/docs - - - vcloud/core - - README.txt - - providers/vcloud - + - vcloud/core/target + providers/googlestorage/target - jclouds-vcloud-${project.version}.jar + googlestorage-${project.version}-jar-with-dependencies.jar - providers/bluelock/lib + providers/googlestorage/lib - vcloud/core/target + providers/googlestorage/target - jclouds-vcloud-${project.version}-sources.jar + googlestorage-${project.version}-sources.jar - providers/bluelock/src + providers/googlestorage/src - vcloud/bluelock/target - - jclouds-bluelock-${project.version}.jar - - providers/bluelock/lib - + providers/googlestorage/target/apidocs + providers/googlestorage/docs + - vcloud/bluelock/target - - jclouds-bluelock-${project.version}-sources.jar - - providers/bluelock/src - - - vcloud/bluelock/target/apidocs - providers/bluelock/docs - - - vcloud/bluelock + providers/googlestorage README.txt - providers/bluelock + providers/googlestorage - + - vcloud/core/target + providers/openhosting-east1/target - jclouds-vcloud-${project.version}.jar + openhosting-east1-${project.version}-jar-with-dependencies.jar - providers/terremark/lib + providers/openhosting-east1/lib - vcloud/core/target + providers/openhosting-east1/target - jclouds-vcloud-${project.version}-sources.jar + openhosting-east1-${project.version}-sources.jar - providers/terremark/src + providers/openhosting-east1/src - vcloud/terremark/target - - jclouds-terremark-${project.version}.jar - - providers/terremark/lib - + providers/openhosting-east1/target/apidocs + providers/openhosting-east1/docs + - vcloud/terremark/target - - jclouds-terremark-${project.version}-sources.jar - - providers/terremark/src - - - vcloud/terremark/target/apidocs - providers/terremark/docs - - - vcloud/terremark + providers/openhosting-east1 README.txt - providers/terremark + providers/openhosting-east1 - + - extensions/bouncycastle/target + providers/scaleup-storage/target - jclouds-bouncycastle-${project.version}-jar-with-dependencies.jar + scaleup-storage-${project.version}-jar-with-dependencies.jar - extensions/bouncycastle/lib + providers/scaleup-storage/lib - extensions/bouncycastle/target + providers/scaleup-storage/target - jclouds-bouncycastle-${project.version}-sources.jar + scaleup-storage-${project.version}-sources.jar - extensions/bouncycastle/src + providers/scaleup-storage/src - extensions/bouncycastle/target/apidocs - extensions/bouncycastle/docs - + providers/scaleup-storage/target/apidocs + providers/scaleup-storage/docs + - extensions/bouncycastle + providers/scaleup-storage README.txt - extensions/bouncycastle - - - + providers/scaleup-storage + + + - extensions/enterprise/target + providers/serverlove-z1-man/target - jclouds-enterprise-${project.version}-jar-with-dependencies.jar + serverlove-z1-man-${project.version}-jar-with-dependencies.jar - extensions/enterprise/lib + providers/serverlove-z1-man/lib - extensions/enterprise/target + providers/serverlove-z1-man/target - jclouds-enterprise-${project.version}-sources.jar + serverlove-z1-man-${project.version}-sources.jar - extensions/enterprise/src + providers/serverlove-z1-man/src - extensions/enterprise/target/apidocs - extensions/enterprise/docs - + providers/serverlove-z1-man/target/apidocs + providers/serverlove-z1-man/docs + - extensions/enterprise + providers/serverlove-z1-man README.txt - extensions/enterprise - - - + providers/serverlove-z1-man + + + - extensions/gae/target + providers/skalicloud-sdg-my/target - jclouds-gae-${project.version}.jar + skalicloud-sdg-my-${project.version}-jar-with-dependencies.jar - extensions/gae/lib + providers/skalicloud-sdg-my/lib - extensions/gae/target + providers/skalicloud-sdg-my/target - jclouds-gae-${project.version}-sources.jar + skalicloud-sdg-my-${project.version}-sources.jar - extensions/gae/src + providers/skalicloud-sdg-my/src - extensions/gae/target/apidocs - extensions/gae/docs - + providers/skalicloud-sdg-my/target/apidocs + providers/skalicloud-sdg-my/docs + - extensions/gae + providers/skalicloud-sdg-my README.txt - extensions/gae - - - - - extensions/joda/target - - jclouds-joda-${project.version}-jar-with-dependencies.jar - - extensions/joda/lib - - - extensions/joda/target - - jclouds-joda-${project.version}-sources.jar - - extensions/joda/src - - - extensions/joda/target/apidocs - extensions/joda/docs - - - extensions/joda - - README.txt - - extensions/joda - - - - - extensions/apachehc/target - - jclouds-apachehc-${project.version}.jar - - extensions/apachehc/lib - - - extensions/apachehc/target - - jclouds-apachehc-${project.version}-sources.jar - - extensions/apachehc/src - - - extensions/apachehc/target/apidocs - extensions/apachehc/docs - - - extensions/apachehc - - README.txt - - extensions/apachehc + providers/skalicloud-sdg-my - + - extensions/ssh/jsch/target + providers/slicehost/target - jclouds-jsch-${project.version}.jar + slicehost-${project.version}-jar-with-dependencies.jar - extensions/jsch/lib + providers/slicehost/lib - extensions/ssh/jsch/target + providers/slicehost/target - jclouds-jsch-${project.version}-sources.jar + slicehost-${project.version}-sources.jar - extensions/jsch/src + providers/slicehost/src - extensions/ssh/jsch/target/apidocs - extensions/jsch/docs - + providers/slicehost/target/apidocs + providers/slicehost/docs + - extensions/ssh/jsch + providers/slicehost README.txt - extensions/jsch + providers/slicehost + + + + + providers/synaptic-storage/target + + synaptic-storage-${project.version}-jar-with-dependencies.jar + + providers/synaptic-storage/lib + + + providers/synaptic-storage/target + + synaptic-storage-${project.version}-sources.jar + + providers/synaptic-storage/src + + + providers/synaptic-storage/target/apidocs + providers/synaptic-storage/docs + + + providers/synaptic-storage + + README.txt + + providers/synaptic-storage - + - extensions/log4j/target + providers/trmk-ecloud/target - jclouds-log4j-${project.version}.jar + trmk-ecloud-${project.version}-jar-with-dependencies.jar - extensions/log4j/lib + providers/trmk-ecloud/lib - extensions/log4j/target + providers/trmk-ecloud/target - jclouds-log4j-${project.version}-sources.jar + trmk-ecloud-${project.version}-sources.jar - extensions/log4j/src + providers/trmk-ecloud/src - extensions/log4j/target/apidocs - extensions/log4j/docs - + providers/trmk-ecloud/target/apidocs + providers/trmk-ecloud/docs + - extensions/log4j + providers/trmk-ecloud README.txt - extensions/log4j - - - - - tools/antcontrib/target - - jclouds-antcontrib-${project.version}-jar-with-dependencies.jar - - tools/antcontrib/lib - - - tools/antcontrib/target - - jclouds-antcontrib-${project.version}-sources.jar - - tools/antcontrib/src - - - tools/antcontrib/target/apidocs - tools/antcontrib/docs - - - tools/antcontrib - - README.txt - - tools/antcontrib - + providers/trmk-ecloud + - + - demos/gae-tweetstore/target/jclouds-demo-gae-tweetstore - samples/gae-tweetstore + providers/trmk-vcloudexpress/target + + trmk-vcloudexpress-${project.version}-jar-with-dependencies.jar + + providers/trmk-vcloudexpress/lib - aws/demos/createandlistbuckets/target/jclouds-aws-demo-createandlistbuckets-src - samples/aws/createandlistbuckes + providers/trmk-vcloudexpress/target + + trmk-vcloudexpress-${project.version}-sources.jar + + providers/trmk-vcloudexpress/src - aws/demos/googleappengine/target/jclouds-aws-demo-googleappengine-src - samples/aws/googleappengine - - + providers/trmk-vcloudexpress/target/apidocs + providers/trmk-vcloudexpress/docs + + + providers/trmk-vcloudexpress + + README.txt + + providers/trmk-vcloudexpress + + From fab124482890b29cd6c150ab41a025a26ee614a7 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 1 Feb 2011 09:38:40 +0100 Subject: [PATCH 36/81] Moved elb and aws-elb READMEs to sandbox (see 38a04f671daf58b4764e8027ddf60c2d34a395a6) --- {apis => sandbox-apis}/elb/README.txt | 0 {providers => sandbox-providers}/aws-elb/README.txt | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {apis => sandbox-apis}/elb/README.txt (100%) rename {providers => sandbox-providers}/aws-elb/README.txt (100%) diff --git a/apis/elb/README.txt b/sandbox-apis/elb/README.txt similarity index 100% rename from apis/elb/README.txt rename to sandbox-apis/elb/README.txt diff --git a/providers/aws-elb/README.txt b/sandbox-providers/aws-elb/README.txt similarity index 100% rename from providers/aws-elb/README.txt rename to sandbox-providers/aws-elb/README.txt From 8404727c904c4743033e2588052993be03d7ac5e Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 1 Feb 2011 10:11:46 +0100 Subject: [PATCH 37/81] Updated enterprise and gae READMEs to mention JARs that are expected on the classpath --- drivers/enterprise/README.txt | 2 ++ drivers/gae/README.txt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/drivers/enterprise/README.txt b/drivers/enterprise/README.txt index 8796da30a6..f2d66df88c 100644 --- a/drivers/enterprise/README.txt +++ b/drivers/enterprise/README.txt @@ -20,4 +20,6 @@ # # Sets up most commonly requested options for enterprise Java support. # +# Expects the joda-time and bcprov JARs (see drivers/joda and drivers/bouncycastle) to be present on your application's classpath. +# # TODO: Usage example. diff --git a/drivers/gae/README.txt b/drivers/gae/README.txt index 2bdbee5984..f54e2cbcad 100644 --- a/drivers/gae/README.txt +++ b/drivers/gae/README.txt @@ -20,4 +20,6 @@ # # A driver to run jclouds on Google App Engine (http://code.google.com/appengine/). # +# Expects the joda-time JAR (see drivers/joda) to be present on your application's classpath. +# # TODO: Usage example. From 5201b80793df7d61c204f175f00b0ad8d2906c80 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 1 Feb 2011 10:22:23 +0100 Subject: [PATCH 38/81] Removed unnecessary (?) file --- git | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 git diff --git a/git b/git deleted file mode 100644 index e69de29bb2..0000000000 From fe2a58da57bf2fda426c36018461890c4b3df974 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Tue, 1 Feb 2011 10:17:40 -0800 Subject: [PATCH 39/81] Issue 458: updated dist to include scriptbuilder and adjusted dependencies for gae and enterprise --- .../assemblies/package-descriptor.xml | 20 ++++++++++++++++++- drivers/enterprise/pom.xml | 11 ++++++++++ drivers/gae/pom.xml | 5 ----- .../GoogleAppEngineConfigurationModule.java | 2 -- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/assemblies/src/main/resources/assemblies/package-descriptor.xml b/assemblies/src/main/resources/assemblies/package-descriptor.xml index 06ae186542..8374ec8b8d 100644 --- a/assemblies/src/main/resources/assemblies/package-descriptor.xml +++ b/assemblies/src/main/resources/assemblies/package-descriptor.xml @@ -28,7 +28,7 @@ LICENSE.txt README.txt core - + lib <- core, blobstore, compute and loadbalancer JARs and dependencies for core + + lib <- core, blobstore, compute (w/scriptbuilder) and loadbalancer JARs and dependencies for core + docs <- javadoc for core, blobstore, compute and loadbalancer + src <- expanded or source jar for core, blobstore, compute and loadbalancer drivers @@ -85,6 +85,13 @@ core/lib + + scriptbuilder/target + + jclouds-scriptbuilder-${project.version}.jar + + core/lib + compute/target @@ -113,6 +120,13 @@ core/src + + scriptbuilder/target + + jclouds-scriptbuilder-${project.version}-sources.jar + + core/src + compute/target @@ -135,6 +149,10 @@ blobstore/target/apidocs core/docs + + scriptbuilder/target/apidocs + core/docs + compute/target/apidocs core/docs diff --git a/drivers/enterprise/pom.xml b/drivers/enterprise/pom.xml index b083011894..d9a2017b0c 100644 --- a/drivers/enterprise/pom.xml +++ b/drivers/enterprise/pom.xml @@ -63,11 +63,22 @@ jclouds-joda ${project.version} + + joda-time + joda-time + 1.6 + ${project.groupId} jclouds-bouncycastle ${project.version} + + org.bouncycastle + bcprov-jdk15 + 1.44 + provided + org.mortbay.jetty jetty-ssl diff --git a/drivers/gae/pom.xml b/drivers/gae/pom.xml index 7cda00072d..d545c4bfb7 100644 --- a/drivers/gae/pom.xml +++ b/drivers/gae/pom.xml @@ -56,11 +56,6 @@ test-jar test - - ${project.groupId} - jclouds-joda - ${project.version} - com.google.appengine appengine-api diff --git a/drivers/gae/src/main/java/org/jclouds/gae/config/GoogleAppEngineConfigurationModule.java b/drivers/gae/src/main/java/org/jclouds/gae/config/GoogleAppEngineConfigurationModule.java index 11acb412d0..5c3784e936 100644 --- a/drivers/gae/src/main/java/org/jclouds/gae/config/GoogleAppEngineConfigurationModule.java +++ b/drivers/gae/src/main/java/org/jclouds/gae/config/GoogleAppEngineConfigurationModule.java @@ -25,7 +25,6 @@ import org.jclouds.concurrent.MoreExecutors; import org.jclouds.concurrent.SingleThreaded; import org.jclouds.concurrent.config.ConfiguresExecutorService; import org.jclouds.concurrent.config.ExecutorServiceModule; -import org.jclouds.date.joda.config.JodaDateServiceModule; import org.jclouds.gae.GaeHttpCommandExecutorService; import org.jclouds.http.HttpCommandExecutorService; import org.jclouds.http.TransformingHttpCommandExecutorService; @@ -54,7 +53,6 @@ public class GoogleAppEngineConfigurationModule extends ExecutorServiceModule { @Override protected void configure() { super.configure(); - install(new JodaDateServiceModule()); bind(TransformingHttpCommandExecutorService.class).to(TransformingHttpCommandExecutorServiceImpl.class); } From 7756d0d03b0ca9183ec0b1c567ef89eb4f42b282 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Tue, 1 Feb 2011 21:17:02 -0800 Subject: [PATCH 40/81] moved resource from test to main jar --- .../resources/terremark/ConfigureInternetService.xml | 0 .../{test => main}/resources/terremark/CreateInternetService.xml | 0 .../src/{test => main}/resources/terremark/CreateNodeService.xml | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename common/trmk/src/{test => main}/resources/terremark/ConfigureInternetService.xml (100%) rename common/trmk/src/{test => main}/resources/terremark/CreateInternetService.xml (100%) rename common/trmk/src/{test => main}/resources/terremark/CreateNodeService.xml (100%) diff --git a/common/trmk/src/test/resources/terremark/ConfigureInternetService.xml b/common/trmk/src/main/resources/terremark/ConfigureInternetService.xml similarity index 100% rename from common/trmk/src/test/resources/terremark/ConfigureInternetService.xml rename to common/trmk/src/main/resources/terremark/ConfigureInternetService.xml diff --git a/common/trmk/src/test/resources/terremark/CreateInternetService.xml b/common/trmk/src/main/resources/terremark/CreateInternetService.xml similarity index 100% rename from common/trmk/src/test/resources/terremark/CreateInternetService.xml rename to common/trmk/src/main/resources/terremark/CreateInternetService.xml diff --git a/common/trmk/src/test/resources/terremark/CreateNodeService.xml b/common/trmk/src/main/resources/terremark/CreateNodeService.xml similarity index 100% rename from common/trmk/src/test/resources/terremark/CreateNodeService.xml rename to common/trmk/src/main/resources/terremark/CreateNodeService.xml From c2151c6632b4fed0530d1ad0057b302392d704fa Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Tue, 1 Feb 2011 21:17:28 -0800 Subject: [PATCH 41/81] commons-io is a required dep --- drivers/jsch/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/jsch/pom.xml b/drivers/jsch/pom.xml index 059ad63e17..2e38f54c8a 100644 --- a/drivers/jsch/pom.xml +++ b/drivers/jsch/pom.xml @@ -73,7 +73,6 @@ commons-io commons-io 1.4 - provided From 359a0feeaa37606a9d4a648fc5bab8f8371997eb Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Tue, 1 Feb 2011 21:18:24 -0800 Subject: [PATCH 42/81] added missing jsch dep --- apis/byon/pom.xml | 6 ++++++ apis/cloudservers/pom.xml | 6 ++++++ apis/ec2/pom.xml | 6 ++++++ apis/elasticstack/pom.xml | 6 ++++++ apis/eucalyptus/pom.xml | 6 ++++++ apis/vcloud/pom.xml | 6 ++++++ apis/vcloudexpress/pom.xml | 6 ++++++ providers/aws-ec2/pom.xml | 6 ++++++ providers/bluelock-vcdirector/pom.xml | 6 ++++++ providers/cloudservers-uk/pom.xml | 6 ++++++ providers/cloudservers-us/pom.xml | 6 ++++++ providers/cloudsigma-zrh/pom.xml | 6 ++++++ providers/elastichosts-lon-b/pom.xml | 6 ++++++ providers/elastichosts-lon-p/pom.xml | 6 ++++++ providers/elastichosts-sat-p/pom.xml | 6 ++++++ providers/eucalyptus-partnercloud-ec2/pom.xml | 6 ++++++ providers/gogrid/pom.xml | 6 ++++++ providers/openhosting-east1/pom.xml | 6 ++++++ providers/serverlove-z1-man/pom.xml | 6 ++++++ providers/skalicloud-sdg-my/pom.xml | 6 ++++++ providers/slicehost/pom.xml | 6 ++++++ providers/trmk-ecloud/pom.xml | 6 ++++++ providers/trmk-vcloudexpress/pom.xml | 6 ++++++ sandbox-apis/deltacloud/pom.xml | 6 ++++++ sandbox-apis/elb/pom.xml | 6 ++++++ sandbox-apis/libvirt/pom.xml | 6 ++++++ sandbox-apis/nova-ec2/pom.xml | 6 ++++++ sandbox-apis/vi/pom.xml | 6 ++++++ sandbox-providers/aws-elb/pom.xml | 6 ++++++ sandbox-providers/ibmdev/pom.xml | 6 ++++++ sandbox-providers/rimuhosting/pom.xml | 6 ++++++ sandbox-providers/savvis/pom.xml | 6 ++++++ 32 files changed, 192 insertions(+) diff --git a/apis/byon/pom.xml b/apis/byon/pom.xml index dd1741abc6..4063cb5bed 100644 --- a/apis/byon/pom.xml +++ b/apis/byon/pom.xml @@ -73,6 +73,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + org.yaml snakeyaml diff --git a/apis/cloudservers/pom.xml b/apis/cloudservers/pom.xml index 9b08f1f501..87cb631c73 100644 --- a/apis/cloudservers/pom.xml +++ b/apis/cloudservers/pom.xml @@ -79,6 +79,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + org.jclouds.driver jclouds-log4j diff --git a/apis/ec2/pom.xml b/apis/ec2/pom.xml index e4ce128ad0..27b470fd94 100644 --- a/apis/ec2/pom.xml +++ b/apis/ec2/pom.xml @@ -82,6 +82,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/apis/elasticstack/pom.xml b/apis/elasticstack/pom.xml index 74a39f5d5e..9781789eca 100644 --- a/apis/elasticstack/pom.xml +++ b/apis/elasticstack/pom.xml @@ -70,6 +70,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + org.jclouds jclouds-core diff --git a/apis/eucalyptus/pom.xml b/apis/eucalyptus/pom.xml index 123e6fc2dd..6de2a832aa 100644 --- a/apis/eucalyptus/pom.xml +++ b/apis/eucalyptus/pom.xml @@ -74,6 +74,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + org.jclouds.driver jclouds-log4j diff --git a/apis/vcloud/pom.xml b/apis/vcloud/pom.xml index 98abaa1c5a..460215e6c0 100644 --- a/apis/vcloud/pom.xml +++ b/apis/vcloud/pom.xml @@ -80,6 +80,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/apis/vcloudexpress/pom.xml b/apis/vcloudexpress/pom.xml index 0c610152ce..8817bd3354 100644 --- a/apis/vcloudexpress/pom.xml +++ b/apis/vcloudexpress/pom.xml @@ -80,6 +80,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/aws-ec2/pom.xml b/providers/aws-ec2/pom.xml index 9eb1731b09..1a954b7b60 100644 --- a/providers/aws-ec2/pom.xml +++ b/providers/aws-ec2/pom.xml @@ -85,6 +85,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/bluelock-vcdirector/pom.xml b/providers/bluelock-vcdirector/pom.xml index 4c5be184c2..891d7a1f49 100644 --- a/providers/bluelock-vcdirector/pom.xml +++ b/providers/bluelock-vcdirector/pom.xml @@ -87,6 +87,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/cloudservers-uk/pom.xml b/providers/cloudservers-uk/pom.xml index 5b233d50ec..cbdcfa8ead 100644 --- a/providers/cloudservers-uk/pom.xml +++ b/providers/cloudservers-uk/pom.xml @@ -85,6 +85,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/cloudservers-us/pom.xml b/providers/cloudservers-us/pom.xml index eda16cbe49..6dcbfbf9ab 100644 --- a/providers/cloudservers-us/pom.xml +++ b/providers/cloudservers-us/pom.xml @@ -85,6 +85,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/cloudsigma-zrh/pom.xml b/providers/cloudsigma-zrh/pom.xml index 7d7928b207..8b9630615e 100644 --- a/providers/cloudsigma-zrh/pom.xml +++ b/providers/cloudsigma-zrh/pom.xml @@ -56,6 +56,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + org.jclouds jclouds-core diff --git a/providers/elastichosts-lon-b/pom.xml b/providers/elastichosts-lon-b/pom.xml index 6bd4c3652c..f4a1ae0183 100644 --- a/providers/elastichosts-lon-b/pom.xml +++ b/providers/elastichosts-lon-b/pom.xml @@ -80,6 +80,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/elastichosts-lon-p/pom.xml b/providers/elastichosts-lon-p/pom.xml index 68d4606e5f..27c719ebbf 100644 --- a/providers/elastichosts-lon-p/pom.xml +++ b/providers/elastichosts-lon-p/pom.xml @@ -80,6 +80,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/elastichosts-sat-p/pom.xml b/providers/elastichosts-sat-p/pom.xml index ebee552ba8..563b0d9ebb 100644 --- a/providers/elastichosts-sat-p/pom.xml +++ b/providers/elastichosts-sat-p/pom.xml @@ -80,6 +80,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/eucalyptus-partnercloud-ec2/pom.xml b/providers/eucalyptus-partnercloud-ec2/pom.xml index 6511371856..3f19ade2c2 100644 --- a/providers/eucalyptus-partnercloud-ec2/pom.xml +++ b/providers/eucalyptus-partnercloud-ec2/pom.xml @@ -88,6 +88,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + org.jclouds.driver jclouds-log4j diff --git a/providers/gogrid/pom.xml b/providers/gogrid/pom.xml index ab6d58ca27..4df4911159 100644 --- a/providers/gogrid/pom.xml +++ b/providers/gogrid/pom.xml @@ -53,6 +53,12 @@ jclouds-jsch ${project.version} + + com.jcraft + jsch + 0.1.42 + test + org.jclouds jclouds-compute diff --git a/providers/openhosting-east1/pom.xml b/providers/openhosting-east1/pom.xml index b80e3be22a..c3b98755b7 100644 --- a/providers/openhosting-east1/pom.xml +++ b/providers/openhosting-east1/pom.xml @@ -80,6 +80,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/serverlove-z1-man/pom.xml b/providers/serverlove-z1-man/pom.xml index 5af1f8e8a6..8f3edd9117 100644 --- a/providers/serverlove-z1-man/pom.xml +++ b/providers/serverlove-z1-man/pom.xml @@ -80,6 +80,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/skalicloud-sdg-my/pom.xml b/providers/skalicloud-sdg-my/pom.xml index 1899e176fd..57cd23b8ac 100644 --- a/providers/skalicloud-sdg-my/pom.xml +++ b/providers/skalicloud-sdg-my/pom.xml @@ -80,6 +80,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/slicehost/pom.xml b/providers/slicehost/pom.xml index 294146bc99..1385971563 100644 --- a/providers/slicehost/pom.xml +++ b/providers/slicehost/pom.xml @@ -77,6 +77,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + diff --git a/providers/trmk-ecloud/pom.xml b/providers/trmk-ecloud/pom.xml index f3e4b855f5..f76b0d57da 100644 --- a/providers/trmk-ecloud/pom.xml +++ b/providers/trmk-ecloud/pom.xml @@ -94,6 +94,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/providers/trmk-vcloudexpress/pom.xml b/providers/trmk-vcloudexpress/pom.xml index dea99828da..0b48813f22 100644 --- a/providers/trmk-vcloudexpress/pom.xml +++ b/providers/trmk-vcloudexpress/pom.xml @@ -94,6 +94,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/sandbox-apis/deltacloud/pom.xml b/sandbox-apis/deltacloud/pom.xml index 0c2853eb87..b5f2164da3 100644 --- a/sandbox-apis/deltacloud/pom.xml +++ b/sandbox-apis/deltacloud/pom.xml @@ -73,6 +73,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/sandbox-apis/elb/pom.xml b/sandbox-apis/elb/pom.xml index 293ea70dbd..df27acabbf 100644 --- a/sandbox-apis/elb/pom.xml +++ b/sandbox-apis/elb/pom.xml @@ -72,6 +72,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + org.jclouds jclouds-loadbalancer diff --git a/sandbox-apis/libvirt/pom.xml b/sandbox-apis/libvirt/pom.xml index 37615c4df1..290adfd8b4 100644 --- a/sandbox-apis/libvirt/pom.xml +++ b/sandbox-apis/libvirt/pom.xml @@ -99,6 +99,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + diff --git a/sandbox-apis/nova-ec2/pom.xml b/sandbox-apis/nova-ec2/pom.xml index 63f1782bc7..b3583e05f3 100644 --- a/sandbox-apis/nova-ec2/pom.xml +++ b/sandbox-apis/nova-ec2/pom.xml @@ -74,6 +74,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + org.jclouds.driver jclouds-log4j diff --git a/sandbox-apis/vi/pom.xml b/sandbox-apis/vi/pom.xml index 1af38cc391..e1a11f21fc 100644 --- a/sandbox-apis/vi/pom.xml +++ b/sandbox-apis/vi/pom.xml @@ -92,6 +92,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + diff --git a/sandbox-providers/aws-elb/pom.xml b/sandbox-providers/aws-elb/pom.xml index fc134babc9..f176168ec6 100644 --- a/sandbox-providers/aws-elb/pom.xml +++ b/sandbox-providers/aws-elb/pom.xml @@ -86,6 +86,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j diff --git a/sandbox-providers/ibmdev/pom.xml b/sandbox-providers/ibmdev/pom.xml index c9478e6bf7..b997a85067 100644 --- a/sandbox-providers/ibmdev/pom.xml +++ b/sandbox-providers/ibmdev/pom.xml @@ -97,6 +97,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + diff --git a/sandbox-providers/rimuhosting/pom.xml b/sandbox-providers/rimuhosting/pom.xml index 8dcfd498fb..cf80f15b29 100644 --- a/sandbox-providers/rimuhosting/pom.xml +++ b/sandbox-providers/rimuhosting/pom.xml @@ -48,6 +48,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + org.jclouds jclouds-core diff --git a/sandbox-providers/savvis/pom.xml b/sandbox-providers/savvis/pom.xml index bd3429fbae..e5a52ef596 100644 --- a/sandbox-providers/savvis/pom.xml +++ b/sandbox-providers/savvis/pom.xml @@ -87,6 +87,12 @@ ${project.version} test + + com.jcraft + jsch + 0.1.42 + test + log4j log4j From 37d55330284dc3088a14cf72ba9a7c30cb4a0f3c Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Wed, 2 Feb 2011 00:17:47 -0800 Subject: [PATCH 43/81] added static ip and vlan collections to cloudsigma --- .../cloudsigma/CloudSigmaAsyncClient.java | 102 ++++++++ .../jclouds/cloudsigma/CloudSigmaClient.java | 91 ++++++- .../cloudsigma/binders/BindNameToPayload.java | 44 ++++ .../cloudsigma/domain/StaticIPInfo.java | 231 ++++++++++++++++++ .../jclouds/cloudsigma/domain/VLANInfo.java | 166 +++++++++++++ ...esDelimitedByBlankLinesToStaticIPInfo.java | 53 ++++ ...ValuesDelimitedByBlankLinesToVLANInfo.java | 53 ++++ ...elimitedByBlankLinesToStaticIPInfoSet.java | 60 +++++ ...uesDelimitedByBlankLinesToVLANInfoSet.java | 60 +++++ .../functions/MapToStaticIPInfo.java | 63 +++++ .../cloudsigma/functions/MapToVLANInfo.java | 59 +++++ .../cloudsigma/functions/SplitNewlines.java | 2 +- .../SplitNewlinesAndReturnSecondField.java | 67 +++++ .../handlers/CloudSigmaErrorHandler.java | 2 + .../org/jclouds/cloudsigma/util/Servers.java | 20 +- .../cloudsigma/CloudSigmaAsyncClientTest.java | 212 +++++++++++++++- .../cloudsigma/CloudSigmaClientLiveTest.java | 97 +++++++- ...esDelimitedByBlankLinesToVLANInfoTest.java | 50 ++++ ...elimitedByBlankLinesToVLANInfoSetTest.java | 52 ++++ .../functions/MapToVLANInfoTest.java | 56 +++++ .../src/test/resources/vlan.txt | 4 + 21 files changed, 1526 insertions(+), 18 deletions(-) create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/binders/BindNameToPayload.java create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/StaticIPInfo.java create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/VLANInfo.java create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToStaticIPInfo.java create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfo.java create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.java create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.java create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToStaticIPInfo.java create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToVLANInfo.java create mode 100644 providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlinesAndReturnSecondField.java create mode 100644 providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfoTest.java create mode 100644 providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSetTest.java create mode 100644 providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/MapToVLANInfoTest.java create mode 100644 providers/cloudsigma-zrh/src/test/resources/vlan.txt diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaAsyncClient.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaAsyncClient.java index 5e683d6fc1..9df39bec8b 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaAsyncClient.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaAsyncClient.java @@ -31,6 +31,7 @@ import javax.ws.rs.core.MediaType; import org.jclouds.cloudsigma.binders.BindCloneDriveOptionsToPlainTextString; import org.jclouds.cloudsigma.binders.BindDriveDataToPlainTextString; import org.jclouds.cloudsigma.binders.BindDriveToPlainTextString; +import org.jclouds.cloudsigma.binders.BindNameToPayload; import org.jclouds.cloudsigma.binders.BindServerToPlainTextString; import org.jclouds.cloudsigma.domain.Drive; import org.jclouds.cloudsigma.domain.DriveData; @@ -38,12 +39,19 @@ import org.jclouds.cloudsigma.domain.DriveInfo; import org.jclouds.cloudsigma.domain.ProfileInfo; import org.jclouds.cloudsigma.domain.Server; import org.jclouds.cloudsigma.domain.ServerInfo; +import org.jclouds.cloudsigma.domain.StaticIPInfo; +import org.jclouds.cloudsigma.domain.VLANInfo; import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToDriveInfo; import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToProfileInfo; import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToServerInfo; +import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToStaticIPInfo; +import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToVLANInfo; import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet; import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToServerInfoSet; +import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet; +import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet; import org.jclouds.cloudsigma.functions.SplitNewlines; +import org.jclouds.cloudsigma.functions.SplitNewlinesAndReturnSecondField; import org.jclouds.cloudsigma.options.CloneDriveOptions; import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.rest.annotations.BinderParam; @@ -242,4 +250,98 @@ public interface CloudSigmaAsyncClient { @Path("/drives/{uuid}/destroy") @ExceptionParser(ReturnVoidOnNotFoundOr404.class) ListenableFuture destroyDrive(@PathParam("uuid") String uuid); + + /** + * @see CloudSigmaClient#createVLAN + */ + @POST + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @ResponseParser(KeyValuesDelimitedByBlankLinesToVLANInfo.class) + @Path("/resources/vlan/create") + ListenableFuture createVLAN(@BinderParam(BindNameToPayload.class) String name); + + /** + * @see CloudSigmaClient#listVLANInfo + */ + @GET + @Path("/resources/vlan/info") + @ResponseParser(ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.class) + ListenableFuture> listVLANInfo(); + + /** + * @see CloudSigmaClient#getVLANInfo + */ + @GET + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @ResponseParser(KeyValuesDelimitedByBlankLinesToVLANInfo.class) + @Path("/resources/vlan/{uuid}/info") + ListenableFuture getVLANInfo(@PathParam("uuid") String uuid); + + /** + * @see CloudSigmaClient#setVLANConfiguration + */ + @POST + @ResponseParser(KeyValuesDelimitedByBlankLinesToVLANInfo.class) + @Path("/resources/vlan/{uuid}/set") + ListenableFuture renameVLAN(@PathParam("uuid") String uuid, + @BinderParam(BindNameToPayload.class) String name); + + /** + * @see CloudSigmaClient#listVLANs + */ + @GET + @Path("/resources/vlan/list") + @ResponseParser(SplitNewlinesAndReturnSecondField.class) + ListenableFuture> listVLANs(); + + /** + * @see CloudSigmaClient#destroyVLAN + */ + @POST + @Path("/resources/vlan/{uuid}/destroy") + @ExceptionParser(ReturnVoidOnNotFoundOr404.class) + ListenableFuture destroyVLAN(@PathParam("uuid") String uuid); + + /** + * @see CloudSigmaClient#createStaticIP + */ + @POST + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @ResponseParser(KeyValuesDelimitedByBlankLinesToStaticIPInfo.class) + @Path("/resources/ip/create") + ListenableFuture createStaticIP(); + + /** + * @see CloudSigmaClient#listStaticIPInfo + */ + @GET + @Path("/resources/ip/info") + @ResponseParser(ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.class) + ListenableFuture> listStaticIPInfo(); + + /** + * @see CloudSigmaClient#getStaticIPInfo + */ + @GET + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @ResponseParser(KeyValuesDelimitedByBlankLinesToStaticIPInfo.class) + @Path("/resources/ip/{uuid}/info") + ListenableFuture getStaticIPInfo(@PathParam("uuid") String uuid); + + /** + * @see CloudSigmaClient#listStaticIPs + */ + @GET + @Path("/resources/ip/list") + @ResponseParser(SplitNewlinesAndReturnSecondField.class) + ListenableFuture> listStaticIPs(); + + /** + * @see CloudSigmaClient#destroyStaticIP + */ + @POST + @Path("/resources/ip/{uuid}/destroy") + @ExceptionParser(ReturnVoidOnNotFoundOr404.class) + ListenableFuture destroyStaticIP(@PathParam("uuid") String uuid); + } diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaClient.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaClient.java index 7540990fc9..715dba01ca 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaClient.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/CloudSigmaClient.java @@ -28,6 +28,8 @@ import org.jclouds.cloudsigma.domain.DriveInfo; import org.jclouds.cloudsigma.domain.ProfileInfo; import org.jclouds.cloudsigma.domain.Server; import org.jclouds.cloudsigma.domain.ServerInfo; +import org.jclouds.cloudsigma.domain.StaticIPInfo; +import org.jclouds.cloudsigma.domain.VLANInfo; import org.jclouds.cloudsigma.options.CloneDriveOptions; import org.jclouds.concurrent.Timeout; @@ -40,7 +42,7 @@ import org.jclouds.concurrent.Timeout; * @author Adrian Cole */ @Timeout(duration = 60, timeUnit = TimeUnit.SECONDS) -public interface CloudSigmaClient { +public interface CloudSigmaClient { /** * Get profile info @@ -48,14 +50,14 @@ public interface CloudSigmaClient { * @return info or null, if not found */ ProfileInfo getProfileInfo(); - + /** * list of server uuids in your account * * @return or empty set if no servers are found */ Set listServers(); - + /** * Get all servers info * @@ -220,5 +222,88 @@ public interface CloudSigmaClient { */ DriveInfo cloneDrive(String sourceUuid, String newName, CloneDriveOptions... options); + /** + * list of vlan uuids in your account + * + * @return or empty set if no vlans are found + */ + Set listVLANs(); + + /** + * Get all vlans info + * + * @return or empty set if no vlans are found + */ + Set listVLANInfo(); + + /** + * @param uuid + * what to get + * @return null, if not found + */ + VLANInfo getVLANInfo(String uuid); + + /** + * create a new vlan + * + * @param vlan + * @return newly created vlan + */ + VLANInfo createVLAN(String name); + + /** + * set vlan configuration + * + * @param uuid + * what vlan to change + * @param newName + * what the new name is + * @return new data + */ + VLANInfo renameVLAN(String uuid, String newName); + + /** + * Destroy a vlan + * + * @param uuid + * what to destroy + */ + void destroyVLAN(String uuid); + + /** + * list of ip uuids in your account + * + * @return or empty set if no ips are found + */ + Set listStaticIPs(); + + /** + * Get all ips info + * + * @return or empty set if no ips are found + */ + Set listStaticIPInfo(); + + /** + * @param uuid + * what to get + * @return null, if not found + */ + StaticIPInfo getStaticIPInfo(String uuid); + + /** + * create a new ip + * + * @return newly created ip + */ + StaticIPInfo createStaticIP(); + + /** + * Destroy a ip + * + * @param uuid + * what to destroy + */ + void destroyStaticIP(String uuid); } diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/binders/BindNameToPayload.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/binders/BindNameToPayload.java new file mode 100644 index 0000000000..25df2ab958 --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/binders/BindNameToPayload.java @@ -0,0 +1,44 @@ +/** + * + * 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.cloudsigma.binders; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Singleton; +import javax.ws.rs.core.MediaType; + +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.Binder; + +/** + * + * @author Adrian Cole + * + */ +@Singleton +public class BindNameToPayload implements Binder { + + @Override + public R bindToRequest(R request, Object payload) { + request.setPayload("name " + checkNotNull(payload, "name") + "\n"); + request.getPayload().getContentMetadata().setContentType(MediaType.TEXT_PLAIN); + return request; + } +} diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/StaticIPInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/StaticIPInfo.java new file mode 100644 index 0000000000..0285460de2 --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/StaticIPInfo.java @@ -0,0 +1,231 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not user 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.cloudsigma.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Set; + +import javax.annotation.Nullable; + +import com.google.common.collect.ImmutableSet; + +/** + * + * @author Adrian Cole + */ +public class StaticIPInfo { + public static class Builder { + protected String ip; + protected String user; + protected String netmask; + protected Set nameservers = ImmutableSet.of(); + protected String gateway; + + public Builder ip(String ip) { + this.ip = ip; + return this; + } + + public Builder user(String user) { + this.user = user; + return this; + } + + public Builder nameservers(Iterable nameservers) { + this.nameservers = ImmutableSet.copyOf(checkNotNull(nameservers, "nameservers")); + return this; + } + + public Builder gateway(String gateway) { + this.gateway = gateway; + return this; + } + + public Builder netmask(String netmask) { + this.netmask = netmask; + return this; + } + + public StaticIPInfo build() { + return new StaticIPInfo(ip, user, netmask, nameservers, gateway); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((gateway == null) ? 0 : gateway.hashCode()); + result = prime * result + ((nameservers == null) ? 0 : nameservers.hashCode()); + result = prime * result + ((netmask == null) ? 0 : netmask.hashCode()); + result = prime * result + ((user == null) ? 0 : user.hashCode()); + result = prime * result + ((ip == null) ? 0 : ip.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; + Builder other = (Builder) obj; + if (gateway == null) { + if (other.gateway != null) + return false; + } else if (!gateway.equals(other.gateway)) + return false; + if (nameservers == null) { + if (other.nameservers != null) + return false; + } else if (!nameservers.equals(other.nameservers)) + return false; + if (netmask == null) { + if (other.netmask != null) + return false; + } else if (!netmask.equals(other.netmask)) + return false; + if (user == null) { + if (other.user != null) + return false; + } else if (!user.equals(other.user)) + return false; + if (ip == null) { + if (other.ip != null) + return false; + } else if (!ip.equals(other.ip)) + return false; + return true; + } + } + + protected final String ip; + protected final String user; + protected final String netmask; + protected final Set nameservers; + protected final String gateway; + + public StaticIPInfo(String ip, String user, String netmask, Iterable nameservers, String gateway) { + this.ip = checkNotNull(ip, "ip"); + this.user = checkNotNull(user, "user"); + this.netmask = checkNotNull(netmask, "netmask"); + this.nameservers = ImmutableSet.copyOf(checkNotNull(nameservers, "nameservers")); + this.gateway = checkNotNull(gateway, "gateway"); + } + + /** + * + * @return ip of the ip. + */ + @Nullable + public String getAddress() { + return ip; + } + + /** + * + * @return user owning the ip + */ + public String getUser() { + return user; + } + + /** + * + * @return netmask of the ip + */ + public String getNetmask() { + return netmask; + } + + /** + * + * @return nameservers of the ip + */ + public Set getNameservers() { + return nameservers; + } + + /** + * + * @return gateway of the ip + */ + public String getGateway() { + return gateway; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((gateway == null) ? 0 : gateway.hashCode()); + result = prime * result + ((nameservers == null) ? 0 : nameservers.hashCode()); + result = prime * result + ((netmask == null) ? 0 : netmask.hashCode()); + result = prime * result + ((user == null) ? 0 : user.hashCode()); + result = prime * result + ((ip == null) ? 0 : ip.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; + StaticIPInfo other = (StaticIPInfo) obj; + if (gateway == null) { + if (other.gateway != null) + return false; + } else if (!gateway.equals(other.gateway)) + return false; + if (nameservers == null) { + if (other.nameservers != null) + return false; + } else if (!nameservers.equals(other.nameservers)) + return false; + if (netmask == null) { + if (other.netmask != null) + return false; + } else if (!netmask.equals(other.netmask)) + return false; + if (user == null) { + if (other.user != null) + return false; + } else if (!user.equals(other.user)) + return false; + if (ip == null) { + if (other.ip != null) + return false; + } else if (!ip.equals(other.ip)) + return false; + return true; + } + + @Override + public String toString() { + return "[ip=" + ip + ", user=" + user + ", netmask=" + netmask + ", nameservers=" + + nameservers + ", gateway=" + gateway + "]"; + } + +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/VLANInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/VLANInfo.java new file mode 100644 index 0000000000..15d6d2a430 --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/domain/VLANInfo.java @@ -0,0 +1,166 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not user 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.cloudsigma.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.Nullable; + +/** + * + * @author Adrian Cole + */ +public class VLANInfo { + public static class Builder { + protected String uuid; + protected String name; + protected String user; + + public Builder uuid(String uuid) { + this.uuid = uuid; + return this; + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder user(String user) { + this.user = user; + return this; + } + + public VLANInfo build() { + return new VLANInfo(uuid, name, user); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((user == null) ? 0 : user.hashCode()); + result = prime * result + ((uuid == null) ? 0 : uuid.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; + Builder other = (Builder) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (user == null) { + if (other.user != null) + return false; + } else if (!user.equals(other.user)) + return false; + if (uuid == null) { + if (other.uuid != null) + return false; + } else if (!uuid.equals(other.uuid)) + return false; + return true; + } + } + + @Nullable + protected final String uuid; + protected final String name; + protected final String user; + + public VLANInfo(String uuid, String name, String user) { + this.uuid = checkNotNull(uuid, "uuid"); + this.name = checkNotNull(name, "name"); + this.user = checkNotNull(user, "user"); + } + + /** + * + * @return uuid of the vlan. + */ + @Nullable + public String getUuid() { + return uuid; + } + + /** + * + * @return name of the vlan + */ + public String getName() { + return name; + } + + /** + * + * @return user owning the vlan + */ + public String getUser() { + return user; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((user == null) ? 0 : user.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; + VLANInfo other = (VLANInfo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (user == null) { + if (other.user != null) + return false; + } else if (!user.equals(other.user)) + return false; + + return true; + } + + @Override + public String toString() { + return "[uuid=" + uuid + ", name=" + name + ", user=" + user + "]"; + } + +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToStaticIPInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToStaticIPInfo.java new file mode 100644 index 0000000000..32d8f9aa67 --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToStaticIPInfo.java @@ -0,0 +1,53 @@ +/** + * + * 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.cloudsigma.functions; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.cloudsigma.domain.StaticIPInfo; +import org.jclouds.http.HttpResponse; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class KeyValuesDelimitedByBlankLinesToStaticIPInfo implements Function { + private final ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet setParser; + + @Inject + public KeyValuesDelimitedByBlankLinesToStaticIPInfo(ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet setParser) { + this.setParser = setParser; + } + + @Override + public StaticIPInfo apply(HttpResponse response) { + Set drives = setParser.apply(response); + if (drives.size() == 0) + return null; + return Iterables.get(drives, 0); + } +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfo.java new file mode 100644 index 0000000000..0856c2e33e --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfo.java @@ -0,0 +1,53 @@ +/** + * + * 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.cloudsigma.functions; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.cloudsigma.domain.VLANInfo; +import org.jclouds.http.HttpResponse; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class KeyValuesDelimitedByBlankLinesToVLANInfo implements Function { + private final ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet setParser; + + @Inject + public KeyValuesDelimitedByBlankLinesToVLANInfo(ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet setParser) { + this.setParser = setParser; + } + + @Override + public VLANInfo apply(HttpResponse response) { + Set drives = setParser.apply(response); + if (drives.size() == 0) + return null; + return Iterables.get(drives, 0); + } +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.java new file mode 100644 index 0000000000..a754299cb4 --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet.java @@ -0,0 +1,60 @@ +/** + * + * 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.cloudsigma.functions; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.cloudsigma.domain.StaticIPInfo; +import org.jclouds.http.HttpResponse; +import org.jclouds.http.functions.ReturnStringIf2xx; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet implements Function> { + private final ReturnStringIf2xx returnStringIf200; + private final ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter; + private final MapToStaticIPInfo mapToProfile; + + @Inject + ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet(ReturnStringIf2xx returnStringIf200, + ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter, MapToStaticIPInfo mapToProfile) { + this.returnStringIf200 = returnStringIf200; + this.mapConverter = mapConverter; + this.mapToProfile = mapToProfile; + } + + @Override + public Set apply(HttpResponse response) { + String text = returnStringIf200.apply(response); + if (text == null || text.trim().equals("")) + return ImmutableSet. of(); + return ImmutableSet.copyOf(Iterables.transform(mapConverter.apply(text), mapToProfile)); + } +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.java new file mode 100644 index 0000000000..f87a49697c --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.java @@ -0,0 +1,60 @@ +/** + * + * 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.cloudsigma.functions; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.cloudsigma.domain.VLANInfo; +import org.jclouds.http.HttpResponse; +import org.jclouds.http.functions.ReturnStringIf2xx; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet implements Function> { + private final ReturnStringIf2xx returnStringIf200; + private final ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter; + private final MapToVLANInfo mapToProfile; + + @Inject + ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet(ReturnStringIf2xx returnStringIf200, + ListOfKeyValuesDelimitedByBlankLinesToListOfMaps mapConverter, MapToVLANInfo mapToProfile) { + this.returnStringIf200 = returnStringIf200; + this.mapConverter = mapConverter; + this.mapToProfile = mapToProfile; + } + + @Override + public Set apply(HttpResponse response) { + String text = returnStringIf200.apply(response); + if (text == null || text.trim().equals("")) + return ImmutableSet. of(); + return ImmutableSet.copyOf(Iterables.transform(mapConverter.apply(text), mapToProfile)); + } +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToStaticIPInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToStaticIPInfo.java new file mode 100644 index 0000000000..13e3fab877 --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToStaticIPInfo.java @@ -0,0 +1,63 @@ +/** + * + * 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.cloudsigma.functions; + +import java.util.Map; + +import javax.annotation.Resource; +import javax.inject.Singleton; + +import org.jclouds.cloudsigma.domain.StaticIPInfo; +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; +import com.google.common.base.Splitter; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class MapToStaticIPInfo implements Function, StaticIPInfo> { + + @Resource + protected Logger logger = Logger.NULL; + + @Override + public StaticIPInfo apply(Map from) { + if (from.size() == 0) + return null; + if (from.size() == 0) + return null; + StaticIPInfo.Builder builder = new StaticIPInfo.Builder(); + builder.ip(from.get("resource")); + builder.user(from.get("user")); + builder.netmask(from.get("netmask")); + builder.nameservers(Splitter.on(' ').split(from.get("nameserver"))); + builder.gateway(from.get("gateway")); + + try { + return builder.build(); + } catch (NullPointerException e) { + logger.trace("entry missing data: %s; %s", e.getMessage(), from); + return null; + } + } +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToVLANInfo.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToVLANInfo.java new file mode 100644 index 0000000000..0f6953ac59 --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/MapToVLANInfo.java @@ -0,0 +1,59 @@ +/** + * + * 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.cloudsigma.functions; + +import java.util.Map; + +import javax.annotation.Resource; +import javax.inject.Singleton; + +import org.jclouds.cloudsigma.domain.VLANInfo; +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class MapToVLANInfo implements Function, VLANInfo> { + + @Resource + protected Logger logger = Logger.NULL; + + @Override + public VLANInfo apply(Map from) { + if (from.size() == 0) + return null; + if (from.size() == 0) + return null; + VLANInfo.Builder builder = new VLANInfo.Builder(); + builder.uuid(from.get("resource")); + builder.name(from.get("name")); + builder.user(from.get("user")); + try { + return builder.build(); + } catch (NullPointerException e) { + logger.trace("entry missing data: %s; %s", e.getMessage(), from); + return null; + } + } +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlines.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlines.java index b87fd5e4de..9c6ceddb51 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlines.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlines.java @@ -44,7 +44,7 @@ public class SplitNewlines implements Function> { private final ReturnStringIf2xx returnStringIf200; @Inject - SplitNewlines(ReturnStringIf2xx returnStringIf200) { + protected SplitNewlines(ReturnStringIf2xx returnStringIf200) { this.returnStringIf200 = returnStringIf200; } diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlinesAndReturnSecondField.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlinesAndReturnSecondField.java new file mode 100644 index 0000000000..0d098fdaa9 --- /dev/null +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/functions/SplitNewlinesAndReturnSecondField.java @@ -0,0 +1,67 @@ +/** + * + * 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.cloudsigma.functions; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.http.HttpResponse; +import org.jclouds.http.functions.ReturnStringIf2xx; + +import com.google.common.base.Function; +import com.google.common.base.Predicates; +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class SplitNewlinesAndReturnSecondField extends SplitNewlines { + + @Inject + SplitNewlinesAndReturnSecondField(ReturnStringIf2xx returnStringIf200) { + super(returnStringIf200); + } + + @Override + public Set apply(HttpResponse response) { + return ImmutableSet.copyOf(Iterables.filter( + Iterables.transform(super.apply(response), new Function() { + + @Override + public String apply(String arg0) { + if (arg0 == null) + return null; + Iterable parts = Splitter.on(' ').split(arg0); + if (Iterables.size(parts) == 2) + return Iterables.get(parts, 1); + else if (Iterables.size(parts) == 1) + return Iterables.get(parts, 0); + return null; + } + + }), Predicates.notNull())); + } +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java index 99c499a204..91f9636602 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/handlers/CloudSigmaErrorHandler.java @@ -64,6 +64,8 @@ public class CloudSigmaErrorHandler implements HttpErrorHandler { if ((command.getCurrentRequest().getEndpoint().getPath().endsWith("/info")) || (message != null && message.indexOf("could not be found") != -1)) exception = new ResourceNotFoundException(message, exception); + else if (message != null && message.indexOf("currently in use") != -1) + exception = new IllegalStateException(message, exception); else exception = new IllegalArgumentException(message, exception); break; diff --git a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/util/Servers.java b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/util/Servers.java index e452ee798c..9234aedbcf 100644 --- a/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/util/Servers.java +++ b/providers/cloudsigma-zrh/src/main/java/org/jclouds/cloudsigma/util/Servers.java @@ -45,10 +45,28 @@ public class Servers { * @return a builder for a persistent 1Ghz 512m server with DHCP enabled network. */ public static Server.Builder small(String name, String driveUuuid, String vncPassword) { + return smallWithStaticIP(name, driveUuuid, vncPassword, "auto"); + } + + /** + * Helper to create a small persistent server + * + * @param name + * what to name the server + * @param driveUuuid + * id of the boot drive + * @param vncPassword + * password for vnc + * @param ip + * static IP + * @return a builder for a persistent 1Ghz 512m server with DHCP enabled network. + */ + public static Server.Builder smallWithStaticIP(String name, String driveUuuid, String vncPassword, String ip) { return new Server.Builder().name(name).cpu(1000).mem(512).persistent(true) .devices(ImmutableMap.of("ide:0:0", new IDEDevice.Builder(0, 0).uuid(driveUuuid).build())) .bootDeviceIds(ImmutableSet.of("ide:0:0")) - .nics(ImmutableSet.of(new NIC.Builder().model(Model.E1000).dhcp("auto").build())) + .nics(ImmutableSet.of(new NIC.Builder().model(Model.E1000).dhcp(ip).build())) .vnc(new VNC(null, vncPassword, false)); } + } \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaAsyncClientTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaAsyncClientTest.java index 8ea9198b57..6772a832d9 100644 --- a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaAsyncClientTest.java +++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/CloudSigmaAsyncClientTest.java @@ -33,9 +33,14 @@ import org.jclouds.cloudsigma.domain.Server; import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToDriveInfo; import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToProfileInfo; import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToServerInfo; +import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToStaticIPInfo; +import org.jclouds.cloudsigma.functions.KeyValuesDelimitedByBlankLinesToVLANInfo; import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet; import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToServerInfoSet; +import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToStaticIPInfoSet; +import org.jclouds.cloudsigma.functions.ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet; import org.jclouds.cloudsigma.functions.SplitNewlines; +import org.jclouds.cloudsigma.functions.SplitNewlinesAndReturnSecondField; import org.jclouds.cloudsigma.options.CloneDriveOptions; import org.jclouds.http.HttpRequest; import org.jclouds.http.filters.BasicAuthentication; @@ -77,6 +82,7 @@ public class CloudSigmaAsyncClientTest extends RestClientTest servers = client.listServers(); - assertNotNull(servers); - } - @Test public void testGetProfileInfo() throws Exception { ProfileInfo profile = client.getProfileInfo(); assertNotNull(profile); } + @Test + public void testListVLANs() throws Exception { + Set vlans = client.listVLANs(); + assertNotNull(vlans); + } + + @Test + public void testListVLANInfo() throws Exception { + Set vlans = client.listVLANInfo(); + assertNotNull(vlans); + } + + @Test + public void testGetVLAN() throws Exception { + for (String vlanUUID : client.listVLANs()) { + assert !"".equals(vlanUUID); + assertNotNull(client.getVLANInfo(vlanUUID)); + } + } + + @Test + public void testListStaticIPs() throws Exception { + Set ips = client.listStaticIPs(); + assertNotNull(ips); + } + + @Test + public void testListStaticIPInfo() throws Exception { + Set ips = client.listStaticIPInfo(); + assertNotNull(ips); + } + + @Test + public void testGetStaticIP() throws Exception { + for (String ipUUID : client.listStaticIPs()) { + assert !"".equals(ipUUID); + assertNotNull(client.getStaticIPInfo(ipUUID)); + } + } + + @Test + public void testListServers() throws Exception { + Set servers = client.listServers(); + assertNotNull(servers); + } + @Test public void testListServerInfo() throws Exception { Set servers = client.listServerInfo(); @@ -223,6 +265,47 @@ public class CloudSigmaClientLiveTest { drive = drive2; } + @Test + public void testCreateAndDestroyVLAN() throws Exception { + VLANInfo vlan = client.createVLAN(prefix); + String id = vlan.getUuid(); + try { + vlan = client.getVLANInfo(vlan.getUuid()); + assertEquals(vlan.getName(), prefix); + + vlan = client.renameVLAN(vlan.getUuid(), prefix + "2"); + // test that rename didn't work :) + assertEquals(vlan.getName(), prefix); + vlan = client.getVLANInfo(vlan.getUuid()); + assertEquals(vlan.getName(), prefix); + } finally { + client.destroyVLAN(id); + } + } + + @Test + public void testCreateAndDestroyStaticIP() throws Exception { + StaticIPInfo ip = client.createStaticIP(); + String id = ip.getAddress(); + try { + ip = client.getStaticIPInfo(ip.getAddress()); + assertNotNull(ip); + Logger.getAnonymousLogger().info("preparing drive"); + prepareDrive(); + + Server serverRequest = Servers.smallWithStaticIP(prefix, drive.getUuid(), vncPassword, ip.getAddress()) + .build(); + + Logger.getAnonymousLogger().info("starting server"); + server = client.createServer(serverRequest); + assertEquals(server.getNics().get(0).getDhcp(), ip.getAddress()); + } finally { + client.destroyServer(server.getUuid()); + client.destroyDrive(drive.getUuid()); + client.destroyStaticIP(id); + } + } + protected ServerInfo server; @Test(dependsOnMethods = "testSetDriveData") diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfoTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfoTest.java new file mode 100644 index 0000000000..6d7594928f --- /dev/null +++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/KeyValuesDelimitedByBlankLinesToVLANInfoTest.java @@ -0,0 +1,50 @@ +/** + * + * 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.cloudsigma.functions; + +import static org.testng.Assert.assertEquals; + +import org.jclouds.http.HttpResponse; +import org.jclouds.io.Payloads; +import org.testng.annotations.Test; + +import com.google.inject.Guice; + +/** + * + * @author Adrian Cole + */ +@Test(groups = { "unit" }) +public class KeyValuesDelimitedByBlankLinesToVLANInfoTest { + + private static final KeyValuesDelimitedByBlankLinesToVLANInfo FN = Guice.createInjector().getInstance( + KeyValuesDelimitedByBlankLinesToVLANInfo.class); + + public void testNone() { + assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload(""))), null); + assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload("\n\n"))), null); + assertEquals(FN.apply(new HttpResponse(200, "", null)), null); + } + + public void testOne() { + assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newInputStreamPayload(MapToVLANInfoTest.class + .getResourceAsStream("/vlan.txt")))), MapToVLANInfoTest.ONE); + } +} diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSetTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSetTest.java new file mode 100644 index 0000000000..11bba3b8b4 --- /dev/null +++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSetTest.java @@ -0,0 +1,52 @@ +/** + * + * 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.cloudsigma.functions; + +import static org.testng.Assert.assertEquals; + +import org.jclouds.cloudsigma.domain.VLANInfo; +import org.jclouds.http.HttpResponse; +import org.jclouds.io.Payloads; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Guice; + +/** + * + * @author Adrian Cole + */ +@Test(groups = { "unit" }) +public class ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSetTest { + + private static final ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet FN = Guice.createInjector().getInstance( + ListOfKeyValuesDelimitedByBlankLinesToVLANInfoSet.class); + + public void testNone() { + assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload(""))), ImmutableSet. of()); + assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newStringPayload("\n\n"))), ImmutableSet. of()); + assertEquals(FN.apply(new HttpResponse(200, "", null)), ImmutableSet. of()); + } + + public void testOne() { + assertEquals(FN.apply(new HttpResponse(200, "", Payloads.newInputStreamPayload(MapToVLANInfoTest.class + .getResourceAsStream("/vlan.txt")))), ImmutableSet. of(MapToVLANInfoTest.ONE)); + } +} \ No newline at end of file diff --git a/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/MapToVLANInfoTest.java b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/MapToVLANInfoTest.java new file mode 100644 index 0000000000..7c6f0ef2a1 --- /dev/null +++ b/providers/cloudsigma-zrh/src/test/java/org/jclouds/cloudsigma/functions/MapToVLANInfoTest.java @@ -0,0 +1,56 @@ +/** + * + * 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.cloudsigma.functions; + +import static org.testng.Assert.assertEquals; + +import java.io.IOException; +import java.util.Map; + +import org.jclouds.cloudsigma.domain.VLANInfo; +import org.jclouds.util.Strings2; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; + +/** + * + * @author Adrian Cole + */ +@Test(groups = { "unit" }) +public class MapToVLANInfoTest { + public static VLANInfo ONE = new VLANInfo.Builder()// + .uuid("6e2d1f6a-03c8-422b-bc8e-d744612cf46a")// + .name("My VLAN1").user("f2e19d5c-eaa1-44e5-94aa-dc194594bd7b").build(); + private static final MapToVLANInfo MAP_TO_VLAN = new MapToVLANInfo(); + + public void testEmptyMapReturnsNull() { + assertEquals(MAP_TO_VLAN.apply(ImmutableMap. of()), null); + } + + public void test() throws IOException { + + Map input = new ListOfKeyValuesDelimitedByBlankLinesToListOfMaps().apply( + Strings2.toStringAndClose(MapToVLANInfoTest.class.getResourceAsStream("/vlan.txt"))).get(0); + + assertEquals(MAP_TO_VLAN.apply(input), ONE); + + } +} diff --git a/providers/cloudsigma-zrh/src/test/resources/vlan.txt b/providers/cloudsigma-zrh/src/test/resources/vlan.txt new file mode 100644 index 0000000000..f98a1344fc --- /dev/null +++ b/providers/cloudsigma-zrh/src/test/resources/vlan.txt @@ -0,0 +1,4 @@ +resource 6e2d1f6a-03c8-422b-bc8e-d744612cf46a +type vlan +user f2e19d5c-eaa1-44e5-94aa-dc194594bd7b +name My VLAN1 \ No newline at end of file From f1812f4e86ebeea972c8c8130e22aed880ebf5a7 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 1 Feb 2011 19:53:48 +0100 Subject: [PATCH 44/81] Made *both* lib dependencies in drivers/enterprise *compile* deps --- drivers/enterprise/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/enterprise/pom.xml b/drivers/enterprise/pom.xml index d9a2017b0c..55b7f5d5bb 100644 --- a/drivers/enterprise/pom.xml +++ b/drivers/enterprise/pom.xml @@ -63,7 +63,7 @@ jclouds-joda ${project.version} - + joda-time joda-time 1.6 @@ -77,7 +77,6 @@ org.bouncycastle bcprov-jdk15 1.44 - provided org.mortbay.jetty From 722199ca01cdc8ef08fa9f3c3f508ef138e2386e Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Wed, 2 Feb 2011 03:00:09 +0100 Subject: [PATCH 45/81] Fixed descriptions in azureblob and elastichosts-sat-p provider POMs --- providers/azureblob/pom.xml | 2 +- providers/elastichosts-sat-p/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/azureblob/pom.xml b/providers/azureblob/pom.xml index aaba657908..aa20937509 100644 --- a/providers/azureblob/pom.xml +++ b/providers/azureblob/pom.xml @@ -31,7 +31,7 @@ org.jclouds.provider azureblob - jcloud azureblob provider + jclouds Azure Storage provider jclouds components to access Azure Blob Service diff --git a/providers/elastichosts-sat-p/pom.xml b/providers/elastichosts-sat-p/pom.xml index 563b0d9ebb..75324ecb4f 100644 --- a/providers/elastichosts-sat-p/pom.xml +++ b/providers/elastichosts-sat-p/pom.xml @@ -31,7 +31,7 @@ org.jclouds.provider elastichosts-sat-p - jclouds ElasticHosts Peer1 London provider + jclouds ElasticHosts Peer1 San Antonio provider ElasticHosts implementation targeted to Peer1 San Antonio From f1a878f0166396bea35773e589c5193d086ed323 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 5 Feb 2011 11:54:32 -0800 Subject: [PATCH 46/81] added nested json unwrapping --- .../functions/UnwrapOnlyNestedJsonValue.java | 55 +++++++++++++++++++ .../org/jclouds/rest/annotations/Unwrap.java | 15 +++++ .../internal/RestAnnotationProcessor.java | 14 ++++- core/src/main/resources/rest.properties | 3 + .../internal/RestAnnotationProcessorTest.java | 22 ++++++++ 5 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/org/jclouds/http/functions/UnwrapOnlyNestedJsonValue.java diff --git a/core/src/main/java/org/jclouds/http/functions/UnwrapOnlyNestedJsonValue.java b/core/src/main/java/org/jclouds/http/functions/UnwrapOnlyNestedJsonValue.java new file mode 100644 index 0000000000..561c119d96 --- /dev/null +++ b/core/src/main/java/org/jclouds/http/functions/UnwrapOnlyNestedJsonValue.java @@ -0,0 +1,55 @@ +/** + * + * 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.http.functions; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.http.HttpResponse; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; + +/** + * @author Adrian Cole + */ +@Singleton +public class UnwrapOnlyNestedJsonValue implements Function { + + private final ParseJson>> json; + + @Inject + UnwrapOnlyNestedJsonValue(ParseJson>> json) { + this.json = json; + } + + @Override + public T apply(HttpResponse arg0) { + Map> map = json.apply(arg0); + if (map == null || map.size() == 0) + return null; + Map map1 = Iterables.getOnlyElement(map.values()); + if (map1 == null || map1.size() == 0) + return null; + return Iterables.getOnlyElement(map1.values()); + } +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/rest/annotations/Unwrap.java b/core/src/main/java/org/jclouds/rest/annotations/Unwrap.java index 5866f7048e..8015ce7995 100644 --- a/core/src/main/java/org/jclouds/rest/annotations/Unwrap.java +++ b/core/src/main/java/org/jclouds/rest/annotations/Unwrap.java @@ -35,4 +35,19 @@ import java.lang.annotation.Target; @Target(METHOD) @Retention(RUNTIME) public @interface Unwrap { + /** + * level to unwrap. + * + * ex. if default (1) + * + * { "foo" :"bar" } becomes "bar" + * + * ex. if (2) + * + * { "foo" : {"bar" : "baz} } becomes "baz" + * + * @return nestingLevel + */ + int depth() default 1; + } diff --git a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java index bac8df9e23..ae3a8854c6 100755 --- a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java +++ b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java @@ -87,6 +87,7 @@ import org.jclouds.http.functions.ReturnInputStream; import org.jclouds.http.functions.ReturnStringIf2xx; import org.jclouds.http.functions.ReturnTrueIf2xx; import org.jclouds.http.functions.UnwrapOnlyJsonValue; +import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue; import org.jclouds.http.functions.ParseSax.HandlerWithResult; import org.jclouds.http.options.HttpRequestOptions; import org.jclouds.http.utils.ModifyRequest; @@ -783,10 +784,17 @@ public class RestAnnotationProcessor { returnVal = method.getGenericReturnType(); } ParameterizedType parserType; - if (method.isAnnotationPresent(Unwrap.class)) - parserType = Types.newParameterizedType(UnwrapOnlyJsonValue.class, returnVal); - else + if (method.isAnnotationPresent(Unwrap.class)) { + int nestingLevel = method.getAnnotation(Unwrap.class).depth(); + if (nestingLevel == 1) + parserType = Types.newParameterizedType(UnwrapOnlyJsonValue.class, returnVal); + else if (nestingLevel == 2) + parserType = Types.newParameterizedType(UnwrapOnlyNestedJsonValue.class, returnVal); + else + throw new IllegalStateException("nesting level " + nestingLevel + " not yet supported for @Unwrap"); + } else { parserType = Types.newParameterizedType(ParseJson.class, returnVal); + } return (Key>) Key.get(parserType); } else if (method.getReturnType().equals(String.class) || TypeLiteral.get(method.getGenericReturnType()).equals(futureStringLiteral)) { diff --git a/core/src/main/resources/rest.properties b/core/src/main/resources/rest.properties index 478c72a795..95aea9a0d6 100644 --- a/core/src/main/resources/rest.properties +++ b/core/src/main/resources/rest.properties @@ -168,6 +168,9 @@ swift.propertiesbuilder=org.jclouds.openstack.swift.SwiftPropertiesBuilder cloudfiles.contextbuilder=org.jclouds.cloudfiles.CloudFilesContextBuilder cloudfiles.propertiesbuilder=org.jclouds.openstack.swift.SwiftPropertiesBuilder +cloudstack.contextbuilder=org.jclouds.cloudstack.CloudStackContextBuilder +cloudstack.propertiesbuilder=org.jclouds.cloudstack.CloudStackPropertiesBuilder + cloudfiles-us.contextbuilder=org.jclouds.cloudfiles.CloudFilesContextBuilder cloudfiles-us.propertiesbuilder=org.jclouds.rackspace.cloudfiles.CloudFilesUSPropertiesBuilder diff --git a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java index 0b9c7f7904..caca04cdc1 100755 --- a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java +++ b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java @@ -97,6 +97,7 @@ import org.jclouds.http.functions.ReturnInputStream; import org.jclouds.http.functions.ReturnStringIf2xx; import org.jclouds.http.functions.ReturnTrueIf2xx; import org.jclouds.http.functions.UnwrapOnlyJsonValue; +import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue; import org.jclouds.http.internal.PayloadEnclosingImpl; import org.jclouds.http.options.BaseHttpRequestOptions; import org.jclouds.http.options.GetOptions; @@ -764,6 +765,12 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest { @Consumes(MediaType.APPLICATION_JSON) ListenableFuture> testUnwrap4(); + @GET + @Path("/") + @Unwrap(depth = 2) + @Consumes(MediaType.APPLICATION_JSON) + ListenableFuture> testUnwrapDepth2(); + @Target( { ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @HttpMethod("ROWDY") @@ -933,6 +940,21 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest { ImmutableSet.of("0.7.0", "0.7.1")); } + @SuppressWarnings("unchecked") + public void testUnwrapDepth2() throws SecurityException, NoSuchMethodException, IOException { + Method method = TestPut.class.getMethod("testUnwrapDepth2"); + HttpRequest request = factory(TestPut.class).createRequest(method); + + assertResponseParserClassEquals(method, request, UnwrapOnlyNestedJsonValue.class); + // now test that it works! + + Function> parser = (Function>) RestAnnotationProcessor + .createResponseParser(parserFactory, injector, method, request); + + assertEquals(parser.apply(new HttpResponse(200, "ok", + newStringPayload("{\"runit\":{\"runit\":[\"0.7.0\",\"0.7.1\"]}}"))), ImmutableSet.of("0.7.0", "0.7.1")); + } + static class TestRequestFilter1 implements HttpRequestFilter { public HttpRequest filter(HttpRequest request) throws HttpException { return request; From 6f545c02773578e19d6fe3f784e0bf1b25a0fb7b Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 6 Feb 2011 17:29:15 -0800 Subject: [PATCH 47/81] deepened unwrapping of json to include only value in list --- .../internal/SimpleDateFormatDateService.java | 2 +- .../UnwrapOnlyNestedJsonValueInSet.java | 52 +++++++++++++++++++ .../org/jclouds/rest/annotations/Unwrap.java | 22 +++++++- .../internal/RestAnnotationProcessor.java | 13 +++-- .../internal/RestAnnotationProcessorTest.java | 51 ++++++++++++++++++ 5 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/org/jclouds/http/functions/UnwrapOnlyNestedJsonValueInSet.java diff --git a/core/src/main/java/org/jclouds/date/internal/SimpleDateFormatDateService.java b/core/src/main/java/org/jclouds/date/internal/SimpleDateFormatDateService.java index aba0e8533d..7a41397e50 100755 --- a/core/src/main/java/org/jclouds/date/internal/SimpleDateFormatDateService.java +++ b/core/src/main/java/org/jclouds/date/internal/SimpleDateFormatDateService.java @@ -142,7 +142,7 @@ public class SimpleDateFormatDateService implements DateService { public static final Pattern NANOS_TO_MILLIS_PATTERN = Pattern .compile(".*[0-9][0-9][0-9][0-9][0-9][0-9]"); - public static final Pattern TZ_PATTERN = Pattern.compile(".*[+-][0-9][0-9]:[0-9][0-9]"); + public static final Pattern TZ_PATTERN = Pattern.compile(".*[+-][0-9][0-9]:?[0-9][0-9]"); private String trimNanosToMillis(String toParse) { if (NANOS_TO_MILLIS_PATTERN.matcher(toParse).matches()) diff --git a/core/src/main/java/org/jclouds/http/functions/UnwrapOnlyNestedJsonValueInSet.java b/core/src/main/java/org/jclouds/http/functions/UnwrapOnlyNestedJsonValueInSet.java new file mode 100644 index 0000000000..5119797240 --- /dev/null +++ b/core/src/main/java/org/jclouds/http/functions/UnwrapOnlyNestedJsonValueInSet.java @@ -0,0 +1,52 @@ +/** + * + * 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.http.functions; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.http.HttpResponse; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; + +/** + * @author Adrian Cole + */ +@Singleton +public class UnwrapOnlyNestedJsonValueInSet implements Function { + + private final UnwrapOnlyNestedJsonValue> json; + + @Inject + UnwrapOnlyNestedJsonValueInSet(UnwrapOnlyNestedJsonValue> json) { + this.json = json; + } + + @Override + public T apply(HttpResponse arg0) { + Set set = json.apply(arg0); + if (set == null || set.size() == 0) + return null; + return Iterables.getOnlyElement(set); + } +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/rest/annotations/Unwrap.java b/core/src/main/java/org/jclouds/rest/annotations/Unwrap.java index 8015ce7995..04bbd1db7e 100644 --- a/core/src/main/java/org/jclouds/rest/annotations/Unwrap.java +++ b/core/src/main/java/org/jclouds/rest/annotations/Unwrap.java @@ -24,9 +24,10 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Retention; import java.lang.annotation.Target; +import java.util.Map; /** - * Unwraps the only value in the json reponse + * Unwraps the only value in a nested json reponse * * ex. { "foo" :"bar" } becomes "bar" * @@ -44,10 +45,27 @@ public @interface Unwrap { * * ex. if (2) * - * { "foo" : {"bar" : "baz} } becomes "baz" + * { "foo" : {"bar" : ["baz"]} } becomes ["baz"] * * @return nestingLevel */ int depth() default 1; + /** + * final collection type + * + * ex. if depth(2), edgeCollection(Map.class) + * + * { "foo" : {"bar" : ["baz"]} } becomes ["baz"] + * + * ex. if depth(3), edgeCollection(Set.class) + * + * { "foo" : {"bar" : ["baz"]} } becomes "baz" + * + *

Note

only Map and Set are valid + * + * @return + */ + Class edgeCollection() default Map.class; + } diff --git a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java index ae3a8854c6..6e3c078879 100755 --- a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java +++ b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java @@ -88,6 +88,7 @@ import org.jclouds.http.functions.ReturnStringIf2xx; import org.jclouds.http.functions.ReturnTrueIf2xx; import org.jclouds.http.functions.UnwrapOnlyJsonValue; import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue; +import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet; import org.jclouds.http.functions.ParseSax.HandlerWithResult; import org.jclouds.http.options.HttpRequestOptions; import org.jclouds.http.utils.ModifyRequest; @@ -785,13 +786,17 @@ public class RestAnnotationProcessor { } ParameterizedType parserType; if (method.isAnnotationPresent(Unwrap.class)) { - int nestingLevel = method.getAnnotation(Unwrap.class).depth(); - if (nestingLevel == 1) + int depth = method.getAnnotation(Unwrap.class).depth(); + Class edgeCollection = method.getAnnotation(Unwrap.class).edgeCollection(); + if (depth == 1 && edgeCollection == Map.class) parserType = Types.newParameterizedType(UnwrapOnlyJsonValue.class, returnVal); - else if (nestingLevel == 2) + else if (depth == 2 && edgeCollection == Map.class) parserType = Types.newParameterizedType(UnwrapOnlyNestedJsonValue.class, returnVal); + else if (depth == 3 && edgeCollection == Set.class) + parserType = Types.newParameterizedType(UnwrapOnlyNestedJsonValueInSet.class, returnVal); else - throw new IllegalStateException("nesting level " + nestingLevel + " not yet supported for @Unwrap"); + throw new IllegalStateException(String.format( + "depth(%d) edgeCollection(%s) not yet supported for @Unwrap", depth, edgeCollection)); } else { parserType = Types.newParameterizedType(ParseJson.class, returnVal); } diff --git a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java index caca04cdc1..436529155f 100755 --- a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java +++ b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java @@ -98,6 +98,7 @@ import org.jclouds.http.functions.ReturnStringIf2xx; import org.jclouds.http.functions.ReturnTrueIf2xx; import org.jclouds.http.functions.UnwrapOnlyJsonValue; import org.jclouds.http.functions.UnwrapOnlyNestedJsonValue; +import org.jclouds.http.functions.UnwrapOnlyNestedJsonValueInSet; import org.jclouds.http.internal.PayloadEnclosingImpl; import org.jclouds.http.options.BaseHttpRequestOptions; import org.jclouds.http.options.GetOptions; @@ -771,6 +772,12 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest { @Consumes(MediaType.APPLICATION_JSON) ListenableFuture> testUnwrapDepth2(); + @GET + @Path("/") + @Unwrap(depth = 3, edgeCollection = Set.class) + @Consumes(MediaType.APPLICATION_JSON) + ListenableFuture testUnwrapDepth3(); + @Target( { ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @HttpMethod("ROWDY") @@ -955,6 +962,50 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest { newStringPayload("{\"runit\":{\"runit\":[\"0.7.0\",\"0.7.1\"]}}"))), ImmutableSet.of("0.7.0", "0.7.1")); } + @SuppressWarnings("unchecked") + public void testUnwrapDepth3() throws SecurityException, NoSuchMethodException, IOException { + Method method = TestPut.class.getMethod("testUnwrapDepth3"); + HttpRequest request = factory(TestPut.class).createRequest(method); + + assertResponseParserClassEquals(method, request, UnwrapOnlyNestedJsonValueInSet.class); + // now test that it works! + + Function> parser = (Function>) RestAnnotationProcessor + .createResponseParser(parserFactory, injector, method, request); + + assertEquals(parser.apply(new HttpResponse(200, "ok", newStringPayload("{\"runit\":{\"runit\":[\"0.7.0\"]}}"))), + "0.7.0"); + } + + @SuppressWarnings("unchecked") + public void testUnwrapDepth3None() throws SecurityException, NoSuchMethodException, IOException { + Method method = TestPut.class.getMethod("testUnwrapDepth3"); + HttpRequest request = factory(TestPut.class).createRequest(method); + + assertResponseParserClassEquals(method, request, UnwrapOnlyNestedJsonValueInSet.class); + // now test that it works! + + Function> parser = (Function>) RestAnnotationProcessor + .createResponseParser(parserFactory, injector, method, request); + + assertEquals(parser.apply(new HttpResponse(200, "ok", newStringPayload("{\"runit\":{\"runit\":[]}}"))), null); + } + + @SuppressWarnings("unchecked") + @Test(expectedExceptions = IllegalArgumentException.class) + public void testUnwrapDepth3TooMany() throws SecurityException, NoSuchMethodException, IOException { + Method method = TestPut.class.getMethod("testUnwrapDepth3"); + HttpRequest request = factory(TestPut.class).createRequest(method); + + assertResponseParserClassEquals(method, request, UnwrapOnlyNestedJsonValueInSet.class); + // now test that it works! + + Function> parser = (Function>) RestAnnotationProcessor + .createResponseParser(parserFactory, injector, method, request); + + parser.apply(new HttpResponse(200, "ok", newStringPayload("{\"runit\":{\"runit\":[\"0.7.0\",\"0.7.1\"]}}"))); + } + static class TestRequestFilter1 implements HttpRequestFilter { public HttpRequest filter(HttpRequest request) throws HttpException { return request; From 1b91cca8c17048de9525cff175b538aa2c7eb35a Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 6 Feb 2011 17:29:52 -0800 Subject: [PATCH 48/81] Issue 464: started read-only features --- sandbox-apis/cloudstack/pom.xml | 135 +++++ .../cloudstack/CloudStackAsyncClient.java | 61 ++ .../jclouds/cloudstack/CloudStackClient.java | 65 ++ .../cloudstack/CloudStackContextBuilder.java | 45 ++ .../CloudStackPropertiesBuilder.java | 45 ++ .../config/CloudStackRestClientModule.java | 80 +++ .../cloudstack/domain/DiskOffering.java | 217 +++++++ .../cloudstack/domain/GuestIPType.java | 58 ++ .../jclouds/cloudstack/domain/Network.java | 564 ++++++++++++++++++ .../cloudstack/domain/NetworkOffering.java | 239 ++++++++ .../cloudstack/domain/NetworkService.java | 150 +++++ .../cloudstack/domain/NetworkType.java | 52 ++ .../cloudstack/domain/ServiceOffering.java | 261 ++++++++ .../cloudstack/domain/StorageType.java | 52 ++ .../jclouds/cloudstack/domain/Template.java | 538 +++++++++++++++++ .../cloudstack/domain/TemplateFilter.java | 57 ++ .../cloudstack/domain/TrafficType.java | 67 +++ .../org/jclouds/cloudstack/domain/Zone.java | 306 ++++++++++ .../features/NetworkAsyncClient.java | 73 +++ .../cloudstack/features/NetworkClient.java | 57 ++ .../features/OfferingAsyncClient.java | 117 ++++ .../cloudstack/features/OfferingClient.java | 96 +++ .../features/TemplateAsyncClient.java | 83 +++ .../cloudstack/features/TemplateClient.java | 65 ++ .../cloudstack/features/ZoneAsyncClient.java | 73 +++ .../cloudstack/features/ZoneClient.java | 56 ++ .../cloudstack/filters/QuerySigner.java | 144 +++++ .../handlers/CloudStackErrorHandler.java | 98 +++ .../options/ListDiskOfferingsOptions.java | 90 +++ .../options/ListNetworkOfferingsOptions.java | 175 ++++++ .../options/ListNetworksOptions.java | 197 ++++++ .../options/ListServiceOfferingsOptions.java | 109 ++++ .../options/ListTemplatesOptions.java | 168 ++++++ .../cloudstack/options/ListZonesOptions.java | 92 +++ .../cloudstack/CloudStackAsyncClientTest.java | 77 +++ .../cloudstack/CloudStackClientLiveTest.java | 147 +++++ .../BaseCloudStackAsyncClientTest.java | 68 +++ .../BaseCloudStackClientLiveTest.java | 97 +++ .../features/NetworkAsyncClientTest.java | 102 ++++ .../features/NetworkClientLiveTest.java | 93 +++ .../features/OfferingAsyncClientTest.java | 209 +++++++ .../features/OfferingClientLiveTest.java | 106 ++++ .../features/TemplateAsyncClientTest.java | 103 ++++ .../features/TemplateClientLiveTest.java | 69 +++ .../features/ZoneAsyncClientTest.java | 112 ++++ .../features/ZoneClientLiveTest.java | 75 +++ .../cloudstack/filters/QuerySignerTest.java | 98 +++ .../handlers/CloudStackErrorHandlerTest.java | 123 ++++ .../options/ListDiskOfferingsOptionsTest.java | 69 +++ .../ListNetworkOfferingsOptionsTest.java | 125 ++++ .../options/ListNetworksOptionsTest.java | 146 +++++ .../ListServiceOfferingsOptionsTest.java | 79 +++ .../options/ListTemplatesOptionsTest.java | 119 ++++ .../options/ListZonesOptionsTest.java | 68 +++ .../cloudstack/src/test/resources/log4j.xml | 170 ++++++ 55 files changed, 6940 insertions(+) create mode 100644 sandbox-apis/cloudstack/pom.xml create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackAsyncClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackContextBuilder.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackPropertiesBuilder.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackRestClientModule.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/DiskOffering.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/GuestIPType.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Network.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkOffering.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkService.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkType.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/ServiceOffering.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/StorageType.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Template.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/TemplateFilter.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/TrafficType.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Zone.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/NetworkAsyncClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/NetworkClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/OfferingAsyncClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/OfferingClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/TemplateAsyncClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/TemplateClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/ZoneAsyncClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/ZoneClient.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/filters/QuerySigner.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/handlers/CloudStackErrorHandler.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListDiskOfferingsOptions.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListNetworkOfferingsOptions.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListNetworksOptions.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListServiceOfferingsOptions.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListTemplatesOptions.java create mode 100644 sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/options/ListZonesOptions.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/CloudStackAsyncClientTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/CloudStackClientLiveTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/BaseCloudStackAsyncClientTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/BaseCloudStackClientLiveTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/NetworkAsyncClientTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/NetworkClientLiveTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/OfferingAsyncClientTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/OfferingClientLiveTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateAsyncClientTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateClientLiveTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/ZoneAsyncClientTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/ZoneClientLiveTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/filters/QuerySignerTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/handlers/CloudStackErrorHandlerTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListDiskOfferingsOptionsTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListNetworkOfferingsOptionsTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListNetworksOptionsTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListServiceOfferingsOptionsTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListTemplatesOptionsTest.java create mode 100644 sandbox-apis/cloudstack/src/test/java/org/jclouds/cloudstack/options/ListZonesOptionsTest.java create mode 100644 sandbox-apis/cloudstack/src/test/resources/log4j.xml diff --git a/sandbox-apis/cloudstack/pom.xml b/sandbox-apis/cloudstack/pom.xml new file mode 100644 index 0000000000..c7508e35c9 --- /dev/null +++ b/sandbox-apis/cloudstack/pom.xml @@ -0,0 +1,135 @@ + + + + 4.0.0 + + org.jclouds + jclouds-project + 1.0-SNAPSHOT + ../../project/pom.xml + + org.jclouds.api + cloudstack + jclouds cloudstack core + jclouds components to access cloudstack + + + + + jclouds-rimu-snapshots-nexus + https://oss.sonatype.org/content/repositories/snapshots + + true + + + + + + http://localhost:8080/client/api + 2.2 + FIXME_apiKey + FIXME_secretKey + + + + org.jclouds + jclouds-core + ${project.version} + + + org.jclouds + jclouds-core + ${project.version} + test-jar + test + + + org.jclouds.driver + jclouds-jsch + ${project.version} + test + + + com.jcraft + jsch + 0.1.42 + test + + + log4j + log4j + 1.2.14 + test + + + org.jclouds.driver + jclouds-log4j + ${project.version} + test + + + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration + integration-test + + test + + + + + test.cloudstack.endpoint + ${test.cloudstack.endpoint} + + + test.cloudstack.apiversion + ${test.cloudstack.apiversion} + + + test.cloudstack.identity + ${test.cloudstack.identity} + + + test.cloudstack.credential + ${test.cloudstack.credential} + + + + + + + + + + + diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackAsyncClient.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackAsyncClient.java new file mode 100644 index 0000000000..5197225349 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackAsyncClient.java @@ -0,0 +1,61 @@ +/** + * + * 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.cloudstack; + +import org.jclouds.cloudstack.features.NetworkAsyncClient; +import org.jclouds.cloudstack.features.OfferingAsyncClient; +import org.jclouds.cloudstack.features.TemplateAsyncClient; +import org.jclouds.cloudstack.features.ZoneAsyncClient; +import org.jclouds.rest.annotations.Delegate; + +/** + * Provides asynchronous access to CloudStack via their REST API. + *

+ * + * @see CloudStackClient + * @see + * @author Adrian Cole + */ +public interface CloudStackAsyncClient { + + /** + * Provides asynchronous access to Zone features. + */ + @Delegate + ZoneAsyncClient getZoneClient(); + + /** + * Provides asynchronous access to Template features. + */ + @Delegate + TemplateAsyncClient getTemplateClient(); + + /** + * Provides asynchronous access to Service, Disk, and Network Offering features. + */ + @Delegate + OfferingAsyncClient getOfferingClient(); + + /** + * Provides asynchronous access to Network features. + */ + @Delegate + NetworkAsyncClient getNetworkClient(); +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackClient.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackClient.java new file mode 100644 index 0000000000..84613de911 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackClient.java @@ -0,0 +1,65 @@ +/** + * + * 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.cloudstack; + +import java.util.concurrent.TimeUnit; + +import org.jclouds.cloudstack.features.NetworkClient; +import org.jclouds.cloudstack.features.OfferingClient; +import org.jclouds.cloudstack.features.TemplateClient; +import org.jclouds.cloudstack.features.ZoneClient; +import org.jclouds.concurrent.Timeout; +import org.jclouds.rest.annotations.Delegate; + +/** + * Provides synchronous access to CloudStack. + *

+ * + * @see CloudStackAsyncClient + * @see + * @author Adrian Cole + */ +@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS) +public interface CloudStackClient { + /** + * Provides synchronous access to Zone features. + */ + @Delegate + ZoneClient getZoneClient(); + + /** + * Provides synchronous access to Template features. + */ + @Delegate + TemplateClient getTemplateClient(); + + /** + * Provides synchronous access to Service, Disk, and Network Offering features. + */ + @Delegate + OfferingClient getOfferingClient(); + + /** + * Provides synchronous access to Network features. + */ + @Delegate + NetworkClient getNetworkClient(); + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackContextBuilder.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackContextBuilder.java new file mode 100644 index 0000000000..396b368eba --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackContextBuilder.java @@ -0,0 +1,45 @@ +/** + * + * 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.cloudstack; + +import java.util.List; +import java.util.Properties; + +import org.jclouds.cloudstack.config.CloudStackRestClientModule; +import org.jclouds.rest.RestContextBuilder; + +import com.google.inject.Module; + +/** + * + * @author Adrian Cole + */ +public class CloudStackContextBuilder extends + RestContextBuilder { + + public CloudStackContextBuilder(Properties props) { + super(CloudStackClient.class, CloudStackAsyncClient.class, props); + } + + protected void addClientModule(List modules) { + modules.add(new CloudStackRestClientModule()); + } + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackPropertiesBuilder.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackPropertiesBuilder.java new file mode 100644 index 0000000000..f9cc073cde --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/CloudStackPropertiesBuilder.java @@ -0,0 +1,45 @@ +/** + * + * 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.cloudstack; + +import static org.jclouds.Constants.PROPERTY_API_VERSION; + +import java.util.Properties; + +import org.jclouds.PropertiesBuilder; + +/** + * Builds properties used in cloudstack Clients + * + * @author Adrian Cole + */ +public class CloudStackPropertiesBuilder extends PropertiesBuilder { + @Override + protected Properties defaultProperties() { + Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_API_VERSION, "2.2"); + return properties; + } + + public CloudStackPropertiesBuilder(Properties properties) { + super(properties); + } + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackRestClientModule.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackRestClientModule.java new file mode 100644 index 0000000000..6a058f964b --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/config/CloudStackRestClientModule.java @@ -0,0 +1,80 @@ +/** + * + * 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.cloudstack.config; + +import java.util.Map; + +import org.jclouds.cloudstack.CloudStackAsyncClient; +import org.jclouds.cloudstack.CloudStackClient; +import org.jclouds.cloudstack.features.NetworkAsyncClient; +import org.jclouds.cloudstack.features.NetworkClient; +import org.jclouds.cloudstack.features.OfferingAsyncClient; +import org.jclouds.cloudstack.features.OfferingClient; +import org.jclouds.cloudstack.features.TemplateAsyncClient; +import org.jclouds.cloudstack.features.TemplateClient; +import org.jclouds.cloudstack.features.ZoneAsyncClient; +import org.jclouds.cloudstack.features.ZoneClient; +import org.jclouds.cloudstack.handlers.CloudStackErrorHandler; +import org.jclouds.http.HttpErrorHandler; +import org.jclouds.http.RequiresHttp; +import org.jclouds.http.annotation.ClientError; +import org.jclouds.http.annotation.Redirection; +import org.jclouds.http.annotation.ServerError; +import org.jclouds.json.config.GsonModule.DateAdapter; +import org.jclouds.json.config.GsonModule.Iso8601DateAdapter; +import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.config.RestClientModule; + +import com.google.common.collect.ImmutableMap; + +/** + * Configures the cloudstack connection. + * + * @author Adrian Cole + */ +@RequiresHttp +@ConfiguresRestClient +public class CloudStackRestClientModule extends RestClientModule { + + public static final Map, Class> DELEGATE_MAP = ImmutableMap., Class> builder()// + .put(ZoneClient.class, ZoneAsyncClient.class)// + .put(TemplateClient.class, TemplateAsyncClient.class)// + .put(OfferingClient.class, OfferingAsyncClient.class)// + .put(NetworkClient.class, NetworkAsyncClient.class)// + .build(); + + public CloudStackRestClientModule() { + super(CloudStackClient.class, CloudStackAsyncClient.class, DELEGATE_MAP); + } + + @Override + protected void configure() { + bind(DateAdapter.class).to(Iso8601DateAdapter.class); + super.configure(); + } + + @Override + protected void bindErrorHandlers() { + bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(CloudStackErrorHandler.class); + bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(CloudStackErrorHandler.class); + bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(CloudStackErrorHandler.class); + } + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/DiskOffering.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/DiskOffering.java new file mode 100644 index 0000000000..02ae5b99a3 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/DiskOffering.java @@ -0,0 +1,217 @@ +/** + * + * 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.cloudstack.domain; + +import java.util.Date; +import java.util.Set; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableSet; +import com.google.gson.annotations.SerializedName; + +/** + * + * @author Adrian Cole + */ +public class DiskOffering { + private String id; + private String name; + @SerializedName("displaytext") + private String displayText; + private Date created; + private String domain; + @SerializedName("domainid") + private String domainId; + @SerializedName("disksize") + private int diskSize; + @SerializedName("iscustomized") + private boolean customized; + private String tags; + + public DiskOffering(String id, String name, String displayText, Date created, String domain, String domainId, + int diskSize, boolean customized, Set tags) { + this.id = id; + this.name = name; + this.displayText = displayText; + this.created = created; + this.domain = domain; + this.domainId = domainId; + this.diskSize = diskSize; + this.customized = customized; + this.tags = Joiner.on(',').join(tags); + } + + /** + * present only for serializer + * + */ + DiskOffering() { + + } + + /** + * + * @return the id of the disk offering + */ + public String getId() { + return id; + } + + /** + * + * @return the name of the disk offering + */ + + public String getName() { + return name; + } + + /** + * + * @return an alternate display text of the disk offering. + */ + public String getDisplayText() { + return displayText; + } + + /** + * + * @return the date this disk offering was created + */ + public Date getCreated() { + return created; + } + + /** + * + * @return Domain name for the offering + */ + public String getDomain() { + return domain; + } + + /** + * + * @return the domain id of the disk offering + */ + public String getDomainId() { + return domainId; + } + + /** + * + * @return the size of the disk offering in GB + */ + public int getDiskSize() { + return diskSize; + } + + /** + * + * @return the ha support in the disk offering + */ + public boolean isCustomized() { + return customized; + } + + /** + * + * @return the tags for the disk offering + */ + public Set getTags() { + return tags != null ? ImmutableSet.copyOf(Splitter.on(',').split(tags)) : ImmutableSet. of(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((created == null) ? 0 : created.hashCode()); + result = prime * result + (customized ? 1231 : 1237); + result = prime * result + diskSize; + result = prime * result + ((displayText == null) ? 0 : displayText.hashCode()); + result = prime * result + ((domain == null) ? 0 : domain.hashCode()); + result = prime * result + ((domainId == null) ? 0 : domainId.hashCode()); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((tags == null) ? 0 : tags.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; + DiskOffering other = (DiskOffering) obj; + if (created == null) { + if (other.created != null) + return false; + } else if (!created.equals(other.created)) + return false; + if (customized != other.customized) + return false; + if (diskSize != other.diskSize) + return false; + if (displayText == null) { + if (other.displayText != null) + return false; + } else if (!displayText.equals(other.displayText)) + return false; + if (domain == null) { + if (other.domain != null) + return false; + } else if (!domain.equals(other.domain)) + return false; + if (domainId == null) { + if (other.domainId != null) + return false; + } else if (!domainId.equals(other.domainId)) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (tags == null) { + if (other.tags != null) + return false; + } else if (!tags.equals(other.tags)) + return false; + return true; + } + + @Override + public String toString() { + return "[id=" + id + ", name=" + name + ", displayText=" + displayText + ", created=" + created + ", diskSize=" + + diskSize + ", iscustomized=" + customized + ", domain=" + domain + ", domainId=" + domainId + + ", tags=" + tags + "]"; + } + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/GuestIPType.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/GuestIPType.java new file mode 100644 index 0000000000..da12fc5461 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/GuestIPType.java @@ -0,0 +1,58 @@ +/** + * + * 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.cloudstack.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.CaseFormat; + +/** + * + * @author Adrian Cole + * @see NetworkOfferingClient#listNetworkOfferings + */ +public enum GuestIPType { + + /** + * guest IP address will be issued by Dhcp server in the guest virtual network. Dhcp role is + * played by domain router. + */ + VIRTUAL, + /** + * traffic directly to the network and VMs created here are assigned an IP directly from the + * network as configured + */ + DIRECT, + + UNRECOGNIZED; + + @Override + public String toString() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name()); + } + + public static GuestIPType fromValue(String type) { + try { + return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(type, "type"))); + } catch (IllegalArgumentException e) { + return UNRECOGNIZED; + } + } +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Network.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Network.java new file mode 100644 index 0000000000..cdda7e7701 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Network.java @@ -0,0 +1,564 @@ +/** + * + * 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.cloudstack.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.List; +import java.util.Set; + +import javax.annotation.Nullable; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableList.Builder; +import com.google.gson.annotations.SerializedName; + +/** + * + * @author Adrian Cole + */ +public class Network { + private String id; + private String account; + @SerializedName("broadcastdomaintype") + private String broadcastDomainType; + @SerializedName("broadcasturi") + private URI broadcastURI; + @SerializedName("displaytext") + private String displayText; + @SerializedName("dns1") + private String DNS1; + @SerializedName("dns2") + private String DNS2; + private String domain; + @Nullable + @SerializedName("domainid") + private String domainId; + @SerializedName("endip") + private String endIP; + private String gateway; + @SerializedName("isdefault") + private boolean isDefault; + @SerializedName("isshared") + private boolean isShared; + @SerializedName("issystem") + private boolean isSystem; + private String netmask; + @SerializedName("networkdomain") + private String networkDomain; + @SerializedName("networkofferingavailability") + private String networkOfferingAvailability; + @SerializedName("networkofferingid") + private String networkOfferingDisplayText; + @SerializedName("networkofferingid") + private String networkOfferingId; + @SerializedName("networkofferingname") + private String networkOfferingName; + private String related; + @SerializedName("startip") + private String startIP; + private String name; + private String state; + @SerializedName("type") + private GuestIPType guestIPType; + @SerializedName("vlan") + private String VLAN; + @SerializedName("traffictype") + private TrafficType trafficType; + @SerializedName("zoneid") + private String zoneId; + @SerializedName("service") + private Set services = ImmutableSet. of(); + + /** + * present only for serializer + * + */ + Network() { + + } + + public Network(String id, String account, String broadcastDomainType, URI broadcastURI, String displayText, + List DNS, String domain, String domainId, String endIP, String gateway, boolean isDefault, + boolean isShared, boolean isSystem, String netmask, String networkDomain, + String networkOfferingAvailability, String networkOfferingDisplayText, String networkOfferingId, + String networkOfferingName, String related, String startIP, String name, String state, GuestIPType type, + String vLAN, TrafficType trafficType, String zoneId, Set services) { + this.id = id; + this.account = account; + this.broadcastDomainType = broadcastDomainType; + this.broadcastURI = broadcastURI; + this.displayText = displayText; + this.DNS1 = checkNotNull(DNS, "DNS").size() > 0 ? DNS.get(0) : null; + this.DNS2 = DNS.size() > 1 ? DNS.get(1) : null; + this.domain = domain; + this.domainId = domainId; + this.endIP = endIP; + this.gateway = gateway; + this.isDefault = isDefault; + this.isShared = isShared; + this.isSystem = isSystem; + this.netmask = netmask; + this.networkDomain = networkDomain; + this.networkOfferingAvailability = networkOfferingAvailability; + this.networkOfferingDisplayText = networkOfferingDisplayText; + this.networkOfferingId = networkOfferingId; + this.networkOfferingName = networkOfferingName; + this.related = related; + this.startIP = startIP; + this.name = name; + this.state = state; + this.guestIPType = type; + this.VLAN = vLAN; + this.trafficType = trafficType; + this.zoneId = zoneId; + this.services = ImmutableSet.copyOf(checkNotNull(services, "services")); + } + + /** + * + * @return network id + */ + public String getId() { + return id; + } + + /** + * + * @return the name of the account to which the template beLongs + */ + public String getAccount() { + return account; + } + + /** + * + * @return Broadcast domain type of the network + */ + public String getBroadcastDomainType() { + return broadcastDomainType; + } + + /** + * + * @return broadcast uri of the network + */ + public URI getBroadcastURI() { + return broadcastURI; + } + + /** + * + * @return the display text of the zone + */ + public String getDisplayText() { + return displayText; + } + + /** + * + * @return the external DNS for the network + */ + public List getDNS() { + Builder builder = ImmutableList.builder(); + if (DNS1 != null && !"".equals(DNS1)) + builder.add(DNS1); + if (DNS2 != null && !"".equals(DNS2)) + builder.add(DNS2); + return builder.build(); + } + + /** + * + * @return Domain name for the Vms in the zone + */ + public String getDomain() { + return domain; + } + + /** + * + * @return the ID of the containing domain, null for public zones + */ + @Nullable + public String getDomainId() { + return domainId; + } + + /** + * + * @return the end ip of the network + */ + public String getEndIP() { + return endIP; + } + + /** + * + * @return the network's gateway + */ + public String getGateway() { + return gateway; + } + + /** + * + * @return true if network offering is default, false otherwise + */ + public boolean isDefault() { + return isDefault; + } + + /** + * + * @return true if network offering is shared, false otherwise + */ + public boolean isShared() { + return isShared; + } + + /** + * + * @return true if network offering is system, false otherwise + */ + public boolean isSystem() { + return isSystem; + } + + /** + * + * @return network name + */ + public String getName() { + return name; + } + + /** + * + * @return the GuestIPType of the network + */ + public GuestIPType getGuestIPType() { + return guestIPType; + } + + /** + * + * @return state of the network + */ + public String getState() { + return state; + } + + /** + * + * @return the vlan range of the zone + */ + public String getVLAN() { + return VLAN; + } + + /** + * + * @return the traffic type for this network offering + */ + public TrafficType getTrafficType() { + return trafficType; + } + + /** + * + * @return the network's netmask + */ + public String getNetmask() { + return netmask; + } + + /** + * + * @return the network domain + */ + public String getNetworkDomain() { + return networkDomain; + } + + /** + * + * @return availability of the network offering the network is created from + */ + public String getNetworkOfferingAvailability() { + return networkOfferingAvailability; + } + + /** + * + * @return display text of the network offering the network is created from + */ + public String getNetworkOfferingDisplayText() { + return networkOfferingDisplayText; + } + + /** + * + * @return network offering id the network is created from + */ + public String getNetworkOfferingId() { + return networkOfferingId; + } + + /** + * + * @return name of the network offering the network is created from + */ + public String getNetworkOfferingName() { + return networkOfferingName; + } + + /** + * + * @return related to what other network configuration + */ + public String getRelated() { + return related; + } + + /** + * + * @return the start ip of the network + */ + public String getStartIP() { + return startIP; + } + + /** + * + * @return zone id of the network + */ + public String getZoneId() { + return zoneId; + } + + /** + * + * @return the list of services + */ + public Set getServices() { + return services; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((DNS1 == null) ? 0 : DNS1.hashCode()); + result = prime * result + ((DNS2 == null) ? 0 : DNS2.hashCode()); + result = prime * result + ((VLAN == null) ? 0 : VLAN.hashCode()); + result = prime * result + ((account == null) ? 0 : account.hashCode()); + result = prime * result + ((broadcastDomainType == null) ? 0 : broadcastDomainType.hashCode()); + result = prime * result + ((broadcastURI == null) ? 0 : broadcastURI.hashCode()); + result = prime * result + ((displayText == null) ? 0 : displayText.hashCode()); + result = prime * result + ((domain == null) ? 0 : domain.hashCode()); + result = prime * result + ((domainId == null) ? 0 : domainId.hashCode()); + result = prime * result + ((endIP == null) ? 0 : endIP.hashCode()); + result = prime * result + ((gateway == null) ? 0 : gateway.hashCode()); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + (isDefault ? 1231 : 1237); + result = prime * result + (isShared ? 1231 : 1237); + result = prime * result + (isSystem ? 1231 : 1237); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((netmask == null) ? 0 : netmask.hashCode()); + result = prime * result + ((networkDomain == null) ? 0 : networkDomain.hashCode()); + result = prime * result + ((networkOfferingAvailability == null) ? 0 : networkOfferingAvailability.hashCode()); + result = prime * result + ((networkOfferingDisplayText == null) ? 0 : networkOfferingDisplayText.hashCode()); + result = prime * result + ((networkOfferingId == null) ? 0 : networkOfferingId.hashCode()); + result = prime * result + ((networkOfferingName == null) ? 0 : networkOfferingName.hashCode()); + result = prime * result + ((related == null) ? 0 : related.hashCode()); + result = prime * result + ((services == null) ? 0 : services.hashCode()); + result = prime * result + ((startIP == null) ? 0 : startIP.hashCode()); + result = prime * result + ((state == null) ? 0 : state.hashCode()); + result = prime * result + ((trafficType == null) ? 0 : trafficType.hashCode()); + result = prime * result + ((guestIPType == null) ? 0 : guestIPType.hashCode()); + result = prime * result + ((zoneId == null) ? 0 : zoneId.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; + Network other = (Network) obj; + if (DNS1 == null) { + if (other.DNS1 != null) + return false; + } else if (!DNS1.equals(other.DNS1)) + return false; + if (DNS2 == null) { + if (other.DNS2 != null) + return false; + } else if (!DNS2.equals(other.DNS2)) + return false; + if (VLAN == null) { + if (other.VLAN != null) + return false; + } else if (!VLAN.equals(other.VLAN)) + return false; + if (account == null) { + if (other.account != null) + return false; + } else if (!account.equals(other.account)) + return false; + if (broadcastDomainType == null) { + if (other.broadcastDomainType != null) + return false; + } else if (!broadcastDomainType.equals(other.broadcastDomainType)) + return false; + if (broadcastURI == null) { + if (other.broadcastURI != null) + return false; + } else if (!broadcastURI.equals(other.broadcastURI)) + return false; + if (displayText == null) { + if (other.displayText != null) + return false; + } else if (!displayText.equals(other.displayText)) + return false; + if (domain == null) { + if (other.domain != null) + return false; + } else if (!domain.equals(other.domain)) + return false; + if (domainId == null) { + if (other.domainId != null) + return false; + } else if (!domainId.equals(other.domainId)) + return false; + if (endIP == null) { + if (other.endIP != null) + return false; + } else if (!endIP.equals(other.endIP)) + return false; + if (gateway == null) { + if (other.gateway != null) + return false; + } else if (!gateway.equals(other.gateway)) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (isDefault != other.isDefault) + return false; + if (isShared != other.isShared) + return false; + if (isSystem != other.isSystem) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (netmask == null) { + if (other.netmask != null) + return false; + } else if (!netmask.equals(other.netmask)) + return false; + if (networkDomain == null) { + if (other.networkDomain != null) + return false; + } else if (!networkDomain.equals(other.networkDomain)) + return false; + if (networkOfferingAvailability == null) { + if (other.networkOfferingAvailability != null) + return false; + } else if (!networkOfferingAvailability.equals(other.networkOfferingAvailability)) + return false; + if (networkOfferingDisplayText == null) { + if (other.networkOfferingDisplayText != null) + return false; + } else if (!networkOfferingDisplayText.equals(other.networkOfferingDisplayText)) + return false; + if (networkOfferingId == null) { + if (other.networkOfferingId != null) + return false; + } else if (!networkOfferingId.equals(other.networkOfferingId)) + return false; + if (networkOfferingName == null) { + if (other.networkOfferingName != null) + return false; + } else if (!networkOfferingName.equals(other.networkOfferingName)) + return false; + if (related == null) { + if (other.related != null) + return false; + } else if (!related.equals(other.related)) + return false; + if (services == null) { + if (other.services != null) + return false; + } else if (!services.equals(other.services)) + return false; + if (startIP == null) { + if (other.startIP != null) + return false; + } else if (!startIP.equals(other.startIP)) + return false; + if (state == null) { + if (other.state != null) + return false; + } else if (!state.equals(other.state)) + return false; + if (trafficType == null) { + if (other.trafficType != null) + return false; + } else if (!trafficType.equals(other.trafficType)) + return false; + if (guestIPType == null) { + if (other.guestIPType != null) + return false; + } else if (!guestIPType.equals(other.guestIPType)) + return false; + if (zoneId == null) { + if (other.zoneId != null) + return false; + } else if (!zoneId.equals(other.zoneId)) + return false; + return true; + } + + @Override + public String toString() { + return "Network [id=" + id + ", state=" + state + ", name=" + name + ", displayText=" + displayText + ", guestIPType=" + + guestIPType + ", trafficType=" + trafficType + ", DNS=" + getDNS() + ", VLAN=" + VLAN + ", account=" + + account + ", startIP=" + startIP + ", endIP=" + endIP + ", netmask=" + netmask + ", gateway=" + + gateway + ", broadcastDomainType=" + broadcastDomainType + ", broadcastURI=" + broadcastURI + + ", services=" + services + ", domain=" + domain + ", domainId=" + domainId + ", isDefault=" + + isDefault + ", isShared=" + isShared + ", isSystem=" + isSystem + ", related=" + related + ", zoneId=" + + zoneId + ", networkDomain=" + networkDomain + ", networkOfferingAvailability=" + + networkOfferingAvailability + ", networkOfferingDisplayText=" + networkOfferingDisplayText + + ", networkOfferingId=" + networkOfferingId + ", networkOfferingName=" + networkOfferingName + "]"; + } + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkOffering.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkOffering.java new file mode 100644 index 0000000000..82f38d7ed0 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkOffering.java @@ -0,0 +1,239 @@ +/** + * + * 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.cloudstack.domain; + +import java.util.Date; +import java.util.Set; + +import javax.annotation.Nullable; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableSet; +import com.google.gson.annotations.SerializedName; + +/** + * + * @author Adrian Cole + */ +public class NetworkOffering { + private String id; + private String name; + @SerializedName("displaytext") + private String displayText; + private Date created; + private String availability; + @SerializedName("maxconnections") + private Integer maxConnections; + @SerializedName("isdefault") + private boolean isDefault; + @SerializedName("specifyvlan") + private boolean supportsVLAN; + @SerializedName("traffictype") + private TrafficType trafficType; + private String tags; + + public NetworkOffering(String id, String name, String displayText, @Nullable Date created, String availability, + boolean supportsVLAN, @Nullable Integer maxConnections, boolean isDefault, TrafficType trafficType, + Set tags) { + this.id = id; + this.name = name; + this.displayText = displayText; + this.created = created; + this.availability = availability; + this.supportsVLAN = supportsVLAN; + this.maxConnections = maxConnections; + this.isDefault = isDefault; + this.trafficType = trafficType; + this.tags = Joiner.on(',').join(tags); + } + + /** + * present only for serializer + * + */ + NetworkOffering() { + + } + + /** + * + * @return the id of the network offering + */ + public String getId() { + return id; + } + + /** + * + * @return the name of the network offering + */ + + public String getName() { + return name; + } + + /** + * + * @return an alternate display text of the network offering. + */ + public String getDisplayText() { + return displayText; + } + + /** + * + * @return the date this network offering was created + */ + @Nullable + public Date getCreated() { + return created; + } + + /** + * + * @return Availability name for the offering + */ + public String getAvailability() { + return availability; + } + + /** + * + * @return true if network offering supports vlans, false otherwise + */ + public boolean supportsVLAN() { + return supportsVLAN; + } + + /** + * + * @return the max number of concurrent connection the network offering supports + */ + @Nullable + public Integer getMaxConnections() { + return maxConnections; + } + + /** + * + * @return true if network offering is default, false otherwise + */ + public boolean isDefault() { + return isDefault; + } + + /** + * + * @return the traffic type for this network offering + */ + public TrafficType getTrafficType() { + return trafficType; + } + + /** + * + * @return the tags for the network offering + */ + public Set getTags() { + return tags != null ? ImmutableSet.copyOf(Splitter.on(',').split(tags)) : ImmutableSet. of(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((availability == null) ? 0 : availability.hashCode()); + result = prime * result + ((created == null) ? 0 : created.hashCode()); + result = prime * result + ((displayText == null) ? 0 : displayText.hashCode()); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + (isDefault ? 1231 : 1237); + result = prime * result + ((maxConnections == null) ? 0 : maxConnections.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + (supportsVLAN ? 1231 : 1237); + result = prime * result + ((tags == null) ? 0 : tags.hashCode()); + result = prime * result + ((trafficType == null) ? 0 : trafficType.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; + NetworkOffering other = (NetworkOffering) obj; + if (availability == null) { + if (other.availability != null) + return false; + } else if (!availability.equals(other.availability)) + return false; + if (created == null) { + if (other.created != null) + return false; + } else if (!created.equals(other.created)) + return false; + if (displayText == null) { + if (other.displayText != null) + return false; + } else if (!displayText.equals(other.displayText)) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (isDefault != other.isDefault) + return false; + if (maxConnections == null) { + if (other.maxConnections != null) + return false; + } else if (!maxConnections.equals(other.maxConnections)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (supportsVLAN != other.supportsVLAN) + return false; + if (tags == null) { + if (other.tags != null) + return false; + } else if (!tags.equals(other.tags)) + return false; + if (trafficType == null) { + if (other.trafficType != null) + return false; + } else if (!trafficType.equals(other.trafficType)) + return false; + return true; + } + + @Override + public String toString() { + return "[id=" + id + ", name=" + name + ", displayText=" + displayText + ", created=" + created + + ", maxConnections=" + maxConnections + ", trafficType=" + trafficType + ", isDefault=" + isDefault + + ", availability=" + availability + ", supportsVLAN=" + supportsVLAN + ", tags=" + tags + "]"; + } + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkService.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkService.java new file mode 100644 index 0000000000..a1c4e6079e --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkService.java @@ -0,0 +1,150 @@ +/** + * + * 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.cloudstack.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Set; + +import com.google.common.collect.ImmutableSet; +import com.google.gson.annotations.SerializedName; + +/** + * + * @author Adrian Cole + */ +public class NetworkService { + public static class Capability { + + private String name; + private String value; + + Capability() { + + } + + public Capability(String name, String value) { + this.name = checkNotNull(name, "name"); + this.value = checkNotNull(value, "value"); + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((value == null) ? 0 : value.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; + NetworkService.Capability other = (NetworkService.Capability) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + + @Override + public String toString() { + return "[name=" + name + ", value=" + value + "]"; + } + + } + + private String name; + @SerializedName("capability") + private Set capabilities = ImmutableSet.of(); + + NetworkService() { + + } + + public NetworkService(String name, Set capabilities) { + this.name = checkNotNull(name, "name"); + this.capabilities = ImmutableSet.copyOf(checkNotNull(capabilities, "capabilities")); + } + + public String getName() { + return name; + } + + public Set getCapabilities() { + return capabilities; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((capabilities == null) ? 0 : capabilities.hashCode()); + result = prime * result + ((name == null) ? 0 : name.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; + NetworkService other = (NetworkService) obj; + if (capabilities == null) { + if (other.capabilities != null) + return false; + } else if (!capabilities.equals(other.capabilities)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + return "[name=" + name + ", capabilities=" + capabilities + "]"; + } +} \ No newline at end of file diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkType.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkType.java new file mode 100644 index 0000000000..2be5914dd8 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/NetworkType.java @@ -0,0 +1,52 @@ +/** + * + * 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.cloudstack.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.cloudstack.features.TemplateClient; + +import com.google.common.base.CaseFormat; + +/** + * + * @author Adrian Cole + * @see TemplateClient#listZones + */ +public enum NetworkType { + BASIC, + + ADVANCED, + + UNRECOGNIZED; + + @Override + public String toString() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name()); + } + + public static NetworkType fromValue(String type) { + try { + return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(type, "type"))); + } catch (IllegalArgumentException e) { + return UNRECOGNIZED; + } + } +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/ServiceOffering.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/ServiceOffering.java new file mode 100644 index 0000000000..d059c47ed3 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/ServiceOffering.java @@ -0,0 +1,261 @@ +/** + * + * 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.cloudstack.domain; + +import java.util.Date; +import java.util.Set; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableSet; +import com.google.gson.annotations.SerializedName; + +/** + * + * @author Adrian Cole + */ +public class ServiceOffering { + private String id; + private String name; + @SerializedName("displaytext") + private String displayText; + private Date created; + private String domain; + @SerializedName("domainid") + private String domainId; + @SerializedName("cpunumber") + private int cpuNumber; + @SerializedName("cpuspeed") + private int cpuSpeed; + private int memory; + @SerializedName("offerha") + private boolean haSupport; + @SerializedName("storagetype") + private StorageType storageType; + private String tags; + + public ServiceOffering(String id, String name, String displayText, Date created, String domain, String domainId, + int cpuNumber, int cpuSpeed, int memory, boolean haSupport, StorageType storageType, Set tags) { + this.id = id; + this.name = name; + this.displayText = displayText; + this.created = created; + this.domain = domain; + this.domainId = domainId; + this.cpuNumber = cpuNumber; + this.cpuSpeed = cpuSpeed; + this.memory = memory; + this.haSupport = haSupport; + this.storageType = storageType; + this.tags = Joiner.on(',').join(tags); + } + + /** + * present only for serializer + * + */ + ServiceOffering() { + + } + + /** + * + * @return the id of the service offering + */ + public String getId() { + return id; + } + + /** + * + * @return the name of the service offering + */ + + public String getName() { + return name; + } + + /** + * + * @return an alternate display text of the service offering. + */ + public String getDisplayText() { + return displayText; + } + + /** + * + * @return the date this service offering was created + */ + public Date getCreated() { + return created; + } + + /** + * + * @return Domain name for the offering + */ + public String getDomain() { + return domain; + } + + /** + * + * @return the domain id of the service offering + */ + public String getDomainId() { + return domainId; + } + + /** + * + * @return the number of CPU + */ + public int getCpuNumber() { + return cpuNumber; + } + + /** + * + * @return the clock rate CPU speed in Mhz + */ + public int getCpuSpeed() { + return cpuSpeed; + } + + /** + * + * @return the memory in MB + */ + public int getMemory() { + return memory; + } + + /** + * + * @return the ha support in the service offering + */ + public boolean supportsHA() { + return haSupport; + } + + /** + * + * @return the storage type for this service offering + */ + public StorageType getStorageType() { + return storageType; + } + + /** + * + * @return the tags for the service offering + */ + public Set getTags() { + return tags != null ? ImmutableSet.copyOf(Splitter.on(',').split(tags)) : ImmutableSet. of(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + cpuNumber; + result = prime * result + cpuSpeed; + result = prime * result + ((created == null) ? 0 : created.hashCode()); + result = prime * result + ((displayText == null) ? 0 : displayText.hashCode()); + result = prime * result + ((domain == null) ? 0 : domain.hashCode()); + result = prime * result + ((domainId == null) ? 0 : domainId.hashCode()); + result = prime * result + (haSupport ? 1231 : 1237); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + memory; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((storageType == null) ? 0 : storageType.hashCode()); + result = prime * result + ((tags == null) ? 0 : tags.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; + ServiceOffering other = (ServiceOffering) obj; + if (cpuNumber != other.cpuNumber) + return false; + if (cpuSpeed != other.cpuSpeed) + return false; + if (created == null) { + if (other.created != null) + return false; + } else if (!created.equals(other.created)) + return false; + if (displayText == null) { + if (other.displayText != null) + return false; + } else if (!displayText.equals(other.displayText)) + return false; + if (domain == null) { + if (other.domain != null) + return false; + } else if (!domain.equals(other.domain)) + return false; + if (domainId == null) { + if (other.domainId != null) + return false; + } else if (!domainId.equals(other.domainId)) + return false; + if (haSupport != other.haSupport) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (memory != other.memory) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (storageType == null) { + if (other.storageType != null) + return false; + } else if (!storageType.equals(other.storageType)) + return false; + if (tags == null) { + if (other.tags != null) + return false; + } else if (!tags.equals(other.tags)) + return false; + return true; + } + + @Override + public String toString() { + return "[id=" + id + ", name=" + name + ", displayText=" + displayText + ", created=" + created + ", cpuNumber=" + + cpuNumber + ", cpuSpeed=" + cpuSpeed + ", memory=" + memory + ", storageType=" + storageType + + ", haSupport=" + haSupport + ", domain=" + domain + ", domainId=" + domainId + ", tags=" + tags + "]"; + } + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/StorageType.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/StorageType.java new file mode 100644 index 0000000000..65897eaee9 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/StorageType.java @@ -0,0 +1,52 @@ +/** + * + * 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.cloudstack.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.cloudstack.features.OfferingClient; + +import com.google.common.base.CaseFormat; + +/** + * + * @author Adrian Cole + * @see OfferingClient#listServiceOfferings + */ +public enum StorageType { + LOCAL, + + SHARED, + + UNRECOGNIZED; + + @Override + public String toString() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()); + } + + public static StorageType fromValue(String type) { + try { + return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(type, "type"))); + } catch (IllegalArgumentException e) { + return UNRECOGNIZED; + } + } +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Template.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Template.java new file mode 100644 index 0000000000..d84b80aa0d --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Template.java @@ -0,0 +1,538 @@ +/** + * + * 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.cloudstack.domain; + +import java.util.Date; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.Nullable; + +import com.google.gson.annotations.SerializedName; + +/** + * + * @author Adrian Cole + */ +public class Template { + + public enum Type { + + USER, BUILTIN, UNRECOGNIZED; + + public static Type fromValue(String type) { + try { + return valueOf(checkNotNull(type, "type")); + } catch (IllegalArgumentException e) { + return UNRECOGNIZED; + } + } + } + + public enum Format { + + VHD, QCOW2, OVA, UNRECOGNIZED; + + public static Format fromValue(String format) { + try { + return valueOf(checkNotNull(format, "format")); + } catch (IllegalArgumentException e) { + return UNRECOGNIZED; + } + } + } + + private String id; + @SerializedName("displaytext") + private String displayText; + private String domain; + @SerializedName("domainid") + private String domainId; + private String account; + @SerializedName("accountid") + private String accountId; + @SerializedName("zonename") + private String zone; + @SerializedName("zoneid") + private String zoneId; + @SerializedName("ostypename") + private String OSType; + @SerializedName("ostypeid") + private String OSTypeId; + private String name; + @SerializedName("templatetype") + private Type type; + private String status; + private Format format; + private String hypervisor; + private Long size; + private Date created; + private Date removed; + @SerializedName("crossZones") + private boolean crossZones; + @SerializedName("bootable") + private boolean bootable; + @SerializedName("isextractable") + private boolean extractable; + @SerializedName("isfeatured") + private boolean featured; + @SerializedName("ispublic") + private boolean ispublic; + @SerializedName("isready") + private boolean ready; + @SerializedName("passwordenabled") + private boolean passwordEnabled; + @Nullable + @SerializedName("jobid") + private String jobId; + @SerializedName("jobstatus") + private String jobStatus; + + public Template(String id, String displayText, String domain, String domainId, String account, String accountId, + String zone, String zoneId, String oSType, String oSTypeId, String name, Type type, String status, + Format format, String hypervisor, Long size, Date created, Date removed, boolean crossZones, + boolean bootable, boolean extractable, boolean featured, boolean ispublic, boolean ready, + boolean passwordEnabled, String jobId, String jobStatus) { + this.id = id; + this.displayText = displayText; + this.domain = domain; + this.domainId = domainId; + this.account = account; + this.accountId = accountId; + this.zone = zone; + this.zoneId = zoneId; + this.OSType = oSType; + this.OSTypeId = oSTypeId; + this.name = name; + this.type = type; + this.status = status; + this.format = format; + this.hypervisor = hypervisor; + this.size = size; + this.created = created; + this.removed = removed; + this.crossZones = crossZones; + this.bootable = bootable; + this.extractable = extractable; + this.featured = featured; + this.ispublic = ispublic; + this.ready = ready; + this.passwordEnabled = passwordEnabled; + this.jobId = jobId; + this.jobStatus = jobStatus; + } + + /** + * present only for serializer + * + */ + Template() { + + } + + /** + * + * @return Template id + */ + public String getId() { + return id; + } + + /** + * + * @return the display text of the template + */ + public String getDisplayText() { + return displayText; + } + + /** + * + * @return the name of the domain to which the template beLongs + */ + public String getDomain() { + return domain; + } + + /** + * + * @return the ID of the domain to which the template beLongs + */ + public String getDomainId() { + return domainId; + } + + /** + * + * @return the name of the account to which the template beLongs + */ + public String getAccount() { + return account; + } + + /** + * + * @return the ID of the account to which the template beLongs + */ + public String getAccountId() { + return accountId; + } + + /** + * + * @return the name of the zone to which the template beLongs + */ + public String getZone() { + return zone; + } + + /** + * + * @return the ID of the zone to which the template beLongs + */ + public String getZoneId() { + return zoneId; + } + + /** + * + * @return the name of the OS type to which the template beLongs + */ + public String getOSType() { + return OSType; + } + + /** + * + * @return the ID of the OS type to which the template beLongs + */ + public String getOSTypeId() { + return OSTypeId; + } + + /** + * + * @return Template name + */ + public String getName() { + return name; + } + + /** + * + * @return + */ + public String getStatus() { + return status; + } + + /** + * + * @return the format of the template. + */ + public Format getFormat() { + return format; + } + + /** + * + * @return the hypervisor on which the template runs + */ + public String getHypervisor() { + return hypervisor; + } + + /** + * + * @return the size of the template in kilobytes + */ + public Long getSize() { + return size; + } + + /** + * + * @return the type of the template + */ + public Type getType() { + return type; + } + + /** + * + * @return the date this template was created + */ + public Date getCreated() { + return created; + } + + /** + * + * @return the date this template was removed + */ + public Date getRemoved() { + return removed; + } + + /** + * + * @return true if the template is managed across all Zones, false otherwise + */ + public boolean isCrossZones() { + return crossZones; + } + + /** + * + * @return true if the ISO is bootable, false otherwise + */ + public boolean isBootable() { + return bootable; + } + + /** + * + * @return true if the template is extractable, false otherwise + */ + public boolean isExtractable() { + return extractable; + } + + /** + * + * @return true if this template is a featured template, false otherwise + */ + public boolean isFeatured() { + return featured; + } + + /** + * + * @return true if this template is a public template, false otherwise + */ + public boolean isPublic() { + return ispublic; + } + + /** + * + * @return true if the template is ready to be deployed from, false otherwise + */ + public boolean isReady() { + return ready; + } + + /** + * + * @return true if the reset password feature is enabled, false otherwise + */ + public boolean isPasswordEnabled() { + return passwordEnabled; + } + + /** + * + * @return shows the current pending asynchronous job ID, or null if current pending jobs are + * acting on the template + */ + @Nullable + public String getJobId() { + return jobId; + } + + /** + * + * @return shows the current pending asynchronous job status + */ + public String getJobStatus() { + return jobStatus; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((OSType == null) ? 0 : OSType.hashCode()); + result = prime * result + ((OSTypeId == null) ? 0 : OSTypeId.hashCode()); + result = prime * result + ((account == null) ? 0 : account.hashCode()); + result = prime * result + ((accountId == null) ? 0 : accountId.hashCode()); + result = prime * result + (bootable ? 1231 : 1237); + result = prime * result + ((created == null) ? 0 : created.hashCode()); + result = prime * result + (crossZones ? 1231 : 1237); + result = prime * result + ((displayText == null) ? 0 : displayText.hashCode()); + result = prime * result + ((domain == null) ? 0 : domain.hashCode()); + result = prime * result + ((domainId == null) ? 0 : domainId.hashCode()); + result = prime * result + (extractable ? 1231 : 1237); + result = prime * result + (featured ? 1231 : 1237); + result = prime * result + ((format == null) ? 0 : format.hashCode()); + result = prime * result + ((hypervisor == null) ? 0 : hypervisor.hashCode()); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + (ispublic ? 1231 : 1237); + result = prime * result + ((jobId == null) ? 0 : jobId.hashCode()); + result = prime * result + ((jobStatus == null) ? 0 : jobStatus.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + (passwordEnabled ? 1231 : 1237); + result = prime * result + (ready ? 1231 : 1237); + result = prime * result + ((removed == null) ? 0 : removed.hashCode()); + result = prime * result + ((size == null) ? 0 : size.hashCode()); + result = prime * result + ((status == null) ? 0 : status.hashCode()); + result = prime * result + ((type == null) ? 0 : type.hashCode()); + result = prime * result + ((zone == null) ? 0 : zone.hashCode()); + result = prime * result + ((zoneId == null) ? 0 : zoneId.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; + Template other = (Template) obj; + if (OSType == null) { + if (other.OSType != null) + return false; + } else if (!OSType.equals(other.OSType)) + return false; + if (OSTypeId == null) { + if (other.OSTypeId != null) + return false; + } else if (!OSTypeId.equals(other.OSTypeId)) + return false; + if (account == null) { + if (other.account != null) + return false; + } else if (!account.equals(other.account)) + return false; + if (accountId == null) { + if (other.accountId != null) + return false; + } else if (!accountId.equals(other.accountId)) + return false; + if (bootable != other.bootable) + return false; + if (created == null) { + if (other.created != null) + return false; + } else if (!created.equals(other.created)) + return false; + if (crossZones != other.crossZones) + return false; + if (displayText == null) { + if (other.displayText != null) + return false; + } else if (!displayText.equals(other.displayText)) + return false; + if (domain == null) { + if (other.domain != null) + return false; + } else if (!domain.equals(other.domain)) + return false; + if (domainId == null) { + if (other.domainId != null) + return false; + } else if (!domainId.equals(other.domainId)) + return false; + if (extractable != other.extractable) + return false; + if (featured != other.featured) + return false; + if (format == null) { + if (other.format != null) + return false; + } else if (!format.equals(other.format)) + return false; + if (hypervisor == null) { + if (other.hypervisor != null) + return false; + } else if (!hypervisor.equals(other.hypervisor)) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (ispublic != other.ispublic) + return false; + if (jobId == null) { + if (other.jobId != null) + return false; + } else if (!jobId.equals(other.jobId)) + return false; + if (jobStatus == null) { + if (other.jobStatus != null) + return false; + } else if (!jobStatus.equals(other.jobStatus)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (passwordEnabled != other.passwordEnabled) + return false; + if (ready != other.ready) + return false; + if (removed == null) { + if (other.removed != null) + return false; + } else if (!removed.equals(other.removed)) + return false; + if (size == null) { + if (other.size != null) + return false; + } else if (!size.equals(other.size)) + return false; + if (status == null) { + if (other.status != null) + return false; + } else if (!status.equals(other.status)) + return false; + if (type == null) { + if (other.type != null) + return false; + } else if (!type.equals(other.type)) + return false; + if (zone == null) { + if (other.zone != null) + return false; + } else if (!zone.equals(other.zone)) + return false; + if (zoneId == null) { + if (other.zoneId != null) + return false; + } else if (!zoneId.equals(other.zoneId)) + return false; + return true; + } + + @Override + public String toString() { + return "[id=" + id + ", name=" + name + ", displayText=" + displayText + ", format=" + format + ", type=" + type + + ", hypervisor=" + hypervisor + ", size=" + size + ", status=" + status + ", created=" + created + + ", removed=" + removed + ", OSType=" + OSType + ", OSTypeId=" + OSTypeId + ", account=" + account + + ", accountId=" + accountId + ", domain=" + domain + ", domainId=" + domainId + ", zone=" + zone + + ", zoneId=" + zoneId + ", ready=" + ready + ", bootable=" + bootable + ", crossZones=" + crossZones + + ", extractable=" + extractable + ", featured=" + featured + ", ispublic=" + ispublic + + ", passwordEnabled=" + passwordEnabled + ", jobId=" + jobId + ", jobStatus=" + jobStatus + "]"; + } + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/TemplateFilter.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/TemplateFilter.java new file mode 100644 index 0000000000..8d03221228 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/TemplateFilter.java @@ -0,0 +1,57 @@ +/** + * + * 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.cloudstack.domain; + +import org.jclouds.cloudstack.features.TemplateClient; + +import com.google.common.base.CaseFormat; + +/** + * + * @author Adrian Cole + * @see TemplateClient#listTemplates + */ +public enum TemplateFilter { + /** + * templates that are featured and are public + */ + FEATURED, + /** + * templates that have been registered/created by the owner + */ + SELF, + /** + * templates that have been registered/created by the owner that can be used to deploy a new VM + */ + SELF_EXECUTABLE, + /** + * all templates that can be used to deploy a new VM + */ + EXECUTABLE, + /** + * templates that are public + */ + COMMUNITY; + + @Override + public String toString() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, name()); + } +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/TrafficType.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/TrafficType.java new file mode 100644 index 0000000000..f19d5f3266 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/TrafficType.java @@ -0,0 +1,67 @@ +/** + * + * 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.cloudstack.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.CaseFormat; + +/** + * + * @author Adrian Cole + * @see NetworkOfferingClient#listNetworkOfferings + */ +public enum TrafficType { + + /** + * traffic to the public internet + */ + PUBLIC, + /** + * VM-to-VM traffic and VMs are assigned a virtual IP created by CloudStack + */ + GUEST, + /** + * System network that only Admin can view, and only when isSystem is specified. + */ + STORAGE, + /** + * System network that only Admin can view, and only when isSystem is specified. + */ + MANAGEMENT, + /** + * System network that only Admin can view, and only when isSystem is specified. + */ + CONTROL, + + UNRECOGNIZED; + @Override + public String toString() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name()); + } + + public static TrafficType fromValue(String type) { + try { + return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(type, "type"))); + } catch (IllegalArgumentException e) { + return UNRECOGNIZED; + } + } +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Zone.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Zone.java new file mode 100644 index 0000000000..752a0f63a3 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/domain/Zone.java @@ -0,0 +1,306 @@ +/** + * + * 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.cloudstack.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.List; + +import javax.annotation.Nullable; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableList.Builder; +import com.google.gson.annotations.SerializedName; + +/** + * + * @author Adrian Cole + */ +public class Zone { + private String id; + private String description; + @SerializedName("displaytext") + private String displayText; + @SerializedName("dns1") + private String DNS1; + @SerializedName("dns2") + private String DNS2; + private String domain; + @Nullable + @SerializedName("domainid") + private String domainId; + @SerializedName("guestcidraddress") + private String guestCIDRAddress; + @SerializedName("internaldns1") + private String internalDNS1; + @SerializedName("internaldns2") + private String internalDNS2; + private String name; + @SerializedName("networktype") + private NetworkType networkType; + private String status; + @SerializedName("vlan") + private String VLAN; + + /** + * present only for serializer + * + */ + Zone() { + + } + + public Zone(String id, String description, String displayText, List DNS, String domain, String domainId, + String guestCIDRAddress, List internalDNS, String name, NetworkType networkType, String status, + String vLAN) { + this.id = id; + this.description = description; + this.displayText = displayText; + this.DNS1 = checkNotNull(DNS, "DNS").size() > 0 ? DNS.get(0) : null; + this.DNS2 = DNS.size() > 1 ? DNS.get(1) : null; + this.domain = domain; + this.domainId = domainId; + this.guestCIDRAddress = guestCIDRAddress; + this.internalDNS1 = checkNotNull(internalDNS, "internalDNS").size() > 0 ? internalDNS.get(0) : null; + this.internalDNS2 = internalDNS.size() > 1 ? internalDNS.get(1) : null; + this.name = name; + this.networkType = networkType; + this.status = status; + this.VLAN = vLAN; + } + + /** + * + * @return Zone id + */ + public String getId() { + return id; + } + + /** + * + * @return Zone description + */ + public String getDescription() { + return description; + } + + /** + * + * @return the display text of the zone + */ + public String getDisplayText() { + return displayText; + } + + /** + * + * @return the external DNS for the Zone + */ + public List getDNS() { + Builder builder = ImmutableList.builder(); + if (DNS1 != null && !"".equals(DNS1)) + builder.add(DNS1); + if (DNS2 != null && !"".equals(DNS2)) + builder.add(DNS2); + return builder.build(); + } + + /** + * + * @return Domain name for the Vms in the zone + */ + public String getDomain() { + return domain; + } + + /** + * + * @return the ID of the containing domain, null for public zones + */ + @Nullable + public String getDomainId() { + return domainId; + } + + /** + * + * @return the guest CIDR address for the Zone + */ + public String getGuestCIDRAddress() { + return guestCIDRAddress; + } + + /** + * + * @return the internal DNS for the Zone + */ + public List getInternalDNS() { + Builder builder = ImmutableList.builder(); + if (internalDNS1 != null && !"".equals(internalDNS1)) + builder.add(internalDNS1); + if (internalDNS2 != null && !"".equals(internalDNS2)) + builder.add(internalDNS2); + return builder.build(); + } + + /** + * + * @return Zone name + */ + public String getName() { + return name; + } + + /** + * + * @return the network type of the zone; can be Basic or Advanced + */ + public NetworkType getNetworkType() { + return networkType; + } + + /** + * + * @return + */ + public String getStatus() { + return status; + } + + /** + * + * @return the vlan range of the zone + */ + public String getVLAN() { + return VLAN; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((DNS1 == null) ? 0 : DNS1.hashCode()); + result = prime * result + ((DNS2 == null) ? 0 : DNS2.hashCode()); + result = prime * result + ((VLAN == null) ? 0 : VLAN.hashCode()); + result = prime * result + ((description == null) ? 0 : description.hashCode()); + result = prime * result + ((displayText == null) ? 0 : displayText.hashCode()); + result = prime * result + ((domain == null) ? 0 : domain.hashCode()); + result = prime * result + ((domainId == null) ? 0 : domainId.hashCode()); + result = prime * result + ((guestCIDRAddress == null) ? 0 : guestCIDRAddress.hashCode()); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((internalDNS1 == null) ? 0 : internalDNS1.hashCode()); + result = prime * result + ((internalDNS2 == null) ? 0 : internalDNS2.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((networkType == null) ? 0 : networkType.hashCode()); + result = prime * result + ((status == null) ? 0 : status.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; + Zone other = (Zone) obj; + if (DNS1 == null) { + if (other.DNS1 != null) + return false; + } else if (!DNS1.equals(other.DNS1)) + return false; + if (DNS2 == null) { + if (other.DNS2 != null) + return false; + } else if (!DNS2.equals(other.DNS2)) + return false; + if (VLAN == null) { + if (other.VLAN != null) + return false; + } else if (!VLAN.equals(other.VLAN)) + return false; + if (description == null) { + if (other.description != null) + return false; + } else if (!description.equals(other.description)) + return false; + if (displayText == null) { + if (other.displayText != null) + return false; + } else if (!displayText.equals(other.displayText)) + return false; + if (domain == null) { + if (other.domain != null) + return false; + } else if (!domain.equals(other.domain)) + return false; + if (domainId == null) { + if (other.domainId != null) + return false; + } else if (!domainId.equals(other.domainId)) + return false; + if (guestCIDRAddress == null) { + if (other.guestCIDRAddress != null) + return false; + } else if (!guestCIDRAddress.equals(other.guestCIDRAddress)) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (internalDNS1 == null) { + if (other.internalDNS1 != null) + return false; + } else if (!internalDNS1.equals(other.internalDNS1)) + return false; + if (internalDNS2 == null) { + if (other.internalDNS2 != null) + return false; + } else if (!internalDNS2.equals(other.internalDNS2)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (networkType == null) { + if (other.networkType != null) + return false; + } else if (!networkType.equals(other.networkType)) + return false; + if (status == null) { + if (other.status != null) + return false; + } else if (!status.equals(other.status)) + return false; + return true; + } + + @Override + public String toString() { + return "[id=" + id + ", status=" + status + ", name=" + name + ", description=" + description + ", displayText=" + + displayText + ", domain=" + domain + ", domainId=" + domainId + ", networkType=" + networkType + + ", guestCIDRAddress=" + guestCIDRAddress + ", VLAN=" + VLAN + ", DNS=" + getDNS() + ", internalDNS=" + + getInternalDNS() + "]"; + } +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/NetworkAsyncClient.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/NetworkAsyncClient.java new file mode 100644 index 0000000000..ab934de3bf --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/NetworkAsyncClient.java @@ -0,0 +1,73 @@ +/** + * + * 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.cloudstack.features; + +import java.util.Set; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.jclouds.cloudstack.domain.Network; +import org.jclouds.cloudstack.filters.QuerySigner; +import org.jclouds.cloudstack.options.ListNetworksOptions; +import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.rest.annotations.QueryParams; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.Unwrap; +import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; +import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Provides asynchronous access to cloudstack via their REST API. + *

+ * + * @see NetworkClient + * @see + * @author Adrian Cole + */ +@RequestFilters(QuerySigner.class) +@QueryParams(keys = "response", values = "json") +public interface NetworkAsyncClient { + + /** + * @see NetworkClient#listNetworks + */ + @GET + @QueryParams(keys = "command", values = "listNetworks") + @Unwrap(depth = 2) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture> listNetworks(ListNetworksOptions... options); + + /** + * @see NetworkClient#getNetwork + */ + @GET + @QueryParams(keys = "command", values = "listNetworks") + @Unwrap(depth = 3, edgeCollection = Set.class) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getNetwork(@QueryParam("id") String id); + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/NetworkClient.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/NetworkClient.java new file mode 100644 index 0000000000..5874c99870 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/NetworkClient.java @@ -0,0 +1,57 @@ +/** + * + * 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.cloudstack.features; + +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.jclouds.cloudstack.domain.Network; +import org.jclouds.cloudstack.options.ListNetworksOptions; +import org.jclouds.concurrent.Timeout; + +/** + * Provides synchronous access to CloudStack network features. + *

+ * + * @see NetworkAsyncClient + * @see + * @author Adrian Cole + */ +@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS) +public interface NetworkClient { + /** + * Lists networks + * + * @param options + * if present, how to constrain the list. + * @return networks matching query, or empty set, if no networks are found + */ + Set listNetworks(ListNetworksOptions... options); + + /** + * get a specific network by id + * + * @param id + * network to get + * @return network or null if not found + */ + Network getNetwork(String id); + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/OfferingAsyncClient.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/OfferingAsyncClient.java new file mode 100644 index 0000000000..46961a8477 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/OfferingAsyncClient.java @@ -0,0 +1,117 @@ +/** + * + * 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.cloudstack.features; + +import java.util.Set; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.jclouds.cloudstack.domain.DiskOffering; +import org.jclouds.cloudstack.domain.NetworkOffering; +import org.jclouds.cloudstack.domain.ServiceOffering; +import org.jclouds.cloudstack.filters.QuerySigner; +import org.jclouds.cloudstack.options.ListDiskOfferingsOptions; +import org.jclouds.cloudstack.options.ListNetworkOfferingsOptions; +import org.jclouds.cloudstack.options.ListServiceOfferingsOptions; +import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.rest.annotations.QueryParams; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.Unwrap; +import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; +import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Provides asynchronous access to cloudstack via their REST API. + *

+ * + * @see OfferingClient + * @see + * @author Adrian Cole + */ +@RequestFilters(QuerySigner.class) +@QueryParams(keys = "response", values = "json") +public interface OfferingAsyncClient { + + /** + * @see OfferingClient#listServiceOfferings + */ + @GET + @QueryParams(keys = "command", values = "listServiceOfferings") + @Unwrap(depth = 2) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture> listServiceOfferings(ListServiceOfferingsOptions... options); + + /** + * @see OfferingClient#getServiceOffering + */ + @GET + @QueryParams(keys = "command", values = "listServiceOfferings") + @Unwrap(depth = 3, edgeCollection = Set.class) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getServiceOffering(@QueryParam("id") String id); + + /** + * @see OfferingClient#listDiskOfferings + */ + @GET + @QueryParams(keys = "command", values = "listDiskOfferings") + @Unwrap(depth = 2) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture> listDiskOfferings(ListDiskOfferingsOptions... options); + + /** + * @see OfferingClient#getDiskOffering + */ + @GET + @QueryParams(keys = "command", values = "listDiskOfferings") + @Unwrap(depth = 3, edgeCollection = Set.class) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getDiskOffering(@QueryParam("id") String id); + + /** + * @see NetworkOfferingClient#listNetworkOfferings + */ + @GET + @QueryParams(keys = "command", values = "listNetworkOfferings") + @Unwrap(depth = 2) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture> listNetworkOfferings(ListNetworkOfferingsOptions... options); + + /** + * @see NetworkOfferingClient#getNetworkOffering + */ + @GET + @QueryParams(keys = "command", values = "listNetworkOfferings") + @Unwrap(depth = 3, edgeCollection = Set.class) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getNetworkOffering(@QueryParam("id") String id); + +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/OfferingClient.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/OfferingClient.java new file mode 100644 index 0000000000..b8453e81f8 --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/OfferingClient.java @@ -0,0 +1,96 @@ +/** + * + * 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.cloudstack.features; + +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import org.jclouds.cloudstack.domain.DiskOffering; +import org.jclouds.cloudstack.domain.NetworkOffering; +import org.jclouds.cloudstack.domain.ServiceOffering; +import org.jclouds.cloudstack.options.ListDiskOfferingsOptions; +import org.jclouds.cloudstack.options.ListNetworkOfferingsOptions; +import org.jclouds.cloudstack.options.ListServiceOfferingsOptions; +import org.jclouds.concurrent.Timeout; + +/** + * Provides synchronous access to CloudStack zone features. + *

+ * + * @see OfferingAsyncClient + * @see + * @author Adrian Cole + */ +@Timeout(duration = 60, timeUnit = TimeUnit.SECONDS) +public interface OfferingClient { + /** + * Lists service offerings + * + * @param options + * if present, how to constrain the list. + * @return service offerings matching query, or empty set, if no service offerings are found + */ + Set listServiceOfferings(ListServiceOfferingsOptions... options); + + /** + * get a specific service offering by id + * + * @param id + * offering to get + * @return service offering or null if not found + */ + ServiceOffering getServiceOffering(String id); + + /** + * Lists disk offerings + * + * @param options + * if present, how to constrain the list. + * @return disk offerings matching query, or empty set, if no disk offerings are found + */ + Set listDiskOfferings(ListDiskOfferingsOptions... options); + + /** + * get a specific disk offering by id + * + * @param id + * offering to get + * @return disk offering or null if not found + */ + DiskOffering getDiskOffering(String id); + + /** + * Lists service offerings + * + * @param options + * if present, how to constrain the list. + * @return service offerings matching query, or empty set, if no service offerings are found + */ + Set listNetworkOfferings(ListNetworkOfferingsOptions... options); + + /** + * get a specific service offering by id + * + * @param id + * offering to get + * @return service offering or null if not found + */ + NetworkOffering getNetworkOffering(String id); +} diff --git a/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/TemplateAsyncClient.java b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/TemplateAsyncClient.java new file mode 100644 index 0000000000..a9fc34f53c --- /dev/null +++ b/sandbox-apis/cloudstack/src/main/java/org/jclouds/cloudstack/features/TemplateAsyncClient.java @@ -0,0 +1,83 @@ +/** + * + * 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.cloudstack.features; + +import java.util.Set; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.jclouds.cloudstack.domain.Template; +import org.jclouds.cloudstack.filters.QuerySigner; +import org.jclouds.cloudstack.options.ListTemplatesOptions; +import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.rest.annotations.QueryParams; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.Unwrap; +import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; +import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Provides asynchronous access to cloudstack via their REST API. + *

+ * + * @see TemplateClient + * @see + * @author Adrian Cole + */ +@RequestFilters(QuerySigner.class) +@QueryParams(keys = "response", values = "json") +public interface TemplateAsyncClient { + + /** + * @see TemplateClient#listTemplates + */ + @GET + @QueryParams(keys = { "command", "templatefilter" }, values = { "listTemplates", "executable" }) + @Unwrap(depth = 2) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture> listTemplates(); + + /** + * @see TemplateClient#listTemplates(ListTemplatesOptions) + */ + @GET + @QueryParams(keys = "command", values = "listTemplates") + @Unwrap(depth = 2) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture> listTemplates(ListTemplatesOptions options); + + /** + * @see TemplateClient#getTemplate + */ + @GET + @QueryParams(keys = { "command", "templatefilter" }, values = { "listTemplates", "executable" }) + @Unwrap(depth = 3, edgeCollection = Set.class) + @Consumes(MediaType.APPLICATION_JSON) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture