From 1a63d627b19c17a9f81645845e86a79394f0f593 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 16 Oct 2010 10:37:26 -0500 Subject: [PATCH 01/17] updated to gson 1.5 --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index 1a0d786cd3..dae3ed8250 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -101,7 +101,7 @@ com.google.code.gson gson - 1.4 + 1.5 com.google.guava From a9de959146d2e0913f41dc661a5338311d06ff9c Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 16 Oct 2010 22:24:22 -0700 Subject: [PATCH 02/17] Issue 377: refactored value classes and tests so that we could test and implement credential storage --- .../aws/ec2/compute/EC2ComputeService.java | 37 +- .../EC2ComputeServiceContextModule.java | 45 +- .../aws/ec2/compute/domain/EC2Hardware.java | 197 -- .../compute/domain/EC2HardwareBuilder.java | 262 +++ .../functions/CredentialsForInstance.java | 79 + .../ec2/compute/functions/ImageParser.java | 45 +- .../RunningInstanceToNodeMetadata.java | 158 +- .../internal/EC2TemplateBuilderImpl.java | 14 +- ...rityGroupsAsNeededAndReturnRunOptions.java | 34 +- .../strategy/EC2GetNodeMetadataStrategy.java | 10 +- .../strategy/EC2ListNodesStrategy.java | 21 +- ...faultLoginCredentialsForImageStrategy.java | 15 +- .../EC2RunNodesAndAddToSetStrategy.java | 53 +- .../suppliers/EC2HardwareSupplier.java | 33 +- .../RegionAndNameToImageSupplier.java | 18 +- .../aws/ec2/xml/BaseReservationHandler.java | 16 +- .../xml/DescribeImagesResponseHandler.java | 9 +- ...teAndBlobStoreTogetherHappilyLiveTest.java | 4 + .../aws/CredentialsStoredInBlobStoreTest.java | 102 + .../ec2/compute/EC2ComputeServiceTest.java | 75 +- .../functions/CredentialsForInstanceTest.java | 879 ++++++++ .../compute/functions/ImageParserTest.java | 712 ++----- .../RunningInstanceToNodeMetadataTest.java | 1845 +++++++++-------- .../internal/EC2TemplateBuilderImplTest.java | 53 +- ...GroupsAsNeededAndReturnRunOptionsTest.java | 13 +- .../EC2RunNodesAndAddToSetStrategyTest.java | 45 +- .../DescribeImagesResponseHandlerTest.java | 86 +- .../DescribeInstancesResponseHandlerTest.java | 141 +- .../resources/ec2/describe_instances_nova.xml | 2 +- .../domain/internal/StorageMetadataImpl.java | 53 +- .../compute/ComputeServiceContext.java | 16 + .../domain/ComputeMetadataBuilder.java | 90 + .../compute/domain/HardwareBuilder.java | 124 ++ .../jclouds/compute/domain/ImageBuilder.java | 107 + .../compute/domain/NodeMetadataBuilder.java | 148 ++ .../domain/OperatingSystemBuilder.java | 80 + .../jclouds/compute/domain/VolumeBuilder.java | 80 + .../domain/internal/ComputeMetadataImpl.java | 23 +- .../compute/domain/internal/HardwareImpl.java | 25 +- .../compute/domain/internal/ImageImpl.java | 9 +- .../domain/internal/NodeMetadataImpl.java | 36 +- .../compute/internal/BaseComputeService.java | 127 +- .../internal/ComputeServiceContextImpl.java | 21 +- .../compute/predicates/ImagePredicates.java | 32 +- .../StubComputeServiceContextModule.java | 226 +- .../compute/util/ComputeServiceUtils.java | 60 +- .../jclouds/compute/util/ComputeUtils.java | 53 +- .../compute/BaseComputeServiceLiveTest.java | 9 + .../StubComputeServiceIntegrationTest.java | 50 +- .../internal/TemplateBuilderImplTest.java | 151 +- .../org/jclouds/collect/AbstractMapEntry.java | 43 + .../org/jclouds/collect/InputSupplierMap.java | 190 ++ .../org/jclouds/collect/TransformingMap.java | 156 ++ .../domain/ResourceMetadataBuilder.java | 64 + .../domain/internal/ResourceMetadataImpl.java | 26 +- .../rest/ConfiguresCredentialStore.java} | 24 +- .../java/org/jclouds/rest/RestContext.java | 17 +- .../org/jclouds/rest/RestContextBuilder.java | 31 +- .../rest/config/CredentialStoreModule.java | 182 ++ .../rest/internal/RestContextImpl.java | 24 +- .../src/main/java/org/jclouds/util/Utils.java | 8 +- .../rest/CredentialStoreModuleTest.java | 169 ++ .../jclouds/rest/RestContextBuilderTest.java | 24 + .../functions/ServerToNodeMetadata.java | 46 +- .../suppliers/GoGridHardwareSupplier.java | 38 +- .../suppliers/GoGridImageSupplier.java | 52 +- ...oudServersComputeServiceContextModule.java | 69 +- .../functions/CloudServersImageToImage.java | 56 + .../CloudServersImageToOperatingSystem.java | 71 + .../compute/functions/FlavorToHardware.java | 44 + .../functions/ServerToNodeMetadata.java | 66 +- .../CloudServersAddNodeWithTagStrategy.java | 28 +- .../CloudServersHardwareSupplier.java | 35 +- .../suppliers/CloudServersImageSupplier.java | 56 +- .../CloudServersImageToImageTest.java | 59 + .../functions/FlavorToHardwareTest.java | 68 + .../functions/ServerToNodeMetadataTest.java | 216 +- .../ParseFlavorFromJsonResponseTest.java | 22 +- .../ParseImageFromJsonResponseTest.java | 20 +- .../ParseServerFromJsonResponseTest.java | 19 +- .../functions/ServerToNodeMetadata.java | 50 +- .../RimuHostingAddNodeWithTagStrategy.java | 35 +- .../RimuHostingHardwareSupplier.java | 11 +- .../suppliers/RimuHostingImageSupplier.java | 57 +- .../SlicehostComputeServiceContextModule.java | 30 +- .../compute/functions/FlavorToHardware.java | 44 + .../functions/SliceToNodeMetadata.java | 85 +- .../functions/SlicehostImageToImage.java | 55 + .../SlicehostImageToOperatingSystem.java | 71 + .../SlicehostAddNodeWithTagStrategy.java | 42 +- .../suppliers/SlicehostHardwareSupplier.java | 30 +- .../suppliers/SlicehostImageSupplier.java | 52 +- .../functions/FlavorToHardwareTest.java | 68 + .../functions/SliceToNodeMetadataTest.java | 164 ++ .../functions/SlicehostImageToImageTest.java | 63 + .../slicehost/xml/FlavorHandlerTest.java | 21 +- .../slicehost/xml/ImageHandlerTest.java | 59 + .../slicehost/xml/ImagesHandlerTest.java | 73 + .../slicehost/xml/SliceHandlerTest.java | 30 +- .../slicehost/xml/SlicesHandlerTest.java | 2 +- .../src/test/resources/test_get_image.xml | 7 + .../src/test/resources/test_get_slice.xml | 2 +- .../compute/VCloudExpressComputeClient.java | 4 +- .../VCloudComputeServiceContextModule.java | 13 +- ...oudExpressComputeServiceContextModule.java | 5 + .../compute/domain/VCloudExpressImage.java | 55 - .../vcloud/compute/domain/VCloudImage.java | 55 - .../compute/functions/HardwareForVApp.java | 28 +- .../functions/HardwareForVAppTemplate.java | 28 +- .../HardwareForVCloudExpressVApp.java | 28 +- .../functions/ImageForVAppTemplate.java | 27 +- .../ImageForVCloudExpressVAppTemplate.java | 40 +- .../ResourceAllocationsToVolumes.java | 29 +- .../compute/functions/VAppToNodeMetadata.java | 81 + .../VCloudExpressVAppToNodeMetadata.java | 87 + .../CommonVCloudComputeClientImpl.java | 20 - .../VCloudExpressComputeClientImpl.java | 15 +- .../VCloudExpressAddNodeWithTagStrategy.java | 41 +- .../VCloudExpressGetNodeMetadataStrategy.java | 50 +- .../VCloudExpressListNodesStrategy.java | 17 +- .../VCloudGetNodeMetadataStrategy.java | 47 +- .../strategy/VCloudListNodesStrategy.java | 13 +- .../suppliers/StaticHardwareSupplier.java | 16 +- .../compute/TerremarkVCloudComputeClient.java | 105 +- .../TerremarkVCloudComputeService.java | 28 +- ...markVCloudComputeServiceContextModule.java | 12 +- ...emarkVCloudExpressVAppToNodeMetadata.java} | 39 +- ...TerremarkVCloudAddNodeWithTagStrategy.java | 23 +- .../TerremarkVCloudComputeClientTest.java | 33 +- 129 files changed, 6918 insertions(+), 3518 deletions(-) delete mode 100644 aws/core/src/main/java/org/jclouds/aws/ec2/compute/domain/EC2Hardware.java create mode 100644 aws/core/src/main/java/org/jclouds/aws/ec2/compute/domain/EC2HardwareBuilder.java create mode 100644 aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstance.java create mode 100644 aws/core/src/test/java/org/jclouds/aws/CredentialsStoredInBlobStoreTest.java create mode 100644 aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstanceTest.java create mode 100644 compute/src/main/java/org/jclouds/compute/domain/ComputeMetadataBuilder.java create mode 100644 compute/src/main/java/org/jclouds/compute/domain/HardwareBuilder.java create mode 100644 compute/src/main/java/org/jclouds/compute/domain/ImageBuilder.java create mode 100644 compute/src/main/java/org/jclouds/compute/domain/NodeMetadataBuilder.java create mode 100644 compute/src/main/java/org/jclouds/compute/domain/OperatingSystemBuilder.java create mode 100644 compute/src/main/java/org/jclouds/compute/domain/VolumeBuilder.java create mode 100644 core/src/main/java/org/jclouds/collect/AbstractMapEntry.java create mode 100644 core/src/main/java/org/jclouds/collect/InputSupplierMap.java create mode 100644 core/src/main/java/org/jclouds/collect/TransformingMap.java create mode 100644 core/src/main/java/org/jclouds/domain/ResourceMetadataBuilder.java rename core/src/main/java/{com/google/gson/ExposedEscaper.java => org/jclouds/rest/ConfiguresCredentialStore.java} (65%) create mode 100644 core/src/main/java/org/jclouds/rest/config/CredentialStoreModule.java create mode 100755 core/src/test/java/org/jclouds/rest/CredentialStoreModuleTest.java create mode 100644 rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToImage.java create mode 100644 rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToOperatingSystem.java create mode 100644 rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/FlavorToHardware.java create mode 100644 rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToImageTest.java create mode 100644 rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/FlavorToHardwareTest.java create mode 100644 slicehost/src/main/java/org/jclouds/slicehost/compute/functions/FlavorToHardware.java create mode 100644 slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SlicehostImageToImage.java create mode 100644 slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SlicehostImageToOperatingSystem.java create mode 100644 slicehost/src/test/java/org/jclouds/slicehost/compute/functions/FlavorToHardwareTest.java create mode 100644 slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java create mode 100644 slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SlicehostImageToImageTest.java create mode 100644 slicehost/src/test/java/org/jclouds/slicehost/xml/ImageHandlerTest.java create mode 100644 slicehost/src/test/java/org/jclouds/slicehost/xml/ImagesHandlerTest.java create mode 100644 slicehost/src/test/resources/test_get_image.xml delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudExpressImage.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudImage.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java rename vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/{strategy/TerremarkVCloudGetNodeMetadataStrategy.java => functions/TerremarkVCloudExpressVAppToNodeMetadata.java} (65%) diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java index c968259751..dcb9619252 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java @@ -24,8 +24,8 @@ import static org.jclouds.aws.ec2.util.EC2Utils.parseHandle; import static org.jclouds.util.Utils.checkNotEmpty; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.ExecutorService; import javax.inject.Inject; @@ -56,6 +56,7 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.compute.util.ComputeUtils; +import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import com.google.common.annotations.VisibleForTesting; @@ -75,21 +76,21 @@ public class EC2ComputeService extends BaseComputeService { private final Predicate placementGroupDeleted; @Inject - protected EC2ComputeService(ComputeServiceContext context, Supplier> images, - Supplier> sizes, Supplier> locations, - ListNodesStrategy listNodesStrategy, GetNodeMetadataStrategy getNodeMetadataStrategy, - RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, - DestroyNodeStrategy destroyNodeStrategy, Provider templateBuilderProvider, - Provider templateOptionsProvider, - @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, EC2Client ec2Client, - Map credentialsMap, @Named("SECURITY") Map securityGroupMap, - @Named("PLACEMENT") Map placementGroupMap, - @Named("DELETED") Predicate placementGroupDeleted) { - super(context, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, runNodesAndAddToSetStrategy, - rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, - nodeTerminated, utils, timeouts, executor); + protected EC2ComputeService(ComputeServiceContext context, Map credentialStore, + Supplier> images, Supplier> sizes, + Supplier> locations, ListNodesStrategy listNodesStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, + Provider templateBuilderProvider, Provider templateOptionsProvider, + @Named("NODE_RUNNING") Predicate nodeRunning, + @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, EC2Client ec2Client, + Map credentialsMap, @Named("SECURITY") Map securityGroupMap, + @Named("PLACEMENT") Map placementGroupMap, + @Named("DELETED") Predicate placementGroupDeleted) { + super(context, credentialStore, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, + runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, + templateOptionsProvider, nodeRunning, nodeTerminated, utils, timeouts, executor); this.ec2Client = ec2Client; this.credentialsMap = credentialsMap; this.securityGroupMap = securityGroupMap; @@ -105,8 +106,8 @@ public class EC2ComputeService extends BaseComputeService { 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)); + checkState(placementGroupDeleted.apply(new PlacementGroup(region, group, "cluster", State.PENDING)), + String.format("placementGroup region(%s) name(%s) failed to delete", region, group)); placementGroupMap.remove(new RegionAndName(region, tag)); logger.debug("<< deleted placementGroup(%s)", group); } catch (AWSResponseException e) { diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java index e126db52c1..ad56c28f01 100755 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java @@ -31,7 +31,6 @@ import static org.jclouds.compute.domain.OsFamily.UBUNTU; import java.security.SecureRandom; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; import javax.inject.Named; @@ -44,7 +43,9 @@ import org.jclouds.aws.ec2.compute.domain.RegionAndName; import org.jclouds.aws.ec2.compute.functions.CreatePlacementGroupIfNeeded; import org.jclouds.aws.ec2.compute.functions.CreateSecurityGroupIfNeeded; import org.jclouds.aws.ec2.compute.functions.CreateUniqueKeyPair; +import org.jclouds.aws.ec2.compute.functions.CredentialsForInstance; import org.jclouds.aws.ec2.compute.functions.RegionAndIdToImage; +import org.jclouds.aws.ec2.compute.functions.RunningInstanceToNodeMetadata; import org.jclouds.aws.ec2.compute.internal.EC2TemplateBuilderImpl; import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions; import org.jclouds.aws.ec2.compute.strategy.EC2DestroyLoadBalancerStrategy; @@ -57,6 +58,7 @@ import org.jclouds.aws.ec2.compute.strategy.EC2RunNodesAndAddToSetStrategy; import org.jclouds.aws.ec2.compute.suppliers.EC2HardwareSupplier; import org.jclouds.aws.ec2.compute.suppliers.EC2LocationSupplier; import org.jclouds.aws.ec2.compute.suppliers.RegionAndNameToImageSupplier; +import org.jclouds.aws.ec2.domain.InstanceState; import org.jclouds.aws.ec2.domain.KeyPair; import org.jclouds.aws.ec2.domain.PlacementGroup; import org.jclouds.aws.ec2.domain.RunningInstance; @@ -70,6 +72,8 @@ import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.config.ComputeServiceTimeoutsModule; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.options.TemplateOptions; @@ -80,6 +84,7 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.LoadBalanceNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.RestContext; @@ -92,6 +97,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Splitter; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.MapMaker; import com.google.common.collect.Sets; import com.google.inject.Injector; @@ -107,6 +113,19 @@ import com.google.inject.TypeLiteral; */ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextModule { + public static final Map instanceToNodeState = ImmutableMap + . builder().put(InstanceState.PENDING, NodeState.PENDING) + .put(InstanceState.RUNNING, NodeState.RUNNING).put(InstanceState.SHUTTING_DOWN, NodeState.PENDING) + .put(InstanceState.TERMINATED, NodeState.TERMINATED).put(InstanceState.STOPPING, NodeState.PENDING) + .put(InstanceState.STOPPED, NodeState.SUSPENDED).put(InstanceState.UNRECOGNIZED, NodeState.UNRECOGNIZED) + .build(); + + @Singleton + @Provides + Map provideServerToNodeState() { + return instanceToNodeState; + } + @Provides @Singleton @Named("PRESENT") @@ -134,6 +153,10 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod bind(TemplateBuilder.class).to(EC2TemplateBuilderImpl.class); bind(TemplateOptions.class).to(EC2TemplateOptions.class); bind(ComputeService.class).to(EC2ComputeService.class); + bind(new TypeLiteral>() { + }).to(RunningInstanceToNodeMetadata.class); + bind(new TypeLiteral>() { + }).to(CredentialsForInstance.class); bind(new TypeLiteral() { }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); @@ -220,28 +243,28 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod @Provides @Singleton - protected ConcurrentMap provideImageMap(RegionAndIdToImage regionAndIdToImage) { + protected Map provideImageMap(RegionAndIdToImage regionAndIdToImage) { return new MapMaker().makeComputingMap(regionAndIdToImage); } @Provides @Singleton protected Supplier> provideRegionAndNameToImageSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final RegionAndNameToImageSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final RegionAndNameToImageSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); + authException, seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); } @Override protected Supplier> getSourceImageSupplier(Injector injector) { Supplier> map = injector.getInstance(Key - .get(new TypeLiteral>>() { - })); + .get(new TypeLiteral>>() { + })); return Suppliers.compose(new Function, Set>() { @Override public Set apply(Map from) { diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/domain/EC2Hardware.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/domain/EC2Hardware.java deleted file mode 100644 index f96cc46414..0000000000 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/domain/EC2Hardware.java +++ /dev/null @@ -1,197 +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.aws.ec2.compute.domain; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Predicates.not; -import static org.jclouds.compute.predicates.ImagePredicates.any; -import static org.jclouds.compute.predicates.ImagePredicates.idIn; -import static org.jclouds.compute.predicates.ImagePredicates.is64Bit; - -import java.util.Arrays; - -import org.jclouds.aws.ec2.domain.InstanceType; -import org.jclouds.aws.ec2.domain.RootDeviceType; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.Volume; -import org.jclouds.compute.domain.internal.HardwareImpl; -import org.jclouds.compute.domain.internal.VolumeImpl; -import org.jclouds.domain.Location; - -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; - -/** - * - * @author Adrian Cole - * @see - */ -public class EC2Hardware extends HardwareImpl { - /** The serialVersionUID */ - private static final long serialVersionUID = 8605688733788974797L; - private final String instanceType; - - /** - * evaluates true if the Image has the following rootDeviceType - * - * @param type - * rootDeviceType of the image - * @return predicate - */ - public static Predicate hasRootDeviceType(final RootDeviceType type) { - checkNotNull(type, "type must be defined"); - return new Predicate() { - @Override - public boolean apply(Image image) { - return type.toString().equals(image.getUserMetadata().get("rootDeviceType")); - } - - @Override - public String toString() { - return "hasRootDeviceType(" + type + ")"; - } - }; - } - - EC2Hardware(String instanceType, Iterable processors, Integer ram, - Iterable volumes, RootDeviceType rootDeviceType) { - this(null, instanceType, processors, ram, volumes, hasRootDeviceType(rootDeviceType)); - } - - EC2Hardware(Location location, String instanceType, Iterable processors, Integer ram, - Iterable volumes, Predicate supportsImage) { - super(instanceType, instanceType, instanceType, location, null, ImmutableMap. of(), processors, - ram, volumes, supportsImage); - this.instanceType = instanceType; - } - - EC2Hardware(String instanceType, Iterable processors, Integer ram, - Iterable volumes, boolean is64Bit) { - this(null, instanceType, processors, ram, volumes, is64Bit ? is64Bit() : not(is64Bit())); - } - - public EC2Hardware(Location location, String instanceType, Iterable processors, Integer ram, - Iterable volumes, String[] ids) { - this(location, instanceType, processors, ram, volumes, (ids.length == 0 ? is64Bit() : idIn(Arrays.asList(ids)))); - } - - /** - * Returns the EC2 InstanceType associated with this size. - */ - public String getInstanceType() { - return instanceType; - } - - /** - * @see InstanceType#M1_SMALL - */ - public static final EC2Hardware M1_SMALL = new EC2Hardware(InstanceType.M1_SMALL, ImmutableList.of(new Processor( - 1.0, 1.0)), 1740, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(150.0f, - "/dev/sda2", false, false)), false); - /** - * In Nova, m1.small can run 64bit images. - * - * @see InstanceType#M1_SMALL - */ - public static final EC2Hardware M1_SMALL_NOVA = new EC2Hardware(null, InstanceType.M1_SMALL, ImmutableList - .of(new Processor(1.0, 1.0)), 1740, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), - new VolumeImpl(150.0f, "/dev/sda2", false, false)), any()); - - /** - * @see InstanceType#T1_MICRO - */ - public static final EC2Hardware T1_MICRO = new EC2Hardware(InstanceType.T1_MICRO, ImmutableList.of(new Processor( - 1.0, 1.0)), 630, ImmutableList. of(), RootDeviceType.EBS); - /** - * @see InstanceType#M1_LARGE - */ - public static final EC2Hardware M1_LARGE = new EC2Hardware(InstanceType.M1_LARGE, ImmutableList.of(new Processor( - 2.0, 2.0)), 7680, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(420.0f, - "/dev/sdb", false, false), new VolumeImpl(420.0f, "/dev/sdc", false, false)), true); - - /** - * @see InstanceType#M1_XLARGE - */ - public static final EC2Hardware M1_XLARGE = new EC2Hardware(InstanceType.M1_XLARGE, ImmutableList.of(new Processor( - 4.0, 2.0)), 15360, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(420.0f, - "/dev/sdb", false, false), new VolumeImpl(420.0f, "/dev/sdc", false, false), new VolumeImpl(420.0f, - "/dev/sdd", false, false), new VolumeImpl(420.0f, "/dev/sde", false, false)), true); - /** - * @see InstanceType#M2_XLARGE - */ - public static final EC2Hardware M2_XLARGE = new EC2Hardware(InstanceType.M2_XLARGE, ImmutableList.of(new Processor( - 2.0, 3.25)), 17510, ImmutableList.of(new VolumeImpl(420.0f, "/dev/sda1", true, false)), true); - /** - * @see InstanceType#M2_2XLARGE - */ - public static final EC2Hardware M2_2XLARGE = new EC2Hardware(InstanceType.M2_2XLARGE, ImmutableList - .of(new Processor(4.0, 3.25)), 35020, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), - new VolumeImpl(840.0f, "/dev/sdb", false, false)), true); - /** - * @see InstanceType#M2_4XLARGE - */ - public static final EC2Hardware M2_4XLARGE = new EC2Hardware(InstanceType.M2_4XLARGE, ImmutableList - .of(new Processor(8.0, 3.25)), 70041, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), - new VolumeImpl(840.0f, "/dev/sdb", false, false), new VolumeImpl(840.0f, "/dev/sdc", false, false)), true); - /** - * @see InstanceType#C1_MEDIUM - */ - public static final EC2Hardware C1_MEDIUM = new EC2Hardware(InstanceType.C1_MEDIUM, ImmutableList.of(new Processor( - 2.0, 2.5)), 1740, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(340.0f, - "/dev/sda2", false, false)), false); - - /** - * @see InstanceType#C1_XLARGE - */ - public static final EC2Hardware C1_XLARGE = new EC2Hardware(InstanceType.C1_XLARGE, ImmutableList.of(new Processor( - 8.0, 2.5)), 7168, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(420.0f, - "/dev/sdb", false, false), new VolumeImpl(420.0f, "/dev/sdc", false, false), new VolumeImpl(420.0f, - "/dev/sdd", false, false), new VolumeImpl(420.0f, "/dev/sde", false, false)), true); - - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + ((instanceType == null) ? 0 : instanceType.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; - EC2Hardware other = (EC2Hardware) obj; - if (instanceType == null) { - if (other.instanceType != null) - return false; - } else if (!instanceType.equals(other.instanceType)) - return false; - return true; - } - -} diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/domain/EC2HardwareBuilder.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/domain/EC2HardwareBuilder.java new file mode 100644 index 0000000000..a234c39968 --- /dev/null +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/domain/EC2HardwareBuilder.java @@ -0,0 +1,262 @@ +/** + * + * 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.domain; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.predicates.ImagePredicates.idIn; + +import java.net.URI; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.jclouds.aws.ec2.domain.InstanceType; +import org.jclouds.aws.ec2.domain.RootDeviceType; +import org.jclouds.compute.domain.HardwareBuilder; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.Processor; +import org.jclouds.compute.domain.Volume; +import org.jclouds.compute.domain.internal.VolumeImpl; +import org.jclouds.domain.Location; + +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; + +/** + * + * @author Adrian Cole + * @see + */ +public class EC2HardwareBuilder extends HardwareBuilder { + + /** + * evaluates true if the Image has the following rootDeviceType + * + * @param type + * rootDeviceType of the image + * @return predicate + */ + public static class HasRootDeviceType implements Predicate { + final RootDeviceType type; + + public HasRootDeviceType(final RootDeviceType type) { + + this.type = checkNotNull(type, "type must be defined"); + } + + @Override + public boolean apply(Image image) { + return type.toString().equals(image.getUserMetadata().get("rootDeviceType")); + } + + @Override + public String toString() { + return "hasRootDeviceType(" + type + ")"; + } + + } + + public EC2HardwareBuilder(String instanceType) { + super(); + ids(instanceType); + } + + public EC2HardwareBuilder rootDeviceType(RootDeviceType rootDeviceType) { + supportsImage(new HasRootDeviceType(rootDeviceType)); + return this; + } + + public EC2HardwareBuilder supportsImageIds(String... ids) { + checkArgument(ids != null && ids.length > 0, "ids must be specified"); + supportsImage(idIn(Arrays.asList(ids))); + return this; + } + + public EC2HardwareBuilder ids(String id) { + return EC2HardwareBuilder.class.cast(super.ids(id)); + } + + public EC2HardwareBuilder ram(int ram) { + return EC2HardwareBuilder.class.cast(super.ram(ram)); + } + + public EC2HardwareBuilder processors(List processors) { + return EC2HardwareBuilder.class.cast(super.processors(processors)); + } + + public EC2HardwareBuilder volumes(List volumes) { + return EC2HardwareBuilder.class.cast(super.volumes(volumes)); + } + + public EC2HardwareBuilder supportsImage(Predicate supportsImage) { + return EC2HardwareBuilder.class.cast(super.supportsImage(supportsImage)); + } + + public EC2HardwareBuilder is64Bit(boolean is64Bit) { + return EC2HardwareBuilder.class.cast(super.is64Bit(is64Bit)); + } + + public EC2HardwareBuilder id(String id) { + return EC2HardwareBuilder.class.cast(super.id(id)); + } + + @Override + public EC2HardwareBuilder providerId(String providerId) { + return EC2HardwareBuilder.class.cast(super.providerId(providerId)); + } + + @Override + public EC2HardwareBuilder name(String name) { + return EC2HardwareBuilder.class.cast(super.name(name)); + } + + @Override + public EC2HardwareBuilder location(Location location) { + return EC2HardwareBuilder.class.cast(super.location(location)); + } + + @Override + public EC2HardwareBuilder uri(URI uri) { + return EC2HardwareBuilder.class.cast(super.uri(uri)); + } + + @Override + public EC2HardwareBuilder userMetadata(Map userMetadata) { + return EC2HardwareBuilder.class.cast(super.userMetadata(userMetadata)); + } + + /** + * @see InstanceType#M1_SMALL + */ + public static EC2HardwareBuilder m1_small() { + return new EC2HardwareBuilder(InstanceType.M1_SMALL) + .ram(1740) + .processors(ImmutableList.of(new Processor(1.0, 1.0))) + .volumes( + ImmutableList. of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(150.0f, + "/dev/sda2", false, false))).is64Bit(false); + } + + /** + * @see InstanceType#T1_MICRO + */ + public static EC2HardwareBuilder t1_micro() { + return new EC2HardwareBuilder(InstanceType.T1_MICRO).ram(630) + .processors(ImmutableList.of(new Processor(1.0, 1.0))).rootDeviceType(RootDeviceType.EBS); + } + + /** + * @see InstanceType#M1_LARGE + */ + public static EC2HardwareBuilder m1_large() { + return new EC2HardwareBuilder(InstanceType.M1_LARGE) + .ram(7680) + .processors(ImmutableList.of(new Processor(2.0, 2.0))) + .volumes( + ImmutableList. of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(420.0f, + "/dev/sdb", false, false), new VolumeImpl(420.0f, "/dev/sdc", false, false))).is64Bit(true); + } + + /** + * @see InstanceType#M1_XLARGE + */ + public static EC2HardwareBuilder m1_xlarge() { + return new EC2HardwareBuilder(InstanceType.M1_XLARGE) + .ram(15360) + .processors(ImmutableList.of(new Processor(4.0, 2.0))) + .volumes( + ImmutableList. of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(420.0f, + "/dev/sdb", false, false), new VolumeImpl(420.0f, "/dev/sdc", false, false), new VolumeImpl( + 420.0f, "/dev/sdd", false, false), new VolumeImpl(420.0f, "/dev/sde", false, false))) + .is64Bit(true); + } + + /** + * @see InstanceType#M2_XLARGE + */ + public static EC2HardwareBuilder m2_xlarge() { + return new EC2HardwareBuilder(InstanceType.M2_XLARGE).ram(17510) + .processors(ImmutableList.of(new Processor(2.0, 3.25))) + .volumes(ImmutableList. of(new VolumeImpl(420.0f, "/dev/sda1", true, false))).is64Bit(true); + } + + /** + * @see InstanceType#M2_2XLARGE + */ + public static EC2HardwareBuilder m2_2xlarge() { + return new EC2HardwareBuilder(InstanceType.M2_2XLARGE) + .ram(35020) + .processors(ImmutableList.of(new Processor(4.0, 3.25))) + .volumes( + ImmutableList. of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(840.0f, + "/dev/sdb", false, false))).is64Bit(true); + } + + /** + * @see InstanceType#M2_4XLARGE + */ + public static EC2HardwareBuilder m2_4xlarge() { + return new EC2HardwareBuilder(InstanceType.M2_4XLARGE) + .ram(70041) + .processors(ImmutableList.of(new Processor(8.0, 3.25))) + .volumes( + ImmutableList. of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(840.0f, + "/dev/sdb", false, false), new VolumeImpl(840.0f, "/dev/sdc", false, false))).is64Bit(true); + } + + /** + * @see InstanceType#C1_MEDIUM + */ + public static EC2HardwareBuilder c1_medium() { + return new EC2HardwareBuilder(InstanceType.C1_MEDIUM) + .ram(1740) + .processors(ImmutableList.of(new Processor(2.0, 2.5))) + .volumes( + ImmutableList. of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(340.0f, + "/dev/sda2", false, false))).is64Bit(false); + } + + /** + * @see InstanceType#C1_XLARGE + */ + public static EC2HardwareBuilder c1_xlarge() { + return new EC2HardwareBuilder(InstanceType.C1_XLARGE) + .ram(7168) + .processors(ImmutableList.of(new Processor(8.0, 2.5))) + .volumes( + ImmutableList. of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(420.0f, + "/dev/sdb", false, false), new VolumeImpl(420.0f, "/dev/sdc", false, false), new VolumeImpl( + 420.0f, "/dev/sdd", false, false), new VolumeImpl(420.0f, "/dev/sde", false, false))) + .is64Bit(true); + } + + public static EC2HardwareBuilder cc1_4xlarge() { + return new EC2HardwareBuilder(InstanceType.CC1_4XLARGE) + .ram(23 * 1024) + .processors(ImmutableList.of(new Processor(4.0, 4.0), new Processor(4.0, 4.0))) + .volumes( + ImmutableList. of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(840.0f, + "/dev/sdb", false, false), new VolumeImpl(840.0f, "/dev/sdc", false, false))); + } + +} diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstance.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstance.java new file mode 100644 index 0000000000..4206ba5a89 --- /dev/null +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstance.java @@ -0,0 +1,79 @@ +/** + * + * 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.functions; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.aws.ec2.compute.domain.RegionAndName; +import org.jclouds.aws.ec2.domain.KeyPair; +import org.jclouds.aws.ec2.domain.RunningInstance; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; +import org.jclouds.domain.Credentials; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class CredentialsForInstance implements Function { + private final Map credentialsMap; + private final PopulateDefaultLoginCredentialsForImageStrategy credentialProvider; + private final Map imageForInstance; + + @Inject + CredentialsForInstance(Map credentialsMap, + PopulateDefaultLoginCredentialsForImageStrategy credentialProvider, Map imageForInstance) { + this.credentialsMap = checkNotNull(credentialsMap, "credentialsMap"); + this.credentialProvider = checkNotNull(credentialProvider, "credentialProvider"); + this.imageForInstance = imageForInstance; + } + + @Override + public Credentials apply(RunningInstance instance) { + Credentials credentials = null;// default if no keypair exists + + if (instance.getKeyName() != null) { + credentials = new Credentials(getLoginAccountFor(instance), getPrivateKeyOrNull(instance)); + } + return credentials; + } + + @VisibleForTesting + String getPrivateKeyOrNull(RunningInstance instance) { + KeyPair keyPair = credentialsMap.get(new RegionAndName(instance.getRegion(), instance.getKeyName())); + return keyPair != null ? keyPair.getKeyMaterial() : null; + } + + @VisibleForTesting + String getLoginAccountFor(RunningInstance from) { + return checkNotNull( + credentialProvider.execute(imageForInstance.get(new RegionAndName(from.getRegion(), from.getImageId()))), + "login from image: " + from.getImageId()).identity; + } +} \ No newline at end of file diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java index 1c300d533e..d39f6d0d5f 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java @@ -36,12 +36,11 @@ import javax.inject.Singleton; import org.jclouds.aws.ec2.domain.Image.Architecture; import org.jclouds.aws.ec2.domain.Image.ImageType; import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.internal.ImageImpl; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; -import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; @@ -72,17 +71,17 @@ public class ImageParser implements Function> locations; @@ -92,7 +91,7 @@ public class ImageParser implements Function> locations, Supplier defaultLocation, @Provider String provider) { + Supplier> locations, Supplier defaultLocation, @Provider String provider) { this.credentialProvider = checkNotNull(credentialProvider, "credentialProvider"); this.locations = checkNotNull(locations, "locations"); this.defaultLocation = checkNotNull(defaultLocation, "defaultLocation"); @@ -105,9 +104,12 @@ public class ImageParser implements Function of("owner", from.getImageOwnerId(), "rootDeviceType", from + .getRootDeviceType().toString())); OsFamily osFamily = parseOsFamilyOrNull(provider, from.getImageLocation()); String osName = null; @@ -119,13 +121,14 @@ public class ImageParser implements Function() { + builder.location(Iterables.find(locations.get(), new Predicate() { @Override public boolean apply(Location input) { return input.getId().equals(from.getRegion()); } - }); + })); } catch (NoSuchElementException e) { System.err.printf("unknown region %s for image %s; not in %s", from.getRegion(), from.getId(), locations); - location = new LocationImpl(LocationScope.REGION, from.getRegion(), from.getRegion(), defaultLocation.get() - .getParent()); + builder.location(new LocationImpl(LocationScope.REGION, from.getRegion(), from.getRegion(), defaultLocation + .get().getParent())); } - OperatingSystem os = new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit); - return new ImageImpl(from.getId(), name, from.getRegion() + "/" + from.getId(), location, null, ImmutableMap - . of("owner", from.getImageOwnerId(), "rootDeviceType", from.getRootDeviceType() - .toString()), os, description, version, defaultCredentials); - + builder.operatingSystem(new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit)); + return builder.build(); } /** @@ -164,7 +163,7 @@ public class ImageParser implements Function instanceToNodeState = ImmutableMap. builder() - .put(InstanceState.PENDING, NodeState.PENDING).put(InstanceState.RUNNING, NodeState.RUNNING).put( - InstanceState.SHUTTING_DOWN, NodeState.PENDING) - .put(InstanceState.TERMINATED, NodeState.TERMINATED).put(InstanceState.STOPPING, NodeState.PENDING).put( - InstanceState.STOPPED, NodeState.SUSPENDED) - .put(InstanceState.UNRECOGNIZED, NodeState.UNRECOGNIZED).build(); - - private final EC2Client client; - private final Map credentialsMap; - private final PopulateDefaultLoginCredentialsForImageStrategy credentialProvider; - private final Supplier> locations; - private final Supplier> hardware; - private final ConcurrentMap imageMap; + protected final Supplier> locations; + protected final Supplier> hardware; + protected final Map instanceToImage; + protected final Map credentialStore; + protected final Map instanceToNodeState; @Inject - RunningInstanceToNodeMetadata(EC2Client client, Map credentialsMap, - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider, - ConcurrentMap imageMap, Supplier> locations, - Supplier> hardware) { - this.client = checkNotNull(client, "client"); - this.credentialsMap = checkNotNull(credentialsMap, "credentialsMap"); - this.credentialProvider = checkNotNull(credentialProvider, "credentialProvider"); + RunningInstanceToNodeMetadata(Map instanceToNodeState, + Map credentialStore, Map instanceToImage, + Supplier> locations, Supplier> hardware) { this.locations = checkNotNull(locations, "locations"); this.hardware = checkNotNull(hardware, "hardware"); - this.imageMap = checkNotNull(imageMap, "imageMap"); + this.instanceToImage = checkNotNull(instanceToImage, "instanceToImage"); + this.instanceToNodeState = checkNotNull(instanceToNodeState, "instanceToNodeState"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); } @Override - public NodeMetadata apply(final RunningInstance instance) { - String id = checkNotNull(instance, "instance").getId(); - - String name = null; // user doesn't determine a node name; - URI uri = null; // no uri to get rest access to host info - + public NodeMetadata apply(RunningInstance instance) { + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + String providerId = checkNotNull(instance, "instance").getId(); + builder.providerId(providerId); + builder.id(instance.getRegion() + "/" + providerId); String tag = getTagForInstance(instance); + builder.tag(tag); + builder.credentials(credentialStore.get(instance.getRegion() + "/" + providerId)); + builder.state(instanceToNodeState.get(instance.getInstanceState())); + builder.publicAddresses(nullSafeSet(instance.getIpAddress())); + builder.privateAddresses(nullSafeSet(instance.getPrivateIpAddress())); + builder.hardware(parseHardware(instance)); + Location location = getLocationForAvailabilityZoneOrRegion(instance); + builder.location(location); + builder.imageId(instance.getRegion() + "/" + instance.getImageId()); - Credentials credentials = getCredentialsForInstanceWithTag(instance, tag); + // extract the operating system from the image + Image image = instanceToImage.get(new RegionAndName(instance.getRegion(), instance.getImageId())); + if (image != null) + builder.operatingSystem(image.getOperatingSystem()); - Map userMetadata = ImmutableMap. of(); - - NodeState state = instanceToNodeState.get(instance.getInstanceState()); - - Set publicAddresses = nullSafeSet(instance.getIpAddress()); - Set privateAddresses = nullSafeSet(instance.getPrivateIpAddress()); + return builder.build(); + } + protected Hardware parseHardware(final RunningInstance instance) { Hardware hardware = getHardwareForInstance(instance); if (hardware != null) { - hardware = ComputeServiceUtils.replacesVolumes(hardware, addEBS(instance, hardware.getVolumes())); + hardware = HardwareBuilder.fromHardware(hardware).volumes(addEBS(instance, hardware.getVolumes())).build(); } - - Location location = getLocationForAvailabilityZoneOrRegion(instance); - - Image image = resolveImageForInstanceInLocation(instance, location); - - return new NodeMetadataImpl(id, name, instance.getRegion() + "/" + instance.getId(), location, uri, userMetadata, - tag, hardware, instance.getRegion() + "/" + instance.getImageId(), image != null ? image - .getOperatingSystem() : null, state, publicAddresses, privateAddresses, credentials); + return hardware; } @VisibleForTesting - static Iterable addEBS(final RunningInstance instance, Iterable volumes) { + static List addEBS(final RunningInstance instance, Iterable volumes) { Iterable ebsVolumes = Iterables.transform(instance.getEbsBlockDevices().entrySet(), - new Function, Volume>() { + new Function, Volume>() { - @Override - public Volume apply(Entry from) { - return new VolumeImpl(from.getValue().getVolumeId(), Volume.Type.SAN, null, from.getKey(), - instance.getRootDeviceName() != null - && instance.getRootDeviceName().equals(from.getKey()), true); - } - }); + @Override + public Volume apply(Entry from) { + return new VolumeImpl(from.getValue().getVolumeId(), Volume.Type.SAN, null, from.getKey(), instance + .getRootDeviceName() != null && instance.getRootDeviceName().equals(from.getKey()), true); + } + }); if (instance.getRootDeviceType() == RootDeviceType.EBS) { volumes = Iterables.filter(volumes, new Predicate() { @@ -156,19 +139,10 @@ public class RunningInstanceToNodeMetadata implements Function imageMap; + private final Map imageMap; @Inject protected EC2TemplateBuilderImpl(Supplier> locations, Supplier> images, - Supplier> sizes, Supplier defaultLocation, - Provider optionsProvider, - @Named("DEFAULT") Provider defaultTemplateProvider, - ConcurrentMap imageMap) { + Supplier> sizes, Supplier defaultLocation, + Provider optionsProvider, + @Named("DEFAULT") Provider defaultTemplateProvider, Map imageMap) { super(locations, images, sizes, defaultLocation, optionsProvider, defaultTemplateProvider); this.imageMap = imageMap; } @@ -87,8 +86,7 @@ public class EC2TemplateBuilderImpl extends TemplateBuilderImpl { if (imageId != null) { String[] regionName = imageId.split("/"); checkArgument(regionName.length == 2, - "amazon image ids must include the region ( ex. us-east-1/ami-7ea24a17 ) you specified: " - + imageId); + "amazon image ids must include the region ( ex. us-east-1/ami-7ea24a17 ) you specified: " + imageId); RegionAndName key = new RegionAndName(regionName[0], regionName[1]); try { return imageMap.get(key); diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java index 1bcf789798..64c8eb219a 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.java @@ -19,7 +19,6 @@ package org.jclouds.aws.ec2.compute.strategy; -import static com.google.common.base.Preconditions.checkArgument; import static org.jclouds.aws.ec2.options.RunInstancesOptions.Builder.asType; import java.util.Map; @@ -30,7 +29,6 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.aws.ec2.compute.domain.EC2Hardware; import org.jclouds.aws.ec2.compute.domain.RegionAndName; import org.jclouds.aws.ec2.compute.domain.RegionNameAndIngressRules; import org.jclouds.aws.ec2.compute.functions.CreatePlacementGroupIfNeeded; @@ -66,10 +64,10 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions @Inject CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions(Map credentialsMap, - @Named("SECURITY") Map securityGroupMap, - @Named("PLACEMENT") Map placementGroupMap, CreateUniqueKeyPair createUniqueKeyPair, - CreateSecurityGroupIfNeeded createSecurityGroupIfNeeded, - CreatePlacementGroupIfNeeded createPlacementGroupIfNeeded) { + @Named("SECURITY") Map securityGroupMap, + @Named("PLACEMENT") Map placementGroupMap, CreateUniqueKeyPair createUniqueKeyPair, + CreateSecurityGroupIfNeeded createSecurityGroupIfNeeded, + CreatePlacementGroupIfNeeded createPlacementGroupIfNeeded) { this.credentialsMap = credentialsMap; this.securityGroupMap = securityGroupMap; this.placementGroupMap = placementGroupMap; @@ -79,17 +77,13 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions } public RunInstancesOptions execute(String region, String tag, Template template) { - checkArgument(template.getHardware() instanceof EC2Hardware, "unexpected image type. should be EC2Size, was: " - + template.getHardware().getClass()); - EC2Hardware ec2Size = EC2Hardware.class.cast(template.getHardware()); - RunInstancesOptions instanceOptions = asType(ec2Size.getInstanceType()).withAdditionalInfo(tag); + RunInstancesOptions instanceOptions = asType(template.getHardware().getId()).withAdditionalInfo(tag); String keyPairName = createNewKeyPairUnlessUserSpecifiedOtherwise(region, tag, template.getOptions()); - String placementGroupName = ec2Size.getId().startsWith("cc") ? createNewPlacementGroupUnlessUserSpecifiedOtherwise( - region, tag, template.getOptions()) - : null; + String placementGroupName = template.getHardware().getId().startsWith("cc") ? createNewPlacementGroupUnlessUserSpecifiedOtherwise( + region, tag, template.getOptions()) : null; String subnetId = EC2TemplateOptions.class.cast(template.getOptions()).getSubnetId(); @@ -122,7 +116,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions 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); @@ -147,7 +141,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions placementGroupName = EC2TemplateOptions.class.cast(options).getPlacementGroup(); if (placementGroupName == null) shouldAutomaticallyCreatePlacementGroup = EC2TemplateOptions.class.cast(options) - .shouldAutomaticallyCreatePlacementGroup(); + .shouldAutomaticallyCreatePlacementGroup(); } if (placementGroupName == null && shouldAutomaticallyCreatePlacementGroup) { placementGroupName = String.format("jclouds#%s#%s", tag, region); @@ -171,17 +165,17 @@ 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; diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java index cc656b6d92..001af59126 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java @@ -29,11 +29,12 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.aws.ec2.EC2Client; -import org.jclouds.aws.ec2.compute.functions.RunningInstanceToNodeMetadata; import org.jclouds.aws.ec2.domain.RunningInstance; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import com.google.common.base.Function; + /** * * @author Adrian Cole @@ -42,10 +43,11 @@ import org.jclouds.compute.strategy.GetNodeMetadataStrategy; public class EC2GetNodeMetadataStrategy implements GetNodeMetadataStrategy { private final EC2Client client; - private final RunningInstanceToNodeMetadata runningInstanceToNodeMetadata; + private final Function runningInstanceToNodeMetadata; @Inject - protected EC2GetNodeMetadataStrategy(EC2Client client, RunningInstanceToNodeMetadata runningInstanceToNodeMetadata) { + protected EC2GetNodeMetadataStrategy(EC2Client client, + Function runningInstanceToNodeMetadata) { this.client = client; this.runningInstanceToNodeMetadata = runningInstanceToNodeMetadata; } @@ -57,7 +59,7 @@ public class EC2GetNodeMetadataStrategy implements GetNodeMetadataStrategy { String instanceId = parts[1]; try { RunningInstance runningInstance = getOnlyElement(getAllRunningInstancesInRegion(client.getInstanceServices(), - region, instanceId)); + region, instanceId)); return runningInstanceToNodeMetadata.apply(runningInstance); } catch (NoSuchElementException e) { return null; diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2ListNodesStrategy.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2ListNodesStrategy.java index b6e1adf7ca..3085055ab5 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2ListNodesStrategy.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2ListNodesStrategy.java @@ -39,7 +39,6 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.aws.Region; import org.jclouds.aws.ec2.EC2AsyncClient; -import org.jclouds.aws.ec2.compute.functions.RunningInstanceToNodeMetadata; import org.jclouds.aws.ec2.domain.Reservation; import org.jclouds.aws.ec2.domain.RunningInstance; import org.jclouds.compute.domain.ComputeMetadata; @@ -64,13 +63,13 @@ public class EC2ListNodesStrategy implements ListNodesStrategy { private final EC2AsyncClient client; private final Map regionMap; - private final RunningInstanceToNodeMetadata runningInstanceToNodeMetadata; + private final Function runningInstanceToNodeMetadata; private final ExecutorService executor; @Inject protected EC2ListNodesStrategy(EC2AsyncClient client, @Region Map regionMap, - RunningInstanceToNodeMetadata runningInstanceToNodeMetadata, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + Function runningInstanceToNodeMetadata, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.client = client; this.regionMap = regionMap; this.runningInstanceToNodeMetadata = runningInstanceToNodeMetadata; @@ -84,15 +83,15 @@ public class EC2ListNodesStrategy implements ListNodesStrategy { @Override public Set listDetailsOnNodesMatching(Predicate filter) { - Iterable>> reservations = transformParallel(regionMap - .keySet(), new Function>>>() { + Iterable>> reservations = transformParallel( + regionMap.keySet(), new Function>>>() { - @Override - public Future>> apply(String from) { - return client.getInstanceServices().describeInstancesInRegion(from); - } + @Override + public Future>> apply(String from) { + return client.getInstanceServices().describeInstancesInRegion(from); + } - }, executor, null, logger, "reservations"); + }, executor, null, logger, "reservations"); Iterable instances = concat(concat(reservations)); Iterable nodes = filter(transform(instances, runningInstanceToNodeMetadata), filter); diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java index 6fda83850e..dbbdbe0824 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java @@ -32,19 +32,24 @@ import org.jclouds.domain.Credentials; */ @Singleton public class EC2PopulateDefaultLoginCredentialsForImageStrategy implements - PopulateDefaultLoginCredentialsForImageStrategy { + PopulateDefaultLoginCredentialsForImageStrategy { @Override public Credentials execute(Object resourceToAuthenticate) { Credentials credentials = new Credentials("root", null); if (resourceToAuthenticate != null) { - checkArgument(resourceToAuthenticate instanceof Image, "Resource must be an image (for EC2)"); - Image image = (Image) resourceToAuthenticate; + String owner = null; + if (resourceToAuthenticate instanceof Image) { + owner = Image.class.cast(resourceToAuthenticate).getImageOwnerId(); + } else if (resourceToAuthenticate instanceof org.jclouds.compute.domain.Image) { + owner = org.jclouds.compute.domain.Image.class.cast(resourceToAuthenticate).getUserMetadata().get("owner"); + } + checkArgument(owner != null, "Resource must be an image (for EC2)"); // canonical/alestic images use the ubuntu user to login - if (image.getImageOwnerId().matches("063491364108|099720109477")) { + if (owner.matches("063491364108|099720109477")) { credentials = new Credentials("ubuntu", null); // http://aws.typepad.com/aws/2010/09/introducing-amazon-linux-ami.html - } else if (image.getImageOwnerId().equals("137112412989")) { + } else if (owner.equals("137112412989")) { credentials = new Credentials("ec2-user", null); } } diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategy.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategy.java index 5774177d32..10136c5d42 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategy.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategy.java @@ -35,7 +35,6 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.aws.ec2.EC2Client; -import org.jclouds.aws.ec2.compute.functions.RunningInstanceToNodeMetadata; import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions; import org.jclouds.aws.ec2.domain.Reservation; import org.jclouds.aws.ec2.domain.RunningInstance; @@ -45,11 +44,14 @@ import org.jclouds.compute.domain.Template; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.compute.util.ComputeUtils; +import org.jclouds.domain.Credentials; import org.jclouds.logging.Logger; 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.Iterables; /** * creates futures that correlate to @@ -68,62 +70,77 @@ public class EC2RunNodesAndAddToSetStrategy implements RunNodesAndAddToSetStrate @VisibleForTesting final CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions; @VisibleForTesting - final RunningInstanceToNodeMetadata runningInstanceToNodeMetadata; + final Function runningInstanceToNodeMetadata; @VisibleForTesting final ComputeUtils utils; - final Predicate instancePresent; + final Function instanceToCredentials; + final Map credentialStore; @Inject EC2RunNodesAndAddToSetStrategy( - EC2Client client, - CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions, - @Named("PRESENT") Predicate instancePresent, - RunningInstanceToNodeMetadata runningInstanceToNodeMetadata, ComputeUtils utils) { + EC2Client client, + CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions, + @Named("PRESENT") Predicate instancePresent, + Function runningInstanceToNodeMetadata, + Function instanceToCredentials, Map credentialStore, + ComputeUtils utils) { this.client = client; this.instancePresent = instancePresent; this.createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions = createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions; this.runningInstanceToNodeMetadata = runningInstanceToNodeMetadata; + this.instanceToCredentials = instanceToCredentials; + this.credentialStore = credentialStore; this.utils = utils; } @Override public Map> execute(String tag, int count, Template template, Set goodNodes, - Map badNodes) { + Map badNodes) { Reservation reservation = createKeyPairAndSecurityGroupsAsNeededThenRunInstances(tag, - count, template); + count, template); Iterable ids = transform(reservation, instanceToId); String idsString = Joiner.on(',').join(ids); + if (Iterables.size(ids) > 0) { + logger.debug("<< started instances(%s)", idsString); + all(reservation, instancePresent); + logger.debug("<< present instances(%s)", idsString); + populateCredentials(reservation); + } - logger.debug("<< started instances(%s)", idsString); - all(reservation, instancePresent); - logger.debug("<< present instances(%s)", idsString); + return utils.runOptionsOnNodesAndAddToGoodSetOrPutExceptionIntoBadMap(template.getOptions(), + transform(reservation, runningInstanceToNodeMetadata), goodNodes, badNodes); + } - return utils.runOptionsOnNodesAndAddToGoodSetOrPutExceptionIntoBadMap(template.getOptions(), transform( - reservation, runningInstanceToNodeMetadata), goodNodes, badNodes); + protected void populateCredentials(Reservation reservation) { + RunningInstance instance1 = Iterables.get(reservation, 0); + Credentials credentials = instanceToCredentials.apply(instance1); + if (credentials != null) + for (RunningInstance instance : reservation) + credentialStore.put(instance.getRegion() + "/" + instance.getId(), credentials); } @VisibleForTesting Reservation createKeyPairAndSecurityGroupsAsNeededThenRunInstances(String tag, int count, - Template template) { + Template template) { String region = getRegionFromLocationOrNull(template.getLocation()); String zone = getZoneFromLocationOrNull(template.getLocation()); RunInstancesOptions instanceOptions = createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.execute(region, - tag, template); + tag, template); if (EC2TemplateOptions.class.cast(template.getOptions()).isMonitoringEnabled()) instanceOptions.enableMonitoring(); if (logger.isDebugEnabled()) logger.debug(">> running %d instance region(%s) zone(%s) ami(%s) params(%s)", count, region, zone, template - .getImage().getProviderId(), instanceOptions.buildFormParameters()); + .getImage().getProviderId(), instanceOptions.buildFormParameters()); return client.getInstanceServices().runInstancesInRegion(region, zone, template.getImage().getProviderId(), 1, - count, instanceOptions); + count, instanceOptions); } } \ No newline at end of file diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2HardwareSupplier.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2HardwareSupplier.java index 16c081ea4e..8bdf4e6615 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2HardwareSupplier.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2HardwareSupplier.java @@ -20,8 +20,19 @@ package org.jclouds.aws.ec2.compute.suppliers; import static com.google.common.collect.Iterables.find; -import static com.google.common.collect.Sets.newHashSet; +import static com.google.common.collect.Sets.newLinkedHashSet; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.c1_medium; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.c1_xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.cc1_4xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m1_large; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m1_small; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m1_xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_2xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_4xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.t1_micro; import static org.jclouds.aws.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; +import static org.jclouds.compute.predicates.ImagePredicates.any; import java.util.Set; @@ -30,11 +41,7 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.aws.ec2.compute.domain.EC2Hardware; -import org.jclouds.aws.ec2.domain.InstanceType; import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.internal.VolumeImpl; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; @@ -43,7 +50,6 @@ import org.jclouds.rest.annotations.Provider; import com.google.common.base.Predicate; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; /** @@ -61,7 +67,7 @@ public class EC2HardwareSupplier implements Supplier> { @Inject EC2HardwareSupplier(Supplier> locations, @Provider String providerName, - @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis) { + @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis) { this.locations = locations; this.ccAmis = ccAmis; this.providerName = providerName; @@ -69,7 +75,7 @@ public class EC2HardwareSupplier implements Supplier> { @Override public Set get() { - Set sizes = newHashSet(); + Set sizes = newLinkedHashSet(); for (String ccAmi : ccAmis) { final String region = ccAmi.split("/")[0]; Location location = find(locations.get(), new Predicate() { @@ -80,14 +86,11 @@ public class EC2HardwareSupplier implements Supplier> { } }); - sizes.add(new EC2Hardware(location, InstanceType.CC1_4XLARGE, ImmutableList.of(new Processor(4.0, 4.0), - new Processor(4.0, 4.0)), 23 * 1024, ImmutableList.of( - new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(840.0f, "/dev/sdb", false, false), - new VolumeImpl(840.0f, "/dev/sdc", false, false)), ccAmis)); + sizes.add(cc1_4xlarge().location(location).supportsImageIds(ccAmi).build()); } - sizes.addAll(ImmutableSet. of(EC2Hardware.T1_MICRO, EC2Hardware.C1_MEDIUM, EC2Hardware.C1_XLARGE, - EC2Hardware.M1_LARGE, "nova".equals(providerName) ? EC2Hardware.M1_SMALL_NOVA : EC2Hardware.M1_SMALL, - EC2Hardware.M1_XLARGE, EC2Hardware.M2_XLARGE, EC2Hardware.M2_2XLARGE, EC2Hardware.M2_4XLARGE)); + sizes.addAll(ImmutableSet. of(t1_micro().build(), c1_medium().build(), c1_xlarge().build(), m1_large() + .build(), "nova".equals(providerName) ? m1_small().supportsImage(any()).build() : m1_small().build(), + m1_xlarge().build(), m2_xlarge().build(), m2_2xlarge().build(), m2_4xlarge().build())); return sizes; } } \ No newline at end of file diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/RegionAndNameToImageSupplier.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/RegionAndNameToImageSupplier.java index 09d507f0a3..19b2da8eeb 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/RegionAndNameToImageSupplier.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/RegionAndNameToImageSupplier.java @@ -52,7 +52,6 @@ import static org.jclouds.aws.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; import java.net.URI; import java.util.Map; import java.util.Map.Entry; -import java.util.concurrent.ConcurrentMap; import javax.annotation.Resource; import javax.inject.Inject; @@ -87,12 +86,12 @@ public class RegionAndNameToImageSupplier implements Supplier images; + private final Map images; @Inject RegionAndNameToImageSupplier(@Region Map regionMap, DescribeImagesParallel describer, - @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis, @Named(PROPERTY_EC2_AMI_OWNERS) final String[] amiOwners, - final ImageParser parser, final ConcurrentMap images) { + @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis, @Named(PROPERTY_EC2_AMI_OWNERS) final String[] amiOwners, + final ImageParser parser, final Map images) { this.regionMap = regionMap; this.describer = describer; this.ccAmis = ccAmis; @@ -108,11 +107,12 @@ public class RegionAndNameToImageSupplier implements Supplier> providing images"); - Iterable> queries = concat(getDescribeQueriesForOwnersInRegions( - regionMap, amiOwners).entrySet(), ccAmisToDescribeQueries(ccAmis).entrySet()); + Iterable> queries = concat( + getDescribeQueriesForOwnersInRegions(regionMap, amiOwners).entrySet(), ccAmisToDescribeQueries(ccAmis) + .entrySet()); - 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() { @@ -137,7 +137,7 @@ public class RegionAndNameToImageSupplier implements Supplier getDescribeQueriesForOwnersInRegions(Map regionMap, - final String[] amiOwners) { + final String[] amiOwners) { final DescribeImagesOptions options = getOptionsForOwners(amiOwners); return transformValues(regionMap, new Function() { diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/xml/BaseReservationHandler.java b/aws/core/src/main/java/org/jclouds/aws/ec2/xml/BaseReservationHandler.java index d25c699c67..04c867735b 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/xml/BaseReservationHandler.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/xml/BaseReservationHandler.java @@ -230,14 +230,14 @@ public abstract class BaseReservationHandler extends HandlerForGeneratedReque protected void inItem() { if (inBlockDeviceMapping) { ebsBlockDevices.put(deviceName, new RunningInstance.EbsBlockDevice(volumeId, attachmentStatus, attachTime, - deleteOnTermination)); + deleteOnTermination)); this.deviceName = null; this.volumeId = null; this.attachmentStatus = null; this.attachTime = null; this.deleteOnTermination = true; } else if (inInstances && !inProductCodes && !inBlockDeviceMapping) { - String region = EC2Utils.findRegionInArgsOrNull(getRequest()); + String region = getRequest() != null ? EC2Utils.findRegionInArgsOrNull(getRequest()) : null; // Eucalyptus if (ipAddress == null && dnsName != null && dnsName.matches(".*[0-9]$")) { @@ -252,10 +252,10 @@ public abstract class BaseReservationHandler extends HandlerForGeneratedReque 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)); + 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; @@ -290,11 +290,11 @@ public abstract class BaseReservationHandler extends HandlerForGeneratedReque } protected Reservation newReservation() { - String region = EC2Utils.findRegionInArgsOrNull(getRequest()); + String region = getRequest() != null ? EC2Utils.findRegionInArgsOrNull(getRequest()) : null; 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/aws/core/src/main/java/org/jclouds/aws/ec2/xml/DescribeImagesResponseHandler.java b/aws/core/src/main/java/org/jclouds/aws/ec2/xml/DescribeImagesResponseHandler.java index 244d4d2c72..ddee393a37 100755 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/xml/DescribeImagesResponseHandler.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/xml/DescribeImagesResponseHandler.java @@ -46,7 +46,8 @@ import com.google.common.collect.Sets; * DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2010-06-15/" * * @author Adrian Cole - * @see */ public class DescribeImagesResponseHandler extends ParseSax.HandlerForGeneratedRequestWithResult> { @@ -159,12 +160,12 @@ public class DescribeImagesResponseHandler extends ParseSax.HandlerForGeneratedR this.deleteOnTermination = true; } else if (!inProductCodes) { try { - String region = EC2Utils.findRegionInArgsOrNull(getRequest()); + String region = getRequest() != null ? EC2Utils.findRegionInArgsOrNull(getRequest()) : null; if (region == null) region = defaultRegion; contents.add(new Image(region, architecture, this.name, description, imageId, imageLocation, - imageOwnerId, imageState, imageType, isPublic, productCodes, kernelId, platform, ramdiskId, - rootDeviceType, rootDeviceName, ebsBlockDevices, virtualizationType)); + imageOwnerId, imageState, imageType, isPublic, productCodes, kernelId, platform, ramdiskId, + rootDeviceType, rootDeviceName, ebsBlockDevices, virtualizationType)); } catch (NullPointerException e) { logger.warn(e, "malformed image: %s", imageId); } diff --git a/aws/core/src/test/java/org/jclouds/aws/ComputeAndBlobStoreTogetherHappilyLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/ComputeAndBlobStoreTogetherHappilyLiveTest.java index aac06fb99e..c250f99847 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ComputeAndBlobStoreTogetherHappilyLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ComputeAndBlobStoreTogetherHappilyLiveTest.java @@ -39,6 +39,10 @@ import org.testng.annotations.Test; /** * This test helps us understand how we can use the power of blobstores to our favor. + *

+ * This test is in aws only because it happens to have both blobstore and compute + * + * TODO create a blobstore and compute integration module * * @author Adrian Cole */ diff --git a/aws/core/src/test/java/org/jclouds/aws/CredentialsStoredInBlobStoreTest.java b/aws/core/src/test/java/org/jclouds/aws/CredentialsStoredInBlobStoreTest.java new file mode 100644 index 0000000000..7b09e8fab3 --- /dev/null +++ b/aws/core/src/test/java/org/jclouds/aws/CredentialsStoredInBlobStoreTest.java @@ -0,0 +1,102 @@ +/** + * + * 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; + +import static org.testng.Assert.assertEquals; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.jclouds.blobstore.BlobStoreContext; +import org.jclouds.blobstore.BlobStoreContextFactory; +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.compute.RunNodesException; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.domain.Credentials; +import org.jclouds.rest.config.CredentialStoreModule; +import org.jclouds.util.Utils; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; + +/** + * Tests that credentials stored in the blobstore can be reused across compute contexts. + *

+ * This test is in aws only because it happens to have both blobstore and compute + * + * TODO create a blobstore and compute integration module + * + * @author Adrian Cole + */ +@Test(testName = "jclouds.CredentialsStoredInBlobStoreTest") +public class CredentialsStoredInBlobStoreTest { + + private BlobStoreContext blobContext; + private Map credentialsMap; + + @BeforeTest + void setupCredentialContainerAndMap() { + blobContext = new BlobStoreContextFactory().createContext("transient", "foo", "bar"); + blobContext.getBlobStore().createContainerInLocation(null, "credentials"); + credentialsMap = blobContext.createInputStreamMap("credentials"); + } + + @Test + public void testWeCanUseBlobStoreToStoreCredentialsAcrossContexts() throws RunNodesException, IOException { + + ComputeServiceContext computeContext = new ComputeServiceContextFactory().createContext("stub", "foo", "bar", + ImmutableSet.of(new CredentialStoreModule(credentialsMap))); + + Set nodes = computeContext.getComputeService().runNodesWithTag("foo", 10); + + verifyCredentialsFromNodesAreInContext(nodes, computeContext); + computeContext.close(); + + // recreate the compute context with the same map and ensure it still works! + computeContext = new ComputeServiceContextFactory().createContext("stub", "foo", "bar", + Collections.singleton(new CredentialStoreModule(credentialsMap))); + + verifyCredentialsFromNodesAreInContext(nodes, computeContext); + + } + + protected void verifyCredentialsFromNodesAreInContext(Set nodes, + ComputeServiceContext computeContext) throws IOException { + // verify each node's credential is in the map. + assertEquals(computeContext.credentialStore().size(), 10); + for (NodeMetadata node : nodes) { + assertEquals(computeContext.credentialStore().get(node.getId()), node.getCredentials()); + } + + // verify the credentials are in the backing store and of a known json format + assertEquals(credentialsMap.size(), 10); + for (Entry entry : credentialsMap.entrySet()) { + Credentials credentials = computeContext.credentialStore().get(entry.getKey()); + assertEquals(Utils.toStringAndClose(entry.getValue()), String.format( + "{\"identity\":\"%s\",\"credential\":\"%s\"}", credentials.identity, credentials.credential)); + } + } +} diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2ComputeServiceTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2ComputeServiceTest.java index ce59b6b315..e865f9c6e4 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2ComputeServiceTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2ComputeServiceTest.java @@ -23,24 +23,30 @@ import static java.lang.String.format; import static org.easymock.EasyMock.expect; import static org.easymock.classextension.EasyMock.createMock; import static org.easymock.classextension.EasyMock.replay; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.c1_medium; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.c1_xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.cc1_4xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m1_large; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m1_small; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m1_xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_2xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_4xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_xlarge; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.t1_micro; import java.util.Set; import javax.inject.Provider; -import org.jclouds.aws.ec2.compute.domain.EC2Hardware; -import org.jclouds.aws.ec2.domain.InstanceType; import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.domain.internal.ImageImpl; import org.jclouds.compute.domain.internal.TemplateBuilderImpl; -import org.jclouds.compute.domain.internal.VolumeImpl; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; @@ -51,9 +57,8 @@ import org.testng.annotations.Test; import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; +import static org.testng.Assert.assertEquals; /** * Tests compute service specifically to EC2. @@ -68,10 +73,8 @@ import com.google.common.collect.Maps; public class EC2ComputeServiceTest { private static final Location location = new LocationImpl(LocationScope.REGION, "us-east-1", "us east", null); - public static final EC2Hardware CC1_4XLARGE = new EC2Hardware(location, InstanceType.CC1_4XLARGE, ImmutableList.of( - new Processor(4.0, 4.0), new Processor(4.0, 4.0)), 23 * 1024, ImmutableList.of(new VolumeImpl(10.0f, - "/dev/sda1", true, false), new VolumeImpl(840.0f, "/dev/sdb", false, false), new VolumeImpl(840.0f, - "/dev/sdc", false, false)), new String[] { "us-east-1/cc-image" }); + public static final Hardware CC1_4XLARGE = cc1_4xlarge().location(location).supportsImageIds("us-east-1/cc-image") + .build(); /** * Verifies that {@link TemplateBuilderImpl} would choose the correct size of the instance, based @@ -84,9 +87,10 @@ public class EC2ComputeServiceTest { Template template = newTemplateBuilder().os64Bit(true).hardwareId("m2.xlarge").locationId("us-east-1").build(); assert template != null : "The returned template was null, but it should have a value."; - assert EC2Hardware.M2_XLARGE.equals(template.getHardware()) : format( - "Incorrect image determined by the template. Expected: %s. Found: %s.", "m2.xlarge", String - .valueOf(template.getHardware())); +// assert m2_xlarge().build().equals(template.getHardware()) : format( +// "Incorrect image determined by the template. Expected: %s. Found: %s.", "m2.xlarge", +// String.valueOf(template.getHardware())); + assertEquals( m2_xlarge().build(), template.getHardware()); } @Test @@ -95,8 +99,8 @@ public class EC2ComputeServiceTest { assert template != null : "The returned template was null, but it should have a value."; assert CC1_4XLARGE.equals(template.getHardware()) : format( - "Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE.getId(), String - .valueOf(template.getHardware())); + "Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE.getId(), + String.valueOf(template.getHardware())); } /** @@ -107,13 +111,13 @@ public class EC2ComputeServiceTest { */ @Test public void testTemplateChoiceForInstanceByAttributes() throws Exception { - Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.5).smallest().locationId( - "us-east-1").build(); + Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.5).smallest() + .locationId("us-east-1").build(); assert template != null : "The returned template was null, but it should have a value."; assert CC1_4XLARGE.equals(template.getHardware()) : format( - "Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE, String - .valueOf(template.getHardware())); + "Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE, + String.valueOf(template.getHardware())); } /** @@ -126,13 +130,13 @@ public class EC2ComputeServiceTest { */ @Test public void testNegativeTemplateChoiceForInstanceByAttributes() throws Exception { - Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.7).smallest().locationId( - "us-east-1").build(); + Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.7).smallest() + .locationId("us-east-1").build(); assert template != null : "The returned template was null, but it should have a value."; - assert !EC2Hardware.M2_XLARGE.equals(template.getHardware()) : format( - "Incorrect image determined by the template. Expected: not %s. Found: %s.", "m2.xlarge", String - .valueOf(template.getHardware())); + assert !m2_xlarge().build().equals(template.getHardware()) : format( + "Incorrect image determined by the template. Expected: not %s. Found: %s.", "m2.xlarge", + String.valueOf(template.getHardware())); } @SuppressWarnings("unchecked") @@ -144,22 +148,23 @@ public class EC2ComputeServiceTest { expect(optionsProvider.get()).andReturn(defaultOptions); - Image image = new ImageImpl("cc-image", "image", "us-east-1/cc-image", location, null, Maps - . newHashMap(), new OperatingSystem(OsFamily.UBUNTU, null, "1.0", null, "ubuntu", true), - "description", "1.0", new Credentials("root", null)); + Image image = new ImageBuilder().providerId("cc-image").name("image").id("us-east-1/cc-image") + .location(location) + .operatingSystem(new OperatingSystem(OsFamily.UBUNTU, null, "1.0", null, "ubuntu", true)) + .description("description").version("1.0").defaultCredentials(new Credentials("root", null)).build(); replay(optionsProvider); replay(templateBuilderProvider); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); + . of(location)); Supplier> images = Suppliers.> ofInstance(ImmutableSet - . of(image)); + . of(image)); Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.T1_MICRO, EC2Hardware.C1_MEDIUM, EC2Hardware.C1_XLARGE, EC2Hardware.M1_LARGE, - EC2Hardware.M1_SMALL, EC2Hardware.M1_XLARGE, EC2Hardware.M2_XLARGE, EC2Hardware.M2_2XLARGE, - EC2Hardware.M2_4XLARGE, CC1_4XLARGE)); + . 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(), + CC1_4XLARGE)); return new TemplateBuilderImpl(locations, images, sizes, Suppliers.ofInstance(location), optionsProvider, - templateBuilderProvider) { + templateBuilderProvider) { }; } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstanceTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstanceTest.java new file mode 100644 index 0000000000..28664cde04 --- /dev/null +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstanceTest.java @@ -0,0 +1,879 @@ +/** + * + * 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.functions; + +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.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m1_small; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_4xlarge; +import static org.jclouds.aws.ec2.options.DescribeImagesOptions.Builder.imageIds; +import static org.testng.Assert.assertEquals; + +import java.net.UnknownHostException; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentMap; + +import org.jclouds.aws.domain.Region; +import org.jclouds.aws.ec2.EC2Client; +import org.jclouds.aws.ec2.compute.domain.RegionAndName; +import org.jclouds.aws.ec2.domain.Attachment; +import org.jclouds.aws.ec2.domain.AvailabilityZone; +import org.jclouds.aws.ec2.domain.Image; +import org.jclouds.aws.ec2.domain.InstanceState; +import org.jclouds.aws.ec2.domain.InstanceType; +import org.jclouds.aws.ec2.domain.KeyPair; +import org.jclouds.aws.ec2.domain.RootDeviceType; +import org.jclouds.aws.ec2.domain.RunningInstance; +import org.jclouds.aws.ec2.domain.RunningInstance.EbsBlockDevice; +import org.jclouds.aws.ec2.services.AMIClient; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.Processor; +import org.jclouds.compute.domain.Volume; +import org.jclouds.compute.domain.internal.VolumeImpl; +import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; +import org.jclouds.date.DateService; +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; +import org.jclouds.domain.internal.LocationImpl; +import org.testng.annotations.Test; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "ec2.CredentialsForInstanceTest") +public class CredentialsForInstanceTest { + + DateService dateService = new SimpleDateFormatDateService(); + +// @SuppressWarnings({ "unchecked" }) +// @Test +// public void testApplyWithEBSWhenBootIsInstanceStoreAndAvailabilityZoneNotFound() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); +// Map credentialsMap = createMock(Map.class); +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m1_small().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// Image image = createMock(Image.class); +// +// expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet.of("default")).atLeastOnce(); +// expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// Location location = new LocationImpl(LocationScope.ZONE, "us-east-1d", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(location)); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// expect(instance.getIpAddress()).andReturn("174.129.1.50"); +// expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); +// +// expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); +// +// expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); +// expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); +// +// expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("ami-1515f07c"))).andReturn( +// (Set) ImmutableSet. of(image)); +// +// expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); +// +// expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "jclouds#tag#us-east-1#50"))).andReturn( +// new KeyPair(Region.US_EAST_1, "jclouds#tag#us-east-1#50", "keyFingerprint", "pass")); +// +// expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.M1_SMALL).atLeastOnce(); +// expect(instance.getEbsBlockDevices()).andReturn( +// ImmutableMap. of( +// "/dev/sdg", +// new EbsBlockDevice("vol-1f20d376", Attachment.Status.ATTACHED, dateService +// .iso8601DateParse("2009-12-11T16:32:46.000Z"), false), +// "/dev/sdj", +// new EbsBlockDevice("vol-c0eb78aa", Attachment.Status.ATTACHED, dateService +// .iso8601DateParse("2010-06-17T10:43:28.000Z"), false))); +// expect(instance.getRootDeviceType()).andReturn(RootDeviceType.INSTANCE_STORE); +// expect(instance.getRootDeviceName()).andReturn(null).atLeastOnce(); +// +// replay(imageMap); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// replay(jcImage); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// +// assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); +// assertEquals(metadata.getLocation(), null); +// assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); +// assertEquals(metadata.getHardware().getId(), "m1.small"); +// assertEquals(metadata.getHardware().getName(), "m1.small"); +// assertEquals(metadata.getHardware().getProviderId(), "m1.small"); +// assertEquals(metadata.getHardware().getProcessors(), ImmutableList. of(new Processor(1.0, 1.0))); +// assertEquals(metadata.getHardware().getRam(), 1740); +// assertEquals(metadata.getHardware().getVolumes(), +// ImmutableList. of(new VolumeImpl(null, Volume.Type.LOCAL, 10.0f, "/dev/sda1", true, false),// +// new VolumeImpl(null, Volume.Type.LOCAL, 150.0f, "/dev/sda2", false, false),// +// new VolumeImpl("vol-1f20d376", Volume.Type.SAN, null, "/dev/sdg", false, true),// +// new VolumeImpl("vol-c0eb78aa", Volume.Type.SAN, null, "/dev/sdj", false, true))); +// +// assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// +// } +// +// @SuppressWarnings({ "unchecked" }) +// @Test +// public void testApplyForNovaWhereNullAvailabilityZoneIpAddressNoGroups() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); +// Map credentialsMap = createMock(Map.class); +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m1_small().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// Image image = createMock(Image.class); +// +// expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); +// expect(instance.getKeyName()).andReturn("nebulatanimislam").atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(region)); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// expect(instance.getIpAddress()).andReturn(null); +// expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); +// +// expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); +// +// expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); +// expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); +// +// expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("ami-1515f07c"))).andReturn( +// (Set) ImmutableSet. of(image)); +// +// expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); +// +// expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "nebulatanimislam"))).andReturn(null); +// +// expect(instance.getAvailabilityZone()).andReturn(null).atLeastOnce(); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.M1_SMALL).atLeastOnce(); +// expect(instance.getEbsBlockDevices()).andReturn(Maps. newHashMap()); +// expect(instance.getRootDeviceType()).andReturn(RootDeviceType.INSTANCE_STORE); +// +// replay(imageMap); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// replay(jcImage); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// +// assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); +// assertEquals(metadata.getLocation(), region); +// assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); +// assertEquals(metadata.getHardware().getId(), "m1.small"); +// assertEquals(metadata.getHardware().getName(), "m1.small"); +// assertEquals(metadata.getHardware().getProviderId(), "m1.small"); +// assertEquals(metadata.getHardware().getProcessors(), ImmutableList. of(new Processor(1.0, 1.0))); +// assertEquals(metadata.getHardware().getRam(), 1740); +// assertEquals(metadata.getHardware().getVolumes(), +// ImmutableList. of(new VolumeImpl(null, Volume.Type.LOCAL, 10.0f, "/dev/sda1", true, false),// +// new VolumeImpl(null, Volume.Type.LOCAL, 150.0f, "/dev/sda2", false, false))); +// +// assertEquals(metadata.getCredentials(), new Credentials("user", null)); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// +// } +// +// @SuppressWarnings({ "unchecked" }) +// @Test +// public void testApplyWhereUnknownInstanceType() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); +// Map credentialsMap = createMock(Map.class); +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m1_small().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// Image image = createMock(Image.class); +// +// expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); +// expect(instance.getKeyName()).andReturn("nebulatanimislam").atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(region)); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// expect(instance.getIpAddress()).andReturn(null); +// expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); +// +// expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); +// +// expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); +// expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); +// +// expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("ami-1515f07c"))).andReturn( +// (Set) ImmutableSet. of(image)); +// +// expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); +// +// expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "nebulatanimislam"))).andReturn(null); +// +// expect(instance.getAvailabilityZone()).andReturn(null).atLeastOnce(); +// +// expect(instance.getInstanceType()).andReturn("hhttpp").atLeastOnce(); +// +// replay(imageMap); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// replay(jcImage); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// +// assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); +// assertEquals(metadata.getLocation(), region); +// assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); +// assertEquals(metadata.getHardware(), null); +// +// assertEquals(metadata.getCredentials(), new Credentials("user", null)); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// +// } +// +// @SuppressWarnings({ "unchecked" }) +// @Test +// public void testApplyForNovaWhereImageNotFound() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); +// Map credentialsMap = createMock(Map.class); +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m1_small().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// +// expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); +// expect(instance.getKeyName()).andReturn("nebulatanimislam").atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(region)); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// expect(instance.getIpAddress()).andReturn(null); +// expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); +// +// expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); +// +// expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); +// expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); +// +// expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("ami-1515f07c"))).andReturn( +// (Set) ImmutableSet. of()); +// +// expect(credentialProvider.execute(null)).andReturn(new Credentials("root", null)); +// +// expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "nebulatanimislam"))).andReturn(null); +// +// expect(instance.getAvailabilityZone()).andReturn(null).atLeastOnce(); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.M1_SMALL).atLeastOnce(); +// expect(instance.getEbsBlockDevices()).andReturn(Maps. newHashMap()); +// expect(instance.getRootDeviceType()).andReturn(RootDeviceType.INSTANCE_STORE); +// +// replay(imageMap); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// replay(jcImage); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// +// assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); +// assertEquals(metadata.getLocation(), region); +// assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); +// assertEquals(metadata.getHardware().getId(), "m1.small"); +// assertEquals(metadata.getHardware().getName(), "m1.small"); +// assertEquals(metadata.getHardware().getProviderId(), "m1.small"); +// assertEquals(metadata.getHardware().getProcessors(), ImmutableList. of(new Processor(1.0, 1.0))); +// assertEquals(metadata.getHardware().getRam(), 1740); +// assertEquals(metadata.getHardware().getVolumes(), +// ImmutableList. of(new VolumeImpl(null, Volume.Type.LOCAL, 10.0f, "/dev/sda1", true, false),// +// new VolumeImpl(null, Volume.Type.LOCAL, 150.0f, "/dev/sda2", false, false))); +// +// assertEquals(metadata.getCredentials(), new Credentials("root", null)); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// +// } +// +// @SuppressWarnings("unchecked") +// @Test +// public void testImageNotFoundAndLazyReturnsNull() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// +// Map credentialsMap = createMock(Map.class); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// +// Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(location)); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m2_4xlarge().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// +// expect(instance.getId()).andReturn("id").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); +// expect(instance.getKeyName()).andReturn(null).atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// expect(instance.getIpAddress()).andReturn("127.0.0.1"); +// expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); +// +// expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); +// expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); +// +// expect(imageMap.get(new RegionAndName("us-east-1", "imageId"))).andReturn(null); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); +// +// replay(imageMap); +// replay(jcImage); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// assertEquals(metadata.getLocation(), locations.get().iterator().next()); +// assertEquals(metadata.getImageId(), "us-east-1/imageId"); +// assertEquals(metadata.getTag(), "NOTAG-id"); +// assertEquals(metadata.getCredentials(), null); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// } +// +// @SuppressWarnings("unchecked") +// @Test +// public void testImageNotFoundStillSetsImageId() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// Map credentialsMap = createMock(Map.class); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// +// Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(location)); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m2_4xlarge().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// +// expect(instance.getId()).andReturn("id").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); +// expect(instance.getKeyName()).andReturn(null).atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// expect(instance.getIpAddress()).andReturn("127.0.0.1"); +// expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); +// +// expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); +// expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); +// +// expect(imageMap.get(new RegionAndName("us-east-1", "imageId"))).andThrow(new NullPointerException()) +// .atLeastOnce(); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); +// +// replay(imageMap); +// replay(jcImage); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// assertEquals(metadata.getLocation(), locations.get().iterator().next()); +// assertEquals(metadata.getImageId(), "us-east-1/imageId"); +// assertEquals(metadata.getTag(), "NOTAG-id"); +// assertEquals(metadata.getCredentials(), null); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// } +// +// @SuppressWarnings("unchecked") +// @Test +// public void testImageNotFoundAndLazySucceeds() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// Map credentialsMap = createMock(Map.class); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// +// Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(location)); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m2_4xlarge().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// +// expect(instance.getId()).andReturn("id").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); +// expect(instance.getKeyName()).andReturn(null).atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// expect(instance.getIpAddress()).andReturn("127.0.0.1"); +// expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); +// +// expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); +// expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); +// +// org.jclouds.compute.domain.Image lateImage = createMock(org.jclouds.compute.domain.Image.class); +// +// expect(imageMap.get(new RegionAndName("us-east-1", "imageId"))).andReturn(lateImage).atLeastOnce(); +// expect(lateImage.getId()).andReturn("us-east-1/imageId").atLeastOnce(); +// expect(lateImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); +// +// replay(lateImage); +// replay(imageMap); +// replay(jcImage); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// assertEquals(metadata.getLocation(), locations.get().iterator().next()); +// assertEquals(metadata.getImageId(), lateImage.getId()); +// assertEquals(metadata.getTag(), "NOTAG-id"); +// assertEquals(metadata.getCredentials(), null); +// +// verify(lateImage); +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// } +// +// @SuppressWarnings("unchecked") +// @Test +// public void testApplyWithNoSecurityGroupCreatesTagOfIdPrefixedByTagAndNullCredentials() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// Map credentialsMap = createMock(Map.class); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// +// Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(location)); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m2_4xlarge().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// +// expect(instance.getId()).andReturn("id").atLeastOnce(); +// expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); +// expect(instance.getKeyName()).andReturn(null).atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// expect(instance.getIpAddress()).andReturn("127.0.0.1"); +// expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); +// +// expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); +// +// expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); +// expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); +// +// replay(imageMap); +// replay(jcImage); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// assertEquals(metadata.getLocation(), locations.get().iterator().next()); +// assertEquals(metadata.getImageId(), "us-east-1/imageId"); +// assertEquals(metadata.getTag(), "NOTAG-id"); +// assertEquals(metadata.getCredentials(), null); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// } +// +// @SuppressWarnings("unchecked") +// @Test +// public void testApplyWithNoKeyPairCreatesTagOfParsedSecurityGroupAndNullCredentials() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// Map credentialsMap = createMock(Map.class); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// +// Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(location)); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m2_4xlarge().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// +// expect(instance.getId()).andReturn("id").atLeastOnce(); +// expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds#tag#us-east-1")).atLeastOnce(); +// expect(instance.getKeyName()).andReturn(null).atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// expect(instance.getIpAddress()).andReturn("127.0.0.1"); +// expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); +// +// expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); +// +// expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); +// expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); +// +// replay(imageMap); +// replay(jcImage); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// assertEquals(metadata.getLocation(), locations.get().iterator().next()); +// assertEquals(metadata.getImageId(), "us-east-1/imageId"); +// assertEquals(metadata.getTag(), "tag"); +// assertEquals(metadata.getCredentials(), null); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// } +// +// @SuppressWarnings({ "unchecked" }) +// @Test +// public void testApplyWithKeyPairCreatesTagOfParsedSecurityGroupAndCredentialsBasedOnIt() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); +// Map credentialsMap = createMock(Map.class); +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m2_4xlarge().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// Image image = createMock(Image.class); +// +// expect(instance.getId()).andReturn("id").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds#tag#us-east-1")).atLeastOnce(); +// expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(location)); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// expect(instance.getIpAddress()).andReturn("127.0.0.1"); +// expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); +// +// expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); +// +// expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); +// expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); +// +// expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("imageId"))).andReturn( +// (Set) ImmutableSet. of(image)); +// +// expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); +// +// expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "jclouds#tag#us-east-1#50"))).andReturn( +// new KeyPair(Region.US_EAST_1, "jclouds#tag#us-east-1#50", "keyFingerprint", "pass")); +// +// expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); +// +// replay(imageMap); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// replay(jcImage); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// NodeMetadata metadata = parser.apply(instance); +// +// assertEquals(metadata.getTag(), "tag"); +// assertEquals(metadata.getLocation(), location); +// assertEquals(metadata.getImageId(), "us-east-1/imageId"); +// +// assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// +// } +// +// @SuppressWarnings({ "unchecked" }) +// @Test +// public void testApplyWithTwoSecurityGroups() throws UnknownHostException { +// EC2Client client = createMock(EC2Client.class); +// AMIClient amiClient = createMock(AMIClient.class); +// expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); +// Map credentialsMap = createMock(Map.class); +// ConcurrentMap imageMap = createMock(ConcurrentMap.class); +// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// . of(m2_4xlarge().build())); +// PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); +// RunningInstance instance = createMock(RunningInstance.class); +// Image image = createMock(Image.class); +// +// expect(instance.getId()).andReturn("id").atLeastOnce(); +// expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds1", "jclouds2")).atLeastOnce(); +// expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce(); +// expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); +// +// Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); +// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// . of(location)); +// org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); +// +// expect(instance.getIpAddress()).andReturn("127.0.0.1"); +// expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); +// +// expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); +// +// expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); +// +// expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); +// expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); +// +// expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("imageId"))).andReturn( +// (Set) ImmutableSet. of(image)); +// +// expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); +// +// expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "jclouds#tag#us-east-1#50"))).andReturn( +// new KeyPair(Region.US_EAST_1, "jclouds#tag#us-east-1#50", "keyFingerprint", "pass")); +// +// expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); +// +// expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); +// +// replay(imageMap); +// replay(client); +// replay(amiClient); +// replay(credentialsMap); +// replay(credentialProvider); +// replay(instance); +// replay(jcImage); +// +// Function parser = new CredentialsForInstance(client, credentialsMap, +// credentialProvider, imageMap, locations, hardwares); +// +// NodeMetadata metadata = parser.apply(instance); +// +// assertEquals(metadata.getTag(), "NOTAG-id"); +// assertEquals(metadata.getLocation(), location); +// assertEquals(metadata.getImageId(), "us-east-1/imageId"); +// +// assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); +// +// verify(imageMap); +// verify(jcImage); +// verify(client); +// verify(amiClient); +// verify(credentialsMap); +// verify(credentialProvider); +// verify(instance); +// +// } +} diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/ImageParserTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/ImageParserTest.java index 51683ed795..a5f0443a5f 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/ImageParserTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/ImageParserTest.java @@ -19,648 +19,200 @@ package org.jclouds.aws.ec2.compute.functions; -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 java.util.Set; import org.jclouds.aws.ec2.compute.strategy.EC2PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.aws.ec2.domain.Image; -import org.jclouds.aws.ec2.xml.BaseEC2HandlerTest; -import org.jclouds.aws.ec2.xml.DescribeImagesResponseHandler; +import org.jclouds.aws.ec2.xml.DescribeImagesResponseHandlerTest; +import org.jclouds.compute.domain.ImageBuilder; +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.LocationScope; import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.http.functions.ParseSax; -import org.jclouds.rest.internal.GeneratedHttpRequest; import org.testng.annotations.Test; +import com.google.common.base.Predicates; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import com.google.gson.Gson; /** * @author Adrian Cole */ @Test(groups = "unit", testName = "compute.ImageParserTest") -public class ImageParserTest extends BaseEC2HandlerTest { - +public class ImageParserTest { public void testParseAlesticCanonicalImage() { - InputStream is = getClass().getResourceAsStream("/ec2/alestic_canonical.xml"); - Set result = parseImages(is); - assertEquals(result.size(), 8); + Set result = convertImages("/ec2/alestic_canonical.xml"); - ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), Suppliers - .> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "ec2"); - org.jclouds.compute.domain.Image ubuntuHardy = parser.apply(Iterables.get(result, 0)); + assertEquals( + Iterables.get(result, 0), + new ImageBuilder() + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.UBUNTU).arch("paravirtual").version("8.04") + .description("ubuntu-images-us/ubuntu-hardy-8.04-i386-server-20091130.manifest.xml") + .is64Bit(false).build()) + .description("ubuntu-images-us/ubuntu-hardy-8.04-i386-server-20091130.manifest.xml") + .defaultCredentials(new Credentials("ubuntu", null)).id("us-east-1/ami-7e28ca17") + .providerId("ami-7e28ca17").location(defaultLocation).version("20091130") + .userMetadata(ImmutableMap.of("owner", "099720109477", "rootDeviceType", "instance-store")).build()); - assertEquals(ubuntuHardy.getDescription(), "ubuntu-images-us/ubuntu-hardy-8.04-i386-server-20091130.manifest.xml"); - assertEquals(ubuntuHardy.getId(), "us-east-1/ami-7e28ca17"); - assertEquals(ubuntuHardy.getProviderId(), "ami-7e28ca17"); - assertEquals(ubuntuHardy.getLocation(), defaultLocation); - assertEquals(ubuntuHardy.getName(), null); - assertEquals(ubuntuHardy.getOperatingSystem().getName(), null); - assertEquals(ubuntuHardy.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(ubuntuHardy.getOperatingSystem().getVersion(), "8.04"); - assertEquals(ubuntuHardy.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(ubuntuHardy.getOperatingSystem().getDescription(), - "ubuntu-images-us/ubuntu-hardy-8.04-i386-server-20091130.manifest.xml"); - assertEquals(ubuntuHardy.getOperatingSystem().is64Bit(), false); - assertEquals(ubuntuHardy.getUserMetadata(), ImmutableMap. of("owner", "099720109477", - "rootDeviceType", "instance-store")); - assertEquals(ubuntuHardy.getVersion(), "20091130"); + assertEquals( + Iterables.get(result, 4), + new ImageBuilder() + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.UBUNTU).arch("paravirtual").version("8.04") + .description("alestic/ubuntu-8.04-hardy-base-20080905.manifest.xml").is64Bit(false) + .build()).description("alestic/ubuntu-8.04-hardy-base-20080905.manifest.xml") + .defaultCredentials(new Credentials("ubuntu", null)).id("us-east-1/ami-c0fa1ea9") + .providerId("ami-c0fa1ea9").location(defaultLocation).version("20080905") + .userMetadata(ImmutableMap.of("owner", "063491364108", "rootDeviceType", "instance-store")).build()); - org.jclouds.compute.domain.Image alesticKarmic = parser.apply(Iterables.get(result, 1)); - - assertEquals(alesticKarmic.getOperatingSystem().is64Bit(), false); - assertEquals(alesticKarmic.getDescription(), "alestic/ubuntu-9.10-karmic-base-20090623.manifest.xml"); - assertEquals(alesticKarmic.getId(), "us-east-1/ami-19a34270"); - assertEquals(alesticKarmic.getProviderId(), "ami-19a34270"); - assertEquals(alesticKarmic.getLocation(), defaultLocation); - assertEquals(alesticKarmic.getName(), null); - assertEquals(alesticKarmic.getOperatingSystem().getName(), null); - assertEquals(alesticKarmic.getOperatingSystem().getVersion(), "9.10"); - assertEquals(alesticKarmic.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(alesticKarmic.getOperatingSystem().getDescription(), - "alestic/ubuntu-9.10-karmic-base-20090623.manifest.xml"); - assertEquals(alesticKarmic.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(alesticKarmic.getUserMetadata(), ImmutableMap. of("owner", "063491364108", - "rootDeviceType", "instance-store")); - assertEquals(alesticKarmic.getVersion(), "20090623"); - - org.jclouds.compute.domain.Image ubuntuKarmic = parser.apply(Iterables.get(result, 2)); - - assertEquals(ubuntuKarmic.getOperatingSystem().is64Bit(), false); - assertEquals(ubuntuKarmic.getDescription(), - "ubuntu-images-us/ubuntu-karmic-9.10-i386-server-20100121.manifest.xml"); - assertEquals(ubuntuKarmic.getId(), "us-east-1/ami-bb709dd2"); - assertEquals(ubuntuKarmic.getProviderId(), "ami-bb709dd2"); - assertEquals(ubuntuKarmic.getLocation(), defaultLocation); - assertEquals(ubuntuKarmic.getName(), null); - assertEquals(ubuntuKarmic.getOperatingSystem().getName(), null); - assertEquals(ubuntuKarmic.getOperatingSystem().getVersion(), "9.10"); - assertEquals(ubuntuKarmic.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(ubuntuKarmic.getOperatingSystem().getDescription(), - "ubuntu-images-us/ubuntu-karmic-9.10-i386-server-20100121.manifest.xml"); - assertEquals(ubuntuKarmic.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(ubuntuKarmic.getUserMetadata(), ImmutableMap. of("owner", "099720109477", - "rootDeviceType", "instance-store")); - assertEquals(ubuntuKarmic.getVersion(), "20100121"); - - org.jclouds.compute.domain.Image testing = parser.apply(Iterables.get(result, 3)); - - assertEquals(testing.getOperatingSystem().is64Bit(), true); - assertEquals(testing.getDescription(), - "ubuntu-images-testing-us/ubuntu-lucid-daily-amd64-desktop-20100317.manifest.xml"); - assertEquals(testing.getId(), "us-east-1/ami-190fe070"); - assertEquals(testing.getProviderId(), "ami-190fe070"); - assertEquals(testing.getLocation(), defaultLocation); - assertEquals(testing.getName(), null); - assertEquals(testing.getOperatingSystem().getName(), null); - assertEquals(testing.getOperatingSystem().getVersion(), "10.04"); - assertEquals(testing.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(testing.getOperatingSystem().getDescription(), - "ubuntu-images-testing-us/ubuntu-lucid-daily-amd64-desktop-20100317.manifest.xml"); - assertEquals(testing.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(testing.getUserMetadata(), ImmutableMap. of("owner", "099720109477", - "rootDeviceType", "instance-store")); - assertEquals(testing.getVersion(), "20100317"); - - org.jclouds.compute.domain.Image alesticHardy = parser.apply(Iterables.get(result, 4)); - - assertEquals(alesticHardy.getOperatingSystem().is64Bit(), false); - assertEquals(alesticHardy.getDescription(), "alestic/ubuntu-8.04-hardy-base-20080905.manifest.xml"); - assertEquals(alesticHardy.getId(), "us-east-1/ami-c0fa1ea9"); - assertEquals(alesticHardy.getProviderId(), "ami-c0fa1ea9"); - assertEquals(alesticHardy.getLocation(), defaultLocation); - assertEquals(alesticHardy.getName(), null); - assertEquals(alesticHardy.getOperatingSystem().getName(), null); - assertEquals(alesticHardy.getOperatingSystem().getVersion(), "8.04"); - assertEquals(alesticHardy.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(alesticHardy.getOperatingSystem().getDescription(), - "alestic/ubuntu-8.04-hardy-base-20080905.manifest.xml"); - assertEquals(alesticHardy.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(alesticHardy.getUserMetadata(), ImmutableMap. of("owner", "063491364108", - "rootDeviceType", "instance-store")); - assertEquals(alesticHardy.getVersion(), "20080905"); - - org.jclouds.compute.domain.Image ubuntuLucid = parser.apply(Iterables.get(result, 5)); - - assertEquals(ubuntuLucid.getOperatingSystem().is64Bit(), false); - assertEquals(ubuntuLucid.getDescription(), - "ubuntu-images-us-west-1/ubuntu-lucid-10.04-i386-server-20100427.1.manifest.xml"); - assertEquals(ubuntuLucid.getId(), "us-east-1/ami-c597c680"); - assertEquals(ubuntuLucid.getProviderId(), "ami-c597c680"); - assertEquals(ubuntuLucid.getLocation(), defaultLocation); - assertEquals(ubuntuLucid.getName(), null); - assertEquals(ubuntuLucid.getOperatingSystem().getName(), null); - assertEquals(ubuntuLucid.getOperatingSystem().getVersion(), "10.04"); - assertEquals(ubuntuLucid.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(ubuntuLucid.getOperatingSystem().getDescription(), - "ubuntu-images-us-west-1/ubuntu-lucid-10.04-i386-server-20100427.1.manifest.xml"); - assertEquals(ubuntuLucid.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(ubuntuLucid.getUserMetadata(), ImmutableMap. of("owner", "099720109477", - "rootDeviceType", "instance-store")); - assertEquals(ubuntuLucid.getVersion(), "20100427.1"); - - // should skip kernel - assert parser.apply(Iterables.get(result, 6)) == null; - - org.jclouds.compute.domain.Image ubuntuEbs = parser.apply(Iterables.get(result, 7)); - - assertEquals(ubuntuEbs.getOperatingSystem().is64Bit(), false); - assertEquals(ubuntuEbs.getDescription(), "099720109477/ebs/ubuntu-images/ubuntu-lucid-10.04-i386-server-20100827"); - assertEquals(ubuntuEbs.getId(), "us-east-1/ami-10f3a255"); - assertEquals(ubuntuEbs.getProviderId(), "ami-10f3a255"); - assertEquals(ubuntuEbs.getLocation(), defaultLocation); - assertEquals(ubuntuEbs.getName(), null); - assertEquals(ubuntuEbs.getOperatingSystem().getName(), null); - assertEquals(ubuntuEbs.getOperatingSystem().getVersion(), "10.04"); - assertEquals(ubuntuEbs.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(ubuntuEbs.getOperatingSystem().getDescription(), - "099720109477/ebs/ubuntu-images/ubuntu-lucid-10.04-i386-server-20100827"); - assertEquals(ubuntuEbs.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(ubuntuEbs.getUserMetadata(), ImmutableMap. of("owner", "099720109477", - "rootDeviceType", "ebs")); - assertEquals(ubuntuEbs.getVersion(), "20100827"); + assertEquals( + Iterables.get(result, 6), + new ImageBuilder() + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.UBUNTU).arch("paravirtual").version("10.04") + .description("099720109477/ebs/ubuntu-images/ubuntu-lucid-10.04-i386-server-20100827") + .is64Bit(false).build()) + .description("099720109477/ebs/ubuntu-images/ubuntu-lucid-10.04-i386-server-20100827") + .defaultCredentials(new Credentials("ubuntu", null)).id("us-east-1/ami-10f3a255") + .providerId("ami-10f3a255").location(defaultLocation).version("20100827") + .userMetadata(ImmutableMap.of("owner", "099720109477", "rootDeviceType", "ebs")).build()); } - private Location defaultLocation = new LocationImpl(LocationScope.REGION, "us-east-1", "us-east-1", null); - public void testParseVostokImage() { - InputStream is = getClass().getResourceAsStream("/ec2/vostok.xml"); - Set result = parseImages(is); + Set result = convertImages("/ec2/vostok.xml"); - ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), Suppliers - .> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "ec2"); - - org.jclouds.compute.domain.Image image = parser.apply(Iterables.get(result, 0)); - - assertEquals(image.getOperatingSystem().is64Bit(), false); - assertEquals(image.getDescription(), "vostok-builds/vostok-0.95-5622/vostok-0.95-5622.manifest.xml"); - assertEquals(image.getId(), "us-east-1/ami-870de2ee"); - assertEquals(image.getProviderId(), "ami-870de2ee"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), - "vostok-builds/vostok-0.95-5622/vostok-0.95-5622.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UNRECOGNIZED); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "133804938231", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), "5622"); + assertEquals( + Iterables.get(result, 0), + new ImageBuilder() + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.UNRECOGNIZED).arch("paravirtual").version("") + .description("vostok-builds/vostok-0.95-5622/vostok-0.95-5622.manifest.xml") + .is64Bit(false).build()) + .description("vostok-builds/vostok-0.95-5622/vostok-0.95-5622.manifest.xml") + .defaultCredentials(new Credentials("root", null)).id("us-east-1/ami-870de2ee") + .providerId("ami-870de2ee").location(defaultLocation).version("5622") + .userMetadata(ImmutableMap.of("owner", "133804938231", "rootDeviceType", "instance-store")).build()); } public void testParseCCImage() { - InputStream is = getClass().getResourceAsStream("/ec2/describe_images_cc.xml"); - Set result = parseImages(is); + Set result = convertImages("/ec2/describe_images_cc.xml"); - ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), Suppliers - .> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "ec2"); - - org.jclouds.compute.domain.Image image = parser.apply(Iterables.get(result, 0)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "EC2 CentOS 5.4 HVM AMI"); - assertEquals(image.getId(), "us-east-1/ami-7ea24a17"); - assertEquals(image.getProviderId(), "ami-7ea24a17"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "5.4"); - assertEquals(image.getOperatingSystem().getArch(), "hvm"); - assertEquals(image.getOperatingSystem().getDescription(), "amazon/EC2 CentOS 5.4 HVM AMI"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.CENTOS); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "206029621532", "rootDeviceType", - "ebs")); - assertEquals(image.getVersion(), null); + assertEquals( + Iterables.get(result, 0), + new ImageBuilder() + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).arch("hvm").version("5.4") + .description("amazon/EC2 CentOS 5.4 HVM AMI").is64Bit(true).build()) + .description("EC2 CentOS 5.4 HVM AMI").defaultCredentials(new Credentials("root", null)) + .id("us-east-1/ami-7ea24a17").providerId("ami-7ea24a17").location(defaultLocation) + .userMetadata(ImmutableMap.of("owner", "206029621532", "rootDeviceType", "ebs")).build()); } public void testParseRightScaleImage() { - InputStream is = getClass().getResourceAsStream("/ec2/rightscale_images.xml"); - Set result = parseImages(is); + Set result = convertImages("/ec2/rightscale_images.xml"); - ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), Suppliers - .> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "ec2"); - - org.jclouds.compute.domain.Image image = parser.apply(Iterables.get(result, 0)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "rightscale-us-east/CentOS_5.4_x64_v4.4.10.manifest.xml"); - assertEquals(image.getId(), "us-east-1/ami-ccb35ea5"); - assertEquals(image.getProviderId(), "ami-ccb35ea5"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "5.4"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), - "rightscale-us-east/CentOS_5.4_x64_v4.4.10.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.CENTOS); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "411009282317", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), "4.4.10"); - - image = parser.apply(Iterables.get(result, 1)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "RightImage_Ubuntu_9.10_x64_v4.5.3_EBS_Alpha"); - assertEquals(image.getId(), "us-east-1/ami-c19db6b5"); - assertEquals(image.getProviderId(), "ami-c19db6b5"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "9.10"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), - "411009282317/RightImage_Ubuntu_9.10_x64_v4.5.3_EBS_Alpha"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "411009282317", "rootDeviceType", - "ebs")); - assertEquals(image.getVersion(), "4.5.3_EBS_Alpha"); + assertEquals( + Iterables.get(result, 0), + new ImageBuilder() + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).arch("paravirtual").version("5.4") + .description("rightscale-us-east/CentOS_5.4_x64_v4.4.10.manifest.xml").is64Bit(true) + .build()).description("rightscale-us-east/CentOS_5.4_x64_v4.4.10.manifest.xml") + .defaultCredentials(new Credentials("root", null)).id("us-east-1/ami-ccb35ea5") + .providerId("ami-ccb35ea5").location(defaultLocation).version("4.4.10") + .userMetadata(ImmutableMap.of("owner", "admin", "rootDeviceType", "instance-store")).build()); + 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\"}}"); } public void testParseEucalyptusImage() { - InputStream is = getClass().getResourceAsStream("/ec2/eucalyptus_images.xml"); - Set result = parseImages(is); - assertEquals(result.size(), 4); - ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), Suppliers - .> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "ec2"); - - org.jclouds.compute.domain.Image image = parser.apply(Iterables.get(result, 0)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "centos-5.3-x86_64/centos.5-3.x86-64.img.manifest.xml"); - assertEquals(image.getId(), "us-east-1/emi-9ACB1363"); - assertEquals(image.getProviderId(), "emi-9ACB1363"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "5.3"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "centos-5.3-x86_64/centos.5-3.x86-64.img.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.CENTOS); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "admin", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); + Set result = convertImages("/ec2/eucalyptus_images.xml"); + assertEquals( + Iterables.get(result, 0), + new ImageBuilder() + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).arch("paravirtual").version("5.3") + .description("centos-5.3-x86_64/centos.5-3.x86-64.img.manifest.xml").is64Bit(true) + .build()).description("centos-5.3-x86_64/centos.5-3.x86-64.img.manifest.xml") + .defaultCredentials(new Credentials("root", null)).id("us-east-1/emi-9ACB1363") + .providerId("emi-9ACB1363").location(defaultLocation) + .userMetadata(ImmutableMap.of("owner", "admin", "rootDeviceType", "instance-store")).build()); } - public void testParseAmznmage() { - InputStream is = getClass().getResourceAsStream("/ec2/amzn_images.xml"); + public void testParseAmznImage() { - Set result = parseImages(is); - assertEquals(result.size(), 4); - ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), Suppliers - .> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "ec2"); + Set result = convertImages("/ec2/amzn_images.xml"); - org.jclouds.compute.domain.Image image = parser.apply(Iterables.get(result, 0)); - - assertEquals(image.getOperatingSystem().is64Bit(), false); - assertEquals(image.getDescription(), "Amazon"); - assertEquals(image.getId(), "us-east-1/ami-82e4b5c7"); - assertEquals(image.getProviderId(), "ami-82e4b5c7"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "0.9.7-beta"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "137112412989/amzn-ami-0.9.7-beta.i386-ebs"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "137112412989", "rootDeviceType", - "ebs")); - assertEquals(image.getVersion(), "0.9.7-beta"); - - image = parser.apply(Iterables.get(result, 1)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "Amazon"); - assertEquals(image.getId(), "us-east-1/ami-8ce4b5c9"); - assertEquals(image.getProviderId(), "ami-8ce4b5c9"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "0.9.7-beta"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "137112412989/amzn-ami-0.9.7-beta.x86_64-ebs"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "137112412989", "rootDeviceType", - "ebs")); - assertEquals(image.getVersion(), "0.9.7-beta"); - - image = parser.apply(Iterables.get(result, 2)); - - assertEquals(image.getOperatingSystem().is64Bit(), false); - assertEquals(image.getDescription(), "Amazon Linux AMI i386 S3"); - assertEquals(image.getId(), "us-east-1/ami-f0e4b5b5"); - assertEquals(image.getProviderId(), "ami-f0e4b5b5"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "0.9.7-beta"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), - "amzn-ami-us-west-1/amzn-ami-0.9.7-beta.i386.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "137112412989", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), "0.9.7-beta"); - - image = parser.apply(Iterables.get(result, 3)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "Amazon Linux AMI x86_64 S3"); - assertEquals(image.getId(), "us-east-1/ami-f2e4b5b7"); - assertEquals(image.getProviderId(), "ami-f2e4b5b7"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "0.9.7-beta"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), - "amzn-ami-us-west-1/amzn-ami-0.9.7-beta.x86_64.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "137112412989", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), "0.9.7-beta"); + assertEquals( + Iterables.get(result, 0), + new ImageBuilder() + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.AMZN_LINUX).arch("paravirtual") + .version("0.9.7-beta").description("137112412989/amzn-ami-0.9.7-beta.i386-ebs") + .is64Bit(false).build()).description("Amazon") + .defaultCredentials(new Credentials("ec2-user", null)).id("us-east-1/ami-82e4b5c7") + .providerId("ami-82e4b5c7").location(defaultLocation).version("0.9.7-beta") + .userMetadata(ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).build()); + assertEquals( + Iterables.get(result, 3), + new ImageBuilder() + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.AMZN_LINUX).arch("paravirtual") + .version("0.9.7-beta") + .description("amzn-ami-us-west-1/amzn-ami-0.9.7-beta.x86_64.manifest.xml").is64Bit(true) + .build()).description("Amazon Linux AMI x86_64 S3") + .defaultCredentials(new Credentials("ec2-user", null)).id("us-east-1/ami-f2e4b5b7") + .providerId("ami-f2e4b5b7").location(defaultLocation).version("0.9.7-beta") + .userMetadata(ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).build()); } public void testParseNovaImage() { - InputStream is = getClass().getResourceAsStream("/ec2/nova_images.xml"); - Set result = parseImages(is); - assertEquals(result.size(), 19); - ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), Suppliers - .> ofInstance(ImmutableSet. of(defaultLocation)), Suppliers - .ofInstance(defaultLocation), "nebula"); - - org.jclouds.compute.domain.Image image = parser.apply(Iterables.get(result, 0)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "nasacms/image.manifest.xml"); - assertEquals(image.getId(), "us-east-1/ami-h30p5im0"); - assertEquals(image.getProviderId(), "ami-h30p5im0"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "nasacms/image.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "foo", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - assertEquals(parser.apply(Iterables.get(result, 1)), null); - - image = parser.apply(Iterables.get(result, 2)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "nebula/tiny"); - assertEquals(image.getId(), "us-east-1/ami-tiny"); - assertEquals(image.getProviderId(), "ami-tiny"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "nebula/tiny"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "vishvananda", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - image = parser.apply(Iterables.get(result, 3)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "demos/mediawiki"); - assertEquals(image.getId(), "us-east-1/ami-630A130F"); - assertEquals(image.getProviderId(), "ami-630A130F"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "demos/mediawiki"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "admin", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - assertEquals(parser.apply(Iterables.get(result, 4)), null); - assertEquals(parser.apply(Iterables.get(result, 5)), null); - assertEquals(parser.apply(Iterables.get(result, 6)), null); - - image = parser.apply(Iterables.get(result, 7)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "pinglet/instances"); - assertEquals(image.getId(), "us-east-1/ami-pinginst"); - assertEquals(image.getProviderId(), "ami-pinginst"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "pinglet/instances"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "admin", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - image = parser.apply(Iterables.get(result, 8)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "bucket/testbuntu.manifest.xml"); - assertEquals(image.getId(), "us-east-1/ami-alqbihe2"); - assertEquals(image.getProviderId(), "ami-alqbihe2"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "bucket/testbuntu.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "rkumar2", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - image = parser.apply(Iterables.get(result, 9)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "gfortran-bucket/gfortran.manifest.xml"); - assertEquals(image.getId(), "us-east-1/ami-i0aemtfp"); - assertEquals(image.getProviderId(), "ami-i0aemtfp"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "gfortran-bucket/gfortran.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "ykliu", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - assertEquals(parser.apply(Iterables.get(result, 10)), null); - - image = parser.apply(Iterables.get(result, 11)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "grinder/grinder-analyzer.manifest.xml"); - assertEquals(image.getId(), "us-east-1/ami-2ig7w1bh"); - assertEquals(image.getProviderId(), "ami-2ig7w1bh"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "grinder/grinder-analyzer.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "foo", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - assertEquals(parser.apply(Iterables.get(result, 12)), null); - - image = parser.apply(Iterables.get(result, 13)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "nebula/lucid"); - assertEquals(image.getId(), "us-east-1/ami-lucid"); - assertEquals(image.getProviderId(), "ami-lucid"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "10.04"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "nebula/lucid"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "vishvananda", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - image = parser.apply(Iterables.get(result, 14)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "nebula/karmic-large"); - assertEquals(image.getId(), "us-east-1/ami-karmiclg"); - assertEquals(image.getProviderId(), "ami-karmiclg"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "9.10"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "nebula/karmic-large"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "admin", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - image = parser.apply(Iterables.get(result, 15)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "jo/qa-grinder.manifest.xml"); - assertEquals(image.getId(), "us-east-1/ami-8jen8kdn"); - assertEquals(image.getProviderId(), "ami-8jen8kdn"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "jo/qa-grinder.manifest.xml"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "jyothi", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - image = parser.apply(Iterables.get(result, 16)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "nebula/lucid-large"); - assertEquals(image.getId(), "us-east-1/ami-lucidlg"); - assertEquals(image.getProviderId(), "ami-lucidlg"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "10.04"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "nebula/lucid-large"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "vishvananda", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - image = parser.apply(Iterables.get(result, 17)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "demos/wordpress"); - assertEquals(image.getId(), "us-east-1/ami-6CD61336"); - assertEquals(image.getProviderId(), "ami-6CD61336"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), ""); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "demos/wordpress"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "admin", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); - - image = parser.apply(Iterables.get(result, 18)); - - assertEquals(image.getOperatingSystem().is64Bit(), true); - assertEquals(image.getDescription(), "nebula/ubuntu-karmic"); - assertEquals(image.getId(), "us-east-1/ami-25CB1213"); - assertEquals(image.getProviderId(), "ami-25CB1213"); - assertEquals(image.getLocation(), defaultLocation); - assertEquals(image.getName(), null); - assertEquals(image.getOperatingSystem().getName(), null); - assertEquals(image.getOperatingSystem().getVersion(), "9.10"); - assertEquals(image.getOperatingSystem().getArch(), "paravirtual"); - assertEquals(image.getOperatingSystem().getDescription(), "nebula/ubuntu-karmic"); - assertEquals(image.getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(image.getUserMetadata(), ImmutableMap. of("owner", "admin", "rootDeviceType", - "instance-store")); - assertEquals(image.getVersion(), null); + Set result = convertImages("/ec2/nova_images.xml"); + assertEquals( + new Gson().toJson(Iterables.get(result, 0)), + "{\"operatingSystem\":{\"arch\":\"paravirtual\",\"version\":\"\",\"description\":\"nasacms/image.manifest.xml\",\"is64Bit\":true},\"description\":\"nasacms/image.manifest.xml\",\"defaultCredentials\":{\"identity\":\"root\"},\"id\":\"us-east-1/ami-h30p5im0\",\"type\":\"IMAGE\",\"providerId\":\"ami-h30p5im0\",\"location\":{\"scope\":\"REGION\",\"id\":\"us-east-1\",\"description\":\"us-east-1\"},\"userMetadata\":{\"owner\":\"foo\",\"rootDeviceType\":\"instance-store\"}}"); + assertEquals( + new Gson().toJson(Iterables.get(result, 1)), + "{\"operatingSystem\":{\"arch\":\"paravirtual\",\"version\":\"\",\"description\":\"nebula/tiny\",\"is64Bit\":true},\"description\":\"nebula/tiny\",\"defaultCredentials\":{\"identity\":\"root\"},\"id\":\"us-east-1/ami-tiny\",\"type\":\"IMAGE\",\"providerId\":\"ami-tiny\",\"location\":{\"scope\":\"REGION\",\"id\":\"us-east-1\",\"description\":\"us-east-1\"},\"userMetadata\":{\"owner\":\"vishvananda\",\"rootDeviceType\":\"instance-store\"}}"); + assertEquals( + new Gson().toJson(Iterables.get(result, 2)), + "{\"operatingSystem\":{\"arch\":\"paravirtual\",\"version\":\"\",\"description\":\"demos/mediawiki\",\"is64Bit\":true},\"description\":\"demos/mediawiki\",\"defaultCredentials\":{\"identity\":\"root\"},\"id\":\"us-east-1/ami-630A130F\",\"type\":\"IMAGE\",\"providerId\":\"ami-630A130F\",\"location\":{\"scope\":\"REGION\",\"id\":\"us-east-1\",\"description\":\"us-east-1\"},\"userMetadata\":{\"owner\":\"admin\",\"rootDeviceType\":\"instance-store\"}}"); + assertEquals( + new Gson().toJson(Iterables.get(result, 3)), + "{\"operatingSystem\":{\"arch\":\"paravirtual\",\"version\":\"\",\"description\":\"pinglet/instances\",\"is64Bit\":true},\"description\":\"pinglet/instances\",\"defaultCredentials\":{\"identity\":\"root\"},\"id\":\"us-east-1/ami-pinginst\",\"type\":\"IMAGE\",\"providerId\":\"ami-pinginst\",\"location\":{\"scope\":\"REGION\",\"id\":\"us-east-1\",\"description\":\"us-east-1\"},\"userMetadata\":{\"owner\":\"admin\",\"rootDeviceType\":\"instance-store\"}}"); } - private Set parseImages(InputStream is) { - DescribeImagesResponseHandler handler = injector.getInstance(DescribeImagesResponseHandler.class); - addDefaultRegionToHandler(handler); - Set result = factory.create(handler).parse(is); - return result; + static Location defaultLocation = new LocationImpl(LocationScope.REGION, "us-east-1", "us-east-1", null); + + public static Set convertImages(String resource) { + Set result = DescribeImagesResponseHandlerTest.parseImages(resource); + ImageParser parser = new ImageParser(new EC2PopulateDefaultLoginCredentialsForImageStrategy(), + Suppliers.> ofInstance(ImmutableSet. of(defaultLocation)), + Suppliers.ofInstance(defaultLocation), "ec2"); + return Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(result, parser), Predicates.notNull())); } - private void addDefaultRegionToHandler(ParseSax.HandlerWithResult handler) { - GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); - expect(request.getArgs()).andReturn(new Object[] { null }).atLeastOnce(); - replay(request); - handler.setContext(request); - } } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java index 041a707e21..8ddf849bf5 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java @@ -19,39 +19,24 @@ package org.jclouds.aws.ec2.compute.functions; -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.jclouds.aws.ec2.options.DescribeImagesOptions.Builder.imageIds; +import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m1_small; import static org.testng.Assert.assertEquals; import java.net.UnknownHostException; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentMap; -import org.jclouds.aws.domain.Region; -import org.jclouds.aws.ec2.EC2Client; -import org.jclouds.aws.ec2.compute.domain.EC2Hardware; +import org.jclouds.aws.ec2.compute.config.EC2ComputeServiceContextModule; import org.jclouds.aws.ec2.compute.domain.RegionAndName; -import org.jclouds.aws.ec2.domain.Attachment; -import org.jclouds.aws.ec2.domain.AvailabilityZone; -import org.jclouds.aws.ec2.domain.Image; import org.jclouds.aws.ec2.domain.InstanceState; -import org.jclouds.aws.ec2.domain.InstanceType; -import org.jclouds.aws.ec2.domain.KeyPair; -import org.jclouds.aws.ec2.domain.RootDeviceType; import org.jclouds.aws.ec2.domain.RunningInstance; -import org.jclouds.aws.ec2.domain.RunningInstance.EbsBlockDevice; -import org.jclouds.aws.ec2.services.AMIClient; +import org.jclouds.aws.ec2.xml.DescribeInstancesResponseHandlerTest; import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.Volume; -import org.jclouds.compute.domain.internal.VolumeImpl; -import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; +import org.jclouds.compute.domain.Image; +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.date.DateService; import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.domain.Credentials; @@ -60,11 +45,11 @@ import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; import org.testng.annotations.Test; +import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import com.google.common.collect.Maps; /** @@ -76,807 +61,1021 @@ public class RunningInstanceToNodeMetadataTest { public void testAllStatesCovered() { for (InstanceState state : InstanceState.values()) { - assert RunningInstanceToNodeMetadata.instanceToNodeState.containsKey(state) : state; + assert EC2ComputeServiceContextModule.instanceToNodeState.containsKey(state) : state; } } + Location provider = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); + + @Test + public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationNotFoundButCredentialsFound() + throws UnknownHostException { + Credentials creds = new Credentials("root", "abdce"); + + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), + ImmutableSet. of(), ImmutableSet. of(), + ImmutableMap. of("us-east-1/i-9slweygo", creds)); + + RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213").id("us-east-1/i-9slweygo").providerId("i-9slweygo").build()); + } + + @Test + public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationNotFound() throws UnknownHostException { + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), + ImmutableSet. of(), ImmutableSet. of(), ImmutableMap. of()); + + RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213").id("us-east-1/i-9slweygo").providerId("i-9slweygo").build()); + } + + @Test + public void testApplyWhereTagDoesntMatchAndLocationFoundAndImageAndHardwareNotFound() throws UnknownHostException { + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet.of(provider), + ImmutableSet. of(), ImmutableMap. of()); + + RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213").id("us-east-1/i-9slweygo") + .providerId("i-9slweygo").location(provider).build()); + } + + @Test + public void testApplyWhereTagDoesntMatchAndImageAndLocationFoundAndHardwareNotFound() throws UnknownHostException { + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet.of(provider), + ImageParserTest.convertImages("/ec2/nova_images.xml"), ImmutableMap. of()); + + RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213") + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("9.10").arch("paravirtual") + .description("nebula/ubuntu-karmic").is64Bit(true).build()).id("us-east-1/i-9slweygo") + .providerId("i-9slweygo").location(provider).build()); + } + + @Test + public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationFound() throws UnknownHostException { + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.of(m1_small().build()), + ImmutableSet.of(provider), ImageParserTest.convertImages("/ec2/nova_images.xml"), + ImmutableMap. of()); + + RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213") + .hardware(m1_small().build()) + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("9.10").arch("paravirtual") + .description("nebula/ubuntu-karmic").is64Bit(true).build()).id("us-east-1/i-9slweygo") + .providerId("i-9slweygo").location(provider).build()); + } + + protected RunningInstance firstInstanceFromResource(String resource) { + RunningInstance server = Iterables.get( + Iterables.get(DescribeInstancesResponseHandlerTest.parseRunningInstances(resource), 0), 0); + return server; + } + + protected RunningInstanceToNodeMetadata createNodeParser(final ImmutableSet hardware, + final ImmutableSet locations, Set images, + Map credentialStore) { + Map instanceToNodeState = EC2ComputeServiceContextModule.instanceToNodeState; + + Map instanceToImage = Maps.uniqueIndex(images, new Function() { + + @Override + public RegionAndName apply(Image from) { + return new RegionAndName(from.getLocation().getId(), from.getProviderId()); + } + + }); + Supplier> locationSupplier = new Supplier>() { + + @Override + public Set get() { + return locations; + } + + }; + Supplier> hardwareSupplier = new Supplier>() { + + @Override + public Set get() { + return hardware; + } + + }; + RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(instanceToNodeState, credentialStore, + instanceToImage, locationSupplier, hardwareSupplier); + return parser; + } + DateService dateService = new SimpleDateFormatDateService(); - - @SuppressWarnings( { "unchecked" }) - @Test - public void testApplyWithEBSWhenBootIsInstanceStoreAndAvailabilityZoneNotFound() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); - Map credentialsMap = createMock(Map.class); - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M1_SMALL)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - Image image = createMock(Image.class); - - expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet.of("default")).atLeastOnce(); - expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - Location location = new LocationImpl(LocationScope.ZONE, "us-east-1d", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - expect(instance.getIpAddress()).andReturn("174.129.1.50"); - expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); - - expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); - - expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); - expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); - - expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("ami-1515f07c"))).andReturn( - (Set) ImmutableSet. of(image)); - - expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); - - expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "jclouds#tag#us-east-1#50"))).andReturn( - new KeyPair(Region.US_EAST_1, "jclouds#tag#us-east-1#50", "keyFingerprint", "pass")); - - expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); - - expect(instance.getInstanceType()).andReturn(InstanceType.M1_SMALL).atLeastOnce(); - expect(instance.getEbsBlockDevices()).andReturn( - ImmutableMap. of("/dev/sdg", new EbsBlockDevice("vol-1f20d376", - Attachment.Status.ATTACHED, dateService.iso8601DateParse("2009-12-11T16:32:46.000Z"), false), - "/dev/sdj", new EbsBlockDevice("vol-c0eb78aa", Attachment.Status.ATTACHED, dateService - .iso8601DateParse("2010-06-17T10:43:28.000Z"), false))); - expect(instance.getRootDeviceType()).andReturn(RootDeviceType.INSTANCE_STORE); - expect(instance.getRootDeviceName()).andReturn(null).atLeastOnce(); - - replay(imageMap); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - replay(jcImage); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - - assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); - assertEquals(metadata.getLocation(), null); - assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); - assertEquals(metadata.getHardware().getId(), "m1.small"); - assertEquals(metadata.getHardware().getName(), "m1.small"); - assertEquals(metadata.getHardware().getProviderId(), "m1.small"); - assertEquals(metadata.getHardware().getProcessors(), ImmutableList. of(new Processor(1.0, 1.0))); - assertEquals(metadata.getHardware().getRam(), 1740); - assertEquals(metadata.getHardware().getVolumes(), ImmutableList. of(new VolumeImpl(null, - Volume.Type.LOCAL, 10.0f, "/dev/sda1", true, false),// - new VolumeImpl(null, Volume.Type.LOCAL, 150.0f, "/dev/sda2", false, false),// - new VolumeImpl("vol-1f20d376", Volume.Type.SAN, null, "/dev/sdg", false, true),// - new VolumeImpl("vol-c0eb78aa", Volume.Type.SAN, null, "/dev/sdj", false, true))); - - assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - - } - - @SuppressWarnings( { "unchecked" }) - @Test - public void testApplyForNovaWhereNullAvailabilityZoneIpAddressNoGroups() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); - Map credentialsMap = createMock(Map.class); - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M1_SMALL)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - Image image = createMock(Image.class); - - expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); - expect(instance.getKeyName()).andReturn("nebulatanimislam").atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(region)); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - expect(instance.getIpAddress()).andReturn(null); - expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); - - expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); - - expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); - expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); - - expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("ami-1515f07c"))).andReturn( - (Set) ImmutableSet. of(image)); - - expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); - - expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "nebulatanimislam"))).andReturn(null); - - expect(instance.getAvailabilityZone()).andReturn(null).atLeastOnce(); - - expect(instance.getInstanceType()).andReturn(InstanceType.M1_SMALL).atLeastOnce(); - expect(instance.getEbsBlockDevices()).andReturn(Maps. newHashMap()); - expect(instance.getRootDeviceType()).andReturn(RootDeviceType.INSTANCE_STORE); - - replay(imageMap); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - replay(jcImage); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - - assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); - assertEquals(metadata.getLocation(), region); - assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); - assertEquals(metadata.getHardware().getId(), "m1.small"); - assertEquals(metadata.getHardware().getName(), "m1.small"); - assertEquals(metadata.getHardware().getProviderId(), "m1.small"); - assertEquals(metadata.getHardware().getProcessors(), ImmutableList. of(new Processor(1.0, 1.0))); - assertEquals(metadata.getHardware().getRam(), 1740); - assertEquals(metadata.getHardware().getVolumes(), ImmutableList. of(new VolumeImpl(null, - Volume.Type.LOCAL, 10.0f, "/dev/sda1", true, false),// - new VolumeImpl(null, Volume.Type.LOCAL, 150.0f, "/dev/sda2", false, false))); - - assertEquals(metadata.getCredentials(), new Credentials("user", null)); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - - } - - @SuppressWarnings( { "unchecked" }) - @Test - public void testApplyWhereUnknownInstanceType() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); - Map credentialsMap = createMock(Map.class); - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M1_SMALL)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - Image image = createMock(Image.class); - - expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); - expect(instance.getKeyName()).andReturn("nebulatanimislam").atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(region)); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - expect(instance.getIpAddress()).andReturn(null); - expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); - - expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); - - expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); - expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); - - expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("ami-1515f07c"))).andReturn( - (Set) ImmutableSet. of(image)); - - expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); - - expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "nebulatanimislam"))).andReturn(null); - - expect(instance.getAvailabilityZone()).andReturn(null).atLeastOnce(); - - expect(instance.getInstanceType()).andReturn("hhttpp").atLeastOnce(); - - replay(imageMap); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - replay(jcImage); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - - assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); - assertEquals(metadata.getLocation(), region); - assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); - assertEquals(metadata.getHardware(), null); - - assertEquals(metadata.getCredentials(), new Credentials("user", null)); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - - } - - @SuppressWarnings( { "unchecked" }) - @Test - public void testApplyForNovaWhereImageNotFound() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); - Map credentialsMap = createMock(Map.class); - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M1_SMALL)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - - expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); - expect(instance.getKeyName()).andReturn("nebulatanimislam").atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(region)); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - expect(instance.getIpAddress()).andReturn(null); - expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); - - expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); - - expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); - expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); - - expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("ami-1515f07c"))).andReturn( - (Set) ImmutableSet. of()); - - expect(credentialProvider.execute(null)).andReturn(new Credentials("root", null)); - - expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "nebulatanimislam"))).andReturn(null); - - expect(instance.getAvailabilityZone()).andReturn(null).atLeastOnce(); - - expect(instance.getInstanceType()).andReturn(InstanceType.M1_SMALL).atLeastOnce(); - expect(instance.getEbsBlockDevices()).andReturn(Maps. newHashMap()); - expect(instance.getRootDeviceType()).andReturn(RootDeviceType.INSTANCE_STORE); - - replay(imageMap); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - replay(jcImage); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - - assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); - assertEquals(metadata.getLocation(), region); - assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); - assertEquals(metadata.getHardware().getId(), "m1.small"); - assertEquals(metadata.getHardware().getName(), "m1.small"); - assertEquals(metadata.getHardware().getProviderId(), "m1.small"); - assertEquals(metadata.getHardware().getProcessors(), ImmutableList. of(new Processor(1.0, 1.0))); - assertEquals(metadata.getHardware().getRam(), 1740); - assertEquals(metadata.getHardware().getVolumes(), ImmutableList. of(new VolumeImpl(null, - Volume.Type.LOCAL, 10.0f, "/dev/sda1", true, false),// - new VolumeImpl(null, Volume.Type.LOCAL, 150.0f, "/dev/sda2", false, false))); - - assertEquals(metadata.getCredentials(), new Credentials("root", null)); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - - } - - @SuppressWarnings("unchecked") - @Test - public void testImageNotFoundAndLazyReturnsNull() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - - Map credentialsMap = createMock(Map.class); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - - Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M2_4XLARGE)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - - expect(instance.getId()).andReturn("id").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); - expect(instance.getKeyName()).andReturn(null).atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - expect(instance.getIpAddress()).andReturn("127.0.0.1"); - expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); - - expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); - - expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); - expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); - - expect(imageMap.get(new RegionAndName("us-east-1", "imageId"))).andReturn(null); - - expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); - - replay(imageMap); - replay(jcImage); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - assertEquals(metadata.getLocation(), locations.get().iterator().next()); - assertEquals(metadata.getImageId(), "us-east-1/imageId"); - assertEquals(metadata.getTag(), "NOTAG-id"); - assertEquals(metadata.getCredentials(), null); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - } - - @SuppressWarnings("unchecked") - @Test - public void testImageNotFoundStillSetsImageId() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - Map credentialsMap = createMock(Map.class); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - - Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M2_4XLARGE)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - - expect(instance.getId()).andReturn("id").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); - expect(instance.getKeyName()).andReturn(null).atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - expect(instance.getIpAddress()).andReturn("127.0.0.1"); - expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); - - expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); - - expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); - expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); - - expect(imageMap.get(new RegionAndName("us-east-1", "imageId"))).andThrow(new NullPointerException()) - .atLeastOnce(); - - expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); - - replay(imageMap); - replay(jcImage); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - assertEquals(metadata.getLocation(), locations.get().iterator().next()); - assertEquals(metadata.getImageId(), "us-east-1/imageId"); - assertEquals(metadata.getTag(), "NOTAG-id"); - assertEquals(metadata.getCredentials(), null); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - } - - @SuppressWarnings("unchecked") - @Test - public void testImageNotFoundAndLazySucceeds() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - Map credentialsMap = createMock(Map.class); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - - Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M2_4XLARGE)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - - expect(instance.getId()).andReturn("id").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); - expect(instance.getKeyName()).andReturn(null).atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - expect(instance.getIpAddress()).andReturn("127.0.0.1"); - expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); - - expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); - - expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); - expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); - - org.jclouds.compute.domain.Image lateImage = createMock(org.jclouds.compute.domain.Image.class); - - expect(imageMap.get(new RegionAndName("us-east-1", "imageId"))).andReturn(lateImage).atLeastOnce(); - expect(lateImage.getId()).andReturn("us-east-1/imageId").atLeastOnce(); - expect(lateImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); - - replay(lateImage); - replay(imageMap); - replay(jcImage); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - assertEquals(metadata.getLocation(), locations.get().iterator().next()); - assertEquals(metadata.getImageId(), lateImage.getId()); - assertEquals(metadata.getTag(), "NOTAG-id"); - assertEquals(metadata.getCredentials(), null); - - verify(lateImage); - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - } - - @SuppressWarnings("unchecked") - @Test - public void testApplyWithNoSecurityGroupCreatesTagOfIdPrefixedByTagAndNullCredentials() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - Map credentialsMap = createMock(Map.class); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - - Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M2_4XLARGE)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - - expect(instance.getId()).andReturn("id").atLeastOnce(); - expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); - expect(instance.getKeyName()).andReturn(null).atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - expect(instance.getIpAddress()).andReturn("127.0.0.1"); - expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); - - expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); - - expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); - expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); - - expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); - - replay(imageMap); - replay(jcImage); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - assertEquals(metadata.getLocation(), locations.get().iterator().next()); - assertEquals(metadata.getImageId(), "us-east-1/imageId"); - assertEquals(metadata.getTag(), "NOTAG-id"); - assertEquals(metadata.getCredentials(), null); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - } - - @SuppressWarnings("unchecked") - @Test - public void testApplyWithNoKeyPairCreatesTagOfParsedSecurityGroupAndNullCredentials() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - Map credentialsMap = createMock(Map.class); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - - Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M2_4XLARGE)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - - expect(instance.getId()).andReturn("id").atLeastOnce(); - expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds#tag#us-east-1")).atLeastOnce(); - expect(instance.getKeyName()).andReturn(null).atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - expect(instance.getIpAddress()).andReturn("127.0.0.1"); - expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); - - expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); - - expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); - expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); - - expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); - - replay(imageMap); - replay(jcImage); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - assertEquals(metadata.getLocation(), locations.get().iterator().next()); - assertEquals(metadata.getImageId(), "us-east-1/imageId"); - assertEquals(metadata.getTag(), "tag"); - assertEquals(metadata.getCredentials(), null); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - } - - @SuppressWarnings( { "unchecked" }) - @Test - public void testApplyWithKeyPairCreatesTagOfParsedSecurityGroupAndCredentialsBasedOnIt() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); - Map credentialsMap = createMock(Map.class); - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M2_4XLARGE)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - Image image = createMock(Image.class); - - expect(instance.getId()).andReturn("id").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds#tag#us-east-1")).atLeastOnce(); - expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - expect(instance.getIpAddress()).andReturn("127.0.0.1"); - expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); - - expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); - - expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); - expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); - - expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("imageId"))).andReturn( - (Set) ImmutableSet. of(image)); - - expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); - - expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "jclouds#tag#us-east-1#50"))).andReturn( - new KeyPair(Region.US_EAST_1, "jclouds#tag#us-east-1#50", "keyFingerprint", "pass")); - - expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); - - expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); - - replay(imageMap); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - replay(jcImage); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - NodeMetadata metadata = parser.apply(instance); - - assertEquals(metadata.getTag(), "tag"); - assertEquals(metadata.getLocation(), location); - assertEquals(metadata.getImageId(), "us-east-1/imageId"); - - assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - - } - - @SuppressWarnings( { "unchecked" }) - @Test - public void testApplyWithTwoSecurityGroups() throws UnknownHostException { - EC2Client client = createMock(EC2Client.class); - AMIClient amiClient = createMock(AMIClient.class); - expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); - Map credentialsMap = createMock(Map.class); - ConcurrentMap imageMap = createMock(ConcurrentMap.class); - Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(EC2Hardware.M2_4XLARGE)); - PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); - RunningInstance instance = createMock(RunningInstance.class); - Image image = createMock(Image.class); - - expect(instance.getId()).andReturn("id").atLeastOnce(); - expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds1", "jclouds2")).atLeastOnce(); - expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce(); - expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); - - Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); - - expect(instance.getIpAddress()).andReturn("127.0.0.1"); - expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); - - expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); - - expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); - expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); - - expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("imageId"))).andReturn( - (Set) ImmutableSet. of(image)); - - expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); - - expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, "jclouds#tag#us-east-1#50"))).andReturn( - new KeyPair(Region.US_EAST_1, "jclouds#tag#us-east-1#50", "keyFingerprint", "pass")); - - expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); - - expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); - - replay(imageMap); - replay(client); - replay(amiClient); - replay(credentialsMap); - replay(credentialProvider); - replay(instance); - replay(jcImage); - - RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap, - credentialProvider, imageMap, locations, hardwares); - - NodeMetadata metadata = parser.apply(instance); - - assertEquals(metadata.getTag(), "NOTAG-id"); - assertEquals(metadata.getLocation(), location); - assertEquals(metadata.getImageId(), "us-east-1/imageId"); - - assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); - - verify(imageMap); - verify(jcImage); - verify(client); - verify(amiClient); - verify(credentialsMap); - verify(credentialProvider); - verify(instance); - - } + // + // @SuppressWarnings({ "unchecked" }) + // @Test + // public void testApplyWithEBSWhenBootIsInstanceStoreAndAvailabilityZoneNotFound() throws + // UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); + // Map credentialsMap = createMock(Map.class); + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m1_small().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // Image image = createMock(Image.class); + // + // expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet.of("default")).atLeastOnce(); + // expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1d", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(location)); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // expect(instance.getIpAddress()).andReturn("174.129.1.50"); + // expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); + // + // expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); + // + // expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); + // expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); + // + // expect(amiClient.describeImagesInRegion(Region.US_EAST_1, + // imageIds("ami-1515f07c"))).andReturn( + // (Set) ImmutableSet. of(image)); + // + // expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); + // + // expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, + // "jclouds#tag#us-east-1#50"))).andReturn( + // new KeyPair(Region.US_EAST_1, "jclouds#tag#us-east-1#50", "keyFingerprint", "pass")); + // + // expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.M1_SMALL).atLeastOnce(); + // expect(instance.getEbsBlockDevices()).andReturn( + // ImmutableMap. of( + // "/dev/sdg", + // new EbsBlockDevice("vol-1f20d376", Attachment.Status.ATTACHED, dateService + // .iso8601DateParse("2009-12-11T16:32:46.000Z"), false), + // "/dev/sdj", + // new EbsBlockDevice("vol-c0eb78aa", Attachment.Status.ATTACHED, dateService + // .iso8601DateParse("2010-06-17T10:43:28.000Z"), false))); + // expect(instance.getRootDeviceType()).andReturn(RootDeviceType.INSTANCE_STORE); + // expect(instance.getRootDeviceName()).andReturn(null).atLeastOnce(); + // + // replay(imageMap); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // replay(jcImage); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // + // assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); + // assertEquals(metadata.getLocation(), null); + // assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); + // assertEquals(metadata.getHardware().getId(), "m1.small"); + // assertEquals(metadata.getHardware().getName(), "m1.small"); + // assertEquals(metadata.getHardware().getProviderId(), "m1.small"); + // assertEquals(metadata.getHardware().getProcessors(), ImmutableList. of(new + // Processor(1.0, 1.0))); + // assertEquals(metadata.getHardware().getRam(), 1740); + // assertEquals(metadata.getHardware().getVolumes(), + // ImmutableList. of(new VolumeImpl(null, Volume.Type.LOCAL, 10.0f, "/dev/sda1", true, + // false),// + // new VolumeImpl(null, Volume.Type.LOCAL, 150.0f, "/dev/sda2", false, false),// + // new VolumeImpl("vol-1f20d376", Volume.Type.SAN, null, "/dev/sdg", false, true),// + // new VolumeImpl("vol-c0eb78aa", Volume.Type.SAN, null, "/dev/sdj", false, true))); + // + // assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // + // } + // + // @SuppressWarnings({ "unchecked" }) + // @Test + // public void testApplyForNovaWhereTagDoesntMatchAndNullAvailabilityZoneIpAddressNoGroups() + // throws + // UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); + // Map credentialsMap = createMock(Map.class); + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m1_small().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // Image image = createMock(Image.class); + // + // expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); + // expect(instance.getKeyName()).andReturn("nebulatanimislam").atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(region)); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // expect(instance.getIpAddress()).andReturn(null); + // expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); + // + // expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); + // + // expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); + // expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); + // + // expect(amiClient.describeImagesInRegion(Region.US_EAST_1, + // imageIds("ami-1515f07c"))).andReturn( + // (Set) ImmutableSet. of(image)); + // + // expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); + // + // expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, + // "nebulatanimislam"))).andReturn(null); + // + // expect(instance.getAvailabilityZone()).andReturn(null).atLeastOnce(); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.M1_SMALL).atLeastOnce(); + // expect(instance.getEbsBlockDevices()).andReturn(Maps. newHashMap()); + // expect(instance.getRootDeviceType()).andReturn(RootDeviceType.INSTANCE_STORE); + // + // replay(imageMap); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // replay(jcImage); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // + // assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); + // assertEquals(metadata.getLocation(), region); + // assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); + // assertEquals(metadata.getHardware().getId(), "m1.small"); + // assertEquals(metadata.getHardware().getName(), "m1.small"); + // assertEquals(metadata.getHardware().getProviderId(), "m1.small"); + // assertEquals(metadata.getHardware().getProcessors(), ImmutableList. of(new + // Processor(1.0, 1.0))); + // assertEquals(metadata.getHardware().getRam(), 1740); + // assertEquals(metadata.getHardware().getVolumes(), + // ImmutableList. of(new VolumeImpl(null, Volume.Type.LOCAL, 10.0f, "/dev/sda1", true, + // false),// + // new VolumeImpl(null, Volume.Type.LOCAL, 150.0f, "/dev/sda2", false, false))); + // + // assertEquals(metadata.getCredentials(), new Credentials("user", null)); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // + // } + // + // @SuppressWarnings({ "unchecked" }) + // @Test + // public void testApplyWhereTagDoesntMatchAndUnknownInstanceType() throws UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); + // Map credentialsMap = createMock(Map.class); + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m1_small().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // Image image = createMock(Image.class); + // + // expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); + // expect(instance.getKeyName()).andReturn("nebulatanimislam").atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(region)); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // expect(instance.getIpAddress()).andReturn(null); + // expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); + // + // expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); + // + // expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); + // expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); + // + // expect(amiClient.describeImagesInRegion(Region.US_EAST_1, + // imageIds("ami-1515f07c"))).andReturn( + // (Set) ImmutableSet. of(image)); + // + // expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); + // + // expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, + // "nebulatanimislam"))).andReturn(null); + // + // expect(instance.getAvailabilityZone()).andReturn(null).atLeastOnce(); + // + // expect(instance.getInstanceType()).andReturn("hhttpp").atLeastOnce(); + // + // replay(imageMap); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // replay(jcImage); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // + // assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); + // assertEquals(metadata.getLocation(), region); + // assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); + // assertEquals(metadata.getHardware(), null); + // + // assertEquals(metadata.getCredentials(), new Credentials("user", null)); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // + // } + // + // @SuppressWarnings({ "unchecked" }) + // @Test + // public void testApplyForNovaWhereTagDoesntMatchAndImageNotFound() throws UnknownHostException + // { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); + // Map credentialsMap = createMock(Map.class); + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m1_small().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // + // expect(instance.getId()).andReturn("i-3d640055").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); + // expect(instance.getKeyName()).andReturn("nebulatanimislam").atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(region)); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // expect(instance.getIpAddress()).andReturn(null); + // expect(instance.getPrivateIpAddress()).andReturn("10.202.117.241"); + // + // expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); + // + // expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("ami-1515f07c").atLeastOnce(); + // expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "ami-1515f07c"))).andReturn(jcImage); + // + // expect(amiClient.describeImagesInRegion(Region.US_EAST_1, + // imageIds("ami-1515f07c"))).andReturn( + // (Set) ImmutableSet. of()); + // + // expect(credentialProvider.execute(null)).andReturn(new Credentials("root", null)); + // + // expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, + // "nebulatanimislam"))).andReturn(null); + // + // expect(instance.getAvailabilityZone()).andReturn(null).atLeastOnce(); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.M1_SMALL).atLeastOnce(); + // expect(instance.getEbsBlockDevices()).andReturn(Maps. newHashMap()); + // expect(instance.getRootDeviceType()).andReturn(RootDeviceType.INSTANCE_STORE); + // + // replay(imageMap); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // replay(jcImage); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // + // assertEquals(metadata.getTag(), "NOTAG-i-3d640055"); + // assertEquals(metadata.getLocation(), region); + // assertEquals(metadata.getImageId(), "us-east-1/ami-1515f07c"); + // assertEquals(metadata.getHardware().getId(), "m1.small"); + // assertEquals(metadata.getHardware().getName(), "m1.small"); + // assertEquals(metadata.getHardware().getProviderId(), "m1.small"); + // assertEquals(metadata.getHardware().getProcessors(), ImmutableList. of(new + // Processor(1.0, 1.0))); + // assertEquals(metadata.getHardware().getRam(), 1740); + // assertEquals(metadata.getHardware().getVolumes(), + // ImmutableList. of(new VolumeImpl(null, Volume.Type.LOCAL, 10.0f, "/dev/sda1", true, + // false),// + // new VolumeImpl(null, Volume.Type.LOCAL, 150.0f, "/dev/sda2", false, false))); + // + // assertEquals(metadata.getCredentials(), new Credentials("root", null)); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // + // } + // + // @SuppressWarnings("unchecked") + // @Test + // public void testImageNotFoundAndLazyReturnsNull() throws UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // + // Map credentialsMap = createMock(Map.class); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // + // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(location)); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m2_4xlarge().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // + // expect(instance.getId()).andReturn("id").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); + // expect(instance.getKeyName()).andReturn(null).atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // expect(instance.getIpAddress()).andReturn("127.0.0.1"); + // expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); + // + // expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); + // expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); + // + // expect(imageMap.get(new RegionAndName("us-east-1", "imageId"))).andReturn(null); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); + // + // replay(imageMap); + // replay(jcImage); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // assertEquals(metadata.getLocation(), locations.get().iterator().next()); + // assertEquals(metadata.getImageId(), "us-east-1/imageId"); + // assertEquals(metadata.getTag(), "NOTAG-id"); + // assertEquals(metadata.getCredentials(), null); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // } + // + // @SuppressWarnings("unchecked") + // @Test + // public void testImageNotFoundStillSetsImageId() throws UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // Map credentialsMap = createMock(Map.class); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // + // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(location)); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m2_4xlarge().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // + // expect(instance.getId()).andReturn("id").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); + // expect(instance.getKeyName()).andReturn(null).atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // expect(instance.getIpAddress()).andReturn("127.0.0.1"); + // expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); + // + // expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); + // expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); + // + // expect(imageMap.get(new RegionAndName("us-east-1", "imageId"))).andThrow(new + // NullPointerException()) + // .atLeastOnce(); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); + // + // replay(imageMap); + // replay(jcImage); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // assertEquals(metadata.getLocation(), locations.get().iterator().next()); + // assertEquals(metadata.getImageId(), "us-east-1/imageId"); + // assertEquals(metadata.getTag(), "NOTAG-id"); + // assertEquals(metadata.getCredentials(), null); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // } + // + // @SuppressWarnings("unchecked") + // @Test + // public void testImageNotFoundAndLazySucceeds() throws UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // Map credentialsMap = createMock(Map.class); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // + // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(location)); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m2_4xlarge().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // + // expect(instance.getId()).andReturn("id").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); + // expect(instance.getKeyName()).andReturn(null).atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // expect(instance.getIpAddress()).andReturn("127.0.0.1"); + // expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); + // + // expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); + // expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); + // + // org.jclouds.compute.domain.Image lateImage = + // createMock(org.jclouds.compute.domain.Image.class); + // + // expect(imageMap.get(new RegionAndName("us-east-1", + // "imageId"))).andReturn(lateImage).atLeastOnce(); + // expect(lateImage.getId()).andReturn("us-east-1/imageId").atLeastOnce(); + // expect(lateImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); + // + // replay(lateImage); + // replay(imageMap); + // replay(jcImage); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // assertEquals(metadata.getLocation(), locations.get().iterator().next()); + // assertEquals(metadata.getImageId(), lateImage.getId()); + // assertEquals(metadata.getTag(), "NOTAG-id"); + // assertEquals(metadata.getCredentials(), null); + // + // verify(lateImage); + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // } + // + // @SuppressWarnings("unchecked") + // @Test + // public void testApplyWithNoSecurityGroupCreatesTagOfIdPrefixedByTagAndNullCredentials() throws + // UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // Map credentialsMap = createMock(Map.class); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // + // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(location)); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m2_4xlarge().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // + // expect(instance.getId()).andReturn("id").atLeastOnce(); + // expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet. of()).atLeastOnce(); + // expect(instance.getKeyName()).andReturn(null).atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // expect(instance.getIpAddress()).andReturn("127.0.0.1"); + // expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); + // + // expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); + // + // expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); + // expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); + // + // replay(imageMap); + // replay(jcImage); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // assertEquals(metadata.getLocation(), locations.get().iterator().next()); + // assertEquals(metadata.getImageId(), "us-east-1/imageId"); + // assertEquals(metadata.getTag(), "NOTAG-id"); + // assertEquals(metadata.getCredentials(), null); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // } + // + // @SuppressWarnings("unchecked") + // @Test + // public void testApplyWithNoKeyPairCreatesTagOfParsedSecurityGroupAndNullCredentials() throws + // UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // Map credentialsMap = createMock(Map.class); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // + // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(location)); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m2_4xlarge().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // + // expect(instance.getId()).andReturn("id").atLeastOnce(); + // expect(instance.getRegion()).andReturn("us-east-1").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds#tag#us-east-1")).atLeastOnce(); + // expect(instance.getKeyName()).andReturn(null).atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // expect(instance.getIpAddress()).andReturn("127.0.0.1"); + // expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); + // + // expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); + // + // expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); + // expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); + // + // replay(imageMap); + // replay(jcImage); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // assertEquals(metadata.getLocation(), locations.get().iterator().next()); + // assertEquals(metadata.getImageId(), "us-east-1/imageId"); + // assertEquals(metadata.getTag(), "tag"); + // assertEquals(metadata.getCredentials(), null); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // } + // + // @SuppressWarnings({ "unchecked" }) + // @Test + // public void testApplyWithKeyPairCreatesTagOfParsedSecurityGroupAndCredentialsBasedOnIt() + // throws UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); + // Map credentialsMap = createMock(Map.class); + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m2_4xlarge().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // Image image = createMock(Image.class); + // + // expect(instance.getId()).andReturn("id").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds#tag#us-east-1")).atLeastOnce(); + // expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(location)); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // expect(instance.getIpAddress()).andReturn("127.0.0.1"); + // expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); + // + // expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); + // + // expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); + // expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); + // + // expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("imageId"))).andReturn( + // (Set) ImmutableSet. of(image)); + // + // expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); + // + // expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, + // "jclouds#tag#us-east-1#50"))).andReturn( + // new KeyPair(Region.US_EAST_1, "jclouds#tag#us-east-1#50", "keyFingerprint", "pass")); + // + // expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); + // + // replay(imageMap); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // replay(jcImage); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // NodeMetadata metadata = parser.apply(instance); + // + // assertEquals(metadata.getTag(), "tag"); + // assertEquals(metadata.getLocation(), location); + // assertEquals(metadata.getImageId(), "us-east-1/imageId"); + // + // assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // + // } + // + // @SuppressWarnings({ "unchecked" }) + // @Test + // public void testApplyWithTwoSecurityGroups() throws UnknownHostException { + // EC2Client client = createMock(EC2Client.class); + // AMIClient amiClient = createMock(AMIClient.class); + // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); + // Map credentialsMap = createMock(Map.class); + // ConcurrentMap imageMap = + // createMock(ConcurrentMap.class); + // Supplier> hardwares = Suppliers.> + // ofInstance(ImmutableSet + // . of(m2_4xlarge().build())); + // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = + // createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); + // RunningInstance instance = createMock(RunningInstance.class); + // Image image = createMock(Image.class); + // + // expect(instance.getId()).andReturn("id").atLeastOnce(); + // expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds1", + // "jclouds2")).atLeastOnce(); + // expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce(); + // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); + // + // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); + // Supplier> locations = Suppliers.> + // ofInstance(ImmutableSet + // . of(location)); + // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + // + // expect(instance.getIpAddress()).andReturn("127.0.0.1"); + // expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1"); + // + // expect(instance.getRegion()).andReturn(Region.US_EAST_1).atLeastOnce(); + // + // expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); + // + // expect(instance.getImageId()).andReturn("imageId").atLeastOnce(); + // expect(imageMap.get(new RegionAndName(Region.US_EAST_1, "imageId"))).andReturn(jcImage); + // + // expect(amiClient.describeImagesInRegion(Region.US_EAST_1, imageIds("imageId"))).andReturn( + // (Set) ImmutableSet. of(image)); + // + // expect(credentialProvider.execute(image)).andReturn(new Credentials("user", "pass")); + // + // expect(credentialsMap.get(new RegionAndName(Region.US_EAST_1, + // "jclouds#tag#us-east-1#50"))).andReturn( + // new KeyPair(Region.US_EAST_1, "jclouds#tag#us-east-1#50", "keyFingerprint", "pass")); + // + // expect(instance.getAvailabilityZone()).andReturn(AvailabilityZone.US_EAST_1A).atLeastOnce(); + // + // expect(instance.getInstanceType()).andReturn(InstanceType.C1_XLARGE).atLeastOnce(); + // + // replay(imageMap); + // replay(client); + // replay(amiClient); + // replay(credentialsMap); + // replay(credentialProvider); + // replay(instance); + // replay(jcImage); + // + // Function parser = new RunningInstanceToNodeMetadata(client, + // credentialsMap, + // credentialProvider, imageMap, locations, hardwares); + // + // NodeMetadata metadata = parser.apply(instance); + // + // assertEquals(metadata.getTag(), "NOTAG-id"); + // assertEquals(metadata.getLocation(), location); + // assertEquals(metadata.getImageId(), "us-east-1/imageId"); + // + // assertEquals(metadata.getCredentials(), new Credentials("user", "pass")); + // + // verify(imageMap); + // verify(jcImage); + // verify(client); + // verify(amiClient); + // verify(credentialsMap); + // verify(credentialProvider); + // verify(instance); + // + // } } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/internal/EC2TemplateBuilderImplTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/internal/EC2TemplateBuilderImplTest.java index 8b56c4456e..72b4598821 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/internal/EC2TemplateBuilderImplTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/internal/EC2TemplateBuilderImplTest.java @@ -23,6 +23,7 @@ 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.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.c1_medium; import static org.testng.Assert.assertEquals; import java.util.NoSuchElementException; @@ -36,14 +37,10 @@ import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.domain.Volume; -import org.jclouds.compute.domain.internal.HardwareImpl; import org.jclouds.compute.domain.internal.TemplateBuilderImpl; import org.jclouds.compute.domain.internal.TemplateBuilderImplTest; import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.compute.predicates.ImagePredicates; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; @@ -52,8 +49,6 @@ import org.testng.annotations.Test; import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.MapMaker; import com.google.common.collect.Sets; @@ -72,22 +67,22 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { @Override protected EC2TemplateBuilderImpl createTemplateBuilder(final Image knownImage, - Supplier> locations, Supplier> images, - Supplier> sizes, Location defaultLocation, - Provider optionsProvider, Provider templateBuilderProvider) { + Supplier> locations, Supplier> images, + Supplier> sizes, Location defaultLocation, Provider optionsProvider, + Provider templateBuilderProvider) { final RegionAndName knownRegionAndName = new RegionAndName("region", "ami"); ConcurrentMap imageMap = new MapMaker() - .makeComputingMap(new Function() { - @Override - public Image apply(RegionAndName from) { - return from.equals(knownRegionAndName) ? knownImage : null; - } + .makeComputingMap(new Function() { + @Override + public Image apply(RegionAndName from) { + return from.equals(knownRegionAndName) ? knownImage : null; + } - }); + }); return new EC2TemplateBuilderImpl(locations, images, sizes, Suppliers.ofInstance(defaultLocation), - optionsProvider, templateBuilderProvider, imageMap); + optionsProvider, templateBuilderProvider, imageMap); } @SuppressWarnings("unchecked") @@ -96,13 +91,11 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { Location location = new LocationImpl(LocationScope.REGION, "region", "region", null); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); + . of(location)); Supplier> images = Suppliers.> ofInstance(Sets - . newLinkedHashSet()); + . newLinkedHashSet()); Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(new HardwareImpl("1", "1", "region/1", location, null, - ImmutableMap. of(), ImmutableList.of(new Processor(1, 1.0)), 1, ImmutableList - . of(), ImagePredicates.any()))); + . of(c1_medium().build())); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -134,7 +127,7 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(knownImage, locations, images, sizes, location, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); assertEquals(template.imageId("region/ami").build().getImage(), knownImage); @@ -151,12 +144,10 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { Location location = new LocationImpl(LocationScope.REGION, "region", "region", null); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); + . of(location)); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(new HardwareImpl("1", "1", "region/1", location, null, - ImmutableMap. of(), ImmutableList.of(new Processor(1, 1.0)), 1, ImmutableList - . of(), ImagePredicates.any()))); + . of(c1_medium().build())); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -171,7 +162,7 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(knownImage, locations, images, sizes, location, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); try { template.imageId("ami").build(); assert false; @@ -190,12 +181,10 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { Location location = new LocationImpl(LocationScope.REGION, "region", "region", null); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); + . of(location)); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(new HardwareImpl("1", "1", "region/1", location, null, - ImmutableMap. of(), ImmutableList.of(new Processor(1, 1.0)), 1, ImmutableList - . of(), ImagePredicates.any()))); + . of(c1_medium().build())); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); @@ -213,7 +202,7 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(knownImage, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); assertEquals(template.imageId("region/bad").build().getImage(), knownImage); diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java index bde0cf8938..c65f73be49 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/strategy/CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsTest.java @@ -31,7 +31,7 @@ import java.util.Set; import org.jclouds.aws.domain.Region; import org.jclouds.aws.ec2.compute.EC2ComputeServiceTest; -import org.jclouds.aws.ec2.compute.domain.EC2Hardware; +import org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder; import org.jclouds.aws.ec2.compute.domain.RegionAndName; import org.jclouds.aws.ec2.compute.domain.RegionNameAndIngressRules; import org.jclouds.aws.ec2.compute.functions.CreatePlacementGroupIfNeeded; @@ -41,6 +41,7 @@ import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions; import org.jclouds.aws.ec2.domain.KeyPair; import org.jclouds.aws.ec2.domain.PlacementGroup; import org.jclouds.aws.ec2.options.RunInstancesOptions; +import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Template; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.encryption.internal.Base64; @@ -59,7 +60,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // setup constants String region = Region.AP_SOUTHEAST_1; String tag = "tag"; - EC2Hardware size = EC2Hardware.M1_SMALL; + Hardware size = EC2HardwareBuilder.m1_small().build(); String systemGeneratedKeyPairName = "systemGeneratedKeyPair"; String generatedGroup = "group"; Set generatedGroups = ImmutableSet.of(generatedGroup); @@ -115,7 +116,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // setup constants String region = Region.US_EAST_1; String tag = "tag"; - EC2Hardware size = EC2ComputeServiceTest.CC1_4XLARGE; + Hardware size = EC2ComputeServiceTest.CC1_4XLARGE; String systemGeneratedKeyPairName = "systemGeneratedKeyPair"; String generatedGroup = "group"; Set generatedGroups = ImmutableSet.of(generatedGroup); @@ -174,7 +175,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // setup constants String region = Region.US_EAST_1; String tag = "tag"; - EC2Hardware size = EC2ComputeServiceTest.CC1_4XLARGE; + Hardware size = EC2ComputeServiceTest.CC1_4XLARGE; String systemGeneratedKeyPairName = "systemGeneratedKeyPair"; String generatedGroup = "group"; Set generatedGroups = ImmutableSet.of(generatedGroup); @@ -233,7 +234,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // setup constants String region = Region.AP_SOUTHEAST_1; String tag = "tag"; - EC2Hardware size = EC2Hardware.M1_SMALL; + Hardware size = EC2HardwareBuilder.m1_small().build(); String systemGeneratedKeyPairName = "systemGeneratedKeyPair"; // create mocks @@ -286,7 +287,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptionsT // setup constants String region = Region.AP_SOUTHEAST_1; String tag = "tag"; - EC2Hardware size = EC2Hardware.M1_SMALL; + Hardware size = EC2HardwareBuilder.m1_small().build(); String systemGeneratedKeyPairName = "systemGeneratedKeyPair"; String generatedGroup = "group"; Set generatedGroups = ImmutableSet.of(generatedGroup); diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java index df0ecfbd59..8dde1b4cf5 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/strategy/EC2RunNodesAndAddToSetStrategyTest.java @@ -32,7 +32,6 @@ import java.util.Set; import org.easymock.IArgumentMatcher; import org.jclouds.aws.domain.Region; import org.jclouds.aws.ec2.EC2Client; -import org.jclouds.aws.ec2.compute.domain.EC2Hardware; import org.jclouds.aws.ec2.compute.functions.RunningInstanceToNodeMetadata; import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions; import org.jclouds.aws.ec2.domain.AvailabilityZone; @@ -40,15 +39,18 @@ import org.jclouds.aws.ec2.domain.Reservation; import org.jclouds.aws.ec2.domain.RunningInstance; import org.jclouds.aws.ec2.options.RunInstancesOptions; import org.jclouds.aws.ec2.services.InstanceClient; +import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; 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.LocationScope; import org.jclouds.domain.internal.LocationImpl; import org.testng.annotations.Test; +import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; @@ -90,7 +92,7 @@ public class EC2RunNodesAndAddToSetStrategyTest { return null; } - @SuppressWarnings({ "unchecked"}) + @SuppressWarnings({ "unchecked" }) private void assertRegionAndZoneForLocation(Location location, String region, String zone) { String imageId = "ami1"; String instanceCreatedId = "instance1"; @@ -100,29 +102,36 @@ public class EC2RunNodesAndAddToSetStrategyTest { InstanceClient instanceClient = createMock(InstanceClient.class); RunInstancesOptions ec2Options = createMock(RunInstancesOptions.class); RunningInstance instance = createMock(RunningInstance.class); - Reservation reservation = new Reservation(region, ImmutableSet - . of(), ImmutableSet. of(instance), "ownerId", "requesterId", "reservationId"); + Reservation reservation = new Reservation(region, + ImmutableSet. of(), ImmutableSet. of(instance), "ownerId", "requesterId", + "reservationId"); NodeMetadata nodeMetadata = createMock(NodeMetadata.class); // setup expectations expect(strategy.client.getInstanceServices()).andReturn(instanceClient).atLeastOnce(); expect( - strategy.createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.execute(region, input.tag, - input.template)).andReturn(ec2Options); + strategy.createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions.execute(region, input.tag, + input.template)).andReturn(ec2Options); expect(input.template.getLocation()).andReturn(input.location).atLeastOnce(); expect(input.template.getImage()).andReturn(input.image).atLeastOnce(); expect(input.image.getProviderId()).andReturn(imageId).atLeastOnce(); expect(instanceClient.runInstancesInRegion(region, zone, imageId, 1, input.count, ec2Options)).andReturn( - (Reservation) reservation); + (Reservation) reservation); expect(instance.getId()).andReturn(instanceCreatedId).atLeastOnce(); + // simulate a lazy credentials fetch + Credentials creds = new Credentials("foo","bar"); + expect(strategy.instanceToCredentials.apply(instance)).andReturn(creds); + expect(instance.getRegion()).andReturn(region); + expect(strategy.credentialStore.put(region + "/" + instanceCreatedId, creds)).andReturn(null); + 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( - strategy.utils.runOptionsOnNodesAndAddToGoodSetOrPutExceptionIntoBadMap(eq(input.options), - containsNodeMetadata(nodeMetadata), eq(input.nodes), eq(input.badNodes))).andReturn(null); + strategy.utils.runOptionsOnNodesAndAddToGoodSetOrPutExceptionIntoBadMap(eq(input.options), + containsNodeMetadata(nodeMetadata), eq(input.nodes), eq(input.badNodes))).andReturn(null); // replay mocks replay(instanceClient); @@ -145,9 +154,9 @@ public class EC2RunNodesAndAddToSetStrategyTest { } 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)); + 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); + AvailabilityZone.AP_SOUTHEAST_1A, AvailabilityZone.AP_SOUTHEAST_1A, REGION_AP_SOUTHEAST_1); // ///////////////////////////////////////////////////////////////////// @SuppressWarnings("unchecked") @@ -157,7 +166,7 @@ public class EC2RunNodesAndAddToSetStrategyTest { Template template = createMock(Template.class); Set nodes = createMock(Set.class); Map badNodes = createMock(Map.class); - EC2Hardware size = createMock(EC2Hardware.class); + Hardware hardware = createMock(Hardware.class); Image image = createMock(Image.class); final Location location; EC2TemplateOptions options = createMock(EC2TemplateOptions.class); @@ -168,7 +177,7 @@ public class EC2RunNodesAndAddToSetStrategyTest { void replayMe() { replay(template); - replay(size); + replay(hardware); replay(image); replay(nodes); replay(badNodes); @@ -177,7 +186,7 @@ public class EC2RunNodesAndAddToSetStrategyTest { void verifyMe() { verify(template); - verify(size); + verify(hardware); verify(image); verify(nodes); verify(badNodes); @@ -190,6 +199,8 @@ public class EC2RunNodesAndAddToSetStrategyTest { verify(strategy.client); verify(strategy.instancePresent); verify(strategy.runningInstanceToNodeMetadata); + verify(strategy.instanceToCredentials); + verify(strategy.credentialStore); verify(strategy.utils); } @@ -199,9 +210,11 @@ public class EC2RunNodesAndAddToSetStrategyTest { CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions = createMock(CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions.class); Predicate instanceStateRunning = createMock(Predicate.class); RunningInstanceToNodeMetadata runningInstanceToNodeMetadata = createMock(RunningInstanceToNodeMetadata.class); + Function instanceToCredentials = createMock(Function.class); + Map credentialStore = createMock(Map.class); ComputeUtils utils = createMock(ComputeUtils.class); return new EC2RunNodesAndAddToSetStrategy(client, createKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions, - instanceStateRunning, runningInstanceToNodeMetadata, utils); + instanceStateRunning, runningInstanceToNodeMetadata, instanceToCredentials, credentialStore, utils); } private void replayStrategy(EC2RunNodesAndAddToSetStrategy strategy) { @@ -209,6 +222,8 @@ public class EC2RunNodesAndAddToSetStrategyTest { replay(strategy.client); replay(strategy.instancePresent); replay(strategy.runningInstanceToNodeMetadata); + replay(strategy.instanceToCredentials); + replay(strategy.credentialStore); replay(strategy.utils); } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/xml/DescribeImagesResponseHandlerTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/xml/DescribeImagesResponseHandlerTest.java index 305f8c6af6..4c51f9329c 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/xml/DescribeImagesResponseHandlerTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/xml/DescribeImagesResponseHandlerTest.java @@ -19,26 +19,29 @@ 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 java.util.Set; +import org.jclouds.aws.Region; +import org.jclouds.aws.ec2.compute.functions.ImageParserTest; import org.jclouds.aws.ec2.domain.Image; -import org.jclouds.aws.ec2.domain.RootDeviceType; import org.jclouds.aws.ec2.domain.Image.Architecture; import org.jclouds.aws.ec2.domain.Image.EbsBlockDevice; import org.jclouds.aws.ec2.domain.Image.ImageState; import org.jclouds.aws.ec2.domain.Image.ImageType; +import org.jclouds.aws.ec2.domain.RootDeviceType; import org.jclouds.http.functions.ParseSax; -import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.jclouds.http.functions.config.SaxParserModule; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; /** * Tests behavior of {@code DescribeImagesResponseHandler} @@ -46,67 +49,58 @@ import com.google.common.collect.Sets; * @author Adrian Cole */ @Test(groups = "unit", testName = "ec2.DescribeImagesResponseHandlerTest") -public class DescribeImagesResponseHandlerTest extends BaseEC2HandlerTest { +public class DescribeImagesResponseHandlerTest { public void testUNIX() { - InputStream is = getClass().getResourceAsStream("/ec2/describe_images.xml"); - Set contents = Sets.newLinkedHashSet(); + Set contents = ImmutableSet.of(new Image("us-east-1", Architecture.I386, null, null, "ami-be3adfd7", + "ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml", "206029621532", ImageState.AVAILABLE, + ImageType.MACHINE, false, Sets. newHashSet("9961934F"), "aki-4438dd2d", null, "ari-4538dd2c", + RootDeviceType.INSTANCE_STORE, null, ImmutableMap. of(), "paravirtual")); - contents.add(new Image(defaultRegion, Architecture.I386, null, null, "ami-be3adfd7", - "ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml", "206029621532", - ImageState.AVAILABLE, ImageType.MACHINE, false, - Sets. newHashSet("9961934F"), "aki-4438dd2d", null, "ari-4538dd2c", - RootDeviceType.INSTANCE_STORE, null, ImmutableMap. of(),"paravirtual")); - - Set result = parseImages(is); + Set result = parseImages("/ec2/describe_images.xml"); assertEquals(result, contents); } public void testWindows() { - InputStream is = getClass().getResourceAsStream("/ec2/describe_images_windows.xml"); - Set contents = Sets.newLinkedHashSet(); + Set contents = ImmutableSet.of(new Image("us-east-1", Architecture.X86_64, null, null, "ami-02eb086b", + "aws-solutions-amis/SqlSvrStd2003r2-x86_64-Win_SFWBasic5.1-v1.0.manifest.xml", "771350841976", + ImageState.AVAILABLE, ImageType.MACHINE, true, Sets. newHashSet("5771E9A6"), null, "windows", null, + RootDeviceType.INSTANCE_STORE, null, ImmutableMap. of(), "paravirtual")); - contents.add(new Image(defaultRegion, Architecture.X86_64, null, null, "ami-02eb086b", - "aws-solutions-amis/SqlSvrStd2003r2-x86_64-Win_SFWBasic5.1-v1.0.manifest.xml", - "771350841976", ImageState.AVAILABLE, ImageType.MACHINE, true, Sets - . newHashSet("5771E9A6"), null, "windows", null, - RootDeviceType.INSTANCE_STORE, null, ImmutableMap. of(),"paravirtual")); - - Set result = parseImages(is); + Set result = parseImages("/ec2/describe_images_windows.xml"); assertEquals(result, contents); } public void testEBS() { - InputStream is = getClass().getResourceAsStream("/ec2/describe_images_ebs.xml"); - Set contents = Sets.newLinkedHashSet(); + Set contents = ImmutableSet.of(new Image("us-east-1", Architecture.I386, "websrv_2009-12-10", + "Web Server AMI", "ami-246f8d4d", "706093390852/websrv_2009-12-10", "706093390852", ImageState.AVAILABLE, + ImageType.MACHINE, true, Sets. newHashSet(), null, "windows", null, RootDeviceType.EBS, + "/dev/sda1", ImmutableMap. of("/dev/sda1", new EbsBlockDevice("snap-d01272b9", 30, + true), "xvdf", new EbsBlockDevice("snap-d31272ba", 250, false)), "hvm")); - contents.add(new Image(defaultRegion, Architecture.I386, "websrv_2009-12-10", - "Web Server AMI", "ami-246f8d4d", "706093390852/websrv_2009-12-10", "706093390852", - ImageState.AVAILABLE, ImageType.MACHINE, true, Sets. newHashSet(), null, - "windows", null, RootDeviceType.EBS, "/dev/sda1", ImmutableMap - . of("/dev/sda1", new EbsBlockDevice( - "snap-d01272b9", 30, true), "xvdf", new EbsBlockDevice( - "snap-d31272ba", 250, false)),"hvm")); - - Set result = parseImages(is); + Set result = parseImages("/ec2/describe_images_ebs.xml"); assertEquals(result, contents); } - private Set parseImages(InputStream is) { - DescribeImagesResponseHandler handler = injector - .getInstance(DescribeImagesResponseHandler.class); - addDefaultRegionToHandler(handler); - Set result = factory.create(handler).parse(is); - return result; + 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"); + } + + }); + ParseSax> parser = (ParseSax>) injector.getInstance(ParseSax.Factory.class).create( + injector.getInstance(DescribeImagesResponseHandler.class)); + return parser; } - private void addDefaultRegionToHandler(ParseSax.HandlerWithResult handler) { - GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); - expect(request.getArgs()).andReturn(new Object[] { null }); - replay(request); - handler.setContext(request); + public static Set parseImages(String resource) { + InputStream is = ImageParserTest.class.getResourceAsStream(resource); + return createParser().parse(is); } } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/xml/DescribeInstancesResponseHandlerTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/xml/DescribeInstancesResponseHandlerTest.java index 5d173062e9..f2d6d4e210 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/xml/DescribeInstancesResponseHandlerTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/xml/DescribeInstancesResponseHandlerTest.java @@ -19,15 +19,13 @@ 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 java.net.UnknownHostException; import java.util.Set; +import org.jclouds.aws.Region; import org.jclouds.aws.ec2.domain.Attachment; import org.jclouds.aws.ec2.domain.AvailabilityZone; import org.jclouds.aws.ec2.domain.InstanceState; @@ -39,13 +37,16 @@ import org.jclouds.aws.ec2.domain.RunningInstance; import org.jclouds.aws.ec2.domain.RunningInstance.EbsBlockDevice; import org.jclouds.date.DateService; import org.jclouds.http.functions.ParseSax; -import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.jclouds.http.functions.config.SaxParserModule; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; /** * Tests behavior of {@code DescribeInstancesResponseHandler} @@ -67,47 +68,45 @@ public class DescribeInstancesResponseHandlerTest extends BaseEC2HandlerTest { public void testWhenRunning() throws UnknownHostException { - InputStream is = getClass().getResourceAsStream("/ec2/describe_instances_running.xml"); Set> 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")); + 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> result = getReservations(is); + Set> result = parseRunningInstances("/ec2/describe_instances_running.xml"); assertEquals(result, contents); } public void testApplyInputStream() { - InputStream is = getClass().getResourceAsStream("/ec2/describe_instances.xml"); 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")); + 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> result = getReservations(is); + Set> result = parseRunningInstances("/ec2/describe_instances.xml"); assertEquals(result, contents); } @@ -116,73 +115,75 @@ public class DescribeInstancesResponseHandlerTest extends BaseEC2HandlerTest { // TODO not sure why equals fails public void testApplyInputStreamEuc() { - InputStream is = getClass().getResourceAsStream("/ec2/describe_instances_euc.xml"); 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")); + .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 = getReservations(is); + Set> result = parseRunningInstances("/ec2/describe_instances_euc.xml"); assertEquals(result, contents); } public void testApplyInputStreamNovaNoAvailabilityZone() { - InputStream is = getClass().getResourceAsStream("/ec2/describe_instances_nova.xml"); Set> contents = Sets.newLinkedHashSet(); contents.add(new Reservation(defaultRegion, ImmutableSet.of("default"), ImmutableSet - .of(new RunningInstance(defaultRegion, ImmutableSet. of(), "0", null, "ami-h30p5im0", - "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")); + .of(new RunningInstance(defaultRegion, ImmutableSet. of(), "0", null, "ami-25CB1213", "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 = getReservations(is); + Set> result = parseRunningInstances("/ec2/describe_instances_nova.xml"); assertEquals(result, contents); } public void testEBS() throws UnknownHostException { - InputStream is = getClass().getResourceAsStream("/ec2/describe_instances_ebs.xml"); 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 EbsBlockDevice("vol-dc6ca8b5", - Attachment.Status.ATTACHED, dateService - .iso8601DateParse("2009-12-30T04:06:29.000Z"), true)))), - "993194456877", null, "r-596dd731")); + 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 EbsBlockDevice("vol-dc6ca8b5", Attachment.Status.ATTACHED, dateService + .iso8601DateParse("2009-12-30T04:06:29.000Z"), true)))), "993194456877", null, + "r-596dd731")); - Set> result = getReservations(is); + Set> result = parseRunningInstances("/ec2/describe_instances_ebs.xml"); assertEquals(result, contents); } - private Set> getReservations(InputStream is) { - DescribeInstancesResponseHandler handler = injector.getInstance(DescribeInstancesResponseHandler.class); - addDefaultRegionToHandler(handler); - Set> result = factory.create(handler).parse(is); - return result; + 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"); + } + + }); + ParseSax>> parser = (ParseSax>>) injector + .getInstance(ParseSax.Factory.class).create(injector.getInstance(DescribeInstancesResponseHandler.class)); + return parser; } - private void addDefaultRegionToHandler(ParseSax.HandlerWithResult handler) { - GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); - expect(request.getArgs()).andReturn(new Object[] { null }).atLeastOnce(); - replay(request); - handler.setContext(request); + public static Set> parseRunningInstances(String resource) { + InputStream is = DescribeInstancesResponseHandlerTest.class.getResourceAsStream(resource); + return createParser().parse(is); } } diff --git a/aws/core/src/test/resources/ec2/describe_instances_nova.xml b/aws/core/src/test/resources/ec2/describe_instances_nova.xml index ac9b55209a..4717ec132d 100644 --- a/aws/core/src/test/resources/ec2/describe_instances_nova.xml +++ b/aws/core/src/test/resources/ec2/describe_instances_nova.xml @@ -11,7 +11,7 @@ 2010-09-09T18:09:42Z i-9slweygo - ami-h30p5im0 + ami-25CB1213 1 shutdown diff --git a/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/StorageMetadataImpl.java b/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/StorageMetadataImpl.java index 74350f0a58..4e416806d9 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/StorageMetadataImpl.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/domain/internal/StorageMetadataImpl.java @@ -19,6 +19,8 @@ package org.jclouds.blobstore.domain.internal; +import static com.google.common.base.Preconditions.checkNotNull; + import java.io.Serializable; import java.net.URI; import java.util.Date; @@ -47,12 +49,57 @@ public class StorageMetadataImpl extends ResourceMetadataImpl imple @Nullable private final Date lastModified; + private final StorageType type; + public StorageMetadataImpl(StorageType type, @Nullable String id, @Nullable String name, - @Nullable Location location, @Nullable URI uri, @Nullable String eTag, @Nullable Date lastModified, - Map userMetadata) { - super(type, id, name, location, uri, userMetadata); + @Nullable Location location, @Nullable URI uri, @Nullable String eTag, @Nullable Date lastModified, + Map userMetadata) { + super(id, name, location, uri, userMetadata); this.eTag = eTag; this.lastModified = lastModified; + this.type = checkNotNull(type, "type"); + } + + /** + * {@inheritDoc} + */ + @Override + public StorageType getType() { + return type; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((eTag == null) ? 0 : eTag.hashCode()); + result = prime * result + ((lastModified == null) ? 0 : lastModified.hashCode()); + result = prime * result + ((type == null) ? 0 : type.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; + StorageMetadataImpl other = (StorageMetadataImpl) obj; + if (eTag == null) { + if (other.eTag != null) + return false; + } else if (!eTag.equals(other.eTag)) + return false; + if (lastModified == null) { + if (other.lastModified != null) + return false; + } else if (!lastModified.equals(other.lastModified)) + return false; + if (type != other.type) + return false; + return true; } /** diff --git a/compute/src/main/java/org/jclouds/compute/ComputeServiceContext.java b/compute/src/main/java/org/jclouds/compute/ComputeServiceContext.java index 452f2cd0a3..393ee006e6 100644 --- a/compute/src/main/java/org/jclouds/compute/ComputeServiceContext.java +++ b/compute/src/main/java/org/jclouds/compute/ComputeServiceContext.java @@ -19,9 +19,13 @@ package org.jclouds.compute; +import java.util.Map; + import org.jclouds.compute.internal.ComputeServiceContextImpl; +import org.jclouds.domain.Credentials; import org.jclouds.rest.RestContext; +import com.google.common.annotations.Beta; import com.google.inject.ImplementedBy; /** @@ -44,6 +48,18 @@ public interface ComputeServiceContext { RestContext getProviderSpecificContext(); + /** + * 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 + * could access this externally. + * + */ + @Beta + Map getCredentialStore(); + + @Beta + Map credentialStore(); + Utils getUtils(); /** diff --git a/compute/src/main/java/org/jclouds/compute/domain/ComputeMetadataBuilder.java b/compute/src/main/java/org/jclouds/compute/domain/ComputeMetadataBuilder.java new file mode 100644 index 0000000000..56198a6c32 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/domain/ComputeMetadataBuilder.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.compute.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; + +import org.jclouds.compute.domain.internal.ComputeMetadataImpl; +import org.jclouds.domain.Location; +import org.jclouds.domain.ResourceMetadataBuilder; + +/** + * + * @author Adrian Cole + */ +public class ComputeMetadataBuilder extends ResourceMetadataBuilder { + protected String id; + protected ComputeType type; + + public ComputeMetadataBuilder(ComputeType type) { + super(); + this.type = checkNotNull(type, "type"); + } + + public ComputeMetadataBuilder id(String id) { + this.id = id; + return this; + } + + /** + * set id and providerId to the same value; + */ + public ComputeMetadataBuilder ids(String id) { + id(id).providerId(id); + return this; + } + + @Override + public ComputeMetadataBuilder providerId(String providerId) { + return ComputeMetadataBuilder.class.cast(super.providerId(providerId)); + } + + @Override + public ComputeMetadataBuilder name(String name) { + return ComputeMetadataBuilder.class.cast(super.name(name)); + } + + @Override + public ComputeMetadataBuilder location(Location location) { + return ComputeMetadataBuilder.class.cast(super.location(location)); + } + + @Override + public ComputeMetadataBuilder uri(URI uri) { + return ComputeMetadataBuilder.class.cast(super.uri(uri)); + } + + @Override + public ComputeMetadataBuilder userMetadata(Map userMetadata) { + return ComputeMetadataBuilder.class.cast(super.userMetadata(userMetadata)); + } + + public ComputeMetadata build() { + return new ComputeMetadataImpl(type, providerId, name, id, location, uri, userMetadata); + } + + public static ComputeMetadataBuilder fromComputeMetadata(ComputeMetadata in) { + return new ComputeMetadataBuilder(in.getType()).id(in.getId()).location(in.getLocation()).name(in.getName()) + .uri(in.getUri()).userMetadata(in.getUserMetadata()); + } +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/domain/HardwareBuilder.java b/compute/src/main/java/org/jclouds/compute/domain/HardwareBuilder.java new file mode 100644 index 0000000000..353b855c2a --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/domain/HardwareBuilder.java @@ -0,0 +1,124 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.compute.domain; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Predicates.not; +import static org.jclouds.compute.predicates.ImagePredicates.any; + +import java.net.URI; +import java.util.List; +import java.util.Map; + +import org.jclouds.compute.domain.internal.HardwareImpl; +import org.jclouds.compute.predicates.ImagePredicates; +import org.jclouds.domain.Location; + +import com.google.common.base.Predicate; +import com.google.common.collect.Lists; + +/** + * + * @author Adrian Cole + */ +public class HardwareBuilder extends ComputeMetadataBuilder { + private List processors = Lists.newArrayList(); + private int ram; + private List volumes = Lists.newArrayList(); + private Predicate supportsImage = any(); + + public HardwareBuilder() { + super(ComputeType.HARDWARE); + } + + public HardwareBuilder processors(List processors) { + this.processors = checkNotNull(processors, "processors"); + return this; + } + + public HardwareBuilder ram(int ram) { + this.ram = ram; + return this; + } + + public HardwareBuilder volumes(List volumes) { + this.volumes = checkNotNull(volumes, "volumes"); + return this; + } + + public HardwareBuilder supportsImage(Predicate supportsImage) { + this.supportsImage = checkNotNull(supportsImage, "supportsImage"); + return this; + } + + public HardwareBuilder is64Bit(boolean is64Bit) { + supportsImage(is64Bit ? ImagePredicates.is64Bit() : not(ImagePredicates.is64Bit())); + return this; + } + + @Override + public HardwareBuilder id(String id) { + return HardwareBuilder.class.cast(super.id(id)); + } + + @Override + public HardwareBuilder ids(String id) { + return HardwareBuilder.class.cast(super.ids(id)); + } + + @Override + public HardwareBuilder providerId(String providerId) { + return HardwareBuilder.class.cast(super.providerId(providerId)); + } + + @Override + public HardwareBuilder name(String name) { + return HardwareBuilder.class.cast(super.name(name)); + } + + @Override + public HardwareBuilder location(Location location) { + return HardwareBuilder.class.cast(super.location(location)); + } + + @Override + public HardwareBuilder uri(URI uri) { + return HardwareBuilder.class.cast(super.uri(uri)); + } + + @Override + public HardwareBuilder userMetadata(Map userMetadata) { + return HardwareBuilder.class.cast(super.userMetadata(userMetadata)); + } + + @Override + public Hardware build() { + return new HardwareImpl(providerId, name, id, location, uri, userMetadata, processors, ram, volumes, + supportsImage); + } + + @SuppressWarnings("unchecked") + public static HardwareBuilder fromHardware(Hardware in) { + return new HardwareBuilder().id(in.getId()).providerId(in.getProviderId()).location(in.getLocation()) + .name(in.getName()).uri(in.getUri()).userMetadata(in.getUserMetadata()) + .processors(List.class.cast(in.getProcessors())).ram(in.getRam()).volumes(List.class.cast(in.getVolumes())) + .supportsImage(in.supportsImage()); + } +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/domain/ImageBuilder.java b/compute/src/main/java/org/jclouds/compute/domain/ImageBuilder.java new file mode 100644 index 0000000000..1650e2bdd2 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/domain/ImageBuilder.java @@ -0,0 +1,107 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.compute.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; + +import javax.annotation.Nullable; + +import org.jclouds.compute.domain.internal.ImageImpl; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; + +/** + * @author Adrian Cole + */ +public class ImageBuilder extends ComputeMetadataBuilder { + private OperatingSystem operatingSystem; + private String version; + private String description; + private Credentials defaultCredentials; + + public ImageBuilder() { + super(ComputeType.IMAGE); + } + + public ImageBuilder operatingSystem(OperatingSystem operatingSystem) { + this.operatingSystem = checkNotNull(operatingSystem, "operatingSystem"); + return this; + } + + public ImageBuilder version(@Nullable String version) { + this.version = version; + return this; + } + + public ImageBuilder description(String description) { + this.description = checkNotNull(description, "description"); + return this; + } + + public ImageBuilder defaultCredentials(@Nullable Credentials defaultCredentials) { + this.defaultCredentials = defaultCredentials; + return this; + } + + @Override + public ImageBuilder id(String id) { + return ImageBuilder.class.cast(super.id(id)); + } + + @Override + public ImageBuilder ids(String id) { + return ImageBuilder.class.cast(super.ids(id)); + } + + @Override + public ImageBuilder providerId(String providerId) { + return ImageBuilder.class.cast(super.providerId(providerId)); + } + + @Override + public ImageBuilder name(String name) { + return ImageBuilder.class.cast(super.name(name)); + } + + @Override + public ImageBuilder location(Location location) { + return ImageBuilder.class.cast(super.location(location)); + } + + @Override + public ImageBuilder uri(URI uri) { + return ImageBuilder.class.cast(super.uri(uri)); + } + + @Override + public ImageBuilder userMetadata(Map userMetadata) { + return ImageBuilder.class.cast(super.userMetadata(userMetadata)); + } + + @Override + public Image build() { + return new ImageImpl(providerId, name, id, location, uri, userMetadata, operatingSystem, description, version, + defaultCredentials); + } + +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/domain/NodeMetadataBuilder.java b/compute/src/main/java/org/jclouds/compute/domain/NodeMetadataBuilder.java new file mode 100644 index 0000000000..b4a6170c45 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/domain/NodeMetadataBuilder.java @@ -0,0 +1,148 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.compute.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.jclouds.compute.domain.internal.NodeMetadataImpl; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; + +/** + * @author Adrian Cole + */ +public class NodeMetadataBuilder extends ComputeMetadataBuilder { + private NodeState state; + private Set publicAddresses = Sets.newLinkedHashSet(); + private Set privateAddresses = Sets.newLinkedHashSet(); + @Nullable + private Credentials credentials; + @Nullable + private String tag; + @Nullable + private String imageId; + @Nullable + private Hardware hardware; + @Nullable + private OperatingSystem os; + + public NodeMetadataBuilder() { + super(ComputeType.NODE); + } + + public NodeMetadataBuilder state(NodeState state) { + this.state = checkNotNull(state, "state"); + return this; + } + + public NodeMetadataBuilder publicAddresses(Iterable publicAddresses) { + this.publicAddresses = ImmutableSet.copyOf(checkNotNull(publicAddresses, "publicAddresses")); + return this; + } + + public NodeMetadataBuilder privateAddresses(Iterable privateAddresses) { + this.privateAddresses = ImmutableSet.copyOf(checkNotNull(privateAddresses, "privateAddresses")); + return this; + } + + public NodeMetadataBuilder credentials(@Nullable Credentials credentials) { + this.credentials = credentials; + return this; + } + + public NodeMetadataBuilder tag(@Nullable String tag) { + this.tag = tag; + return this; + } + + public NodeMetadataBuilder imageId(@Nullable String imageId) { + this.imageId = imageId; + return this; + } + + public NodeMetadataBuilder hardware(@Nullable Hardware hardware) { + this.hardware = hardware; + return this; + } + + public NodeMetadataBuilder operatingSystem(@Nullable OperatingSystem os) { + this.os = os; + return this; + } + + @Override + public NodeMetadataBuilder id(String id) { + return NodeMetadataBuilder.class.cast(super.id(id)); + } + + @Override + public NodeMetadataBuilder ids(String id) { + return NodeMetadataBuilder.class.cast(super.ids(id)); + } + + @Override + public NodeMetadataBuilder providerId(String providerId) { + return NodeMetadataBuilder.class.cast(super.providerId(providerId)); + } + + @Override + public NodeMetadataBuilder name(String name) { + return NodeMetadataBuilder.class.cast(super.name(name)); + } + + @Override + public NodeMetadataBuilder location(Location location) { + return NodeMetadataBuilder.class.cast(super.location(location)); + } + + @Override + public NodeMetadataBuilder uri(URI uri) { + return NodeMetadataBuilder.class.cast(super.uri(uri)); + } + + @Override + public NodeMetadataBuilder userMetadata(Map userMetadata) { + return NodeMetadataBuilder.class.cast(super.userMetadata(userMetadata)); + } + + @Override + public NodeMetadata build() { + return new NodeMetadataImpl(providerId, name, id, location, uri, userMetadata, tag, hardware, imageId, os, state, + publicAddresses, privateAddresses, 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.getHardware()).imageId(node.getImageId()).operatingSystem(node.getOperatingSystem()) + .state(node.getState()).publicAddresses(node.getPublicAddresses()) + .privateAddresses(node.getPrivateAddresses()).credentials(node.getCredentials()); + } + +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/domain/OperatingSystemBuilder.java b/compute/src/main/java/org/jclouds/compute/domain/OperatingSystemBuilder.java new file mode 100644 index 0000000000..b6ce0cacb2 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/domain/OperatingSystemBuilder.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.compute.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.Nullable; + +/** + * + * @author Adrian Cole + */ +public class OperatingSystemBuilder { + @Nullable + private OsFamily family; + @Nullable + private String name; + @Nullable + private String arch; + @Nullable + private String version; + private String description; + private boolean is64Bit; + + public OperatingSystemBuilder family(@Nullable OsFamily family) { + this.family = family; + return this; + } + + public OperatingSystemBuilder name(@Nullable String name) { + this.name = name; + return this; + } + + public OperatingSystemBuilder arch(@Nullable String arch) { + this.arch = arch; + return this; + } + + public OperatingSystemBuilder version(@Nullable String version) { + this.version = version; + return this; + } + + public OperatingSystemBuilder description(String description) { + this.description = checkNotNull(description, "description"); + return this; + } + + public OperatingSystemBuilder is64Bit(boolean is64Bit) { + this.is64Bit = is64Bit; + return this; + } + + public OperatingSystem build() { + return new OperatingSystem(family, name, version, arch, description, is64Bit); + } + + public static OperatingSystem fromOperatingSystem(OperatingSystem in) { + return new OperatingSystem(in.getFamily(), in.getName(), in.getVersion(), in.getArch(), in.getDescription(), + in.is64Bit()); + } +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/domain/VolumeBuilder.java b/compute/src/main/java/org/jclouds/compute/domain/VolumeBuilder.java new file mode 100644 index 0000000000..eea36bc7ea --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/domain/VolumeBuilder.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.compute.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.Nullable; + +import org.jclouds.compute.domain.internal.VolumeImpl; + +/** + * + * @author Adrian Cole + */ +public class VolumeBuilder { + + private Volume.Type type; + private String id; + @Nullable + private Float size; + @Nullable + private String device; + private boolean bootDevice; + private boolean durable; + + public VolumeBuilder type(Volume.Type type) { + this.type = checkNotNull(type, "type"); + return this; + } + + public VolumeBuilder id(String id) { + this.id = checkNotNull(id, "id"); + return this; + } + + public VolumeBuilder size(@Nullable Float size) { + this.size = size; + return this; + } + + public VolumeBuilder device(@Nullable String device) { + this.device = device; + return this; + } + + public VolumeBuilder bootDevice(boolean bootDevice) { + this.bootDevice = bootDevice; + return this; + } + + public VolumeBuilder durable(boolean durable) { + this.durable = durable; + return this; + } + + public Volume build() { + return new VolumeImpl(id, type, size, device, bootDevice, durable); + } + + public static Volume fromVolume(Volume in) { + return new VolumeImpl(in.getId(), in.getType(), in.getSize(), in.getDevice(), in.isBootDevice(), in.isDurable()); + } +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/domain/internal/ComputeMetadataImpl.java b/compute/src/main/java/org/jclouds/compute/domain/internal/ComputeMetadataImpl.java index 5ab9469353..2ae4b8559b 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/internal/ComputeMetadataImpl.java +++ b/compute/src/main/java/org/jclouds/compute/domain/internal/ComputeMetadataImpl.java @@ -33,17 +33,25 @@ import org.jclouds.domain.internal.ResourceMetadataImpl; * @author Adrian Cole * @author Ivan Meredith */ -public class ComputeMetadataImpl extends ResourceMetadataImpl implements - ComputeMetadata { - +public class ComputeMetadataImpl extends ResourceMetadataImpl implements ComputeMetadata { /** The serialVersionUID */ private static final long serialVersionUID = 7374704415964898694L; private final String id; + private final ComputeType type; - public ComputeMetadataImpl(ComputeType type, String providerId, String name, String id, - Location location, URI uri, Map userMetadata) { - super(type, providerId, name, location, uri, userMetadata); + public ComputeMetadataImpl(ComputeType type, String providerId, String name, String id, Location location, URI uri, + Map userMetadata) { + super(providerId, name, location, uri, userMetadata); this.id = checkNotNull(id, "id"); + this.type = checkNotNull(type, "type"); + } + + /** + * {@inheritDoc} + */ + @Override + public ComputeType getType() { + return type; } /** @@ -59,6 +67,7 @@ public class ComputeMetadataImpl extends ResourceMetadataImpl imple final int prime = 31; int result = super.hashCode(); result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((type == null) ? 0 : type.hashCode()); return result; } @@ -76,6 +85,8 @@ public class ComputeMetadataImpl extends ResourceMetadataImpl imple return false; } else if (!id.equals(other.id)) return false; + if (type != other.type) + return false; return true; } diff --git a/compute/src/main/java/org/jclouds/compute/domain/internal/HardwareImpl.java b/compute/src/main/java/org/jclouds/compute/domain/internal/HardwareImpl.java index 0c9fb52bbf..51d058fcfa 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/internal/HardwareImpl.java +++ b/compute/src/main/java/org/jclouds/compute/domain/internal/HardwareImpl.java @@ -39,28 +39,27 @@ import org.jclouds.domain.ResourceMetadata; import com.google.common.base.Predicate; import com.google.common.collect.ComparisonChain; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; +import com.google.common.collect.ImmutableList; /** * @author Adrian Cole */ public class HardwareImpl extends ComputeMetadataImpl implements Hardware { + /** The serialVersionUID */ private static final long serialVersionUID = 8994255275911717567L; - private final List processors = Lists.newArrayList(); + private final List processors; private final int ram; - private final List volumes = Lists.newArrayList(); - - private Predicate supportsImage; + private final List volumes; + private final Predicate supportsImage; public HardwareImpl(String providerId, String name, String id, @Nullable Location location, URI uri, - Map userMetadata, Iterable processors, int ram, - Iterable volumes, Predicate supportsImage) { + Map userMetadata, Iterable processors, int ram, + Iterable volumes, Predicate supportsImage) { super(ComputeType.HARDWARE, providerId, name, id, location, uri, userMetadata); - Iterables.addAll(this.processors, checkNotNull(processors, "processors")); + this.processors = ImmutableList.copyOf(checkNotNull(processors, "processors")); this.ram = ram; - Iterables.addAll(this.volumes, checkNotNull(volumes, "volumes")); + this.volumes = ImmutableList.copyOf(checkNotNull(volumes, "volumes")); this.supportsImage = supportsImage; } @@ -95,8 +94,8 @@ public class HardwareImpl extends ComputeMetadataImpl implements Hardware { public int compareTo(ResourceMetadata that) { if (that instanceof Hardware) { Hardware thatHardware = Hardware.class.cast(that); - return ComparisonChain.start().compare(getCoresAndSpeed(this), getCoresAndSpeed(thatHardware)).compare( - this.getRam(), thatHardware.getRam()).compare(getSpace(this), getSpace(thatHardware)).result(); + return ComparisonChain.start().compare(getCoresAndSpeed(this), getCoresAndSpeed(thatHardware)) + .compare(this.getRam(), thatHardware.getRam()).compare(getSpace(this), getSpace(thatHardware)).result(); } else { return super.compareTo(that); } @@ -108,7 +107,7 @@ public class HardwareImpl extends ComputeMetadataImpl implements Hardware { @Override public String toString() { return "[id=" + getId() + ", providerId=" + getProviderId() + ", name=" + getName() + ", processors=" - + processors + ", ram=" + ram + ", volumes=" + volumes + ", supportsImage=" + supportsImage + "]"; + + processors + ", ram=" + ram + ", volumes=" + volumes + ", supportsImage=" + supportsImage + "]"; } /** diff --git a/compute/src/main/java/org/jclouds/compute/domain/internal/ImageImpl.java b/compute/src/main/java/org/jclouds/compute/domain/internal/ImageImpl.java index 3f29f85e16..6a2de25eb5 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/internal/ImageImpl.java +++ b/compute/src/main/java/org/jclouds/compute/domain/internal/ImageImpl.java @@ -41,14 +41,13 @@ public class ImageImpl extends ComputeMetadataImpl implements Image { private static final long serialVersionUID = 7856744554191025307L; private final OperatingSystem operatingSystem; - private final String version; private final String description; private final Credentials defaultCredentials; public ImageImpl(String providerId, String name, String id, Location location, URI uri, - Map userMetadata, OperatingSystem operatingSystem, String description, - @Nullable String version, @Nullable Credentials defaultCredentials) { + Map userMetadata, OperatingSystem operatingSystem, String description, + @Nullable String version, @Nullable Credentials defaultCredentials) { super(ComputeType.IMAGE, providerId, name, id, location, uri, userMetadata); this.operatingSystem = checkNotNull(operatingSystem, "operatingSystem"); this.version = version; @@ -91,7 +90,9 @@ public class ImageImpl extends ComputeMetadataImpl implements Image { @Override public String toString() { return "[id=" + getId() + ", name=" + getName() + ", operatingSystem=" + operatingSystem + ", description=" - + description + ", version=" + version + ", location=" + getLocation() + "]"; + + description + ", version=" + version + ", location=" + getLocation() + ", loginUser=" + + ((defaultCredentials != null) ? defaultCredentials.identity : null) + ", userMetadata=" + + getUserMetadata() + "]"; } @Override 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 fcff05a6da..17ebfa8ab9 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 @@ -35,39 +35,43 @@ import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableSet; /** * @author Adrian Cole * @author Ivan Meredith */ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadata { + /** The serialVersionUID */ private static final long serialVersionUID = 7924307572338157887L; private final NodeState state; - private final Set publicAddresses = Sets.newLinkedHashSet(); - private final Set privateAddresses = Sets.newLinkedHashSet(); + private final Set publicAddresses; + private final Set privateAddresses; + @Nullable private final Credentials credentials; + @Nullable private final String tag; + @Nullable private final String imageId; @Nullable private final Hardware hardware; + @Nullable private final OperatingSystem os; public NodeMetadataImpl(String providerId, String name, String id, Location location, URI uri, - Map userMetadata, @Nullable String tag, @Nullable Hardware hardware, - @Nullable String imageId, @Nullable OperatingSystem os, NodeState state, Iterable publicAddresses, - Iterable privateAddresses, @Nullable Credentials credentials) { + Map userMetadata, @Nullable String tag, @Nullable Hardware hardware, @Nullable String imageId, + @Nullable OperatingSystem os, NodeState state, Iterable publicAddresses, + Iterable privateAddresses, @Nullable Credentials credentials) { super(ComputeType.NODE, providerId, name, id, location, uri, userMetadata); this.tag = tag; this.hardware = hardware; this.imageId = imageId; this.os = os; this.state = checkNotNull(state, "state"); - Iterables.addAll(this.publicAddresses, checkNotNull(publicAddresses, "publicAddresses")); - Iterables.addAll(this.privateAddresses, checkNotNull(privateAddresses, "privateAddresses")); + this.publicAddresses = ImmutableSet.copyOf(checkNotNull(publicAddresses, "publicAddresses")); + this.privateAddresses = ImmutableSet.copyOf(checkNotNull(privateAddresses, "privateAddresses")); this.credentials = credentials; } @@ -138,10 +142,10 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat @Override public String toString() { return "[id=" + getId() + ", providerId=" + getProviderId() + ", tag=" + getTag() + ", name=" + getName() - + ", location=" + getLocation() + ", uri=" + getUri() + ", imageId=" + getImageId() + ", os=" - + getOperatingSystem() + ", userMetadata=" + getUserMetadata() + ", state=" + getState() - + ", privateAddresses=" + privateAddresses + ", publicAddresses=" + publicAddresses + ", hardware=" - + getHardware() + "]"; + + ", location=" + getLocation() + ", uri=" + getUri() + ", imageId=" + getImageId() + ", os=" + + getOperatingSystem() + ", state=" + getState() + ", privateAddresses=" + privateAddresses + + ", publicAddresses=" + publicAddresses + ", hardware=" + getHardware() + ", loginUser=" + + ((credentials != null) ? credentials.identity : null) + ", userMetadata=" + getUserMetadata() + "]"; } @Override @@ -154,6 +158,7 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat result = prime * result + ((imageId == null) ? 0 : imageId.hashCode()); result = prime * result + ((hardware == null) ? 0 : hardware.hashCode()); result = prime * result + ((os == null) ? 0 : os.hashCode()); + result = prime * result + ((credentials == null) ? 0 : credentials.hashCode()); return result; } @@ -196,6 +201,11 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat return false; } else if (!os.equals(other.os)) return false; + if (credentials == null) { + if (other.credentials != null) + return false; + } else if (!credentials.equals(other.credentials)) + return false; return true; } 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 e250685ab0..63092898da 100755 --- a/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java +++ b/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java @@ -21,7 +21,20 @@ package org.jclouds.compute.internal; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.installNewCredentials; +import static com.google.common.base.Predicates.and; +import static com.google.common.base.Predicates.not; +import static com.google.common.base.Predicates.notNull; +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.newHashMap; +import static com.google.common.collect.Maps.newLinkedHashMap; +import static com.google.common.collect.Sets.filter; +import static com.google.common.collect.Sets.newHashSet; +import static com.google.common.collect.Sets.newLinkedHashSet; +import static com.google.common.util.concurrent.Futures.immediateFuture; +import static org.jclouds.compute.predicates.NodePredicates.TERMINATED; +import static org.jclouds.compute.predicates.NodePredicates.all; import static org.jclouds.concurrent.FutureIterables.awaitCompletion; import static org.jclouds.concurrent.FutureIterables.transformParallel; @@ -49,11 +62,11 @@ import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.options.RunScriptOptions; import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts; import org.jclouds.compute.strategy.DestroyNodeStrategy; @@ -74,12 +87,7 @@ import org.jclouds.util.Utils; 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.Iterables; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.common.util.concurrent.Futures; /** * @@ -93,6 +101,7 @@ public class BaseComputeService implements ComputeService { protected Logger logger = Logger.NULL; protected final ComputeServiceContext context; + protected final Map credentialStore; protected final Supplier> images; protected final Supplier> hardwareProfiles; protected final Supplier> locations; @@ -110,16 +119,17 @@ public class BaseComputeService implements ComputeService { protected final ExecutorService executor; @Inject - protected BaseComputeService(ComputeServiceContext context, Supplier> images, - Supplier> hardwareProfiles, Supplier> locations, - ListNodesStrategy listNodesStrategy, GetNodeMetadataStrategy getNodeMetadataStrategy, - RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, - DestroyNodeStrategy destroyNodeStrategy, Provider templateBuilderProvider, - Provider templateOptionsProvider, - @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + protected BaseComputeService(ComputeServiceContext context, Map credentialStore, + Supplier> images, Supplier> hardwareProfiles, + Supplier> locations, ListNodesStrategy listNodesStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, + Provider templateBuilderProvider, Provider templateOptionsProvider, + @Named("NODE_RUNNING") Predicate nodeRunning, + @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.context = checkNotNull(context, "context"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.images = checkNotNull(images, "images"); this.hardwareProfiles = checkNotNull(hardwareProfiles, "hardwareProfiles"); this.locations = checkNotNull(locations, "locations"); @@ -150,19 +160,22 @@ public class BaseComputeService implements ComputeService { */ @Override public Set runNodesWithTag(String tag, int count, Template template) - throws RunNodesException { + throws RunNodesException { checkArgument(tag.indexOf('-') == -1, "tag cannot contain hyphens"); checkNotNull(template.getLocation(), "location"); if (template.getOptions().getTaskName() == null && template.getOptions().getRunScript() != null - && !(template.getOptions().getRunScript() instanceof InitBuilder)) + && !(template.getOptions().getRunScript() instanceof InitBuilder)) template.getOptions().nameTask("bootstrap"); logger.debug(">> running %d node%s tag(%s) location(%s) image(%s) hardwareProfile(%s) options(%s)", count, - count > 1 ? "s" : "", tag, template.getLocation().getId(), template.getImage().getId(), template - .getHardware().getId(), template.getOptions()); - Set nodes = Sets.newHashSet(); - Map badNodes = Maps.newLinkedHashMap(); + count > 1 ? "s" : "", tag, template.getLocation().getId(), template.getImage().getId(), template + .getHardware().getId(), template.getOptions()); + Set nodes = newHashSet(); + Map badNodes = newLinkedHashMap(); Map> responses = runNodesAndAddToSetStrategy.execute(tag, count, template, nodes, badNodes); Map executionExceptions = awaitCompletion(responses, executor, null, logger, "starting nodes"); + for (NodeMetadata node : concat(nodes, 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, nodes, executionExceptions, badNodes); } @@ -174,7 +187,7 @@ public class BaseComputeService implements ComputeService { */ @Override public Set runNodesWithTag(String tag, int count, TemplateOptions templateOptions) - throws RunNodesException { + throws RunNodesException { return runNodesWithTag(tag, count, templateBuilder().any().options(templateOptions).build()); } @@ -211,6 +224,8 @@ public class BaseComputeService implements ComputeService { }, timeouts.nodeRunning, 1000, TimeUnit.MILLISECONDS); boolean successful = tester.apply(id) && (node.get() == null || nodeTerminated.apply(node.get())); + if (successful) + credentialStore.remove("node/" + id); logger.debug("<< destroyed node(%s) success(%s)", id, successful); } @@ -220,30 +235,30 @@ public class BaseComputeService implements ComputeService { @Override public Set destroyNodesMatching(Predicate filter) { logger.debug(">> destroying nodes matching(%s)", filter); - Set set = Sets.newLinkedHashSet(transformParallel(nodesMatchingFilterAndNotTerminated(filter), - new Function>() { + Set set = newLinkedHashSet(transformParallel(nodesMatchingFilterAndNotTerminated(filter), + new Function>() { - // TODO make an async interface instead of re-wrapping - @Override - public Future apply(final NodeMetadata from) { - return executor.submit(new Callable() { + // TODO make an async interface instead of re-wrapping + @Override + public Future apply(final NodeMetadata from) { + return executor.submit(new Callable() { - @Override - public NodeMetadata call() throws Exception { - destroyNode(from.getId()); - return from; - } + @Override + public NodeMetadata call() throws Exception { + destroyNode(from.getId()); + return from; + } - }); - } + }); + } - }, executor, null, logger, "destroying nodes")); + }, executor, null, logger, "destroying nodes")); logger.debug("<< destroyed(%d)", set.size()); return set; } private Iterable nodesMatchingFilterAndNotTerminated(Predicate filter) { - return Iterables.filter(detailsOnAllNodes(), Predicates.and(filter, Predicates.not(NodePredicates.TERMINATED))); + return filter(detailsOnAllNodes(), and(filter, not(TERMINATED))); } /** @@ -252,7 +267,7 @@ public class BaseComputeService implements ComputeService { @Override public Set listNodes() { logger.debug(">> listing nodes"); - Set set = Sets.newLinkedHashSet(listNodesStrategy.list()); + Set set = newLinkedHashSet(listNodesStrategy.list()); logger.debug("<< list(%d)", set.size()); return set; } @@ -264,7 +279,7 @@ public class BaseComputeService implements ComputeService { public Set listNodesDetailsMatching(Predicate filter) { checkNotNull(filter, "filter"); logger.debug(">> listing node details matching(%s)", filter); - Set set = Sets.newLinkedHashSet(listNodesStrategy.listDetailsOnNodesMatching(filter)); + Set set = newLinkedHashSet(listNodesStrategy.listDetailsOnNodesMatching(filter)); logger.debug("<< list(%d)", set.size()); return set; } @@ -333,7 +348,7 @@ public class BaseComputeService implements ComputeService { @Override public Future apply(NodeMetadata from) { rebootNode(from.getId()); - return Futures.immediateFuture(null); + return immediateFuture(null); } }, executor, null, logger, "rebooting nodes"); @@ -345,7 +360,7 @@ public class BaseComputeService implements ComputeService { */ @Override public Map runScriptOnNodesMatching(Predicate filter, Payload runScript) - throws RunScriptOnNodesException { + throws RunScriptOnNodesException { return runScriptOnNodesMatching(filter, runScript, RunScriptOptions.NONE); } @@ -354,7 +369,7 @@ public class BaseComputeService implements ComputeService { */ @Override public Map runScriptOnNodesMatching(Predicate filter, - final Payload runScript, @Nullable final RunScriptOptions options) throws RunScriptOnNodesException { + final Payload runScript, @Nullable final RunScriptOptions options) throws RunScriptOnNodesException { checkNotNull(filter, "Filter must be provided"); checkNotNull(runScript, "runScript"); @@ -362,11 +377,11 @@ public class BaseComputeService implements ComputeService { if (options.getTaskName() == null) options.nameTask("jclouds-script-" + System.currentTimeMillis()); - Iterable nodes = Iterables.filter(detailsOnAllNodes(), filter); + Iterable nodes = filter(detailsOnAllNodes(), filter); - final Map execs = Maps.newHashMap(); - final Map> responses = Maps.newHashMap(); - final Map badNodes = Maps.newLinkedHashMap(); + final Map execs = newHashMap(); + final Map> responses = newHashMap(); + final Map badNodes = newLinkedHashMap(); nodes = filterNodesWhoCanRunScripts(nodes, badNodes, options.getOverrideCredentials()); for (final NodeMetadata node : nodes) { @@ -375,8 +390,8 @@ public class BaseComputeService implements ComputeService { @Override public Void call() throws Exception { try { - ExecResponse response = utils.runScriptOnNode(node, Statements.exec(Utils.toStringAndClose(runScript - .getInput())), options); + ExecResponse response = utils.runScriptOnNode(node, + Statements.exec(Utils.toStringAndClose(runScript.getInput())), options); if (response != null) execs.put(node, response); } catch (Exception e) { @@ -398,21 +413,21 @@ public class BaseComputeService implements ComputeService { } private Iterable filterNodesWhoCanRunScripts(Iterable nodes, - final Map badNodes, final @Nullable Credentials overridingCredentials) { - nodes = Iterables.filter(Iterables.transform(nodes, new Function() { + final Map badNodes, final @Nullable Credentials overridingCredentials) { + nodes = filter(transform(nodes, new Function() { @Override public NodeMetadata apply(NodeMetadata node) { try { checkArgument(node.getPublicAddresses().size() > 0, "no public ip addresses on node: " + node); if (overridingCredentials != null) { - node = installNewCredentials(node, overridingCredentials); + node = NodeMetadataBuilder.fromNodeMetadata(node).credentials(overridingCredentials).build(); } else { checkNotNull(node.getCredentials(), "If the default credentials need to be used, they can't be null"); checkNotNull(node.getCredentials().identity, "Account name for ssh authentication must be " - + "specified. Try passing RunScriptOptions with new credentials"); + + "specified. Try passing RunScriptOptions with new credentials"); checkNotNull(node.getCredentials().credential, "Key or password for ssh authentication must be " - + "specified. Try passing RunScriptOptions with new credentials"); + + "specified. Try passing RunScriptOptions with new credentials"); } return node; } catch (Exception e) { @@ -420,12 +435,12 @@ public class BaseComputeService implements ComputeService { return null; } } - }), Predicates.notNull()); + }), notNull()); return nodes; } private Set detailsOnAllNodes() { - return Sets.newLinkedHashSet(listNodesStrategy.listDetailsOnNodesMatching(NodePredicates.all())); + return newLinkedHashSet(listNodesStrategy.listDetailsOnNodesMatching(all())); } @Override 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 6c5701da87..aa53efc78f 100644 --- a/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java +++ b/compute/src/main/java/org/jclouds/compute/internal/ComputeServiceContextImpl.java @@ -21,6 +21,8 @@ package org.jclouds.compute.internal; import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Map; + import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; @@ -29,6 +31,7 @@ import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.LoadBalancerService; import org.jclouds.compute.Utils; +import org.jclouds.domain.Credentials; import org.jclouds.rest.RestContext; /** @@ -40,11 +43,13 @@ public class ComputeServiceContextImpl implements ComputeServiceContext { private final LoadBalancerService loadBalancerService; private final RestContext providerSpecificContext; private final Utils utils; + private final Map credentialStore; @SuppressWarnings({ "unchecked" }) @Inject - public ComputeServiceContextImpl(ComputeService computeService, Utils utils, - @Nullable LoadBalancerService loadBalancerService, RestContext providerSpecificContext) { + public ComputeServiceContextImpl(ComputeService computeService, Map credentialStore, + Utils utils, @Nullable LoadBalancerService loadBalancerService, RestContext providerSpecificContext) { + this.credentialStore = credentialStore; this.utils = utils; this.providerSpecificContext = providerSpecificContext; this.computeService = checkNotNull(computeService, "computeService"); @@ -55,7 +60,7 @@ public class ComputeServiceContextImpl implements ComputeServiceContext { return computeService; } - @SuppressWarnings( { "unchecked", "hiding" }) + @SuppressWarnings({ "unchecked", "hiding" }) @Override public RestContext getProviderSpecificContext() { return (RestContext) providerSpecificContext; @@ -94,4 +99,14 @@ public class ComputeServiceContextImpl implements ComputeServiceContext { public boolean equals(Object obj) { return providerSpecificContext.equals(obj); } + + @Override + public Map getCredentialStore() { + return credentialStore; + } + + @Override + public Map credentialStore() { + return credentialStore; + } } diff --git a/compute/src/main/java/org/jclouds/compute/predicates/ImagePredicates.java b/compute/src/main/java/org/jclouds/compute/predicates/ImagePredicates.java index 141ba842b7..87000d2200 100644 --- a/compute/src/main/java/org/jclouds/compute/predicates/ImagePredicates.java +++ b/compute/src/main/java/org/jclouds/compute/predicates/ImagePredicates.java @@ -23,6 +23,8 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Set; +import javax.annotation.Nullable; + import org.jclouds.compute.domain.Image; import com.google.common.base.Predicate; @@ -38,6 +40,24 @@ import com.google.common.collect.Sets; * @author Adrian Cole */ public class ImagePredicates { + private static final class Is64BitPredicate implements Predicate { + @Override + public boolean apply(Image image) { + return image.getOperatingSystem().is64Bit(); + } + + @Override + public String toString() { + return "is64Bit()"; + } + + @Override + public boolean equals(@Nullable Object obj) { + return (obj instanceof Is64BitPredicate); + } + + } + /** * evaluates true if the Image * @@ -87,17 +107,7 @@ public class ImagePredicates { * return true if this is a 64bit image. */ public static Predicate is64Bit() { - return new Predicate() { - @Override - public boolean apply(Image image) { - return image.getOperatingSystem().is64Bit(); - } - - @Override - public String toString() { - return "is64Bit()"; - } - }; + return new Is64BitPredicate(); } /** 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 e14ad735f7..1e52db74a3 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 @@ -20,9 +20,7 @@ package org.jclouds.compute.stub.config; import static com.google.common.base.Preconditions.checkArgument; -import static org.jclouds.compute.predicates.ImagePredicates.any; -import java.net.URI; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -31,7 +29,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; -import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Provider; @@ -45,14 +42,15 @@ import org.jclouds.compute.config.ComputeServiceTimeoutsModule; import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.internal.ImageImpl; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; +import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.internal.VolumeImpl; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.predicates.NodePredicates; @@ -75,7 +73,6 @@ import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.inject.Injector; @@ -93,11 +90,12 @@ import com.google.inject.util.Providers; public class StubComputeServiceContextModule extends BaseComputeServiceContextModule { // STUB STUFF STATIC SO MULTIPLE CONTEXTS CAN SEE IT private static final AtomicInteger nodeIds = new AtomicInteger(0); - private static final ConcurrentMap nodes = new ConcurrentHashMap(); + private static final ConcurrentMap nodes = new ConcurrentHashMap(); + private static final ExecutorService service = Executors.newCachedThreadPool(); @Provides @Singleton - ConcurrentMap provideNodes() { + ConcurrentMap provideNodes() { return nodes; } @@ -136,12 +134,11 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo @Singleton public static class StubSocketOpen implements SocketOpen { - private final ConcurrentMap nodes; + private final ConcurrentMap nodes; private final String publicIpPrefix; @Inject - public StubSocketOpen(ConcurrentMap nodes, - @Named("PUBLIC_IP_PREFIX") String publicIpPrefix) { + public StubSocketOpen(ConcurrentMap nodes, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix) { this.nodes = nodes; this.publicIpPrefix = publicIpPrefix; } @@ -151,8 +148,7 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo if (input.getAddress().indexOf(publicIpPrefix) == -1) return false; String id = input.getAddress().replace(publicIpPrefix, ""); - int intId = Integer.parseInt(id); - StubNodeMetadata node = nodes.get(intId); + NodeMetadata node = nodes.get(id); return node != null && node.getState() == NodeState.RUNNING; } @@ -174,109 +170,97 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo bind(LoadBalancerService.class).toProvider(Providers. of(null)); } - public static class StubNodeMetadata extends NodeMetadataImpl { - - /** The serialVersionUID */ - private static final long serialVersionUID = 5538798859671465494L; - private NodeState state; - private final ExecutorService service; - - public StubNodeMetadata(String providerId, String name, String id, Location location, URI uri, - Map userMetadata, String tag, @Nullable Hardware hardware, String imageId, Image image, - OperatingSystem os, NodeState state, Iterable publicAddresses, - Iterable privateAddresses, Credentials credentials, ExecutorService service) { - super(providerId, name, id, location, uri, userMetadata, tag, hardware, imageId, os, state, publicAddresses, - privateAddresses, credentials); - this.setState(state, 0); - this.service = service; - } - - public void setState(final NodeState state, final long millis) { - if (millis == 0l) - this.state = state; - else - service.execute(new Runnable() { - - @Override - public void run() { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - Throwables.propagate(e); - } - StubNodeMetadata.this.state = state; - } - - }); - } - - @Override - public NodeState getState() { - return state; - } - - } - @Singleton public static class StubAddNodeWithTagStrategy implements AddNodeWithTagStrategy { private final Supplier location; - private final ExecutorService service; - private final ConcurrentMap nodes; + private final ConcurrentMap nodes; private final Provider idProvider; private final String publicIpPrefix; private final String privateIpPrefix; private final String passwordPrefix; + private final Map credentialStore; @Inject - public StubAddNodeWithTagStrategy(ConcurrentMap nodes, Supplier location, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, - @Named("NODE_ID") Provider idProvider, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix, - @Named("PRIVATE_IP_PREFIX") String privateIpPrefix, @Named("PASSWORD_PREFIX") String passwordPrefix) { + public StubAddNodeWithTagStrategy(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, + Map credentialStore) { this.nodes = nodes; this.location = location; - this.service = Executors.newCachedThreadPool(); this.idProvider = idProvider; this.publicIpPrefix = publicIpPrefix; this.privateIpPrefix = privateIpPrefix; this.passwordPrefix = passwordPrefix; + this.credentialStore = credentialStore; } @Override public NodeMetadata execute(String tag, String name, Template template) { checkArgument(location.get().equals(template.getLocation()), "invalid location: " + template.getLocation()); - int id = idProvider.get(); - StubNodeMetadata node = new StubNodeMetadata(id + "", name, id + "", location.get(), null, ImmutableMap - . of(), tag, null, template.getImage().getId(), template.getImage(), template - .getImage().getOperatingSystem(), NodeState.PENDING, ImmutableSet. of(publicIpPrefix + id), - ImmutableSet. of(privateIpPrefix + id), new Credentials("root", passwordPrefix + id), service); - nodes.put(id, node); - node.setState(NodeState.RUNNING, 100); + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + String id = idProvider.get() + ""; + builder.ids(id); + builder.name(name); + builder.tag(tag); + builder.location(location.get()); + builder.imageId(template.getImage().getId()); + builder.operatingSystem(template.getImage().getOperatingSystem()); + builder.state(NodeState.PENDING); + builder.publicAddresses(ImmutableSet. of(publicIpPrefix + id)); + builder.privateAddresses(ImmutableSet. of(privateIpPrefix + id)); + builder.credentials(new Credentials("root", passwordPrefix + id)); + NodeMetadata node = builder.build(); + nodes.put(node.getId(), node); + credentialStore.put(node.getId(), node.getCredentials()); + setState(node, NodeState.RUNNING, 100); return node; } + } + protected static void nodeWithState(NodeMetadata node, NodeState state) { + nodes.put(node.getId(), NodeMetadataBuilder.fromNodeMetadata(node).state(state).build()); + } + + public static void setState(final NodeMetadata node, final NodeState state, final long millis) { + if (millis == 0l) + nodeWithState(node, state); + else + service.execute(new Runnable() { + + @Override + public void run() { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + Throwables.propagate(e); + } + nodeWithState(node, state); + } + + }); } @Singleton public static class StubGetNodeMetadataStrategy implements GetNodeMetadataStrategy { - private final ConcurrentMap nodes; + private final ConcurrentMap nodes; @Inject - protected StubGetNodeMetadataStrategy(ConcurrentMap nodes) { + protected StubGetNodeMetadataStrategy(ConcurrentMap nodes) { this.nodes = nodes; } @Override public NodeMetadata execute(String id) { - return nodes.get(Integer.parseInt(id)); + return nodes.get(id); } } @Singleton public static class StubListNodesStrategy implements ListNodesStrategy { - private final ConcurrentMap nodes; + private final ConcurrentMap nodes; @Inject - protected StubListNodesStrategy(ConcurrentMap nodes) { + protected StubListNodesStrategy(ConcurrentMap nodes) { this.nodes = nodes; } @@ -293,44 +277,43 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo @Singleton public static class StubRebootNodeStrategy implements RebootNodeStrategy { - private final ConcurrentMap nodes; + private final ConcurrentMap nodes; @Inject - protected StubRebootNodeStrategy(ConcurrentMap nodes) { + protected StubRebootNodeStrategy(ConcurrentMap nodes) { this.nodes = nodes; } @Override - public StubNodeMetadata execute(String id) { - StubNodeMetadata node = nodes.get(Integer.parseInt(id)); + public NodeMetadata execute(String id) { + NodeMetadata node = nodes.get(id); if (node == null) throw new ResourceNotFoundException("node not found: " + id); - node.setState(NodeState.PENDING, 0); - node.setState(NodeState.RUNNING, 50); + setState(node, NodeState.PENDING, 0); + setState(node, NodeState.RUNNING, 50); return node; } } @Singleton public static class StubDestroyNodeStrategy implements DestroyNodeStrategy { - private final ConcurrentMap nodes; + private final ConcurrentMap nodes; private final ExecutorService service; @Inject - protected StubDestroyNodeStrategy(ConcurrentMap nodes, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service) { + protected StubDestroyNodeStrategy(ConcurrentMap nodes, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service) { this.nodes = nodes; this.service = service; } @Override - public StubNodeMetadata execute(String id) { - final int nodeId = Integer.parseInt(id); - StubNodeMetadata node = nodes.get(nodeId); + public NodeMetadata execute(final String id) { + NodeMetadata node = nodes.get(id); if (node == null) return node; - node.setState(NodeState.PENDING, 0); - node.setState(NodeState.TERMINATED, 50); + setState(node, NodeState.PENDING, 0); + setState(node, NodeState.TERMINATED, 50); service.execute(new Runnable() { @Override @@ -340,7 +323,7 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo } catch (InterruptedException e) { Throwables.propagate(e); } finally { - nodes.remove(nodeId); + nodes.remove(id); } } @@ -355,19 +338,36 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo })); Location zone = defaultLocation.get().getParent(); String parentId = zone.getId(); - return Suppliers.> ofInstance(ImmutableSet. of(// - new ImageImpl("1", OsFamily.UBUNTU.name(), parentId + "/1", zone, null, - ImmutableMap. of(), // - new OperatingSystem(OsFamily.UBUNTU, "ubuntu 32", null, "X86_32", "ubuntu 32", false), - "stub ubuntu 32", "", new Credentials("root", null)), // - new ImageImpl("2", OsFamily.UBUNTU.name(), parentId + "/2", zone, null, - ImmutableMap. of(),// - new OperatingSystem(OsFamily.UBUNTU, "ubuntu 64", null, "X86_64", "ubuntu 64", true), - "stub ubuntu 64", "", new Credentials("root", null)),// - new ImageImpl("3", OsFamily.CENTOS.name(), parentId + "/3", zone, null, - ImmutableMap. of(), // - new OperatingSystem(OsFamily.CENTOS, "centos 64", null, "X86_64", "centos 64", true), - "stub centos 64", "", new Credentials("root", null)))); + Credentials defaultCredentials = new Credentials("root", null); + return Suppliers + .> ofInstance(ImmutableSet. of( + // + new ImageBuilder() + .providerId("1") + .name(OsFamily.UBUNTU.name()) + .id(parentId + "/1") + .location(zone) + .operatingSystem( + new OperatingSystem(OsFamily.UBUNTU, "ubuntu 32", null, "X86_32", "ubuntu 32", false)) + .description("stub ubuntu 32").defaultCredentials(defaultCredentials).build(), // + new ImageBuilder() + .providerId("2") + .name(OsFamily.UBUNTU.name()) + .id(parentId + "/2") + .location(zone) + .operatingSystem( + new OperatingSystem(OsFamily.UBUNTU, "ubuntu 64", null, "X86_64", "ubuntu 64", true)) + .description("stub ubuntu 64").defaultCredentials(defaultCredentials).build(), // + new ImageBuilder() + .providerId("3") + .name(OsFamily.CENTOS.name()) + .id(parentId + "/3") + .location(zone) + .operatingSystem( + new OperatingSystem(OsFamily.CENTOS, "centos 64", null, "X86_64", "centos 64", true)) + .description("stub centos 64").defaultCredentials(defaultCredentials).build() // + + )); } @Provides @@ -375,24 +375,24 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo protected Set provideLocations(@org.jclouds.rest.annotations.Provider String providerName) { Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); Location region = new LocationImpl(LocationScope.REGION, providerName + "region", providerName + "region", - provider); + provider); return ImmutableSet - .of(new LocationImpl(LocationScope.ZONE, providerName + "zone", providerName + "zone", region)); + .of(new LocationImpl(LocationScope.ZONE, providerName + "zone", providerName + "zone", region)); } @Override protected Supplier> getSourceSizeSupplier(Injector injector) { - return Suppliers.> ofInstance(ImmutableSet. of(new StubHardware("small", 1, - 1740, 160), new StubHardware("medium", 4, 7680, 850), new StubHardware("large", 8, 15360, 1690))); + return Suppliers.> ofInstance(ImmutableSet. of( + StubHardware.stub("small", 1, 1740, 160), StubHardware.stub("medium", 4, 7680, 850), + StubHardware.stub("large", 8, 15360, 1690))); } - private static class StubHardware extends org.jclouds.compute.domain.internal.HardwareImpl { - /** The serialVersionUID */ - private static final long serialVersionUID = -1842135761654973637L; + private static class StubHardware { - StubHardware(String type, int cores, int ram, float disk) { - super(type, type, type, null, null, ImmutableMap. of(), ImmutableList.of(new Processor(cores, - 1.0)), ram, ImmutableList.of(new VolumeImpl(disk, true, false)), any()); + static Hardware stub(String type, int cores, int ram, float disk) { + return new org.jclouds.compute.domain.HardwareBuilder().id(type).providerId(type).name(type) + .processors(ImmutableList.of(new Processor(cores, 1.0))).ram(ram) + .volumes(ImmutableList. of(new VolumeImpl(disk, true, false))).build(); } } 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 4ef27221cb..5175dcbb32 100644 --- a/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java +++ b/compute/src/main/java/org/jclouds/compute/util/ComputeServiceUtils.java @@ -27,8 +27,8 @@ import static org.jclouds.scriptbuilder.domain.Statements.pipeHttpResponseToBash import java.net.URI; import java.util.Formatter; import java.util.Map; -import java.util.NoSuchElementException; import java.util.Map.Entry; +import java.util.NoSuchElementException; import java.util.concurrent.Callable; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -40,9 +40,6 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.Volume; -import org.jclouds.compute.domain.internal.HardwareImpl; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; -import org.jclouds.domain.Credentials; import org.jclouds.http.HttpRequest; import org.jclouds.logging.Logger; import org.jclouds.scriptbuilder.domain.Statement; @@ -80,7 +77,7 @@ public class ComputeServiceUtils { */ public static Statement extractTargzIntoDirectory(HttpRequest targz, String directory) { return Statements - .extractTargzIntoDirectory(targz.getMethod(), targz.getEndpoint(), targz.getHeaders(), directory); + .extractTargzIntoDirectory(targz.getMethod(), targz.getEndpoint(), targz.getHeaders(), directory); } public static Statement extractTargzIntoDirectory(URI targz, String directory) { @@ -93,14 +90,13 @@ public class ComputeServiceUtils { * @return a shell script that will invoke the http request */ public static Statement extractZipIntoDirectory(HttpRequest zip, String directory) { - return Statements - .extractZipIntoDirectory(zip.getMethod(), zip.getEndpoint(), zip.getHeaders(), directory); + return Statements.extractZipIntoDirectory(zip.getMethod(), zip.getEndpoint(), zip.getHeaders(), directory); } public static Statement extractZipIntoDirectory(URI zip, String directory) { return extractZipIntoDirectory(new HttpRequest("GET", zip), directory); } - + public static String parseTagFromName(String from) { Matcher matcher = DELIMETED_BY_HYPHEN_ENDING_IN_HYPHEN_HEX.matcher(from); return matcher.find() ? matcher.group(1) : "NOTAG-" + from; @@ -128,14 +124,15 @@ public class ComputeServiceUtils { } public static final Map> NAME_VERSION_MAP = ImmutableMap - .> of(org.jclouds.compute.domain.OsFamily.CENTOS, - ImmutableMap. builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5") - .build(), org.jclouds.compute.domain.OsFamily.RHEL, - ImmutableMap. builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5") - .build(), org.jclouds.compute.domain.OsFamily.UBUNTU, ImmutableMap - . builder().put("hardy", "8.04").put("intrepid", "8.10").put("jaunty", - "9.04").put("karmic", "9.10").put("lucid", "10.04").put("maverick", "10.10") - .put("natty", "11.04").build()); + .> of( + org.jclouds.compute.domain.OsFamily.CENTOS, + ImmutableMap. builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5").build(), + org.jclouds.compute.domain.OsFamily.RHEL, + ImmutableMap. builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5").build(), + org.jclouds.compute.domain.OsFamily.UBUNTU, + ImmutableMap. builder().put("hardy", "8.04").put("intrepid", "8.10") + .put("jaunty", "9.04").put("karmic", "9.10").put("lucid", "10.04").put("maverick", "10.10") + .put("natty", "11.04").build()); public static String parseVersionOrReturnEmptyString(org.jclouds.compute.domain.OsFamily family, final String in) { if (NAME_VERSION_MAP.containsKey(family)) { @@ -170,8 +167,8 @@ public class ComputeServiceUtils { Formatter fmt = new Formatter().format("Execution failures:%n%n"); int index = 1; for (Entry errorMessage : executionExceptions.entrySet()) { - fmt.format("%s) %s on %s:%n%s%n%n", index++, errorMessage.getValue().getClass().getSimpleName(), errorMessage - .getKey(), getStackTraceAsString(errorMessage.getValue())); + fmt.format("%s) %s on %s:%n%s%n%n", index++, errorMessage.getValue().getClass().getSimpleName(), + errorMessage.getKey(), getStackTraceAsString(errorMessage.getValue())); } return fmt.format("%s error[s]", executionExceptions.size()).toString(); } @@ -181,13 +178,13 @@ public class ComputeServiceUtils { int index = 1; for (Entry errorMessage : failedNodes.entrySet()) { fmt.format("%s) %s on node %s:%n%s%n%n", index++, errorMessage.getValue().getClass().getSimpleName(), - errorMessage.getKey().getId(), getStackTraceAsString(errorMessage.getValue())); + errorMessage.getKey().getId(), getStackTraceAsString(errorMessage.getValue())); } return fmt.format("%s error[s]", failedNodes.size()).toString(); } public static Iterable filterByName(Iterable nodes, - final String name) { + final String name) { return filter(nodes, new Predicate() { @Override public boolean apply(ComputeMetadata input) { @@ -217,28 +214,7 @@ public class ComputeServiceUtils { public static boolean isKeyAuth(NodeMetadata createdNode) { return createdNode.getCredentials().credential != null - && createdNode.getCredentials().credential.startsWith("-----BEGIN RSA PRIVATE KEY-----"); - } - - /** - * Given the instances of {@link NodeMetadata} (immutable) and {@link Credentials} (immutable), - * returns a new instance of {@link NodeMetadata} that has new credentials - */ - public static NodeMetadata installNewCredentials(NodeMetadata node, Credentials newCredentials) { - return new NodeMetadataImpl(node.getProviderId(), node.getName(), node.getId(), node.getLocation(), - node.getUri(), node.getUserMetadata(), node.getTag(), node.getHardware(), node.getImageId(), node - .getOperatingSystem(), node.getState(), node.getPublicAddresses(), node.getPrivateAddresses(), - newCredentials); - } - - /** - * Given the instances of {@link Hardware} (immutable) and {@link Iterable} - * (immutable), returns a new instance of {@link Hardware} with the new volumes - */ - public static Hardware replacesVolumes(Hardware hardware, Iterable volumes) { - return new HardwareImpl(hardware.getProviderId(), hardware.getName(), hardware.getId(), hardware.getLocation(), - hardware.getUri(), hardware.getUserMetadata(), hardware.getProcessors(), hardware.getRam(), volumes, - hardware.supportsImage()); + && createdNode.getCredentials().credential.startsWith("-----BEGIN RSA PRIVATE KEY-----"); } public static Iterable getSupportedProviders() { diff --git a/compute/src/main/java/org/jclouds/compute/util/ComputeUtils.java b/compute/src/main/java/org/jclouds/compute/util/ComputeUtils.java index e09cbf509e..52d947d512 100644 --- a/compute/src/main/java/org/jclouds/compute/util/ComputeUtils.java +++ b/compute/src/main/java/org/jclouds/compute/util/ComputeUtils.java @@ -21,7 +21,6 @@ package org.jclouds.compute.util; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; -import static org.jclouds.compute.util.ComputeServiceUtils.installNewCredentials; import static org.jclouds.compute.util.ComputeServiceUtils.isKeyAuth; import static org.jclouds.concurrent.FutureIterables.awaitCompletion; @@ -43,6 +42,7 @@ import org.jclouds.Constants; import org.jclouds.compute.callables.InitAndStartScriptOnNode; import org.jclouds.compute.callables.RunScriptOnNode; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.options.RunScriptOptions; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.predicates.ScriptStatusReturnsZero.CommandUsingClient; @@ -77,20 +77,19 @@ public class ComputeUtils { @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; @Inject(optional = true) - private SshClient.Factory sshFactory; + protected SshClient.Factory sshFactory; protected final Predicate runScriptNotRunning; - private final Predicate socketTester; - private final ExecutorService executor; + protected final Predicate socketTester; + protected final ExecutorService executor; protected final Predicate nodeRunning; - private final GetNodeMetadataStrategy getNode; - private final Timeouts timeouts; + protected final GetNodeMetadataStrategy getNode; + protected final Timeouts timeouts; @Inject public ComputeUtils(Predicate socketTester, - @Named("SCRIPT_COMPLETE") Predicate runScriptNotRunning, - GetNodeMetadataStrategy getNode, Timeouts timeouts, - @Named("NODE_RUNNING") Predicate nodeRunning, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + @Named("SCRIPT_COMPLETE") Predicate runScriptNotRunning, GetNodeMetadataStrategy getNode, + Timeouts timeouts, @Named("NODE_RUNNING") Predicate nodeRunning, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.nodeRunning = nodeRunning; this.timeouts = timeouts; this.getNode = getNode; @@ -100,19 +99,18 @@ public class ComputeUtils { } public Map> runOptionsOnNodesAndAddToGoodSetOrPutExceptionIntoBadMap(final TemplateOptions options, - Iterable runningNodes, final Set goodNodes, - final Map badNodes) { + Iterable runningNodes, final Set goodNodes, + final Map badNodes) { Map> responses = Maps.newHashMap(); for (final NodeMetadata node : runningNodes) { responses.put(node, executor.submit(runOptionsOnNodeAndAddToGoodSetOrPutExceptionIntoBadMap(node, badNodes, - goodNodes, options))); + goodNodes, options))); } return responses; } public Callable runOptionsOnNodeAndAddToGoodSetOrPutExceptionIntoBadMap(final NodeMetadata node, - final Map badNodes, final Set goodNodes, - final TemplateOptions options) { + final Map badNodes, final Set goodNodes, final TemplateOptions options) { return new Callable() { @Override public Void call() throws Exception { @@ -122,7 +120,7 @@ public class ComputeUtils { goodNodes.add(node1); } catch (Exception e) { logger.error(e, "<< problem applying options to node(%s): ", node.getId(), Throwables.getRootCause(e) - .getMessage()); + .getMessage()); badNodes.put(node, e); } return null; @@ -135,11 +133,12 @@ public class ComputeUtils { return node; if (nodeRunning.apply(node)) - node = installNewCredentials(getNode.execute(node.getId()), node.getCredentials()); + node = NodeMetadataBuilder.fromNodeMetadata(getNode.execute(node.getId())) + .credentials(node.getCredentials()).build(); else throw new IllegalStateException(String.format( - "node didn't achieve the state running on node %s within %d seconds, final state: %s", node.getId(), - timeouts.nodeRunning / 1000, node.getState())); + "node didn't achieve the state running on node %s within %d seconds, final state: %s", node.getId(), + timeouts.nodeRunning / 1000, node.getState())); List bootstrap = Lists.newArrayList(); if (options.getRunScript() != null) bootstrap.add(options.getRunScript()); @@ -170,8 +169,8 @@ public class ComputeUtils { } if (options.getPort() > 0) { checkNodeHasPublicIps(node); - blockUntilPortIsListeningOnPublicIp(options.getPort(), options.getSeconds(), Iterables.get(node - .getPublicAddresses(), 0)); + blockUntilPortIsListeningOnPublicIp(options.getPort(), options.getSeconds(), + Iterables.get(node.getPublicAddresses(), 0)); } return response; } @@ -189,12 +188,12 @@ public class ComputeUtils { public InitAndStartScriptOnNode generateScript(NodeMetadata node, Statement script, RunScriptOptions options) { return options.shouldBlockOnComplete() ? new RunScriptOnNode(runScriptNotRunning, node, options.getTaskName(), - script, options.shouldRunAsRoot()) : new InitAndStartScriptOnNode(node, options.getTaskName(), script, - options.shouldRunAsRoot()); + script, options.shouldRunAsRoot()) : new InitAndStartScriptOnNode(node, options.getTaskName(), script, + options.shouldRunAsRoot()); } public Map, ?> runCallablesOnNode(NodeMetadata node, Iterable> parallel, - @Nullable SshCallable last) { + @Nullable SshCallable last) { checkState(this.sshFactory != null, "runScript requested, but no SshModule configured"); checkNodeHasPublicIps(node); checkNotNull(node.getCredentials(), "credentials for node " + node.getName()); @@ -210,7 +209,7 @@ public class ComputeUtils { } private Map, ?> runTasksUsingSshClient(Iterable> parallel, SshCallable last, - SshClient ssh) { + SshClient ssh) { Map, Object> responses = Maps.newHashMap(); if (Iterables.size(parallel) > 0) { responses.putAll(runCallablesUsingSshClient(parallel, ssh)); @@ -230,8 +229,8 @@ public class ComputeUtils { IPSocket socket = new IPSocket(Iterables.get(node.getPublicAddresses(), 0), 22); socketTester.apply(socket); SshClient ssh = isKeyAuth(node) ? sshFactory.create(socket, node.getCredentials().identity, - node.getCredentials().credential.getBytes()) : sshFactory.create(socket, node.getCredentials().identity, - node.getCredentials().credential); + node.getCredentials().credential.getBytes()) : sshFactory.create(socket, node.getCredentials().identity, + node.getCredentials().credential); return ssh; } diff --git a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java index 2beda76590..692106d0ce 100755 --- a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java @@ -335,6 +335,13 @@ public abstract class BaseComputeServiceLiveTest { checkOsMatchesTemplate(node); } + @Test(enabled = true, dependsOnMethods = "testCreateAnotherNodeWithANewContextToEnsureSharedMemIsntRequired") + public void testCredentialsCache() throws Exception { + initializeContextAndClient(); + for (NodeMetadata node : nodes) + assert (context.getCredentialStore().get(node.getId()) != null) : "credentials for " + node.getId(); + } + protected Map runScriptWithCreds(final String tag, OperatingSystem os, Credentials creds) throws RunScriptOnNodesException { try { @@ -351,6 +358,7 @@ public abstract class BaseComputeServiceLiveTest { assertNotNull(node.getTag()); assertEquals(node.getTag(), tag); assertEquals(node.getState(), NodeState.RUNNING); + assertEquals(context.getCredentialStore().get(node.getId()), node.getCredentials()); assert node.getPublicAddresses().size() >= 1 || node.getPrivateAddresses().size() >= 1 : "no ips in" + node; assertNotNull(node.getCredentials()); if (node.getCredentials().identity != null) { @@ -588,6 +596,7 @@ public abstract class BaseComputeServiceLiveTest { client.destroyNodesMatching(withTag(tag)); for (NodeMetadata node : filter(client.listNodesDetailsMatching(all()), withTag(tag))) { assert node.getState() == NodeState.TERMINATED : node; + assertEquals(context.getCredentialStore().get(node.getId()), null); } } context.close(); diff --git a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java index 16f7c1446f..d36118244c 100644 --- a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java +++ b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java @@ -41,7 +41,6 @@ import org.easymock.IArgumentMatcher; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.stub.config.StubComputeServiceContextModule.StubNodeMetadata; import org.jclouds.io.Payload; import org.jclouds.net.IPSocket; import org.jclouds.predicates.RetryablePredicate; @@ -122,49 +121,49 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes SshClient client5 = createMock(SshClient.class); expect(factory.create(new IPSocket("144.175.1.1", 22), "root", "password1")).andReturn(client1) - .atLeastOnce(); + .atLeastOnce(); runScriptAndService(client1, 1); expect(factory.create(new IPSocket("144.175.1.2", 22), "root", "romeo")).andThrow( - new SshException("Auth fail")); + new SshException("Auth fail")); expect(factory.create(new IPSocket("144.175.1.2", 22), "root", "password2")).andReturn(client2) - .atLeastOnce(); + .atLeastOnce(); client2.connect(); try { runScript(client2, "runScriptWithCreds", Utils.toStringAndClose(StubComputeServiceIntegrationTest.class - .getResourceAsStream("/runscript.sh")), 2); + .getResourceAsStream("/runscript.sh")), 2); } catch (IOException e) { Throwables.propagate(e); } client2.disconnect(); expect(factory.create(new IPSocket("144.175.1.3", 22), "root", "password3")).andReturn(client3) - .atLeastOnce(); + .atLeastOnce(); expect(factory.create(new IPSocket("144.175.1.4", 22), "root", "password4")).andReturn(client4) - .atLeastOnce(); + .atLeastOnce(); expect(factory.create(new IPSocket("144.175.1.5", 22), "root", "password5")).andReturn(client5) - .atLeastOnce(); + .atLeastOnce(); runScriptAndInstallSsh(client3, "bootstrap", 3); runScriptAndInstallSsh(client4, "bootstrap", 4); runScriptAndInstallSsh(client5, "bootstrap", 5); expect( - factory.create(eq(new IPSocket("144.175.1.1", 22)), eq("root"), aryEq(keyPair.get("private") - .getBytes()))).andReturn(client1).atLeastOnce(); + factory.create(eq(new IPSocket("144.175.1.1", 22)), eq("root"), aryEq(keyPair.get("private") + .getBytes()))).andReturn(client1).atLeastOnce(); expect( - factory.create(eq(new IPSocket("144.175.1.2", 22)), eq("root"), aryEq(keyPair.get("private") - .getBytes()))).andReturn(client2).atLeastOnce(); + factory.create(eq(new IPSocket("144.175.1.2", 22)), eq("root"), aryEq(keyPair.get("private") + .getBytes()))).andReturn(client2).atLeastOnce(); expect( - factory.create(eq(new IPSocket("144.175.1.3", 22)), eq("root"), aryEq(keyPair.get("private") - .getBytes()))).andReturn(client3).atLeastOnce(); + factory.create(eq(new IPSocket("144.175.1.3", 22)), eq("root"), aryEq(keyPair.get("private") + .getBytes()))).andReturn(client3).atLeastOnce(); expect( - factory.create(eq(new IPSocket("144.175.1.4", 22)), eq("root"), aryEq(keyPair.get("private") - .getBytes()))).andReturn(client4).atLeastOnce(); + factory.create(eq(new IPSocket("144.175.1.4", 22)), eq("root"), aryEq(keyPair.get("private") + .getBytes()))).andReturn(client4).atLeastOnce(); expect( - factory.create(eq(new IPSocket("155.175.1.5", 22)), eq("root"), aryEq(keyPair.get("private") - .getBytes()))).andReturn(client5).atLeastOnce(); + factory.create(eq(new IPSocket("155.175.1.5", 22)), eq("root"), aryEq(keyPair.get("private") + .getBytes()))).andReturn(client5).atLeastOnce(); helloAndJava(client2); helloAndJava(client3); @@ -186,7 +185,7 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes try { runScript(client, "jboss", Utils.toStringAndClose(StubComputeServiceIntegrationTest.class - .getResourceAsStream("/initscript_with_jboss.sh")), nodeId); + .getResourceAsStream("/initscript_with_jboss.sh")), nodeId); } catch (IOException e) { Throwables.propagate(e); } @@ -200,7 +199,7 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes try { runScript(client, scriptName, Utils.toStringAndClose(StubComputeServiceIntegrationTest.class - .getResourceAsStream("/initscript_with_java.sh")), nodeId); + .getResourceAsStream("/initscript_with_java.sh")), nodeId); } catch (IOException e) { Throwables.propagate(e); } @@ -252,8 +251,8 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes public void testAssignability() throws Exception { @SuppressWarnings("unused") - RestContext, ConcurrentMap> stubContext = new ComputeServiceContextFactory() - .createContext(provider, identity, credential).getProviderSpecificContext(); + RestContext, ConcurrentMap> stubContext = new ComputeServiceContextFactory() + .createContext(provider, identity, credential).getProviderSpecificContext(); } private static class PayloadEquals implements IArgumentMatcher, Serializable { @@ -300,7 +299,7 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes return false; PayloadEquals other = (PayloadEquals) o; return this.expected == null && other.expected == null || this.expected != null - && this.expected.equals(other.expected); + && this.expected.equals(other.expected); } @Override @@ -343,6 +342,11 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes super.testCreateAnotherNodeWithANewContextToEnsureSharedMemIsntRequired(); } + @Test(enabled = true, dependsOnMethods = "testCreateAnotherNodeWithANewContextToEnsureSharedMemIsntRequired") + public void testCredentialsCache() throws Exception { + super.testCredentialsCache(); + } + @Test(enabled = true, dependsOnMethods = "testCreateAnotherNodeWithANewContextToEnsureSharedMemIsntRequired") public void testGet() throws Exception { super.testGet(); diff --git a/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java b/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java index 35beaee5c6..a3f7c58059 100644 --- a/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java +++ b/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java @@ -31,12 +31,11 @@ import java.util.Set; import javax.inject.Provider; import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.domain.Volume; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.predicates.ImagePredicates; import org.jclouds.domain.Location; @@ -44,8 +43,6 @@ import org.testng.annotations.Test; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; /** @@ -64,16 +61,14 @@ public class TemplateBuilderImplTest { Image image2 = createMock(Image.class); OperatingSystem os2 = createMock(OperatingSystem.class); - Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null, ImmutableMap - . of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, ImmutableList. of(), - ImagePredicates.any()); + Hardware hardware = new HardwareBuilder().id("hardwareId").build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(defaultLocation)); + . of(defaultLocation)); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of( - image, image2)); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(size)); + image, image2)); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of(hardware)); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class); @@ -102,10 +97,10 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); - assertEquals(template.resolveImage(size, images.get()), image2); + assertEquals(template.resolveImage(hardware, images.get()), image2); verify(image); verify(image2); @@ -126,16 +121,14 @@ public class TemplateBuilderImplTest { OperatingSystem os = createMock(OperatingSystem.class); OperatingSystem os2 = createMock(OperatingSystem.class); - Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null, ImmutableMap - . of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, ImmutableList. of(), - ImagePredicates.any()); + Hardware hardware = new HardwareBuilder().id("hardwareId").build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(defaultLocation)); + . of(defaultLocation)); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of( - image, image2)); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(size)); + image, image2)); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of(hardware)); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class); @@ -159,8 +152,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); assertEquals(template.smallest().osArchMatches("X86_32").build().getImage(), image); @@ -181,16 +174,15 @@ public class TemplateBuilderImplTest { Image image = createMock(Image.class); OperatingSystem os = createMock(OperatingSystem.class); - Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null, ImmutableMap - . of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, ImmutableList. of(), - ImagePredicates.idEquals("imageId")); + Hardware hardware = new HardwareBuilder().id("hardwareId") + .supportsImage(ImagePredicates.idEquals("imageId")).build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(defaultLocation)); + . of(defaultLocation)); Supplier> images = Suppliers.> ofInstance(ImmutableSet - . of(image)); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(size)); + . of(image)); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of(hardware)); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class); @@ -217,8 +209,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); template.imageId("imageId").build(); @@ -237,16 +229,15 @@ public class TemplateBuilderImplTest { Image image = createMock(Image.class); OperatingSystem os = createMock(OperatingSystem.class); - Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null, ImmutableMap - . of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, ImmutableList. of(), - ImagePredicates.idEquals("imageId")); + Hardware hardware = new HardwareBuilder().id("hardwareId") + .supportsImage(ImagePredicates.idEquals("imageId")).build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(defaultLocation)); + . of(defaultLocation)); Supplier> images = Suppliers.> ofInstance(ImmutableSet - . of(image)); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(size)); + . of(image)); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of(hardware)); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class); @@ -273,8 +264,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(image, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(image, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); try { template.imageId("notImageId").build(); assert false; @@ -295,10 +286,10 @@ public class TemplateBuilderImplTest { TemplateOptions from = provideTemplateOptions(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of()); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -314,8 +305,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); template.options(options).build(); @@ -330,10 +321,10 @@ public class TemplateBuilderImplTest { public void testNothingUsesDefaultTemplateBuilder() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of()); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); @@ -348,8 +339,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); template.build(); @@ -360,10 +351,10 @@ public class TemplateBuilderImplTest { } protected TemplateBuilderImpl createTemplateBuilder(Image knownImage, Supplier> locations, - Supplier> images, Supplier> sizes, Location defaultLocation, - Provider optionsProvider, Provider templateBuilderProvider) { - TemplateBuilderImpl template = new TemplateBuilderImpl(locations, images, sizes, Suppliers - .ofInstance(defaultLocation), optionsProvider, templateBuilderProvider); + Supplier> images, Supplier> hardwares, Location defaultLocation, + Provider optionsProvider, Provider templateBuilderProvider) { + TemplateBuilderImpl template = new TemplateBuilderImpl(locations, images, hardwares, + Suppliers.ofInstance(defaultLocation), optionsProvider, templateBuilderProvider); return template; } @@ -371,10 +362,10 @@ public class TemplateBuilderImplTest { @Test public void testSuppliedLocationWithNoOptions() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of()); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -385,8 +376,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); try { template.imageId("foo").locationId("location").build(); @@ -407,10 +398,10 @@ public class TemplateBuilderImplTest { TemplateOptions from = provideTemplateOptions(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of()); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -421,8 +412,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); try { template.imageId("foo").options(provideTemplateOptions()).locationId("location").build(); @@ -440,10 +431,10 @@ public class TemplateBuilderImplTest { @Test public void testDefaultLocationWithNoOptionsNoSuchElement() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of()); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -456,8 +447,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); try { template.imageId("region/ami").build(); @@ -480,10 +471,10 @@ public class TemplateBuilderImplTest { @Test public void testDefaultLocationWithOptions() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of()); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); TemplateOptions from = provideTemplateOptions(); @@ -497,8 +488,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); try { template.imageId("region/ami").options(provideTemplateOptions()).build(); @@ -516,10 +507,10 @@ public class TemplateBuilderImplTest { @Test public void testImageIdNullsEverythingElse() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); - Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of()); + Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -528,8 +519,8 @@ public class TemplateBuilderImplTest { replay(optionsProvider); replay(templateBuilderProvider); - TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, + optionsProvider, templateBuilderProvider); template.imageDescriptionMatches("imageDescriptionMatches"); template.imageNameMatches("imageNameMatches"); diff --git a/core/src/main/java/org/jclouds/collect/AbstractMapEntry.java b/core/src/main/java/org/jclouds/collect/AbstractMapEntry.java new file mode 100644 index 0000000000..f03f96a82a --- /dev/null +++ b/core/src/main/java/org/jclouds/collect/AbstractMapEntry.java @@ -0,0 +1,43 @@ +package org.jclouds.collect; + +import java.util.Map.Entry; + +import javax.annotation.Nullable; + +import com.google.common.base.Objects; + + +public abstract class AbstractMapEntry implements Entry { + + public abstract K getKey(); + + public abstract V getValue(); + + public V setValue(V value) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean equals(@Nullable Object object) { + if (object instanceof Entry) { + Entry that = (Entry) object; + return Objects.equal(this.getKey(), that.getKey()) && Objects.equal(this.getValue(), that.getValue()); + } + return false; + } + + @Override + public int hashCode() { + K k = getKey(); + V v = getValue(); + return ((k == null) ? 0 : k.hashCode()) ^ ((v == null) ? 0 : v.hashCode()); + } + + /** + * Returns a string representation of the form {key}={value}. + */ + @Override + public String toString() { + return getKey() + "=" + getValue(); + } +} diff --git a/core/src/main/java/org/jclouds/collect/InputSupplierMap.java b/core/src/main/java/org/jclouds/collect/InputSupplierMap.java new file mode 100644 index 0000000000..6e647f4dae --- /dev/null +++ b/core/src/main/java/org/jclouds/collect/InputSupplierMap.java @@ -0,0 +1,190 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ +/** + * + * Copyright (C) 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.collect; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.io.IOException; +import java.util.AbstractMap; +import java.util.AbstractSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import com.google.common.base.Function; +import com.google.common.base.Throwables; +import com.google.common.io.InputSupplier; + +/** + * + * + * @author Adrian Cole + * + */ +public class InputSupplierMap extends AbstractMap { + final Map> toMap; + final Function> putFunction; + + public InputSupplierMap(Map> toMap, Function> putFunction) { + this.toMap = checkNotNull(toMap); + this.putFunction = checkNotNull(putFunction); + } + + @Override + public int size() { + return toMap.size(); + } + + @Override + public V put(K key, V value) { + V old = get(key); + toMap.put(key, value != null ? putFunction.apply(value) : null); + return old; + } + + @Override + public boolean containsKey(Object key) { + return toMap.containsKey(key); + } + + @Override + public V get(Object key) { + InputSupplier value = toMap.get(key); + try { + return (value != null || toMap.containsKey(key)) ? value.getInput() : null; + } catch (IOException e) { + Throwables.propagate(e); + return null; + } + } + + @Override + public V remove(Object key) { + try { + return toMap.containsKey(key) ? toMap.remove(key).getInput() : null; + } catch (IOException e) { + Throwables.propagate(e); + return null; + } + } + + @Override + public void clear() { + toMap.clear(); + } + + @Override + public Set> entrySet() { + return new EntrySet(); + + } + + class EntrySet extends AbstractSet> { + @Override + public int size() { + return InputSupplierMap.this.size(); + } + + @Override + public Iterator> iterator() { + final Iterator>> mapIterator = toMap.entrySet().iterator(); + + return new Iterator>() { + public boolean hasNext() { + return mapIterator.hasNext(); + } + + public Entry next() { + final java.util.Map.Entry> entry = mapIterator.next(); + return new AbstractMapEntry() { + @Override + public K getKey() { + return entry.getKey(); + } + + @Override + public V getValue() { + try { + return entry.getValue().getInput(); + } catch (IOException e) { + Throwables.propagate(e); + return null; + } + } + }; + } + + public void remove() { + mapIterator.remove(); + } + }; + } + + @Override + public void clear() { + toMap.clear(); + } + + @Override + public boolean contains(Object o) { + if (!(o instanceof Entry)) { + return false; + } + Entry entry = (Entry) o; + Object entryKey = entry.getKey(); + Object entryValue = entry.getValue(); + V mapValue = InputSupplierMap.this.get(entryKey); + if (mapValue != null) { + return mapValue.equals(entryValue); + } + return entryValue == null && containsKey(entryKey); + } + + @Override + public boolean remove(Object o) { + if (contains(o)) { + Entry entry = (Entry) o; + Object key = entry.getKey(); + toMap.remove(key); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/collect/TransformingMap.java b/core/src/main/java/org/jclouds/collect/TransformingMap.java new file mode 100644 index 0000000000..644c6da61c --- /dev/null +++ b/core/src/main/java/org/jclouds/collect/TransformingMap.java @@ -0,0 +1,156 @@ +/** + * + * 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.collect; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.AbstractMap; +import java.util.AbstractSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import com.google.common.base.Function; + +/** + * A map that transforms values on the way in and out. Inspired by the guava method + * {@code Maps.transformValues}. + * + * @author Adrian Cole + * + */ +public class TransformingMap extends AbstractMap { + final Map fromMap; + final Function getFunction; + final Function putFunction; + + public TransformingMap(Map fromMap, Function getFunction, Function putFunction) { + this.fromMap = checkNotNull(fromMap); + this.getFunction = checkNotNull(getFunction); + this.putFunction = checkNotNull(putFunction); + } + + @Override + public int size() { + return fromMap.size(); + } + + @Override + public V2 put(K key, V2 value) { + V2 old = get(key); + fromMap.put(key, value != null ? putFunction.apply(value) : null); + return old; + } + + @Override + public boolean containsKey(Object key) { + return fromMap.containsKey(key); + } + + @Override + public V2 get(Object key) { + V1 value = fromMap.get(key); + return (value != null || fromMap.containsKey(key)) ? getFunction.apply(value) : null; + } + + @Override + public V2 remove(Object key) { + return fromMap.containsKey(key) ? getFunction.apply(fromMap.remove(key)) : null; + } + + @Override + public void clear() { + fromMap.clear(); + } + + @Override + public Set> entrySet() { + return new EntrySet(); + + } + + class EntrySet extends AbstractSet> { + @Override + public int size() { + return TransformingMap.this.size(); + } + + @Override + public Iterator> iterator() { + final Iterator> mapIterator = fromMap.entrySet().iterator(); + + return new Iterator>() { + public boolean hasNext() { + return mapIterator.hasNext(); + } + + public Entry next() { + final Entry entry = mapIterator.next(); + return new AbstractMapEntry() { + @Override + public K getKey() { + return entry.getKey(); + } + + @Override + public V2 getValue() { + return getFunction.apply(entry.getValue()); + } + }; + } + + public void remove() { + mapIterator.remove(); + } + }; + } + + @Override + public void clear() { + fromMap.clear(); + } + + @Override + public boolean contains(Object o) { + if (!(o instanceof Entry)) { + return false; + } + Entry entry = (Entry) o; + Object entryKey = entry.getKey(); + Object entryValue = entry.getValue(); + V2 mapValue = TransformingMap.this.get(entryKey); + if (mapValue != null) { + return mapValue.equals(entryValue); + } + return entryValue == null && containsKey(entryKey); + } + + @Override + public boolean remove(Object o) { + if (contains(o)) { + Entry entry = (Entry) o; + Object key = entry.getKey(); + fromMap.remove(key); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/domain/ResourceMetadataBuilder.java b/core/src/main/java/org/jclouds/domain/ResourceMetadataBuilder.java new file mode 100644 index 0000000000..01db58a97d --- /dev/null +++ b/core/src/main/java/org/jclouds/domain/ResourceMetadataBuilder.java @@ -0,0 +1,64 @@ +package org.jclouds.domain; + +/** + * + * 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 static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; + +import com.google.common.collect.Maps; + +/** + * + * @author Adrian Cole + */ +public abstract class ResourceMetadataBuilder> { + protected String providerId; + protected String name; + protected Location location; + protected URI uri; + protected Map userMetadata = Maps.newLinkedHashMap(); + + public ResourceMetadataBuilder providerId(String providerId) { + this.providerId = providerId; + return this; + } + + public ResourceMetadataBuilder name(String name) { + this.name = name; + return this; + } + + public ResourceMetadataBuilder location(Location location) { + this.location = location; + return this; + } + + public ResourceMetadataBuilder uri(URI uri) { + this.uri = uri; + return this; + } + + public ResourceMetadataBuilder userMetadata(Map userMetadata) { + this.userMetadata = checkNotNull(userMetadata, "userMetadata"); + return this; + } +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/domain/internal/ResourceMetadataImpl.java b/core/src/main/java/org/jclouds/domain/internal/ResourceMetadataImpl.java index 022e357c73..fbc55edde7 100644 --- a/core/src/main/java/org/jclouds/domain/internal/ResourceMetadataImpl.java +++ b/core/src/main/java/org/jclouds/domain/internal/ResourceMetadataImpl.java @@ -36,12 +36,11 @@ import com.google.inject.internal.Nullable; * * @author Adrian Cole */ -public class ResourceMetadataImpl> implements ResourceMetadata, Serializable { +public abstract class ResourceMetadataImpl> implements ResourceMetadata, Serializable { /** The serialVersionUID */ private static final long serialVersionUID = -280558162576368264L; - private final T type; @Nullable private final String providerId; @Nullable @@ -52,9 +51,8 @@ public class ResourceMetadataImpl> implements ResourceMetadata private final URI uri; private final Map userMetadata = Maps.newLinkedHashMap(); - public ResourceMetadataImpl(T type, @Nullable String providerId, @Nullable String name, - @Nullable Location location, @Nullable URI uri, Map userMetadata) { - this.type = checkNotNull(type, "type"); + public ResourceMetadataImpl(@Nullable String providerId, @Nullable String name, @Nullable Location location, + @Nullable URI uri, Map userMetadata) { this.providerId = providerId; this.name = name; this.location = location; @@ -72,14 +70,6 @@ public class ResourceMetadataImpl> implements ResourceMetadata return (this == o) ? 0 : getName().compareTo(o.getName()); } - /** - * {@inheritDoc} - */ - @Override - public T getType() { - return type; - } - /** * {@inheritDoc} */ @@ -122,8 +112,8 @@ public class ResourceMetadataImpl> implements ResourceMetadata @Override public String toString() { - return "[type=" + type + ", providerId=" + providerId + ", name=" + name + ", location=" + location - + ", uri=" + uri + ", userMetadata=" + userMetadata + "]"; + return "[type=" + getType() + ", providerId=" + providerId + ", name=" + name + ", location=" + location + + ", uri=" + uri + ", userMetadata=" + userMetadata + "]"; } @Override @@ -133,7 +123,6 @@ public class ResourceMetadataImpl> implements ResourceMetadata result = prime * result + ((providerId == null) ? 0 : providerId.hashCode()); result = prime * result + ((location == null) ? 0 : location.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((type == null) ? 0 : type.hashCode()); result = prime * result + ((uri == null) ? 0 : uri.hashCode()); return result; } @@ -162,11 +151,6 @@ public class ResourceMetadataImpl> implements ResourceMetadata return false; } else if (!name.equals(other.name)) return false; - if (type == null) { - if (other.type != null) - return false; - } else if (!type.equals(other.type)) - return false; if (uri == null) { if (other.uri != null) return false; diff --git a/core/src/main/java/com/google/gson/ExposedEscaper.java b/core/src/main/java/org/jclouds/rest/ConfiguresCredentialStore.java similarity index 65% rename from core/src/main/java/com/google/gson/ExposedEscaper.java rename to core/src/main/java/org/jclouds/rest/ConfiguresCredentialStore.java index 364f14b462..84b5431758 100644 --- a/core/src/main/java/com/google/gson/ExposedEscaper.java +++ b/core/src/main/java/org/jclouds/rest/ConfiguresCredentialStore.java @@ -17,19 +17,25 @@ * ==================================================================== */ -package com.google.gson; +package org.jclouds.rest; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import com.google.common.annotations.Beta; /** - * The gson project use package to control access to their objects. However, - * this prevents us from doing valid work, like controling the json emitted on a - * per-object basis. This is here to afford us to do this. + * designates the module configures a {@code Map} * * @author Adrian Cole + * */ -public class ExposedEscaper extends Escaper { - - public ExposedEscaper(boolean escapeHtmlCharacters) { - super(escapeHtmlCharacters); - } +@Beta +@Retention(RUNTIME) +@Target(TYPE) +public @interface ConfiguresCredentialStore { } diff --git a/core/src/main/java/org/jclouds/rest/RestContext.java b/core/src/main/java/org/jclouds/rest/RestContext.java index 5baefaa9e8..116e2313bd 100755 --- a/core/src/main/java/org/jclouds/rest/RestContext.java +++ b/core/src/main/java/org/jclouds/rest/RestContext.java @@ -20,10 +20,13 @@ package org.jclouds.rest; import java.net.URI; +import java.util.Map; +import java.util.concurrent.Future; +import org.jclouds.domain.Credentials; import org.jclouds.rest.internal.RestContextImpl; -import java.util.concurrent.Future; +import com.google.common.annotations.Beta; import com.google.inject.ImplementedBy; /** @@ -56,6 +59,18 @@ public interface RestContext { URI getEndpoint(); + /** + * 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 + * could access this externally. + * + */ + @Beta + Map getCredentialStore(); + + @Beta + Map credentialStore(); + String getIdentity(); String getProvider(); diff --git a/core/src/main/java/org/jclouds/rest/RestContextBuilder.java b/core/src/main/java/org/jclouds/rest/RestContextBuilder.java index 2798e2c485..5a5aa2621f 100755 --- a/core/src/main/java/org/jclouds/rest/RestContextBuilder.java +++ b/core/src/main/java/org/jclouds/rest/RestContextBuilder.java @@ -48,6 +48,7 @@ import org.jclouds.rest.annotations.ApiVersion; import org.jclouds.rest.annotations.Credential; import org.jclouds.rest.annotations.Identity; import org.jclouds.rest.annotations.Provider; +import org.jclouds.rest.config.CredentialStoreModule; import org.jclouds.rest.config.RestClientModule; import org.jclouds.rest.config.RestModule; import org.jclouds.rest.internal.RestContextImpl; @@ -67,17 +68,14 @@ 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 arguments. + * Creates {@link RestContext} or {@link Injector} instances based on the most commonly requested + * arguments. *

- * Note that Threadsafe objects will be bound as singletons to the Injector or - * Context provided. + * Note that Threadsafe objects will be bound as singletons to the Injector or Context provided. *

*

- * If no Modules are specified, the default - * {@link JDKLoggingModule logging} and - * {@link JavaUrlHttpCommandExecutorServiceModule http transports} will be - * installed. + * If no Modules are specified, the default {@link JDKLoggingModule logging} and + * {@link JavaUrlHttpCommandExecutorServiceModule http transports} will be installed. * * @author Adrian Cole, Andrew Newdigate * @see RestContext @@ -137,6 +135,7 @@ public class RestContextBuilder { addHttpModuleIfNeededAndNotPresent(modules); ifHttpConfigureRestOtherwiseGuiceClientFactory(modules); addExecutorServiceIfNotPresent(modules); + addCredentialStoreIfNotPresent(modules); modules.add(new BindPropertiesAndPrincipalContext(properties)); return Guice.createInjector(modules); } @@ -245,13 +244,27 @@ public class RestContextBuilder { return input.getClass().isAnnotationPresent(SingleThreaded.class); } })) { - modules.add(new ExecutorServiceModule(MoreExecutors.sameThreadExecutor(), MoreExecutors.sameThreadExecutor())); + modules.add(new ExecutorServiceModule(MoreExecutors.sameThreadExecutor(), MoreExecutors + .sameThreadExecutor())); } else { modules.add(new ExecutorServiceModule()); } } } + @VisibleForTesting + protected void addCredentialStoreIfNotPresent(List modules) { + if (!Iterables.any(modules, new Predicate() { + public boolean apply(Module input) { + return input.getClass().isAnnotationPresent(ConfiguresCredentialStore.class); + } + } + + )) { + modules.add(new CredentialStoreModule()); + } + } + @VisibleForTesting public Properties getProperties() { return properties; diff --git a/core/src/main/java/org/jclouds/rest/config/CredentialStoreModule.java b/core/src/main/java/org/jclouds/rest/config/CredentialStoreModule.java new file mode 100644 index 0000000000..2d8438002b --- /dev/null +++ b/core/src/main/java/org/jclouds/rest/config/CredentialStoreModule.java @@ -0,0 +1,182 @@ +/** + * + * 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.config; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.util.Utils.toInputStream; +import static org.jclouds.util.Utils.toStringAndClose; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.collect.InputSupplierMap; +import org.jclouds.collect.TransformingMap; +import org.jclouds.domain.Credentials; +import org.jclouds.json.Json; +import org.jclouds.logging.Logger; +import org.jclouds.rest.ConfiguresCredentialStore; + +import com.google.common.annotations.Beta; +import com.google.common.base.Function; +import com.google.common.io.ByteStreams; +import com.google.common.io.Closeables; +import com.google.common.io.InputSupplier; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.TypeLiteral; + +/** + * + * @author Adrian Cole + */ +@Beta +@ConfiguresCredentialStore +public class CredentialStoreModule extends AbstractModule { + private static final Map> BACKING = new ConcurrentHashMap>(); + private final Map backing; + + public CredentialStoreModule(Map backing) { + this.backing = backing; + } + + public CredentialStoreModule() { + this(null); + } + + @Override + protected void configure() { + bind(new TypeLiteral>() { + }).to(CredentialsToJsonInputStream.class); + bind(new TypeLiteral>() { + }).to(CredentialsFromJsonInputStream.class); + if (backing != null) { + bind(new TypeLiteral>() { + }).toInstance(backing); + } else { + bind(new TypeLiteral>>() { + }).toInstance(BACKING); + bind(new TypeLiteral>() { + }).to(new TypeLiteral() { + }); + } + } + + @Singleton + public static class CredentialsToJsonInputStream implements Function { + private final Json json; + + @Inject + CredentialsToJsonInputStream(Json json) { + this.json = json; + } + + @Override + public InputStream apply(Credentials from) { + return toInputStream(json.toJson(checkNotNull(from))); + } + } + + @Singleton + public static class CopyInputStreamInputSupplierMap extends InputSupplierMap { + @Singleton + public static class CopyInputStreamIntoSupplier implements Function> { + @Resource + protected Logger logger = Logger.NULL; + + @SuppressWarnings("unchecked") + @Override + public InputSupplier apply(InputStream from) { + if (from == null) + return new InputSupplier() { + + @Override + public InputStream getInput() throws IOException { + return null; + } + + }; + try { + return InputSupplier.class.cast(ByteStreams.newInputStreamSupplier(ByteStreams.toByteArray(from))); + } catch (Exception e) { + logger.warn(e, "ignoring problem retrieving credentials"); + return null; + } finally { + Closeables.closeQuietly(from); + } + } + } + + @Inject + public CopyInputStreamInputSupplierMap(Map> toMap, + CopyInputStreamIntoSupplier putFunction) { + super(toMap, putFunction); + } + + public CopyInputStreamInputSupplierMap(Map> toMap) { + super(toMap, new CopyInputStreamIntoSupplier()); + } + + } + + @Singleton + public static class CredentialsFromJsonInputStream implements Function { + @Resource + protected Logger logger = Logger.NULL; + + private final Json json; + + @Inject + CredentialsFromJsonInputStream(Json json) { + this.json = json; + } + + private static class PrivateCredentials { + String identity; + String credential; + } + + @Override + public Credentials apply(InputStream from) { + try { + PrivateCredentials credentials = json.fromJson(toStringAndClose(checkNotNull(from)), + PrivateCredentials.class); + return new Credentials(credentials.identity, credentials.credential); + } catch (Exception e) { + logger.warn(e, "ignoring problem retrieving credentials"); + return null; + } + } + } + + @Provides + @Singleton + protected Map provideCredentialStore(Map backing, + Function credentialsSerializer, + Function credentialsDeserializer) { + return new TransformingMap(backing, credentialsDeserializer, + credentialsSerializer); + } +} \ 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 a44b188ca6..04dfd6e313 100644 --- a/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java +++ b/core/src/main/java/org/jclouds/rest/internal/RestContextImpl.java @@ -21,10 +21,12 @@ package org.jclouds.rest.internal; import java.io.IOException; import java.net.URI; +import java.util.Map; import javax.annotation.Resource; import javax.inject.Inject; +import org.jclouds.domain.Credentials; import org.jclouds.lifecycle.Closer; import org.jclouds.logging.Logger; import org.jclouds.rest.RestContext; @@ -54,11 +56,13 @@ public class RestContextImpl implements RestContext { private final String provider; private final String apiVersion; private final Utils utils; + private final Map credentialStore; @Inject - protected RestContextImpl(Closer closer, Utils utils, Injector injector, TypeLiteral syncApi, - TypeLiteral asyncApi, @Provider URI endpoint, @Provider String provider, @Identity String identity, - @ApiVersion String apiVersion) { + 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) { + this.credentialStore = credentialStore; this.utils = utils; this.asyncApi = injector.getInstance(Key.get(asyncApi)); this.syncApi = injector.getInstance(Key.get(syncApi)); @@ -169,7 +173,17 @@ public class RestContextImpl implements RestContext { @Override public String toString() { - return "RestContextImpl [provider=" + provider + ", endpoint=" + endpoint + ", apiVersion=" + apiVersion - + ", identity=" + identity + "]"; + return " [provider=" + provider + ", endpoint=" + endpoint + ", apiVersion=" + apiVersion + ", identity=" + + identity + "]"; + } + + @Override + public Map getCredentialStore() { + return credentialStore; + } + + @Override + public Map credentialStore() { + return credentialStore; } } diff --git a/core/src/main/java/org/jclouds/util/Utils.java b/core/src/main/java/org/jclouds/util/Utils.java index 8c4d3527cf..b8720e2f7b 100644 --- a/core/src/main/java/org/jclouds/util/Utils.java +++ b/core/src/main/java/org/jclouds/util/Utils.java @@ -47,10 +47,10 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; 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.regex.Matcher; import java.util.regex.Pattern; @@ -71,7 +71,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.common.io.OutputSupplier; -import com.google.gson.ExposedEscaper; import com.google.inject.Module; import com.google.inject.ProvisionException; import com.google.inject.spi.Message; @@ -82,11 +81,6 @@ import com.google.inject.spi.Message; * @author Adrian Cole */ public class Utils { - private static final ExposedEscaper escaper = new ExposedEscaper(false); - - public static String escapeJsonString(CharSequence plainText) { - return escaper.escapeJsonString(plainText); - } public static Supplier> composeMapSupplier(Iterable>> suppliers) { return new ListMapSupplier(suppliers); diff --git a/core/src/test/java/org/jclouds/rest/CredentialStoreModuleTest.java b/core/src/test/java/org/jclouds/rest/CredentialStoreModuleTest.java new file mode 100755 index 0000000000..cdf0fa1f4c --- /dev/null +++ b/core/src/test/java/org/jclouds/rest/CredentialStoreModuleTest.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.rest; + +import static org.jclouds.util.Utils.toStringAndClose; +import static org.testng.Assert.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.jclouds.crypto.PemsTest; +import org.jclouds.domain.Credentials; +import org.jclouds.json.Json; +import org.jclouds.json.config.GsonModule; +import org.jclouds.rest.config.CredentialStoreModule; +import org.jclouds.rest.config.CredentialStoreModule.CopyInputStreamInputSupplierMap; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import com.google.common.io.InputSupplier; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Key; +import com.google.inject.TypeLiteral; + +/** + * + * @author Adrian Cole + */ +@Test(groups = "unit", sequential = true, testName = "rest.CredentialStoreModuleTest") +public class CredentialStoreModuleTest { + Json json = createInjector().getInstance(Json.class); + + @DataProvider(name = "credentials") + public Object[][] createData() { + return new Object[][] { { "root", PemsTest.PRIVATE_KEY }, { "identity", "Base64==" }, + { "user@domain", "pa$sw@rd" }, { "user", "unic₪de" } }; + } + + @Test(dataProvider = "credentials") + public void deleteObject(String identity, String credential) throws InterruptedException, IOException { + Injector injector = createInjector(); + Map map = getMap(injector); + check(map, getStore(injector), "i-20312", identity, credential); + } + + public void testProvidedMapWithValue() throws IOException { + Map map = new CopyInputStreamInputSupplierMap( + new ConcurrentHashMap>()); + + map.put("test", new ByteArrayInputStream(json.toJson(new Credentials("user", "pass")).getBytes())); + checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); + checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); + remove(map, getStore(createInjectorWithProvidedMap(map)), "test"); + + } + + public void testProvidedConsistentAcrossRepeatedWrites() throws IOException { + Map map = new CopyInputStreamInputSupplierMap( + new ConcurrentHashMap>()); + + Injector injector = createInjectorWithProvidedMap(map); + assertEquals(injector.getInstance(Key.get(new TypeLiteral>() { + })), map); + Map store = getStore(injector); + + for (int i = 0; i < 10; i++) + check(map, store, "test" + i, "user" + i, "pass" + i); + + } + + public void testProvidedConsistentAcrossMultipleInjectors() throws IOException { + Map map = new CopyInputStreamInputSupplierMap( + new ConcurrentHashMap>()); + + put(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); + checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); + checkConsistent(map, getStore(createInjectorWithProvidedMap(map)), "test", "user", "pass"); + remove(map, getStore(createInjectorWithProvidedMap(map)), "test"); + + } + + public void testDefaultConsistentAcrossMultipleInjectors() throws IOException { + Map map = getMap(createInjector()); + + put(map, getStore(createInjector()), "test", "user", "pass"); + checkConsistent(map, getStore(createInjector()), "test", "user", "pass"); + checkConsistent(map, getStore(createInjector()), "test", "user", "pass"); + remove(map, getStore(createInjector()), "test"); + + } + + protected Map getStore(Injector injector) { + return injector.getInstance(Key.get(new TypeLiteral>() { + })); + } + + protected Map getMap(Injector injector) { + return injector.getInstance(Key.get(new TypeLiteral>() { + })); + } + + protected Injector createInjectorWithProvidedMap(Map map) { + return Guice.createInjector(new CredentialStoreModule(map), new GsonModule()); + } + + protected Injector createInjector() { + return Guice.createInjector(new CredentialStoreModule(), new GsonModule()); + } + + protected void check(Map map, Map store, String key, String identity, + String credential) throws IOException { + put(map, store, key, identity, credential); + checkConsistent(map, store, key, identity, credential); + remove(map, store, key); + } + + protected void remove(Map map, Map store, String key) { + store.remove(key); + assertEquals(store.size(), 0); + assertEquals(map.size(), 0); + assertEquals(store.get(key), null); + assertEquals(map.get(key), null); + } + + protected void checkConsistent(Map map, Map store, String key, + String identity, String credential) throws IOException { + assertEquals(store.size(), 1); + assertEquals(map.size(), 1); + // checkRepeatedRead + assertEquals(store.get(key), new Credentials(identity, credential)); + assertEquals(store.get(key), new Credentials(identity, credential)); + // checkRepeatedRead + checkToJson(map, key, identity, credential); + checkToJson(map, key, identity, credential); + } + + protected void checkToJson(Map map, String key, String identity, String credential) + throws IOException { + assertEquals(toStringAndClose(map.get(key)), json.toJson(new Credentials(identity, credential))); + } + + protected void put(Map map, Map store, String key, String identity, + String credential) { + assertEquals(store.size(), 0); + assertEquals(map.size(), 0); + store.put(key, new Credentials(identity, credential)); + } +} \ No newline at end of file diff --git a/core/src/test/java/org/jclouds/rest/RestContextBuilderTest.java b/core/src/test/java/org/jclouds/rest/RestContextBuilderTest.java index 05c572903f..0cb8ae6c41 100755 --- a/core/src/test/java/org/jclouds/rest/RestContextBuilderTest.java +++ b/core/src/test/java/org/jclouds/rest/RestContextBuilderTest.java @@ -26,12 +26,14 @@ import java.util.Arrays; import java.util.List; import java.util.Properties; +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.logging.config.LoggingModule; import org.jclouds.logging.config.NullLoggingModule; import org.jclouds.logging.jdk.config.JDKLoggingModule; +import org.jclouds.rest.config.CredentialStoreModule; import org.testng.annotations.Test; import com.google.inject.AbstractModule; @@ -77,6 +79,28 @@ public class RestContextBuilderTest { assertEquals(modules.remove(0), module); } + @Test + public void testAddExecutorServiceModuleIfNotPresent() { + List modules = new ArrayList(); + ExecutorServiceModule module = new ExecutorServiceModule(); + modules.add(module); + new RestContextBuilder(String.class, String.class, new Properties()) + .addExecutorServiceIfNotPresent(modules); + assertEquals(modules.size(), 1); + assertEquals(modules.remove(0), module); + } + + @Test + public void testAddCredentialStoreModuleIfNotPresent() { + List modules = new ArrayList(); + CredentialStoreModule module = new CredentialStoreModule(); + modules.add(module); + new RestContextBuilder(String.class, String.class, new Properties()) + .addCredentialStoreIfNotPresent(modules); + assertEquals(modules.size(), 1); + assertEquals(modules.remove(0), module); + } + @Test public void testAddNone() { List modules = new ArrayList(); diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java index 91d8c7abf6..1967083cd6 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java @@ -33,9 +33,8 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; -import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.gogrid.GoGridClient; import org.jclouds.gogrid.domain.Server; @@ -45,8 +44,6 @@ import org.jclouds.logging.Logger; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; @@ -75,8 +72,8 @@ public class ServerToNodeMetadata implements Function { @Override public boolean apply(Image input) { return input.getProviderId().equals(instance.getImage().getId() + "") - && (input.getLocation() == null || input.getLocation().getId().equals( - instance.getDatacenter().getId() + "")); + && (input.getLocation() == null || input.getLocation().getId() + .equals(instance.getDatacenter().getId() + "")); } } @@ -96,8 +93,8 @@ public class ServerToNodeMetadata implements Function { @Inject ServerToNodeMetadata(Map serverStateToNodeState, GoGridClient client, - Supplier> images, Supplier> hardwares, - Supplier> locations) { + Supplier> images, Supplier> hardwares, + Supplier> locations) { this.serverStateToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState"); this.client = checkNotNull(client, "client"); this.images = checkNotNull(images, "images"); @@ -107,28 +104,41 @@ public class ServerToNodeMetadata implements Function { @Override public NodeMetadata apply(Server from) { - String tag = parseTagFromName(from.getName()); - Set ipSet = ImmutableSet.of(from.getIp().getIp()); - NodeState state = serverStateToNodeState.get(from.getState()); - Credentials creds = client.getServerServices().getServerCredentialsList().get(from.getName()); + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + builder.ids(from.getId() + ""); + builder.name(from.getName()); + builder.location(locations.get().get(from.getDatacenter().getId() + "")); + builder.tag(parseTagFromName(from.getName())); + builder.hardware(parseHardware(from)); + builder.imageId(from.getImage().getId() + ""); + + Image image = parseImage(from); + if (image != null) + builder.operatingSystem(image.getOperatingSystem()); + + builder.state(serverStateToNodeState.get(from.getState())); + builder.publicAddresses(ImmutableSet.of(from.getIp().getIp())); + builder.credentials(client.getServerServices().getServerCredentialsList().get(from.getName())); + return builder.build(); + } + + protected Image parseImage(Server from) { Image image = null; try { image = Iterables.find(images.get(), new FindImageForServer(from)); } catch (NoSuchElementException e) { logger.warn("could not find a matching image for server %s", from); } + return image; + } + protected Hardware parseHardware(Server from) { Hardware hardware = null; try { hardware = Iterables.find(hardwares.get(), new FindHardwareForServer(from)); } catch (NoSuchElementException e) { logger.warn("could not find a matching hardware for server %s", from); } - - return new NodeMetadataImpl(from.getId() + "", from.getName(), from.getId() + "", locations.get().get( - from.getDatacenter().getId() + ""), null, ImmutableMap. of(), tag, hardware, from - .getImage().getId() - + "", image != null ? image.getOperatingSystem() : null, state, ipSet, ImmutableList. of(), - creds); + return hardware; } } \ No newline at end of file diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridHardwareSupplier.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridHardwareSupplier.java index 6fac7c7e12..ae8ee11f1b 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridHardwareSupplier.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridHardwareSupplier.java @@ -19,20 +19,18 @@ package org.jclouds.gogrid.compute.suppliers; -import static org.jclouds.compute.predicates.ImagePredicates.any; - import java.util.Set; import javax.inject.Singleton; import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.internal.HardwareImpl; +import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.internal.VolumeImpl; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; /** @@ -42,23 +40,23 @@ import com.google.common.collect.ImmutableSet; @Singleton public class GoGridHardwareSupplier implements Supplier> { - public static final HardwareImpl H8192 = new HardwareImpl("5", "5", "5", null, null, ImmutableMap - . of(), ImmutableList.of(new Processor(8, 1.0)), 8192, ImmutableList.of(new VolumeImpl( - 480.0f, true, true)), any()); - public static final HardwareImpl H4096 = new HardwareImpl("4", "4", "4", null, null, ImmutableMap - . of(), ImmutableList.of(new Processor(4, 1.0)), 4096, ImmutableList.of(new VolumeImpl( - 240.0f, true, true)), any()); - public static final HardwareImpl H2048 = new HardwareImpl("3", "3", "3", null, null, ImmutableMap - . of(), ImmutableList.of(new Processor(2, 1.0)), 2048, ImmutableList.of(new VolumeImpl( - 120.0f, true, true)), any()); - public static final HardwareImpl H1024 = new HardwareImpl("2", "2", "2", null, null, ImmutableMap - . of(), ImmutableList.of(new Processor(1, 1.0)), 1024, ImmutableList.of(new VolumeImpl( - 60.0f, true, true)), any()); - public static final HardwareImpl H512 = new HardwareImpl("1", "1", "1", null, null, ImmutableMap - . of(), ImmutableList.of(new Processor(0.5, 1.0)), 512, ImmutableList.of(new VolumeImpl( - 30.0f, true, true)), any()); + public static final Hardware H8192 = new HardwareBuilder().ids("5").ram(8192) + .processors(ImmutableList.of(new Processor(8, 1.0))) + .volumes(ImmutableList. of(new VolumeImpl(480.0f, true, true))).build(); + public static final Hardware H4096 = new HardwareBuilder().ids("4").ram(4096) + .processors(ImmutableList.of(new Processor(4, 1.0))) + .volumes(ImmutableList. of(new VolumeImpl(240.0f, true, true))).build(); + public static final Hardware H2048 = new HardwareBuilder().ids("3").ram(2048) + .processors(ImmutableList.of(new Processor(2, 1.0))) + .volumes(ImmutableList. of(new VolumeImpl(120.0f, true, true))).build(); + public static final Hardware H1024 = new HardwareBuilder().ids("2").ram(1024) + .processors(ImmutableList.of(new Processor(1, 1.0))) + .volumes(ImmutableList. of(new VolumeImpl(60.0f, true, true))).build(); + public static final Hardware H512 = new HardwareBuilder().ids("1").ram(512) + .processors(ImmutableList.of(new Processor(0.5, 1.0))) + .volumes(ImmutableList. of(new VolumeImpl(30.0f, true, true))).build(); - public static final ImmutableSet H_ALL = ImmutableSet.of(H512, H1024, H2048, H4096, H8192); + public static final ImmutableSet H_ALL = ImmutableSet.of(H512, H1024, H2048, H4096, H8192); @Override public Set get() { diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplier.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplier.java index 98d3b47498..142600faca 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplier.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplier.java @@ -28,19 +28,17 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.internal.ImageImpl; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; -import org.jclouds.domain.Credentials; import org.jclouds.gogrid.GoGridClient; import org.jclouds.gogrid.domain.ServerImage; import org.jclouds.gogrid.util.GoGridUtils; import org.jclouds.logging.Logger; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; /** @@ -70,30 +68,34 @@ public class GoGridImageSupplier implements Supplier> { logger.debug(">> providing images"); Set allImages = sync.getImageServices().getImageList(); for (ServerImage from : allImages) { - OsFamily osFamily = null; - String osName = from.getOs().getName(); - String osArch = from.getArchitecture().getDescription(); - String osVersion = null;// TODO - String osDescription = from.getOs().getDescription(); - boolean is64Bit = (from.getOs().getName().indexOf("64") != -1 || from.getDescription().indexOf("64") != -1); - - String description = from.getDescription(); - String version = ""; - - String matchedOs = GoGridUtils.parseStringByPatternAndGetNthMatchGroup(osName, GOGRID_OS_NAME_PATTERN, 1); - try { - osFamily = OsFamily.fromValue(matchedOs.toLowerCase()); - } catch (IllegalArgumentException e) { - logger.debug("<< didn't match os(%s)", matchedOs); - } - Credentials defaultCredentials = authenticator.execute(from); - // TODO determine DC images are in - OperatingSystem os = new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit); - - images.add(new ImageImpl(from.getId() + "", from.getFriendlyName(), from.getId() + "", null, null, - ImmutableMap. of(), os, description, version, defaultCredentials)); + ImageBuilder builder = new ImageBuilder(); + builder.ids(from.getId()+""); + builder.name(from.getFriendlyName()); + builder.description(from.getDescription()); + builder.defaultCredentials(authenticator.execute(from)); + builder.operatingSystem(parseOs(from)); + images.add(builder.build()); } logger.debug("<< images(%d)", images.size()); return images; } + + protected OperatingSystem parseOs(ServerImage from) { + OsFamily osFamily = null; + String osName = from.getOs().getName(); + String osArch = from.getArchitecture().getDescription(); + String osVersion = null;// TODO + String osDescription = from.getOs().getDescription(); + boolean is64Bit = (from.getOs().getName().indexOf("64") != -1 || from.getDescription().indexOf("64") != -1); + + String matchedOs = GoGridUtils.parseStringByPatternAndGetNthMatchGroup(osName, GOGRID_OS_NAME_PATTERN, 1); + try { + osFamily = OsFamily.fromValue(matchedOs.toLowerCase()); + } catch (IllegalArgumentException e) { + logger.debug("<< didn't match os(%s)", matchedOs); + } + // TODO determine DC images are in + OperatingSystem os = new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit); + return os; + } } \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java index 377e9f1110..e1aeeb9ed1 100755 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java @@ -30,10 +30,11 @@ import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.LoadBalancerService; import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.config.ComputeServiceTimeoutsModule; +import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.internal.BaseComputeService; import org.jclouds.compute.internal.ComputeServiceContextImpl; @@ -44,14 +45,18 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.rackspace.cloudservers.CloudServersAsyncClient; import org.jclouds.rackspace.cloudservers.CloudServersClient; +import org.jclouds.rackspace.cloudservers.compute.functions.CloudServersImageToImage; +import org.jclouds.rackspace.cloudservers.compute.functions.CloudServersImageToOperatingSystem; +import org.jclouds.rackspace.cloudservers.compute.functions.FlavorToHardware; import org.jclouds.rackspace.cloudservers.compute.functions.ServerToNodeMetadata; import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersAddNodeWithTagStrategy; import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersDestroyNodeStrategy; import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersGetNodeMetadataStrategy; import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersListNodesStrategy; import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersRebootNodeStrategy; -import org.jclouds.rackspace.cloudservers.compute.suppliers.CloudServersImageSupplier; import org.jclouds.rackspace.cloudservers.compute.suppliers.CloudServersHardwareSupplier; +import org.jclouds.rackspace.cloudservers.compute.suppliers.CloudServersImageSupplier; +import org.jclouds.rackspace.cloudservers.domain.Flavor; import org.jclouds.rackspace.cloudservers.domain.Server; import org.jclouds.rackspace.cloudservers.domain.ServerStatus; import org.jclouds.rackspace.config.RackspaceLocationsModule; @@ -82,6 +87,16 @@ public class CloudServersComputeServiceContextModule extends BaseComputeServiceC install(new RackspaceLocationsModule()); bind(new TypeLiteral>() { }).to(ServerToNodeMetadata.class); + + bind(new TypeLiteral>() { + }).to(CloudServersImageToImage.class); + + bind(new TypeLiteral>() { + }).to(CloudServersImageToOperatingSystem.class); + + bind(new TypeLiteral>() { + }).to(FlavorToHardware.class); + bind(LoadBalancerService.class).toProvider(Providers. of(null)); bind(new TypeLiteral() { }).to(new TypeLiteral>() { @@ -102,31 +117,31 @@ public class CloudServersComputeServiceContextModule extends BaseComputeServiceC } @VisibleForTesting - static final Map serverToNodeState = ImmutableMap. builder().put( - ServerStatus.ACTIVE, NodeState.RUNNING)// - .put(ServerStatus.SUSPENDED, NodeState.SUSPENDED)// - .put(ServerStatus.DELETED, NodeState.TERMINATED)// - .put(ServerStatus.QUEUE_RESIZE, NodeState.PENDING)// - .put(ServerStatus.PREP_RESIZE, NodeState.PENDING)// - .put(ServerStatus.RESIZE, NodeState.PENDING)// - .put(ServerStatus.VERIFY_RESIZE, NodeState.PENDING)// - .put(ServerStatus.QUEUE_MOVE, NodeState.PENDING)// - .put(ServerStatus.PREP_MOVE, NodeState.PENDING)// - .put(ServerStatus.MOVE, NodeState.PENDING)// - .put(ServerStatus.VERIFY_MOVE, NodeState.PENDING)// - .put(ServerStatus.RESCUE, NodeState.PENDING)// - .put(ServerStatus.ERROR, NodeState.ERROR)// - .put(ServerStatus.BUILD, NodeState.PENDING)// - .put(ServerStatus.RESTORING, NodeState.PENDING)// - .put(ServerStatus.PASSWORD, NodeState.PENDING)// - .put(ServerStatus.REBUILD, NodeState.PENDING)// - .put(ServerStatus.DELETE_IP, NodeState.PENDING)// - .put(ServerStatus.SHARE_IP_NO_CONFIG, NodeState.PENDING)// - .put(ServerStatus.SHARE_IP, NodeState.PENDING)// - .put(ServerStatus.REBOOT, NodeState.PENDING)// - .put(ServerStatus.HARD_REBOOT, NodeState.PENDING)// - .put(ServerStatus.UNKNOWN, NodeState.UNRECOGNIZED)// - .put(ServerStatus.UNRECOGNIZED, NodeState.UNRECOGNIZED).build(); + public static final Map serverToNodeState = ImmutableMap + . builder().put(ServerStatus.ACTIVE, NodeState.RUNNING)// + .put(ServerStatus.SUSPENDED, NodeState.SUSPENDED)// + .put(ServerStatus.DELETED, NodeState.TERMINATED)// + .put(ServerStatus.QUEUE_RESIZE, NodeState.PENDING)// + .put(ServerStatus.PREP_RESIZE, NodeState.PENDING)// + .put(ServerStatus.RESIZE, NodeState.PENDING)// + .put(ServerStatus.VERIFY_RESIZE, NodeState.PENDING)// + .put(ServerStatus.QUEUE_MOVE, NodeState.PENDING)// + .put(ServerStatus.PREP_MOVE, NodeState.PENDING)// + .put(ServerStatus.MOVE, NodeState.PENDING)// + .put(ServerStatus.VERIFY_MOVE, NodeState.PENDING)// + .put(ServerStatus.RESCUE, NodeState.PENDING)// + .put(ServerStatus.ERROR, NodeState.ERROR)// + .put(ServerStatus.BUILD, NodeState.PENDING)// + .put(ServerStatus.RESTORING, NodeState.PENDING)// + .put(ServerStatus.PASSWORD, NodeState.PENDING)// + .put(ServerStatus.REBUILD, NodeState.PENDING)// + .put(ServerStatus.DELETE_IP, NodeState.PENDING)// + .put(ServerStatus.SHARE_IP_NO_CONFIG, NodeState.PENDING)// + .put(ServerStatus.SHARE_IP, NodeState.PENDING)// + .put(ServerStatus.REBOOT, NodeState.PENDING)// + .put(ServerStatus.HARD_REBOOT, NodeState.PENDING)// + .put(ServerStatus.UNKNOWN, NodeState.UNRECOGNIZED)// + .put(ServerStatus.UNRECOGNIZED, NodeState.UNRECOGNIZED).build(); @Singleton @Provides diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToImage.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToImage.java new file mode 100644 index 0000000000..9d5575a573 --- /dev/null +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToImage.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.rackspace.cloudservers.compute.functions; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.domain.Credentials; + +import com.google.common.base.Function; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class CloudServersImageToImage implements Function { + private final Function imageToOs; + + @Inject + CloudServersImageToImage(Function imageToOs) { + this.imageToOs = imageToOs; + } + + public Image apply(org.jclouds.rackspace.cloudservers.domain.Image from) { + ImageBuilder builder = new ImageBuilder(); + builder.ids(from.getId() + ""); + builder.name(from.getName()); + builder.description(from.getName()); + builder.version(from.getUpdated().getTime() + ""); + builder.operatingSystem(imageToOs.apply(from)); + builder.defaultCredentials(new Credentials("root", null)); + Image image = builder.build(); + return image; + } +} \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToOperatingSystem.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToOperatingSystem.java new file mode 100644 index 0000000000..f03c2d6c70 --- /dev/null +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToOperatingSystem.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.rackspace.cloudservers.compute.functions; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.annotation.Resource; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class CloudServersImageToOperatingSystem implements + Function { + public static final Pattern RACKSPACE_PATTERN = Pattern.compile("(([^ ]*) .*)"); + + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + public OperatingSystem apply(final org.jclouds.rackspace.cloudservers.domain.Image from) { + OsFamily osFamily = null; + String osName = null; + String osArch = null; + String osVersion = null; + String osDescription = from.getName(); + boolean is64Bit = true; + Matcher matcher = RACKSPACE_PATTERN.matcher(from.getName()); + if (from.getName().indexOf("Red Hat EL") != -1) { + osFamily = OsFamily.RHEL; + } else if (from.getName().indexOf("Oracle EL") != -1) { + osFamily = OsFamily.OEL; + } else if (matcher.find()) { + try { + osFamily = OsFamily.fromValue(matcher.group(2).toLowerCase()); + } catch (IllegalArgumentException e) { + logger.debug("<< didn't match os(%s)", matcher.group(2)); + } + } + OperatingSystem os = new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit); + return os; + } +} \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/FlavorToHardware.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/FlavorToHardware.java new file mode 100644 index 0000000000..dcefae5d63 --- /dev/null +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/FlavorToHardware.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.rackspace.cloudservers.compute.functions; + +import javax.inject.Singleton; + +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.internal.VolumeImpl; +import org.jclouds.rackspace.cloudservers.domain.Flavor; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; + +/** + * @author Adrian Cole + */ +@Singleton +public class FlavorToHardware implements Function { + public Hardware apply(Flavor from) { + return new HardwareBuilder().ids(from.getId() + "").name(from.getName()) + .processors(ImmutableList.of(new Processor(from.getDisk() / 10.0, 1.0))).ram(from.getRam()) + .volumes(ImmutableList. of(new VolumeImpl((float) from.getDisk(), true, true))).build(); + } +} \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadata.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadata.java index 8ef0aebfa9..fecc700a45 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadata.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadata.java @@ -33,8 +33,10 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; @@ -52,27 +54,25 @@ import com.google.common.collect.Iterables; */ @Singleton public class ServerToNodeMetadata implements Function { - private final Supplier location; - private final Map serverToNodeState; - private final Supplier> images; - private final Supplier> hardwares; + protected final Supplier location; + protected final Map credentialStore; + protected final Map serverToNodeState; + protected final Supplier> images; + protected final Supplier> hardwares; @Resource protected Logger logger = Logger.NULL; private static class FindImageForServer implements Predicate { - private final Location location; private final Server instance; - private FindImageForServer(Location location, Server instance) { - this.location = location; + private FindImageForServer(Server instance) { this.instance = instance; } @Override public boolean apply(Image input) { - return input.getProviderId().equals(instance.getImageId() + "") - && (input.getLocation() == null || input.getLocation().equals(location.getParent())); + return input.getProviderId().equals(instance.getImageId() + ""); } } @@ -90,9 +90,10 @@ public class ServerToNodeMetadata implements Function { } @Inject - ServerToNodeMetadata(Map serverStateToNodeState, Supplier> images, - Supplier location, Supplier> hardwares) { + ServerToNodeMetadata(Map serverStateToNodeState, Map credentialStore, + Supplier> images, Supplier location, Supplier> hardwares) { this.serverToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.images = checkNotNull(images, "images"); this.location = checkNotNull(location, "location"); this.hardwares = checkNotNull(hardwares, "hardwares"); @@ -100,24 +101,37 @@ public class ServerToNodeMetadata implements Function { @Override public NodeMetadata apply(Server from) { - String tag = parseTagFromName(from.getName()); - Location host = new LocationImpl(LocationScope.HOST, from.getHostId(), from.getHostId(), location.get()); - Image image = null; + 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.userMetadata(from.getMetadata()); + builder.tag(parseTagFromName(from.getName())); + builder.imageId(from.getImageId() + ""); + builder.operatingSystem(parseOperatingSystem(from)); + builder.hardware(parseHardware(from)); + builder.state(serverToNodeState.get(from.getStatus())); + builder.publicAddresses(from.getAddresses().getPublicAddresses()); + builder.privateAddresses(from.getAddresses().getPrivateAddresses()); + builder.credentials(credentialStore.get(from.getId() + "")); + return builder.build(); + } + + protected Hardware parseHardware(Server from) { try { - image = Iterables.find(images.get(), new FindImageForServer(host, from)); - } catch (NoSuchElementException e) { - logger.warn("could not find a matching image for server %s in location %s", from, location); - } - Hardware hardware = null; - try { - hardware = Iterables.find(hardwares.get(), new FindHardwareForServer(from)); + return Iterables.find(hardwares.get(), new FindHardwareForServer(from)); } catch (NoSuchElementException e) { logger.warn("could not find a matching hardware for server %s", from); } - return new NodeMetadataImpl(from.getId() + "", from.getName(), from.getId() + "", host, null, from.getMetadata(), - tag, hardware, from.getImageId() + "", image != null ? image.getOperatingSystem() : null, - serverToNodeState.get(from.getStatus()), from.getAddresses().getPublicAddresses(), from.getAddresses() - .getPrivateAddresses(), null); + return null; } + protected OperatingSystem parseOperatingSystem(Server from) { + try { + return Iterables.find(images.get(), new FindImageForServer(from)).getOperatingSystem(); + } catch (NoSuchElementException e) { + logger.warn("could not find a matching image for server %s in location %s", from, location); + } + return null; + } } \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersAddNodeWithTagStrategy.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersAddNodeWithTagStrategy.java index 798b44d632..2a645e163f 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersAddNodeWithTagStrategy.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersAddNodeWithTagStrategy.java @@ -21,41 +21,43 @@ package org.jclouds.rackspace.cloudservers.compute.strategy; import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Map; + import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.domain.Credentials; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.rackspace.cloudservers.CloudServersClient; import org.jclouds.rackspace.cloudservers.domain.Server; +import com.google.common.base.Function; + /** * @author Adrian Cole */ @Singleton public class CloudServersAddNodeWithTagStrategy implements AddNodeWithTagStrategy { - private final CloudServersClient client; + protected final CloudServersClient client; + protected final Map credentialStore; + protected final Function serverToNodeMetadata; @Inject - protected CloudServersAddNodeWithTagStrategy(CloudServersClient client) { + protected CloudServersAddNodeWithTagStrategy(CloudServersClient client, Map credentialStore, + Function serverToNodeMetadata) { this.client = checkNotNull(client, "client"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.serverToNodeMetadata = checkNotNull(serverToNodeMetadata, "serverToNodeMetadata"); } @Override public NodeMetadata execute(String tag, String name, Template template) { - Server server = client.createServer(name, Integer.parseInt(template.getImage().getProviderId()), Integer - .parseInt(template.getHardware().getProviderId())); - return new NodeMetadataImpl(server.getId() + "", name, server.getId() + "", new LocationImpl(LocationScope.HOST, - server.getHostId(), server.getHostId(), template.getLocation()), null, server.getMetadata(), tag, - template.getHardware(), template.getImage().getId(), template.getImage().getOperatingSystem(), - NodeState.PENDING, server.getAddresses().getPublicAddresses(), server.getAddresses() - .getPrivateAddresses(), new Credentials("root", server.getAdminPass())); + Server from = client.createServer(name, Integer.parseInt(template.getImage().getProviderId()), + Integer.parseInt(template.getHardware().getProviderId())); + credentialStore.put(from.getId() + "", new Credentials("root", from.getAdminPass())); + return serverToNodeMetadata.apply(from); } } \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersHardwareSupplier.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersHardwareSupplier.java index 1f70ccabca..9440e9c214 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersHardwareSupplier.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersHardwareSupplier.java @@ -19,6 +19,8 @@ package org.jclouds.rackspace.cloudservers.compute.suppliers; +import static org.jclouds.rackspace.cloudservers.options.ListOptions.Builder.withDetails; + import java.util.Set; import javax.annotation.Resource; @@ -26,23 +28,15 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.internal.HardwareImpl; -import org.jclouds.compute.domain.internal.VolumeImpl; -import org.jclouds.compute.predicates.ImagePredicates; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.rackspace.cloudservers.CloudServersClient; import org.jclouds.rackspace.cloudservers.domain.Flavor; -import org.jclouds.rackspace.cloudservers.options.ListOptions; import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; /** @@ -55,27 +49,20 @@ public class CloudServersHardwareSupplier implements Supplier location; + private final Function flavorToHardware; @Inject - CloudServersHardwareSupplier(CloudServersClient sync, Supplier location, - Function indexer) { + CloudServersHardwareSupplier(CloudServersClient sync, Function flavorToHardware) { this.sync = sync; - this.location = location; + this.flavorToHardware = flavorToHardware; } @Override public Set get() { - final Set sizes = Sets.newHashSet(); - logger.debug(">> providing sizes"); - for (final Flavor from : sync.listFlavors(ListOptions.Builder.withDetails())) { - sizes.add(new HardwareImpl(from.getId() + "", from.getName(), from.getId() + "", location.get(), null, - ImmutableMap. of(), ImmutableList.of(new Processor(from.getDisk() / 10.0, 1.0)), from - .getRam(), ImmutableList.of(new VolumeImpl((float) from.getDisk(), true, true)), - ImagePredicates.any())); - } - logger.debug("<< sizes(%d)", sizes.size()); - return sizes; + final Set hardware; + logger.debug(">> providing hardware"); + hardware = Sets.newLinkedHashSet(Iterables.transform(sync.listFlavors(withDetails()), flavorToHardware)); + logger.debug("<< hardware(%d)", hardware.size()); + return hardware; } - } \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersImageSupplier.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersImageSupplier.java index 71d3653972..8ac4b63a1d 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersImageSupplier.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersImageSupplier.java @@ -19,9 +19,9 @@ package org.jclouds.rackspace.cloudservers.compute.suppliers; +import static org.jclouds.rackspace.cloudservers.options.ListOptions.Builder.withDetails; + import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.annotation.Resource; import javax.inject.Inject; @@ -29,18 +29,13 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.internal.ImageImpl; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.domain.Credentials; -import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.rackspace.cloudservers.CloudServersClient; -import org.jclouds.rackspace.cloudservers.options.ListOptions; +import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; /** @@ -49,52 +44,27 @@ import com.google.common.collect.Sets; */ @Singleton public class CloudServersImageSupplier implements Supplier> { - public static final Pattern RACKSPACE_PATTERN = Pattern.compile("(([^ ]*) .*)"); @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; - private CloudServersClient sync; - private Supplier location; + + protected final CloudServersClient sync; + protected final Function cloudServersImageToImage; @Inject - CloudServersImageSupplier(CloudServersClient sync, Supplier location) { + CloudServersImageSupplier(CloudServersClient sync, + Function cloudServersImageToImage) { this.sync = sync; - this.location = location; + this.cloudServersImageToImage = cloudServersImageToImage; } @Override public Set get() { - final Set images = Sets.newHashSet(); + Set images; logger.debug(">> providing images"); - for (final org.jclouds.rackspace.cloudservers.domain.Image from : sync.listImages(ListOptions.Builder - .withDetails())) { - String version = from.getUpdated().getTime() + ""; - Matcher matcher = RACKSPACE_PATTERN.matcher(from.getName()); - - OsFamily osFamily = null; - String osName = null; - String osArch = null; - String osVersion = null; - String osDescription = from.getName(); - boolean is64Bit = true; - - if (from.getName().indexOf("Red Hat EL") != -1) { - osFamily = OsFamily.RHEL; - } else if (from.getName().indexOf("Oracle EL") != -1) { - osFamily = OsFamily.OEL; - } else if (matcher.find()) { - try { - osFamily = OsFamily.fromValue(matcher.group(2).toLowerCase()); - } catch (IllegalArgumentException e) { - logger.debug("<< didn't match os(%s)", matcher.group(2)); - } - } - OperatingSystem os = new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit); - - images.add(new ImageImpl(from.getId() + "", from.getName(), from.getId() + "", location.get(), null, - ImmutableMap. of(), os, from.getName(), version, new Credentials("root", null))); - } + images = Sets. newLinkedHashSet(Iterables.transform(sync.listImages(withDetails()), + cloudServersImageToImage)); logger.debug("<< images(%d)", images.size()); return images; } diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToImageTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToImageTest.java new file mode 100644 index 0000000000..fbfc1ec638 --- /dev/null +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/CloudServersImageToImageTest.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.rackspace.cloudservers.compute.functions; + +import static org.testng.Assert.assertEquals; + +import java.net.UnknownHostException; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystemBuilder; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.domain.Credentials; +import org.jclouds.rackspace.cloudservers.functions.ParseImageFromJsonResponseTest; +import org.testng.annotations.Test; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "cloudservers.CloudServersImageToImageTest") +public class CloudServersImageToImageTest { + + @Test + public void testApplyWhereImageNotFound() throws UnknownHostException { + assertEquals( + convertImage(), + new ImageBuilder() + .name("CentOS 5.2") + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").is64Bit(true) + .build()).description("CentOS 5.2").defaultCredentials(new Credentials("root", null)) + .ids("2").version("1286712000000").build()); + } + + public static Image convertImage() { + org.jclouds.rackspace.cloudservers.domain.Image image = ParseImageFromJsonResponseTest.parseImage(); + + CloudServersImageToImage parser = new CloudServersImageToImage(new CloudServersImageToOperatingSystem()); + + return parser.apply(image); + } +} diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/FlavorToHardwareTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/FlavorToHardwareTest.java new file mode 100644 index 0000000000..15dcf01811 --- /dev/null +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/FlavorToHardwareTest.java @@ -0,0 +1,68 @@ +/** + * + * 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.rackspace.cloudservers.compute.functions; + +import static org.testng.Assert.assertEquals; + +import java.net.UnknownHostException; + +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.LocationScope; +import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.rackspace.cloudservers.domain.Flavor; +import org.jclouds.rackspace.cloudservers.functions.ParseFlavorFromJsonResponseTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "cloudservers.FlavorToHardwareTest") +public class FlavorToHardwareTest { + Location provider = new LocationImpl(LocationScope.ZONE, "dallas", "description", null); + + @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()); + } + + public static Hardware convertFlavor() { + Flavor flavor = ParseFlavorFromJsonResponseTest.parseFlavor(); + + FlavorToHardware parser = new FlavorToHardware(); + + return parser.apply(flavor); + } +} diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadataTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadataTest.java index c889ffa6c6..5a863b1bba 100644 --- a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadataTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadataTest.java @@ -19,10 +19,6 @@ package org.jclouds.rackspace.cloudservers.compute.functions; -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.net.UnknownHostException; @@ -30,19 +26,28 @@ import java.util.Map; import java.util.Set; import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OperatingSystemBuilder; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Processor; +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.LocationScope; import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.rackspace.cloudservers.domain.Addresses; +import org.jclouds.rackspace.cloudservers.compute.config.CloudServersComputeServiceContextModule; import org.jclouds.rackspace.cloudservers.domain.Server; import org.jclouds.rackspace.cloudservers.domain.ServerStatus; +import org.jclouds.rackspace.cloudservers.functions.ParseServerFromJsonResponseTest; import org.testng.annotations.Test; import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -51,76 +56,151 @@ import com.google.common.collect.ImmutableSet; */ @Test(groups = "unit", testName = "cloudservers.ServerToNodeMetadataTest") public class ServerToNodeMetadataTest { + Location provider = new LocationImpl(LocationScope.ZONE, "dallas", "description", null); - @SuppressWarnings("unchecked") @Test - public void testApplySetsTagFromNameAndSetsMetadata() throws UnknownHostException { - Map serverStateToNodeState = createMock(Map.class); - org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); + public void testApplyWhereImageAndHardwareNotFoundButCredentialsFound() + throws UnknownHostException { + Credentials creds = new Credentials("root", "abdce"); - Set images = ImmutableSet.of(jcImage); + Map serverStateToNodeState = CloudServersComputeServiceContextModule.serverToNodeState; + Set images = ImmutableSet.of(); + Set hardwares = ImmutableSet.of(); + Server server = ParseServerFromJsonResponseTest.parseServer(); - org.jclouds.compute.domain.Hardware jcHardware = createMock(org.jclouds.compute.domain.Hardware.class); - - Set hardwares = ImmutableSet.of(jcHardware); - - Server server = createMock(Server.class); - - expect(server.getId()).andReturn(10000).atLeastOnce(); - expect(server.getName()).andReturn("cloudservers-ea3").atLeastOnce(); - expect(server.getHostId()).andReturn("AHOST").atLeastOnce(); - expect(server.getMetadata()).andReturn(ImmutableMap. of()).atLeastOnce(); - - expect(server.getStatus()).andReturn(ServerStatus.ACTIVE).atLeastOnce(); - - expect(serverStateToNodeState.get(ServerStatus.ACTIVE)).andReturn(NodeState.RUNNING); - Location provider = new LocationImpl(LocationScope.ZONE, "dallas", "description", null); - Location location = new LocationImpl(LocationScope.HOST, "AHOST", "AHOST", provider); - - Addresses addresses = createMock(Addresses.class); - expect(server.getAddresses()).andReturn(addresses).atLeastOnce(); - - Set publicAddresses = ImmutableSet.of("12.10.10.1"); - Set privateAddresses = ImmutableSet.of("10.10.10.1"); - - expect(addresses.getPublicAddresses()).andReturn(publicAddresses); - expect(addresses.getPrivateAddresses()).andReturn(privateAddresses); - - expect(server.getImageId()).andReturn(2000).atLeastOnce(); - - expect(jcImage.getProviderId()).andReturn("2000").atLeastOnce(); - expect(jcHardware.getProviderId()).andReturn("1000").atLeastOnce(); - expect(server.getFlavorId()).andReturn(1000).atLeastOnce(); - - expect(jcImage.getLocation()).andReturn(provider).atLeastOnce(); - expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce(); - - replay(addresses); - replay(jcImage); - replay(jcHardware); - replay(serverStateToNodeState); - replay(server); - - ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers - .> ofInstance(images), Suppliers.ofInstance(provider), Suppliers - .> ofInstance(hardwares)); + ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, + ImmutableMap. of("1234", creds), Suppliers.> ofInstance(images), + Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); NodeMetadata metadata = parser.apply(server); - assertEquals(metadata.getLocation(), location); - assertEquals(metadata.getImageId(), "2000"); - assert metadata.getUserMetadata() != null; - assertEquals(metadata.getTag(), "cloudservers"); - assertEquals(metadata.getCredentials(), null); - assertEquals(metadata.getPrivateAddresses(), privateAddresses); - assertEquals(metadata.getPublicAddresses(), publicAddresses); + 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(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + } - verify(addresses); - verify(serverStateToNodeState); - verify(server); - verify(jcImage); - verify(jcHardware); + @Test + public void testApplyWhereImageAndHardwareNotFound() throws UnknownHostException { + Map serverStateToNodeState = CloudServersComputeServiceContextModule.serverToNodeState; + Set images = ImmutableSet.of(); + Set hardwares = ImmutableSet.of(); + Server server = ParseServerFromJsonResponseTest.parseServer(); + + ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, + ImmutableMap. of(), 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") + .location( + new LocationImpl(LocationScope.HOST, "e4d909c290d0fb1ca068ffaddf22cbd0", + "e4d909c290d0fb1ca068ffaddf22cbd0", new LocationImpl(LocationScope.ZONE, "dallas", + "description", null))) + .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } -} + @Test + public void testApplyWhereImageFoundAndHardwareNotFound() throws UnknownHostException { + Map serverStateToNodeState = CloudServersComputeServiceContextModule.serverToNodeState; + org.jclouds.compute.domain.Image jcImage = CloudServersImageToImageTest.convertImage(); + Set images = ImmutableSet.of(jcImage); + Set hardwares = ImmutableSet.of(); + Server server = ParseServerFromJsonResponseTest.parseServer(); + + ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, + ImmutableMap. of(), 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") + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 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(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + + } + + @Test + public void testApplyWhereImageAndHardwareFound() throws UnknownHostException { + Map serverStateToNodeState = CloudServersComputeServiceContextModule.serverToNodeState; + Set images = ImmutableSet.of(CloudServersImageToImageTest.convertImage()); + Set hardwares = ImmutableSet.of(FlavorToHardwareTest.convertFlavor()); + Server server = ParseServerFromJsonResponseTest.parseServer(); + + ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, + ImmutableMap. of(), 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") + .hardware( + 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()) + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 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(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + } +} \ No newline at end of file diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseFlavorFromJsonResponseTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseFlavorFromJsonResponseTest.java index abee165dd1..0b7e4922ba 100644 --- a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseFlavorFromJsonResponseTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseFlavorFromJsonResponseTest.java @@ -22,7 +22,6 @@ package org.jclouds.rackspace.cloudservers.functions; import static org.testng.Assert.assertEquals; import java.io.InputStream; -import java.net.UnknownHostException; import org.jclouds.http.HttpResponse; import org.jclouds.http.functions.UnwrapOnlyJsonValue; @@ -32,6 +31,7 @@ import org.jclouds.rackspace.cloudservers.domain.Flavor; import org.jclouds.rackspace.config.RackspaceParserModule; import org.testng.annotations.Test; +import com.google.gson.Gson; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Key; @@ -44,18 +44,24 @@ import com.google.inject.TypeLiteral; */ @Test(groups = "unit", testName = "cloudservers.ParseFlavorFromJsonResponseTest") public class ParseFlavorFromJsonResponseTest { - Injector i = Guice.createInjector(new RackspaceParserModule(), new GsonModule()); + public void test() { + Flavor response = parseFlavor(); - public void testApplyInputStreamDetails() throws UnknownHostException { - InputStream is = getClass().getResourceAsStream("/cloudservers/test_get_flavor_details.json"); + String json = new Gson().toJson(response); + + assertEquals(json, "{\"id\":1,\"name\":\"256 MB Server\",\"disk\":10,\"ram\":256}"); + } + + public static Flavor parseFlavor() { + Injector i = Guice.createInjector(new RackspaceParserModule(), new GsonModule()); + + InputStream is = ParseFlavorFromJsonResponseTest.class + .getResourceAsStream("/cloudservers/test_get_flavor_details.json"); UnwrapOnlyJsonValue parser = i.getInstance(Key.get(new TypeLiteral>() { })); Flavor response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is))); - assertEquals(response.getId(), 1); - assertEquals(response.getName(), "256 MB Server"); - assertEquals(response.getRam(), new Integer(256)); - assertEquals(response.getDisk(), new Integer(10)); + return response; } } diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseImageFromJsonResponseTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseImageFromJsonResponseTest.java index 35400f7aa5..39f692cacb 100644 --- a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseImageFromJsonResponseTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseImageFromJsonResponseTest.java @@ -51,11 +51,7 @@ public class ParseImageFromJsonResponseTest { DateService dateService = i.getInstance(DateService.class); public void testApplyInputStreamDetails() throws UnknownHostException { - InputStream is = getClass().getResourceAsStream("/cloudservers/test_get_image_details.json"); - - UnwrapOnlyJsonValue parser = i.getInstance(Key.get(new TypeLiteral>() { - })); - Image response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is))); + Image response = parseImage(); assertEquals(response.getId(), 2); assertEquals(response.getName(), "CentOS 5.2"); @@ -64,5 +60,19 @@ public class ParseImageFromJsonResponseTest { assertEquals(response.getServerId(), new Integer(12)); assertEquals(response.getStatus(), ImageStatus.SAVING); assertEquals(response.getUpdated(), dateService.iso8601SecondsDateParse(("2010-10-10T12:00:00Z"))); + } + + public static Image parseImage() { + Injector i = Guice.createInjector(new RackspaceParserModule(), new GsonModule()); + + InputStream is = ParseImageFromJsonResponseTest.class + .getResourceAsStream("/cloudservers/test_get_image_details.json"); + + UnwrapOnlyJsonValue parser = i.getInstance(Key.get(new TypeLiteral>() { + })); + Image response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is))); + return response; + } + } diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseServerFromJsonResponseTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseServerFromJsonResponseTest.java index 7688274c13..2345c5a406 100644 --- a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseServerFromJsonResponseTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/functions/ParseServerFromJsonResponseTest.java @@ -50,14 +50,8 @@ import com.google.inject.TypeLiteral; @Test(groups = "unit", testName = "cloudservers.ParseServerFromJsonResponseTest") public class ParseServerFromJsonResponseTest { - Injector i = Guice.createInjector(new RackspaceParserModule(), new GsonModule()); - public void testApplyInputStreamDetails() throws UnknownHostException { - InputStream is = getClass().getResourceAsStream("/cloudservers/test_get_server_detail.json"); - - UnwrapOnlyJsonValue parser = i.getInstance(Key.get(new TypeLiteral>() { - })); - Server response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is))); + Server response = parseServer(); assertEquals(response.getId(), 1234); assertEquals(response.getName(), "sample-server"); @@ -76,4 +70,15 @@ public class ParseServerFromJsonResponseTest { } + public static Server parseServer() { + Injector i = Guice.createInjector(new RackspaceParserModule(), new GsonModule()); + + InputStream is = ParseServerFromJsonResponseTest.class.getResourceAsStream("/cloudservers/test_get_server_detail.json"); + + UnwrapOnlyJsonValue parser = i.getInstance(Key.get(new TypeLiteral>() { + })); + Server response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is))); + return response; + } + } diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java index 6e138cd979..54d4d77cf6 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java @@ -32,8 +32,9 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; +import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; @@ -45,8 +46,6 @@ import org.jclouds.rimuhosting.miro.domain.internal.RunningState; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; /** @@ -58,9 +57,10 @@ public class ServerToNodeMetadata implements Function { @Resource protected Logger logger = Logger.NULL; - private final Function> getPublicAddresses; - private final Map runningStateToNodeState; - private final Supplier> images; + protected final Map credentialStore; + protected final Function> getPublicAddresses; + protected final Map runningStateToNodeState; + protected final Supplier> images; private static class FindImageForServer implements Predicate { private final Location location; @@ -74,38 +74,46 @@ public class ServerToNodeMetadata implements Function { @Override public boolean apply(Image input) { return input.getProviderId().equals(instance.getImageId()) - && (input.getLocation() == null || input.getLocation().equals(location) || input.getLocation() - .equals(location.getParent())); + && (input.getLocation() == null || input.getLocation().equals(location) || input.getLocation().equals( + location.getParent())); } } @Inject ServerToNodeMetadata(Function> getPublicAddresses, - Map runningStateToNodeState, Supplier> images) { + Map credentialStore, Map runningStateToNodeState, + Supplier> images) { this.getPublicAddresses = checkNotNull(getPublicAddresses, "serverStateToNodeState"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.runningStateToNodeState = checkNotNull(runningStateToNodeState, "serverStateToNodeState"); this.images = checkNotNull(images, "images"); } @Override public NodeMetadata apply(Server from) { + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + builder.ids(from.getId() + ""); + builder.name(from.getName()); // TODO properly look up location - Location location = new LocationImpl(LocationScope.ZONE, from.getLocation().getId(), - from.getLocation().getName(), null); - String tag = parseTagFromName(from.getName()); - Credentials creds = null; + LocationImpl location = new LocationImpl(LocationScope.ZONE, from.getLocation().getId(), from.getLocation() + .getName(), null); + builder.location(location); + builder.tag(parseTagFromName(from.getName())); + builder.imageId(from.getImageId() + ""); + builder.operatingSystem(parseOperatingSystem(from, location)); + builder.hardware(null);// TODO + builder.state(runningStateToNodeState.get(from.getState())); + builder.publicAddresses(getPublicAddresses.apply(from)); + builder.credentials(credentialStore.get(from.getId() + "")); + return builder.build(); + } - Image image = null; + protected OperatingSystem parseOperatingSystem(Server from, LocationImpl location) { try { - image = Iterables.find(images.get(), new FindImageForServer(location, from)); + return Iterables.find(images.get(), new FindImageForServer(location, from)).getOperatingSystem(); } catch (NoSuchElementException e) { logger.warn("could not find a matching image for server %s in location %s", from, location); } - - NodeState state = runningStateToNodeState.get(from.getState()); - return new NodeMetadataImpl(from.getId() + "", from.getName(), from.getId() + "", location, null, ImmutableMap - . of(), tag, null, from.getImageId(), image != null ? image.getOperatingSystem() : null, - state, getPublicAddresses.apply(from), ImmutableList. of(), creds); - + return null; } } \ No newline at end of file diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java index 1a02e0b73d..e3adecf336 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java @@ -27,19 +27,14 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.domain.Credentials; import org.jclouds.rimuhosting.miro.RimuHostingClient; import org.jclouds.rimuhosting.miro.domain.NewServerResponse; import org.jclouds.rimuhosting.miro.domain.Server; -import org.jclouds.rimuhosting.miro.domain.internal.RunningState; import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; /** * @@ -47,29 +42,27 @@ import com.google.common.collect.ImmutableMap; */ @Singleton public class RimuHostingAddNodeWithTagStrategy implements AddNodeWithTagStrategy { - private final RimuHostingClient client; - private final Function> getPublicAddresses; - private final Map runningStateToNodeState; + protected final RimuHostingClient client; + protected final Map credentialStore; + protected final Function serverToNodeMetadata; @Inject - protected RimuHostingAddNodeWithTagStrategy(RimuHostingClient client, - Function> getPublicAddresses, Map runningStateToNodeState) { + protected RimuHostingAddNodeWithTagStrategy(RimuHostingClient client, Map credentialStore, + Function serverToNodeMetadata) { this.client = client; - this.getPublicAddresses = getPublicAddresses; - this.runningStateToNodeState = runningStateToNodeState; + this.credentialStore = credentialStore; + this.serverToNodeMetadata = serverToNodeMetadata; } @Override public NodeMetadata execute(String tag, String name, Template template) { - NewServerResponse serverResponse = client.createServer(name, checkNotNull(template.getImage().getProviderId(), - "imageId"), checkNotNull(template.getHardware().getProviderId(), "hardwareId")); - Server server = client.getServer(serverResponse.getServer().getId()); - NodeMetadata node = new NodeMetadataImpl(server.getId().toString(), name, server.getId().toString(), template - .getLocation(), null, ImmutableMap. of(), tag, template.getHardware(), template - .getImage().getId(), template.getImage().getOperatingSystem(), runningStateToNodeState.get(server - .getState()), getPublicAddresses.apply(server), ImmutableList. of(), new Credentials("root", - serverResponse.getNewInstanceRequest().getCreateOptions().getPassword())); - return node; + NewServerResponse serverResponse = client.createServer(name, + checkNotNull(template.getImage().getProviderId(), "imageId"), + checkNotNull(template.getHardware().getProviderId(), "hardwareId")); + Server from = client.getServer(serverResponse.getServer().getId()); + credentialStore.put(from.getId() + "", new Credentials("root", serverResponse.getNewInstanceRequest() + .getCreateOptions().getPassword())); + return serverToNodeMetadata.apply(from); } } \ No newline at end of file diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingHardwareSupplier.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingHardwareSupplier.java index e658a87fb2..288331c82c 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingHardwareSupplier.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingHardwareSupplier.java @@ -27,10 +27,10 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.internal.HardwareImpl; +import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.internal.VolumeImpl; -import org.jclouds.compute.predicates.ImagePredicates; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; @@ -40,7 +40,6 @@ import org.jclouds.rimuhosting.miro.domain.PricingPlan; import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; @@ -78,9 +77,9 @@ public class RimuHostingHardwareSupplier implements Supplier of(), ImmutableList.of(new Processor(1, 1.0)), from.getRam(), ImmutableList - .of(new VolumeImpl((float) from.getDiskSize(), true, true)), ImagePredicates.any())); + sizes.add(new HardwareBuilder().ids(from.getId()).location(location) + .processors(ImmutableList.of(new Processor(1, 1.0))).ram(from.getRam()) + .volumes(ImmutableList. of(new VolumeImpl((float) from.getDiskSize(), true, true))).build()); } catch (NullPointerException e) { logger.warn("datacenter not present in " + from.getId()); } diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingImageSupplier.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingImageSupplier.java index bdeb149e9c..7d584ca2e2 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingImageSupplier.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingImageSupplier.java @@ -29,16 +29,15 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.internal.ImageImpl; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Credentials; import org.jclouds.logging.Logger; import org.jclouds.rimuhosting.miro.RimuHostingClient; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; /** @@ -63,32 +62,38 @@ public class RimuHostingImageSupplier implements Supplier> public Set get() { final Set images = Sets.newHashSet(); logger.debug(">> providing images"); - for (final org.jclouds.rimuhosting.miro.domain.Image from : sync.getImageList()) { - String version = null; - - OsFamily osFamily = null; - String osName = null; - String osArch = null; - String osVersion = null; - String osDescription = from.getId(); - boolean is64Bit = from.getId().indexOf("64") != -1; - - osDescription = from.getId(); - - Matcher matcher = RIMU_PATTERN.matcher(from.getId()); - if (matcher.find()) { - try { - osFamily = OsFamily.fromValue(matcher.group(1).toLowerCase()); - } catch (IllegalArgumentException e) { - logger.debug("<< didn't match os(%s)", matcher.group(2)); - } - } - OperatingSystem os = new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit); - - images.add(new ImageImpl(from.getId(), from.getDescription(), from.getId(), null, null, ImmutableMap - . of(), os, from.getDescription(), version, new Credentials("root", null))); + for (org.jclouds.rimuhosting.miro.domain.Image from : sync.getImageList()) { + ImageBuilder builder = new ImageBuilder(); + builder.ids(from.getId() + ""); + builder.name(from.getDescription()); + builder.description(from.getDescription()); + builder.operatingSystem(parseOs(from)); + builder.defaultCredentials(new Credentials("root", null)); + images.add(builder.build()); } logger.debug("<< images(%d)", images.size()); return images; } + + protected OperatingSystem parseOs(final org.jclouds.rimuhosting.miro.domain.Image from) { + OsFamily osFamily = null; + String osName = null; + String osArch = null; + String osVersion = null; + String osDescription = from.getId(); + boolean is64Bit = from.getId().indexOf("64") != -1; + + osDescription = from.getId(); + + Matcher matcher = RIMU_PATTERN.matcher(from.getId()); + if (matcher.find()) { + try { + osFamily = OsFamily.fromValue(matcher.group(1).toLowerCase()); + } catch (IllegalArgumentException e) { + logger.debug("<< didn't match os(%s)", matcher.group(2)); + } + } + OperatingSystem os = new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit); + return os; + } } \ No newline at end of file diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModule.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModule.java index c41ca022d7..3f7ec9c8bd 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModule.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModule.java @@ -34,6 +34,7 @@ import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.internal.BaseComputeService; import org.jclouds.compute.internal.ComputeServiceContextImpl; @@ -50,7 +51,10 @@ import org.jclouds.rest.annotations.Provider; import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.slicehost.SlicehostAsyncClient; import org.jclouds.slicehost.SlicehostClient; +import org.jclouds.slicehost.compute.functions.FlavorToHardware; import org.jclouds.slicehost.compute.functions.SliceToNodeMetadata; +import org.jclouds.slicehost.compute.functions.SlicehostImageToImage; +import org.jclouds.slicehost.compute.functions.SlicehostImageToOperatingSystem; import org.jclouds.slicehost.compute.strategy.SlicehostAddNodeWithTagStrategy; import org.jclouds.slicehost.compute.strategy.SlicehostDestroyNodeStrategy; import org.jclouds.slicehost.compute.strategy.SlicehostGetNodeMetadataStrategy; @@ -58,6 +62,7 @@ import org.jclouds.slicehost.compute.strategy.SlicehostListNodesStrategy; import org.jclouds.slicehost.compute.strategy.SlicehostRebootNodeStrategy; import org.jclouds.slicehost.compute.suppliers.SlicehostHardwareSupplier; import org.jclouds.slicehost.compute.suppliers.SlicehostImageSupplier; +import org.jclouds.slicehost.domain.Flavor; import org.jclouds.slicehost.domain.Slice; import com.google.common.annotations.VisibleForTesting; @@ -83,6 +88,15 @@ public class SlicehostComputeServiceContextModule extends BaseComputeServiceCont install(new ComputeServiceTimeoutsModule()); bind(new TypeLiteral>() { }).to(SliceToNodeMetadata.class); + + bind(new TypeLiteral>() { + }).to(SlicehostImageToImage.class); + + bind(new TypeLiteral>() { + }).to(SlicehostImageToOperatingSystem.class); + bind(new TypeLiteral>() { + }).to(FlavorToHardware.class); + bind(LoadBalancerService.class).toProvider(Providers. of(null)); bind(new TypeLiteral() { }).to(new TypeLiteral>() { @@ -103,14 +117,14 @@ public class SlicehostComputeServiceContextModule extends BaseComputeServiceCont } @VisibleForTesting - static final Map sliceStatusToNodeState = ImmutableMap. builder() - .put(Slice.Status.ACTIVE, NodeState.RUNNING)// - .put(Slice.Status.BUILD, NodeState.PENDING)// - .put(Slice.Status.REBOOT, NodeState.PENDING)// - .put(Slice.Status.HARD_REBOOT, NodeState.PENDING)// - .put(Slice.Status.TERMINATED, NodeState.TERMINATED)// - .put(Slice.Status.UNRECOGNIZED, NodeState.UNRECOGNIZED)// - .build(); + public static final Map sliceStatusToNodeState = ImmutableMap + . builder().put(Slice.Status.ACTIVE, NodeState.RUNNING)// + .put(Slice.Status.BUILD, NodeState.PENDING)// + .put(Slice.Status.REBOOT, NodeState.PENDING)// + .put(Slice.Status.HARD_REBOOT, NodeState.PENDING)// + .put(Slice.Status.TERMINATED, NodeState.TERMINATED)// + .put(Slice.Status.UNRECOGNIZED, NodeState.UNRECOGNIZED)// + .build(); @Singleton @Provides diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/FlavorToHardware.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/FlavorToHardware.java new file mode 100644 index 0000000000..78481477db --- /dev/null +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/FlavorToHardware.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.slicehost.compute.functions; + +import javax.inject.Singleton; + +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.internal.VolumeImpl; +import org.jclouds.slicehost.domain.Flavor; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; + +/** + * @author Adrian Cole + */ +@Singleton +public class FlavorToHardware implements Function { + public Hardware apply(Flavor from) { + return new HardwareBuilder().ids(from.getId() + "").name(from.getName()) + .processors(ImmutableList.of(new Processor(from.getRam() / 1024.0, 1.0))).ram(from.getRam()) + .volumes(ImmutableList. of(new VolumeImpl((from.getRam() * 4) / 1024.0f, true, true))).build(); + } +} \ No newline at end of file diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java index cb9104567d..5b6a86fbbd 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java @@ -32,8 +32,10 @@ import javax.inject.Inject; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.slicehost.domain.Slice; @@ -41,17 +43,17 @@ import org.jclouds.slicehost.domain.Slice; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; /** * @author Adrian Cole */ public class SliceToNodeMetadata implements Function { - private final Supplier location; - private final Map sliceToNodeState; - private final Supplier> images; - private final Supplier> hardwares; + protected final Supplier location; + protected final Map sliceToNodeState; + protected final Supplier> images; + protected final Supplier> hardwares; + protected final Map credentialStore; @Resource protected Logger logger = Logger.NULL; @@ -83,9 +85,10 @@ public class SliceToNodeMetadata implements Function { } @Inject - SliceToNodeMetadata(Map sliceStateToNodeState, Supplier> images, - Supplier location, Supplier> hardwares) { + SliceToNodeMetadata(Map sliceStateToNodeState, Map credentialStore, + Supplier> images, Supplier location, Supplier> hardwares) { this.sliceToNodeState = checkNotNull(sliceStateToNodeState, "sliceStateToNodeState"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.images = checkNotNull(images, "images"); this.location = checkNotNull(location, "location"); this.hardwares = checkNotNull(hardwares, "hardwares"); @@ -93,36 +96,50 @@ public class SliceToNodeMetadata implements Function { @Override public NodeMetadata apply(Slice from) { - String tag = parseTagFromName(from.getName()); - Image image = null; + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + builder.ids(from.getId() + ""); + builder.name(from.getName()); + builder.location(location.get()); + builder.tag(parseTagFromName(from.getName())); + builder.imageId(from.getImageId() + ""); + builder.operatingSystem(parseOperatingSystem(from)); + builder.hardware(parseHardware(from)); + builder.state(sliceToNodeState.get(from.getStatus())); + builder.publicAddresses(Iterables.filter(from.getAddresses(), new Predicate() { + + @Override + public boolean apply(String input) { + return !input.startsWith("10."); + } + + })); + builder.privateAddresses(Iterables.filter(from.getAddresses(), new Predicate() { + + @Override + public boolean apply(String input) { + return input.startsWith("10."); + } + + })); + builder.credentials(credentialStore.get(from.getId() + "")); + return builder.build(); + } + + protected Hardware parseHardware(Slice from) { try { - image = Iterables.find(images.get(), new FindImageForSlice(from)); - } catch (NoSuchElementException e) { - logger.warn("could not find a matching image for slice %s in location %s", from, location); - } - Hardware hardware = null; - try { - hardware = Iterables.find(hardwares.get(), new FindHardwareForSlice(from)); + return Iterables.find(hardwares.get(), new FindHardwareForSlice(from)); } catch (NoSuchElementException e) { logger.warn("could not find a matching hardware for slice %s", from); } - return new NodeMetadataImpl(from.getId() + "", from.getName(), from.getId() + "", location.get(), null, - ImmutableMap. of(), tag, hardware, from.getImageId() + "", image != null ? image - .getOperatingSystem() : null, sliceToNodeState.get(from.getStatus()), Iterables.filter(from - .getAddresses(), new Predicate() { + return null; + } - @Override - public boolean apply(String input) { - return !input.startsWith("10."); - } - - }), Iterables.filter(from.getAddresses(), new Predicate() { - - @Override - public boolean apply(String input) { - return input.startsWith("10."); - } - - }), null); + protected OperatingSystem parseOperatingSystem(Slice from) { + try { + return Iterables.find(images.get(), new FindImageForSlice(from)).getOperatingSystem(); + } catch (NoSuchElementException e) { + logger.warn("could not find a matching image for slice %s in location %s", from, location); + } + return null; } } diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SlicehostImageToImage.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SlicehostImageToImage.java new file mode 100644 index 0000000000..7ce8eeaa68 --- /dev/null +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SlicehostImageToImage.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.slicehost.compute.functions; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.domain.Credentials; + +import com.google.common.base.Function; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class SlicehostImageToImage implements Function { + private final Function imageToOs; + + @Inject + SlicehostImageToImage(Function imageToOs) { + this.imageToOs = imageToOs; + } + + public Image apply(org.jclouds.slicehost.domain.Image from) { + ImageBuilder builder = new ImageBuilder(); + builder.ids(from.getId() + ""); + builder.name(from.getName()); + builder.description(from.getName()); + builder.operatingSystem(imageToOs.apply(from)); + builder.defaultCredentials(new Credentials("root", null)); + Image image = builder.build(); + return image; + } +} \ No newline at end of file diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SlicehostImageToOperatingSystem.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SlicehostImageToOperatingSystem.java new file mode 100644 index 0000000000..54c76bbe34 --- /dev/null +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SlicehostImageToOperatingSystem.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.slicehost.compute.functions; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.annotation.Resource; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class SlicehostImageToOperatingSystem implements + Function { + public static final Pattern SLICEHOST_PATTERN = Pattern.compile("(([^ ]*) .*)"); + + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + public OperatingSystem apply(final org.jclouds.slicehost.domain.Image from) { + OsFamily osFamily = null; + String osName = null; + String osArch = null; + String osVersion = null; + String osDescription = from.getName(); + boolean is64Bit = true; + Matcher matcher = SLICEHOST_PATTERN.matcher(from.getName()); + if (from.getName().indexOf("Red Hat EL") != -1) { + osFamily = OsFamily.RHEL; + } else if (from.getName().indexOf("Oracle EL") != -1) { + osFamily = OsFamily.OEL; + } else if (matcher.find()) { + try { + osFamily = OsFamily.fromValue(matcher.group(2).toLowerCase()); + } catch (IllegalArgumentException e) { + logger.debug("<< didn't match os(%s)", matcher.group(2)); + } + } + OperatingSystem os = new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit); + return os; + } +} \ No newline at end of file diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java index fded60d0e7..ac14176dab 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java @@ -21,21 +21,19 @@ package org.jclouds.slicehost.compute.strategy; import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Map; + import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.domain.Credentials; import org.jclouds.slicehost.SlicehostClient; import org.jclouds.slicehost.domain.Slice; -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; +import com.google.common.base.Function; /** * @@ -43,35 +41,23 @@ import com.google.common.collect.Iterables; */ @Singleton public class SlicehostAddNodeWithTagStrategy implements AddNodeWithTagStrategy { - private final SlicehostClient client; + protected final SlicehostClient client; + protected final Map credentialStore; + protected final Function sliceToNodeMetadata; @Inject - protected SlicehostAddNodeWithTagStrategy(SlicehostClient client) { + protected SlicehostAddNodeWithTagStrategy(SlicehostClient client, Map credentialStore, + Function sliceToNodeMetadata) { this.client = checkNotNull(client, "client"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.sliceToNodeMetadata = checkNotNull(sliceToNodeMetadata, "sliceToNodeMetadata"); } @Override public NodeMetadata execute(String tag, String name, Template template) { - Slice slice = client.createSlice(name, Integer.parseInt(template.getImage().getProviderId()), Integer - .parseInt(template.getHardware().getProviderId())); - return new NodeMetadataImpl(slice.getId() + "", name, slice.getId() + "", template.getLocation(), null, - ImmutableMap. of(), tag, template.getHardware(), template.getImage().getId(), template - .getImage().getOperatingSystem(), NodeState.PENDING, Iterables.filter(slice.getAddresses(), - new Predicate() { - - @Override - public boolean apply(String input) { - return !input.startsWith("10."); - } - - }), Iterables.filter(slice.getAddresses(), new Predicate() { - - @Override - public boolean apply(String input) { - return input.startsWith("10."); - } - - }), new Credentials("root", slice.getRootPassword())); + Slice from = client.createSlice(name, Integer.parseInt(template.getImage().getProviderId()), + Integer.parseInt(template.getHardware().getProviderId())); + credentialStore.put(from.getId() + "", new Credentials("root", from.getRootPassword())); + return sliceToNodeMetadata.apply(from); } - } \ No newline at end of file diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostHardwareSupplier.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostHardwareSupplier.java index 95ee7034b7..a41e5f175c 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostHardwareSupplier.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostHardwareSupplier.java @@ -27,19 +27,14 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.internal.HardwareImpl; -import org.jclouds.compute.domain.internal.VolumeImpl; -import org.jclouds.compute.predicates.ImagePredicates; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.slicehost.SlicehostClient; import org.jclouds.slicehost.domain.Flavor; +import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; /** @@ -53,25 +48,20 @@ public class SlicehostHardwareSupplier implements Supplier location; + private final Function flavorToHardware; @Inject - SlicehostHardwareSupplier(SlicehostClient sync, Supplier location) { + SlicehostHardwareSupplier(SlicehostClient sync, Function flavorToHardware) { this.sync = sync; - this.location = location; + this.flavorToHardware = flavorToHardware; } @Override public Set get() { - final Set sizes = Sets.newHashSet(); - logger.debug(">> providing sizes"); - for (final Flavor from : sync.listFlavors()) { - sizes.add(new HardwareImpl(from.getId() + "", from.getName(), from.getId() + "", location.get(), null, - ImmutableMap. of(), ImmutableList.of(new Processor(from.getRam() / 1024.0, 1.0)), - from.getRam(), ImmutableList.of(new VolumeImpl((from.getRam() * 4) / 1024.0f, true, true)), - ImagePredicates.any())); - } - logger.debug("<< sizes(%d)", sizes.size()); - return sizes; + final Set hardware; + logger.debug(">> providing hardware"); + hardware = Sets.newLinkedHashSet(Iterables.transform(sync.listFlavors(), flavorToHardware)); + logger.debug("<< hardware(%d)", hardware.size()); + return hardware; } } \ No newline at end of file diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostImageSupplier.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostImageSupplier.java index 21c168439d..02ed757134 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostImageSupplier.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostImageSupplier.java @@ -20,8 +20,6 @@ package org.jclouds.slicehost.compute.suppliers; import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.annotation.Resource; import javax.inject.Inject; @@ -29,17 +27,13 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.internal.ImageImpl; import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.domain.Credentials; -import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.slicehost.SlicehostClient; +import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; /** @@ -48,52 +42,28 @@ import com.google.common.collect.Sets; */ @Singleton public class SlicehostImageSupplier implements Supplier> { - public static final Pattern SLICEHOST_PATTERN = Pattern.compile("(([^ ]*) .*)"); @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; - private final SlicehostClient sync; - private final Supplier location; + + protected final SlicehostClient sync; + protected final Function slicehostImageToImage; @Inject - SlicehostImageSupplier(SlicehostClient sync, Supplier location) { + SlicehostImageSupplier(SlicehostClient sync, + Function slicehostImageToImage) { this.sync = sync; - this.location = location; + this.slicehostImageToImage = slicehostImageToImage; } @Override public Set get() { - final Set images = Sets.newHashSet(); + Set images; logger.debug(">> providing images"); - for (final org.jclouds.slicehost.domain.Image from : sync.listImages()) { - String version = null; - Matcher matcher = SLICEHOST_PATTERN.matcher(from.getName()); - - OsFamily osFamily = null; - String osName = null; - String osArch = null; - String osVersion = null; - String osDescription = from.getName(); - boolean is64Bit = true; - - if (from.getName().indexOf("Red Hat EL") != -1) { - osFamily = OsFamily.RHEL; - } else if (from.getName().indexOf("Oracle EL") != -1) { - osFamily = OsFamily.OEL; - } else if (matcher.find()) { - try { - osFamily = OsFamily.fromValue(matcher.group(2).toLowerCase()); - } catch (IllegalArgumentException e) { - logger.debug("<< didn't match os(%s)", matcher.group(2)); - } - } - OperatingSystem os = new OperatingSystem(osFamily, osName, osVersion, osArch, osDescription, is64Bit); - - images.add(new ImageImpl(from.getId() + "", from.getName(), from.getId() + "", location.get(), null, - ImmutableMap. of(), os, from.getName(), version, new Credentials("root", null))); - } + images = Sets.newLinkedHashSet(Iterables.transform(sync.listImages(), slicehostImageToImage)); logger.debug("<< images(%d)", images.size()); return images; } + } \ No newline at end of file diff --git a/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/FlavorToHardwareTest.java b/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/FlavorToHardwareTest.java new file mode 100644 index 0000000000..0b4e9a9079 --- /dev/null +++ b/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/FlavorToHardwareTest.java @@ -0,0 +1,68 @@ +/** + * + * 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.slicehost.compute.functions; + +import static org.testng.Assert.assertEquals; + +import java.net.UnknownHostException; + +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.LocationScope; +import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.slicehost.domain.Flavor; +import org.jclouds.slicehost.xml.FlavorHandlerTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "cloudservers.FlavorToHardwareTest") +public class FlavorToHardwareTest { + Location provider = new LocationImpl(LocationScope.ZONE, "dallas", "description", null); + + @Test + public void test() throws UnknownHostException { + assertEquals( + convertFlavor(), + new HardwareBuilder() + .ids("1") + .name("256 slice") + .processors(ImmutableList.of(new Processor(0.25, 1.0))) + .ram(256) + .volumes( + ImmutableList.of(new VolumeBuilder().type(Volume.Type.LOCAL).size(1.0f).durable(true) + .bootDevice(true).build())).build()); + } + + public static Hardware convertFlavor() { + Flavor flavor = FlavorHandlerTest.parseFlavor(); + + FlavorToHardware parser = new FlavorToHardware(); + + return parser.apply(flavor); + } +} diff --git a/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java b/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java new file mode 100644 index 0000000000..fe0bafd649 --- /dev/null +++ b/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java @@ -0,0 +1,164 @@ +/** + * + * 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.slicehost.compute.functions; + +import static org.testng.Assert.assertEquals; + +import java.net.UnknownHostException; +import java.util.Map; +import java.util.Set; + +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +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.compute.domain.Processor; +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.LocationScope; +import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.slicehost.compute.config.SlicehostComputeServiceContextModule; +import org.jclouds.slicehost.domain.Slice; +import org.jclouds.slicehost.xml.SliceHandlerTest; +import org.testng.annotations.Test; + +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "slicehost.SliceToNodeMetadataTest") +public class SliceToNodeMetadataTest { + Location provider = new LocationImpl(LocationScope.ZONE, "dallas", "description", null); + + @Test + public void testApplyWhereImageAndHardwareNotFoundButCredentialsFound() throws UnknownHostException { + Credentials creds = new Credentials("root", "abdce"); + Map sliceStateToNodeState = SlicehostComputeServiceContextModule.sliceStatusToNodeState; + Set images = ImmutableSet.of(); + Set hardwares = ImmutableSet.of(); + Slice slice = SliceHandlerTest.parseSlice(); + + SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, + ImmutableMap. of("1", creds), Suppliers.> ofInstance(images), + Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + + 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").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()); + } + + @Test + public void testApplyWhereImageAndHardwareNotFound() throws UnknownHostException { + Map sliceStateToNodeState = SlicehostComputeServiceContextModule.sliceStatusToNodeState; + Set images = ImmutableSet.of(); + Set hardwares = ImmutableSet.of(); + Slice slice = SliceHandlerTest.parseSlice(); + + SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, + ImmutableMap. of(), Suppliers.> ofInstance(images), + Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + + 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").imageId("2").id("1") + .providerId("1").name("jclouds-foo").location(provider) + .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + } + + @Test + public void testApplyWhereImageFoundAndHardwareNotFound() throws UnknownHostException { + Map sliceStateToNodeState = SlicehostComputeServiceContextModule.sliceStatusToNodeState; + org.jclouds.compute.domain.Image jcImage = SlicehostImageToImageTest.convertImage(); + Set images = ImmutableSet.of(jcImage); + Set hardwares = ImmutableSet.of(); + Slice slice = SliceHandlerTest.parseSlice(); + + SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, + ImmutableMap. of(), Suppliers.> ofInstance(images), + Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + + 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") + .imageId("2") + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").is64Bit(true) + .build()).id("1").providerId("1").name("jclouds-foo").location(provider) + .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + } + + @Test + public void testApplyWhereImageAndHardwareFound() throws UnknownHostException { + Map sliceStateToNodeState = SlicehostComputeServiceContextModule.sliceStatusToNodeState; + Set images = ImmutableSet.of(SlicehostImageToImageTest.convertImage()); + Set hardwares = ImmutableSet.of(FlavorToHardwareTest.convertFlavor()); + Slice slice = SliceHandlerTest.parseSlice(); + + SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, + ImmutableMap. of(), Suppliers.> ofInstance(images), + Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + + 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") + .imageId("2") + .hardware( + new HardwareBuilder() + .ids("1") + .name("256 slice") + .processors(ImmutableList.of(new Processor(0.25, 1.0))) + .ram(256) + .volumes( + ImmutableList.of(new VolumeBuilder().type(Volume.Type.LOCAL).size(1.0f) + .durable(true).bootDevice(true).build())).build()) + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").is64Bit(true) + .build()).id("1").providerId("1").name("jclouds-foo").location(provider) + .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + } +} \ No newline at end of file diff --git a/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SlicehostImageToImageTest.java b/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SlicehostImageToImageTest.java new file mode 100644 index 0000000000..f8c937949b --- /dev/null +++ b/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SlicehostImageToImageTest.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.slicehost.compute.functions; + +import static org.testng.Assert.assertEquals; + +import java.net.UnknownHostException; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +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.LocationScope; +import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.slicehost.xml.ImageHandlerTest; +import org.testng.annotations.Test; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "slicehost.SlicehostImageToImageTest") +public class SlicehostImageToImageTest { + Location provider = new LocationImpl(LocationScope.ZONE, "dallas", "description", null); + + @Test + public void testApplyWhereImageNotFound() throws UnknownHostException { + assertEquals( + convertImage(), + new ImageBuilder() + .name("CentOS 5.2") + .operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").is64Bit(true) + .build()).description("CentOS 5.2").defaultCredentials(new Credentials("root", null)) + .ids("2").build()); + } + + public static Image convertImage() { + org.jclouds.slicehost.domain.Image image = ImageHandlerTest.parseImage(); + + SlicehostImageToImage parser = new SlicehostImageToImage(new SlicehostImageToOperatingSystem()); + + return parser.apply(image); + } +} diff --git a/slicehost/src/test/java/org/jclouds/slicehost/xml/FlavorHandlerTest.java b/slicehost/src/test/java/org/jclouds/slicehost/xml/FlavorHandlerTest.java index 235aef01b8..4ad6d83065 100644 --- a/slicehost/src/test/java/org/jclouds/slicehost/xml/FlavorHandlerTest.java +++ b/slicehost/src/test/java/org/jclouds/slicehost/xml/FlavorHandlerTest.java @@ -23,29 +23,38 @@ import static org.testng.Assert.assertEquals; import java.io.InputStream; -import org.jclouds.http.functions.BaseHandlerTest; import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.config.SaxParserModule; import org.jclouds.slicehost.domain.Flavor; import org.testng.annotations.Test; +import com.google.inject.Guice; +import com.google.inject.Injector; + /** * Tests behavior of {@code FlavorHandler} * * @author Adrian Cole */ @Test(groups = "unit", testName = "slicehost.FlavorHandler") -public class FlavorHandlerTest extends BaseHandlerTest { +public class FlavorHandlerTest { - ParseSax createParser() { - ParseSax parser = (ParseSax) factory.create(injector.getInstance(FlavorHandler.class)); + static ParseSax createParser() { + Injector injector = Guice.createInjector(new SaxParserModule()); + ParseSax parser = (ParseSax) injector.getInstance(ParseSax.Factory.class).create( + injector.getInstance(FlavorHandler.class)); return parser; } + public static Flavor parseFlavor() { + InputStream is = FlavorHandlerTest.class.getResourceAsStream("/test_get_flavor.xml"); + return createParser().parse(is); + } + public void test() { - InputStream is = getClass().getResourceAsStream("/test_get_flavor.xml"); Flavor expects = new Flavor(1, "256 slice", 2000, 256); - assertEquals(createParser().parse(is), expects); + assertEquals(parseFlavor(), expects); } } diff --git a/slicehost/src/test/java/org/jclouds/slicehost/xml/ImageHandlerTest.java b/slicehost/src/test/java/org/jclouds/slicehost/xml/ImageHandlerTest.java new file mode 100644 index 0000000000..b7f2cd906b --- /dev/null +++ b/slicehost/src/test/java/org/jclouds/slicehost/xml/ImageHandlerTest.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.slicehost.xml; + +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; + +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.slicehost.domain.Image; +import org.testng.annotations.Test; + +import com.google.inject.Guice; +import com.google.inject.Injector; + +/** + * Tests behavior of {@code ImageHandler} + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "slicehost.ImageHandler") +public class ImageHandlerTest { + + static ParseSax createParser() { + Injector injector = Guice.createInjector(new SaxParserModule()); + ParseSax parser = (ParseSax) injector.getInstance(ParseSax.Factory.class).create( + injector.getInstance(ImageHandler.class)); + return parser; + } + + public static Image parseImage() { + InputStream is = ImageHandlerTest.class.getResourceAsStream("/test_get_image.xml"); + return createParser().parse(is); + } + + public void test() { + Image expects = new Image(2, "CentOS 5.2"); + assertEquals(parseImage(), expects); + } + +} diff --git a/slicehost/src/test/java/org/jclouds/slicehost/xml/ImagesHandlerTest.java b/slicehost/src/test/java/org/jclouds/slicehost/xml/ImagesHandlerTest.java new file mode 100644 index 0000000000..cbf83686c7 --- /dev/null +++ b/slicehost/src/test/java/org/jclouds/slicehost/xml/ImagesHandlerTest.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.slicehost.xml; + +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; +import java.util.Set; + +import org.jclouds.http.functions.BaseHandlerTest; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.slicehost.domain.Image; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; + +/** + * Tests behavior of {@code ImagesHandler} + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "slicehost.ImagesHandler") +public class ImagesHandlerTest extends BaseHandlerTest { + + ParseSax> createParser() { + ParseSax> parser = (ParseSax>) factory.create(injector + .getInstance(ImagesHandler.class)); + return parser; + } + + public void test() { + InputStream is = getClass().getResourceAsStream("/test_list_images.xml"); + Set expects = ImmutableSet.of(new Image(2, "CentOS 5.2"), new Image(3, "Gentoo 2008.0"), + + new Image(4, "Debian 5.0 (lenny)"), + + new Image(5, "Fedora 10 (Cambridge)"), + + new Image(7, "CentOS 5.3"), + + new Image(8, "Ubuntu 9.04 (jaunty)"), + + new Image(9, "Arch 2009.02"), + + new Image(10, "Ubuntu 8.04.2 LTS (hardy)"), + + new Image(11, "Ubuntu 8.10 (intrepid)"), + + new Image(12, "Red Hat EL 5.3"), + + new Image(13, "Fedora 11 (Leonidas)") + + ); + assertEquals(createParser().parse(is), expects); + } +} diff --git a/slicehost/src/test/java/org/jclouds/slicehost/xml/SliceHandlerTest.java b/slicehost/src/test/java/org/jclouds/slicehost/xml/SliceHandlerTest.java index 7a99cbba93..4a3c670832 100644 --- a/slicehost/src/test/java/org/jclouds/slicehost/xml/SliceHandlerTest.java +++ b/slicehost/src/test/java/org/jclouds/slicehost/xml/SliceHandlerTest.java @@ -25,10 +25,13 @@ import java.io.InputStream; import org.jclouds.http.functions.BaseHandlerTest; import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.config.SaxParserModule; import org.jclouds.slicehost.domain.Slice; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; +import com.google.inject.Guice; +import com.google.inject.Injector; /** * Tests behavior of {@code SliceHandler} @@ -38,26 +41,35 @@ import com.google.common.collect.ImmutableSet; @Test(groups = "unit", testName = "slicehost.SliceHandler") public class SliceHandlerTest extends BaseHandlerTest { - ParseSax createParser() { - ParseSax parser = (ParseSax) factory.create(injector.getInstance(SliceHandler.class)); + static ParseSax createParser() { + Injector injector = Guice.createInjector(new SaxParserModule()); + ParseSax parser = (ParseSax) injector.getInstance(ParseSax.Factory.class).create( + injector.getInstance(SliceHandler.class)); return parser; } + public static Slice parseSlice() { + return parseSlice("/test_get_slice.xml"); + } + + public static Slice parseSlice(String resource) { + InputStream is = SliceHandlerTest.class.getResourceAsStream(resource); + return createParser().parse(is); + } + public void test() { - InputStream is = getClass().getResourceAsStream("/test_get_slice.xml"); - Slice expects = new Slice(1, "jclouds-foo", 1, 10, null, Slice.Status.BUILD, 0, 0, 0, ImmutableSet. of( + Slice expects = new Slice(1, "jclouds-foo", 1, 2, null, Slice.Status.BUILD, 0, 0, 0, ImmutableSet. of( "174.143.212.229", "10.176.164.199"), null); - assertEquals(createParser().parse(is), expects); + assertEquals(parseSlice("/test_get_slice.xml"), expects); } public void testNew() { - InputStream is = getClass().getResourceAsStream("/test_new_slice.xml"); Slice expects = new Slice(71907, "slicetest", 1, 11, null, Slice.Status.BUILD, 0, 0, 0, ImmutableSet. of( "10.176.168.15", "67.23.20.114"), "fooadfa1231"); - assertEquals(createParser().parse(is), expects); - + assertEquals(parseSlice("/test_new_slice.xml"), expects); + } - + } diff --git a/slicehost/src/test/java/org/jclouds/slicehost/xml/SlicesHandlerTest.java b/slicehost/src/test/java/org/jclouds/slicehost/xml/SlicesHandlerTest.java index 7530a1d0d1..ae50e86f1f 100644 --- a/slicehost/src/test/java/org/jclouds/slicehost/xml/SlicesHandlerTest.java +++ b/slicehost/src/test/java/org/jclouds/slicehost/xml/SlicesHandlerTest.java @@ -47,7 +47,7 @@ public class SlicesHandlerTest extends BaseHandlerTest { public void test() { InputStream is = getClass().getResourceAsStream("/test_get_slice.xml"); - Set expects = ImmutableSet.of(new Slice(1, "jclouds-foo", 1, 10, null, Slice.Status.BUILD, 0, 0, + Set expects = ImmutableSet.of(new Slice(1, "jclouds-foo", 1, 2, null, Slice.Status.BUILD, 0, 0, 0, ImmutableSet. of("174.143.212.229", "10.176.164.199"), null)); assertEquals(createParser().parse(is), expects); diff --git a/slicehost/src/test/resources/test_get_image.xml b/slicehost/src/test/resources/test_get_image.xml new file mode 100644 index 0000000000..144e73e43b --- /dev/null +++ b/slicehost/src/test/resources/test_get_image.xml @@ -0,0 +1,7 @@ + + + + CentOS 5.2 + 2 + + diff --git a/slicehost/src/test/resources/test_get_slice.xml b/slicehost/src/test/resources/test_get_slice.xml index dbe8d32fd1..a4b373fe2c 100644 --- a/slicehost/src/test/resources/test_get_slice.xml +++ b/slicehost/src/test/resources/test_get_slice.xml @@ -1,7 +1,7 @@ jclouds-foo - 10 + 2

174.143.212.229
10.176.164.199
diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java index e58d4da07a..db2f5b23ff 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java @@ -20,11 +20,11 @@ package org.jclouds.vcloud.compute; import java.net.URI; -import java.util.Map; import javax.annotation.Nullable; import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; +import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import com.google.inject.ImplementedBy; @@ -63,7 +63,7 @@ public interface VCloudExpressComputeClient extends CommonVCloudComputeClient { * login password * */ - Map start(@Nullable URI VDC, URI templateId, String name, InstantiateVAppTemplateOptions options, + VCloudExpressVApp start(@Nullable URI VDC, URI templateId, String name, InstantiateVAppTemplateOptions options, int... portsToOpen); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java index c2d660073e..a8c4805a93 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java @@ -22,8 +22,9 @@ package org.jclouds.vcloud.compute.config; import java.util.Set; import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.domain.Image; 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.internal.ComputeServiceContextImpl; import org.jclouds.compute.options.TemplateOptions; @@ -36,8 +37,10 @@ import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.functions.ImagesInOrg; +import org.jclouds.vcloud.compute.functions.HardwareForVApp; import org.jclouds.vcloud.compute.functions.HardwareInOrg; +import org.jclouds.vcloud.compute.functions.ImagesInOrg; +import org.jclouds.vcloud.compute.functions.VAppToNodeMetadata; import org.jclouds.vcloud.compute.internal.VCloudTemplateBuilderImpl; import org.jclouds.vcloud.compute.options.VCloudTemplateOptions; import org.jclouds.vcloud.compute.strategy.GetLoginCredentialsFromGuestConfiguration; @@ -48,6 +51,7 @@ import org.jclouds.vcloud.compute.strategy.VCloudListNodesStrategy; import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; import org.jclouds.vcloud.compute.suppliers.VCloudHardwareSupplier; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.VApp; import com.google.common.base.Function; import com.google.common.base.Supplier; @@ -66,9 +70,14 @@ public class VCloudComputeServiceContextModule extends CommonVCloudComputeServic @Override protected void configure() { super.configure(); + bind(new TypeLiteral>() { + }).to(VAppToNodeMetadata.class); bind(TemplateOptions.class).to(VCloudTemplateOptions.class); bind(TemplateBuilder.class).to(VCloudTemplateBuilderImpl.class); bind(RebootNodeStrategy.class).to(VCloudRebootNodeStrategy.class); + bind(new TypeLiteral>() { + }).to(new TypeLiteral() { + }); bind(GetNodeMetadataStrategy.class).to(VCloudGetNodeMetadataStrategy.class); bind(new TypeLiteral() { }).to(new TypeLiteral>() { diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java index 832b02e6c4..e02b1a1a14 100755 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java @@ -23,6 +23,7 @@ import javax.inject.Singleton; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.compute.strategy.DestroyNodeStrategy; @@ -35,6 +36,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.VCloudExpressVAppToNodeMetadata; import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; import org.jclouds.vcloud.compute.strategy.VCloudExpressAddNodeWithTagStrategy; import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; @@ -42,6 +44,7 @@ import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.VCloudExpressVApp; import com.google.common.base.Function; import com.google.inject.Provides; @@ -61,6 +64,8 @@ public class VCloudExpressComputeServiceContextModule extends CommonVCloudComput super.configure(); bind(RebootNodeStrategy.class).to(VCloudExpressRebootNodeStrategy.class); bind(GetNodeMetadataStrategy.class).to(VCloudExpressGetNodeMetadataStrategy.class); + bind(new TypeLiteral>() { + }).to(VCloudExpressVAppToNodeMetadata.class); bind(new TypeLiteral() { }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudExpressImage.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudExpressImage.java deleted file mode 100644 index 8a835ef620..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudExpressImage.java +++ /dev/null @@ -1,55 +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.vcloud.compute.domain; - -import java.net.URI; -import java.util.Map; - -import javax.annotation.Nullable; - -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.internal.ImageImpl; -import org.jclouds.domain.Credentials; -import org.jclouds.domain.Location; -import org.jclouds.vcloud.domain.VCloudExpressVAppTemplate; - -/** - * @author Adrian Cole - */ -public class VCloudExpressImage extends ImageImpl { - - /** The serialVersionUID */ - private static final long serialVersionUID = -8520373150950058296L; - - private final VCloudExpressVAppTemplate template; - - public VCloudExpressImage(VCloudExpressVAppTemplate template, String providerId, String name, String id, Location location, URI uri, - Map userMetadata, OperatingSystem operatingSystem, String description, - @Nullable String version, @Nullable Credentials defaultCredentials) { - super(providerId, name, id, location, uri, userMetadata, operatingSystem, description, version, - defaultCredentials); - this.template = template; - } - - public VCloudExpressVAppTemplate getVAppTemplate() { - return template; - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudImage.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudImage.java deleted file mode 100644 index 660c57735f..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudImage.java +++ /dev/null @@ -1,55 +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.vcloud.compute.domain; - -import java.net.URI; -import java.util.Map; - -import javax.annotation.Nullable; - -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.internal.ImageImpl; -import org.jclouds.domain.Credentials; -import org.jclouds.domain.Location; -import org.jclouds.vcloud.domain.VAppTemplate; - -/** - * @author Adrian Cole - */ -public class VCloudImage extends ImageImpl { - - /** The serialVersionUID */ - private static final long serialVersionUID = -8520373150950058296L; - - private final VAppTemplate template; - - public VCloudImage(VAppTemplate template, String providerId, String name, String id, Location location, URI uri, - Map userMetadata, OperatingSystem operatingSystem, String description, - @Nullable String version, @Nullable Credentials defaultCredentials) { - super(providerId, name, id, location, uri, userMetadata, operatingSystem, description, version, - defaultCredentials); - this.template = template; - } - - public VAppTemplate getVAppTemplate() { - return template; - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVApp.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVApp.java index b283372273..cb1a134e34 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVApp.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVApp.java @@ -31,9 +31,9 @@ import javax.annotation.Resource; import javax.inject.Inject; 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.internal.HardwareImpl; import org.jclouds.compute.predicates.ImagePredicates; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; @@ -44,7 +44,6 @@ import org.jclouds.vcloud.domain.ovf.ResourceType; import org.jclouds.vcloud.domain.ovf.VirtualHardwareSection; import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -61,7 +60,7 @@ public class HardwareForVApp implements Function { @Inject protected HardwareForVApp(FindLocationForResource findLocationForResource, - ResourceAllocationsToVolumes resourceAllocationsToVolumes) { + ResourceAllocationsToVolumes resourceAllocationsToVolumes) { this.findLocationForResource = checkNotNull(findLocationForResource, "findLocationForResource"); this.resourceAllocationsToVolumes = checkNotNull(resourceAllocationsToVolumes, "resourceAllocationsToVolumes"); } @@ -79,18 +78,19 @@ public class HardwareForVApp implements Function { int ram = (int) find(hardware.getResourceAllocations(), resourceType(ResourceType.MEMORY)).getVirtualQuantity(); - List processors = Lists.newArrayList(transform(filter(hardware.getResourceAllocations(), - resourceType(ResourceType.PROCESSOR)), new Function() { + List processors = Lists.newArrayList(transform( + filter(hardware.getResourceAllocations(), resourceType(ResourceType.PROCESSOR)), + new Function() { - @Override - public Processor apply(ResourceAllocation arg0) { - return new Processor(arg0.getVirtualQuantity(), 1); - } + @Override + public Processor apply(ResourceAllocation arg0) { + return new Processor(arg0.getVirtualQuantity(), 1); + } - })); - Iterable volumes = resourceAllocationsToVolumes.apply(hardware.getResourceAllocations()); - return new HardwareImpl(from.getHref().toASCIIString(), from.getName(), from.getHref().toASCIIString(), location, - null, ImmutableMap. of(), processors, ram, volumes, ImagePredicates.idEquals(from - .getHref().toASCIIString())); + })); + List volumes = Lists.newArrayList(resourceAllocationsToVolumes.apply(hardware.getResourceAllocations())); + return new HardwareBuilder().ids(from.getHref().toASCIIString()).uri(from.getHref()).name(from.getName()) + .location(location).processors(processors).ram(ram).volumes(volumes) + .supportsImage(ImagePredicates.idEquals(from.getHref().toASCIIString())).build(); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVAppTemplate.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVAppTemplate.java index 86142b570e..973a7d3269 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVAppTemplate.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVAppTemplate.java @@ -31,9 +31,9 @@ import javax.annotation.Resource; import javax.inject.Inject; 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.internal.HardwareImpl; import org.jclouds.compute.predicates.ImagePredicates; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; @@ -46,7 +46,6 @@ import org.jclouds.vcloud.domain.ovf.ResourceType; import org.jclouds.vcloud.domain.ovf.VirtualHardwareSection; import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -66,7 +65,7 @@ public class HardwareForVAppTemplate implements Function @Inject protected HardwareForVAppTemplate(VCloudClient client, FindLocationForResource findLocationForResource, - ResourceAllocationsToVolumes resourceAllocationsToVolumes) { + ResourceAllocationsToVolumes resourceAllocationsToVolumes) { this.client = checkNotNull(client, "client"); this.findLocationForResource = checkNotNull(findLocationForResource, "findLocationForResource"); this.resourceAllocationsToVolumes = checkNotNull(resourceAllocationsToVolumes, "resourceAllocationsToVolumes"); @@ -104,19 +103,20 @@ public class HardwareForVAppTemplate implements Function int ram = (int) find(hardware.getResourceAllocations(), resourceType(ResourceType.MEMORY)).getVirtualQuantity(); - List processors = Lists.newArrayList(transform(filter(hardware.getResourceAllocations(), - resourceType(ResourceType.PROCESSOR)), new Function() { + List processors = Lists.newArrayList(transform( + filter(hardware.getResourceAllocations(), resourceType(ResourceType.PROCESSOR)), + new Function() { - @Override - public Processor apply(ResourceAllocation arg0) { - return new Processor(arg0.getVirtualQuantity(), 1); - } + @Override + public Processor apply(ResourceAllocation arg0) { + return new Processor(arg0.getVirtualQuantity(), 1); + } - })); - Iterable volumes = resourceAllocationsToVolumes.apply(hardware.getResourceAllocations()); - return new HardwareImpl(from.getHref().toASCIIString(), from.getName(), from.getHref().toASCIIString(), location, - null, ImmutableMap. of(), processors, ram, volumes, ImagePredicates.idEquals(from - .getHref().toASCIIString())); + })); + List volumes = Lists.newArrayList(resourceAllocationsToVolumes.apply(hardware.getResourceAllocations())); + return new HardwareBuilder().ids(from.getHref().toASCIIString()).uri(from.getHref()).name(from.getName()) + .location(location).processors(processors).ram(ram).volumes(volumes) + .supportsImage(ImagePredicates.idEquals(from.getHref().toASCIIString())).build(); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVCloudExpressVApp.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVCloudExpressVApp.java index 6872ff1520..3e973ccc8e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVCloudExpressVApp.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVCloudExpressVApp.java @@ -32,9 +32,9 @@ import javax.annotation.Resource; import javax.inject.Inject; 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.internal.HardwareImpl; import org.jclouds.compute.predicates.ImagePredicates; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; @@ -43,7 +43,6 @@ import org.jclouds.vcloud.domain.ovf.ResourceAllocation; import org.jclouds.vcloud.domain.ovf.ResourceType; import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; /** @@ -59,7 +58,7 @@ public class HardwareForVCloudExpressVApp implements Function processors = Lists.newArrayList(transform(filter(from.getResourceAllocations(), - resourceType(ResourceType.PROCESSOR)), new Function() { + List processors = Lists.newArrayList(transform( + filter(from.getResourceAllocations(), resourceType(ResourceType.PROCESSOR)), + new Function() { - @Override - public Processor apply(ResourceAllocation arg0) { - return new Processor(arg0.getVirtualQuantity(), 1); - } + @Override + public Processor apply(ResourceAllocation arg0) { + return new Processor(arg0.getVirtualQuantity(), 1); + } - })); - Iterable volumes = resourceAllocationsToVolumes.apply(from.getResourceAllocations()); - return new HardwareImpl(from.getHref().toASCIIString(), from.getName(), from.getHref().toASCIIString(), - location, null, ImmutableMap. of(), processors, ram, volumes, ImagePredicates - .idEquals(from.getHref().toASCIIString())); + })); + List volumes = Lists.newArrayList(resourceAllocationsToVolumes.apply(from.getResourceAllocations())); + return new HardwareBuilder().ids(from.getHref().toASCIIString()).name(from.getName()).location(location) + .processors(processors).ram(ram).volumes(volumes) + .supportsImage(ImagePredicates.idEquals(from.getHref().toASCIIString())).build(); } catch (NoSuchElementException e) { logger.debug("incomplete data to form vApp %s", from.getHref()); return null; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVAppTemplate.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVAppTemplate.java index ac8791a926..277b0a12f2 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVAppTemplate.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVAppTemplate.java @@ -25,17 +25,14 @@ import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.toComputeOs; import javax.inject.Inject; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; -import org.jclouds.domain.Location; import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.domain.VCloudImage; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.ovf.OvfEnvelope; import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; /** * @author Adrian Cole @@ -48,7 +45,7 @@ public class ImageForVAppTemplate implements Function { @Inject protected ImageForVAppTemplate(VCloudClient client, FindLocationForResource findLocationForResource, - PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider) { + PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider) { this.client = checkNotNull(client, "client"); this.findLocationForResource = checkNotNull(findLocationForResource, "findLocationForResource"); this.credentialsProvider = checkNotNull(credentialsProvider, "credentialsProvider"); @@ -61,18 +58,16 @@ public class ImageForVAppTemplate implements Function { @Override public Image apply(VAppTemplate from) { - + ImageBuilder builder = new ImageBuilder(); + builder.ids(from.getHref().toASCIIString()); + builder.uri(from.getHref()); + builder.name(from.getName()); + builder.location(findLocationForResource.apply(checkNotNull(parent, "parent"))); + builder.description(from.getDescription() != null ? from.getDescription() : from.getName()); OvfEnvelope ovf = client.getOvfEnvelopeForVAppTemplate(from.getHref()); - OperatingSystem os = toComputeOs(ovf); - - Location location = findLocationForResource.apply(checkNotNull(parent, "parent")); - String name = getName(from.getName()); - String desc = from.getDescription() != null ? from.getDescription() : from.getName(); - return new VCloudImage(from, from.getHref().toASCIIString(), name, from.getHref().toASCIIString(), location, from - .getHref(), ImmutableMap. of(), os, desc, "", credentialsProvider.execute(from)); + builder.operatingSystem(toComputeOs(ovf)); + builder.defaultCredentials(credentialsProvider.execute(from)); + return builder.build(); } - protected String getName(String name) { - return name; - } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVCloudExpressVAppTemplate.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVCloudExpressVAppTemplate.java index 5b46b5a49d..3cb068aeb6 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVCloudExpressVAppTemplate.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVCloudExpressVAppTemplate.java @@ -25,16 +25,14 @@ import static org.jclouds.compute.util.ComputeServiceUtils.parseOsFamilyOrNull; 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.OsFamily; +import org.jclouds.compute.domain.OperatingSystemBuilder; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; -import org.jclouds.domain.Location; -import org.jclouds.vcloud.compute.domain.VCloudExpressImage; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.VCloudExpressVAppTemplate; import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; /** * @author Adrian Cole @@ -46,7 +44,7 @@ public class ImageForVCloudExpressVAppTemplate implements Function of(), os, desc, "", credentialsProvider - .execute(from)); + ImageBuilder builder = new ImageBuilder(); + builder.ids(from.getHref().toASCIIString()); + builder.uri(from.getHref()); + builder.name(from.getName()); + builder.location(findLocationForResource.apply(checkNotNull(parent, "parent"))); + builder.description(from.getDescription() != null ? from.getDescription() : from.getName()); + builder.operatingSystem(parseOs(from)); + builder.defaultCredentials(credentialsProvider.execute(from)); + return builder.build(); } - protected String getName(String name) { - return name; + protected OperatingSystem parseOs(VCloudExpressVAppTemplate from) { + OperatingSystemBuilder builder = new OperatingSystemBuilder(); + builder.family(parseOsFamilyOrNull("vcloudexpress", checkNotNull(from, "vapp template").getName())); + builder.description(from.getName()); + builder.is64Bit(from.getName().indexOf("64") != -1); + return builder.build(); } + } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ResourceAllocationsToVolumes.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ResourceAllocationsToVolumes.java index c05de3689c..3add051baa 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ResourceAllocationsToVolumes.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ResourceAllocationsToVolumes.java @@ -37,26 +37,25 @@ import com.google.common.base.Function; * @author Adrian Cole */ @Singleton -public class ResourceAllocationsToVolumes implements - Function, Iterable> { +public class ResourceAllocationsToVolumes implements Function, Iterable> { @Override - public Iterable apply(Iterable resourceAllocations) { + public Iterable apply(Iterable resourceAllocations) { Iterable volumes = transform(filter(resourceAllocations, resourceType(ResourceType.DISK_DRIVE)), - new Function() { + new Function() { - @Override - public Volume apply(ResourceAllocation from) { - if (from instanceof VCloudHardDisk) { - VCloudHardDisk vDisk = VCloudHardDisk.class.cast(from); - return new VolumeImpl(from.getAddressOnParent() + "", Volume.Type.LOCAL, - vDisk.getCapacity() / 1024f, null, from.getAddressOnParent() == 0, true); - } else { - return new VolumeImpl(from.getAddressOnParent() + "", Volume.Type.LOCAL, from - .getVirtualQuantity() / 1024 / 1024f, null, from.getAddressOnParent() == 0, true); - } + @Override + public Volume apply(ResourceAllocation from) { + if (from instanceof VCloudHardDisk) { + VCloudHardDisk vDisk = VCloudHardDisk.class.cast(from); + return new VolumeImpl(from.getAddressOnParent() + "", Volume.Type.LOCAL, + vDisk.getCapacity() / 1024f, null, from.getAddressOnParent() == 0, true); + } else { + return new VolumeImpl(from.getAddressOnParent() + "", Volume.Type.LOCAL, + from.getVirtualQuantity() / 1024 / 1024f, null, from.getAddressOnParent() == 0, true); } + } - }); + }); return volumes; } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java new file mode 100644 index 0000000000..8f2c846a06 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java @@ -0,0 +1,81 @@ +/** + * + * 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.compute.functions; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getCredentialsFrom; +import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getPrivateIpsFromVApp; +import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getPublicIpsFromVApp; +import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.toComputeOs; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.domain.Credentials; +import org.jclouds.vcloud.domain.Status; +import org.jclouds.vcloud.domain.VApp; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class VAppToNodeMetadata implements Function { + protected final FindLocationForResource findLocationForResourceInVDC; + protected final Function hardwareForVApp; + protected final Map vAppStatusToNodeState; + protected final Map credentialStore; + + @Inject + protected VAppToNodeMetadata(Map vAppStatusToNodeState, Map credentialStore, + FindLocationForResource findLocationForResourceInVDC, Function hardwareForVApp) { + this.hardwareForVApp = checkNotNull(hardwareForVApp, "hardwareForVApp"); + this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.vAppStatusToNodeState = checkNotNull(vAppStatusToNodeState, "vAppStatusToNodeState"); + } + + public NodeMetadata apply(VApp from) { + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + builder.ids(from.getHref().toASCIIString()); + builder.uri(from.getHref()); + builder.name(from.getName()); + builder.location(findLocationForResourceInVDC.apply(from.getVDC())); + builder.tag(parseTagFromName(from.getName())); + builder.operatingSystem(toComputeOs(from, null)); + builder.hardware(hardwareForVApp.apply(from)); + builder.state(vAppStatusToNodeState.get(from.getStatus())); + builder.publicAddresses(getPublicIpsFromVApp(from)); + builder.privateAddresses(getPrivateIpsFromVApp(from)); + builder.credentials(getCredentialsFrom(from)); + if (!credentialStore.containsKey(from.getHref().toASCIIString())) + credentialStore.put(from.getHref().toASCIIString(), getCredentialsFrom(from)); + builder.credentials(credentialStore.get(from.getHref().toASCIIString())); + return builder.build(); + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java new file mode 100644 index 0000000000..9a0dd8f77b --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java @@ -0,0 +1,87 @@ +/** + * + * 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.compute.functions; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; + +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.domain.os.CIMOperatingSystem; +import org.jclouds.domain.Credentials; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; +import org.jclouds.vcloud.domain.Status; +import org.jclouds.vcloud.domain.VCloudExpressVApp; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressVAppToNodeMetadata implements Function { + + protected final VCloudExpressComputeClient computeClient; + protected final Map credentialStore; + protected final Supplier> images; + protected final FindLocationForResource findLocationForResourceInVDC; + protected final HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp; + protected final Map vAppStatusToNodeState; + + @Inject + protected VCloudExpressVAppToNodeMetadata(VCloudExpressComputeClient computeClient, + Map credentialStore, Map vAppStatusToNodeState, + HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, + FindLocationForResource findLocationForResourceInVDC, Supplier> images) { + this.images = checkNotNull(images, "images"); + this.hardwareForVCloudExpressVApp = checkNotNull(hardwareForVCloudExpressVApp, "hardwareForVCloudExpressVApp"); + this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.computeClient = checkNotNull(computeClient, "computeClient"); + this.vAppStatusToNodeState = checkNotNull(vAppStatusToNodeState, "vAppStatusToNodeState"); + } + + @Override + public NodeMetadata apply(VCloudExpressVApp from) { + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + builder.ids(from.getHref().toASCIIString()); + builder.uri(from.getHref()); + builder.name(from.getName()); + builder.location(findLocationForResourceInVDC.apply(from.getVDC())); + builder.tag(parseTagFromName(from.getName())); + builder.operatingSystem(from.getOsType() != null ? new CIMOperatingSystem(CIMOperatingSystem.OSType + .fromValue(from.getOsType()), null, null, from.getOperatingSystemDescription()) : null); + builder.hardware(hardwareForVCloudExpressVApp.apply(from)); + builder.state(vAppStatusToNodeState.get(from.getStatus())); + builder.publicAddresses(computeClient.getPublicAddresses(from.getHref())); + builder.privateAddresses(computeClient.getPrivateAddresses(from.getHref())); + builder.credentials(credentialStore.get(from.getHref().toASCIIString())); + return builder.build(); + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java index a6639f505d..d90681a774 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java @@ -19,10 +19,7 @@ package org.jclouds.vcloud.compute.internal; -import static com.google.common.base.Preconditions.checkState; - import java.net.URI; -import java.util.Map; import java.util.Set; import javax.annotation.Resource; @@ -38,7 +35,6 @@ import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.Task; import com.google.common.base.Predicate; -import com.google.common.collect.Maps; import com.google.inject.Inject; /** @@ -59,22 +55,6 @@ public abstract class CommonVCloudComputeClientImpl this.taskTester = successTester; } - protected Map parseAndValidateResponse(T template, A vAppResponse) { - Map response = parseResponse(template, vAppResponse); - checkState(response.containsKey("id"), "bad configuration: [id] should be in response"); - checkState(response.containsKey("username"), "bad configuration: [username] should be in response"); - checkState(response.containsKey("password"), "bad configuration: [password] should be in response"); - return response; - } - - protected Map parseResponse(T template, A vAppResponse) { - Map config = Maps.newLinkedHashMap();// Allows nulls - config.put("id", vAppResponse.getHref().toASCIIString()); - config.put("username", null); - config.put("password", null); - return config; - } - @Override public void reset(URI id) { A vApp = refreshVApp(id); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java index 6c18dc3186..a34b92e5a0 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java @@ -47,14 +47,13 @@ import com.google.inject.Inject; */ @Singleton public class VCloudExpressComputeClientImpl extends - CommonVCloudComputeClientImpl implements - VCloudExpressComputeClient { + CommonVCloudComputeClientImpl implements VCloudExpressComputeClient { protected final Map vAppStatusToNodeState; @Inject public VCloudExpressComputeClientImpl(VCloudExpressClient client, Predicate successTester, - Map vAppStatusToNodeState) { + Map vAppStatusToNodeState) { super(client, successTester); this.vAppStatusToNodeState = vAppStatusToNodeState; } @@ -66,13 +65,13 @@ public class VCloudExpressComputeClientImpl extends } @Override - public Map start(@Nullable URI VDC, URI templateId, String name, - InstantiateVAppTemplateOptions options, int... portsToOpen) { + public VCloudExpressVApp start(@Nullable URI VDC, URI templateId, String name, + InstantiateVAppTemplateOptions options, int... portsToOpen) { checkNotNull(options, "options"); logger.debug(">> instantiating vApp vDC(%s) template(%s) name(%s) options(%s) ", VDC, templateId, name, options); VCloudExpressVApp vAppResponse = VCloudExpressClient.class.cast(client).instantiateVAppTemplateInVDC(VDC, - templateId, name, options); + templateId, name, options); logger.debug("<< instantiated VApp(%s)", vAppResponse.getName()); if (options.shouldDeploy()) { logger.debug(">> deploying vApp(%s)", vAppResponse.getName()); @@ -88,13 +87,13 @@ public class VCloudExpressComputeClientImpl extends task = VCloudExpressClient.class.cast(client).powerOnVApp(vAppResponse.getHref()); if (!taskTester.apply(task.getHref())) { throw new RuntimeException(String.format("failed to %s %s: %s", "powerOn", vAppResponse.getName(), - task)); + task)); } logger.debug("<< on vApp(%s)", vAppResponse.getName()); } } } - return parseAndValidateResponse(VCloudExpressClient.class.cast(client).getVAppTemplate(templateId), vAppResponse); + return vAppResponse; } @Override diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java index f2d0ba2721..fea8c28b5e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java @@ -23,26 +23,19 @@ import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.jclouds.vcloud.options.InstantiateVAppTemplateOptions.Builder.processorCount; import java.net.URI; -import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; -import org.jclouds.compute.domain.os.CIMOperatingSystem; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -import org.jclouds.domain.Credentials; import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; -import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; -import com.google.common.collect.ImmutableMap; +import com.google.common.base.Function; /** * @author Adrian Cole @@ -51,42 +44,26 @@ import com.google.common.collect.ImmutableMap; public class VCloudExpressAddNodeWithTagStrategy implements AddNodeWithTagStrategy { protected final VCloudExpressClient client; protected final VCloudExpressComputeClient computeClient; - protected final Map vAppStatusToNodeState; + protected final Function vAppToNodeMetadata; @Inject protected VCloudExpressAddNodeWithTagStrategy(VCloudExpressClient client, VCloudExpressComputeClient computeClient, - Map vAppStatusToNodeState) { + Function vAppToNodeMetadata) { this.client = client; this.computeClient = computeClient; - this.vAppStatusToNodeState = vAppStatusToNodeState; + this.vAppToNodeMetadata = vAppToNodeMetadata; } @Override public NodeMetadata execute(String tag, String name, Template template) { InstantiateVAppTemplateOptions options = processorCount((int) getCores(template.getHardware())).memory( - template.getHardware().getRam()).disk( - (long) ((template.getHardware().getVolumes().get(0).getSize()) * 1024 * 1024l)); + template.getHardware().getRam()).disk( + (long) ((template.getHardware().getVolumes().get(0).getSize()) * 1024 * 1024l)); if (!template.getOptions().shouldBlockUntilRunning()) options.block(false); - Map metaMap = computeClient.start(URI.create(template.getLocation().getId()), URI.create(template - .getImage().getId()), name, options, template.getOptions().getInboundPorts()); - VCloudExpressVApp vApp = client.getVApp(URI.create(metaMap.get("id"))); - return newCreateNodeResponse(tag, template, metaMap, vApp); - } - - protected NodeMetadata newCreateNodeResponse(String tag, Template template, Map metaMap, - VCloudExpressVApp vApp) { - return new NodeMetadataImpl(vApp.getHref().toASCIIString(), vApp.getName(), vApp.getHref().toASCIIString(), - template.getLocation(), vApp.getHref(), ImmutableMap. of(), tag, template.getHardware(), - template.getImage().getId(), getOperatingSystemForVAppOrDefaultTo(vApp, template.getImage() - .getOperatingSystem()), vAppStatusToNodeState.get(vApp.getStatus()), computeClient - .getPublicAddresses(vApp.getHref()), computeClient.getPrivateAddresses(vApp.getHref()), - new Credentials(metaMap.get("username"), metaMap.get("password"))); - } - - private OperatingSystem getOperatingSystemForVAppOrDefaultTo(VCloudExpressVApp vApp, OperatingSystem operatingSystem) { - return vApp.getOsType() != null ? new CIMOperatingSystem(CIMOperatingSystem.OSType.fromValue(vApp.getOsType()), - null, null, vApp.getOperatingSystemDescription()) : operatingSystem; + VCloudExpressVApp vApp = computeClient.start(URI.create(template.getLocation().getId()), + URI.create(template.getImage().getId()), name, options, template.getOptions().getInboundPorts()); + return vAppToNodeMetadata.apply(vApp); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java index 20a4315d57..19e4eb2ee7 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java @@ -20,62 +20,33 @@ package org.jclouds.vcloud.compute.strategy; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; 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.domain.Hardware; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; -import org.jclouds.compute.domain.os.CIMOperatingSystem; -import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.domain.Location; -import org.jclouds.logging.Logger; import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.compute.VCloudExpressComputeClient; -import org.jclouds.vcloud.compute.functions.FindLocationForResource; -import org.jclouds.vcloud.compute.functions.HardwareForVCloudExpressVApp; -import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VCloudExpressVApp; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; +import com.google.common.base.Function; /** * @author Adrian Cole */ @Singleton public class VCloudExpressGetNodeMetadataStrategy implements GetNodeMetadataStrategy { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; + protected final VCloudExpressClient client; - protected final VCloudExpressComputeClient computeClient; - protected final Supplier> images; - protected final FindLocationForResource findLocationForResourceInVDC; - protected final HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp; - protected final Map vAppStatusToNodeState; + protected final Function vAppToNodeMetadata; @Inject - protected VCloudExpressGetNodeMetadataStrategy(VCloudExpressClient client, VCloudExpressComputeClient computeClient, - Map vAppStatusToNodeState, HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, - FindLocationForResource findLocationForResourceInVDC, Supplier> images) { + protected VCloudExpressGetNodeMetadataStrategy(VCloudExpressClient client, + Function vAppToNodeMetadata) { this.client = checkNotNull(client, "client"); - this.images = checkNotNull(images, "images"); - this.hardwareForVCloudExpressVApp = checkNotNull(hardwareForVCloudExpressVApp, "hardwareForVCloudExpressVApp"); - this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC"); - this.computeClient = checkNotNull(computeClient, "computeClient"); - this.vAppStatusToNodeState = checkNotNull(vAppStatusToNodeState, "vAppStatusToNodeState"); + this.vAppToNodeMetadata = vAppToNodeMetadata; } public NodeMetadata execute(String in) { @@ -83,14 +54,7 @@ public class VCloudExpressGetNodeMetadataStrategy implements GetNodeMetadataStra VCloudExpressVApp from = client.getVApp(id); if (from == null) return null; - String tag = parseTagFromName(from.getName()); - Location location = findLocationForResourceInVDC.apply(from.getVDC()); - Hardware hardware = hardwareForVCloudExpressVApp.apply(from); - return new NodeMetadataImpl(in, from.getName(), in, location, from.getHref(), ImmutableMap. of(), - tag, hardware, null, from.getOsType() != null ? new CIMOperatingSystem(CIMOperatingSystem.OSType - .fromValue(from.getOsType()), null, null, from.getOperatingSystemDescription()) : null, - vAppStatusToNodeState.get(from.getStatus()), computeClient.getPublicAddresses(id), computeClient - .getPrivateAddresses(id), null); + return vAppToNodeMetadata.apply(from); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java index 1f0123c667..0688edce5d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java @@ -30,11 +30,10 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.ComputeMetadataBuilder; import org.jclouds.compute.domain.ComputeType; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.internal.ComputeMetadataImpl; import org.jclouds.compute.strategy.ListNodesStrategy; -import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.vcloud.CommonVCloudClient; import org.jclouds.vcloud.VCloudMediaType; @@ -46,7 +45,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; import com.google.common.base.Splitter; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.google.inject.internal.util.ImmutableSet; @@ -75,8 +73,8 @@ public class VCloudExpressListNodesStrategy implements ListNodesStrategy { @Inject protected VCloudExpressListNodesStrategy(CommonVCloudClient client, - @Org Supplier> orgNameToEndpoint, VCloudExpressGetNodeMetadataStrategy getNodeMetadata, - FindLocationForResource findLocationForResourceInVDC) { + @Org Supplier> orgNameToEndpoint, + VCloudExpressGetNodeMetadataStrategy getNodeMetadata, FindLocationForResource findLocationForResourceInVDC) { this.client = client; this.orgNameToEndpoint = orgNameToEndpoint; this.getNodeMetadata = getNodeMetadata; @@ -103,9 +101,12 @@ public class VCloudExpressListNodesStrategy implements ListNodesStrategy { } private ComputeMetadata convertVAppToComputeMetadata(ReferenceType vdc, ReferenceType resource) { - Location location = findLocationForResourceInVDC.apply(vdc); - return new ComputeMetadataImpl(ComputeType.NODE, resource.getHref().toASCIIString(), resource.getName(), resource - .getHref().toASCIIString(), location, null, ImmutableMap. of()); + ComputeMetadataBuilder builder = new ComputeMetadataBuilder(ComputeType.NODE); + builder.providerId(resource.getHref().toASCIIString()); + builder.name(resource.getName()); + builder.id(resource.getHref().toASCIIString()); + builder.location(findLocationForResourceInVDC.apply(vdc)); + return builder.build(); } @Override diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java index 7f5cee785f..db18b535e1 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java @@ -20,62 +20,32 @@ package org.jclouds.vcloud.compute.strategy; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; -import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getCredentialsFrom; -import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getPrivateIpsFromVApp; -import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getPublicIpsFromVApp; -import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.toComputeOs; 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.domain.Hardware; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; -import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.domain.Location; -import org.jclouds.logging.Logger; import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.functions.FindLocationForResource; -import org.jclouds.vcloud.compute.functions.HardwareForVApp; -import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VApp; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; +import com.google.common.base.Function; /** * @author Adrian Cole */ @Singleton public class VCloudGetNodeMetadataStrategy implements GetNodeMetadataStrategy { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; + protected final VCloudClient client; - protected final Supplier> images; - protected final FindLocationForResource findLocationForResourceInVDC; - protected final HardwareForVApp hardwareForVApp; - protected final Map vAppStatusToNodeState; + protected final Function vAppToNodeMetadata; @Inject - protected VCloudGetNodeMetadataStrategy(VCloudClient client, Map vAppStatusToNodeState, - HardwareForVApp hardwareForVApp, FindLocationForResource findLocationForResourceInVDC, - Supplier> images) { + protected VCloudGetNodeMetadataStrategy(VCloudClient client, Function vAppToNodeMetadata) { this.client = checkNotNull(client, "client"); - this.images = checkNotNull(images, "images"); - this.hardwareForVApp = checkNotNull(hardwareForVApp, "hardwareForVApp"); - this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC"); - this.vAppStatusToNodeState = checkNotNull(vAppStatusToNodeState, "vAppStatusToNodeState"); + this.vAppToNodeMetadata = checkNotNull(vAppToNodeMetadata, "vAppToNodeMetadata"); } public NodeMetadata execute(String in) { @@ -83,11 +53,6 @@ public class VCloudGetNodeMetadataStrategy implements GetNodeMetadataStrategy { VApp from = client.getVApp(id); if (from == null) return null; - String tag = parseTagFromName(from.getName()); - Location location = findLocationForResourceInVDC.apply(from.getVDC()); - Hardware hardware = hardwareForVApp.apply(from); - return new NodeMetadataImpl(in, from.getName(), in, location, from.getHref(), ImmutableMap. of(), - tag, hardware, null, toComputeOs(from, null), vAppStatusToNodeState.get(from.getStatus()), - getPublicIpsFromVApp(from), getPrivateIpsFromVApp(from), getCredentialsFrom(from)); + return vAppToNodeMetadata.apply(from); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java index 78d4902f39..d1faba4277 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java @@ -30,11 +30,10 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.ComputeMetadataBuilder; import org.jclouds.compute.domain.ComputeType; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.internal.ComputeMetadataImpl; import org.jclouds.compute.strategy.ListNodesStrategy; -import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.vcloud.CommonVCloudClient; import org.jclouds.vcloud.VCloudMediaType; @@ -46,7 +45,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; import com.google.common.base.Splitter; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.google.inject.internal.util.ImmutableSet; @@ -103,9 +101,12 @@ public class VCloudListNodesStrategy implements ListNodesStrategy { } private ComputeMetadata convertVAppToComputeMetadata(ReferenceType vdc, ReferenceType resource) { - Location location = findLocationForResourceInVDC.apply(vdc); - return new ComputeMetadataImpl(ComputeType.NODE, resource.getHref().toASCIIString(), resource.getName(), resource - .getHref().toASCIIString(), location, null, ImmutableMap. of()); + ComputeMetadataBuilder builder = new ComputeMetadataBuilder(ComputeType.NODE); + builder.providerId(resource.getHref().toASCIIString()); + builder.name(resource.getName()); + builder.id(resource.getHref().toASCIIString()); + builder.location(findLocationForResourceInVDC.apply(vdc)); + return builder.build(); } @Override diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/StaticHardwareSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/StaticHardwareSupplier.java index 263adc7841..a0a9e5a4b2 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/StaticHardwareSupplier.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/StaticHardwareSupplier.java @@ -24,14 +24,13 @@ import java.util.Set; import javax.inject.Singleton; import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.internal.HardwareImpl; +import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.internal.VolumeImpl; -import org.jclouds.compute.predicates.ImagePredicates; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; /** @@ -42,15 +41,14 @@ public class StaticHardwareSupplier implements Supplier> @Override public Set get() { - Set sizes = Sets.newHashSet(); + Set hardware = Sets.newHashSet(); for (int cpus : new int[] { 1, 2, 4, 8 }) for (int ram : new int[] { 512, 1024, 2048, 4096, 8192, 16384 }) { String id = String.format("cpu=%d,ram=%s,disk=%d", cpus, ram, 10); - sizes.add(new HardwareImpl(id, null, id, null, null, ImmutableMap. of(), ImmutableList - .of(new Processor(cpus, 1.0)), ram, ImmutableList.of(new VolumeImpl(10f, true, true)), - ImagePredicates.any())); + hardware.add(new HardwareBuilder().ids(id).ram(ram) + .processors(ImmutableList.of(new Processor(cpus, 1.0))) + .volumes(ImmutableList. of(new VolumeImpl(10f, true, true))).build()); } - return sizes; + return hardware; } - } \ No newline at end of file diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java index a1e2aa291d..2ad55295e4 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java @@ -24,7 +24,6 @@ import static com.google.common.collect.Iterables.getLast; import static org.jclouds.vcloud.terremark.options.AddInternetServiceOptions.Builder.withDescription; import java.net.URI; -import java.util.LinkedHashMap; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; @@ -64,34 +63,26 @@ import com.google.common.collect.Sets; @Singleton public class TerremarkVCloudComputeClient extends VCloudExpressComputeClientImpl { - private final TerremarkVCloudExpressClient client; - private final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; - private Provider passwordGenerator; + protected final TerremarkVCloudExpressClient client; + protected final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; + protected final Provider passwordGenerator; + protected final Map credentialStore; @Inject protected TerremarkVCloudComputeClient(TerremarkVCloudExpressClient client, - PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, - @Named("PASSWORD") Provider passwordGenerator, Predicate successTester, - Map vAppStatusToNodeState) { + PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, + @Named("PASSWORD") Provider passwordGenerator, Predicate successTester, + Map vAppStatusToNodeState, Map credentialStore) { super(client, successTester, vAppStatusToNodeState); this.client = client; this.credentialsProvider = credentialsProvider; this.passwordGenerator = passwordGenerator; + this.credentialStore = credentialStore; } @Override - protected Map parseAndValidateResponse(VCloudExpressVAppTemplate template, - VCloudExpressVApp vAppResponse) { - Credentials credentials = credentialsProvider.execute(template); - Map toReturn = super.parseResponse(template, vAppResponse); - toReturn.put("username", credentials.identity); - toReturn.put("password", credentials.credential); - return toReturn; - } - - @Override - public Map start(@Nullable URI VDC, URI templateId, String name, - InstantiateVAppTemplateOptions options, int... portsToOpen) { + public VCloudExpressVApp start(@Nullable URI VDC, URI templateId, String name, + InstantiateVAppTemplateOptions options, int... portsToOpen) { if (options.getDiskSizeKilobytes() != null) { logger.warn("trmk does not support resizing the primary disk; unsetting disk size"); } @@ -101,18 +92,20 @@ public class TerremarkVCloudComputeClient extends VCloudExpressComputeClientImpl String password = null; VCloudExpressVAppTemplate template = client.getVAppTemplate(templateId); if (template.getDescription().indexOf("Windows") != -1 - && options instanceof TerremarkInstantiateVAppTemplateOptions) { + && options instanceof TerremarkInstantiateVAppTemplateOptions) { password = passwordGenerator.get(); TerremarkInstantiateVAppTemplateOptions.class.cast(options).getProperties().put("password", password); } - Map response = super.start(VDC, templateId, name, options, portsToOpen); + Credentials defaultCredentials = credentialsProvider.execute(template); + + VCloudExpressVApp vAppResponse = super.start(VDC, templateId, name, options, portsToOpen); if (password != null) { - response = new LinkedHashMap(response); - response.put("password", password); + credentialStore.put(vAppResponse.getHref().toASCIIString(), new Credentials(defaultCredentials.identity, + password)); } if (portsToOpen.length > 0) - createPublicAddressMappedToPorts(URI.create(response.get("id")), portsToOpen); - return response; + createPublicAddressMappedToPorts(vAppResponse.getHref(), portsToOpen); + return vAppResponse; } public String createPublicAddressMappedToPorts(URI vAppId, int... ports) { @@ -123,47 +116,51 @@ public class TerremarkVCloudComputeClient extends VCloudExpressComputeClientImpl InternetService is = null; Protocol protocol; switch (port) { - case 22: - protocol = Protocol.TCP; - break; - case 80: - case 8080: - protocol = Protocol.HTTP; - break; - case 443: - protocol = Protocol.HTTPS; - break; - default: - protocol = Protocol.HTTP; - break; + case 22: + protocol = Protocol.TCP; + break; + case 80: + case 8080: + protocol = Protocol.HTTP; + break; + case 443: + protocol = Protocol.HTTPS; + break; + default: + protocol = Protocol.HTTP; + break; } if (ip == null) { if (client instanceof TerremarkVCloudExpressClient) { is = TerremarkVCloudExpressClient.class.cast(client).addInternetServiceToVDC( - vApp.getVDC().getHref(), - vApp.getName() + "-" + port, - protocol, - port, - withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp.getName(), - vApp.getName()))); + vApp.getVDC().getHref(), + vApp.getName() + "-" + port, + protocol, + port, + withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp.getName(), + vApp.getName()))); ip = is.getPublicIpAddress(); } else { logger.debug(">> creating InternetService in vDC %s:%s:%d", vApp.getVDC().getName(), protocol, port); ip = TerremarkECloudClient.class.cast(client).activatePublicIpInVDC(vApp.getVDC().getHref()); 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.getName()))); + withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp.getName(), + vApp.getName()))); } } else { logger.debug(">> adding InternetService %s:%s:%d", ip.getAddress(), protocol, port); - 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.getName()))); + 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.getName()))); } - logger.debug("<< created InternetService(%s) %s:%s:%d", is.getName(), is.getPublicIpAddress().getAddress(), is - .getProtocol(), is.getPort()); + logger.debug("<< created InternetService(%s) %s:%s:%d", is.getName(), is.getPublicIpAddress().getAddress(), + is.getProtocol(), is.getPort()); logger.debug(">> adding Node %s:%d -> %s:%d", is.getPublicIpAddress().getAddress(), is.getPort(), - privateAddress, port); + privateAddress, port); Node node = client.addNode(is.getId(), privateAddress, vApp.getName() + "-" + port, port); logger.debug("<< added Node(%s)", node.getName()); } @@ -177,13 +174,13 @@ public class TerremarkVCloudComputeClient extends VCloudExpressComputeClientImpl if (vApp.getNetworkToAddresses().containsValue(node.getIpAddress())) { ipAddresses.add(service.getPublicIpAddress()); logger.debug(">> deleting Node(%s) %s:%d -> %s:%d", node.getName(), service.getPublicIpAddress() - .getAddress(), service.getPort(), node.getIpAddress(), node.getPort()); + .getAddress(), service.getPort(), node.getIpAddress(), node.getPort()); client.deleteNode(node.getId()); logger.debug("<< deleted Node(%s)", node.getName()); Set nodes = client.getNodes(service.getId()); if (nodes.size() == 0) { logger.debug(">> deleting InternetService(%s) %s:%d", service.getName(), service.getPublicIpAddress() - .getAddress(), service.getPort()); + .getAddress(), service.getPort()); client.deleteInternetService(service.getId()); logger.debug("<< deleted InternetService(%s)", service.getName()); continue SERVICE; diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java index 270ff0914a..e14a0db1fb 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java @@ -19,6 +19,7 @@ package org.jclouds.vcloud.terremark.compute; +import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; @@ -43,6 +44,7 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.compute.util.ComputeUtils; +import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.vcloud.terremark.compute.domain.KeyPairCredentials; import org.jclouds.vcloud.terremark.compute.domain.OrgAndName; @@ -61,19 +63,19 @@ public class TerremarkVCloudComputeService extends BaseComputeService { private final CleanupOrphanKeys cleanupOrphanKeys; @Inject - protected TerremarkVCloudComputeService(ComputeServiceContext context, Supplier> images, - Supplier> sizes, Supplier> locations, - ListNodesStrategy listNodesStrategy, GetNodeMetadataStrategy getNodeMetadataStrategy, - RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy, - DestroyNodeStrategy destroyNodeStrategy, Provider templateBuilderProvider, - Provider templateOptionsProvider, - @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, CleanupOrphanKeys cleanupOrphanKeys, - ConcurrentMap credentialsMap, NodeMetadataToOrgAndName nodeToOrgAndName) { - super(context, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, runNodesAndAddToSetStrategy, - rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, - nodeTerminated, utils, timeouts, executor); + protected TerremarkVCloudComputeService(ComputeServiceContext context, Map credentialStore, + Supplier> images, Supplier> sizes, + Supplier> locations, ListNodesStrategy listNodesStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, + Provider templateBuilderProvider, Provider templateOptionsProvider, + @Named("NODE_RUNNING") Predicate nodeRunning, + @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, CleanupOrphanKeys cleanupOrphanKeys, + ConcurrentMap credentialsMap, NodeMetadataToOrgAndName nodeToOrgAndName) { + super(context, credentialStore, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, + runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, + templateOptionsProvider, nodeRunning, nodeTerminated, utils, timeouts, executor); this.cleanupOrphanKeys = cleanupOrphanKeys; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java index 89e360f60f..6ceb5d2aed 100755 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java @@ -46,18 +46,20 @@ import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.compute.config.VCloudExpressComputeServiceContextModule; import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; +import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.terremark.compute.TerremarkVCloudComputeClient; import org.jclouds.vcloud.terremark.compute.TerremarkVCloudComputeService; import org.jclouds.vcloud.terremark.compute.domain.KeyPairCredentials; import org.jclouds.vcloud.terremark.compute.domain.OrgAndName; import org.jclouds.vcloud.terremark.compute.functions.NodeMetadataToOrgAndName; +import org.jclouds.vcloud.terremark.compute.functions.TerremarkVCloudExpressVAppToNodeMetadata; import org.jclouds.vcloud.terremark.compute.options.TerremarkVCloudTemplateOptions; import org.jclouds.vcloud.terremark.compute.strategy.ParseVAppTemplateDescriptionToGetDefaultLoginCredentials; import org.jclouds.vcloud.terremark.compute.strategy.TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy; import org.jclouds.vcloud.terremark.compute.strategy.TerremarkVCloudAddNodeWithTagStrategy; -import org.jclouds.vcloud.terremark.compute.strategy.TerremarkVCloudGetNodeMetadataStrategy; import org.jclouds.vcloud.terremark.compute.suppliers.VAppTemplatesInOrgs; import com.google.common.base.Function; @@ -99,7 +101,9 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom bind(RunNodesAndAddToSetStrategy.class).to(TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.class); bind(ListNodesStrategy.class).to(VCloudExpressListNodesStrategy.class); // NOTE - bind(GetNodeMetadataStrategy.class).to(TerremarkVCloudGetNodeMetadataStrategy.class); + bind(new TypeLiteral>() { + }).to(TerremarkVCloudExpressVAppToNodeMetadata.class); + bind(GetNodeMetadataStrategy.class).to(VCloudExpressGetNodeMetadataStrategy.class); bind(RebootNodeStrategy.class).to(VCloudExpressRebootNodeStrategy.class); bind(DestroyNodeStrategy.class).to(VCloudExpressDestroyNodeStrategy.class); bindLoadBalancer(); @@ -111,7 +115,7 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom bind(ComputeService.class).to(TerremarkVCloudComputeService.class); bind(VCloudExpressComputeClient.class).to(TerremarkVCloudComputeClient.class); bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to( - ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.class); + ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.class); bind(SecureRandom.class).toInstance(new SecureRandom()); } @@ -127,7 +131,7 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom // bind(LoadBalanceNodesStrategy.class).to(TerremarkLoadBalanceNodesStrategy.class); // bind(DestroyLoadBalancerStrategy.class).to(TerremarkDestroyLoadBalancerStrategy.class); // } - // + // @Named("PASSWORD") @Provides diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java similarity index 65% rename from vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java rename to vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java index b224c43702..2ce137d453 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java @@ -17,34 +17,30 @@ * ==================================================================== */ -package org.jclouds.vcloud.terremark.compute.strategy; +package org.jclouds.vcloud.terremark.compute.functions; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.installNewCredentials; import java.net.URI; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentMap; -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.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Credentials; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.compute.domain.VCloudLocation; import org.jclouds.vcloud.compute.functions.FindLocationForResource; import org.jclouds.vcloud.compute.functions.HardwareForVCloudExpressVApp; -import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; +import org.jclouds.vcloud.compute.functions.VCloudExpressVAppToNodeMetadata; import org.jclouds.vcloud.domain.Status; +import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.terremark.compute.domain.KeyPairCredentials; import org.jclouds.vcloud.terremark.compute.domain.OrgAndName; @@ -54,25 +50,24 @@ import com.google.common.base.Supplier; * @author Adrian Cole */ @Singleton -public class TerremarkVCloudGetNodeMetadataStrategy extends VCloudExpressGetNodeMetadataStrategy { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - +public class TerremarkVCloudExpressVAppToNodeMetadata extends VCloudExpressVAppToNodeMetadata { private final ConcurrentMap credentialsMap; @Inject - protected TerremarkVCloudGetNodeMetadataStrategy(VCloudExpressClient client, - VCloudExpressComputeClient computeClient, Map vAppStatusToNodeState, - HardwareForVCloudExpressVApp getExtra, FindLocationForResource findLocationForResourceInVDC, - Supplier> images, ConcurrentMap credentialsMap) { - super(client, computeClient, vAppStatusToNodeState, getExtra, findLocationForResourceInVDC, images); - this.credentialsMap = credentialsMap; + public TerremarkVCloudExpressVAppToNodeMetadata(VCloudExpressComputeClient computeClient, + Map credentialStore, Map vAppStatusToNodeState, + HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, + FindLocationForResource findLocationForResourceInVDC, Supplier> images, + ConcurrentMap credentialsMap) { + super(computeClient, credentialStore, vAppStatusToNodeState, hardwareForVCloudExpressVApp, + findLocationForResourceInVDC, images); + this.credentialsMap = checkNotNull(credentialsMap, "credentialsMap"); + ; } @Override - public NodeMetadata execute(String id) { - NodeMetadata node = super.execute(checkNotNull(id, "node.id")); + public NodeMetadata apply(VCloudExpressVApp from) { + NodeMetadata node = super.apply(from); if (node == null) return null; if (node.getTag() != null) { @@ -85,7 +80,7 @@ public class TerremarkVCloudGetNodeMetadataStrategy extends VCloudExpressGetNode OrgAndName orgAndName = getOrgAndNameFromNode(node); if (credentialsMap.containsKey(orgAndName)) { Credentials creds = credentialsMap.get(orgAndName); - node = installNewCredentials(node, creds); + node = NodeMetadataBuilder.fromNodeMetadata(node).credentials(creds).build(); } return node; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudAddNodeWithTagStrategy.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudAddNodeWithTagStrategy.java index 3568d06029..4b70b38474 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudAddNodeWithTagStrategy.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudAddNodeWithTagStrategy.java @@ -22,7 +22,6 @@ package org.jclouds.vcloud.terremark.compute.strategy; import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; -import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; @@ -30,38 +29,36 @@ 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.GetNodeMetadataStrategy; -import org.jclouds.vcloud.terremark.TerremarkVCloudClient; +import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.terremark.compute.TerremarkVCloudComputeClient; import org.jclouds.vcloud.terremark.compute.functions.TemplateToInstantiateOptions; import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions; +import com.google.common.base.Function; + /** * @author Adrian Cole */ @Singleton public class TerremarkVCloudAddNodeWithTagStrategy implements AddNodeWithTagStrategy { - protected final TerremarkVCloudClient client; protected final TerremarkVCloudComputeClient computeClient; - protected final GetNodeMetadataStrategy getNode; protected final TemplateToInstantiateOptions getOptions; + protected final Function vAppToNodeMetadata; @Inject - protected TerremarkVCloudAddNodeWithTagStrategy(TerremarkVCloudClient client, - TerremarkVCloudComputeClient computeClient, GetNodeMetadataStrategy getNode, - TemplateToInstantiateOptions getOptions) { - this.client = client; + protected TerremarkVCloudAddNodeWithTagStrategy(TerremarkVCloudComputeClient computeClient, + Function vAppToNodeMetadata, TemplateToInstantiateOptions getOptions) { this.computeClient = computeClient; - this.getNode = getNode; + this.vAppToNodeMetadata = vAppToNodeMetadata; this.getOptions = checkNotNull(getOptions, "getOptions"); } @Override public NodeMetadata execute(String tag, String name, Template template) { TerremarkInstantiateVAppTemplateOptions options = getOptions.apply(template); - Map metaMap = computeClient.start(URI.create(template.getLocation().getId()), URI.create(template - .getImage().getId()), name, options, template.getOptions().getInboundPorts()); - return getNode.execute(metaMap.get("id")); + VCloudExpressVApp vApp = computeClient.start(URI.create(template.getLocation().getId()), + URI.create(template.getImage().getId()), name, options, template.getOptions().getInboundPorts()); + return vAppToNodeMetadata.apply(vApp); } } \ No newline at end of file diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientTest.java index 36f8c01ce4..c447161874 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientTest.java @@ -33,6 +33,7 @@ import java.util.Map; import javax.inject.Provider; import org.jclouds.compute.domain.NodeState; +import org.jclouds.domain.Credentials; import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudExpressVApp; @@ -44,6 +45,7 @@ import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOpti import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.Maps; import com.google.common.io.ByteStreams; /** @@ -54,6 +56,7 @@ public class TerremarkVCloudComputeClientTest { @SuppressWarnings("unchecked") @Test public void testStartWindows() throws IOException { + Map credentialStore = Maps.newHashMap(); InputStream is = getClass().getResourceAsStream("/terremark/windows_description.txt"); String description = new String(ByteStreams.toByteArray(is)); VCloudExpressVAppTemplate template = createMock(VCloudExpressVAppTemplate.class); @@ -65,14 +68,11 @@ public class TerremarkVCloudComputeClientTest { TerremarkVCloudExpressClient client = createMock(TerremarkVCloudExpressClient.class); VCloudExpressVApp vApp = createMock(VCloudExpressVApp.class); - // TODO make this call only once expect(client.getVAppTemplate(templateURI)).andReturn(template); - expect(client.getVAppTemplate(templateURI)).andReturn(template); - expect( - client.instantiateVAppTemplateInVDC(vdcURI, templateURI, "name", - new TerremarkInstantiateVAppTemplateOptions().productProperty("password", "password"))) - .andReturn(vApp); + client.instantiateVAppTemplateInVDC(vdcURI, templateURI, "name", + new TerremarkInstantiateVAppTemplateOptions().productProperty("password", "password"))).andReturn( + vApp); Task task = createMock(Task.class); URI vappLocation = URI.create("vapp"); URI taskLocation = URI.create("task"); @@ -89,14 +89,14 @@ public class TerremarkVCloudComputeClientTest { Map vAppStatusToNodeState = createMock(Map.class); TerremarkVCloudComputeClient computeClient = new TerremarkVCloudComputeClient(client, - new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(), new Provider() { + new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(), new Provider() { - @Override - public String get() { - return "password"; - } + @Override + public String get() { + return "password"; + } - }, successTester, vAppStatusToNodeState); + }, successTester, vAppStatusToNodeState, credentialStore); replay(vdc); replay(template); @@ -107,12 +107,11 @@ public class TerremarkVCloudComputeClientTest { replay(notFoundTester); replay(vAppStatusToNodeState); - Map response = computeClient.start(vdcURI, templateURI, "name", - new TerremarkInstantiateVAppTemplateOptions()); + VCloudExpressVApp response = computeClient.start(vdcURI, templateURI, "name", + new TerremarkInstantiateVAppTemplateOptions()); - assertEquals(response.get("id"), "vapp"); - assertEquals(response.get("username"), "Administrator"); - assertEquals(response.get("password"), "password"); + assertEquals(response.getHref().toASCIIString(), "vapp"); + assertEquals(credentialStore.get("vapp"), new Credentials("Administrator", "password")); verify(vdc); verify(template); From 7f02bd8929b2d297cc9fa673dc5a5bf4113066ce Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 16 Oct 2010 23:45:14 -0700 Subject: [PATCH 03/17] Issue 381: removed unnecessary VCloudLocation class --- .../vcloud/compute/domain/VCloudLocation.java | 49 ------------------- .../functions/FindLocationForResource.java | 4 +- .../OrgAndVDCToLocationSupplier.java | 7 ++- .../vcloud/functions/OrgsForLocations.java | 3 +- ...remarkVCloudExpressVAppToNodeMetadata.java | 13 +++-- ...agIntoNameRunNodesAndAddToSetStrategy.java | 18 +++---- 6 files changed, 21 insertions(+), 73 deletions(-) delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudLocation.java diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudLocation.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudLocation.java deleted file mode 100644 index 1f5f0e31f0..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/domain/VCloudLocation.java +++ /dev/null @@ -1,49 +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.vcloud.compute.domain; - -import static com.google.common.base.Preconditions.checkNotNull; - -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.vcloud.domain.ReferenceType; - -/** - * - * @author Adrian Cole - */ -public class VCloudLocation extends LocationImpl { - - private static final long serialVersionUID = -5052812549904524841L; - - private final ReferenceType resource; - - public VCloudLocation(ReferenceType resource, Location parent) { - super(checkNotNull(resource, "resource").getType().endsWith("org+xml") ? LocationScope.REGION - : LocationScope.ZONE, resource.getHref().toASCIIString(), resource.getName(), parent); - this.resource = resource; - } - - public ReferenceType getResource() { - return resource; - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java index 8b668688b7..8df6a3d21e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java @@ -19,6 +19,7 @@ package org.jclouds.vcloud.compute.functions; +import java.net.URI; import java.util.NoSuchElementException; import java.util.Set; @@ -28,7 +29,6 @@ import javax.inject.Singleton; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.compute.domain.VCloudLocation; import org.jclouds.vcloud.domain.ReferenceType; import com.google.common.base.Supplier; @@ -60,7 +60,7 @@ public class FindLocationForResource { do { // The "name" isn't always present, ex inside a vApp we have a rel // link that only includes href and type. - if (VCloudLocation.class.cast(input).getResource().getHref().equals(resource.getHref())) + if (URI.create(input.getId()).equals(resource.getHref())) return input; input = input.getParent(); } while (input.getParent() != null); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java index aa841d7da0..f25a87123b 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java @@ -28,9 +28,8 @@ import javax.inject.Singleton; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.vcloud.compute.domain.VCloudLocation; -import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.ReferenceType; import com.google.common.base.Supplier; import com.google.common.collect.Sets; @@ -59,9 +58,9 @@ public class OrgAndVDCToLocationSupplier implements Supplier locations = Sets.newLinkedHashSet(); for (ReferenceType org : orgNameToResource.get().values()) { - Location orgL = new VCloudLocation(org, provider); + 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 VCloudLocation(vdc, orgL)); + locations.add(new LocationImpl(LocationScope.ZONE, vdc.getHref().toASCIIString(), vdc.getName(), orgL)); } } return locations; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java index 164f0de1cf..08d38ea7cc 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java @@ -38,7 +38,6 @@ import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.logging.Logger; import org.jclouds.vcloud.CommonVCloudAsyncClient; -import org.jclouds.vcloud.compute.domain.VCloudLocation; import org.jclouds.vcloud.domain.Org; import com.google.common.base.Function; @@ -80,7 +79,7 @@ public class OrgsForLocations implements Function, @Override public URI apply(Location from) { - return VCloudLocation.class.cast(from.getParent()).getResource().getHref(); + return URI.create(from.getParent().getId()); } })), new Function>() { diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java index 2ce137d453..c7aea007c5 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java @@ -35,7 +35,6 @@ import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; import org.jclouds.domain.Credentials; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; -import org.jclouds.vcloud.compute.domain.VCloudLocation; import org.jclouds.vcloud.compute.functions.FindLocationForResource; import org.jclouds.vcloud.compute.functions.HardwareForVCloudExpressVApp; import org.jclouds.vcloud.compute.functions.VCloudExpressVAppToNodeMetadata; @@ -55,12 +54,12 @@ public class TerremarkVCloudExpressVAppToNodeMetadata extends VCloudExpressVAppT @Inject public TerremarkVCloudExpressVAppToNodeMetadata(VCloudExpressComputeClient computeClient, - Map credentialStore, Map vAppStatusToNodeState, - HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, - FindLocationForResource findLocationForResourceInVDC, Supplier> images, - ConcurrentMap credentialsMap) { + Map credentialStore, Map vAppStatusToNodeState, + HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, + FindLocationForResource findLocationForResourceInVDC, Supplier> images, + ConcurrentMap credentialsMap) { super(computeClient, credentialStore, vAppStatusToNodeState, hardwareForVCloudExpressVApp, - findLocationForResourceInVDC, images); + findLocationForResourceInVDC, images); this.credentialsMap = checkNotNull(credentialsMap, "credentialsMap"); ; } @@ -86,7 +85,7 @@ public class TerremarkVCloudExpressVAppToNodeMetadata extends VCloudExpressVAppT } OrgAndName getOrgAndNameFromNode(NodeMetadata node) { - URI orgId = VCloudLocation.class.cast(node.getLocation().getParent()).getResource().getHref(); + URI orgId = URI.create(node.getLocation().getParent().getId()); OrgAndName orgAndName = new OrgAndName(orgId, node.getTag()); return orgAndName; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.java index 23b5996492..239154aabb 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.java @@ -19,6 +19,7 @@ package org.jclouds.vcloud.terremark.compute.strategy; +import java.net.URI; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; @@ -36,7 +37,6 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; import org.jclouds.compute.util.ComputeUtils; import org.jclouds.domain.LocationScope; -import org.jclouds.vcloud.compute.domain.VCloudLocation; import org.jclouds.vcloud.terremark.compute.options.TerremarkVCloudTemplateOptions; /** @@ -51,21 +51,21 @@ public class TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy extends Encod @Inject protected TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy(AddNodeWithTagStrategy addNodeWithTagStrategy, - ListNodesStrategy listNodesStrategy, @Named("NAMING_CONVENTION") String nodeNamingConvention, - ComputeUtils utils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, - CreateNewKeyPairUnlessUserSpecifiedOtherwise createNewKeyPairUnlessUserSpecifiedOtherwise) { + ListNodesStrategy listNodesStrategy, @Named("NAMING_CONVENTION") String nodeNamingConvention, + ComputeUtils utils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, + CreateNewKeyPairUnlessUserSpecifiedOtherwise createNewKeyPairUnlessUserSpecifiedOtherwise) { super(addNodeWithTagStrategy, listNodesStrategy, nodeNamingConvention, utils, executor); this.createNewKeyPairUnlessUserSpecifiedOtherwise = createNewKeyPairUnlessUserSpecifiedOtherwise; } @Override public Map> execute(String tag, int count, Template template, Set nodes, - Map badNodes) { + Map badNodes) { assert template.getLocation().getParent().getScope() == LocationScope.REGION : "template location should have a parent of org, which should be mapped to region: " - + template.getLocation(); - createNewKeyPairUnlessUserSpecifiedOtherwise.execute(VCloudLocation.class - .cast(template.getLocation().getParent()).getResource().getHref(), tag, template.getImage() - .getDefaultCredentials().identity, template.getOptions().as(TerremarkVCloudTemplateOptions.class)); + + template.getLocation(); + createNewKeyPairUnlessUserSpecifiedOtherwise.execute(URI.create(template.getLocation().getParent().getId()), tag, + template.getImage().getDefaultCredentials().identity, template.getOptions().as( + TerremarkVCloudTemplateOptions.class)); return super.execute(tag, count, template, nodes, badNodes); } } \ No newline at end of file From 49b88183d2c8c75d86f10284fedddf00ad11db19 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 17 Oct 2010 18:17:24 -0700 Subject: [PATCH 04/17] refactored compute provider implementation --- .../saas/blobstore/AtmosAsyncBlobStore.java | 7 +- .../saas/blobstore/AtmosBlobStore.java | 3 +- .../config/AtmosBlobStoreContextModule.java | 2 + .../aws/ec2/compute/EC2ComputeService.java | 33 +- .../EC2ComputeServiceContextModule.java | 251 +++------- .../EC2ComputeServiceDependenciesModule.java | 198 ++++++++ .../ec2/compute/functions/ImageParser.java | 16 +- .../RunningInstanceToNodeMetadata.java | 26 +- .../internal/EC2TemplateBuilderImpl.java | 12 +- .../suppliers/EC2HardwareSupplier.java | 9 +- .../compute/suppliers/EC2ImageSupplier.java | 52 ++ .../aws/s3/blobstore/S3AsyncBlobStore.java | 3 +- .../jclouds/aws/s3/blobstore/S3BlobStore.java | 10 +- .../config/S3BlobStoreContextModule.java | 2 + .../functions/BucketToResourceMetadata.java | 3 +- .../suppliers/DefaultLocationSupplier.java | 3 +- .../ec2/compute/EC2ComputeServiceTest.java | 51 +- .../functions/CredentialsForInstanceTest.java | 44 +- .../RunningInstanceToNodeMetadataTest.java | 139 +++--- .../internal/EC2TemplateBuilderImplTest.java | 41 +- .../blob/blobstore/AzureAsyncBlobStore.java | 3 +- .../blob/blobstore/AzureBlobStore.java | 3 +- .../config/AzureBlobStoreContextModule.java | 2 + .../blobstore/TransientAsyncBlobStore.java | 3 +- .../TransientBlobStoreContextModule.java | 2 + .../internal/BaseAsyncBlobStore.java | 4 +- .../blobstore/internal/BaseBlobStore.java | 3 +- .../compute/ComputeServiceContextFactory.java | 49 +- ...andaloneComputeServiceContextBuilder.java} | 44 +- .../BaseComputeServiceContextModule.java | 194 ++++++-- ...StandaloneComputeServiceClientModule.java} | 12 +- ...StandaloneComputeServiceContextModule.java | 40 ++ .../domain/internal/TemplateBuilderImpl.java | 95 ++-- .../compute/internal/BaseComputeService.java | 68 +-- .../StubComputeServiceContextBuilder.java | 14 +- .../StubComputeServiceContextModule.java | 383 ++------------- .../StubComputeServiceDependenciesModule.java | 377 +++++++++++++++ .../ComputeServiceContextFactoryTest.java | 39 ++ .../internal/TemplateBuilderImplTest.java | 91 ++-- .../java/org/jclouds/collect/Memoized.java | 42 ++ core/src/main/resources/rest.properties | 1 - .../filesystem/FilesystemAsyncBlobStore.java | 450 +++++++++--------- .../FilesystemBlobStoreContextModule.java | 22 +- .../GoGridComputeServiceContextModule.java | 147 ++---- ...oGridComputeServiceDependenciesModule.java | 113 +++++ .../functions/ServerToNodeMetadata.java | 13 +- .../GoGridDefaultLocationSupplier.java | 64 +++ .../suppliers/GoGridHardwareSupplier.java | 30 +- .../suppliers/GoGridImageSupplier.java | 2 +- ...GoGridComputeServiceContextModuleTest.java | 2 +- .../blobstore/CloudFilesAsyncBlobStore.java | 3 +- .../blobstore/CloudFilesBlobStore.java | 3 +- .../CloudFilesBlobStoreContextModule.java | 18 +- ...oudServersComputeServiceContextModule.java | 126 ++--- ...rversComputeServiceDependenciesModule.java | 117 +++++ .../functions/ServerToNodeMetadata.java | 4 +- .../suppliers/CloudServersImageSupplier.java | 4 +- ...e.java => RackspaceLocationsSupplier.java} | 19 +- ...erversComputeServiceContextModuleTest.java | 2 +- .../functions/ServerToNodeMetadataTest.java | 150 +++--- ...imuHostingComputeServiceContextModule.java | 130 ++--- ...stingComputeServiceDependenciesModule.java | 95 ++++ .../functions/ServerToNodeMetadata.java | 11 +- .../RimuHostingDefaultLocationSupplier.java | 64 +++ .../RimuHostingHardwareSupplier.java | 14 +- .../suppliers/RimuHostingImageSupplier.java | 4 +- .../RimuHostingLocationSupplier.java | 4 +- ...ostingComputeServiceContextModuleTest.java | 2 +- .../SlicehostComputeServiceContextModule.java | 116 ++--- ...ehostComputeServiceDependenciesModule.java | 97 ++++ .../functions/SliceToNodeMetadata.java | 6 +- .../suppliers/SlicehostImageSupplier.java | 2 +- ...cehostComputeServiceContextModuleTest.java | 2 +- .../functions/SliceToNodeMetadataTest.java | 99 ++-- ...mmonVCloudComputeServiceContextModule.java | 28 +- .../VCloudComputeServiceContextModule.java | 34 +- ...oudExpressComputeServiceContextModule.java | 38 +- .../functions/FindLocationForResource.java | 3 +- .../VCloudExpressVAppToNodeMetadata.java | 9 +- .../internal/VCloudTemplateBuilderImpl.java | 7 +- .../suppliers/StaticHardwareSupplier.java | 5 +- .../TerremarkVCloudComputeService.java | 23 +- ...markVCloudComputeServiceContextModule.java | 56 +-- ...remarkVCloudExpressVAppToNodeMetadata.java | 4 +- .../suppliers/VAppTemplatesInOrgs.java | 3 +- 85 files changed, 2623 insertions(+), 1896 deletions(-) create mode 100644 aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceDependenciesModule.java create mode 100644 aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2ImageSupplier.java rename compute/src/main/java/org/jclouds/compute/{stub/StubComputeServicePropertiesBuilder.java => StandaloneComputeServiceContextBuilder.java} (53%) rename compute/src/main/java/org/jclouds/compute/{stub/config/StubComputeServiceClientModule.java => config/StandaloneComputeServiceClientModule.java} (77%) create mode 100644 compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java create mode 100644 compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java create mode 100644 compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java create mode 100755 core/src/main/java/org/jclouds/collect/Memoized.java create mode 100644 gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceDependenciesModule.java create mode 100644 gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridDefaultLocationSupplier.java create mode 100644 rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceDependenciesModule.java rename rackspace/src/main/java/org/jclouds/rackspace/config/{RackspaceLocationsModule.java => RackspaceLocationsSupplier.java} (79%) create mode 100644 rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceDependenciesModule.java create mode 100644 rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingDefaultLocationSupplier.java create mode 100644 slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceDependenciesModule.java diff --git a/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/AtmosAsyncBlobStore.java b/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/AtmosAsyncBlobStore.java index e314ecf9f8..da6e552226 100644 --- a/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/AtmosAsyncBlobStore.java +++ b/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/AtmosAsyncBlobStore.java @@ -53,6 +53,7 @@ import org.jclouds.blobstore.functions.BlobToHttpGetOptions; import org.jclouds.blobstore.internal.BaseAsyncBlobStore; import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.concurrent.Futures; import org.jclouds.crypto.Crypto; import org.jclouds.domain.Location; @@ -81,9 +82,9 @@ public class AtmosAsyncBlobStore extends BaseAsyncBlobStore { @Inject AtmosAsyncBlobStore(BlobStoreContext context, BlobUtils blobUtils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier defaultLocation, - Supplier> locations, AtmosStorageAsyncClient async, AtmosStorageClient sync, - ObjectToBlob object2Blob, ObjectToBlobMetadata object2BlobMd, BlobToObject blob2Object, - BlobStoreListOptionsToListOptions container2ContainerListOptions, + @Memoized Supplier> locations, AtmosStorageAsyncClient async, + AtmosStorageClient sync, ObjectToBlob object2Blob, ObjectToBlobMetadata object2BlobMd, + BlobToObject blob2Object, BlobStoreListOptionsToListOptions container2ContainerListOptions, DirectoryEntryListToResourceMetadataList container2ResourceList, Crypto crypto, BlobToHttpGetOptions blob2ObjectGetOptions, Provider fetchBlobMetadataProvider) { super(context, blobUtils, service, defaultLocation, locations); diff --git a/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/AtmosBlobStore.java b/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/AtmosBlobStore.java index 73c29b4568..cb010d850c 100644 --- a/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/AtmosBlobStore.java +++ b/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/AtmosBlobStore.java @@ -45,6 +45,7 @@ import org.jclouds.blobstore.functions.BlobToHttpGetOptions; import org.jclouds.blobstore.internal.BaseBlobStore; import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.crypto.Crypto; import org.jclouds.domain.Location; import org.jclouds.http.options.GetOptions; @@ -68,7 +69,7 @@ public class AtmosBlobStore extends BaseBlobStore { @Inject AtmosBlobStore(BlobStoreContext context, BlobUtils blobUtils, Supplier defaultLocation, - Supplier> locations, AtmosStorageClient sync, ObjectToBlob object2Blob, + @Memoized Supplier> locations, AtmosStorageClient sync, ObjectToBlob object2Blob, ObjectToBlobMetadata object2BlobMd, BlobToObject blob2Object, BlobStoreListOptionsToListOptions container2ContainerListOptions, DirectoryEntryListToResourceMetadataList container2ResourceList, Crypto crypto, diff --git a/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/config/AtmosBlobStoreContextModule.java b/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/config/AtmosBlobStoreContextModule.java index 8183cdadd0..6355e22d96 100755 --- a/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/config/AtmosBlobStoreContextModule.java +++ b/atmos/src/main/java/org/jclouds/atmosonline/saas/blobstore/config/AtmosBlobStoreContextModule.java @@ -37,6 +37,7 @@ 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; @@ -72,6 +73,7 @@ public class AtmosBlobStoreContextModule extends AbstractModule { @Provides @Singleton + @Memoized Supplier> provideLocations(Supplier defaultLocation) { return Suppliers.> ofInstance(ImmutableSet.of(defaultLocation.get())); } diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java index dcb9619252..cc5bdd1d6d 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/EC2ComputeService.java @@ -24,8 +24,8 @@ import static org.jclouds.aws.ec2.util.EC2Utils.parseHandle; import static org.jclouds.util.Utils.checkNotEmpty; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; +import java.util.Map.Entry; import java.util.concurrent.ExecutorService; import javax.inject.Inject; @@ -42,6 +42,7 @@ import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions; import org.jclouds.aws.ec2.domain.KeyPair; import org.jclouds.aws.ec2.domain.PlacementGroup; import org.jclouds.aws.ec2.domain.PlacementGroup.State; +import org.jclouds.collect.Memoized; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; @@ -77,20 +78,20 @@ public class EC2ComputeService extends BaseComputeService { @Inject protected EC2ComputeService(ComputeServiceContext context, Map credentialStore, - Supplier> images, Supplier> sizes, - Supplier> locations, ListNodesStrategy listNodesStrategy, - GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, - RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, - Provider templateBuilderProvider, Provider templateOptionsProvider, - @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, EC2Client ec2Client, - Map credentialsMap, @Named("SECURITY") Map securityGroupMap, - @Named("PLACEMENT") Map placementGroupMap, - @Named("DELETED") Predicate placementGroupDeleted) { + @Memoized Supplier> images, @Memoized Supplier> sizes, + @Memoized Supplier> locations, ListNodesStrategy listNodesStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, + Provider templateBuilderProvider, Provider templateOptionsProvider, + @Named("NODE_RUNNING") Predicate nodeRunning, + @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, EC2Client ec2Client, + Map credentialsMap, @Named("SECURITY") Map securityGroupMap, + @Named("PLACEMENT") Map placementGroupMap, + @Named("DELETED") Predicate placementGroupDeleted) { super(context, credentialStore, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, - runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, - templateOptionsProvider, nodeRunning, nodeTerminated, utils, timeouts, executor); + runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, + templateOptionsProvider, nodeRunning, nodeTerminated, utils, timeouts, executor); this.ec2Client = ec2Client; this.credentialsMap = credentialsMap; this.securityGroupMap = securityGroupMap; @@ -106,8 +107,8 @@ public class EC2ComputeService extends BaseComputeService { 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)); + checkState(placementGroupDeleted.apply(new PlacementGroup(region, group, "cluster", State.PENDING)), String + .format("placementGroup region(%s) name(%s) failed to delete", region, group)); placementGroupMap.remove(new RegionAndName(region, tag)); logger.debug("<< deleted placementGroup(%s)", group); } catch (AWSResponseException e) { diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java index ad56c28f01..dd97e5bf22 100755 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java @@ -19,35 +19,19 @@ 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.Constants.PROPERTY_SESSION_INTERVAL; -import static org.jclouds.aws.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; -import static org.jclouds.aws.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; import static org.jclouds.compute.domain.OsFamily.AMZN_LINUX; import static org.jclouds.compute.domain.OsFamily.CENTOS; import static org.jclouds.compute.domain.OsFamily.UBUNTU; -import java.security.SecureRandom; import java.util.Map; import java.util.Set; -import java.util.concurrent.TimeUnit; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.aws.ec2.EC2AsyncClient; -import org.jclouds.aws.ec2.EC2Client; import org.jclouds.aws.ec2.compute.EC2ComputeService; import org.jclouds.aws.ec2.compute.domain.RegionAndName; -import org.jclouds.aws.ec2.compute.functions.CreatePlacementGroupIfNeeded; -import org.jclouds.aws.ec2.compute.functions.CreateSecurityGroupIfNeeded; -import org.jclouds.aws.ec2.compute.functions.CreateUniqueKeyPair; -import org.jclouds.aws.ec2.compute.functions.CredentialsForInstance; -import org.jclouds.aws.ec2.compute.functions.RegionAndIdToImage; -import org.jclouds.aws.ec2.compute.functions.RunningInstanceToNodeMetadata; -import org.jclouds.aws.ec2.compute.internal.EC2TemplateBuilderImpl; -import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions; import org.jclouds.aws.ec2.compute.strategy.EC2DestroyLoadBalancerStrategy; import org.jclouds.aws.ec2.compute.strategy.EC2DestroyNodeStrategy; import org.jclouds.aws.ec2.compute.strategy.EC2GetNodeMetadataStrategy; @@ -56,27 +40,15 @@ import org.jclouds.aws.ec2.compute.strategy.EC2LoadBalanceNodesStrategy; import org.jclouds.aws.ec2.compute.strategy.EC2RebootNodeStrategy; import org.jclouds.aws.ec2.compute.strategy.EC2RunNodesAndAddToSetStrategy; import org.jclouds.aws.ec2.compute.suppliers.EC2HardwareSupplier; +import org.jclouds.aws.ec2.compute.suppliers.EC2ImageSupplier; import org.jclouds.aws.ec2.compute.suppliers.EC2LocationSupplier; import org.jclouds.aws.ec2.compute.suppliers.RegionAndNameToImageSupplier; -import org.jclouds.aws.ec2.domain.InstanceState; -import org.jclouds.aws.ec2.domain.KeyPair; -import org.jclouds.aws.ec2.domain.PlacementGroup; -import org.jclouds.aws.ec2.domain.RunningInstance; -import org.jclouds.aws.ec2.predicates.InstancePresent; -import org.jclouds.aws.ec2.predicates.PlacementGroupAvailable; -import org.jclouds.aws.ec2.predicates.PlacementGroupDeleted; -import org.jclouds.aws.suppliers.DefaultLocationSupplier; -import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.config.ComputeServiceTimeoutsModule; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.internal.ComputeServiceContextImpl; -import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.compute.strategy.DestroyLoadBalancerStrategy; import org.jclouds.compute.strategy.DestroyNodeStrategy; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; @@ -84,27 +56,14 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.LoadBalanceNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; -import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; -import org.jclouds.predicates.RetryablePredicate; -import org.jclouds.rest.RestContext; import org.jclouds.rest.annotations.Provider; -import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Splitter; import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.MapMaker; -import com.google.common.collect.Sets; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Provides; -import com.google.inject.Scopes; -import com.google.inject.TypeLiteral; /** * Configures the {@link ComputeServiceContext}; requires {@link EC2ComputeService} bound. @@ -112,78 +71,10 @@ import com.google.inject.TypeLiteral; * @author Adrian Cole */ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextModule { - - public static final Map instanceToNodeState = ImmutableMap - . builder().put(InstanceState.PENDING, NodeState.PENDING) - .put(InstanceState.RUNNING, NodeState.RUNNING).put(InstanceState.SHUTTING_DOWN, NodeState.PENDING) - .put(InstanceState.TERMINATED, NodeState.TERMINATED).put(InstanceState.STOPPING, NodeState.PENDING) - .put(InstanceState.STOPPED, NodeState.SUSPENDED).put(InstanceState.UNRECOGNIZED, NodeState.UNRECOGNIZED) - .build(); - - @Singleton - @Provides - Map provideServerToNodeState() { - return instanceToNodeState; - } - - @Provides - @Singleton - @Named("PRESENT") - protected Predicate instancePresent(InstancePresent present) { - 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() { - install(new ComputeServiceTimeoutsModule()); - bind(TemplateBuilder.class).to(EC2TemplateBuilderImpl.class); - bind(TemplateOptions.class).to(EC2TemplateOptions.class); - bind(ComputeService.class).to(EC2ComputeService.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); - bind(LoadBalanceNodesStrategy.class).to(EC2LoadBalanceNodesStrategy.class); - bind(DestroyLoadBalancerStrategy.class).to(EC2DestroyLoadBalancerStrategy.class); - bind(RunNodesAndAddToSetStrategy.class).to(EC2RunNodesAndAddToSetStrategy.class); - bind(ListNodesStrategy.class).to(EC2ListNodesStrategy.class); - bind(GetNodeMetadataStrategy.class).to(EC2GetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(EC2RebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(EC2DestroyNodeStrategy.class); - } - - @Provides - @Singleton - Supplier provideSuffix() { - return new Supplier() { - final SecureRandom random = new SecureRandom(); - - @Override - public String get() { - return random.nextInt(100) + ""; - } - }; - + install(new EC2ComputeServiceDependenciesModule()); + super.configure(); } @Override @@ -197,94 +88,82 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod return template.osFamily(AMZN_LINUX).os64Bit(true); } - @Provides - @Singleton - protected final Map credentialsMap(CreateUniqueKeyPair in) { - // doesn't seem to clear when someone issues remove(key) - // return new MapMaker().makeComputingMap(in); - return newLinkedHashMap(); - } - - @Provides - @Singleton - @Named("SECURITY") - protected final Map securityGroupMap(CreateSecurityGroupIfNeeded in) { - // doesn't seem to clear when someone issues remove(key) - // return new MapMaker().makeComputingMap(in); - 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 - @Named(PROPERTY_EC2_AMI_OWNERS) - String[] amiOwners(@Named(PROPERTY_EC2_AMI_OWNERS) String amiOwners) { - if (amiOwners.trim().equals("")) - return new String[] {}; - 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 - protected Map provideImageMap(RegionAndIdToImage regionAndIdToImage) { - return new MapMaker().makeComputingMap(regionAndIdToImage); - } - @Provides @Singleton protected Supplier> provideRegionAndNameToImageSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final RegionAndNameToImageSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final RegionAndNameToImageSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); + authException, seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); } @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - Supplier> map = injector.getInstance(Key - .get(new TypeLiteral>>() { - })); - return Suppliers.compose(new Function, Set>() { - @Override - public Set apply(Map from) { - return Sets.newLinkedHashSet(from.values()); - } - }, map); + protected void bindLoadBalancerService() { + bind(LoadBalanceNodesStrategy.class).to(EC2LoadBalanceNodesStrategy.class); + bind(DestroyLoadBalancerStrategy.class).to(EC2DestroyLoadBalancerStrategy.class); } @Override - protected Supplier> getSourceLocationSupplier(Injector injector) { - return injector.getInstance(EC2LocationSupplier.class); + protected Class defineRunNodesAndAddToSetStrategy() { + return EC2RunNodesAndAddToSetStrategy.class; + } + + /** + * not needed, as {@link EC2RunNodesAndAddToSetStrategy} is used and is already set-based. + */ + @Override + protected Class defineAddNodeWithTagStrategy() { + return null; + } + + /** + * not needed, as {@link EC2RunNodesAndAddToSetStrategy} is used and is already set-based. + */ + @Override + protected void bindAddNodeWithTagStrategy(Class clazz) { } @Override - protected Supplier> getSourceSizeSupplier(Injector injector) { - return injector.getInstance(EC2HardwareSupplier.class); + protected Class defineDestroyNodeStrategy() { + return EC2DestroyNodeStrategy.class; } @Override - protected Supplier supplyDefaultLocation(Injector injector, Supplier> locations) { - return injector.getInstance(DefaultLocationSupplier.class); + protected Class defineGetNodeMetadataStrategy() { + return EC2GetNodeMetadataStrategy.class; + } + + @Override + protected Class>> defineHardwareSupplier() { + return EC2HardwareSupplier.class; + } + + @Override + protected Class>> defineImageSupplier() { + return EC2ImageSupplier.class; + } + + @Override + protected Class defineListNodesStrategy() { + return EC2ListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return EC2RebootNodeStrategy.class; + } + + @Override + protected Class> defineDefaultLocationSupplier() { + return org.jclouds.aws.suppliers.DefaultLocationSupplier.class; + } + + @Override + protected Class>> defineLocationSupplier() { + return EC2LocationSupplier.class; } } diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceDependenciesModule.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceDependenciesModule.java new file mode 100644 index 0000000000..0438d500fc --- /dev/null +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceDependenciesModule.java @@ -0,0 +1,198 @@ +/** + * + * 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.EC2Constants.PROPERTY_EC2_AMI_OWNERS; +import static org.jclouds.aws.ec2.reference.EC2Constants.PROPERTY_EC2_CC_AMIs; + +import java.security.SecureRandom; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.aws.ec2.EC2AsyncClient; +import org.jclouds.aws.ec2.EC2Client; +import org.jclouds.aws.ec2.compute.EC2ComputeService; +import org.jclouds.aws.ec2.compute.domain.RegionAndName; +import org.jclouds.aws.ec2.compute.functions.CreatePlacementGroupIfNeeded; +import org.jclouds.aws.ec2.compute.functions.CreateSecurityGroupIfNeeded; +import org.jclouds.aws.ec2.compute.functions.CreateUniqueKeyPair; +import org.jclouds.aws.ec2.compute.functions.CredentialsForInstance; +import org.jclouds.aws.ec2.compute.functions.RegionAndIdToImage; +import org.jclouds.aws.ec2.compute.functions.RunningInstanceToNodeMetadata; +import org.jclouds.aws.ec2.compute.internal.EC2TemplateBuilderImpl; +import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.aws.ec2.domain.InstanceState; +import org.jclouds.aws.ec2.domain.KeyPair; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.aws.ec2.domain.RunningInstance; +import org.jclouds.aws.ec2.predicates.InstancePresent; +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.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeState; +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.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.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.MapMaker; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; + +/** + * + * @author Adrian Cole + */ +public class EC2ComputeServiceDependenciesModule extends AbstractModule { + + public static final Map instanceToNodeState = ImmutableMap + . builder().put(InstanceState.PENDING, NodeState.PENDING).put( + InstanceState.RUNNING, NodeState.RUNNING).put(InstanceState.SHUTTING_DOWN, NodeState.PENDING).put( + InstanceState.TERMINATED, NodeState.TERMINATED).put(InstanceState.STOPPING, NodeState.PENDING) + .put(InstanceState.STOPPED, NodeState.SUSPENDED).put(InstanceState.UNRECOGNIZED, NodeState.UNRECOGNIZED) + .build(); + + @Singleton + @Provides + Map provideServerToNodeState() { + return instanceToNodeState; + } + + @Provides + @Singleton + @Named("PRESENT") + protected Predicate instancePresent(InstancePresent present) { + 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); + bind(TemplateOptions.class).to(EC2TemplateOptions.class); + bind(ComputeService.class).to(EC2ComputeService.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 + Supplier provideSuffix() { + return new Supplier() { + final SecureRandom random = new SecureRandom(); + + @Override + public String get() { + return random.nextInt(100) + ""; + } + }; + + } + + @Provides + @Singleton + protected final Map credentialsMap(CreateUniqueKeyPair in) { + // doesn't seem to clear when someone issues remove(key) + // return new MapMaker().makeComputingMap(in); + return newLinkedHashMap(); + } + + @Provides + @Singleton + @Named("SECURITY") + protected final Map securityGroupMap(CreateSecurityGroupIfNeeded in) { + // doesn't seem to clear when someone issues remove(key) + // return new MapMaker().makeComputingMap(in); + 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 + @Named(PROPERTY_EC2_AMI_OWNERS) + String[] amiOwners(@Named(PROPERTY_EC2_AMI_OWNERS) String amiOwners) { + if (amiOwners.trim().equals("")) + return new String[] {}; + 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 + protected Map provideImageMap(RegionAndIdToImage regionAndIdToImage) { + return new MapMaker().makeComputingMap(regionAndIdToImage); + } + +} diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java index d39f6d0d5f..e25b15d4b6 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/functions/ImageParser.java @@ -35,6 +35,7 @@ import javax.inject.Singleton; import org.jclouds.aws.ec2.domain.Image.Architecture; import org.jclouds.aws.ec2.domain.Image.ImageType; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.OperatingSystem; @@ -71,17 +72,17 @@ public class ImageParser implements Function> locations; @@ -91,7 +92,8 @@ public class ImageParser implements Function> locations, Supplier defaultLocation, @Provider String provider) { + @Memoized Supplier> locations, Supplier defaultLocation, + @Provider String provider) { this.credentialProvider = checkNotNull(credentialProvider, "credentialProvider"); this.locations = checkNotNull(locations, "locations"); this.defaultLocation = checkNotNull(defaultLocation, "defaultLocation"); @@ -109,7 +111,7 @@ public class ImageParser implements Function of("owner", from.getImageOwnerId(), "rootDeviceType", from - .getRootDeviceType().toString())); + .getRootDeviceType().toString())); OsFamily osFamily = parseOsFamilyOrNull(provider, from.getImageLocation()); String osName = null; @@ -150,7 +152,7 @@ public class ImageParser implements Function instanceToNodeState, - Map credentialStore, Map instanceToImage, - Supplier> locations, Supplier> hardware) { + Map credentialStore, Map instanceToImage, + @Memoized Supplier> locations, @Memoized Supplier> hardware) { this.locations = checkNotNull(locations, "locations"); this.hardware = checkNotNull(hardware, "hardware"); this.instanceToImage = checkNotNull(instanceToImage, "instanceToImage"); @@ -119,14 +120,15 @@ public class RunningInstanceToNodeMetadata implements Function addEBS(final RunningInstance instance, Iterable volumes) { Iterable ebsVolumes = Iterables.transform(instance.getEbsBlockDevices().entrySet(), - new Function, Volume>() { + new Function, Volume>() { - @Override - public Volume apply(Entry from) { - return new VolumeImpl(from.getValue().getVolumeId(), Volume.Type.SAN, null, from.getKey(), instance - .getRootDeviceName() != null && instance.getRootDeviceName().equals(from.getKey()), true); - } - }); + @Override + public Volume apply(Entry from) { + return new VolumeImpl(from.getValue().getVolumeId(), Volume.Type.SAN, null, from.getKey(), + instance.getRootDeviceName() != null + && instance.getRootDeviceName().equals(from.getKey()), true); + } + }); if (instance.getRootDeviceType() == RootDeviceType.EBS) { volumes = Iterables.filter(volumes, new Predicate() { @@ -158,7 +160,9 @@ public class RunningInstanceToNodeMetadata implements Function imageMap; @Inject - protected EC2TemplateBuilderImpl(Supplier> locations, Supplier> images, - Supplier> sizes, Supplier defaultLocation, - Provider optionsProvider, - @Named("DEFAULT") Provider defaultTemplateProvider, Map imageMap) { + protected EC2TemplateBuilderImpl(@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); this.imageMap = imageMap; } @@ -86,7 +87,8 @@ public class EC2TemplateBuilderImpl extends TemplateBuilderImpl { if (imageId != null) { String[] regionName = imageId.split("/"); checkArgument(regionName.length == 2, - "amazon image ids must include the region ( ex. us-east-1/ami-7ea24a17 ) you specified: " + imageId); + "amazon image ids must include the region ( ex. us-east-1/ami-7ea24a17 ) you specified: " + + imageId); RegionAndName key = new RegionAndName(regionName[0], regionName[1]); try { return imageMap.get(key); diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2HardwareSupplier.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2HardwareSupplier.java index 8bdf4e6615..36dc9d2552 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2HardwareSupplier.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2HardwareSupplier.java @@ -41,6 +41,7 @@ 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; @@ -66,8 +67,8 @@ public class EC2HardwareSupplier implements Supplier> { private final String providerName; @Inject - EC2HardwareSupplier(Supplier> locations, @Provider String providerName, - @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis) { + EC2HardwareSupplier(@Memoized Supplier> locations, @Provider String providerName, + @Named(PROPERTY_EC2_CC_AMIs) String[] ccAmis) { this.locations = locations; this.ccAmis = ccAmis; this.providerName = providerName; @@ -89,8 +90,8 @@ public class EC2HardwareSupplier implements Supplier> { sizes.add(cc1_4xlarge().location(location).supportsImageIds(ccAmi).build()); } sizes.addAll(ImmutableSet. of(t1_micro().build(), c1_medium().build(), c1_xlarge().build(), m1_large() - .build(), "nova".equals(providerName) ? m1_small().supportsImage(any()).build() : m1_small().build(), - m1_xlarge().build(), m2_xlarge().build(), m2_2xlarge().build(), m2_4xlarge().build())); + .build(), "nova".equals(providerName) ? m1_small().supportsImage(any()).build() : m1_small().build(), + m1_xlarge().build(), m2_xlarge().build(), m2_2xlarge().build(), m2_4xlarge().build())); return sizes; } } \ No newline at end of file diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2ImageSupplier.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2ImageSupplier.java new file mode 100644 index 0000000000..ee6fe4c0bd --- /dev/null +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/suppliers/EC2ImageSupplier.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.aws.ec2.compute.suppliers; + +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.aws.ec2.compute.domain.RegionAndName; +import org.jclouds.compute.domain.Image; + +import com.google.common.base.Supplier; +import com.google.common.collect.Sets; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class EC2ImageSupplier implements Supplier> { + private final Supplier> map; + + @Inject + EC2ImageSupplier(Supplier> map) { + this.map = map; + } + + @Override + public Set get() { + return Sets.newLinkedHashSet(map.get().values()); + } + +} \ No newline at end of file diff --git a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/S3AsyncBlobStore.java b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/S3AsyncBlobStore.java index 066657a7d5..fad2caa18b 100644 --- a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/S3AsyncBlobStore.java +++ b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/S3AsyncBlobStore.java @@ -55,6 +55,7 @@ import org.jclouds.blobstore.internal.BaseAsyncBlobStore; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.concurrent.Futures; import org.jclouds.domain.Location; import org.jclouds.http.options.GetOptions; @@ -85,7 +86,7 @@ public class S3AsyncBlobStore extends BaseAsyncBlobStore { @Inject S3AsyncBlobStore(BlobStoreContext context, BlobUtils blobUtils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier defaultLocation, - Supplier> locations, S3AsyncClient async, S3Client sync, + @Memoized Supplier> locations, S3AsyncClient async, S3Client sync, BucketToResourceMetadata bucket2ResourceMd, ContainerToBucketListOptions container2BucketListOptions, BucketToResourceList bucket2ResourceList, ObjectToBlob object2Blob, BlobToHttpGetOptions blob2ObjectGetOptions, BlobToObject blob2Object, ObjectToBlobMetadata object2BlobMd, diff --git a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/S3BlobStore.java b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/S3BlobStore.java index 930e9b47b8..369eeaf758 100644 --- a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/S3BlobStore.java +++ b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/S3BlobStore.java @@ -49,6 +49,7 @@ import org.jclouds.blobstore.internal.BaseBlobStore; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; import org.jclouds.http.options.GetOptions; import org.jclouds.util.Utils; @@ -75,10 +76,11 @@ public class S3BlobStore extends BaseBlobStore { @Inject S3BlobStore(BlobStoreContext context, BlobUtils blobUtils, Supplier defaultLocation, - Supplier> locations, S3Client sync, BucketToResourceMetadata bucket2ResourceMd, - ContainerToBucketListOptions container2BucketListOptions, BucketToResourceList bucket2ResourceList, - ObjectToBlob object2Blob, BlobToHttpGetOptions blob2ObjectGetOptions, BlobToObject blob2Object, - ObjectToBlobMetadata object2BlobMd, Provider fetchBlobMetadataProvider) { + @Memoized Supplier> locations, S3Client sync, + BucketToResourceMetadata bucket2ResourceMd, ContainerToBucketListOptions container2BucketListOptions, + BucketToResourceList bucket2ResourceList, ObjectToBlob object2Blob, + BlobToHttpGetOptions blob2ObjectGetOptions, BlobToObject blob2Object, ObjectToBlobMetadata object2BlobMd, + Provider fetchBlobMetadataProvider) { super(context, blobUtils, defaultLocation, locations); this.blob2ObjectGetOptions = checkNotNull(blob2ObjectGetOptions, "blob2ObjectGetOptions"); this.sync = checkNotNull(sync, "sync"); diff --git a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/config/S3BlobStoreContextModule.java b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/config/S3BlobStoreContextModule.java index 076cf69b61..9ca1d87698 100755 --- a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/config/S3BlobStoreContextModule.java +++ b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/config/S3BlobStoreContextModule.java @@ -37,6 +37,7 @@ 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; @@ -73,6 +74,7 @@ public class S3BlobStoreContextModule extends AbstractModule { @Provides @Singleton + @Memoized Supplier> provideLocations(@Region Set regions, @Provider String providerName) { Set locations = Sets.newHashSet(); Location s3 = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); diff --git a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/functions/BucketToResourceMetadata.java b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/functions/BucketToResourceMetadata.java index 59c38be173..1a91201aff 100644 --- a/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/functions/BucketToResourceMetadata.java +++ b/aws/core/src/main/java/org/jclouds/aws/s3/blobstore/functions/BucketToResourceMetadata.java @@ -33,6 +33,7 @@ import org.jclouds.blobstore.domain.MutableStorageMetadata; import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.domain.StorageType; import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl; +import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; @@ -54,7 +55,7 @@ public class BucketToResourceMetadata implements Function> locations) { + BucketToResourceMetadata(S3Client client, @Memoized Supplier> locations) { this.client = client; this.onlyLocation = locations.get().size() == 1 ? Iterables.get(locations.get(), 0) : null; this.locations = locations; diff --git a/aws/core/src/main/java/org/jclouds/aws/suppliers/DefaultLocationSupplier.java b/aws/core/src/main/java/org/jclouds/aws/suppliers/DefaultLocationSupplier.java index 5ea529cf6d..cec0d37e21 100644 --- a/aws/core/src/main/java/org/jclouds/aws/suppliers/DefaultLocationSupplier.java +++ b/aws/core/src/main/java/org/jclouds/aws/suppliers/DefaultLocationSupplier.java @@ -26,6 +26,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.aws.Region; +import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; @@ -42,7 +43,7 @@ public class DefaultLocationSupplier implements Supplier { private final Supplier> set; @Inject - DefaultLocationSupplier(@Region final String region, Supplier> set) { + DefaultLocationSupplier(@Region final String region, @Memoized Supplier> set) { this.region = region; this.set = set; } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2ComputeServiceTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2ComputeServiceTest.java index e865f9c6e4..3ebb28664d 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2ComputeServiceTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2ComputeServiceTest.java @@ -33,6 +33,7 @@ import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_2xlarge; import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_4xlarge; import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.m2_xlarge; import static org.jclouds.aws.ec2.compute.domain.EC2HardwareBuilder.t1_micro; +import static org.testng.Assert.assertEquals; import java.util.Set; @@ -58,7 +59,6 @@ import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableSet; -import static org.testng.Assert.assertEquals; /** * Tests compute service specifically to EC2. @@ -74,7 +74,7 @@ public class EC2ComputeServiceTest { private static final Location location = new LocationImpl(LocationScope.REGION, "us-east-1", "us east", null); public static final Hardware CC1_4XLARGE = cc1_4xlarge().location(location).supportsImageIds("us-east-1/cc-image") - .build(); + .build(); /** * Verifies that {@link TemplateBuilderImpl} would choose the correct size of the instance, based @@ -87,10 +87,10 @@ public class EC2ComputeServiceTest { Template template = newTemplateBuilder().os64Bit(true).hardwareId("m2.xlarge").locationId("us-east-1").build(); assert template != null : "The returned template was null, but it should have a value."; -// assert m2_xlarge().build().equals(template.getHardware()) : format( -// "Incorrect image determined by the template. Expected: %s. Found: %s.", "m2.xlarge", -// String.valueOf(template.getHardware())); - assertEquals( m2_xlarge().build(), template.getHardware()); + // assert m2_xlarge().build().equals(template.getHardware()) : format( + // "Incorrect image determined by the template. Expected: %s. Found: %s.", "m2.xlarge", + // String.valueOf(template.getHardware())); + assertEquals(m2_xlarge().build(), template.getHardware()); } @Test @@ -99,8 +99,8 @@ public class EC2ComputeServiceTest { assert template != null : "The returned template was null, but it should have a value."; assert CC1_4XLARGE.equals(template.getHardware()) : format( - "Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE.getId(), - String.valueOf(template.getHardware())); + "Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE.getId(), String + .valueOf(template.getHardware())); } /** @@ -111,13 +111,13 @@ public class EC2ComputeServiceTest { */ @Test public void testTemplateChoiceForInstanceByAttributes() throws Exception { - Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.5).smallest() - .locationId("us-east-1").build(); + Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.5).smallest().locationId( + "us-east-1").build(); assert template != null : "The returned template was null, but it should have a value."; assert CC1_4XLARGE.equals(template.getHardware()) : format( - "Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE, - String.valueOf(template.getHardware())); + "Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE, String + .valueOf(template.getHardware())); } /** @@ -130,13 +130,13 @@ public class EC2ComputeServiceTest { */ @Test public void testNegativeTemplateChoiceForInstanceByAttributes() throws Exception { - Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.7).smallest() - .locationId("us-east-1").build(); + Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.7).smallest().locationId( + "us-east-1").build(); assert template != null : "The returned template was null, but it should have a value."; assert !m2_xlarge().build().equals(template.getHardware()) : format( - "Incorrect image determined by the template. Expected: not %s. Found: %s.", "m2.xlarge", - String.valueOf(template.getHardware())); + "Incorrect image determined by the template. Expected: not %s. Found: %s.", "m2.xlarge", String + .valueOf(template.getHardware())); } @SuppressWarnings("unchecked") @@ -148,23 +148,22 @@ public class EC2ComputeServiceTest { expect(optionsProvider.get()).andReturn(defaultOptions); - Image image = new ImageBuilder().providerId("cc-image").name("image").id("us-east-1/cc-image") - .location(location) - .operatingSystem(new OperatingSystem(OsFamily.UBUNTU, null, "1.0", null, "ubuntu", true)) - .description("description").version("1.0").defaultCredentials(new Credentials("root", null)).build(); + Image image = new ImageBuilder().providerId("cc-image").name("image").id("us-east-1/cc-image").location(location) + .operatingSystem(new OperatingSystem(OsFamily.UBUNTU, null, "1.0", null, "ubuntu", true)).description( + "description").version("1.0").defaultCredentials(new Credentials("root", null)).build(); replay(optionsProvider); replay(templateBuilderProvider); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); + . of(location)); Supplier> images = Suppliers.> ofInstance(ImmutableSet - . of(image)); + . of(image)); Supplier> sizes = Suppliers.> ofInstance(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(), - CC1_4XLARGE)); + . 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(), CC1_4XLARGE)); return new TemplateBuilderImpl(locations, images, sizes, Suppliers.ofInstance(location), optionsProvider, - templateBuilderProvider) { + templateBuilderProvider) { }; } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstanceTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstanceTest.java index 28664cde04..37f4ba9c91 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstanceTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/CredentialsForInstanceTest.java @@ -85,7 +85,7 @@ public class CredentialsForInstanceTest { // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = createMock(ConcurrentMap.class); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m1_small().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -97,7 +97,7 @@ public class CredentialsForInstanceTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1d", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(location)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); // @@ -180,7 +180,7 @@ public class CredentialsForInstanceTest { // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = createMock(ConcurrentMap.class); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m1_small().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -192,7 +192,7 @@ public class CredentialsForInstanceTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(region)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); // @@ -264,7 +264,7 @@ public class CredentialsForInstanceTest { // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = createMock(ConcurrentMap.class); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m1_small().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -276,7 +276,7 @@ public class CredentialsForInstanceTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(region)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); // @@ -339,7 +339,7 @@ public class CredentialsForInstanceTest { // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = createMock(ConcurrentMap.class); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m1_small().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -350,7 +350,7 @@ public class CredentialsForInstanceTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(region)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); // @@ -426,9 +426,9 @@ public class CredentialsForInstanceTest { // ConcurrentMap imageMap = createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(location)); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -487,9 +487,9 @@ public class CredentialsForInstanceTest { // ConcurrentMap imageMap = createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(location)); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -549,9 +549,9 @@ public class CredentialsForInstanceTest { // ConcurrentMap imageMap = createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(location)); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -616,9 +616,9 @@ public class CredentialsForInstanceTest { // ConcurrentMap imageMap = createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(location)); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -677,9 +677,9 @@ public class CredentialsForInstanceTest { // ConcurrentMap imageMap = createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(location)); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -736,7 +736,7 @@ public class CredentialsForInstanceTest { // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = createMock(ConcurrentMap.class); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -748,7 +748,7 @@ public class CredentialsForInstanceTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(location)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); // @@ -810,7 +810,7 @@ public class CredentialsForInstanceTest { // expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce(); // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = createMock(ConcurrentMap.class); -// Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class); // RunningInstance instance = createMock(RunningInstance.class); @@ -822,7 +822,7 @@ public class CredentialsForInstanceTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); -// Supplier> locations = Suppliers.> ofInstance(ImmutableSet +// @Memoized Supplier> locations = Suppliers.> ofInstance(ImmutableSet // . of(location)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); // diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java index 8ddf849bf5..b1ecab6ad0 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java @@ -26,7 +26,7 @@ import java.net.UnknownHostException; import java.util.Map; import java.util.Set; -import org.jclouds.aws.ec2.compute.config.EC2ComputeServiceContextModule; +import org.jclouds.aws.ec2.compute.config.EC2ComputeServiceDependenciesModule; import org.jclouds.aws.ec2.compute.domain.RegionAndName; import org.jclouds.aws.ec2.domain.InstanceState; import org.jclouds.aws.ec2.domain.RunningInstance; @@ -61,7 +61,7 @@ public class RunningInstanceToNodeMetadataTest { public void testAllStatesCovered() { for (InstanceState state : InstanceState.values()) { - assert EC2ComputeServiceContextModule.instanceToNodeState.containsKey(state) : state; + assert EC2ComputeServiceDependenciesModule.instanceToNodeState.containsKey(state) : state; } } @@ -70,101 +70,86 @@ public class RunningInstanceToNodeMetadataTest { @Test public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationNotFoundButCredentialsFound() - throws UnknownHostException { + throws UnknownHostException { Credentials creds = new Credentials("root", "abdce"); - RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), - ImmutableSet. of(), ImmutableSet. of(), - ImmutableMap. of("us-east-1/i-9slweygo", creds)); + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet + . of(), ImmutableSet. of(), ImmutableMap. of( + "us-east-1/i-9slweygo", creds)); RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213").id("us-east-1/i-9slweygo").providerId("i-9slweygo").build()); + 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-25CB1213").id("us-east-1/i-9slweygo") + .providerId("i-9slweygo").build()); } @Test public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationNotFound() throws UnknownHostException { - RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), - ImmutableSet. of(), ImmutableSet. of(), ImmutableMap. of()); + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet + . of(), ImmutableSet. of(), ImmutableMap. of()); RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213").id("us-east-1/i-9slweygo").providerId("i-9slweygo").build()); + 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-25CB1213").id("us-east-1/i-9slweygo").providerId("i-9slweygo").build()); } @Test public void testApplyWhereTagDoesntMatchAndLocationFoundAndImageAndHardwareNotFound() throws UnknownHostException { RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet.of(provider), - ImmutableSet. of(), ImmutableMap. of()); + ImmutableSet. of(), ImmutableMap. of()); RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213").id("us-east-1/i-9slweygo") - .providerId("i-9slweygo").location(provider).build()); + 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-25CB1213").id( + "us-east-1/i-9slweygo").providerId("i-9slweygo").location(provider).build()); } @Test public void testApplyWhereTagDoesntMatchAndImageAndLocationFoundAndHardwareNotFound() throws UnknownHostException { RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet. of(), ImmutableSet.of(provider), - ImageParserTest.convertImages("/ec2/nova_images.xml"), ImmutableMap. of()); + ImageParserTest.convertImages("/ec2/nova_images.xml"), ImmutableMap. of()); RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213") - .operatingSystem( + 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-25CB1213") + .operatingSystem( new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("9.10").arch("paravirtual") - .description("nebula/ubuntu-karmic").is64Bit(true).build()).id("us-east-1/i-9slweygo") - .providerId("i-9slweygo").location(provider).build()); + .description("nebula/ubuntu-karmic").is64Bit(true).build()).id("us-east-1/i-9slweygo") + .providerId("i-9slweygo").location(provider).build()); } @Test public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationFound() throws UnknownHostException { - RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.of(m1_small().build()), - ImmutableSet.of(provider), ImageParserTest.convertImages("/ec2/nova_images.xml"), - ImmutableMap. of()); + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.of(m1_small().build()), ImmutableSet + .of(provider), ImageParserTest.convertImages("/ec2/nova_images.xml"), ImmutableMap + . of()); RunningInstance server = firstInstanceFromResource("/ec2/describe_instances_nova.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-25CB1213") - .hardware(m1_small().build()) - .operatingSystem( - new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("9.10").arch("paravirtual") - .description("nebula/ubuntu-karmic").is64Bit(true).build()).id("us-east-1/i-9slweygo") - .providerId("i-9slweygo").location(provider).build()); + 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-25CB1213").hardware( + m1_small().build()).operatingSystem( + new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("9.10").arch("paravirtual").description( + "nebula/ubuntu-karmic").is64Bit(true).build()).id("us-east-1/i-9slweygo").providerId( + "i-9slweygo").location(provider).build()); } protected RunningInstance firstInstanceFromResource(String resource) { - RunningInstance server = Iterables.get( - Iterables.get(DescribeInstancesResponseHandlerTest.parseRunningInstances(resource), 0), 0); + RunningInstance server = Iterables.get(Iterables.get(DescribeInstancesResponseHandlerTest + .parseRunningInstances(resource), 0), 0); return server; } protected RunningInstanceToNodeMetadata createNodeParser(final ImmutableSet hardware, - final ImmutableSet locations, Set images, - Map credentialStore) { - Map instanceToNodeState = EC2ComputeServiceContextModule.instanceToNodeState; + final ImmutableSet locations, Set images, + Map credentialStore) { + Map instanceToNodeState = EC2ComputeServiceDependenciesModule.instanceToNodeState; Map instanceToImage = Maps.uniqueIndex(images, new Function() { @@ -191,7 +176,7 @@ public class RunningInstanceToNodeMetadataTest { }; RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(instanceToNodeState, credentialStore, - instanceToImage, locationSupplier, hardwareSupplier); + instanceToImage, locationSupplier, hardwareSupplier); return parser; } @@ -207,7 +192,7 @@ public class RunningInstanceToNodeMetadataTest { // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = // createMock(ConcurrentMap.class); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m1_small().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -221,7 +206,7 @@ public class RunningInstanceToNodeMetadataTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1d", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(location)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); @@ -313,7 +298,7 @@ public class RunningInstanceToNodeMetadataTest { // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = // createMock(ConcurrentMap.class); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m1_small().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -327,7 +312,7 @@ public class RunningInstanceToNodeMetadataTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(region)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); @@ -406,7 +391,7 @@ public class RunningInstanceToNodeMetadataTest { // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = // createMock(ConcurrentMap.class); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m1_small().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -420,7 +405,7 @@ public class RunningInstanceToNodeMetadataTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(region)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); @@ -489,7 +474,7 @@ public class RunningInstanceToNodeMetadataTest { // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = // createMock(ConcurrentMap.class); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m1_small().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -502,7 +487,7 @@ public class RunningInstanceToNodeMetadataTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location region = new LocationImpl(LocationScope.REGION, "us-east-1", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(region)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); @@ -585,10 +570,10 @@ public class RunningInstanceToNodeMetadataTest { // createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(location)); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -651,10 +636,10 @@ public class RunningInstanceToNodeMetadataTest { // createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(location)); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -719,10 +704,10 @@ public class RunningInstanceToNodeMetadataTest { // createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(location)); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -794,10 +779,10 @@ public class RunningInstanceToNodeMetadataTest { // createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(location)); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -861,10 +846,10 @@ public class RunningInstanceToNodeMetadataTest { // createMock(ConcurrentMap.class); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(location)); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -926,7 +911,7 @@ public class RunningInstanceToNodeMetadataTest { // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = // createMock(ConcurrentMap.class); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -940,7 +925,7 @@ public class RunningInstanceToNodeMetadataTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(location)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); @@ -1006,7 +991,7 @@ public class RunningInstanceToNodeMetadataTest { // Map credentialsMap = createMock(Map.class); // ConcurrentMap imageMap = // createMock(ConcurrentMap.class); - // Supplier> hardwares = Suppliers.> + // @Memoized Supplier> hardwares = Suppliers.> // ofInstance(ImmutableSet // . of(m2_4xlarge().build())); // PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = @@ -1021,7 +1006,7 @@ public class RunningInstanceToNodeMetadataTest { // expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING); // // Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null); - // Supplier> locations = Suppliers.> + // @Memoized Supplier> locations = Suppliers.> // ofInstance(ImmutableSet // . of(location)); // org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class); diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/internal/EC2TemplateBuilderImplTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/internal/EC2TemplateBuilderImplTest.java index 72b4598821..fc1cdaa1cd 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/internal/EC2TemplateBuilderImplTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/internal/EC2TemplateBuilderImplTest.java @@ -34,6 +34,7 @@ import javax.inject.Provider; import org.jclouds.aws.ec2.compute.domain.RegionAndName; import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.OperatingSystem; @@ -67,22 +68,22 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { @Override protected EC2TemplateBuilderImpl createTemplateBuilder(final Image knownImage, - Supplier> locations, Supplier> images, - Supplier> sizes, Location defaultLocation, Provider optionsProvider, - Provider templateBuilderProvider) { + @Memoized Supplier> locations, @Memoized Supplier> images, + @Memoized Supplier> sizes, Location defaultLocation, + Provider optionsProvider, Provider templateBuilderProvider) { final RegionAndName knownRegionAndName = new RegionAndName("region", "ami"); ConcurrentMap imageMap = new MapMaker() - .makeComputingMap(new Function() { - @Override - public Image apply(RegionAndName from) { - return from.equals(knownRegionAndName) ? knownImage : null; - } + .makeComputingMap(new Function() { + @Override + public Image apply(RegionAndName from) { + return from.equals(knownRegionAndName) ? knownImage : null; + } - }); + }); return new EC2TemplateBuilderImpl(locations, images, sizes, Suppliers.ofInstance(defaultLocation), - optionsProvider, templateBuilderProvider, imageMap); + optionsProvider, templateBuilderProvider, imageMap); } @SuppressWarnings("unchecked") @@ -91,11 +92,11 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { Location location = new LocationImpl(LocationScope.REGION, "region", "region", null); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); + . of(location)); Supplier> images = Suppliers.> ofInstance(Sets - . newLinkedHashSet()); + . newLinkedHashSet()); Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(c1_medium().build())); + . of(c1_medium().build())); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -127,7 +128,7 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(knownImage, locations, images, sizes, location, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); assertEquals(template.imageId("region/ami").build().getImage(), knownImage); @@ -144,10 +145,10 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { Location location = new LocationImpl(LocationScope.REGION, "region", "region", null); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); + . of(location)); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(c1_medium().build())); + . of(c1_medium().build())); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -162,7 +163,7 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(knownImage, locations, images, sizes, location, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); try { template.imageId("ami").build(); assert false; @@ -181,10 +182,10 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { Location location = new LocationImpl(LocationScope.REGION, "region", "region", null); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(location)); + . of(location)); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> sizes = Suppliers.> ofInstance(ImmutableSet - . of(c1_medium().build())); + . of(c1_medium().build())); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); @@ -202,7 +203,7 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(knownImage, locations, images, sizes, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); assertEquals(template.imageId("region/bad").build().getImage(), knownImage); diff --git a/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/AzureAsyncBlobStore.java b/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/AzureAsyncBlobStore.java index deff8df23d..5fbc2b3b1f 100644 --- a/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/AzureAsyncBlobStore.java +++ b/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/AzureAsyncBlobStore.java @@ -53,6 +53,7 @@ import org.jclouds.blobstore.functions.BlobToHttpGetOptions; import org.jclouds.blobstore.internal.BaseAsyncBlobStore; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.concurrent.Futures; import org.jclouds.domain.Location; import org.jclouds.http.options.GetOptions; @@ -79,7 +80,7 @@ public class AzureAsyncBlobStore extends BaseAsyncBlobStore { @Inject AzureAsyncBlobStore(BlobStoreContext context, BlobUtils blobUtils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier defaultLocation, - Supplier> locations, AzureBlobAsyncClient async, + @Memoized Supplier> locations, AzureBlobAsyncClient async, ContainerToResourceMetadata container2ResourceMd, ListOptionsToListBlobsOptions blobStore2AzureContainerListOptions, ListBlobsResponseToResourceList azure2BlobStoreResourceList, AzureBlobToBlob azureBlob2Blob, diff --git a/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/AzureBlobStore.java b/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/AzureBlobStore.java index f88ff553ad..7a70b8c66f 100644 --- a/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/AzureBlobStore.java +++ b/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/AzureBlobStore.java @@ -47,6 +47,7 @@ import org.jclouds.blobstore.functions.BlobToHttpGetOptions; import org.jclouds.blobstore.internal.BaseBlobStore; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; import org.jclouds.http.options.GetOptions; @@ -70,7 +71,7 @@ public class AzureBlobStore extends BaseBlobStore { @Inject AzureBlobStore(BlobStoreContext context, BlobUtils blobUtils, Supplier defaultLocation, - Supplier> locations, AzureBlobClient sync, + @Memoized Supplier> locations, AzureBlobClient sync, ContainerToResourceMetadata container2ResourceMd, ListOptionsToListBlobsOptions blobStore2AzureContainerListOptions, ListBlobsResponseToResourceList azure2BlobStoreResourceList, AzureBlobToBlob azureBlob2Blob, diff --git a/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/config/AzureBlobStoreContextModule.java b/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/config/AzureBlobStoreContextModule.java index b2559f613d..da5e50669b 100755 --- a/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/config/AzureBlobStoreContextModule.java +++ b/azure/src/main/java/org/jclouds/azure/storage/blob/blobstore/config/AzureBlobStoreContextModule.java @@ -37,6 +37,7 @@ 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; @@ -71,6 +72,7 @@ public class AzureBlobStoreContextModule extends AbstractModule { @Provides @Singleton + @Memoized Supplier> provideLocations(Supplier defaultLocation) { return Suppliers.> ofInstance(ImmutableSet.of(defaultLocation.get())); } diff --git a/blobstore/src/main/java/org/jclouds/blobstore/TransientAsyncBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/TransientAsyncBlobStore.java index 8fc18d1b17..5b2bae075b 100755 --- a/blobstore/src/main/java/org/jclouds/blobstore/TransientAsyncBlobStore.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/TransientAsyncBlobStore.java @@ -78,6 +78,7 @@ import org.jclouds.blobstore.options.GetOptions; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.strategy.IfDirectoryReturnNameStrategy; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.crypto.Crypto; import org.jclouds.crypto.CryptoStreams; import org.jclouds.date.DateService; @@ -127,7 +128,7 @@ public class TransientAsyncBlobStore extends BaseAsyncBlobStore { HttpGetOptionsListToGetOptions httpGetOptionsConverter, IfDirectoryReturnNameStrategy ifDirectoryReturnName, Blob.Factory blobFactory, BlobUtils blobUtils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier defaultLocation, - Supplier> locations) { + @Memoized Supplier> locations) { super(context, blobUtils, service, defaultLocation, locations); this.blobFactory = blobFactory; this.dateService = dateService; 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 0c827ed4c7..7c76b8b6d1 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/config/TransientBlobStoreContextModule.java @@ -34,6 +34,7 @@ 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; @@ -81,6 +82,7 @@ public class TransientBlobStoreContextModule extends AbstractModule { @Provides @Singleton + @Memoized Supplier> provideLocations(Supplier defaultLocation) { return Suppliers.> ofInstance(ImmutableSet.of(defaultLocation.get())); } diff --git a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseAsyncBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseAsyncBlobStore.java index 2583a0648e..7f9cea4159 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseAsyncBlobStore.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseAsyncBlobStore.java @@ -39,6 +39,7 @@ import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.util.BlobUtils; import org.jclouds.blobstore.util.internal.BlobUtilsImpl; +import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; import org.jclouds.util.Utils; @@ -61,7 +62,7 @@ public abstract class BaseAsyncBlobStore implements AsyncBlobStore { @Inject protected BaseAsyncBlobStore(BlobStoreContext context, BlobUtils blobUtils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier defaultLocation, - Supplier> locations) { + @Memoized Supplier> locations) { this.context = checkNotNull(context, "context"); this.blobUtils = checkNotNull(blobUtils, "blobUtils"); this.service = checkNotNull(service, "service"); @@ -267,5 +268,4 @@ public abstract class BaseAsyncBlobStore implements AsyncBlobStore { protected abstract boolean deleteAndVerifyContainerGone(String container); - } diff --git a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java index 3929a63b81..736b8c56f9 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java @@ -35,6 +35,7 @@ import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.util.BlobUtils; import org.jclouds.blobstore.util.internal.BlobUtilsImpl; +import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; import org.jclouds.util.Utils; @@ -53,7 +54,7 @@ public abstract class BaseBlobStore implements BlobStore { @Inject protected BaseBlobStore(BlobStoreContext context, BlobUtils blobUtils, Supplier defaultLocation, - Supplier> locations) { + @Memoized Supplier> locations) { this.context = checkNotNull(context, "context"); this.blobUtils = checkNotNull(blobUtils, "blobUtils"); this.defaultLocation = checkNotNull(defaultLocation, "defaultLocation"); diff --git a/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java b/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java index bbca09154b..41987094b9 100644 --- a/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java +++ b/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java @@ -26,9 +26,12 @@ import java.util.Properties; import javax.annotation.Nullable; +import org.jclouds.PropertiesBuilder; +import org.jclouds.compute.config.StandaloneComputeServiceContextModule; import org.jclouds.rest.RestContextFactory; import org.jclouds.rest.RestContextFactory.ContextSpec; +import com.google.common.collect.ImmutableSet; import com.google.inject.Module; /** @@ -41,8 +44,8 @@ public class ComputeServiceContextFactory { private final RestContextFactory contextFactory; /** - * Initializes with the default properties built-in to jclouds. This is - * typically stored in the classpath resource {@code rest.properties} + * Initializes with the default properties built-in to jclouds. This is typically stored in the + * classpath resource {@code rest.properties} * * @see RestContextFactory#getPropertiesFromResource */ @@ -59,15 +62,14 @@ public class ComputeServiceContextFactory { /** * - * Uses the supplied RestContextFactory to create - * {@link ComputeServiceContext}s + * Uses the supplied RestContextFactory to create {@link ComputeServiceContext}s */ public ComputeServiceContextFactory(RestContextFactory restContextFactory) { this.contextFactory = restContextFactory; } public static ComputeServiceContext buildContextUnwrappingExceptions( - ComputeServiceContextBuilder builder) { + ComputeServiceContextBuilder builder) { try { return builder.buildComputeServiceContext(); } catch (Exception e) { @@ -80,7 +82,7 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(String provider, String identity, String credential) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, identity, credential)); + .createContextBuilder(provider, identity, credential)); return buildContextUnwrappingExceptions(builder); } @@ -89,7 +91,7 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(String provider, Properties overrides) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, overrides)); + .createContextBuilder(provider, overrides)); return buildContextUnwrappingExceptions(builder); } @@ -98,30 +100,28 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(String provider, Iterable modules, Properties overrides) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, modules, overrides)); + .createContextBuilder(provider, modules, overrides)); return buildContextUnwrappingExceptions(builder); } /** - * @see RestContextFactory#createContextBuilder(String, String,String, - * Iterable) + * @see RestContextFactory#createContextBuilder(String, String,String, Iterable) */ public ComputeServiceContext createContext(String provider, @Nullable String identity, @Nullable String credential, - Iterable modules) { + Iterable modules) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, identity, credential, modules)); + .createContextBuilder(provider, identity, credential, modules)); return buildContextUnwrappingExceptions(builder); } /** - * @see RestContextFactory#createContextBuilder(String, String,String, - * Iterable, Properties) + * @see RestContextFactory#createContextBuilder(String, String,String, Iterable, Properties) */ public ComputeServiceContext createContext(String provider, @Nullable String identity, @Nullable String credential, - Iterable modules, Properties overrides) { + Iterable modules, Properties overrides) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, identity, credential, modules, overrides)); + .createContextBuilder(provider, identity, credential, modules, overrides)); return buildContextUnwrappingExceptions(builder); } @@ -130,7 +130,7 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(ContextSpec contextSpec) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class - .cast(createContextBuilder(contextSpec)); + .cast(createContextBuilder(contextSpec)); return buildContextUnwrappingExceptions(builder); } @@ -140,8 +140,21 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(ContextSpec contextSpec, Properties overrides) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(createContextBuilder( - contextSpec, overrides)); + contextSpec, overrides)); return buildContextUnwrappingExceptions(builder); } + public static ComputeServiceContext createStandaloneContext(StandaloneComputeServiceContextModule contextModule) { + return createStandaloneContext(contextModule, ImmutableSet. of()); + } + + @SuppressWarnings("unchecked") + public static ComputeServiceContext createStandaloneContext(StandaloneComputeServiceContextModule contextModule, + Iterable modules) { + return new ComputeServiceContextFactory().createContext(RestContextFactory + . contextSpec("standalone", "standalone", "1", "standalone", null, + (Class) null, (Class) null, PropertiesBuilder.class, + (Class) StandaloneComputeServiceContextBuilder.class, ImmutableSet. builder().add( + contextModule).addAll(modules).build())); + } } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/stub/StubComputeServicePropertiesBuilder.java b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java similarity index 53% rename from compute/src/main/java/org/jclouds/compute/stub/StubComputeServicePropertiesBuilder.java rename to compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java index babaa8066d..5c4f8041b2 100644 --- a/compute/src/main/java/org/jclouds/compute/stub/StubComputeServicePropertiesBuilder.java +++ b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java @@ -17,41 +17,39 @@ * ==================================================================== */ -package org.jclouds.compute.stub; +package org.jclouds.compute; import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; import static org.jclouds.Constants.PROPERTY_IDENTITY; -import java.net.URI; +import java.util.List; import java.util.Properties; -import org.jclouds.PropertiesBuilder; +import org.jclouds.compute.config.StandaloneComputeServiceClientModule; + +import com.google.inject.Module; /** - * Builds properties used in stub compute services * * @author Adrian Cole */ -public class StubComputeServicePropertiesBuilder extends PropertiesBuilder { +public class StandaloneComputeServiceContextBuilder extends + ComputeServiceContextBuilder { + + public StandaloneComputeServiceContextBuilder(Properties props) { + super(ComputeService.class, ComputeService.class, props); + if (!properties.containsKey(PROPERTY_ENDPOINT)) + properties.setProperty(PROPERTY_ENDPOINT, "standalone"); + if (!properties.containsKey(PROPERTY_API_VERSION)) + properties.setProperty(PROPERTY_API_VERSION, "1"); + if (!properties.containsKey(PROPERTY_IDENTITY)) + properties.setProperty(PROPERTY_IDENTITY, System.getProperty("user.name")); + } + @Override - protected Properties defaultProperties() { - Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_ENDPOINT, "http://localhost/stub"); - properties.setProperty(PROPERTY_API_VERSION, "1"); - properties.setProperty(PROPERTY_IDENTITY, System.getProperty("user.name")); - return properties; + protected void addClientModule(List modules) { + modules.add(new StandaloneComputeServiceClientModule()); } - public StubComputeServicePropertiesBuilder(Properties properties) { - super(properties); - } - - public StubComputeServicePropertiesBuilder withCredentials(String id, String secret) { - return this; - } - - public StubComputeServicePropertiesBuilder withEndpoint(URI endpoint) { - return this; - } -} +} \ 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 5cd64924c7..47bd722d32 100644 --- a/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java @@ -26,13 +26,23 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; +import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.collect.Memoized; +import org.jclouds.compute.LoadBalancerService; import org.jclouds.compute.domain.ComputeMetadata; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.TemplateBuilder; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.rest.AuthorizationException; @@ -46,27 +56,152 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.inject.AbstractModule; import com.google.inject.Injector; -import com.google.inject.Key; import com.google.inject.Provides; +import com.google.inject.Scopes; import com.google.inject.TypeLiteral; +import com.google.inject.util.Providers; /** * * @author Adrian Cole */ public abstract class BaseComputeServiceContextModule extends AbstractModule { + @Override + protected void configure() { + install(new ComputeServiceTimeoutsModule()); + bindRunNodesAndAddToSetStrategy(defineRunNodesAndAddToSetStrategy()); + bindAddNodeWithTagStrategy(defineAddNodeWithTagStrategy()); + bindListNodesStrategy(defineListNodesStrategy()); + bindGetNodeMetadataStrategy(defineGetNodeMetadataStrategy()); + bindRebootNodeStrategy(defineRebootNodeStrategy()); + bindDestroyNodeStrategy(defineDestroyNodeStrategy()); + bindImageSupplier(defineImageSupplier()); + bindLocationSupplier(defineLocationSupplier()); + bindHardwareSupplier(defineHardwareSupplier()); + bindDefaultLocationSupplier(defineDefaultLocationSupplier()); + bindLoadBalancerService(); + } - protected abstract Supplier> getSourceImageSupplier(Injector injector); + protected Class defineRunNodesAndAddToSetStrategy() { + return EncodeTagIntoNameRunNodesAndAddToSetStrategy.class; + } - protected abstract Supplier> getSourceSizeSupplier(Injector injector); + /** + * needed, if {@link RunNodesAndAddToSetStrategy} requires it + */ + protected abstract Class defineAddNodeWithTagStrategy(); + + protected abstract Class defineDestroyNodeStrategy(); + + protected abstract Class defineRebootNodeStrategy(); + + protected abstract Class defineGetNodeMetadataStrategy(); + + protected abstract Class defineListNodesStrategy(); + + protected abstract Class>> defineImageSupplier(); + + protected abstract Class>> defineHardwareSupplier(); + + protected Class>> defineLocationSupplier() { + return LocationSupplier.class; + } + + protected Class> defineDefaultLocationSupplier() { + return DefaultLocationSupplier.class; + } + + protected void bindLoadBalancerService() { + bind(LoadBalancerService.class).toProvider(Providers. of(null)).in(Scopes.SINGLETON); + } + + protected void bindRunNodesAndAddToSetStrategy(Class clazz) { + bind(RunNodesAndAddToSetStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + /** + * needed, if {@link RunNodesAndAddToSetStrategy} requires it + */ + protected void bindAddNodeWithTagStrategy(Class clazz) { + bind(AddNodeWithTagStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindDestroyNodeStrategy(Class clazz) { + bind(DestroyNodeStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindRebootNodeStrategy(Class clazz) { + bind(RebootNodeStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindGetNodeMetadataStrategy(Class clazz) { + bind(GetNodeMetadataStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindListNodesStrategy(Class clazz) { + bind(ListNodesStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindImageSupplier(Class>> clazz) { + bind(new TypeLiteral>>() { + }).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindLocationSupplier(Class>> clazz) { + bind(new TypeLiteral>>() { + }).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindDefaultLocationSupplier(Class> clazz) { + bind(new TypeLiteral>() { + }).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindHardwareSupplier(Class>> clazz) { + bind(new TypeLiteral>>() { + }).to(clazz).in(Scopes.SINGLETON); + } /** * By default allows you to use a static set of locations bound to Set */ - protected Supplier> getSourceLocationSupplier(Injector injector) { - Set locations = injector.getInstance(Key.get(new TypeLiteral>() { - })); - return Suppliers.> ofInstance(locations); + @Singleton + public static class LocationSupplier implements Supplier> { + private final Set locations; + + @Inject + LocationSupplier(Set locations) { + this.locations = locations; + } + + @Override + public Set get() { + return locations; + } + + } + + @Singleton + public static class DefaultLocationSupplier implements Supplier { + private final Supplier> locations; + + @Inject + DefaultLocationSupplier(@Memoized Supplier> locations) { + this.locations = locations; + } + + @Override + public Location get() { + return Iterables.find(locations.get(), new Predicate() { + + @Override + public boolean apply(Location input) { + return input.getScope() == LocationScope.ZONE; + } + + }); + } + } @Provides @@ -86,7 +221,7 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { @Provides @Singleton - protected Supplier> provideImageMap(Supplier> images) { + protected Supplier> provideImageMap(@Memoized Supplier> images) { return Suppliers.compose(new Function, Map>() { @Override @@ -106,20 +241,22 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { @Provides @Singleton + @Memoized protected Supplier> supplyImageCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Injector injector) { + final Supplier> imageSupplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, seconds, new Supplier>() { @Override public Set get() { - return getSourceImageSupplier(injector).get(); + return imageSupplier.get(); } }); } @Provides @Singleton - protected Supplier> provideLocationMap(Supplier> locations) { + protected Supplier> provideLocationMap( + @Memoized Supplier> locations) { return Suppliers.compose(new Function, Map>() { @Override @@ -139,20 +276,21 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { @Provides @Singleton + @Memoized protected Supplier> supplyLocationCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Injector injector) { + final Supplier> locationSupplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, seconds, new Supplier>() { @Override public Set get() { - return getSourceLocationSupplier(injector).get(); + return locationSupplier.get(); } }); } @Provides @Singleton - protected Supplier> provideSizeMap(Supplier> sizes) { + protected Supplier> provideSizeMap(@Memoized Supplier> sizes) { return Suppliers.compose(new Function, Map>() { @Override @@ -172,13 +310,14 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { @Provides @Singleton + @Memoized protected Supplier> supplySizeCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Injector injector) { + final Supplier> hardwareSupplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, seconds, new Supplier>() { @Override public Set get() { - return getSourceSizeSupplier(injector).get(); + return hardwareSupplier.get(); } }); } @@ -194,25 +333,4 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { }; } - @Provides - @Singleton - protected Supplier supplyDefaultLocation(Injector injector, Supplier> locations) { - return Suppliers.compose(new Function, Location>() { - - @Override - public Location apply(Set from) { - return Iterables.find(from, new Predicate() { - - @Override - public boolean apply(Location input) { - return input.getScope() == LocationScope.ZONE; - } - - }); - } - - }, locations); - - } - } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceClientModule.java b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceClientModule.java similarity index 77% rename from compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceClientModule.java rename to compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceClientModule.java index 7b856d6a48..75378ae0c3 100644 --- a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceClientModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceClientModule.java @@ -17,21 +17,19 @@ * ==================================================================== */ -package org.jclouds.compute.stub.config; - -import java.util.concurrent.ConcurrentMap; +package org.jclouds.compute.config; +import org.jclouds.compute.ComputeService; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.config.RestClientModule; -@SuppressWarnings("unchecked") @ConfiguresRestClient @RequiresHttp -public class StubComputeServiceClientModule extends RestClientModule { +public class StandaloneComputeServiceClientModule extends RestClientModule { - public StubComputeServiceClientModule() { - super(ConcurrentMap.class, ConcurrentMap.class); + public StandaloneComputeServiceClientModule() { + super(ComputeService.class, ComputeService.class); } @Override diff --git a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java new file mode 100644 index 0000000000..96ecb1c05d --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.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.compute.config; + +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.internal.ComputeServiceContextImpl; + +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; +/** + * + * @author Adrian Cole + */ +public abstract class StandaloneComputeServiceContextModule extends BaseComputeServiceContextModule { + @Override + protected void configure() { + super.configure(); + bind(new TypeLiteral() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + } +} \ 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 e872baf83e..5d81b7ae83 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 @@ -38,6 +38,7 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Provider; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; @@ -114,9 +115,10 @@ public class TemplateBuilderImpl implements TemplateBuilder { protected TemplateOptions options; @Inject - protected TemplateBuilderImpl(Supplier> locations, Supplier> images, - Supplier> hardwares, Supplier defaultLocation2, - Provider optionsProvider, @Named("DEFAULT") Provider defaultTemplateProvider) { + protected TemplateBuilderImpl(@Memoized Supplier> locations, + @Memoized Supplier> images, @Memoized Supplier> hardwares, + Supplier defaultLocation2, Provider optionsProvider, + @Named("DEFAULT") Provider defaultTemplateProvider) { this.locations = locations; this.images = images; this.hardwares = hardwares; @@ -126,13 +128,11 @@ public class TemplateBuilderImpl implements TemplateBuilder { } /** - * If the current location id is null, then we don't care where to launch a - * node. + * If the current location id is null, then we don't care where to launch a node. * * If the input location is null, then the data isn't location sensitive * - * If the input location is a parent of the specified location, then we are - * ok. + * If the input location is a parent of the specified location, then we are ok. */ private final Predicate locationPredicate = new Predicate() { @Override @@ -140,7 +140,7 @@ 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()); return returnVal; } @@ -210,7 +210,7 @@ public class TemplateBuilderImpl implements TemplateBuilder { returnVal = false; else returnVal = input.getDescription().contains(osDescription) - || input.getDescription().matches(osDescription); + || input.getDescription().matches(osDescription); } return returnVal; } @@ -324,8 +324,8 @@ public class TemplateBuilderImpl implements TemplateBuilder { returnVal = false; else returnVal = input.getDescription().equals(imageDescription) - || input.getDescription().contains(imageDescription) - || input.getDescription().matches(imageDescription); + || input.getDescription().contains(imageDescription) + || input.getDescription().matches(imageDescription); } return returnVal; } @@ -380,12 +380,12 @@ public class TemplateBuilderImpl implements TemplateBuilder { } }; private final Predicate hardwarePredicate = and(hardwareIdPredicate, locationPredicate, - hardwareCoresPredicate, hardwareRamPredicate); + hardwareCoresPredicate, hardwareRamPredicate); static final Ordering DEFAULT_SIZE_ORDERING = new Ordering() { public int compare(Hardware left, Hardware right) { return ComparisonChain.start().compare(getCores(left), getCores(right)).compare(left.getRam(), right.getRam()) - .compare(getSpace(left), getSpace(right)).result(); + .compare(getSpace(left), getSpace(right)).result(); } }; static final Ordering BY_CORES_ORDERING = new Ordering() { @@ -395,16 +395,16 @@ public class TemplateBuilderImpl implements TemplateBuilder { }; static final Ordering DEFAULT_IMAGE_ORDERING = new Ordering() { public int compare(Image left, Image right) { - return ComparisonChain.start() - .compare(left.getName(), right.getName(), Ordering. natural().nullsLast()) - .compare(left.getVersion(), right.getVersion(), Ordering. natural().nullsLast()) - .compare(left.getOperatingSystem().getName(), right.getOperatingSystem().getName(),// - Ordering. natural().nullsLast()) - .compare(left.getOperatingSystem().getVersion(), right.getOperatingSystem().getVersion(),// - Ordering. natural().nullsLast()) - .compare(left.getOperatingSystem().getDescription(), right.getOperatingSystem().getDescription(),// - Ordering. natural().nullsLast()) - .compare(left.getOperatingSystem().getArch(), right.getOperatingSystem().getArch()).result(); + return ComparisonChain.start().compare(left.getName(), right.getName(), + Ordering. natural().nullsLast()).compare(left.getVersion(), right.getVersion(), + Ordering. natural().nullsLast()).compare(left.getOperatingSystem().getName(), + right.getOperatingSystem().getName(),// + Ordering. natural().nullsLast()).compare(left.getOperatingSystem().getVersion(), + right.getOperatingSystem().getVersion(),// + Ordering. natural().nullsLast()).compare(left.getOperatingSystem().getDescription(), + right.getOperatingSystem().getDescription(),// + Ordering. natural().nullsLast()).compare(left.getOperatingSystem().getArch(), + right.getOperatingSystem().getArch()).result(); } }; @@ -535,7 +535,7 @@ public class TemplateBuilderImpl implements TemplateBuilder { Iterable supportedImages = filter(images, buildImagePredicate()); if (Iterables.size(supportedImages) == 0) throw new NoSuchElementException(String.format( - "no image matched predicate %s images that didn't match below:\n%s", imagePredicate, images)); + "no image matched predicate %s images that didn't match below:\n%s", imagePredicate, images)); Hardware hardware = resolveSize(hardwareSorter(), supportedImages); Image image = resolveImage(hardware, supportedImages); logger.debug("<< matched image(%s)", image); @@ -548,29 +548,29 @@ public class TemplateBuilderImpl implements TemplateBuilder { Hardware hardware; try { Iterable hardwaresThatAreCompatibleWithOurImages = filter(hardwaresl, - new Predicate() { - @Override - public boolean apply(final Hardware hardware) { - return Iterables.any(images, new Predicate() { + new Predicate() { + @Override + public boolean apply(final Hardware hardware) { + return Iterables.any(images, new Predicate() { - @Override - public boolean apply(Image input) { - return hardware.supportsImage().apply(input); - } + @Override + public boolean apply(Image input) { + return hardware.supportsImage().apply(input); + } - @Override - public String toString() { - return "hardware(" + hardware + ").supportsImage()"; - } + @Override + public String toString() { + return "hardware(" + hardware + ").supportsImage()"; + } - }); + }); - } - }); + } + }); hardware = hardwareOrdering.max(filter(hardwaresThatAreCompatibleWithOurImages, hardwarePredicate)); } catch (NoSuchElementException exception) { throw new NoSuchElementException("hardwares don't support any images: " + toString() + "\n" + hardwaresl - + "\n" + images); + + "\n" + images); } logger.debug("<< matched hardware(%s)", hardware); return hardware; @@ -678,7 +678,7 @@ public class TemplateBuilderImpl implements TemplateBuilder { // looks verbose, but explicit type needed for this to compile // properly Predicate imagePredicate = predicates.size() == 1 ? Iterables.> get(predicates, 0) - : Predicates. and(predicates); + : Predicates. and(predicates); return imagePredicate; } @@ -826,8 +826,9 @@ public class TemplateBuilderImpl implements TemplateBuilder { @VisibleForTesting boolean nothingChangedExceptOptions() { return osFamily == null && location == null && imageId == null && hardwareId == null && osName == null - && osDescription == null && imageVersion == null && osVersion == null && osArch == null && os64Bit == null - && imageName == null && imageDescription == null && minCores == 0 && minRam == 0 && !biggest && !fastest; + && osDescription == null && imageVersion == null && osVersion == null && osArch == null + && os64Bit == null && imageName == null && imageDescription == null && minCores == 0 && minRam == 0 + && !biggest && !fastest; } /** @@ -841,10 +842,10 @@ public class TemplateBuilderImpl implements TemplateBuilder { @Override public String toString() { return "[biggest=" + biggest + ", fastest=" + fastest + ", imageName=" + imageName + ", imageDescription=" - + imageDescription + ", imageId=" + imageId + ", imageVersion=" + imageVersion + ", location=" + location - + ", minCores=" + minCores + ", minRam=" + minRam + ", osFamily=" + osFamily + ", osName=" + osName - + ", osDescription=" + osDescription + ", osVersion=" + osVersion + ", osArch=" + osArch + ", os64Bit=" - + os64Bit + ", hardwareId=" + hardwareId + "]"; + + imageDescription + ", imageId=" + imageId + ", imageVersion=" + imageVersion + ", location=" + + location + ", minCores=" + minCores + ", minRam=" + minRam + ", osFamily=" + osFamily + ", osName=" + + osName + ", osDescription=" + osDescription + ", osVersion=" + osVersion + ", osArch=" + osArch + + ", os64Bit=" + os64Bit + ", hardwareId=" + hardwareId + "]"; } @Override 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 63092898da..e148f0ccef 100755 --- a/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java +++ b/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java @@ -54,6 +54,7 @@ import javax.inject.Provider; import javax.inject.Singleton; import org.jclouds.Constants; +import org.jclouds.collect.Memoized; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.RunNodesException; @@ -120,14 +121,15 @@ public class BaseComputeService implements ComputeService { @Inject protected BaseComputeService(ComputeServiceContext context, Map credentialStore, - Supplier> images, Supplier> hardwareProfiles, - Supplier> locations, ListNodesStrategy listNodesStrategy, - GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, - RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, - Provider templateBuilderProvider, Provider templateOptionsProvider, - @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + @Memoized Supplier> images, + @Memoized Supplier> hardwareProfiles, + @Memoized Supplier> locations, ListNodesStrategy listNodesStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, + Provider templateBuilderProvider, Provider templateOptionsProvider, + @Named("NODE_RUNNING") Predicate nodeRunning, + @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.context = checkNotNull(context, "context"); this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.images = checkNotNull(images, "images"); @@ -160,15 +162,15 @@ public class BaseComputeService implements ComputeService { */ @Override public Set runNodesWithTag(String tag, int count, Template template) - throws RunNodesException { + throws RunNodesException { checkArgument(tag.indexOf('-') == -1, "tag cannot contain hyphens"); checkNotNull(template.getLocation(), "location"); if (template.getOptions().getTaskName() == null && template.getOptions().getRunScript() != null - && !(template.getOptions().getRunScript() instanceof InitBuilder)) + && !(template.getOptions().getRunScript() instanceof InitBuilder)) template.getOptions().nameTask("bootstrap"); logger.debug(">> running %d node%s tag(%s) location(%s) image(%s) hardwareProfile(%s) options(%s)", count, - count > 1 ? "s" : "", tag, template.getLocation().getId(), template.getImage().getId(), template - .getHardware().getId(), template.getOptions()); + count > 1 ? "s" : "", tag, template.getLocation().getId(), template.getImage().getId(), template + .getHardware().getId(), template.getOptions()); Set nodes = newHashSet(); Map badNodes = newLinkedHashMap(); Map> responses = runNodesAndAddToSetStrategy.execute(tag, count, template, nodes, badNodes); @@ -187,7 +189,7 @@ public class BaseComputeService implements ComputeService { */ @Override public Set runNodesWithTag(String tag, int count, TemplateOptions templateOptions) - throws RunNodesException { + throws RunNodesException { return runNodesWithTag(tag, count, templateBuilder().any().options(templateOptions).build()); } @@ -236,23 +238,23 @@ public class BaseComputeService implements ComputeService { public Set destroyNodesMatching(Predicate filter) { logger.debug(">> destroying nodes matching(%s)", filter); Set set = newLinkedHashSet(transformParallel(nodesMatchingFilterAndNotTerminated(filter), - new Function>() { + new Function>() { - // TODO make an async interface instead of re-wrapping - @Override - public Future apply(final NodeMetadata from) { - return executor.submit(new Callable() { + // TODO make an async interface instead of re-wrapping + @Override + public Future apply(final NodeMetadata from) { + return executor.submit(new Callable() { - @Override - public NodeMetadata call() throws Exception { - destroyNode(from.getId()); - return from; - } + @Override + public NodeMetadata call() throws Exception { + destroyNode(from.getId()); + return from; + } - }); - } + }); + } - }, executor, null, logger, "destroying nodes")); + }, executor, null, logger, "destroying nodes")); logger.debug("<< destroyed(%d)", set.size()); return set; } @@ -360,7 +362,7 @@ public class BaseComputeService implements ComputeService { */ @Override public Map runScriptOnNodesMatching(Predicate filter, Payload runScript) - throws RunScriptOnNodesException { + throws RunScriptOnNodesException { return runScriptOnNodesMatching(filter, runScript, RunScriptOptions.NONE); } @@ -369,7 +371,7 @@ public class BaseComputeService implements ComputeService { */ @Override public Map runScriptOnNodesMatching(Predicate filter, - final Payload runScript, @Nullable final RunScriptOptions options) throws RunScriptOnNodesException { + final Payload runScript, @Nullable final RunScriptOptions options) throws RunScriptOnNodesException { checkNotNull(filter, "Filter must be provided"); checkNotNull(runScript, "runScript"); @@ -390,8 +392,8 @@ public class BaseComputeService implements ComputeService { @Override public Void call() throws Exception { try { - ExecResponse response = utils.runScriptOnNode(node, - Statements.exec(Utils.toStringAndClose(runScript.getInput())), options); + ExecResponse response = utils.runScriptOnNode(node, Statements.exec(Utils.toStringAndClose(runScript + .getInput())), options); if (response != null) execs.put(node, response); } catch (Exception e) { @@ -413,7 +415,7 @@ public class BaseComputeService implements ComputeService { } private Iterable filterNodesWhoCanRunScripts(Iterable nodes, - final Map badNodes, final @Nullable Credentials overridingCredentials) { + final Map badNodes, final @Nullable Credentials overridingCredentials) { nodes = filter(transform(nodes, new Function() { @Override @@ -425,9 +427,9 @@ public class BaseComputeService implements ComputeService { } else { checkNotNull(node.getCredentials(), "If the default credentials need to be used, they can't be null"); checkNotNull(node.getCredentials().identity, "Account name for ssh authentication must be " - + "specified. Try passing RunScriptOptions with new credentials"); + + "specified. Try passing RunScriptOptions with new credentials"); checkNotNull(node.getCredentials().credential, "Key or password for ssh authentication must be " - + "specified. Try passing RunScriptOptions with new credentials"); + + "specified. Try passing RunScriptOptions with new credentials"); } return node; } catch (Exception e) { diff --git a/compute/src/main/java/org/jclouds/compute/stub/StubComputeServiceContextBuilder.java b/compute/src/main/java/org/jclouds/compute/stub/StubComputeServiceContextBuilder.java index bf71988c23..d9b614c3cd 100644 --- a/compute/src/main/java/org/jclouds/compute/stub/StubComputeServiceContextBuilder.java +++ b/compute/src/main/java/org/jclouds/compute/stub/StubComputeServiceContextBuilder.java @@ -21,10 +21,8 @@ package org.jclouds.compute.stub; import java.util.List; import java.util.Properties; -import java.util.concurrent.ConcurrentMap; -import org.jclouds.compute.ComputeServiceContextBuilder; -import org.jclouds.compute.stub.config.StubComputeServiceClientModule; +import org.jclouds.compute.StandaloneComputeServiceContextBuilder; import org.jclouds.compute.stub.config.StubComputeServiceContextModule; import com.google.inject.Module; @@ -33,11 +31,10 @@ import com.google.inject.Module; * * @author Adrian Cole */ -@SuppressWarnings("unchecked") -public class StubComputeServiceContextBuilder extends ComputeServiceContextBuilder { +public class StubComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder { public StubComputeServiceContextBuilder(Properties props) { - super(ConcurrentMap.class, ConcurrentMap.class, props); + super(props); } @Override @@ -45,9 +42,4 @@ public class StubComputeServiceContextBuilder extends ComputeServiceContextBuild modules.add(new StubComputeServiceContextModule()); } - @Override - protected void addClientModule(List modules) { - modules.add(new StubComputeServiceClientModule()); - } - } 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 1e52db74a3..c8192f5dc9 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 @@ -19,381 +19,72 @@ package org.jclouds.compute.stub.config; -import static com.google.common.base.Preconditions.checkArgument; - -import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicInteger; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Provider; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.LoadBalancerService; -import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.config.ComputeServiceTimeoutsModule; -import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.config.StandaloneComputeServiceContextModule; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.ImageBuilder; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeMetadataBuilder; -import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.Volume; -import org.jclouds.compute.domain.internal.VolumeImpl; -import org.jclouds.compute.internal.ComputeServiceContextImpl; -import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; 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.stub.config.StubComputeServiceDependenciesModule.StubAddNodeWithTagStrategy; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubDestroyNodeStrategy; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubGetNodeMetadataStrategy; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubHardwareSupplier; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubImageSupplier; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubListNodesStrategy; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubRebootNodeStrategy; import org.jclouds.concurrent.SingleThreaded; -import org.jclouds.domain.Credentials; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.net.IPSocket; -import org.jclouds.predicates.SocketOpen; -import org.jclouds.rest.ResourceNotFoundException; -import com.google.common.base.Predicate; import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.Provides; -import com.google.inject.Scopes; -import com.google.inject.TypeLiteral; -import com.google.inject.util.Providers; /** * * @author Adrian Cole */ @SingleThreaded -public class StubComputeServiceContextModule extends BaseComputeServiceContextModule { - // STUB STUFF STATIC SO MULTIPLE CONTEXTS CAN SEE IT - private static final AtomicInteger nodeIds = new AtomicInteger(0); - private static final ConcurrentMap nodes = new ConcurrentHashMap(); - private static final ExecutorService service = Executors.newCachedThreadPool(); - - @Provides - @Singleton - ConcurrentMap provideNodes() { - return nodes; - } - - @Provides - @Named("NODE_ID") - Integer provideNodeId() { - return nodeIds.incrementAndGet(); - } - - @Singleton - @Provides - @Named("PUBLIC_IP_PREFIX") - String publicIpPrefix() { - return "144.175.1."; - } - - @Singleton - @Provides - @Named("PRIVATE_IP_PREFIX") - String privateIpPrefix() { - return "10.1.1."; - } - - @Singleton - @Provides - @Named("PASSWORD_PREFIX") - String passwordPrefix() { - return "password"; - } - - @Singleton - @Provides - SocketOpen socketOpen(StubSocketOpen in) { - return in; - } - - @Singleton - public static class StubSocketOpen implements SocketOpen { - private final ConcurrentMap nodes; - private final String publicIpPrefix; - - @Inject - public StubSocketOpen(ConcurrentMap nodes, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix) { - this.nodes = nodes; - this.publicIpPrefix = publicIpPrefix; - } - - @Override - public boolean apply(IPSocket input) { - if (input.getAddress().indexOf(publicIpPrefix) == -1) - return false; - String id = input.getAddress().replace(publicIpPrefix, ""); - NodeMetadata node = nodes.get(id); - return node != null && node.getState() == NodeState.RUNNING; - } - - } - - @SuppressWarnings("unchecked") +public class StubComputeServiceContextModule extends StandaloneComputeServiceContextModule { @Override protected void configure() { - bind(new TypeLiteral() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - install(new ComputeServiceTimeoutsModule()); - bind(ConcurrentMap.class).toInstance(nodes); - bind(AddNodeWithTagStrategy.class).to(StubAddNodeWithTagStrategy.class); - bind(ListNodesStrategy.class).to(StubListNodesStrategy.class); - bind(GetNodeMetadataStrategy.class).to(StubGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(StubRebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(StubDestroyNodeStrategy.class); - bind(LoadBalancerService.class).toProvider(Providers. of(null)); - } - - @Singleton - public static class StubAddNodeWithTagStrategy implements AddNodeWithTagStrategy { - private final Supplier location; - private final ConcurrentMap nodes; - private final Provider idProvider; - private final String publicIpPrefix; - private final String privateIpPrefix; - private final String passwordPrefix; - private final Map credentialStore; - - @Inject - public StubAddNodeWithTagStrategy(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, - Map credentialStore) { - this.nodes = nodes; - this.location = location; - this.idProvider = idProvider; - this.publicIpPrefix = publicIpPrefix; - this.privateIpPrefix = privateIpPrefix; - this.passwordPrefix = passwordPrefix; - this.credentialStore = credentialStore; - } - - @Override - public NodeMetadata execute(String tag, String name, Template template) { - checkArgument(location.get().equals(template.getLocation()), "invalid location: " + template.getLocation()); - NodeMetadataBuilder builder = new NodeMetadataBuilder(); - String id = idProvider.get() + ""; - builder.ids(id); - builder.name(name); - builder.tag(tag); - builder.location(location.get()); - builder.imageId(template.getImage().getId()); - builder.operatingSystem(template.getImage().getOperatingSystem()); - builder.state(NodeState.PENDING); - builder.publicAddresses(ImmutableSet. of(publicIpPrefix + id)); - builder.privateAddresses(ImmutableSet. of(privateIpPrefix + id)); - builder.credentials(new Credentials("root", passwordPrefix + id)); - NodeMetadata node = builder.build(); - nodes.put(node.getId(), node); - credentialStore.put(node.getId(), node.getCredentials()); - setState(node, NodeState.RUNNING, 100); - return node; - } - } - - protected static void nodeWithState(NodeMetadata node, NodeState state) { - nodes.put(node.getId(), NodeMetadataBuilder.fromNodeMetadata(node).state(state).build()); - } - - public static void setState(final NodeMetadata node, final NodeState state, final long millis) { - if (millis == 0l) - nodeWithState(node, state); - else - service.execute(new Runnable() { - - @Override - public void run() { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - Throwables.propagate(e); - } - nodeWithState(node, state); - } - - }); - } - - @Singleton - public static class StubGetNodeMetadataStrategy implements GetNodeMetadataStrategy { - private final ConcurrentMap nodes; - - @Inject - protected StubGetNodeMetadataStrategy(ConcurrentMap nodes) { - this.nodes = nodes; - } - - @Override - public NodeMetadata execute(String id) { - return nodes.get(id); - } - } - - @Singleton - public static class StubListNodesStrategy implements ListNodesStrategy { - private final ConcurrentMap nodes; - - @Inject - protected StubListNodesStrategy(ConcurrentMap nodes) { - this.nodes = nodes; - } - - @Override - public Iterable list() { - return listDetailsOnNodesMatching(NodePredicates.all()); - } - - @Override - public Iterable listDetailsOnNodesMatching(Predicate filter) { - return Iterables.filter(nodes.values(), filter); - } - } - - @Singleton - public static class StubRebootNodeStrategy implements RebootNodeStrategy { - private final ConcurrentMap nodes; - - @Inject - protected StubRebootNodeStrategy(ConcurrentMap nodes) { - this.nodes = nodes; - } - - @Override - public NodeMetadata execute(String id) { - NodeMetadata node = nodes.get(id); - if (node == null) - throw new ResourceNotFoundException("node not found: " + id); - setState(node, NodeState.PENDING, 0); - setState(node, NodeState.RUNNING, 50); - return node; - } - } - - @Singleton - public static class StubDestroyNodeStrategy implements DestroyNodeStrategy { - private final ConcurrentMap nodes; - private final ExecutorService service; - - @Inject - protected StubDestroyNodeStrategy(ConcurrentMap nodes, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service) { - this.nodes = nodes; - this.service = service; - } - - @Override - public NodeMetadata execute(final String id) { - NodeMetadata node = nodes.get(id); - if (node == null) - return node; - setState(node, NodeState.PENDING, 0); - setState(node, NodeState.TERMINATED, 50); - service.execute(new Runnable() { - - @Override - public void run() { - try { - Thread.sleep(200); - } catch (InterruptedException e) { - Throwables.propagate(e); - } finally { - nodes.remove(id); - } - } - - }); - return node; - } + install(new StubComputeServiceDependenciesModule()); + super.configure(); } @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - Supplier defaultLocation = injector.getInstance(Key.get(new TypeLiteral>() { - })); - Location zone = defaultLocation.get().getParent(); - String parentId = zone.getId(); - Credentials defaultCredentials = new Credentials("root", null); - return Suppliers - .> ofInstance(ImmutableSet. of( - // - new ImageBuilder() - .providerId("1") - .name(OsFamily.UBUNTU.name()) - .id(parentId + "/1") - .location(zone) - .operatingSystem( - new OperatingSystem(OsFamily.UBUNTU, "ubuntu 32", null, "X86_32", "ubuntu 32", false)) - .description("stub ubuntu 32").defaultCredentials(defaultCredentials).build(), // - new ImageBuilder() - .providerId("2") - .name(OsFamily.UBUNTU.name()) - .id(parentId + "/2") - .location(zone) - .operatingSystem( - new OperatingSystem(OsFamily.UBUNTU, "ubuntu 64", null, "X86_64", "ubuntu 64", true)) - .description("stub ubuntu 64").defaultCredentials(defaultCredentials).build(), // - new ImageBuilder() - .providerId("3") - .name(OsFamily.CENTOS.name()) - .id(parentId + "/3") - .location(zone) - .operatingSystem( - new OperatingSystem(OsFamily.CENTOS, "centos 64", null, "X86_64", "centos 64", true)) - .description("stub centos 64").defaultCredentials(defaultCredentials).build() // - - )); - } - - @Provides - @Singleton - protected Set provideLocations(@org.jclouds.rest.annotations.Provider String providerName) { - 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)); + protected Class defineAddNodeWithTagStrategy() { + return StubAddNodeWithTagStrategy.class; } @Override - protected Supplier> getSourceSizeSupplier(Injector injector) { - return Suppliers.> ofInstance(ImmutableSet. of( - StubHardware.stub("small", 1, 1740, 160), StubHardware.stub("medium", 4, 7680, 850), - StubHardware.stub("large", 8, 15360, 1690))); + protected Class defineDestroyNodeStrategy() { + return StubDestroyNodeStrategy.class; } - private static class StubHardware { + @Override + protected Class defineGetNodeMetadataStrategy() { + return StubGetNodeMetadataStrategy.class; + } - static Hardware stub(String type, int cores, int ram, float disk) { - return new org.jclouds.compute.domain.HardwareBuilder().id(type).providerId(type).name(type) - .processors(ImmutableList.of(new Processor(cores, 1.0))).ram(ram) - .volumes(ImmutableList. of(new VolumeImpl(disk, true, false))).build(); - } + @Override + protected Class defineListNodesStrategy() { + return StubListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return StubRebootNodeStrategy.class; + } + + @Override + protected Class>> defineHardwareSupplier() { + return StubHardwareSupplier.class; + } + + @Override + protected Class>> defineImageSupplier() { + return StubImageSupplier.class; } } diff --git a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java new file mode 100644 index 0000000000..1ff03e1270 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java @@ -0,0 +1,377 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.compute.stub.config; + +import static com.google.common.base.Preconditions.checkArgument; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Processor; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.domain.Volume; +import org.jclouds.compute.domain.internal.VolumeImpl; +import org.jclouds.compute.predicates.NodePredicates; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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.domain.Credentials; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; +import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.net.IPSocket; +import org.jclouds.predicates.SocketOpen; +import org.jclouds.rest.ResourceNotFoundException; + +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.base.Throwables; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; + +/** + * + * @author Adrian Cole + */ +public class StubComputeServiceDependenciesModule extends AbstractModule { + + @Override + protected void configure() { + + } + + protected static final ConcurrentMap backing = new ConcurrentHashMap(); + + // implementation details below + @Provides + @Singleton + ConcurrentMap provideNodes() { + return backing; + } + + // STUB STUFF STATIC SO MULTIPLE CONTEXTS CAN SEE IT + private static final AtomicInteger nodeIds = new AtomicInteger(0); + private static final ExecutorService service = Executors.newCachedThreadPool(); + + @Provides + @Named("NODE_ID") + Integer provideNodeId() { + return nodeIds.incrementAndGet(); + } + + @Singleton + @Provides + @Named("PUBLIC_IP_PREFIX") + String publicIpPrefix() { + return "144.175.1."; + } + + @Singleton + @Provides + @Named("PRIVATE_IP_PREFIX") + String privateIpPrefix() { + return "10.1.1."; + } + + @Singleton + @Provides + @Named("PASSWORD_PREFIX") + String passwordPrefix() { + return "password"; + } + + @Singleton + @Provides + SocketOpen socketOpen(StubSocketOpen in) { + return in; + } + + @Singleton + public static class StubSocketOpen implements SocketOpen { + private final ConcurrentMap nodes; + private final String publicIpPrefix; + + @Inject + public StubSocketOpen(ConcurrentMap nodes, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix) { + this.nodes = nodes; + this.publicIpPrefix = publicIpPrefix; + } + + @Override + public boolean apply(IPSocket input) { + if (input.getAddress().indexOf(publicIpPrefix) == -1) + return false; + String id = input.getAddress().replace(publicIpPrefix, ""); + NodeMetadata node = nodes.get(id); + return node != null && node.getState() == NodeState.RUNNING; + } + + } + + @Singleton + public static class StubAddNodeWithTagStrategy implements AddNodeWithTagStrategy { + private final Supplier location; + private final ConcurrentMap nodes; + private final Provider idProvider; + private final String publicIpPrefix; + private final String privateIpPrefix; + private final String passwordPrefix; + private final Map credentialStore; + + @Inject + public StubAddNodeWithTagStrategy(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, + Map credentialStore) { + this.nodes = nodes; + this.location = location; + this.idProvider = idProvider; + this.publicIpPrefix = publicIpPrefix; + this.privateIpPrefix = privateIpPrefix; + this.passwordPrefix = passwordPrefix; + this.credentialStore = credentialStore; + } + + @Override + public NodeMetadata execute(String tag, String name, Template template) { + checkArgument(location.get().equals(template.getLocation()), "invalid location: " + template.getLocation()); + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + String id = idProvider.get() + ""; + builder.ids(id); + builder.name(name); + builder.tag(tag); + builder.location(location.get()); + builder.imageId(template.getImage().getId()); + builder.operatingSystem(template.getImage().getOperatingSystem()); + builder.state(NodeState.PENDING); + builder.publicAddresses(ImmutableSet. of(publicIpPrefix + id)); + builder.privateAddresses(ImmutableSet. of(privateIpPrefix + id)); + builder.credentials(new Credentials("root", passwordPrefix + id)); + NodeMetadata node = builder.build(); + nodes.put(node.getId(), node); + credentialStore.put(node.getId(), node.getCredentials()); + setState(node, NodeState.RUNNING, 100); + return node; + } + } + + protected static void nodeWithState(NodeMetadata node, NodeState state) { + backing.put(node.getId(), NodeMetadataBuilder.fromNodeMetadata(node).state(state).build()); + } + + public static void setState(final NodeMetadata node, final NodeState state, final long millis) { + if (millis == 0l) + nodeWithState(node, state); + else + service.execute(new Runnable() { + + @Override + public void run() { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + Throwables.propagate(e); + } + nodeWithState(node, state); + } + + }); + } + + @Singleton + public static class StubGetNodeMetadataStrategy implements GetNodeMetadataStrategy { + private final ConcurrentMap nodes; + + @Inject + protected StubGetNodeMetadataStrategy(ConcurrentMap nodes) { + this.nodes = nodes; + } + + @Override + public NodeMetadata execute(String id) { + return nodes.get(id); + } + } + + @Singleton + public static class StubListNodesStrategy implements ListNodesStrategy { + private final ConcurrentMap nodes; + + @Inject + protected StubListNodesStrategy(ConcurrentMap nodes) { + this.nodes = nodes; + } + + @Override + public Iterable list() { + return listDetailsOnNodesMatching(NodePredicates.all()); + } + + @Override + public Iterable listDetailsOnNodesMatching(Predicate filter) { + return Iterables.filter(nodes.values(), filter); + } + } + + @Singleton + public static class StubRebootNodeStrategy implements RebootNodeStrategy { + private final ConcurrentMap nodes; + + @Inject + protected StubRebootNodeStrategy(ConcurrentMap nodes) { + this.nodes = nodes; + } + + @Override + public NodeMetadata execute(String id) { + NodeMetadata node = nodes.get(id); + if (node == null) + throw new ResourceNotFoundException("node not found: " + id); + setState(node, NodeState.PENDING, 0); + setState(node, NodeState.RUNNING, 50); + return node; + } + } + + @Singleton + public static class StubDestroyNodeStrategy implements DestroyNodeStrategy { + private final ConcurrentMap nodes; + private final ExecutorService service; + + @Inject + protected StubDestroyNodeStrategy(ConcurrentMap nodes, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service) { + this.nodes = nodes; + this.service = service; + } + + @Override + public NodeMetadata execute(final String id) { + NodeMetadata node = nodes.get(id); + if (node == null) + return node; + setState(node, NodeState.PENDING, 0); + setState(node, NodeState.TERMINATED, 50); + service.execute(new Runnable() { + + @Override + public void run() { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + Throwables.propagate(e); + } finally { + nodes.remove(id); + } + } + + }); + return node; + } + } + + @Singleton + static class StubImageSupplier implements Supplier> { + private final Supplier defaultLocation; + + @Inject + StubImageSupplier(Supplier defaultLocation) { + this.defaultLocation = defaultLocation; + } + + @Override + public Set get() { + Location zone = defaultLocation.get().getParent(); + String parentId = zone.getId(); + Credentials defaultCredentials = new Credentials("root", null); + return ImmutableSet + . of(new ImageBuilder().providerId("1").name(OsFamily.UBUNTU.name()).id(parentId + "/1") + .location(zone).operatingSystem( + new OperatingSystem(OsFamily.UBUNTU, "ubuntu 32", null, "X86_32", "ubuntu 32", + false)).description("stub ubuntu 32").defaultCredentials( + defaultCredentials).build(), // + new ImageBuilder().providerId("2").name(OsFamily.UBUNTU.name()).id(parentId + "/2") + .location(zone).operatingSystem( + new OperatingSystem(OsFamily.UBUNTU, "ubuntu 64", null, "X86_64", + "ubuntu 64", true)).description("stub ubuntu 64") + .defaultCredentials(defaultCredentials).build(), // + new ImageBuilder().providerId("3").name(OsFamily.CENTOS.name()).id(parentId + "/3") + .location(zone).operatingSystem( + new OperatingSystem(OsFamily.CENTOS, "centos 64", null, "X86_64", + "centos 64", true)).description("stub centos 64") + .defaultCredentials(defaultCredentials).build() // + + ); + } + + } + + @Provides + @Singleton + protected Set provideLocations(@org.jclouds.rest.annotations.Provider String providerName) { + 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)); + } + + @Singleton + static class StubHardwareSupplier implements Supplier> { + + static Hardware stub(String type, int cores, int ram, float disk) { + return new org.jclouds.compute.domain.HardwareBuilder().id(type).providerId(type).name(type).processors( + ImmutableList.of(new Processor(cores, 1.0))).ram(ram).volumes( + ImmutableList. of(new VolumeImpl(disk, true, false))).build(); + } + + @Override + public Set get() { + return ImmutableSet. of(stub("small", 1, 1740, 160), stub("medium", 4, 7680, 850), stub("large", 8, + 15360, 1690)); + } + } + +} diff --git a/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java new file mode 100644 index 0000000000..729b7e9693 --- /dev/null +++ b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java @@ -0,0 +1,39 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.compute; + +import org.jclouds.compute.stub.config.StubComputeServiceContextModule; +import org.testng.annotations.Test; + +/** + * + * @author Adrian Cole + * + */ +@Test(groups = "unit") +public class ComputeServiceContextFactoryTest { + + @Test + public void testStandalone() { + ComputeServiceContext context = ComputeServiceContextFactory.createStandaloneContext(new StubComputeServiceContextModule()); + context.getComputeService().listNodes(); + } + +} diff --git a/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java b/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java index a3f7c58059..f2253a1243 100644 --- a/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java +++ b/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java @@ -64,11 +64,11 @@ public class TemplateBuilderImplTest { Hardware hardware = new HardwareBuilder().id("hardwareId").build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(defaultLocation)); + . of(defaultLocation)); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of( - image, image2)); + image, image2)); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(hardware)); + . of(hardware)); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class); @@ -98,7 +98,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); assertEquals(template.resolveImage(hardware, images.get()), image2); @@ -124,11 +124,11 @@ public class TemplateBuilderImplTest { Hardware hardware = new HardwareBuilder().id("hardwareId").build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(defaultLocation)); + . of(defaultLocation)); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of( - image, image2)); + image, image2)); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(hardware)); + . of(hardware)); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class); @@ -153,7 +153,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); assertEquals(template.smallest().osArchMatches("X86_32").build().getImage(), image); @@ -174,15 +174,15 @@ public class TemplateBuilderImplTest { Image image = createMock(Image.class); OperatingSystem os = createMock(OperatingSystem.class); - Hardware hardware = new HardwareBuilder().id("hardwareId") - .supportsImage(ImagePredicates.idEquals("imageId")).build(); + Hardware hardware = new HardwareBuilder().id("hardwareId").supportsImage(ImagePredicates.idEquals("imageId")) + .build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(defaultLocation)); + . of(defaultLocation)); Supplier> images = Suppliers.> ofInstance(ImmutableSet - . of(image)); + . of(image)); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(hardware)); + . of(hardware)); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class); @@ -210,7 +210,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); template.imageId("imageId").build(); @@ -229,15 +229,15 @@ public class TemplateBuilderImplTest { Image image = createMock(Image.class); OperatingSystem os = createMock(OperatingSystem.class); - Hardware hardware = new HardwareBuilder().id("hardwareId") - .supportsImage(ImagePredicates.idEquals("imageId")).build(); + Hardware hardware = new HardwareBuilder().id("hardwareId").supportsImage(ImagePredicates.idEquals("imageId")) + .build(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of(defaultLocation)); + . of(defaultLocation)); Supplier> images = Suppliers.> ofInstance(ImmutableSet - . of(image)); + . of(image)); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of(hardware)); + . of(hardware)); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class); @@ -265,7 +265,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(image, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); try { template.imageId("notImageId").build(); assert false; @@ -286,10 +286,10 @@ public class TemplateBuilderImplTest { TemplateOptions from = provideTemplateOptions(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -306,7 +306,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); template.options(options).build(); @@ -321,10 +321,10 @@ public class TemplateBuilderImplTest { public void testNothingUsesDefaultTemplateBuilder() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); @@ -340,7 +340,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); template.build(); @@ -351,10 +351,11 @@ public class TemplateBuilderImplTest { } protected TemplateBuilderImpl createTemplateBuilder(Image knownImage, Supplier> locations, - Supplier> images, Supplier> hardwares, Location defaultLocation, - Provider optionsProvider, Provider templateBuilderProvider) { - TemplateBuilderImpl template = new TemplateBuilderImpl(locations, images, hardwares, - Suppliers.ofInstance(defaultLocation), optionsProvider, templateBuilderProvider); + Supplier> images, Supplier> hardwares, + Location defaultLocation, Provider optionsProvider, + Provider templateBuilderProvider) { + TemplateBuilderImpl template = new TemplateBuilderImpl(locations, images, hardwares, Suppliers + .ofInstance(defaultLocation), optionsProvider, templateBuilderProvider); return template; } @@ -362,10 +363,10 @@ public class TemplateBuilderImplTest { @Test public void testSuppliedLocationWithNoOptions() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -377,7 +378,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); try { template.imageId("foo").locationId("location").build(); @@ -398,10 +399,10 @@ public class TemplateBuilderImplTest { TemplateOptions from = provideTemplateOptions(); Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -413,7 +414,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); try { template.imageId("foo").options(provideTemplateOptions()).locationId("location").build(); @@ -431,10 +432,10 @@ public class TemplateBuilderImplTest { @Test public void testDefaultLocationWithNoOptionsNoSuchElement() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -448,7 +449,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); try { template.imageId("region/ami").build(); @@ -471,10 +472,10 @@ public class TemplateBuilderImplTest { @Test public void testDefaultLocationWithOptions() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); TemplateOptions from = provideTemplateOptions(); @@ -489,7 +490,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); try { template.imageId("region/ami").options(provideTemplateOptions()).build(); @@ -507,10 +508,10 @@ public class TemplateBuilderImplTest { @Test public void testImageIdNullsEverythingElse() { Supplier> locations = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Supplier> images = Suppliers.> ofInstance(ImmutableSet. of()); Supplier> hardwares = Suppliers.> ofInstance(ImmutableSet - . of()); + . of()); Location defaultLocation = createMock(Location.class); Provider optionsProvider = createMock(Provider.class); Provider templateBuilderProvider = createMock(Provider.class); @@ -520,7 +521,7 @@ public class TemplateBuilderImplTest { replay(templateBuilderProvider); TemplateBuilderImpl template = createTemplateBuilder(null, locations, images, hardwares, defaultLocation, - optionsProvider, templateBuilderProvider); + optionsProvider, templateBuilderProvider); template.imageDescriptionMatches("imageDescriptionMatches"); template.imageNameMatches("imageNameMatches"); diff --git a/core/src/main/java/org/jclouds/collect/Memoized.java b/core/src/main/java/org/jclouds/collect/Memoized.java new file mode 100755 index 0000000000..efe20ce57e --- /dev/null +++ b/core/src/main/java/org/jclouds/collect/Memoized.java @@ -0,0 +1,42 @@ +/** + * + * 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.collect; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; + +/** + * Designates that this object is going to return cached results + * + * @author Adrian Cole + */ +@Target( { TYPE, METHOD, PARAMETER }) +@Retention(RUNTIME) +@Qualifier +public @interface Memoized { + +} diff --git a/core/src/main/resources/rest.properties b/core/src/main/resources/rest.properties index d1f83c0aa7..32844739b3 100644 --- a/core/src/main/resources/rest.properties +++ b/core/src/main/resources/rest.properties @@ -92,7 +92,6 @@ gogrid.contextbuilder=org.jclouds.gogrid.GoGridContextBuilder ibmdev.propertiesbuilder=org.jclouds.ibmdev.IBMDeveloperCloudPropertiesBuilder ibmdev.contextbuilder=org.jclouds.ibmdev.IBMDeveloperCloudContextBuilder -stub.propertiesbuilder=org.jclouds.compute.stub.StubComputeServicePropertiesBuilder stub.contextbuilder=org.jclouds.compute.stub.StubComputeServiceContextBuilder # example of where to change your endpoint # bluelock.endpoint=https://express3.bluelock.com/api diff --git a/filesystem/src/main/java/org/jclouds/filesystem/FilesystemAsyncBlobStore.java b/filesystem/src/main/java/org/jclouds/filesystem/FilesystemAsyncBlobStore.java index 7a7821ecd6..3ffde30ddf 100644 --- a/filesystem/src/main/java/org/jclouds/filesystem/FilesystemAsyncBlobStore.java +++ b/filesystem/src/main/java/org/jclouds/filesystem/FilesystemAsyncBlobStore.java @@ -38,12 +38,12 @@ import static com.google.common.util.concurrent.Futures.immediateFuture; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; -import java.io.File; import java.net.URI; import java.util.Collection; import java.util.Date; @@ -55,10 +55,16 @@ import java.util.TreeSet; import java.util.Map.Entry; import java.util.concurrent.ExecutorService; +import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Named; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import org.jclouds.Constants; +import org.jclouds.blobstore.BlobStoreContext; +import org.jclouds.blobstore.ContainerNotFoundException; +import org.jclouds.blobstore.KeyNotFoundException; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobMetadata; import org.jclouds.blobstore.domain.MutableBlobMetadata; @@ -67,6 +73,7 @@ import org.jclouds.blobstore.domain.PageSet; import org.jclouds.blobstore.domain.StorageMetadata; import org.jclouds.blobstore.domain.StorageType; import org.jclouds.blobstore.domain.Blob.Factory; +import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl; import org.jclouds.blobstore.domain.internal.MutableStorageMetadataImpl; import org.jclouds.blobstore.domain.internal.PageSetImpl; import org.jclouds.blobstore.functions.HttpGetOptionsListToGetOptions; @@ -75,17 +82,23 @@ import org.jclouds.blobstore.options.GetOptions; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.strategy.IfDirectoryReturnNameStrategy; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.crypto.Crypto; import org.jclouds.crypto.CryptoStreams; import org.jclouds.date.DateService; import org.jclouds.domain.Location; +import org.jclouds.filesystem.predicates.validators.FilesystemContainerNameValidator; import org.jclouds.filesystem.strategy.FilesystemStorageStrategy; import org.jclouds.http.HttpCommand; import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpResponse; import org.jclouds.http.HttpResponseException; import org.jclouds.http.options.HttpRequestOptions; +import org.jclouds.io.Payload; import org.jclouds.io.Payloads; +import org.jclouds.io.payloads.FilePayload; +import org.jclouds.logging.Logger; +import org.jclouds.rest.annotations.ParamValidators; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -95,24 +108,11 @@ import com.google.common.collect.Iterables; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.inject.internal.Nullable; -import javax.annotation.Resource; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import org.jclouds.blobstore.BlobStoreContext; -import org.jclouds.blobstore.ContainerNotFoundException; -import org.jclouds.blobstore.KeyNotFoundException; -import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl; -import org.jclouds.filesystem.predicates.validators.FilesystemContainerNameValidator; -import org.jclouds.io.Payload; -import org.jclouds.io.payloads.FilePayload; -import org.jclouds.logging.Logger; -import org.jclouds.rest.annotations.ParamValidators; /** - * - * Preconditions: - * Blob name cannot start with / char (or \ under windows) - * + * + * Preconditions: Blob name cannot start with / char (or \ under windows) + * * @author Alfredo "Rainbowbreeze" Morresi */ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { @@ -127,17 +127,14 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { protected final Factory blobFactory; protected final FilesystemStorageStrategy storageStrategy; - @Inject protected FilesystemAsyncBlobStore(BlobStoreContext context, DateService dateService, Crypto crypto, HttpGetOptionsListToGetOptions httpGetOptionsConverter, IfDirectoryReturnNameStrategy ifDirectoryReturnName, Blob.Factory blobFactory, BlobUtils blobUtils, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, - Supplier defaultLocation, - Supplier> locations, - FilesystemStorageStrategy storageStrategy) { + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier defaultLocation, + @Memoized Supplier> locations, FilesystemStorageStrategy storageStrategy) { super(context, blobUtils, service, defaultLocation, locations); - //super(context, blobUtils, service, null, null); + // super(context, blobUtils, service, null, null); this.blobFactory = blobFactory; this.dateService = dateService; this.crypto = crypto; @@ -156,23 +153,20 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { if (!containerExistsSyncImpl(container)) { return immediateFailedFuture(cnfe(container)); } - + // Loading blobs from container Iterable blobBelongingToContainer = null; try { - blobBelongingToContainer = storageStrategy.getBlobKeysInsideContainer(container); - } catch(IOException e) { - logger.error(e, - "An error occurred loading blobs contained into container %s", - container); - Throwables.propagate(e); - } - + blobBelongingToContainer = storageStrategy.getBlobKeysInsideContainer(container); + } catch (IOException e) { + logger.error(e, "An error occurred loading blobs contained into container %s", container); + Throwables.propagate(e); + } SortedSet contents = newTreeSet(transform(blobBelongingToContainer, - new Function() { - public StorageMetadata apply(String key) { - Blob oldBlob = loadFileBlob(container, key); + new Function() { + public StorageMetadata apply(String key) { + Blob oldBlob = loadFileBlob(container, key); checkState(oldBlob != null, "blob " + key + " is not present although it was in the list of " + container); @@ -188,65 +182,66 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { })); String marker = null; - if(options!=null) { - if (options.getMarker() != null) { - final String finalMarker = options.getMarker(); - StorageMetadata lastMarkerMetadata = find(contents, new Predicate() { - public boolean apply(StorageMetadata metadata) { - return metadata.getName().equals(finalMarker); - } - }); - contents = contents.tailSet(lastMarkerMetadata); - contents.remove(lastMarkerMetadata); - } + if (options != null) { + if (options.getMarker() != null) { + final String finalMarker = options.getMarker(); + StorageMetadata lastMarkerMetadata = find(contents, new Predicate() { + public boolean apply(StorageMetadata metadata) { + return metadata.getName().equals(finalMarker); + } + }); + contents = contents.tailSet(lastMarkerMetadata); + contents.remove(lastMarkerMetadata); + } - final String prefix = options.getDir(); - if (prefix != null) { - contents = newTreeSet(filter(contents, new Predicate() { - public boolean apply(StorageMetadata o) { - return (o != null && o.getName().startsWith(prefix) && !o.getName().equals(prefix)); - } - })); - } + final String prefix = options.getDir(); + if (prefix != null) { + contents = newTreeSet(filter(contents, new Predicate() { + public boolean apply(StorageMetadata o) { + return (o != null && o.getName().startsWith(prefix) && !o.getName().equals(prefix)); + } + })); + } - Integer maxResults = options.getMaxResults() != null ? options.getMaxResults() : 1000; - if (contents.size() > 0) { - SortedSet contentsSlice = firstSliceOfSize(contents, maxResults); - if (!contentsSlice.contains(contents.last())) { - // Partial listing - marker = contentsSlice.last().getName(); - } else { - marker = null; - } - contents = contentsSlice; - } + Integer maxResults = options.getMaxResults() != null ? options.getMaxResults() : 1000; + if (contents.size() > 0) { + SortedSet contentsSlice = firstSliceOfSize(contents, maxResults); + if (!contentsSlice.contains(contents.last())) { + // Partial listing + marker = contentsSlice.last().getName(); + } else { + marker = null; + } + contents = contentsSlice; + } - final String delimiter = options.isRecursive() ? null : File.separator; - if (delimiter != null) { - SortedSet commonPrefixes = null; - Iterable iterable = transform(contents, new CommonPrefixes(prefix != null ? prefix : null, delimiter)); - commonPrefixes = iterable != null ? newTreeSet(iterable) : new TreeSet(); - commonPrefixes.remove(CommonPrefixes.NO_PREFIX); + final String delimiter = options.isRecursive() ? null : File.separator; + if (delimiter != null) { + SortedSet commonPrefixes = null; + Iterable iterable = transform(contents, new CommonPrefixes(prefix != null ? prefix : null, + delimiter)); + commonPrefixes = iterable != null ? newTreeSet(iterable) : new TreeSet(); + commonPrefixes.remove(CommonPrefixes.NO_PREFIX); - contents = newTreeSet(filter(contents, new DelimiterFilter(prefix != null ? prefix : null, delimiter))); + contents = newTreeSet(filter(contents, new DelimiterFilter(prefix != null ? prefix : null, delimiter))); - Iterables. addAll(contents, transform(commonPrefixes, - new Function() { - public StorageMetadata apply(String o) { - MutableStorageMetadata md = new MutableStorageMetadataImpl(); - md.setType(StorageType.RELATIVE_PATH); - md.setName(o); - return md; - } - })); - } + Iterables. addAll(contents, transform(commonPrefixes, + new Function() { + public StorageMetadata apply(String o) { + MutableStorageMetadata md = new MutableStorageMetadataImpl(); + md.setType(StorageType.RELATIVE_PATH); + md.setName(o); + return md; + } + })); + } - // trim metadata, if the response isn't supposed to be detailed. - if (!options.isDetailed()) { - for (StorageMetadata md : contents) { - md.getUserMetadata().clear(); - } - } + // trim metadata, if the response isn't supposed to be detailed. + if (!options.isDetailed()) { + for (StorageMetadata md : contents) { + md.getUserMetadata().clear(); + } + } } return Futures.> immediateFuture(new PageSetImpl(contents, @@ -254,7 +249,6 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { } - private ContainerNotFoundException cnfe(final String name) { return new ContainerNotFoundException(name, String.format("container %s not in filesystem", name)); } @@ -295,37 +289,36 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { */ @Override public ListenableFuture removeBlob(final String container, final String key) { - storageStrategy.removeBlob(container, key); - return immediateFuture(null); + storageStrategy.removeBlob(container, key); + return immediateFuture(null); } - /** * {@inheritDoc} */ @Override public ListenableFuture containerExists(final String containerName) { - boolean exists = containerExistsSyncImpl(containerName); - return immediateFuture(exists); + boolean exists = containerExistsSyncImpl(containerName); + return immediateFuture(exists); } - /** + /** * {@inheritDoc} */ - @Override - public ListenableFuture> list() { - Iterable containers = storageStrategy.getAllContainerNames(); + @Override + public ListenableFuture> list() { + Iterable containers = storageStrategy.getAllContainerNames(); - return Futures.> immediateFuture(new PageSetImpl(transform( - containers, new Function() { - public StorageMetadata apply(String name) { - MutableStorageMetadata cmd = create(); - cmd.setName(name); - cmd.setType(StorageType.CONTAINER); - return cmd; - } - }), null)); - } + return Futures.> immediateFuture(new PageSetImpl(transform( + containers, new Function() { + public StorageMetadata apply(String name) { + MutableStorageMetadata cmd = create(); + cmd.setName(name); + cmd.setType(StorageType.CONTAINER); + return cmd; + } + }), null)); + } protected MutableStorageMetadata create() { return new MutableStorageMetadataImpl(); @@ -336,11 +329,10 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { */ @Path("{container}") @Override - public ListenableFuture createContainerInLocation( - final Location location, - @PathParam("container") @ParamValidators( { FilesystemContainerNameValidator.class }) String name) { - boolean result = storageStrategy.createContainer(name); - return immediateFuture(result); + public ListenableFuture createContainerInLocation(final Location location, + @PathParam("container") @ParamValidators( { FilesystemContainerNameValidator.class }) String name) { + boolean result = storageStrategy.createContainer(name); + return immediateFuture(result); } public String getFirstQueryOrNull(String string, @Nullable HttpRequestOptions options) { @@ -350,44 +342,44 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { return (values != null && values.size() >= 1) ? values.iterator().next() : null; } - /** - * Load the blob with the given key belonging to the container with the given - * name. There must exist a resource on the file system whose complete name - * is given concatenating the container name and the key - * - * @param container it's the name of the container the blob belongs to - * @param key it's the key of the blob - * - * @return the blob belonging to the given container with the given key - */ - private Blob loadFileBlob(final String container, final String key) { - logger.debug("Opening blob in container: %s - %s", container, key); - File blobPayload = storageStrategy.getFileForBlobKey(container, key); - - Payload payload = new FilePayload(blobPayload); - // Loading object metadata - MutableBlobMetadata metadata = new MutableBlobMetadataImpl(); - metadata.setName(key); - metadata.setLastModified(new Date(blobPayload.lastModified())); - metadata.getContentMetadata().setContentLength(blobPayload.length()); - // TODO What about the MD5? are we supposed to calculate it each time we load - //the file? - try { - payload = Payloads.calculateMD5(payload); - } catch (IOException e) { - logger.error("An error occurred calculating MD5 for blob %s from container ", key, container); - Throwables.propagateIfPossible(e); - } - metadata.getContentMetadata().setContentType(""); - String eTag = CryptoStreams.hex(payload.getContentMetadata().getContentMD5()); - metadata.setETag(eTag); - // Creating new blob object - Blob blob = blobFactory.create(metadata); - blob.setPayload(blobPayload); - return blob; - } - + /** + * Load the blob with the given key belonging to the container with the given name. There must + * exist a resource on the file system whose complete name is given concatenating the container + * name and the key + * + * @param container + * it's the name of the container the blob belongs to + * @param key + * it's the key of the blob + * + * @return the blob belonging to the given container with the given key + */ + private Blob loadFileBlob(final String container, final String key) { + logger.debug("Opening blob in container: %s - %s", container, key); + File blobPayload = storageStrategy.getFileForBlobKey(container, key); + Payload payload = new FilePayload(blobPayload); + // Loading object metadata + MutableBlobMetadata metadata = new MutableBlobMetadataImpl(); + metadata.setName(key); + metadata.setLastModified(new Date(blobPayload.lastModified())); + metadata.getContentMetadata().setContentLength(blobPayload.length()); + // TODO What about the MD5? are we supposed to calculate it each time we load + // the file? + try { + payload = Payloads.calculateMD5(payload); + } catch (IOException e) { + logger.error("An error occurred calculating MD5 for blob %s from container ", key, container); + Throwables.propagateIfPossible(e); + } + metadata.getContentMetadata().setContentType(""); + String eTag = CryptoStreams.hex(payload.getContentMetadata().getContentMD5()); + metadata.setETag(eTag); + // Creating new blob object + Blob blob = blobFactory.create(metadata); + blob.setPayload(blobPayload); + return blob; + } protected static class DelimiterFilter implements Predicate { private final String prefix; @@ -496,14 +488,13 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { logger.debug("Put object with key [%s] to container [%s]", blobKey, containerName); String eTag = getEtag(object); try { - //TODO - //must override existing file? + // TODO + // must override existing file? storageStrategy.writePayloadOnFile(containerName, blobKey, object.getPayload()); } catch (IOException e) { - logger.error(e, "An error occurred storing the new object with name [%s] to container [%s].", - blobKey, - containerName); + logger.error(e, "An error occurred storing the new object with name [%s] to container [%s].", blobKey, + containerName); Throwables.propagate(e); } return immediateFuture(eTag); @@ -522,9 +513,9 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { */ @Override public ListenableFuture getBlob(final String containerName, final String key, GetOptions options) { - logger.debug("Retrieving blob with key %s from container %s", key,containerName); + logger.debug("Retrieving blob with key %s from container %s", key, containerName); // If the container doesn't exist, an exception is thrown - if(!containerExistsSyncImpl(containerName)) { + if (!containerExistsSyncImpl(containerName)) { logger.debug("Container %s does not exist", containerName); return immediateFailedFuture(cnfe(containerName)); } @@ -536,63 +527,63 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { Blob blob = loadFileBlob(containerName, key); - if(options!=null) { - if (options.getIfMatch() != null) { - if (!blob.getMetadata().getETag().equals(options.getIfMatch())) - return immediateFailedFuture(returnResponseException(412)); - } - if (options.getIfNoneMatch() != null) { - if (blob.getMetadata().getETag().equals(options.getIfNoneMatch())) - return immediateFailedFuture(returnResponseException(304)); - } - if (options.getIfModifiedSince() != null) { - Date modifiedSince = options.getIfModifiedSince(); + if (options != null) { + if (options.getIfMatch() != null) { + if (!blob.getMetadata().getETag().equals(options.getIfMatch())) + return immediateFailedFuture(returnResponseException(412)); + } + if (options.getIfNoneMatch() != null) { + if (blob.getMetadata().getETag().equals(options.getIfNoneMatch())) + return immediateFailedFuture(returnResponseException(304)); + } + if (options.getIfModifiedSince() != null) { + Date modifiedSince = options.getIfModifiedSince(); if (blob.getMetadata().getLastModified().before(modifiedSince)) { - HttpResponse response = new HttpResponse(304, null, null); - return immediateFailedFuture(new HttpResponseException(String.format("%1$s is before %2$s", blob - .getMetadata().getLastModified(), modifiedSince), null, response)); + HttpResponse response = new HttpResponse(304, null, null); + return immediateFailedFuture(new HttpResponseException(String.format("%1$s is before %2$s", blob + .getMetadata().getLastModified(), modifiedSince), null, response)); } - } - if (options.getIfUnmodifiedSince() != null) { - Date unmodifiedSince = options.getIfUnmodifiedSince(); - if (blob.getMetadata().getLastModified().after(unmodifiedSince)) { - HttpResponse response = new HttpResponse(412, null, null); - return immediateFailedFuture(new HttpResponseException(String.format("%1$s is after %2$s", blob - .getMetadata().getLastModified(), unmodifiedSince), null, response)); - } - } + } + if (options.getIfUnmodifiedSince() != null) { + Date unmodifiedSince = options.getIfUnmodifiedSince(); + if (blob.getMetadata().getLastModified().after(unmodifiedSince)) { + HttpResponse response = new HttpResponse(412, null, null); + return immediateFailedFuture(new HttpResponseException(String.format("%1$s is after %2$s", blob + .getMetadata().getLastModified(), unmodifiedSince), null, response)); + } + } - if (options.getRanges() != null && options.getRanges().size() > 0) { - byte[] data; - try { - data = toByteArray(blob.getPayload().getInput()); - } catch (IOException e) { - return immediateFailedFuture(new RuntimeException(e)); - } - ByteArrayOutputStream out = new ByteArrayOutputStream(); - for (String s : options.getRanges()) { - if (s.startsWith("-")) { - int length = Integer.parseInt(s.substring(1)); - out.write(data, data.length - length, length); - } else if (s.endsWith("-")) { - int offset = Integer.parseInt(s.substring(0, s.length() - 1)); - out.write(data, offset, data.length - offset); - } else if (s.contains("-")) { - String[] firstLast = s.split("\\-"); - int offset = Integer.parseInt(firstLast[0]); - int last = Integer.parseInt(firstLast[1]); - int length = (last < data.length) ? last + 1 : data.length - offset; - out.write(data, offset, length); - } else { - return immediateFailedFuture(new IllegalArgumentException("first and last were null!")); - } + if (options.getRanges() != null && options.getRanges().size() > 0) { + byte[] data; + try { + data = toByteArray(blob.getPayload().getInput()); + } catch (IOException e) { + return immediateFailedFuture(new RuntimeException(e)); + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (String s : options.getRanges()) { + if (s.startsWith("-")) { + int length = Integer.parseInt(s.substring(1)); + out.write(data, data.length - length, length); + } else if (s.endsWith("-")) { + int offset = Integer.parseInt(s.substring(0, s.length() - 1)); + out.write(data, offset, data.length - offset); + } else if (s.contains("-")) { + String[] firstLast = s.split("\\-"); + int offset = Integer.parseInt(firstLast[0]); + int last = Integer.parseInt(firstLast[1]); + int length = (last < data.length) ? last + 1 : data.length - offset; + out.write(data, offset, length); + } else { + return immediateFailedFuture(new IllegalArgumentException("first and last were null!")); + } - } - blob.setPayload(out.toByteArray()); - blob.getMetadata().getContentMetadata().setContentLength(new Long(data.length)); - } - } + } + blob.setPayload(out.toByteArray()); + blob.getMetadata().getContentMetadata().setContentLength(new Long(data.length)); + } + } checkNotNull(blob.getPayload(), "payload " + blob); return immediateFuture(blob); } @@ -618,11 +609,10 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { return containerExistsSyncImpl(container); } - /** - * Override parent method because it uses strange futures and listenables - * that creates problem in the test if more than one test that deletes the - * container is executed + * Override parent method because it uses strange futures and listenables that creates problem in + * the test if more than one test that deletes the container is executed + * * @param container * @return */ @@ -632,35 +622,33 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore { return immediateFuture(null); } - /** - * Each container is a directory, so in order to check if a container exists - * the corresponding directory must exists. Synchronous implementation + * Each container is a directory, so in order to check if a container exists the corresponding + * directory must exists. Synchronous implementation + * * @param containerName * @return */ private boolean containerExistsSyncImpl(String containerName) { - return storageStrategy.containerExists(containerName); + return storageStrategy.containerExists(containerName); } - - /** - * + * * Calculates the object MD5 and returns it as eTag + * * @param object * @return */ - private String getEtag(Blob object) { - try { - Payloads.calculateMD5(object, crypto.md5()); - } catch (IOException ex) { - logger.error(ex, "An error occurred calculating MD5 for object with name %s.", - object.getMetadata().getName()); - Throwables.propagate(ex); - } + private String getEtag(Blob object) { + try { + Payloads.calculateMD5(object, crypto.md5()); + } catch (IOException ex) { + logger.error(ex, "An error occurred calculating MD5 for object with name %s.", object.getMetadata().getName()); + Throwables.propagate(ex); + } - String eTag = CryptoStreams.hex(object.getPayload().getContentMetadata().getContentMD5()); - return eTag; - } + String eTag = CryptoStreams.hex(object.getPayload().getContentMetadata().getContentMD5()); + return eTag; + } } diff --git a/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java b/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java index 0f6ce99731..548c216374 100644 --- a/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java +++ b/filesystem/src/main/java/org/jclouds/filesystem/config/FilesystemBlobStoreContextModule.java @@ -19,15 +19,8 @@ package org.jclouds.filesystem.config; -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.Singleton; -import com.google.inject.TypeLiteral; import java.util.Set; + import org.jclouds.blobstore.AsyncBlobStore; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStoreContext; @@ -36,6 +29,7 @@ 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; @@ -48,8 +42,17 @@ import org.jclouds.filesystem.strategy.FilesystemStorageStrategy; import org.jclouds.filesystem.strategy.internal.FilesystemStorageStrategyImpl; import org.jclouds.filesystem.util.internal.FileSystemBlobUtilsImpl; +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.Singleton; +import com.google.inject.TypeLiteral; + /** - * + * * @author Alfredo "Rainbowbreeze" Morresi */ public class FilesystemBlobStoreContextModule extends AbstractModule { @@ -76,6 +79,7 @@ public class FilesystemBlobStoreContextModule extends AbstractModule { @Provides @Singleton + @Memoized Supplier> provideLocations(Supplier defaultLocation) { return Suppliers.> ofInstance(ImmutableSet.of(defaultLocation.get())); } diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModule.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModule.java index 449e74e266..c1ddef2233 100755 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModule.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModule.java @@ -20,61 +20,32 @@ package org.jclouds.gogrid.compute.config; import static org.jclouds.compute.domain.OsFamily.CENTOS; -import static org.jclouds.compute.util.ComputeServiceUtils.getCores; -import static org.jclouds.compute.util.ComputeServiceUtils.getSpace; -import static org.jclouds.gogrid.reference.GoGridConstants.PROPERTY_GOGRID_DEFAULT_DC; -import java.util.Map; import java.util.Set; -import javax.inject.Singleton; -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.LoadBalancerService; import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.config.ComputeServiceTimeoutsModule; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; 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.domain.Location; -import org.jclouds.gogrid.GoGridAsyncClient; -import org.jclouds.gogrid.GoGridClient; -import org.jclouds.gogrid.compute.functions.ServerToNodeMetadata; import org.jclouds.gogrid.compute.strategy.GoGridAddNodeWithTagStrategy; import org.jclouds.gogrid.compute.strategy.GoGridDestroyNodeStrategy; import org.jclouds.gogrid.compute.strategy.GoGridGetNodeMetadataStrategy; import org.jclouds.gogrid.compute.strategy.GoGridListNodesStrategy; import org.jclouds.gogrid.compute.strategy.GoGridRebootNodeStrategy; +import org.jclouds.gogrid.compute.suppliers.GoGridDefaultLocationSupplier; import org.jclouds.gogrid.compute.suppliers.GoGridHardwareSupplier; import org.jclouds.gogrid.compute.suppliers.GoGridImageSupplier; import org.jclouds.gogrid.compute.suppliers.GoGridLocationSupplier; -import org.jclouds.gogrid.domain.Server; -import org.jclouds.gogrid.domain.ServerState; -import org.jclouds.rest.RestContext; -import org.jclouds.rest.internal.RestContextImpl; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.base.Predicate; import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.Provides; -import com.google.inject.Scopes; -import com.google.inject.TypeLiteral; -import com.google.inject.name.Names; -import com.google.inject.util.Providers; /** * @author Oleksiy Yarmula @@ -84,21 +55,8 @@ public class GoGridComputeServiceContextModule extends BaseComputeServiceContext @Override protected void configure() { - install(new ComputeServiceTimeoutsModule()); - bind(new TypeLiteral>() { - }).to(ServerToNodeMetadata.class); - bind(LoadBalancerService.class).toProvider(Providers. of(null)); - bind(new TypeLiteral() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - bind(new TypeLiteral>() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - bind(AddNodeWithTagStrategy.class).to(GoGridAddNodeWithTagStrategy.class); - bind(ListNodesStrategy.class).to(GoGridListNodesStrategy.class); - bind(GetNodeMetadataStrategy.class).to(GoGridGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(GoGridRebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(GoGridDestroyNodeStrategy.class); + install(new GoGridComputeServiceDependenciesModule()); + super.configure(); } @Override @@ -106,85 +64,48 @@ public class GoGridComputeServiceContextModule extends BaseComputeServiceContext return template.osFamily(CENTOS).imageNameMatches(".*w/ None.*"); } - @VisibleForTesting - static final Map serverStateToNodeState = ImmutableMap. builder() - .put(ServerState.ON, NodeState.RUNNING)// - .put(ServerState.STARTING, NodeState.PENDING)// - .put(ServerState.OFF, NodeState.SUSPENDED)// - .put(ServerState.STOPPING, NodeState.PENDING)// - .put(ServerState.RESTARTING, NodeState.PENDING)// - .put(ServerState.SAVING, NodeState.PENDING)// - .put(ServerState.UNRECOGNIZED, NodeState.UNRECOGNIZED)// - .put(ServerState.RESTORING, NodeState.PENDING)// - .put(ServerState.UPDATING, NodeState.PENDING).build(); - - @Singleton - @Provides - Map provideServerToNodeState() { - return serverStateToNodeState; - } - - /** - * Finds matches to required configurations. GoGrid's documentation only specifies how much RAM - * one can get with different instance types. The # of cores and disk sizes are purely empyrical - * and aren't guaranteed. However, these are the matches found: Ram: 512MB, CPU: 1 core, HDD: 28 - * GB Ram: 1GB, CPU: 1 core, HDD: 57 GB Ram: 2GB, CPU: 1 core, HDD: 113 GB Ram: 4GB, CPU: 3 - * cores, HDD: 233 GB Ram: 8GB, CPU: 6 cores, HDD: 462 GB (as of March 2010) - * - * @return matched size - */ - @Singleton - @Provides - Function provideSizeToRam() { - return new Function() { - @Override - public String apply(Hardware hardware) { - if (hardware.getRam() >= 8 * 1024 || getCores(hardware) >= 6 || getSpace(hardware) >= 450) - return "8GB"; - if (hardware.getRam() >= 4 * 1024 || getCores(hardware) >= 3 || getSpace(hardware) >= 230) - return "4GB"; - if (hardware.getRam() >= 2 * 1024 || getSpace(hardware) >= 110) - return "2GB"; - if (hardware.getRam() >= 1024 || getSpace(hardware) >= 55) - return "1GB"; - return "512MB"; /* smallest */ - } - }; + @Override + protected Class defineAddNodeWithTagStrategy() { + return GoGridAddNodeWithTagStrategy.class; } @Override - protected Supplier supplyDefaultLocation(Injector injector, Supplier> locations) { - final String defaultDC = injector.getInstance(Key.get(String.class, Names.named(PROPERTY_GOGRID_DEFAULT_DC))); - return Suppliers.compose(new Function, Location>() { - - @Override - public Location apply(Set from) { - return Iterables.find(from, new Predicate() { - - @Override - public boolean apply(Location input) { - return input.getId().equals(defaultDC); - } - - }); - } - - }, locations); - + protected Class defineDestroyNodeStrategy() { + return GoGridDestroyNodeStrategy.class; } @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(GoGridImageSupplier.class); + protected Class defineGetNodeMetadataStrategy() { + return GoGridGetNodeMetadataStrategy.class; } @Override - protected Supplier> getSourceLocationSupplier(Injector injector) { - return injector.getInstance(GoGridLocationSupplier.class); + protected Class>> defineHardwareSupplier() { + return GoGridHardwareSupplier.class; } @Override - protected Supplier> getSourceSizeSupplier(Injector injector) { - return injector.getInstance(GoGridHardwareSupplier.class); + protected Class>> defineImageSupplier() { + return GoGridImageSupplier.class; + } + + @Override + protected Class defineListNodesStrategy() { + return GoGridListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return GoGridRebootNodeStrategy.class; + } + + @Override + protected Class> defineDefaultLocationSupplier() { + return GoGridDefaultLocationSupplier.class; + } + + @Override + protected Class>> defineLocationSupplier() { + return GoGridLocationSupplier.class; } } diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceDependenciesModule.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceDependenciesModule.java new file mode 100644 index 0000000000..097aa4ca62 --- /dev/null +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceDependenciesModule.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.gogrid.compute.config; + +import static org.jclouds.compute.util.ComputeServiceUtils.getCores; +import static org.jclouds.compute.util.ComputeServiceUtils.getSpace; + +import java.util.Map; + +import javax.inject.Singleton; + +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.internal.ComputeServiceContextImpl; +import org.jclouds.gogrid.GoGridAsyncClient; +import org.jclouds.gogrid.GoGridClient; +import org.jclouds.gogrid.compute.functions.ServerToNodeMetadata; +import org.jclouds.gogrid.domain.Server; +import org.jclouds.gogrid.domain.ServerState; +import org.jclouds.rest.RestContext; +import org.jclouds.rest.internal.RestContextImpl; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; +import com.google.common.collect.ImmutableMap; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; + +/** + * @author Oleksiy Yarmula + * @author Adrian Cole + */ +public class GoGridComputeServiceDependenciesModule extends AbstractModule { + + @Override + protected void configure() { + bind(new TypeLiteral>() { + }).to(ServerToNodeMetadata.class); + bind(new TypeLiteral() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + bind(new TypeLiteral>() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + } + + @VisibleForTesting + static final Map serverStateToNodeState = ImmutableMap. builder() + .put(ServerState.ON, NodeState.RUNNING)// + .put(ServerState.STARTING, NodeState.PENDING)// + .put(ServerState.OFF, NodeState.SUSPENDED)// + .put(ServerState.STOPPING, NodeState.PENDING)// + .put(ServerState.RESTARTING, NodeState.PENDING)// + .put(ServerState.SAVING, NodeState.PENDING)// + .put(ServerState.UNRECOGNIZED, NodeState.UNRECOGNIZED)// + .put(ServerState.RESTORING, NodeState.PENDING)// + .put(ServerState.UPDATING, NodeState.PENDING).build(); + + @Singleton + @Provides + Map provideServerToNodeState() { + return serverStateToNodeState; + } + + /** + * Finds matches to required configurations. GoGrid's documentation only specifies how much RAM + * one can get with different instance types. The # of cores and disk sizes are purely empyrical + * and aren't guaranteed. However, these are the matches found: Ram: 512MB, CPU: 1 core, HDD: 28 + * GB Ram: 1GB, CPU: 1 core, HDD: 57 GB Ram: 2GB, CPU: 1 core, HDD: 113 GB Ram: 4GB, CPU: 3 + * cores, HDD: 233 GB Ram: 8GB, CPU: 6 cores, HDD: 462 GB (as of March 2010) + * + * @return matched size + */ + @Singleton + @Provides + Function provideSizeToRam() { + return new Function() { + @Override + public String apply(Hardware hardware) { + if (hardware.getRam() >= 8 * 1024 || getCores(hardware) >= 6 || getSpace(hardware) >= 450) + return "8GB"; + if (hardware.getRam() >= 4 * 1024 || getCores(hardware) >= 3 || getSpace(hardware) >= 230) + return "4GB"; + if (hardware.getRam() >= 2 * 1024 || getSpace(hardware) >= 110) + return "2GB"; + if (hardware.getRam() >= 1024 || getSpace(hardware) >= 55) + return "1GB"; + return "512MB"; /* smallest */ + } + }; + } +} diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java index 1967083cd6..28670853c2 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java @@ -30,6 +30,7 @@ import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; @@ -72,8 +73,8 @@ public class ServerToNodeMetadata implements Function { @Override public boolean apply(Image input) { return input.getProviderId().equals(instance.getImage().getId() + "") - && (input.getLocation() == null || input.getLocation().getId() - .equals(instance.getDatacenter().getId() + "")); + && (input.getLocation() == null || input.getLocation().getId().equals( + instance.getDatacenter().getId() + "")); } } @@ -93,8 +94,8 @@ public class ServerToNodeMetadata implements Function { @Inject ServerToNodeMetadata(Map serverStateToNodeState, GoGridClient client, - Supplier> images, Supplier> hardwares, - Supplier> locations) { + @Memoized Supplier> images, @Memoized Supplier> hardwares, + Supplier> locations) { this.serverStateToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState"); this.client = checkNotNull(client, "client"); this.images = checkNotNull(images, "images"); @@ -111,11 +112,11 @@ public class ServerToNodeMetadata implements Function { builder.tag(parseTagFromName(from.getName())); builder.hardware(parseHardware(from)); builder.imageId(from.getImage().getId() + ""); - + Image image = parseImage(from); if (image != null) builder.operatingSystem(image.getOperatingSystem()); - + builder.state(serverStateToNodeState.get(from.getState())); builder.publicAddresses(ImmutableSet.of(from.getIp().getIp())); builder.credentials(client.getServerServices().getServerCredentialsList().get(from.getName())); diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridDefaultLocationSupplier.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridDefaultLocationSupplier.java new file mode 100644 index 0000000000..63d1067ebe --- /dev/null +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridDefaultLocationSupplier.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.gogrid.compute.suppliers; + +import static org.jclouds.gogrid.reference.GoGridConstants.PROPERTY_GOGRID_DEFAULT_DC; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.collect.Memoized; +import org.jclouds.domain.Location; + +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class GoGridDefaultLocationSupplier implements Supplier { + private final Supplier> locations; + private final String defaultDC; + + @Inject + GoGridDefaultLocationSupplier(@Memoized Supplier> locations, + @Named(PROPERTY_GOGRID_DEFAULT_DC) String defaultDC) { + this.locations = locations; + this.defaultDC = defaultDC; + } + + @Override + public Location get() { + return Iterables.find(locations.get(), new Predicate() { + + @Override + public boolean apply(Location input) { + return input.getId().equals(defaultDC); + } + + }); + } +} \ No newline at end of file diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridHardwareSupplier.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridHardwareSupplier.java index ae8ee11f1b..72ed1e9eab 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridHardwareSupplier.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridHardwareSupplier.java @@ -40,21 +40,21 @@ import com.google.common.collect.ImmutableSet; @Singleton public class GoGridHardwareSupplier implements Supplier> { - public static final Hardware H8192 = new HardwareBuilder().ids("5").ram(8192) - .processors(ImmutableList.of(new Processor(8, 1.0))) - .volumes(ImmutableList. of(new VolumeImpl(480.0f, true, true))).build(); - public static final Hardware H4096 = new HardwareBuilder().ids("4").ram(4096) - .processors(ImmutableList.of(new Processor(4, 1.0))) - .volumes(ImmutableList. of(new VolumeImpl(240.0f, true, true))).build(); - public static final Hardware H2048 = new HardwareBuilder().ids("3").ram(2048) - .processors(ImmutableList.of(new Processor(2, 1.0))) - .volumes(ImmutableList. of(new VolumeImpl(120.0f, true, true))).build(); - public static final Hardware H1024 = new HardwareBuilder().ids("2").ram(1024) - .processors(ImmutableList.of(new Processor(1, 1.0))) - .volumes(ImmutableList. of(new VolumeImpl(60.0f, true, true))).build(); - public static final Hardware H512 = new HardwareBuilder().ids("1").ram(512) - .processors(ImmutableList.of(new Processor(0.5, 1.0))) - .volumes(ImmutableList. of(new VolumeImpl(30.0f, true, true))).build(); + public static final Hardware H8192 = new HardwareBuilder().ids("5").ram(8192).processors( + ImmutableList.of(new Processor(8, 1.0))).volumes( + ImmutableList. of(new VolumeImpl(480.0f, true, true))).build(); + public static final Hardware H4096 = new HardwareBuilder().ids("4").ram(4096).processors( + ImmutableList.of(new Processor(4, 1.0))).volumes( + ImmutableList. of(new VolumeImpl(240.0f, true, true))).build(); + public static final Hardware H2048 = new HardwareBuilder().ids("3").ram(2048).processors( + ImmutableList.of(new Processor(2, 1.0))).volumes( + ImmutableList. of(new VolumeImpl(120.0f, true, true))).build(); + public static final Hardware H1024 = new HardwareBuilder().ids("2").ram(1024).processors( + ImmutableList.of(new Processor(1, 1.0))).volumes( + ImmutableList. of(new VolumeImpl(60.0f, true, true))).build(); + public static final Hardware H512 = new HardwareBuilder().ids("1").ram(512).processors( + ImmutableList.of(new Processor(0.5, 1.0))).volumes( + ImmutableList. of(new VolumeImpl(30.0f, true, true))).build(); public static final ImmutableSet H_ALL = ImmutableSet.of(H512, H1024, H2048, H4096, H8192); diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplier.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplier.java index 142600faca..ee17337bb5 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplier.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/suppliers/GoGridImageSupplier.java @@ -69,7 +69,7 @@ public class GoGridImageSupplier implements Supplier> { Set allImages = sync.getImageServices().getImageList(); for (ServerImage from : allImages) { ImageBuilder builder = new ImageBuilder(); - builder.ids(from.getId()+""); + builder.ids(from.getId() + ""); builder.name(from.getFriendlyName()); builder.description(from.getDescription()); builder.defaultCredentials(authenticator.execute(from)); diff --git a/gogrid/src/test/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModuleTest.java b/gogrid/src/test/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModuleTest.java index ff390a12e7..dc5478829d 100644 --- a/gogrid/src/test/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModuleTest.java +++ b/gogrid/src/test/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModuleTest.java @@ -31,7 +31,7 @@ public class GoGridComputeServiceContextModuleTest { public void testAllStatusCovered() { for (ServerState state : ServerState.values()) { - assert GoGridComputeServiceContextModule.serverStateToNodeState.containsKey(state) : state; + assert GoGridComputeServiceDependenciesModule.serverStateToNodeState.containsKey(state) : state; } } diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesAsyncBlobStore.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesAsyncBlobStore.java index 16d889f13e..21618464ec 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesAsyncBlobStore.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesAsyncBlobStore.java @@ -42,6 +42,7 @@ import org.jclouds.blobstore.internal.BaseAsyncBlobStore; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.concurrent.Futures; import org.jclouds.domain.Location; import org.jclouds.http.options.GetOptions; @@ -83,7 +84,7 @@ public class CloudFilesAsyncBlobStore extends BaseAsyncBlobStore { @Inject CloudFilesAsyncBlobStore(BlobStoreContext context, BlobUtils blobUtils, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier defaultLocation, - Supplier> locations, CloudFilesClient sync, CloudFilesAsyncClient async, + @Memoized Supplier> locations, CloudFilesClient sync, CloudFilesAsyncClient async, ContainerToResourceMetadata container2ResourceMd, BlobStoreListContainerOptionsToListContainerOptions container2ContainerListOptions, ContainerToResourceList container2ResourceList, ObjectToBlob object2Blob, BlobToObject blob2Object, diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesBlobStore.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesBlobStore.java index 18181226d6..d25c2bff5d 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesBlobStore.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesBlobStore.java @@ -39,6 +39,7 @@ import org.jclouds.blobstore.internal.BaseBlobStore; import org.jclouds.blobstore.options.ListContainerOptions; import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata; import org.jclouds.blobstore.util.BlobUtils; +import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; import org.jclouds.http.options.GetOptions; import org.jclouds.rackspace.cloudfiles.CloudFilesClient; @@ -72,7 +73,7 @@ public class CloudFilesBlobStore extends BaseBlobStore { @Inject CloudFilesBlobStore(BlobStoreContext context, BlobUtils blobUtils, Supplier defaultLocation, - Supplier> locations, CloudFilesClient sync, + @Memoized Supplier> locations, CloudFilesClient sync, ContainerToResourceMetadata container2ResourceMd, BlobStoreListContainerOptionsToListContainerOptions container2ContainerListOptions, ContainerToResourceList container2ResourceList, ObjectToBlob object2Blob, BlobToObject blob2Object, diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/config/CloudFilesBlobStoreContextModule.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/config/CloudFilesBlobStoreContextModule.java index d60368d013..ac8fabd248 100755 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/config/CloudFilesBlobStoreContextModule.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudfiles/blobstore/config/CloudFilesBlobStoreContextModule.java @@ -30,13 +30,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.rackspace.cloudfiles.CloudFilesAsyncClient; import org.jclouds.rackspace.cloudfiles.CloudFilesClient; import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesAsyncBlobStore; import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesBlobRequestSigner; import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesBlobStore; -import org.jclouds.rackspace.config.RackspaceLocationsModule; +import org.jclouds.rackspace.config.RackspaceLocationsSupplier; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; @@ -56,8 +57,11 @@ public class CloudFilesBlobStoreContextModule extends AbstractModule { @Override protected void configure() { - install(new RackspaceLocationsModule()); install(new BlobStoreMapModule()); + bind(new TypeLiteral>>() { + }).annotatedWith(Memoized.class).to(new TypeLiteral() { + }); + bind(ConsistencyModel.class).toInstance(ConsistencyModel.STRICT); bind(AsyncBlobStore.class).to(CloudFilesAsyncBlobStore.class).in(Scopes.SINGLETON); bind(BlobStore.class).to(CloudFilesBlobStore.class).in(Scopes.SINGLETON); @@ -68,14 +72,8 @@ public class CloudFilesBlobStoreContextModule extends AbstractModule { @Provides @Singleton - protected Supplier> getSourceLocationSupplier(Set locations) { - return Suppliers.> ofInstance(locations); - } - - @Provides - @Singleton - protected Supplier getLocation(Set locations) { - return Suppliers. ofInstance(Iterables.get(locations, 0)); + protected Supplier getLocation(@Memoized Supplier> locations) { + return Suppliers. ofInstance(Iterables.get(locations.get(), 0)); } } diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java index e1aeeb9ed1..8f54b6431c 100755 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java @@ -21,34 +21,19 @@ package org.jclouds.rackspace.cloudservers.compute.config; import static org.jclouds.compute.domain.OsFamily.UBUNTU; -import java.util.Map; import java.util.Set; -import javax.inject.Singleton; - -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.LoadBalancerService; import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.config.ComputeServiceTimeoutsModule; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.internal.BaseComputeService; -import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; 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.rackspace.cloudservers.CloudServersAsyncClient; -import org.jclouds.rackspace.cloudservers.CloudServersClient; -import org.jclouds.rackspace.cloudservers.compute.functions.CloudServersImageToImage; -import org.jclouds.rackspace.cloudservers.compute.functions.CloudServersImageToOperatingSystem; -import org.jclouds.rackspace.cloudservers.compute.functions.FlavorToHardware; -import org.jclouds.rackspace.cloudservers.compute.functions.ServerToNodeMetadata; +import org.jclouds.domain.Location; import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersAddNodeWithTagStrategy; import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersDestroyNodeStrategy; import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersGetNodeMetadataStrategy; @@ -56,22 +41,10 @@ import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersListNodes import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersRebootNodeStrategy; import org.jclouds.rackspace.cloudservers.compute.suppliers.CloudServersHardwareSupplier; import org.jclouds.rackspace.cloudservers.compute.suppliers.CloudServersImageSupplier; -import org.jclouds.rackspace.cloudservers.domain.Flavor; -import org.jclouds.rackspace.cloudservers.domain.Server; -import org.jclouds.rackspace.cloudservers.domain.ServerStatus; -import org.jclouds.rackspace.config.RackspaceLocationsModule; -import org.jclouds.rest.RestContext; -import org.jclouds.rest.internal.RestContextImpl; +import org.jclouds.rackspace.config.RackspaceLocationsSupplier; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; import com.google.inject.Injector; -import com.google.inject.Provides; -import com.google.inject.Scopes; -import com.google.inject.TypeLiteral; -import com.google.inject.util.Providers; /** * Configures the {@link CloudServersComputeServiceContext}; requires {@link BaseComputeService} @@ -83,32 +56,8 @@ public class CloudServersComputeServiceContextModule extends BaseComputeServiceC @Override protected void configure() { - install(new ComputeServiceTimeoutsModule()); - install(new RackspaceLocationsModule()); - bind(new TypeLiteral>() { - }).to(ServerToNodeMetadata.class); - - bind(new TypeLiteral>() { - }).to(CloudServersImageToImage.class); - - bind(new TypeLiteral>() { - }).to(CloudServersImageToOperatingSystem.class); - - bind(new TypeLiteral>() { - }).to(FlavorToHardware.class); - - bind(LoadBalancerService.class).toProvider(Providers. of(null)); - bind(new TypeLiteral() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - bind(new TypeLiteral>() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - bind(AddNodeWithTagStrategy.class).to(CloudServersAddNodeWithTagStrategy.class); - bind(ListNodesStrategy.class).to(CloudServersListNodesStrategy.class); - bind(GetNodeMetadataStrategy.class).to(CloudServersGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(CloudServersRebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(CloudServersDestroyNodeStrategy.class); + install(new CloudServersComputeServiceDependenciesModule()); + super.configure(); } @Override @@ -116,46 +65,43 @@ public class CloudServersComputeServiceContextModule extends BaseComputeServiceC return template.osFamily(UBUNTU).imageNameMatches(".*10\\.?04.*"); } - @VisibleForTesting - public static final Map serverToNodeState = ImmutableMap - . builder().put(ServerStatus.ACTIVE, NodeState.RUNNING)// - .put(ServerStatus.SUSPENDED, NodeState.SUSPENDED)// - .put(ServerStatus.DELETED, NodeState.TERMINATED)// - .put(ServerStatus.QUEUE_RESIZE, NodeState.PENDING)// - .put(ServerStatus.PREP_RESIZE, NodeState.PENDING)// - .put(ServerStatus.RESIZE, NodeState.PENDING)// - .put(ServerStatus.VERIFY_RESIZE, NodeState.PENDING)// - .put(ServerStatus.QUEUE_MOVE, NodeState.PENDING)// - .put(ServerStatus.PREP_MOVE, NodeState.PENDING)// - .put(ServerStatus.MOVE, NodeState.PENDING)// - .put(ServerStatus.VERIFY_MOVE, NodeState.PENDING)// - .put(ServerStatus.RESCUE, NodeState.PENDING)// - .put(ServerStatus.ERROR, NodeState.ERROR)// - .put(ServerStatus.BUILD, NodeState.PENDING)// - .put(ServerStatus.RESTORING, NodeState.PENDING)// - .put(ServerStatus.PASSWORD, NodeState.PENDING)// - .put(ServerStatus.REBUILD, NodeState.PENDING)// - .put(ServerStatus.DELETE_IP, NodeState.PENDING)// - .put(ServerStatus.SHARE_IP_NO_CONFIG, NodeState.PENDING)// - .put(ServerStatus.SHARE_IP, NodeState.PENDING)// - .put(ServerStatus.REBOOT, NodeState.PENDING)// - .put(ServerStatus.HARD_REBOOT, NodeState.PENDING)// - .put(ServerStatus.UNKNOWN, NodeState.UNRECOGNIZED)// - .put(ServerStatus.UNRECOGNIZED, NodeState.UNRECOGNIZED).build(); - - @Singleton - @Provides - Map provideServerToNodeState() { - return serverToNodeState; + @Override + protected Class defineAddNodeWithTagStrategy() { + return CloudServersAddNodeWithTagStrategy.class; } @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(CloudServersImageSupplier.class); + protected Class defineDestroyNodeStrategy() { + return CloudServersDestroyNodeStrategy.class; } @Override - protected Supplier> getSourceSizeSupplier(Injector injector) { - return injector.getInstance(CloudServersHardwareSupplier.class); + protected Class defineGetNodeMetadataStrategy() { + return CloudServersGetNodeMetadataStrategy.class; + } + + @Override + protected Class>> defineHardwareSupplier() { + return CloudServersHardwareSupplier.class; + } + + @Override + protected Class>> defineImageSupplier() { + return CloudServersImageSupplier.class; + } + + @Override + protected Class defineListNodesStrategy() { + return CloudServersListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return CloudServersRebootNodeStrategy.class; + } + + @Override + protected Class>> defineLocationSupplier() { + return RackspaceLocationsSupplier.class; } } diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceDependenciesModule.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceDependenciesModule.java new file mode 100644 index 0000000000..9f71b4ac50 --- /dev/null +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceDependenciesModule.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.rackspace.cloudservers.compute.config; + +import java.util.Map; + +import javax.inject.Singleton; + +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.NodeState; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.internal.BaseComputeService; +import org.jclouds.compute.internal.ComputeServiceContextImpl; +import org.jclouds.rackspace.cloudservers.CloudServersAsyncClient; +import org.jclouds.rackspace.cloudservers.CloudServersClient; +import org.jclouds.rackspace.cloudservers.compute.functions.CloudServersImageToImage; +import org.jclouds.rackspace.cloudservers.compute.functions.CloudServersImageToOperatingSystem; +import org.jclouds.rackspace.cloudservers.compute.functions.FlavorToHardware; +import org.jclouds.rackspace.cloudservers.compute.functions.ServerToNodeMetadata; +import org.jclouds.rackspace.cloudservers.domain.Flavor; +import org.jclouds.rackspace.cloudservers.domain.Server; +import org.jclouds.rackspace.cloudservers.domain.ServerStatus; +import org.jclouds.rest.RestContext; +import org.jclouds.rest.internal.RestContextImpl; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; +import com.google.common.collect.ImmutableMap; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; + +/** + * Configures the {@link CloudServersComputeServiceContext}; requires {@link BaseComputeService} + * bound. + * + * @author Adrian Cole + */ +public class CloudServersComputeServiceDependenciesModule extends AbstractModule { + + @Override + protected void configure() { + bind(new TypeLiteral>() { + }).to(ServerToNodeMetadata.class); + + bind(new TypeLiteral>() { + }).to(CloudServersImageToImage.class); + + bind(new TypeLiteral>() { + }).to(CloudServersImageToOperatingSystem.class); + + bind(new TypeLiteral>() { + }).to(FlavorToHardware.class); + + bind(new TypeLiteral() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + bind(new TypeLiteral>() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + } + + @VisibleForTesting + public static final Map serverToNodeState = ImmutableMap + . builder().put(ServerStatus.ACTIVE, NodeState.RUNNING)// + .put(ServerStatus.SUSPENDED, NodeState.SUSPENDED)// + .put(ServerStatus.DELETED, NodeState.TERMINATED)// + .put(ServerStatus.QUEUE_RESIZE, NodeState.PENDING)// + .put(ServerStatus.PREP_RESIZE, NodeState.PENDING)// + .put(ServerStatus.RESIZE, NodeState.PENDING)// + .put(ServerStatus.VERIFY_RESIZE, NodeState.PENDING)// + .put(ServerStatus.QUEUE_MOVE, NodeState.PENDING)// + .put(ServerStatus.PREP_MOVE, NodeState.PENDING)// + .put(ServerStatus.MOVE, NodeState.PENDING)// + .put(ServerStatus.VERIFY_MOVE, NodeState.PENDING)// + .put(ServerStatus.RESCUE, NodeState.PENDING)// + .put(ServerStatus.ERROR, NodeState.ERROR)// + .put(ServerStatus.BUILD, NodeState.PENDING)// + .put(ServerStatus.RESTORING, NodeState.PENDING)// + .put(ServerStatus.PASSWORD, NodeState.PENDING)// + .put(ServerStatus.REBUILD, NodeState.PENDING)// + .put(ServerStatus.DELETE_IP, NodeState.PENDING)// + .put(ServerStatus.SHARE_IP_NO_CONFIG, NodeState.PENDING)// + .put(ServerStatus.SHARE_IP, NodeState.PENDING)// + .put(ServerStatus.REBOOT, NodeState.PENDING)// + .put(ServerStatus.HARD_REBOOT, NodeState.PENDING)// + .put(ServerStatus.UNKNOWN, NodeState.UNRECOGNIZED)// + .put(ServerStatus.UNRECOGNIZED, NodeState.UNRECOGNIZED).build(); + + @Singleton + @Provides + Map provideServerToNodeState() { + return serverToNodeState; + } + +} diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadata.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadata.java index fecc700a45..9135be4549 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadata.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadata.java @@ -30,6 +30,7 @@ import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; @@ -91,7 +92,8 @@ public class ServerToNodeMetadata implements Function { @Inject ServerToNodeMetadata(Map serverStateToNodeState, Map credentialStore, - Supplier> images, Supplier location, Supplier> hardwares) { + @Memoized Supplier> images, Supplier location, + @Memoized Supplier> hardwares) { this.serverToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState"); this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.images = checkNotNull(images, "images"); diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersImageSupplier.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersImageSupplier.java index 8ac4b63a1d..f1b7b1dd79 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersImageSupplier.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/suppliers/CloudServersImageSupplier.java @@ -54,7 +54,7 @@ public class CloudServersImageSupplier implements Supplier> @Inject CloudServersImageSupplier(CloudServersClient sync, - Function cloudServersImageToImage) { + Function cloudServersImageToImage) { this.sync = sync; this.cloudServersImageToImage = cloudServersImageToImage; } @@ -64,7 +64,7 @@ public class CloudServersImageSupplier implements Supplier> Set images; logger.debug(">> providing images"); images = Sets. newLinkedHashSet(Iterables.transform(sync.listImages(withDetails()), - cloudServersImageToImage)); + cloudServersImageToImage)); logger.debug("<< images(%d)", images.size()); return images; } diff --git a/rackspace/src/main/java/org/jclouds/rackspace/config/RackspaceLocationsModule.java b/rackspace/src/main/java/org/jclouds/rackspace/config/RackspaceLocationsSupplier.java similarity index 79% rename from rackspace/src/main/java/org/jclouds/rackspace/config/RackspaceLocationsModule.java rename to rackspace/src/main/java/org/jclouds/rackspace/config/RackspaceLocationsSupplier.java index 6c303181eb..533c053ea0 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/config/RackspaceLocationsModule.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/config/RackspaceLocationsSupplier.java @@ -21,31 +21,32 @@ package org.jclouds.rackspace.config; import java.util.Set; -import javax.inject.Singleton; +import javax.inject.Inject; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; import org.jclouds.rest.annotations.Provider; +import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; /** * Configures the locations used in Rackspace services * * @author Adrian Cole */ -public class RackspaceLocationsModule extends AbstractModule { +public class RackspaceLocationsSupplier implements Supplier> { - @Override - protected void configure() { + private final String providerName; + + @Inject + RackspaceLocationsSupplier(@Provider String providerName) { + this.providerName = providerName; } - @Provides - @Singleton - Set provideLocations(@Provider String providerName) { + @Override + public Set get() { Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); return ImmutableSet.of(new LocationImpl(LocationScope.ZONE, "DFW1", "Dallas, TX", provider)); } diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModuleTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModuleTest.java index 763e101c54..ea4e0f0d0f 100644 --- a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModuleTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModuleTest.java @@ -31,7 +31,7 @@ public class CloudServersComputeServiceContextModuleTest { public void testAllStatusCovered() { for (ServerStatus state : ServerStatus.values()) { - assert CloudServersComputeServiceContextModule.serverToNodeState.containsKey(state) : state; + assert CloudServersComputeServiceDependenciesModule.serverToNodeState.containsKey(state) : state; } } diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadataTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadataTest.java index 5a863b1bba..51b0288450 100644 --- a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadataTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/compute/functions/ServerToNodeMetadataTest.java @@ -40,7 +40,7 @@ import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.rackspace.cloudservers.compute.config.CloudServersComputeServiceContextModule; +import org.jclouds.rackspace.cloudservers.compute.config.CloudServersComputeServiceDependenciesModule; import org.jclouds.rackspace.cloudservers.domain.Server; import org.jclouds.rackspace.cloudservers.domain.ServerStatus; import org.jclouds.rackspace.cloudservers.functions.ParseServerFromJsonResponseTest; @@ -59,148 +59,104 @@ public class ServerToNodeMetadataTest { Location provider = new LocationImpl(LocationScope.ZONE, "dallas", "description", null); @Test - public void testApplyWhereImageAndHardwareNotFoundButCredentialsFound() - throws UnknownHostException { + public void testApplyWhereImageAndHardwareNotFoundButCredentialsFound() throws UnknownHostException { Credentials creds = new Credentials("root", "abdce"); - Map serverStateToNodeState = CloudServersComputeServiceContextModule.serverToNodeState; + Map serverStateToNodeState = CloudServersComputeServiceDependenciesModule.serverToNodeState; Set images = ImmutableSet.of(); Set hardwares = ImmutableSet.of(); Server server = ParseServerFromJsonResponseTest.parseServer(); - ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, - ImmutableMap. of("1234", creds), Suppliers.> ofInstance(images), - Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, ImmutableMap + . of("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(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + 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( + ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } @Test public void testApplyWhereImageAndHardwareNotFound() throws UnknownHostException { - Map serverStateToNodeState = CloudServersComputeServiceContextModule.serverToNodeState; + Map serverStateToNodeState = CloudServersComputeServiceDependenciesModule.serverToNodeState; Set images = ImmutableSet.of(); Set hardwares = ImmutableSet.of(); Server server = ParseServerFromJsonResponseTest.parseServer(); - ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, - ImmutableMap. of(), Suppliers.> ofInstance(images), - Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, ImmutableMap + . of(), 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") - .location( - new LocationImpl(LocationScope.HOST, "e4d909c290d0fb1ca068ffaddf22cbd0", - "e4d909c290d0fb1ca068ffaddf22cbd0", new LocationImpl(LocationScope.ZONE, "dallas", - "description", null))) - .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + 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( + ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } @Test public void testApplyWhereImageFoundAndHardwareNotFound() throws UnknownHostException { - Map serverStateToNodeState = CloudServersComputeServiceContextModule.serverToNodeState; + Map serverStateToNodeState = CloudServersComputeServiceDependenciesModule.serverToNodeState; org.jclouds.compute.domain.Image jcImage = CloudServersImageToImageTest.convertImage(); Set images = ImmutableSet.of(jcImage); Set hardwares = ImmutableSet.of(); Server server = ParseServerFromJsonResponseTest.parseServer(); - ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, - ImmutableMap. of(), Suppliers.> ofInstance(images), - Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, ImmutableMap + . of(), 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") - .operatingSystem( - new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").is64Bit(true) - .build()) - .id("1234") - .providerId("1234") - .name("sample-server") - .location( + 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").operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 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(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + "e4d909c290d0fb1ca068ffaddf22cbd0", new LocationImpl(LocationScope.ZONE, "dallas", + "description", null))).userMetadata( + ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } @Test public void testApplyWhereImageAndHardwareFound() throws UnknownHostException { - Map serverStateToNodeState = CloudServersComputeServiceContextModule.serverToNodeState; + Map serverStateToNodeState = CloudServersComputeServiceDependenciesModule.serverToNodeState; Set images = ImmutableSet.of(CloudServersImageToImageTest.convertImage()); Set hardwares = ImmutableSet.of(FlavorToHardwareTest.convertFlavor()); Server server = ParseServerFromJsonResponseTest.parseServer(); - ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, - ImmutableMap. of(), Suppliers.> ofInstance(images), - Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, ImmutableMap + . of(), 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") - .hardware( - 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()) - .operatingSystem( - new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").is64Bit(true) - .build()) - .id("1234") - .providerId("1234") - .name("sample-server") - .location( + 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").hardware( + 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()).operatingSystem( + new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 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(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + "e4d909c290d0fb1ca068ffaddf22cbd0", new LocationImpl(LocationScope.ZONE, "dallas", + "description", null))).userMetadata( + ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } } \ No newline at end of file diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceContextModule.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceContextModule.java index 791ecf3878..9784d12970 100755 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceContextModule.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceContextModule.java @@ -20,61 +20,31 @@ package org.jclouds.rimuhosting.miro.compute.config; import static org.jclouds.compute.domain.OsFamily.UBUNTU; -import static org.jclouds.rimuhosting.miro.reference.RimuHostingConstants.PROPERTY_RIMUHOSTING_DEFAULT_DC; -import java.util.Map; import java.util.Set; -import javax.inject.Singleton; - -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.LoadBalancerService; import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.config.ComputeServiceTimeoutsModule; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; 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.domain.Location; -import org.jclouds.rest.RestContext; -import org.jclouds.rest.internal.RestContextImpl; -import org.jclouds.rimuhosting.miro.RimuHostingAsyncClient; -import org.jclouds.rimuhosting.miro.RimuHostingClient; -import org.jclouds.rimuhosting.miro.compute.functions.ServerToNodeMetadata; import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingAddNodeWithTagStrategy; import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingDestroyNodeStrategy; import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingGetNodeMetadataStrategy; import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingListNodesStrategy; import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingRebootNodeStrategy; +import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingDefaultLocationSupplier; import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingHardwareSupplier; import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingImageSupplier; import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingLocationSupplier; -import org.jclouds.rimuhosting.miro.domain.Server; -import org.jclouds.rimuhosting.miro.domain.internal.RunningState; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.base.Predicate; import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.Provides; -import com.google.inject.Scopes; -import com.google.inject.TypeLiteral; -import com.google.inject.name.Names; -import com.google.inject.util.Providers; /** * Configures the {@link RimuHostingComputeServiceContext}; requires @@ -86,23 +56,8 @@ public class RimuHostingComputeServiceContextModule extends BaseComputeServiceCo @Override protected void configure() { - install(new ComputeServiceTimeoutsModule()); - bind(new TypeLiteral>() { - }).to(ServerToNodeMetadata.class); - bind(LoadBalancerService.class).toProvider(Providers. of(null)); - bind(new TypeLiteral() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - bind(new TypeLiteral>() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - bind(new TypeLiteral>>() { - }).to(ServerToPublicAddresses.class); - bind(AddNodeWithTagStrategy.class).to(RimuHostingAddNodeWithTagStrategy.class); - bind(ListNodesStrategy.class).to(RimuHostingListNodesStrategy.class); - bind(GetNodeMetadataStrategy.class).to(RimuHostingGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(RimuHostingRebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(RimuHostingDestroyNodeStrategy.class); + install(new RimuHostingComputeServiceDependenciesModule()); + super.configure(); } @Override @@ -110,64 +65,49 @@ public class RimuHostingComputeServiceContextModule extends BaseComputeServiceCo return template.hardwareId("MIRO1B").osFamily(UBUNTU).os64Bit(false).imageNameMatches(".*10\\.?04.*"); } - @VisibleForTesting - static final Map runningStateToNodeState = ImmutableMap. builder() - .put(RunningState.RUNNING, NodeState.RUNNING)// - .put(RunningState.NOTRUNNING, NodeState.SUSPENDED)// - .put(RunningState.POWERCYCLING, NodeState.PENDING)// - .put(RunningState.RESTARTING, NodeState.PENDING)// - .put(RunningState.UNRECOGNIZED, NodeState.UNRECOGNIZED)// - .build(); - - @Singleton - @Provides - Map provideServerToNodeState() { - return runningStateToNodeState; - } - - @Singleton - private static class ServerToPublicAddresses implements Function> { - @Override - public Iterable apply(Server server) { - return server.getIpAddresses() == null ? ImmutableSet. of() : Iterables.concat(ImmutableList.of(server - .getIpAddresses().getPrimaryIp()), server.getIpAddresses().getSecondaryIps()); - } + @Override + protected Class defineAddNodeWithTagStrategy() { + return RimuHostingAddNodeWithTagStrategy.class; } @Override - protected Supplier supplyDefaultLocation(Injector injector, Supplier> locations) { - final String defaultDC = injector - .getInstance(Key.get(String.class, Names.named(PROPERTY_RIMUHOSTING_DEFAULT_DC))); - return Suppliers.compose(new Function, Location>() { - - @Override - public Location apply(Set from) { - return Iterables.find(from, new Predicate() { - - @Override - public boolean apply(Location input) { - return input.getId().equals(defaultDC); - } - - }); - } - - }, locations); - + protected Class defineDestroyNodeStrategy() { + return RimuHostingDestroyNodeStrategy.class; } @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(RimuHostingImageSupplier.class); + protected Class defineGetNodeMetadataStrategy() { + return RimuHostingGetNodeMetadataStrategy.class; } @Override - protected Supplier> getSourceLocationSupplier(Injector injector) { - return injector.getInstance(RimuHostingLocationSupplier.class); + protected Class>> defineHardwareSupplier() { + return RimuHostingHardwareSupplier.class; } @Override - protected Supplier> getSourceSizeSupplier(Injector injector) { - return injector.getInstance(RimuHostingHardwareSupplier.class); + protected Class>> defineImageSupplier() { + return RimuHostingImageSupplier.class; } + + @Override + protected Class defineListNodesStrategy() { + return RimuHostingListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return RimuHostingRebootNodeStrategy.class; + } + + @Override + protected Class>> defineLocationSupplier() { + return RimuHostingLocationSupplier.class; + } + + @Override + protected Class> defineDefaultLocationSupplier() { + return RimuHostingDefaultLocationSupplier.class; + } + } diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceDependenciesModule.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceDependenciesModule.java new file mode 100644 index 0000000000..37aa1276b5 --- /dev/null +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceDependenciesModule.java @@ -0,0 +1,95 @@ +/** + * + * 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.rimuhosting.miro.compute.config; + +import java.util.Map; + +import javax.inject.Singleton; + +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.internal.ComputeServiceContextImpl; +import org.jclouds.rest.RestContext; +import org.jclouds.rest.internal.RestContextImpl; +import org.jclouds.rimuhosting.miro.RimuHostingAsyncClient; +import org.jclouds.rimuhosting.miro.RimuHostingClient; +import org.jclouds.rimuhosting.miro.compute.functions.ServerToNodeMetadata; +import org.jclouds.rimuhosting.miro.domain.Server; +import org.jclouds.rimuhosting.miro.domain.internal.RunningState; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +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; + +/** + * Configures the {@link RimuHostingComputeServiceContext}; requires + * {@link RimuHostingComputeService} bound. + * + * @author Adrian Cole + */ +public class RimuHostingComputeServiceDependenciesModule extends AbstractModule { + + @Override + protected void configure() { + bind(new TypeLiteral>() { + }).to(ServerToNodeMetadata.class); + bind(new TypeLiteral() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + bind(new TypeLiteral>() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + bind(new TypeLiteral>>() { + }).to(ServerToPublicAddresses.class); + + } + + @VisibleForTesting + static final Map runningStateToNodeState = ImmutableMap. builder() + .put(RunningState.RUNNING, NodeState.RUNNING)// + .put(RunningState.NOTRUNNING, NodeState.SUSPENDED)// + .put(RunningState.POWERCYCLING, NodeState.PENDING)// + .put(RunningState.RESTARTING, NodeState.PENDING)// + .put(RunningState.UNRECOGNIZED, NodeState.UNRECOGNIZED)// + .build(); + + @Singleton + @Provides + Map provideServerToNodeState() { + return runningStateToNodeState; + } + + @Singleton + private static class ServerToPublicAddresses implements Function> { + @Override + public Iterable apply(Server server) { + return server.getIpAddresses() == null ? ImmutableSet. of() : Iterables.concat(ImmutableList.of(server + .getIpAddresses().getPrimaryIp()), server.getIpAddresses().getSecondaryIps()); + } + } +} diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java index 54d4d77cf6..810b7bf65e 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java @@ -30,6 +30,7 @@ import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadataBuilder; @@ -74,15 +75,15 @@ public class ServerToNodeMetadata implements Function { @Override public boolean apply(Image input) { return input.getProviderId().equals(instance.getImageId()) - && (input.getLocation() == null || input.getLocation().equals(location) || input.getLocation().equals( - location.getParent())); + && (input.getLocation() == null || input.getLocation().equals(location) || input.getLocation() + .equals(location.getParent())); } } @Inject ServerToNodeMetadata(Function> getPublicAddresses, - Map credentialStore, Map runningStateToNodeState, - Supplier> images) { + Map credentialStore, Map runningStateToNodeState, + @Memoized Supplier> images) { this.getPublicAddresses = checkNotNull(getPublicAddresses, "serverStateToNodeState"); this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.runningStateToNodeState = checkNotNull(runningStateToNodeState, "serverStateToNodeState"); @@ -96,7 +97,7 @@ public class ServerToNodeMetadata implements Function { builder.name(from.getName()); // TODO properly look up location LocationImpl location = new LocationImpl(LocationScope.ZONE, from.getLocation().getId(), from.getLocation() - .getName(), null); + .getName(), null); builder.location(location); builder.tag(parseTagFromName(from.getName())); builder.imageId(from.getImageId() + ""); diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingDefaultLocationSupplier.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingDefaultLocationSupplier.java new file mode 100644 index 0000000000..020a40d5c4 --- /dev/null +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingDefaultLocationSupplier.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.rimuhosting.miro.compute.suppliers; + +import static org.jclouds.rimuhosting.miro.reference.RimuHostingConstants.PROPERTY_RIMUHOSTING_DEFAULT_DC; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.collect.Memoized; +import org.jclouds.domain.Location; + +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class RimuHostingDefaultLocationSupplier implements Supplier { + private final Supplier> locations; + private final String defaultDC; + + @Inject + RimuHostingDefaultLocationSupplier(@Memoized Supplier> locations, + @Named(PROPERTY_RIMUHOSTING_DEFAULT_DC) String defaultDC) { + this.locations = locations; + this.defaultDC = defaultDC; + } + + @Override + public Location get() { + return Iterables.find(locations.get(), new Predicate() { + + @Override + public boolean apply(Location input) { + return input.getId().equals(defaultDC); + } + + }); + } +} \ No newline at end of file diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingHardwareSupplier.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingHardwareSupplier.java index 288331c82c..dec0108649 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingHardwareSupplier.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingHardwareSupplier.java @@ -26,6 +26,7 @@ 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.domain.HardwareBuilder; import org.jclouds.compute.domain.Processor; @@ -53,11 +54,12 @@ public class RimuHostingHardwareSupplier implements Supplier> locations; + + private final RimuHostingClient sync; + private final Supplier> locations; @Inject - RimuHostingHardwareSupplier(RimuHostingClient sync, Supplier> locations) { + RimuHostingHardwareSupplier(RimuHostingClient sync, @Memoized Supplier> locations) { this.sync = sync; this.locations = locations; } @@ -77,9 +79,9 @@ public class RimuHostingHardwareSupplier implements Supplier of(new VolumeImpl((float) from.getDiskSize(), true, true))).build()); + sizes.add(new HardwareBuilder().ids(from.getId()).location(location).processors( + ImmutableList.of(new Processor(1, 1.0))).ram(from.getRam()).volumes( + ImmutableList. of(new VolumeImpl((float) from.getDiskSize(), true, true))).build()); } catch (NullPointerException e) { logger.warn("datacenter not present in " + from.getId()); } diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingImageSupplier.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingImageSupplier.java index 7d584ca2e2..05b9d9104b 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingImageSupplier.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingImageSupplier.java @@ -46,11 +46,11 @@ import com.google.common.collect.Sets; */ @Singleton public class RimuHostingImageSupplier implements Supplier> { - private RimuHostingClient sync; public static final Pattern RIMU_PATTERN = Pattern.compile("([^0-9]*)(.*)"); + private final RimuHostingClient sync; @Inject - RimuHostingImageSupplier(final RimuHostingClient sync) { + RimuHostingImageSupplier(RimuHostingClient sync) { this.sync = sync; } diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingLocationSupplier.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingLocationSupplier.java index 3e7e90e153..3fd843c570 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingLocationSupplier.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/suppliers/RimuHostingLocationSupplier.java @@ -48,8 +48,8 @@ public class RimuHostingLocationSupplier implements Supplier>() { - }).to(SliceToNodeMetadata.class); - - bind(new TypeLiteral>() { - }).to(SlicehostImageToImage.class); - - bind(new TypeLiteral>() { - }).to(SlicehostImageToOperatingSystem.class); - bind(new TypeLiteral>() { - }).to(FlavorToHardware.class); - - bind(LoadBalancerService.class).toProvider(Providers. of(null)); - bind(new TypeLiteral() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - bind(new TypeLiteral>() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - bind(AddNodeWithTagStrategy.class).to(SlicehostAddNodeWithTagStrategy.class); - bind(ListNodesStrategy.class).to(SlicehostListNodesStrategy.class); - bind(GetNodeMetadataStrategy.class).to(SlicehostGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(SlicehostRebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(SlicehostDestroyNodeStrategy.class); - } - - @Override - protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { - return template.osFamily(UBUNTU).imageNameMatches(".*10\\.?04.*"); - } - - @VisibleForTesting - public static final Map sliceStatusToNodeState = ImmutableMap - . builder().put(Slice.Status.ACTIVE, NodeState.RUNNING)// - .put(Slice.Status.BUILD, NodeState.PENDING)// - .put(Slice.Status.REBOOT, NodeState.PENDING)// - .put(Slice.Status.HARD_REBOOT, NodeState.PENDING)// - .put(Slice.Status.TERMINATED, NodeState.TERMINATED)// - .put(Slice.Status.UNRECOGNIZED, NodeState.UNRECOGNIZED)// - .build(); - - @Singleton - @Provides - Map provideSliceToNodeState() { - return sliceStatusToNodeState; - } - @Provides @Singleton Location getLocation(@Provider String providerName) { @@ -146,12 +69,43 @@ public class SlicehostComputeServiceContextModule extends BaseComputeServiceCont } @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(SlicehostImageSupplier.class); + protected void configure() { + install(new SlicehostComputeServiceDependenciesModule()); + super.configure(); } @Override - protected Supplier> getSourceSizeSupplier(Injector injector) { - return injector.getInstance(SlicehostHardwareSupplier.class); + protected Class defineAddNodeWithTagStrategy() { + return SlicehostAddNodeWithTagStrategy.class; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return SlicehostDestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return SlicehostGetNodeMetadataStrategy.class; + } + + @Override + protected Class>> defineHardwareSupplier() { + return SlicehostHardwareSupplier.class; + } + + @Override + protected Class>> defineImageSupplier() { + return SlicehostImageSupplier.class; + } + + @Override + protected Class defineListNodesStrategy() { + return SlicehostListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return SlicehostRebootNodeStrategy.class; } } diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceDependenciesModule.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceDependenciesModule.java new file mode 100644 index 0000000000..7e178543e8 --- /dev/null +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceDependenciesModule.java @@ -0,0 +1,97 @@ +/** + * + * 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.slicehost.compute.config; + +import java.util.Map; + +import javax.inject.Singleton; + +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.NodeState; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.internal.BaseComputeService; +import org.jclouds.compute.internal.ComputeServiceContextImpl; +import org.jclouds.rest.RestContext; +import org.jclouds.rest.internal.RestContextImpl; +import org.jclouds.slicehost.SlicehostAsyncClient; +import org.jclouds.slicehost.SlicehostClient; +import org.jclouds.slicehost.compute.functions.FlavorToHardware; +import org.jclouds.slicehost.compute.functions.SliceToNodeMetadata; +import org.jclouds.slicehost.compute.functions.SlicehostImageToImage; +import org.jclouds.slicehost.compute.functions.SlicehostImageToOperatingSystem; +import org.jclouds.slicehost.domain.Flavor; +import org.jclouds.slicehost.domain.Slice; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; +import com.google.common.collect.ImmutableMap; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; + +/** + * Configures the {@link SlicehostComputeServiceContext}; requires {@link BaseComputeService} bound. + * + * @author Adrian Cole + */ +public class SlicehostComputeServiceDependenciesModule extends AbstractModule { + + @Override + protected void configure() { + bind(new TypeLiteral>() { + }).to(SliceToNodeMetadata.class); + + bind(new TypeLiteral>() { + }).to(SlicehostImageToImage.class); + + bind(new TypeLiteral>() { + }).to(SlicehostImageToOperatingSystem.class); + bind(new TypeLiteral>() { + }).to(FlavorToHardware.class); + + bind(new TypeLiteral() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + bind(new TypeLiteral>() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + + } + + @VisibleForTesting + public static final Map sliceStatusToNodeState = ImmutableMap + . builder().put(Slice.Status.ACTIVE, NodeState.RUNNING)// + .put(Slice.Status.BUILD, NodeState.PENDING)// + .put(Slice.Status.REBOOT, NodeState.PENDING)// + .put(Slice.Status.HARD_REBOOT, NodeState.PENDING)// + .put(Slice.Status.TERMINATED, NodeState.TERMINATED)// + .put(Slice.Status.UNRECOGNIZED, NodeState.UNRECOGNIZED)// + .build(); + + @Singleton + @Provides + Map provideSliceToNodeState() { + return sliceStatusToNodeState; + } +} diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java index 5b6a86fbbd..cc678cc0b6 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java @@ -28,7 +28,9 @@ import java.util.Set; import javax.annotation.Resource; import javax.inject.Inject; +import javax.inject.Singleton; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; @@ -48,6 +50,7 @@ import com.google.common.collect.Iterables; /** * @author Adrian Cole */ +@Singleton public class SliceToNodeMetadata implements Function { protected final Supplier location; protected final Map sliceToNodeState; @@ -86,7 +89,8 @@ public class SliceToNodeMetadata implements Function { @Inject SliceToNodeMetadata(Map sliceStateToNodeState, Map credentialStore, - Supplier> images, Supplier location, Supplier> hardwares) { + @Memoized Supplier> images, Supplier location, + @Memoized Supplier> hardwares) { this.sliceToNodeState = checkNotNull(sliceStateToNodeState, "sliceStateToNodeState"); this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.images = checkNotNull(images, "images"); diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostImageSupplier.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostImageSupplier.java index 02ed757134..5ed2b710a0 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostImageSupplier.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/suppliers/SlicehostImageSupplier.java @@ -52,7 +52,7 @@ public class SlicehostImageSupplier implements Supplier> { @Inject SlicehostImageSupplier(SlicehostClient sync, - Function slicehostImageToImage) { + Function slicehostImageToImage) { this.sync = sync; this.slicehostImageToImage = slicehostImageToImage; } diff --git a/slicehost/src/test/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModuleTest.java b/slicehost/src/test/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModuleTest.java index b615744dfe..9bd52ef52b 100644 --- a/slicehost/src/test/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModuleTest.java +++ b/slicehost/src/test/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModuleTest.java @@ -31,7 +31,7 @@ public class SlicehostComputeServiceContextModuleTest { public void testAllStatusCovered() { for (Slice.Status state : Slice.Status.values()) { - assert SlicehostComputeServiceContextModule.sliceStatusToNodeState.containsKey(state) : state; + assert SlicehostComputeServiceDependenciesModule.sliceStatusToNodeState.containsKey(state) : state; } } diff --git a/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java b/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java index fe0bafd649..d03c26a7c2 100644 --- a/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java +++ b/slicehost/src/test/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadataTest.java @@ -40,7 +40,7 @@ import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.slicehost.compute.config.SlicehostComputeServiceContextModule; +import org.jclouds.slicehost.compute.config.SlicehostComputeServiceDependenciesModule; import org.jclouds.slicehost.domain.Slice; import org.jclouds.slicehost.xml.SliceHandlerTest; import org.testng.annotations.Test; @@ -60,105 +60,84 @@ public class SliceToNodeMetadataTest { @Test public void testApplyWhereImageAndHardwareNotFoundButCredentialsFound() throws UnknownHostException { Credentials creds = new Credentials("root", "abdce"); - Map sliceStateToNodeState = SlicehostComputeServiceContextModule.sliceStatusToNodeState; + Map sliceStateToNodeState = SlicehostComputeServiceDependenciesModule.sliceStatusToNodeState; Set images = ImmutableSet.of(); Set hardwares = ImmutableSet.of(); Slice slice = SliceHandlerTest.parseSlice(); - SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, - ImmutableMap. of("1", creds), Suppliers.> ofInstance(images), - Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, ImmutableMap + . of("1", creds), Suppliers.> ofInstance(images), Suppliers + .ofInstance(provider), Suppliers.> ofInstance(hardwares)); 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").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()); + assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( + ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).tag("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()); } @Test public void testApplyWhereImageAndHardwareNotFound() throws UnknownHostException { - Map sliceStateToNodeState = SlicehostComputeServiceContextModule.sliceStatusToNodeState; + Map sliceStateToNodeState = SlicehostComputeServiceDependenciesModule.sliceStatusToNodeState; Set images = ImmutableSet.of(); Set hardwares = ImmutableSet.of(); Slice slice = SliceHandlerTest.parseSlice(); - SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, - ImmutableMap. of(), Suppliers.> ofInstance(images), - Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, ImmutableMap + . of(), Suppliers.> ofInstance(images), Suppliers + .ofInstance(provider), Suppliers.> ofInstance(hardwares)); 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").imageId("2").id("1") - .providerId("1").name("jclouds-foo").location(provider) - .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( + ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).tag("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()); } @Test public void testApplyWhereImageFoundAndHardwareNotFound() throws UnknownHostException { - Map sliceStateToNodeState = SlicehostComputeServiceContextModule.sliceStatusToNodeState; + Map sliceStateToNodeState = SlicehostComputeServiceDependenciesModule.sliceStatusToNodeState; org.jclouds.compute.domain.Image jcImage = SlicehostImageToImageTest.convertImage(); Set images = ImmutableSet.of(jcImage); Set hardwares = ImmutableSet.of(); Slice slice = SliceHandlerTest.parseSlice(); - SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, - ImmutableMap. of(), Suppliers.> ofInstance(images), - Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, ImmutableMap + . of(), Suppliers.> ofInstance(images), Suppliers + .ofInstance(provider), Suppliers.> ofInstance(hardwares)); 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") - .imageId("2") - .operatingSystem( + assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( + ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).tag("jclouds") + .imageId("2").operatingSystem( new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").is64Bit(true) - .build()).id("1").providerId("1").name("jclouds-foo").location(provider) - .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + .build()).id("1").providerId("1").name("jclouds-foo").location(provider).userMetadata( + ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } @Test public void testApplyWhereImageAndHardwareFound() throws UnknownHostException { - Map sliceStateToNodeState = SlicehostComputeServiceContextModule.sliceStatusToNodeState; + Map sliceStateToNodeState = SlicehostComputeServiceDependenciesModule.sliceStatusToNodeState; Set images = ImmutableSet.of(SlicehostImageToImageTest.convertImage()); Set hardwares = ImmutableSet.of(FlavorToHardwareTest.convertFlavor()); Slice slice = SliceHandlerTest.parseSlice(); - SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, - ImmutableMap. of(), Suppliers.> ofInstance(images), - Suppliers.ofInstance(provider), Suppliers.> ofInstance(hardwares)); + SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, ImmutableMap + . of(), Suppliers.> ofInstance(images), Suppliers + .ofInstance(provider), Suppliers.> ofInstance(hardwares)); 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") - .imageId("2") - .hardware( - new HardwareBuilder() - .ids("1") - .name("256 slice") - .processors(ImmutableList.of(new Processor(0.25, 1.0))) - .ram(256) - .volumes( - ImmutableList.of(new VolumeBuilder().type(Volume.Type.LOCAL).size(1.0f) - .durable(true).bootDevice(true).build())).build()) - .operatingSystem( + assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses( + ImmutableSet.of("174.143.212.229")).privateAddresses(ImmutableSet.of("10.176.164.199")).tag("jclouds") + .imageId("2").hardware( + new HardwareBuilder().ids("1").name("256 slice").processors( + ImmutableList.of(new Processor(0.25, 1.0))).ram(256).volumes( + ImmutableList.of(new VolumeBuilder().type(Volume.Type.LOCAL).size(1.0f).durable(true) + .bootDevice(true).build())).build()).operatingSystem( new OperatingSystemBuilder().family(OsFamily.CENTOS).description("CentOS 5.2").is64Bit(true) - .build()).id("1").providerId("1").name("jclouds-foo").location(provider) - .userMetadata(ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); + .build()).id("1").providerId("1").name("jclouds-foo").location(provider).userMetadata( + ImmutableMap.of("Server Label", "Web Head 1", "Image Version", "2.1")).build()); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java index 22d655f667..551a27d8ce 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java @@ -24,9 +24,7 @@ import java.util.Set; import javax.inject.Singleton; -import org.jclouds.compute.LoadBalancerService; import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.config.ComputeServiceTimeoutsModule; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeState; @@ -41,9 +39,7 @@ import org.jclouds.vcloud.domain.Status; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; -import com.google.inject.Injector; import com.google.inject.Provides; -import com.google.inject.util.Providers; /** * Configures the {@link VCloudComputeServiceContext}; requires {@link VCloudComputeClientImpl} @@ -70,28 +66,26 @@ public abstract class CommonVCloudComputeServiceContextModule extends BaseComput @Override protected void configure() { - install(new ComputeServiceTimeoutsModule()); - bind(RunNodesAndAddToSetStrategy.class).to(EncodeTagIntoNameRunNodesAndAddToSetStrategy.class); - bindLoadBalancer(); - } - - protected void bindLoadBalancer() { - bind(LoadBalancerService.class).toProvider(Providers. of(null)); + super.configure(); } @Override - protected Supplier> getSourceSizeSupplier(Injector injector) { - return injector.getInstance(StaticHardwareSupplier.class); + protected Class defineRunNodesAndAddToSetStrategy() { + return EncodeTagIntoNameRunNodesAndAddToSetStrategy.class; } @Override - protected Supplier> getSourceLocationSupplier(Injector injector) { - return injector.getInstance(OrgAndVDCToLocationSupplier.class); + protected Class>> defineHardwareSupplier() { + return StaticHardwareSupplier.class; } @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(VCloudImageSupplier.class); + protected Class>> defineImageSupplier() { + return VCloudImageSupplier.class; } + @Override + protected Class>> defineLocationSupplier() { + return OrgAndVDCToLocationSupplier.class; + } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java index a8c4805a93..798c631ef1 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java @@ -55,7 +55,6 @@ import org.jclouds.vcloud.domain.VApp; import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.inject.Injector; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -74,11 +73,9 @@ public class VCloudComputeServiceContextModule extends CommonVCloudComputeServic }).to(VAppToNodeMetadata.class); bind(TemplateOptions.class).to(VCloudTemplateOptions.class); bind(TemplateBuilder.class).to(VCloudTemplateBuilderImpl.class); - bind(RebootNodeStrategy.class).to(VCloudRebootNodeStrategy.class); bind(new TypeLiteral>() { }).to(new TypeLiteral() { }); - bind(GetNodeMetadataStrategy.class).to(VCloudGetNodeMetadataStrategy.class); bind(new TypeLiteral() { }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); @@ -91,15 +88,36 @@ public class VCloudComputeServiceContextModule extends CommonVCloudComputeServic bind(new TypeLiteral>>() { }).to(new TypeLiteral() { }); - bind(AddNodeWithTagStrategy.class).to(VCloudAddNodeWithTagStrategy.class); - bind(ListNodesStrategy.class).to(VCloudListNodesStrategy.class); bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to(GetLoginCredentialsFromGuestConfiguration.class); - bind(DestroyNodeStrategy.class).to(VCloudDestroyNodeStrategy.class); } @Override - protected Supplier> getSourceSizeSupplier(Injector injector) { - return injector.getInstance(VCloudHardwareSupplier.class); + protected Class>> defineHardwareSupplier() { + return VCloudHardwareSupplier.class; } + @Override + protected Class defineAddNodeWithTagStrategy() { + return VCloudAddNodeWithTagStrategy.class; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return VCloudDestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return VCloudGetNodeMetadataStrategy.class; + } + + @Override + protected Class defineListNodesStrategy() { + return VCloudListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return VCloudRebootNodeStrategy.class; + } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java index e02b1a1a14..19d6b905f6 100755 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java @@ -62,10 +62,7 @@ public class VCloudExpressComputeServiceContextModule extends CommonVCloudComput @Override protected void configure() { super.configure(); - bind(RebootNodeStrategy.class).to(VCloudExpressRebootNodeStrategy.class); - bind(GetNodeMetadataStrategy.class).to(VCloudExpressGetNodeMetadataStrategy.class); - bind(new TypeLiteral>() { - }).to(VCloudExpressVAppToNodeMetadata.class); + bindVAppConverter(); bind(new TypeLiteral() { }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); @@ -75,9 +72,11 @@ public class VCloudExpressComputeServiceContextModule extends CommonVCloudComput bind(new TypeLiteral>>() { }).to(new TypeLiteral() { }); - bind(AddNodeWithTagStrategy.class).to(VCloudExpressAddNodeWithTagStrategy.class); - bind(ListNodesStrategy.class).to(VCloudExpressListNodesStrategy.class); - bind(DestroyNodeStrategy.class).to(VCloudExpressDestroyNodeStrategy.class); + } + + protected void bindVAppConverter() { + bind(new TypeLiteral>() { + }).to(VCloudExpressVAppToNodeMetadata.class); } @Provides @@ -85,4 +84,29 @@ public class VCloudExpressComputeServiceContextModule extends CommonVCloudComput CommonVCloudComputeClient provideCommonVCloudComputeClient(VCloudExpressComputeClient in) { return in; } + + @Override + protected Class defineAddNodeWithTagStrategy() { + return VCloudExpressAddNodeWithTagStrategy.class; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return VCloudExpressDestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return VCloudExpressGetNodeMetadataStrategy.class; + } + + @Override + protected Class defineListNodesStrategy() { + return VCloudExpressListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return VCloudExpressRebootNodeStrategy.class; + } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java index 8df6a3d21e..24eb90e943 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java @@ -27,6 +27,7 @@ import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.collect.Memoized; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.vcloud.domain.ReferenceType; @@ -45,7 +46,7 @@ public class FindLocationForResource { final Supplier> locations; @Inject - public FindLocationForResource(Supplier> locations) { + public FindLocationForResource(@Memoized Supplier> locations) { this.locations = locations; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java index 9a0dd8f77b..49d0b4a250 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java @@ -28,6 +28,7 @@ import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadataBuilder; @@ -56,9 +57,9 @@ public class VCloudExpressVAppToNodeMetadata implements Function credentialStore, Map vAppStatusToNodeState, - HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, - FindLocationForResource findLocationForResourceInVDC, Supplier> images) { + Map credentialStore, Map vAppStatusToNodeState, + HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, + FindLocationForResource findLocationForResourceInVDC, @Memoized Supplier> images) { this.images = checkNotNull(images, "images"); this.hardwareForVCloudExpressVApp = checkNotNull(hardwareForVCloudExpressVApp, "hardwareForVCloudExpressVApp"); this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC"); @@ -76,7 +77,7 @@ public class VCloudExpressVAppToNodeMetadata implements Function> locations, - Supplier> images, Supplier> sizes, + protected VCloudTemplateBuilderImpl(@Memoized Supplier> locations, + @Memoized Supplier> images, @Memoized Supplier> sizes, Supplier defaultLocation, Provider optionsProvider, @Named("DEFAULT") Provider defaultTemplateProvider) { super(locations, images, sizes, defaultLocation, optionsProvider, defaultTemplateProvider); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/StaticHardwareSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/StaticHardwareSupplier.java index a0a9e5a4b2..7f69a98e19 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/StaticHardwareSupplier.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/StaticHardwareSupplier.java @@ -45,9 +45,8 @@ public class StaticHardwareSupplier implements Supplier> for (int cpus : new int[] { 1, 2, 4, 8 }) for (int ram : new int[] { 512, 1024, 2048, 4096, 8192, 16384 }) { String id = String.format("cpu=%d,ram=%s,disk=%d", cpus, ram, 10); - hardware.add(new HardwareBuilder().ids(id).ram(ram) - .processors(ImmutableList.of(new Processor(cpus, 1.0))) - .volumes(ImmutableList. of(new VolumeImpl(10f, true, true))).build()); + hardware.add(new HardwareBuilder().ids(id).ram(ram).processors(ImmutableList.of(new Processor(cpus, 1.0))) + .volumes(ImmutableList. of(new VolumeImpl(10f, true, true))).build()); } return hardware; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java index e14a0db1fb..243a542b53 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeService.java @@ -30,6 +30,7 @@ import javax.inject.Provider; import javax.inject.Singleton; import org.jclouds.Constants; +import org.jclouds.collect.Memoized; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; @@ -64,18 +65,18 @@ public class TerremarkVCloudComputeService extends BaseComputeService { @Inject protected TerremarkVCloudComputeService(ComputeServiceContext context, Map credentialStore, - Supplier> images, Supplier> sizes, - Supplier> locations, ListNodesStrategy listNodesStrategy, - GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, - RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, - Provider templateBuilderProvider, Provider templateOptionsProvider, - @Named("NODE_RUNNING") Predicate nodeRunning, - @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, CleanupOrphanKeys cleanupOrphanKeys, - ConcurrentMap credentialsMap, NodeMetadataToOrgAndName nodeToOrgAndName) { + @Memoized Supplier> images, @Memoized Supplier> sizes, + @Memoized Supplier> locations, ListNodesStrategy listNodesStrategy, + GetNodeMetadataStrategy getNodeMetadataStrategy, RunNodesAndAddToSetStrategy runNodesAndAddToSetStrategy, + RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy, + Provider templateBuilderProvider, Provider templateOptionsProvider, + @Named("NODE_RUNNING") Predicate nodeRunning, + @Named("NODE_TERMINATED") Predicate nodeTerminated, ComputeUtils utils, Timeouts timeouts, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, CleanupOrphanKeys cleanupOrphanKeys, + ConcurrentMap credentialsMap, NodeMetadataToOrgAndName nodeToOrgAndName) { super(context, credentialStore, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy, - runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, - templateOptionsProvider, nodeRunning, nodeTerminated, utils, timeouts, executor); + runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, templateBuilderProvider, + templateOptionsProvider, nodeRunning, nodeTerminated, utils, timeouts, executor); this.cleanupOrphanKeys = cleanupOrphanKeys; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java index 6ceb5d2aed..dffc0a5464 100755 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java @@ -28,27 +28,14 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.ComputeService; -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.config.ComputeServiceTimeoutsModule; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -import org.jclouds.compute.strategy.DestroyNodeStrategy; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; -import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; -import org.jclouds.vcloud.VCloudExpressAsyncClient; -import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.compute.config.VCloudExpressComputeServiceContextModule; -import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.terremark.compute.TerremarkVCloudComputeClient; import org.jclouds.vcloud.terremark.compute.TerremarkVCloudComputeService; @@ -64,9 +51,7 @@ import org.jclouds.vcloud.terremark.compute.suppliers.VAppTemplatesInOrgs; import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.inject.Injector; import com.google.inject.Provides; -import com.google.inject.Scopes; import com.google.inject.TypeLiteral; /** @@ -91,23 +76,7 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom @Override protected void configure() { - install(new ComputeServiceTimeoutsModule()); - // NOTE - bind(AddNodeWithTagStrategy.class).to(TerremarkVCloudAddNodeWithTagStrategy.class); - bind(new TypeLiteral() { - }).to(new TypeLiteral>() { - }).in(Scopes.SINGLETON); - // NOTE - bind(RunNodesAndAddToSetStrategy.class).to(TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.class); - bind(ListNodesStrategy.class).to(VCloudExpressListNodesStrategy.class); - // NOTE - bind(new TypeLiteral>() { - }).to(TerremarkVCloudExpressVAppToNodeMetadata.class); - bind(GetNodeMetadataStrategy.class).to(VCloudExpressGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(VCloudExpressRebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(VCloudExpressDestroyNodeStrategy.class); - bindLoadBalancer(); - // MORE specifics... + super.configure(); bind(new TypeLiteral>() { }).to(new TypeLiteral() { }); @@ -115,10 +84,26 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom bind(ComputeService.class).to(TerremarkVCloudComputeService.class); bind(VCloudExpressComputeClient.class).to(TerremarkVCloudComputeClient.class); bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to( - ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.class); + ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.class); bind(SecureRandom.class).toInstance(new SecureRandom()); } + @Override + protected void bindVAppConverter() { + bind(new TypeLiteral>() { + }).to(TerremarkVCloudExpressVAppToNodeMetadata.class); + } + + @Override + protected Class defineRunNodesAndAddToSetStrategy() { + return TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.class; + } + + @Override + protected Class defineAddNodeWithTagStrategy() { + return TerremarkVCloudAddNodeWithTagStrategy.class; + } + @Provides @Singleton ConcurrentMap credentialsMap() { @@ -140,8 +125,7 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom } @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(VAppTemplatesInOrgs.class); + protected Class>> defineImageSupplier() { + return VAppTemplatesInOrgs.class; } - } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java index c7aea007c5..517dfda86a 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkVCloudExpressVAppToNodeMetadata.java @@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentMap; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadataBuilder; @@ -56,12 +57,11 @@ public class TerremarkVCloudExpressVAppToNodeMetadata extends VCloudExpressVAppT public TerremarkVCloudExpressVAppToNodeMetadata(VCloudExpressComputeClient computeClient, Map credentialStore, Map vAppStatusToNodeState, HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, - FindLocationForResource findLocationForResourceInVDC, Supplier> images, + FindLocationForResource findLocationForResourceInVDC, @Memoized Supplier> images, ConcurrentMap credentialsMap) { super(computeClient, credentialStore, vAppStatusToNodeState, hardwareForVCloudExpressVApp, findLocationForResourceInVDC, images); this.credentialsMap = checkNotNull(credentialsMap, "credentialsMap"); - ; } @Override diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java index b971b3b57c..fb439c8a2a 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java @@ -28,6 +28,7 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Image; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; @@ -54,7 +55,7 @@ public class VAppTemplatesInOrgs implements Supplier> { private final ImagesInVCloudExpressOrg imagesInOrg; @Inject - VAppTemplatesInOrgs(Supplier> locations, + VAppTemplatesInOrgs(@Memoized Supplier> locations, Function, Iterable> organizatonsForLocations, ImagesInVCloudExpressOrg imagesInOrg) { this.locations = locations; From 176f528572d1d2a555a63ea4186fa5c97458baac Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 17 Oct 2010 19:35:07 -0700 Subject: [PATCH 05/17] Issue 312: introductory support for clojure native compute provider --- .../src/main/clojure/org/jclouds/modules.clj | 121 ++++++++++++++++++ ...StandaloneComputeServiceContextModule.java | 116 +++++++++++++++++ .../StubComputeServiceDependenciesModule.java | 4 +- .../src/test/clojure/org/jclouds/ssh_test.clj | 107 ++++++++++++++++ .../ComputeServiceContextFactoryTest.java | 24 +++- 5 files changed, 369 insertions(+), 3 deletions(-) create mode 100644 compute/src/main/clojure/org/jclouds/modules.clj create mode 100644 compute/src/test/clojure/org/jclouds/ssh_test.clj diff --git a/compute/src/main/clojure/org/jclouds/modules.clj b/compute/src/main/clojure/org/jclouds/modules.clj new file mode 100644 index 0000000000..10fbfc3dde --- /dev/null +++ b/compute/src/main/clojure/org/jclouds/modules.clj @@ -0,0 +1,121 @@ +; +; +; 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. +; ==================================================================== +; +(ns org.jclouds.modules + (:require + [clojure.contrib.logging :as logging]) + (:import + [org.jclouds.ssh SshClient ExecResponse] + com.google.inject.Module + org.jclouds.net.IPSocket + [org.jclouds.compute ComputeService ComputeServiceContextFactory] + java.util.Set + [org.jclouds.compute.domain NodeMetadata Template] + [com.google.common.base Supplier Predicate] + [org.jclouds.compute.strategy AddNodeWithTagStrategy DestroyNodeStrategy RebootNodeStrategy GetNodeMetadataStrategy ListNodesStrategy] + org.jclouds.compute.domain.NodeMetadataBuilder)) + + +(defn compute-module + [] + (.. (org.jclouds.compute.config.StandaloneComputeServiceContextModule$Builder.) + (defineAddNodeWithTagStrategy (defrecord ClojureAddNodeWithTagStrategy [] + AddNodeWithTagStrategy + (^NodeMetadata execute [this ^String tag ^String name ^Template template] + ()))) + (defineDestroyNodeStrategy (defrecord ClojureDestroyNodeStrategy [] + DestroyNodeStrategy + (^NodeMetadata execute [this ^String id] + ()))) + (defineRebootNodeStrategy (defrecord ClojureRebootNodeStrategy [] + RebootNodeStrategy + (^NodeMetadata execute [this ^String id] + ()))) + (defineGetNodeMetadataStrategy (defrecord ClojureGetNodeMetadataStrategy [] + GetNodeMetadataStrategy + (^NodeMetadata execute [this ^String id] + ()))) + (defineListNodesStrategy (defrecord ClojureListNodesStrategy [] + ListNodesStrategy + (^Iterable list [this ] + ()) + (^Iterable listDetailsOnNodesMatching [this ^Predicate filter] + ()) + )) + ;; this needs to return Set + + (defineHardwareSupplier + (defrecord HardwareSupplier [] + Supplier + (get [this] + ()) + )) + ;; this needs to return Set + + (defineImageSupplier (defrecord ImageSupplier [] + Supplier + ( get [this] + ()) + )) + ;; this needs to return Set + (defineLocationSupplier (defrecord LocationSupplier [] + Supplier + ( get [this] + ()) + )) + (build) + + )) + +(defn compute-context [module] + (ComputeServiceContextFactory/createStandaloneContext module)) + +(defrecord NodeListComputeService + [node-list] + org.jclouds.compute.ComputeService + (listNodes [_] node-list) + (getNodeMetadata + [_ id] + (some #(= (.getId %) id) node-list)) + (listNodesDetailsMatching + [_ predicate] + (filter #(.apply predicate %) node-list))) + +(defn ssh-client-factory + "Pass in a function that reifies org.jclouds.ssh.SshClient" + [ctor] + (reify + org.jclouds.ssh.SshClient$Factory + (^org.jclouds.ssh.SshClient create + [_ ^IPSocket socket ^String username ^String password-or-key] + (ctor socket username password-or-key)) + (^org.jclouds.ssh.SshClient create + [_ ^IPSocket socket ^String username ^bytes password-or-key] + (ctor socket username password-or-key)))) + +(defn ssh-module + "Create a module that specifies the factory for creating an ssh service" + [^org.jclouds.ssh.SshClient$Factory factory] + (let [binder (atom nil)] + (reify + com.google.inject.Module + (configure + [this abinder] + (reset! binder abinder) + (.. @binder (bind org.jclouds.ssh.SshClient$Factory) + (toInstance factory)))))) diff --git a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java index 96ecb1c05d..3f83ac0989 100644 --- a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java @@ -19,12 +19,25 @@ package org.jclouds.compute.config; +import java.util.Set; + import org.jclouds.compute.ComputeService; 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.DestroyNodeStrategy; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.ListNodesStrategy; +import org.jclouds.compute.strategy.RebootNodeStrategy; +import com.google.common.base.Supplier; +import com.google.common.collect.Sets; +import com.google.inject.Module; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; + /** * * @author Adrian Cole @@ -37,4 +50,107 @@ public abstract class StandaloneComputeServiceContextModule extends BaseComputeS }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private Set modules = Sets.newLinkedHashSet(); + private Class addNodeWithTagStrategy; + private Class destroyNodeStrategy; + private Class getNodeMetadataStrategy; + private Class listNodesStrategy; + private Class rebootNodeStrategy; + private Class>> hardwareSupplier; + private Class>> imageSupplier; + + public Builder install(Module module) { + this.modules.add(module); + return this; + } + + public Builder defineAddNodeWithTagStrategy(Class addNodeWithTagStrategy) { + this.addNodeWithTagStrategy = addNodeWithTagStrategy; + return this; + } + + public Builder defineDestroyNodeStrategy(Class destroyNodeStrategy) { + this.destroyNodeStrategy = destroyNodeStrategy; + return this; + } + + public Builder defineGetNodeMetadataStrategy(Class getNodeMetadataStrategy) { + this.getNodeMetadataStrategy = getNodeMetadataStrategy; + return this; + } + + public Builder defineListNodesStrategy(Class listNodesStrategy) { + this.listNodesStrategy = listNodesStrategy; + return this; + } + + public Builder defineRebootNodeStrategy(Class rebootNodeStrategy) { + this.rebootNodeStrategy = rebootNodeStrategy; + return this; + } + + public Builder defineHardwareSupplier(Class>> hardwareSupplier) { + this.hardwareSupplier = hardwareSupplier; + return this; + } + + public Builder defineImageSupplier(Class>> imageSupplier) { + this.imageSupplier = imageSupplier; + return this; + } + + public StandaloneComputeServiceContextModule build() { + return new StandaloneComputeServiceContextModule() { + + @Override + protected Class defineAddNodeWithTagStrategy() { + return addNodeWithTagStrategy; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return destroyNodeStrategy; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return getNodeMetadataStrategy; + } + + @Override + protected Class>> defineHardwareSupplier() { + return hardwareSupplier; + } + + @Override + protected Class>> defineImageSupplier() { + return imageSupplier; + } + + @Override + protected Class defineListNodesStrategy() { + return listNodesStrategy; + } + + @Override + protected Class defineRebootNodeStrategy() { + return rebootNodeStrategy; + } + + @Override + protected void configure() { + for (Module module : modules) + install(module); + super.configure(); + } + + }; + } + } } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java index 1ff03e1270..83770cfad4 100644 --- a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java +++ b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java @@ -313,7 +313,7 @@ public class StubComputeServiceDependenciesModule extends AbstractModule { } @Singleton - static class StubImageSupplier implements Supplier> { + public static class StubImageSupplier implements Supplier> { private final Supplier defaultLocation; @Inject @@ -359,7 +359,7 @@ public class StubComputeServiceDependenciesModule extends AbstractModule { } @Singleton - static class StubHardwareSupplier implements Supplier> { + public static class StubHardwareSupplier implements Supplier> { static Hardware stub(String type, int cores, int ram, float disk) { return new org.jclouds.compute.domain.HardwareBuilder().id(type).providerId(type).name(type).processors( diff --git a/compute/src/test/clojure/org/jclouds/ssh_test.clj b/compute/src/test/clojure/org/jclouds/ssh_test.clj new file mode 100644 index 0000000000..5766833862 --- /dev/null +++ b/compute/src/test/clojure/org/jclouds/ssh_test.clj @@ -0,0 +1,107 @@ +; +; +; 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. +; ==================================================================== +; +(ns org.jclouds.ssh-test + (:require + [clojure.contrib.logging :as logging] + [org.jclouds.modules :as modules]) + (:import + [org.jclouds.ssh SshClient ExecResponse] + org.jclouds.io.Payload + org.jclouds.net.IPSocket)) + +(defn instantiate [impl-class & args] + (let [constructor (first + (filter + (fn [c] (= (count args) (count (.getParameterTypes c)))) + (.getDeclaredConstructors impl-class)))] + (.newInstance impl-class (object-array args)))) + + + + +;; define an instance or implementation of the following interfaces: + +(defn maybe-invoke [f & args] + (when f + (apply f args))) + +(defn default-exec + "Default exec function - replies to ./runscript status by returning 1" + [cmd] + (merge + {:exit 0 :err "stderr" :out "stdout"} + (condp = cmd + "./bootstrap status" {:exit 1 :out "[]"} + {}))) + + +(deftype NoOpClient + [socket username password] + SshClient + (connect [this]) + (disconnect [this]) + (exec [this cmd] + (logging/info (format "ssh cmd: %s" cmd)) + (let [response (default-exec cmd)] + (ExecResponse. (:out response) (:err response) (:exit response)))) + (get [this path] ) + (^void put [this ^String path ^String content]) + (^void put [this ^String path ^org.jclouds.io.Payload content]) + (getUsername [this] username) + (getHostAddress [this] (.getAddress socket)) ) + +(defn no-op-ssh-client + [socket username password] + (NoOpClient. socket username password)) + + +(deftype SshClientFactory + [factory-fn] + org.jclouds.ssh.SshClient$Factory + (^org.jclouds.ssh.SshClient + create + [_ ^IPSocket socket ^String username ^String password-or-key] + (factory-fn socket username password-or-key)) + (^org.jclouds.ssh.SshClient + create + [_ ^IPSocket socket ^String username ^bytes password-or-key] + (factory-fn socket username password-or-key))) + +(deftype Module + [factory binder] + com.google.inject.Module + (configure + [this abinder] + (reset! binder abinder) + (.. @binder (bind org.jclouds.ssh.SshClient$Factory) + (toInstance factory)))) + +(defn ssh-test-module + "Create a module that specifies the factory for creating a test service" + [factory] + (let [binder (atom nil)] + (Module. factory binder))) + +(defn ssh-test-client + "Create a module that can be passed to a compute-context, and which implements +an ssh client with the provided map of function implementations. Keys are +clojurefied versions of org.jclouds.ssh.SshClient's methods" + [factory-fn] + (ssh-test-module (SshClientFactory. factory-fn))) + diff --git a/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java index 729b7e9693..d0338cab29 100644 --- a/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java +++ b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java @@ -19,7 +19,16 @@ package org.jclouds.compute; +import org.jclouds.compute.config.StandaloneComputeServiceContextModule; import org.jclouds.compute.stub.config.StubComputeServiceContextModule; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubAddNodeWithTagStrategy; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubDestroyNodeStrategy; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubGetNodeMetadataStrategy; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubHardwareSupplier; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubImageSupplier; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubListNodesStrategy; +import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubRebootNodeStrategy; import org.testng.annotations.Test; /** @@ -32,8 +41,21 @@ public class ComputeServiceContextFactoryTest { @Test public void testStandalone() { - ComputeServiceContext context = ComputeServiceContextFactory.createStandaloneContext(new StubComputeServiceContextModule()); + ComputeServiceContext context = ComputeServiceContextFactory + .createStandaloneContext(new StubComputeServiceContextModule()); context.getComputeService().listNodes(); } + @Test + public void testStandaloneWithBuilder() { + ComputeServiceContext context = ComputeServiceContextFactory + .createStandaloneContext(StandaloneComputeServiceContextModule.builder().install( + new StubComputeServiceDependenciesModule()).defineAddNodeWithTagStrategy( + StubAddNodeWithTagStrategy.class).defineDestroyNodeStrategy(StubDestroyNodeStrategy.class) + .defineGetNodeMetadataStrategy(StubGetNodeMetadataStrategy.class).defineListNodesStrategy( + StubListNodesStrategy.class).defineRebootNodeStrategy(StubRebootNodeStrategy.class) + .defineHardwareSupplier(StubHardwareSupplier.class) + .defineImageSupplier(StubImageSupplier.class).build()); + context.getComputeService().listNodes(); + } } From ae3a9e4f644dd0d97c2fed218851876140bbc66c Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 17 Oct 2010 19:41:32 -0700 Subject: [PATCH 06/17] added missing location spec --- .../config/StandaloneComputeServiceContextModule.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java index 3f83ac0989..9a2e766949 100644 --- a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java @@ -31,6 +31,7 @@ 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.domain.Location; import com.google.common.base.Supplier; import com.google.common.collect.Sets; @@ -64,6 +65,7 @@ public abstract class StandaloneComputeServiceContextModule extends BaseComputeS private Class rebootNodeStrategy; private Class>> hardwareSupplier; private Class>> imageSupplier; + private Class>> locationSupplier = LocationSupplier.class; public Builder install(Module module) { this.modules.add(module); @@ -105,6 +107,11 @@ public abstract class StandaloneComputeServiceContextModule extends BaseComputeS return this; } + public Builder defineLocationSupplier(Class>> locationSupplier) { + this.locationSupplier = locationSupplier; + return this; + } + public StandaloneComputeServiceContextModule build() { return new StandaloneComputeServiceContextModule() { @@ -143,6 +150,10 @@ public abstract class StandaloneComputeServiceContextModule extends BaseComputeS return rebootNodeStrategy; } + protected Class>> defineLocationSupplier() { + return locationSupplier; + } + @Override protected void configure() { for (Module module : modules) From 4da03553f10aa825672e5d0a99d05ded6eb59916 Mon Sep 17 00:00:00 2001 From: spasam Date: Mon, 18 Oct 2010 00:43:13 -0400 Subject: [PATCH 07/17] a.) When listing all public IPs in ecloud, the URL was incorrect. Was using something like ..../publicIps/publicIps. b.) CommonVCloudRestClientModule#provideDefaultNetwork(...) is rather strict. This does not work in all environments. For eg, we have two test environments. Each has different DMZ/Internet networks. This method is always checking against default VDC. It doesn't make sense to configure jclouds client with one environments network and launch in another. So I kind'a made PROPERTY_VCLOUD_DEFAULT_NETWORK optional. It is a bit of a hack. This whole thing is probably mute anyway. They added functionality to figure out the Network type (DMZ vs Internal). We probably should figure out the network based on the fence mode??? c.) Implement SSH key support for ecloud. --- ...ExpressVAppTemplateParamsToXmlPayload.java | 2 +- .../config/CommonVCloudRestClientModule.java | 9 +- .../terremark/TerremarkECloudAsyncClient.java | 87 ++++++++++++ .../terremark/TerremarkECloudMediaType.java | 9 ++ .../TerremarkECloudPropertiesBuilder.java | 4 +- .../terremark/TerremarkVCloudAsyncClient.java | 4 +- .../terremark/TerremarkVCloudClient.java | 22 +++ .../TerremarkVCloudExpressClient.java | 25 ---- ...antiateVAppTemplateParamsToXmlPayload.java | 3 +- .../config/TerremarkRestClientModule.java | 57 +++++++- ...erremarkVCloudExpressRestClientModule.java | 63 --------- .../terremark/xml/TerremarkOrgHandler.java | 9 +- .../TerremarkECloudAsyncClientTest.java | 127 +++++++++++++++++- 13 files changed, 319 insertions(+), 102 deletions(-) diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload.java b/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload.java index e8a0f37cfb..4aa7f7d360 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload.java @@ -97,7 +97,7 @@ public class BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload implemen SortedMap virtualHardwareQuantity = Maps.newTreeMap(); InstantiateVAppTemplateOptions options = findOptionsInArgsOrNull(gRequest); - String network = defaultNetwork.toASCIIString(); + String network = (defaultNetwork != null) ? defaultNetwork.toASCIIString() : null; String fenceMode = defaultFenceMode; String networkName = name; if (options != null) { diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java index 68fed093c0..cbd7726d10 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java @@ -415,8 +415,13 @@ public class CommonVCloudRestClientModule getInternetService(@EndpointParam URI internetServiceId); + /** + * @see TerremarkVCloudExpressClient#findKeyPairInOrgNamed + */ + @GET + @Path("") + @XMLResponseParser(KeyPairByNameHandler.class) + @Consumes(KEYSLIST_XML) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findKeyPairInOrg( + @Nullable @EndpointParam(parser = OrgURIToKeysListEndpoint.class) URI org, String keyName); + + /** + * @see TerremarkVCloudExpressClient#listKeyPairsInOrgNamed + */ + @GET + @Path("") + @Consumes(KEYSLIST_XML) + @XMLResponseParser(KeyPairsHandler.class) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture> listKeyPairsInOrg( + @Nullable @EndpointParam(parser = OrgURIToKeysListEndpoint.class) URI org); + + /** + * @see TerremarkVCloudExpressClient#listKeyPairs + */ + @GET + @Path("") + @Consumes(KEYSLIST_XML) + @XMLResponseParser(KeyPairsHandler.class) + @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) + ListenableFuture> listKeyPairs(@EndpointParam URI keysList); + + /** + * @see TerremarkVCloudExpressClient#generateKeyPairInOrg + */ + @POST + @Path("") + @Produces(KEYSLIST_XML) + @Consumes(KEYSLIST_XML) + @XMLResponseParser(KeyPairHandler.class) + @MapBinder(BindCreateKeyToXmlPayload.class) + ListenableFuture generateKeyPairInOrg( + @EndpointParam(parser = OrgURIToKeysListEndpoint.class) URI org, @MapPayloadParam("name") String name, + @MapPayloadParam("isDefault") boolean makeDefault); + + /** + * @see TerremarkVCloudExpressClient#getKeyPair + */ + @GET + @Path("") + @XMLResponseParser(KeyPairHandler.class) + @Consumes(APPLICATION_XML) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getKeyPair(@EndpointParam URI keyId); + + // TODO + // /** + // * @see TerremarkVCloudClient#configureKeyPair + // */ + // @PUT + // @Endpoint(org.jclouds.vcloud.endpoints.VCloudApi.class) + // @Path("/extensions/key/{keyId}") + // @Produces(APPLICATION_XML) + // @Consumes(APPLICATION_XML) + // @XMLResponseParser(KeyPairHandler.class) + // ListenableFuture configureKeyPair( + // @PathParam("keyId") int keyId, + // @BinderParam(BindKeyPairConfigurationToXmlPayload.class) + // KeyPairConfiguration keyConfiguration); + + /** + * @see TerremarkVCloudExpressClient#deleteKeyPair + */ + @DELETE + @Path("") + @ExceptionParser(ReturnVoidOnNotFoundOr404.class) + ListenableFuture deleteKeyPair(@EndpointParam URI keyId); } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudMediaType.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudMediaType.java index 6649e9e432..c357f47712 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudMediaType.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudMediaType.java @@ -58,4 +58,13 @@ public interface TerremarkECloudMediaType extends TerremarkVCloudMediaType { public final static MediaType INTERNETSERVICESLIST_XML_TYPE = new MediaType("application", "vnd.tmrk.ecloud.internetServicesList+xml"); + /** + * "application/vnd.tmrk.ecloud.keysList+xml" + */ + public final static String KEYSLIST_XML = "application/vnd.tmrk.ecloud.keysList+xml"; + + /** + * "application/vnd.tmrk.ecloud.keysList+xml" + */ + public final static MediaType KEYSLIST_XML_TYPE = new MediaType("application", "vnd.tmrk.ecloud.keysList+xml"); } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java index 421a142c5d..9bec07eb52 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudPropertiesBuilder.java @@ -35,10 +35,10 @@ public class TerremarkECloudPropertiesBuilder extends TerremarkVCloudPropertiesB @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_API_VERSION, "0.8b-ext2.3"); + properties.setProperty(PROPERTY_API_VERSION, "0.8b-ext2.5"); properties.setProperty(PROPERTY_ENDPOINT, "https://services.enterprisecloud.terremark.com/api"); properties.setProperty(PROPERTY_TERREMARK_EXTENSION_NAME, "eCloudExtensions"); - properties.setProperty(PROPERTY_TERREMARK_EXTENSION_VERSION, "2.3"); + properties.setProperty(PROPERTY_TERREMARK_EXTENSION_VERSION, "2.5"); return properties; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java index 33bf5bfe38..d3a72b0004 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java @@ -258,7 +258,7 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { * @see TerremarkVCloudExpressClient#getPublicIpsAssociatedWithVDC */ @GET - @Path("/publicIps") + @Path("") @Consumes(PUBLICIPSLIST_XML) @XMLResponseParser(PublicIpAddressesHandler.class) @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) @@ -358,4 +358,4 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @Consumes(CATALOGITEMCUSTOMIZATIONPARAMETERS_XML) ListenableFuture getCustomizationOptions(@EndpointParam URI customization); -} \ No newline at end of file +} diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java index 7607018f06..bb6d3d5955 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java @@ -31,6 +31,7 @@ import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.terremark.domain.CustomizationParameters; import org.jclouds.vcloud.terremark.domain.InternetService; +import org.jclouds.vcloud.terremark.domain.KeyPair; import org.jclouds.vcloud.terremark.domain.Node; import org.jclouds.vcloud.terremark.domain.Protocol; import org.jclouds.vcloud.terremark.domain.PublicIpAddress; @@ -142,4 +143,25 @@ public interface TerremarkVCloudClient extends VCloudExpressClient { */ Task configureVApp(VCloudExpressVApp vApp, VAppConfiguration configuration); + /** + */ + Set listKeyPairsInOrg(URI org); + + /** + * @throws IllegalStateException + * if a key of the same name already exists + */ + KeyPair generateKeyPairInOrg(URI org, String name, boolean makeDefault); + + /** + */ + KeyPair findKeyPairInOrg(URI org, String keyPairName); + + KeyPair getKeyPair(URI keyPair); + + // TODO + // KeyPair configureKeyPair(int keyPairId, KeyPairConfiguration + // keyPairConfiguration); + + void deleteKeyPair(URI keyPair); } \ No newline at end of file diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClient.java index 2fcf524bb7..62dff8b1cc 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClient.java @@ -20,12 +20,10 @@ package org.jclouds.vcloud.terremark; import java.net.URI; -import java.util.Set; import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; 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.options.AddInternetServiceOptions; @@ -40,29 +38,6 @@ import org.jclouds.vcloud.terremark.options.AddInternetServiceOptions; @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) public interface TerremarkVCloudExpressClient extends TerremarkVCloudClient { - /** - - */ - Set listKeyPairsInOrg(URI org); - - /** - * @throws IllegalStateException - * if a key of the same name already exists - */ - KeyPair generateKeyPairInOrg(URI org, String name, boolean makeDefault); - - /** - */ - KeyPair findKeyPairInOrg(URI org, String keyPairName); - - KeyPair getKeyPair(URI keyPair); - - // TODO - // KeyPair configureKeyPair(int keyPairId, KeyPairConfiguration - // keyPairConfiguration); - - void deleteKeyPair(URI keyPair); - InternetService addInternetServiceToVDC(URI vDCId, String serviceName, Protocol protocol, int port, AddInternetServiceOptions... options); } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java index e17459ae20..f5f316ae06 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java @@ -41,6 +41,7 @@ import org.jclouds.vcloud.endpoints.Network; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions; +import com.google.inject.internal.Nullable; import com.jamesmurty.utils.XMLBuilder; /** @@ -55,7 +56,7 @@ public class TerremarkBindInstantiateVAppTemplateParamsToXmlPayload extends @Inject public TerremarkBindInstantiateVAppTemplateParamsToXmlPayload(BindToStringPayload stringBinder, @Named(PROPERTY_API_VERSION) String apiVersion, @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, - @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Network URI network, + @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Nullable @Network URI network, @Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode) { super(stringBinder, apiVersion, ns, schema, network, fenceMode); } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java index 1016e7b63c..141e6bf41d 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java @@ -19,8 +19,12 @@ package org.jclouds.vcloud.terremark.config; -import java.io.IOException; +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; +import java.io.IOException; +import java.util.Map; + +import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; @@ -28,12 +32,19 @@ import org.jclouds.http.HttpErrorHandler; import org.jclouds.http.annotation.ClientError; import org.jclouds.http.annotation.Redirection; import org.jclouds.http.annotation.ServerError; +import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.util.Utils; import org.jclouds.vcloud.config.BaseVCloudExpressRestClientModule; +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.terremark.TerremarkVCloudAsyncClient; import org.jclouds.vcloud.terremark.TerremarkVCloudClient; +import org.jclouds.vcloud.terremark.endpoints.KeysList; import org.jclouds.vcloud.terremark.handlers.ParseTerremarkVCloudErrorFromHttpResponse; +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.collect.Maps; import com.google.inject.Provides; public abstract class TerremarkRestClientModule @@ -69,4 +80,48 @@ public abstract class TerremarkRestClientModule> { + protected final Supplier sessionSupplier; + private final TerremarkVCloudClient client; + + @Inject + protected OrgNameToKeysListSupplier(Supplier sessionSupplier, TerremarkVCloudClient client) { + this.sessionSupplier = sessionSupplier; + this.client = client; + } + + @Override + public Map get() { + return Maps.transformValues(sessionSupplier.get().getOrgs(), new Function() { + + @Override + public ReferenceType apply(ReferenceType from) { + return client.findOrgNamed(from.getName()).getKeysList(); + } + + }); + } + } + + @Provides + @Singleton + @KeysList + protected Supplier> provideOrgToKeysListCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgNameToKeysListSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, + seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); + } + + @Singleton + @Provides + @Named("CreateKey") + String provideCreateKey() throws IOException { + return Utils.toStringAndClose(getClass().getResourceAsStream("/terremark/CreateKey.xml")); + } } \ No newline at end of file diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java index 3233f8c22f..450c9381f6 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java @@ -19,32 +19,17 @@ package org.jclouds.vcloud.terremark.config; -import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; - -import java.io.IOException; -import java.util.Map; - -import javax.inject.Inject; -import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; -import org.jclouds.util.Utils; import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.domain.ReferenceType; -import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.terremark.TerremarkVCloudAsyncClient; import org.jclouds.vcloud.terremark.TerremarkVCloudClient; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClient; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressClient; -import org.jclouds.vcloud.terremark.endpoints.KeysList; -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.collect.Maps; import com.google.inject.Provides; /** @@ -84,52 +69,4 @@ public class TerremarkVCloudExpressRestClientModule extends protected TerremarkVCloudClient provideTerremarkClient(TerremarkVCloudExpressClient in) { return in; } - - @Singleton - public static class OrgNameToKeysListSupplier implements Supplier> { - protected final Supplier sessionSupplier; - private final TerremarkVCloudExpressClient client; - - @Inject - protected OrgNameToKeysListSupplier(Supplier sessionSupplier, TerremarkVCloudExpressClient client) { - this.sessionSupplier = sessionSupplier; - this.client = client; - } - - @Override - public Map get() { - return Maps.transformValues(sessionSupplier.get().getOrgs(), new Function() { - - @Override - public ReferenceType apply(ReferenceType from) { - return client.findOrgNamed(from.getName()).getKeysList(); - } - - }); - } - - } - - @Provides - @Singleton - @KeysList - protected Supplier> provideOrgToKeysListCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgNameToKeysListSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, - seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - - }); - } - - @Singleton - @Provides - @Named("CreateKey") - String provideCreateKey() throws IOException { - return Utils.toStringAndClose(getClass().getResourceAsStream("/terremark/CreateKey.xml")); - } - } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java index 4c95f23c93..2143e74785 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java @@ -19,7 +19,6 @@ package org.jclouds.vcloud.terremark.xml; -import static org.jclouds.vcloud.terremark.TerremarkVCloudExpressMediaType.KEYSLIST_XML; import static org.jclouds.vcloud.util.Utils.cleanseAttributes; import static org.jclouds.vcloud.util.Utils.newReferenceType; @@ -28,6 +27,8 @@ import java.util.Map; import javax.inject.Inject; import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.terremark.TerremarkECloudMediaType; +import org.jclouds.vcloud.terremark.TerremarkVCloudExpressMediaType; import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl; import org.jclouds.vcloud.xml.OrgHandler; @@ -57,8 +58,10 @@ public class TerremarkOrgHandler extends OrgHandler { super.startElement(uri, localName, qName, attrs); if (qName.equals("Link")) { if (attributes.containsKey("type")) { - if (attributes.get("type").equals(KEYSLIST_XML)) { - keysList = newReferenceType(attributes); + String type = attributes.get("type"); + if (type.equals(TerremarkVCloudExpressMediaType.KEYSLIST_XML) + || type.equals(TerremarkECloudMediaType.KEYSLIST_XML)) { + keysList = newReferenceType(attributes); } } } diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java index c73e905eb3..167f28a44e 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java @@ -27,15 +27,19 @@ import static org.testng.Assert.assertEquals; import java.io.IOException; import java.lang.reflect.Method; import java.net.URI; +import java.util.Map; import java.util.Properties; +import javax.inject.Inject; import javax.inject.Named; +import javax.inject.Singleton; import org.jclouds.http.HttpRequest; import org.jclouds.http.RequiresHttp; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ReleasePayloadAndReturn; import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; import org.jclouds.rest.RestContextFactory.ContextSpec; @@ -50,20 +54,23 @@ import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExt import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.VCloudSession; +import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl; import org.jclouds.vcloud.domain.network.NetworkConfig; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; -import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestOrgNameToKeysListSupplier; -import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestTerremarkOrgMapSupplier; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestTerremarkOrgVDCSupplier; import org.jclouds.vcloud.terremark.config.TerremarkVCloudExpressRestClientModule; import org.jclouds.vcloud.terremark.domain.Protocol; +import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl; import org.jclouds.vcloud.terremark.options.AddInternetServiceOptions; import org.jclouds.vcloud.terremark.options.AddNodeOptions; import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions; import org.jclouds.vcloud.terremark.xml.CustomizationParametersHandler; import org.jclouds.vcloud.terremark.xml.InternetServiceHandler; import org.jclouds.vcloud.terremark.xml.InternetServicesHandler; +import org.jclouds.vcloud.terremark.xml.KeyPairByNameHandler; +import org.jclouds.vcloud.terremark.xml.KeyPairHandler; +import org.jclouds.vcloud.terremark.xml.KeyPairsHandler; import org.jclouds.vcloud.terremark.xml.NodeHandler; import org.jclouds.vcloud.terremark.xml.NodesHandler; import org.jclouds.vcloud.terremark.xml.PublicIpAddressesHandler; @@ -72,7 +79,10 @@ import org.jclouds.vcloud.xml.CatalogHandler; import org.jclouds.vcloud.xml.VCloudExpressVAppHandler; import org.testng.annotations.Test; +import com.google.common.base.Function; import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.TypeLiteral; @@ -298,6 +308,22 @@ public class TerremarkECloudAsyncClientTest extends RestClientTest sessionSupplier) { + super(sessionSupplier, null); + } + + @Override + public Map get() { + return Maps.transformValues(sessionSupplier.get().getOrgs(), new Function() { + + @Override + public ReferenceType apply(ReferenceType from) { + return new ReferenceTypeImpl(from.getName(), TerremarkECloudMediaType.KEYSLIST_XML, URI + .create(from.getHref().toASCIIString() + "/keysList")); + } + }); + } + } + + @Singleton + public static class TestTerremarkOrgMapSupplier extends OrgMapSupplier { + @Inject + protected TestTerremarkOrgMapSupplier() { + super(null, null); + } + + @Override + public Map get() { + return ImmutableMap. of("org", new TerremarkOrgImpl("org", null, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), null, ImmutableMap + . of("catalog", new ReferenceTypeImpl("catalog", + TerremarkECloudMediaType.CATALOG_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap + . of("vdc", new ReferenceTypeImpl("vdc", + TerremarkECloudMediaType.VDC_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap + . of(), new ReferenceTypeImpl("tasksList", + TerremarkECloudMediaType.TASKSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")), new ReferenceTypeImpl( + "keysList", TerremarkECloudMediaType.KEYSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1")))); + } + } + @Override protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return URI.create("https://org"); From 464bca0ec1f4a2826499c891fa6ed796650f9da1 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Tue, 19 Oct 2010 17:08:11 -0500 Subject: [PATCH 08/17] Issue 385: started work on example compute provider that is backed by library, not http --- ...tandaloneComputeServiceContextBuilder.java | 7 +- .../BaseComputeServiceContextModule.java | 51 ++++--- .../strategy/AddNodeWithTagStrategy.java | 13 ++ .../StubComputeServiceDependenciesModule.java | 2 +- .../jclouds/collect/FindResourceInSet.java | 70 +++++++++ .../collect/TransformingSetSupplier.java | 48 +++++++ pom.xml | 1 + skeletons/pom.xml | 37 +++++ skeletons/standalone-compute/README.txt | 3 + skeletons/standalone-compute/pom.xml | 123 ++++++++++++++++ .../org/jclouds/servermanager/Hardware.java | 63 ++++++++ .../java/org/jclouds/servermanager/Image.java | 56 ++++++++ .../org/jclouds/servermanager/Server.java | 67 +++++++++ .../jclouds/servermanager/ServerManager.java | 99 +++++++++++++ ...erManagerComputeServiceContextBuilder.java | 64 +++++++++ .../ServerManagerHardwareToHardware.java | 50 +++++++ .../functions/ServerManagerImageToImage.java | 62 ++++++++ .../functions/ServerToNodeMetadata.java | 135 +++++++++++++++++ .../ServerManagerAddNodeWithTagStrategy.java | 89 ++++++++++++ .../ServerManagerDestroyNodeStrategy.java | 68 +++++++++ .../ServerManagerGetAndListNodesStrategy.java | 70 +++++++++ .../ServerManagerRebootNodeStrategy.java | 69 +++++++++ .../ServerManagerHardwareSupplier.java | 49 +++++++ .../suppliers/ServerManagerImageSupplier.java | 47 ++++++ .../ServerManagerLocationSupplier.java | 54 +++++++ ...nagerComputeServiceContextBuilderTest.java | 38 +++++ .../src/test/resources/log4j.xml | 136 ++++++++++++++++++ 27 files changed, 1547 insertions(+), 24 deletions(-) create mode 100644 core/src/main/java/org/jclouds/collect/FindResourceInSet.java create mode 100644 core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java create mode 100644 skeletons/pom.xml create mode 100644 skeletons/standalone-compute/README.txt create mode 100644 skeletons/standalone-compute/pom.xml create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Hardware.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Image.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Server.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/ServerManager.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilder.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerManagerHardwareToHardware.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerManagerImageToImage.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerToNodeMetadata.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerAddNodeWithTagStrategy.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerDestroyNodeStrategy.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerGetAndListNodesStrategy.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerRebootNodeStrategy.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerHardwareSupplier.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerImageSupplier.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerLocationSupplier.java create mode 100644 skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilderTest.java create mode 100755 skeletons/standalone-compute/src/test/resources/log4j.xml diff --git a/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java index 5c4f8041b2..2034b3e2e0 100644 --- a/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java +++ b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java @@ -26,6 +26,7 @@ import static org.jclouds.Constants.PROPERTY_IDENTITY; import java.util.List; import java.util.Properties; +import org.jclouds.PropertiesBuilder; import org.jclouds.compute.config.StandaloneComputeServiceClientModule; import com.google.inject.Module; @@ -35,10 +36,14 @@ import com.google.inject.Module; * @author Adrian Cole */ public class StandaloneComputeServiceContextBuilder extends - ComputeServiceContextBuilder { + ComputeServiceContextBuilder { public StandaloneComputeServiceContextBuilder(Properties props) { super(ComputeService.class, ComputeService.class, props); + if (properties.size() == 0) + properties.putAll(new PropertiesBuilder().build()); + if (!properties.containsKey("jclouds.provider")) + properties.setProperty("jclouds.provider", "standalone"); if (!properties.containsKey(PROPERTY_ENDPOINT)) properties.setProperty(PROPERTY_ENDPOINT, "standalone"); if (!properties.containsKey(PROPERTY_API_VERSION)) 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 47bd722d32..71014c4317 100644 --- a/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java @@ -204,12 +204,19 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { } + /** + * The default template if none is provided. + */ @Provides @Named("DEFAULT") protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { return template.osFamily(UBUNTU); } + /** + * supplies how the tag is encoded into the name. A string of hex characters is the last argument + * and tag is the first + */ @Provides @Named("NAMING_CONVENTION") @Singleton @@ -243,20 +250,20 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { @Singleton @Memoized protected Supplier> supplyImageCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> imageSupplier) { + final Supplier> imageSupplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, seconds, - new Supplier>() { - @Override - public Set get() { - return imageSupplier.get(); - } - }); + new Supplier>() { + @Override + public Set get() { + return imageSupplier.get(); + } + }); } @Provides @Singleton protected Supplier> provideLocationMap( - @Memoized Supplier> locations) { + @Memoized Supplier> locations) { return Suppliers.compose(new Function, Map>() { @Override @@ -278,14 +285,14 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { @Singleton @Memoized protected Supplier> supplyLocationCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> locationSupplier) { + final Supplier> locationSupplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, seconds, - new Supplier>() { - @Override - public Set get() { - return locationSupplier.get(); - } - }); + new Supplier>() { + @Override + public Set get() { + return locationSupplier.get(); + } + }); } @Provides @@ -312,14 +319,14 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { @Singleton @Memoized protected Supplier> supplySizeCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> hardwareSupplier) { + final Supplier> hardwareSupplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, seconds, - new Supplier>() { - @Override - public Set get() { - return hardwareSupplier.get(); - } - }); + new Supplier>() { + @Override + public Set get() { + return hardwareSupplier.get(); + } + }); } @Provides diff --git a/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java index 106feec7a5..167d7a5192 100644 --- a/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java @@ -29,6 +29,19 @@ import org.jclouds.compute.domain.Template; */ public interface AddNodeWithTagStrategy { + /** + * create a node given the name and template parameters such as imageid, hardwareid, and + * locationid. + * + * @param tag + * tag supplied by the user + * @param name + * supplied by {@link RunNodesAndAddToSetStrategy } 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 execute(String tag, String name, Template template); } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java index 83770cfad4..3b87d025da 100644 --- a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java +++ b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java @@ -362,7 +362,7 @@ public class StubComputeServiceDependenciesModule extends AbstractModule { public static class StubHardwareSupplier implements Supplier> { static Hardware stub(String type, int cores, int ram, float disk) { - return new org.jclouds.compute.domain.HardwareBuilder().id(type).providerId(type).name(type).processors( + return new org.jclouds.compute.domain.HardwareBuilder().ids(type).name(type).processors( ImmutableList.of(new Processor(cores, 1.0))).ram(ram).volumes( ImmutableList. of(new VolumeImpl(disk, true, false))).build(); } diff --git a/core/src/main/java/org/jclouds/collect/FindResourceInSet.java b/core/src/main/java/org/jclouds/collect/FindResourceInSet.java new file mode 100644 index 0000000000..bdf0ed154b --- /dev/null +++ b/core/src/main/java/org/jclouds/collect/FindResourceInSet.java @@ -0,0 +1,70 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.collect; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.NoSuchElementException; +import java.util.Set; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; + +/** + * @author Adrian Cole + */ +@Singleton +public abstract class FindResourceInSet implements Function { + @Resource + protected Logger logger = Logger.NULL; + + private final Supplier> set; + + @Inject + public FindResourceInSet(@Memoized Supplier> set) { + this.set = checkNotNull(set, "set"); + } + + public abstract boolean matches(F from, T input); + + public T apply(final F from) { + try { + return Iterables.find(set.get(), new Predicate() { + + @Override + public boolean apply(T input) { + return matches(from, input); + } + + }); + } catch (NoSuchElementException e) { + logger.warn("could not find a match in set for %s", from); + } + return null; + } +} \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java b/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java new file mode 100644 index 0000000000..e02c6c3a0c --- /dev/null +++ b/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java @@ -0,0 +1,48 @@ +/** + * + * 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.collect; + +import static com.google.common.collect.Iterables.transform; +import static com.google.common.collect.Sets.newHashSet; + +import java.util.Set; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + */ + +public abstract class TransformingSetSupplier implements Supplier> { + private final Function converter; + + public TransformingSetSupplier(Function converter) { + this.converter = converter; + } + + @Override + public Set get() { + return newHashSet(transform(supplyFrom(), converter)); + } + + public abstract Iterable supplyFrom(); +} diff --git a/pom.xml b/pom.xml index ca9300914a..6ff8b53bc2 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ core compute blobstore + skeletons filesystem extensions tools diff --git a/skeletons/pom.xml b/skeletons/pom.xml new file mode 100644 index 0000000000..ca07ccd404 --- /dev/null +++ b/skeletons/pom.xml @@ -0,0 +1,37 @@ + + + + + + jclouds-project + org.jclouds + 1.0-SNAPSHOT + ../project/pom.xml + + 4.0.0 + jclouds-skeletons-project + pom + jclouds skeletons project + + standalone-compute + + diff --git a/skeletons/standalone-compute/README.txt b/skeletons/standalone-compute/README.txt new file mode 100644 index 0000000000..f8231086df --- /dev/null +++ b/skeletons/standalone-compute/README.txt @@ -0,0 +1,3 @@ +this is a skeleton for a standalone compute provider. + +Essentially, a standalone provider is one that doesn't use jclouds http services. Examples could be native drivers like libvirt or shell-driven ones like virtualbox. diff --git a/skeletons/standalone-compute/pom.xml b/skeletons/standalone-compute/pom.xml new file mode 100644 index 0000000000..3ef57068aa --- /dev/null +++ b/skeletons/standalone-compute/pom.xml @@ -0,0 +1,123 @@ + + + + + 4.0.0 + + org.jclouds + jclouds-project + 1.0-SNAPSHOT + ../../project/pom.xml + + jclouds-examples-standalone-compute + jclouds example components for a standalone compute provider + + + trmkrun-ccc,test.trmk-924 + https://servermanager-compute.com + 1.0 + FIXME + + + + ${project.groupId} + jclouds-core + ${project.version} + test-jar + test + + + ${project.groupId} + jclouds-compute + ${project.version} + + + ${project.groupId} + jclouds-compute + ${project.version} + test-jar + test + + + log4j + log4j + 1.2.14 + test + + + ${project.groupId} + jclouds-log4j + ${project.version} + test + + + ${project.groupId} + jclouds-jsch + ${project.version} + test + + + + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration + integration-test + + test + + + + + test.servermanager-compute.endpoint + ${test.servermanager-compute.endpoint} + + + test.servermanager-compute.apiversion + ${test.servermanager-compute.apiversion} + + + test.servermanager-compute.identity + ${test.servermanager-compute.identity} + + + jclouds.compute.blacklist.nodes + ${jclouds.compute.blacklist.nodes} + + + + + + + + + + + + diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Hardware.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Hardware.java new file mode 100644 index 0000000000..856306a964 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Hardware.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.servermanager; + +import com.google.common.base.Objects; + +/** + * This would be replaced with the real java object related to the underlying hardware + * + * @author Adrian Cole + */ +public class Hardware { + + public int id; + public String name; + public int cores; + public int ram; + public float disk; + + public Hardware(int id, String name, int cores, int ram, float disk) { + this.id = id; + this.name = name; + this.cores = cores; + this.ram = ram; + this.disk = disk; + } + + @Override + public int hashCode() { + return Objects.hashCode(id, name, cores, ram, disk); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + return Objects.equal(this.toString(), that.toString()); + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("id", id).add("name", name).add("cores", cores).add("ram", ram) + .add("disk", disk).toString(); + } + +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Image.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Image.java new file mode 100644 index 0000000000..9939d6ec34 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Image.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.servermanager; + +import com.google.common.base.Objects; + +/** + * This would be replaced with the real java object related to the underlying image + * + * @author Adrian Cole + */ +public class Image { + + public int id; + public String name; + + public Image(int id, String name) { + this.id = id; + this.name = name; + } + + @Override + public int hashCode() { + return Objects.hashCode(id, name); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + return Objects.equal(this.toString(), that.toString()); + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("id", id).add("name", name).toString(); + } + +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Server.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Server.java new file mode 100644 index 0000000000..7369a7679a --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Server.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.servermanager; + +import com.google.common.base.Objects; + +/** + * This would be replaced with the real java object related to the underlying server + * + * @author Adrian Cole + */ +public class Server { + public enum Status { + ACTIVE, BUILD, TERMINATED, UNRECOGNIZED + + } + + public int id; + public String name; + public Status status; + public String datacenter; + public int imageId; + public int hardwareId; + public String publicAddress; + public String privateAddress; + public String loginUser; + public String password; + + @Override + public int hashCode() { + return Objects.hashCode(id, name, status, datacenter, imageId, hardwareId, publicAddress, privateAddress, + loginUser); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + return Objects.equal(this.toString(), that.toString()); + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("id", id).add("name", name).add("status", status) + .add("datacenter", datacenter).add("imageId", imageId).add("hardwareId", hardwareId) + .add("publicAddress", publicAddress).add("privateAddress", privateAddress).add("loginUser", loginUser) + .toString(); + } + +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/ServerManager.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/ServerManager.java new file mode 100644 index 0000000000..0de102cd46 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/ServerManager.java @@ -0,0 +1,99 @@ +/** + * + * 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.servermanager; + +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.inject.Singleton; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + +/** + * This would be replaced with the real connection to the service that can + * create/list/reboot/get/destroy things + * + * @author Adrian Cole + */ +@Singleton +public class ServerManager { + + private final static Map servers = Maps.newHashMap(); + private final static Map images = ImmutableMap.of(1, new Image(1, "ubuntu")); + private final static Map hardware = ImmutableMap.of(1, new Hardware(1, "small", 1, 512, 10)); + + private final static AtomicInteger nodeIds = new AtomicInteger(0); + + /** + * simulate creating a server, as this is really going to happen with the api underneath + * + * @param name + * @param name + * @param imageId + * @param hardwareId + * @return new server + */ + public Server createServerInDC(String datacenter, String name, int imageId, int hardwareId) { + Server server = new Server(); + server.id = nodeIds.getAndIncrement(); + server.name = name; + server.datacenter = datacenter; + server.imageId = imageId; + server.hardwareId = hardwareId; + server.publicAddress = "7.1.1." + server.id; + server.privateAddress = "10.1.1." + server.id; + server.loginUser = "root"; + server.password = "password"; + servers.put(server.id, server); + return server; + } + + public Server getServer(int serverId) { + return servers.get(serverId); + } + + public Iterable listServers() { + return servers.values(); + } + + public Image getImage(int imageId) { + return images.get(imageId); + } + + public Iterable listImages() { + return images.values(); + } + + public Hardware getHardware(int hardwareId) { + return hardware.get(hardwareId); + } + + public Iterable listHardware() { + return hardware.values(); + } + + public void destroyServer(int serverId) { + servers.remove(serverId); + } + + public void rebootServer(int serverId) { + } +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilder.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilder.java new file mode 100644 index 0000000000..36a1040ff2 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilder.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.servermanager.compute; + +import java.util.List; +import java.util.Properties; + +import org.jclouds.compute.StandaloneComputeServiceContextBuilder; +import org.jclouds.compute.config.StandaloneComputeServiceContextModule; +import org.jclouds.servermanager.compute.strategy.ServerManagerAddNodeWithTagStrategy; +import org.jclouds.servermanager.compute.strategy.ServerManagerDestroyNodeStrategy; +import org.jclouds.servermanager.compute.strategy.ServerManagerGetAndListNodesStrategy; +import org.jclouds.servermanager.compute.strategy.ServerManagerRebootNodeStrategy; +import org.jclouds.servermanager.compute.suppliers.ServerManagerHardwareSupplier; +import org.jclouds.servermanager.compute.suppliers.ServerManagerImageSupplier; +import org.jclouds.servermanager.compute.suppliers.ServerManagerLocationSupplier; + +import com.google.inject.Module; + +/** + * + * @author Adrian Cole + */ +public class ServerManagerComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder { + + public ServerManagerComputeServiceContextBuilder(Properties props) { + super(props); + } + + @Override + protected void addContextModule(List modules) { + modules.add(createContextModule()); + } + + public static StandaloneComputeServiceContextModule createContextModule() { + return StandaloneComputeServiceContextModule.builder() + .defineAddNodeWithTagStrategy(ServerManagerAddNodeWithTagStrategy.class) + .defineDestroyNodeStrategy(ServerManagerDestroyNodeStrategy.class) + .defineGetNodeMetadataStrategy(ServerManagerGetAndListNodesStrategy.class) + .defineListNodesStrategy(ServerManagerGetAndListNodesStrategy.class) + .defineRebootNodeStrategy(ServerManagerRebootNodeStrategy.class) + .defineHardwareSupplier(ServerManagerHardwareSupplier.class) + .defineLocationSupplier(ServerManagerLocationSupplier.class) + .defineImageSupplier(ServerManagerImageSupplier.class).build(); + } + +} diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerManagerHardwareToHardware.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerManagerHardwareToHardware.java new file mode 100644 index 0000000000..0ba6387ce3 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerManagerHardwareToHardware.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.servermanager.compute.functions; + +import javax.inject.Singleton; + +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.internal.VolumeImpl; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; + +/** + * @author Adrian Cole + */ +@Singleton +public class ServerManagerHardwareToHardware implements Function { + + @Override + public Hardware apply(org.jclouds.servermanager.Hardware from) { + HardwareBuilder builder = new HardwareBuilder(); + builder.ids(from.id + ""); + builder.name(from.name); + builder.processors(ImmutableList.of(new Processor(from.cores, 1.0))); + builder.ram(from.ram); + builder.volumes(ImmutableList. of(new VolumeImpl(from.disk, true, false))); + return builder.build(); + } + +} diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerManagerImageToImage.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerManagerImageToImage.java new file mode 100644 index 0000000000..8708ef45ac --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerManagerImageToImage.java @@ -0,0 +1,62 @@ +/** + * + * 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.servermanager.compute.functions; + +import javax.annotation.Resource; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystemBuilder; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class ServerManagerImageToImage implements Function { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + @Override + public Image apply(org.jclouds.servermanager.Image from) { + + ImageBuilder builder = new ImageBuilder(); + builder.ids(from.id + ""); + builder.name(from.name); + builder.description(from.name); + + OsFamily family = null; + try { + family = OsFamily.fromValue(from.name); + builder.operatingSystem(new OperatingSystemBuilder().name(from.name).family(family).build()); + } catch (IllegalArgumentException e) { + logger.debug("<< didn't match os(%s)", from); + } + return builder.build(); + } + +} 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 new file mode 100644 index 0000000000..8d29a0efda --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/ServerToNodeMetadata.java @@ -0,0 +1,135 @@ +/** + * + * 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.servermanager.compute.functions; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; + +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.collect.FindResourceInSet; +import org.jclouds.collect.Memoized; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; +import org.jclouds.servermanager.Server; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +/** + * @author Adrian Cole + */ +@Singleton +public class ServerToNodeMetadata implements Function { + + public static final Map serverStatusToNodeState = ImmutableMap + . builder().put(Server.Status.ACTIVE, NodeState.RUNNING)// + .put(Server.Status.BUILD, NodeState.PENDING)// + .put(Server.Status.TERMINATED, NodeState.TERMINATED)// + .put(Server.Status.UNRECOGNIZED, NodeState.UNRECOGNIZED)// + .build(); + + private final FindHardwareForServer findHardwareForServer; + private final FindLocationForServer findLocationForServer; + private final FindImageForServer findImageForServer; + private final Map credentialStore; + + @Inject + ServerToNodeMetadata(Map credentialStore, FindHardwareForServer findHardwareForServer, + FindLocationForServer findLocationForServer, FindImageForServer findImageForServer) { + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.findHardwareForServer = checkNotNull(findHardwareForServer, "findHardwareForServer"); + this.findLocationForServer = checkNotNull(findLocationForServer, "findLocationForServer"); + this.findImageForServer = checkNotNull(findImageForServer, "findImageForServer"); + } + + @Override + public NodeMetadata apply(Server from) { + // convert the result object to a jclouds NodeMetadata + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + builder.ids(from.id + ""); + builder.name(from.name); + builder.location(findLocationForServer.apply(from)); + builder.tag(parseTagFromName(from.name)); + builder.imageId(from.imageId + ""); + Image image = findImageForServer.apply(from); + if (image != null) + builder.operatingSystem(image.getOperatingSystem()); + builder.hardware(findHardwareForServer.apply(from)); + builder.state(serverStatusToNodeState.get(from.status)); + builder.publicAddresses(ImmutableSet. of(from.publicAddress)); + builder.privateAddresses(ImmutableSet. of(from.privateAddress)); + builder.credentials(credentialStore.get(from.id + "")); + return builder.build(); + } + + @Singleton + public static class FindHardwareForServer extends FindResourceInSet { + + @Inject + public FindHardwareForServer(@Memoized Supplier> hardware) { + super(hardware); + } + + @Override + public boolean matches(Server from, Hardware input) { + return input.getProviderId().equals(from.hardwareId + ""); + } + } + + @Singleton + public static class FindImageForServer extends FindResourceInSet { + + @Inject + public FindImageForServer(@Memoized Supplier> hardware) { + super(hardware); + } + + @Override + public boolean matches(Server from, Image input) { + return input.getProviderId().equals(from.imageId + ""); + } + } + + @Singleton + public static class FindLocationForServer extends FindResourceInSet { + + @Inject + public FindLocationForServer(@Memoized Supplier> hardware) { + super(hardware); + } + + @Override + public boolean matches(Server from, Location input) { + return input.getId().equals(from.datacenter + ""); + } + } +} diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerAddNodeWithTagStrategy.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerAddNodeWithTagStrategy.java new file mode 100644 index 0000000000..a934b9afd3 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerAddNodeWithTagStrategy.java @@ -0,0 +1,89 @@ +/** + * + * 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.servermanager.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +import java.util.Map; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +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.domain.Credentials; +import org.jclouds.logging.Logger; +import org.jclouds.servermanager.Server; +import org.jclouds.servermanager.ServerManager; +import org.jclouds.servermanager.compute.functions.ServerToNodeMetadata; + +/** + * This creates a node in the backend client. You create it with the parameters of the + * {@link Template} object. Then, convert it to a {@link NodeMetadata} object. + * + * @author Adrian Cole + * + */ +@Singleton +public class ServerManagerAddNodeWithTagStrategy implements AddNodeWithTagStrategy { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + private final Map credentialStore; + private final ServerManager client; + private final ServerToNodeMetadata serverToNodeMetadata; + + @Inject + public ServerManagerAddNodeWithTagStrategy(Map credentialStore, ServerManager client, + ServerToNodeMetadata serverToNodeMetadata) { + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.client = checkNotNull(client, "client"); + this.serverToNodeMetadata = checkNotNull(serverToNodeMetadata, "serverToNodeMetadata"); + } + + /** + * {@inheritDoc} + */ + @Override + public NodeMetadata execute(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); + + logger.debug(">> instantiating new server dc(%s) name(%s) image(%s) hardware(%s)", + template.getLocation().getId(), name, template.getImage().getProviderId(), template.getHardware() + .getProviderId()); + + // create the backend object using parameters from the template. + Server from = client.createServerInDC(template.getLocation().getId(), name, + Integer.parseInt(template.getImage().getProviderId()), + Integer.parseInt(template.getHardware().getProviderId())); + // store the credentials so that later functions can use them + credentialStore.put(from.id + "", new Credentials(from.loginUser, from.password)); + logger.debug("<< instantiated server(%s)", from.id); + return serverToNodeMetadata.apply(from); + } + +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerDestroyNodeStrategy.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerDestroyNodeStrategy.java new file mode 100644 index 0000000000..50ae2286fb --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerDestroyNodeStrategy.java @@ -0,0 +1,68 @@ +/** + * + * 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.servermanager.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.compute.strategy.DestroyNodeStrategy; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.logging.Logger; +import org.jclouds.servermanager.ServerManager; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class ServerManagerDestroyNodeStrategy implements DestroyNodeStrategy { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + private final ServerManager client; + private final GetNodeMetadataStrategy getNodeMetadataStrategy; + + @Inject + protected ServerManagerDestroyNodeStrategy(ServerManager client, GetNodeMetadataStrategy getNodeMetadataStrategy) { + this.client = checkNotNull(client, "client"); + this.getNodeMetadataStrategy = checkNotNull(getNodeMetadataStrategy, "getNodeMetadataStrategy"); + } + + @Override + public NodeMetadata execute(String id) { + + NodeMetadata node = getNodeMetadataStrategy.execute(id); + if (node == null) + return node; + + logger.debug(">> destroying server(%s)", id); + client.destroyServer(Integer.parseInt(id)); + logger.debug("<< destroyed server(%s)", id); + + return node; + } +} diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerGetAndListNodesStrategy.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerGetAndListNodesStrategy.java new file mode 100644 index 0000000000..e28e578d76 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerGetAndListNodesStrategy.java @@ -0,0 +1,70 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.servermanager.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.predicates.NodePredicates; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.ListNodesStrategy; +import org.jclouds.servermanager.Server; +import org.jclouds.servermanager.ServerManager; +import org.jclouds.servermanager.compute.functions.ServerToNodeMetadata; + +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class ServerManagerGetAndListNodesStrategy implements ListNodesStrategy, GetNodeMetadataStrategy { + private final ServerManager client; + private final ServerToNodeMetadata serverToNodeMetadata; + + @Inject + protected ServerManagerGetAndListNodesStrategy(ServerManager client, ServerToNodeMetadata serverToNodeMetadata) { + this.client = checkNotNull(client, "client"); + this.serverToNodeMetadata = checkNotNull(serverToNodeMetadata, "serverToNodeMetadata"); + } + + @Override + public NodeMetadata execute(String id) { + int serverId = Integer.parseInt(id); + Server server = client.getServer(serverId); + return server == null ? null : serverToNodeMetadata.apply(server); + } + + @Override + public Iterable list() { + return listDetailsOnNodesMatching(NodePredicates.all()); + } + + @Override + public Iterable listDetailsOnNodesMatching(Predicate filter) { + return Iterables.filter(Iterables.transform(client.listServers(), serverToNodeMetadata), filter); + } +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerRebootNodeStrategy.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerRebootNodeStrategy.java new file mode 100644 index 0000000000..6420a5a222 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerRebootNodeStrategy.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.servermanager.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.RebootNodeStrategy; +import org.jclouds.logging.Logger; +import org.jclouds.servermanager.ServerManager; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class ServerManagerRebootNodeStrategy implements RebootNodeStrategy { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + private final ServerManager client; + private final GetNodeMetadataStrategy getNodeMetadataStrategy; + + @Inject + protected ServerManagerRebootNodeStrategy(ServerManager client, GetNodeMetadataStrategy getNodeMetadataStrategy) { + this.client = checkNotNull(client, "client"); + this.getNodeMetadataStrategy = checkNotNull(getNodeMetadataStrategy, "getNodeMetadataStrategy"); + } + + @Override + public NodeMetadata execute(String id) { + + NodeMetadata node = getNodeMetadataStrategy.execute(id); + if (node == null || node.getState() == NodeState.TERMINATED) + return node; + + logger.debug(">> rebooting server(%s)", id); + client.rebootServer(Integer.parseInt(id)); + logger.debug("<< rebooted server(%s)", id); + + return node; + } +} diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerHardwareSupplier.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerHardwareSupplier.java new file mode 100644 index 0000000000..1039c398ac --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerHardwareSupplier.java @@ -0,0 +1,49 @@ +/** + * + * 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.servermanager.compute.suppliers; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.collect.TransformingSetSupplier; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.servermanager.ServerManager; +import org.jclouds.servermanager.compute.functions.ServerManagerHardwareToHardware; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class ServerManagerHardwareSupplier extends + TransformingSetSupplier { + private final ServerManager client; + + @Inject + protected ServerManagerHardwareSupplier(ServerManager client, + ServerManagerHardwareToHardware serverManagerHardwareToHardware) { + super(serverManagerHardwareToHardware); + this.client = client; + } + + public Iterable supplyFrom() { + return client.listHardware(); + } +} diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerImageSupplier.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerImageSupplier.java new file mode 100644 index 0000000000..666addfa42 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerImageSupplier.java @@ -0,0 +1,47 @@ +/** + * + * 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.servermanager.compute.suppliers; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.collect.TransformingSetSupplier; +import org.jclouds.compute.domain.Image; +import org.jclouds.servermanager.ServerManager; +import org.jclouds.servermanager.compute.functions.ServerManagerImageToImage; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class ServerManagerImageSupplier extends TransformingSetSupplier { + private final ServerManager client; + + @Inject + protected ServerManagerImageSupplier(ServerManager client, ServerManagerImageToImage serverManagerImageToImage) { + super(serverManagerImageToImage); + this.client = client; + } + + public Iterable supplyFrom() { + return client.listImages(); + } +} diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerLocationSupplier.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerLocationSupplier.java new file mode 100644 index 0000000000..e40109c04a --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerLocationSupplier.java @@ -0,0 +1,54 @@ +/** + * + * 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.servermanager.compute.suppliers; + +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; +import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.rest.annotations.Provider; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableSet; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class ServerManagerLocationSupplier implements Supplier> { + + private final String providerName; + + @Inject + ServerManagerLocationSupplier(@Provider String providerName) { + this.providerName = providerName; + } + + @Override + public Set get() { + Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); + return ImmutableSet.of(new LocationImpl(LocationScope.ZONE, "1", "SFO", provider)); + } +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilderTest.java b/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilderTest.java new file mode 100644 index 0000000000..5c45742b6c --- /dev/null +++ b/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilderTest.java @@ -0,0 +1,38 @@ +package org.jclouds.servermanager.compute; + +import static org.testng.Assert.assertNotNull; + +import java.util.Properties; + +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.ComputeServiceContextFactory; +import org.testng.annotations.Test; + +/** + * + * @author Adrian Cole + * + */ +@Test(groups = "unit") +public class ServerManagerComputeServiceContextBuilderTest { + + @Test + public void testCreateContextModule() { + assertNotNull(ServerManagerComputeServiceContextBuilder.createContextModule()); + } + + @Test + public void testCanBuildDirectly() { + ComputeServiceContext context = new ServerManagerComputeServiceContextBuilder(new Properties()) + .buildComputeServiceContext(); + context.close(); + } + + @Test + public void testCanBuildWithComputeService() { + ComputeServiceContext context = ComputeServiceContextFactory + .createStandaloneContext(ServerManagerComputeServiceContextBuilder.createContextModule()); + context.close(); + + } +} diff --git a/skeletons/standalone-compute/src/test/resources/log4j.xml b/skeletons/standalone-compute/src/test/resources/log4j.xml new file mode 100755 index 0000000000..f7337defb9 --- /dev/null +++ b/skeletons/standalone-compute/src/test/resources/log4j.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 46938731a502d7919d206bce453fe89602fc3505 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 22 Oct 2010 21:36:08 -0500 Subject: [PATCH 09/17] Issue 385: refactored internals so that creating new compute providers is much easier --- .../EC2BindComputeStrategiesByClass.java | 79 ++++++ .../EC2BindComputeSuppliersByClass.java | 56 +++++ .../EC2ComputeServiceContextModule.java | 93 +------ .../strategy/EC2DestroyNodeStrategy.java | 4 +- .../strategy/EC2GetNodeMetadataStrategy.java | 2 +- .../strategy/EC2ListNodesStrategy.java | 2 +- .../strategy/EC2RebootNodeStrategy.java | 4 +- .../src/main/clojure/org/jclouds/modules.clj | 60 ++--- .../compute/ComputeServiceAdapter.java | 51 ++++ .../compute/ComputeServiceContextFactory.java | 35 +-- .../JCloudsNativeComputeServiceAdapter.java | 64 +++++ ...tandaloneComputeServiceContextBuilder.java | 2 +- .../BaseComputeServiceContextModule.java | 140 ----------- .../config/BindComputeStrategiesByClass.java | 91 +++++++ .../config/BindComputeSuppliersByClass.java | 79 ++++++ ...StandaloneComputeServiceContextModule.java | 43 ++++ .../StandaloneComputeServiceClientModule.java | 7 +- ...StandaloneComputeServiceContextModule.java | 222 +++++++++-------- .../compute/internal/BaseComputeService.java | 8 +- .../strategy/AddNodeWithTagStrategy.java | 2 +- .../compute/strategy/DestroyNodeStrategy.java | 2 +- .../strategy/GetNodeMetadataStrategy.java | 2 +- .../compute/strategy/ListNodesStrategy.java | 2 +- .../compute/strategy/RebootNodeStrategy.java | 2 +- .../AdaptingComputeServiceStrategies.java | 136 ++++++++++ ...agIntoNameRunNodesAndAddToSetStrategy.java | 4 +- .../config/StubComputeServiceAdapter.java | 192 +++++++++++++++ .../StubComputeServiceContextModule.java | 66 +---- .../StubComputeServiceDependenciesModule.java | 232 +----------------- .../suppliers/DefaultLocationSupplier.java | 42 ++-- .../compute/suppliers/LocationSupplier.java | 21 +- .../jclouds/compute/util/ComputeUtils.java | 2 +- .../ComputeServiceContextFactoryTest.java | 23 +- .../collect/TransformingSetSupplier.java | 13 +- .../GoGridBindComputeStrategiesByClass.java | 64 +++++ .../GoGridBindComputeSuppliersByClass.java | 60 +++++ .../GoGridComputeServiceContextModule.java | 67 +---- .../GoGridAddNodeWithTagStrategy.java | 2 +- .../strategy/GoGridDestroyNodeStrategy.java | 4 +- .../GoGridGetNodeMetadataStrategy.java | 2 +- .../strategy/GoGridListNodesStrategy.java | 2 +- .../strategy/GoGridRebootNodeStrategy.java | 4 +- ...udServersBindComputeStrategiesByClass.java | 65 +++++ ...oudServersBindComputeSuppliersByClass.java | 54 ++++ ...oudServersComputeServiceContextModule.java | 61 +---- .../CloudServersAddNodeWithTagStrategy.java | 2 +- .../CloudServersDestroyNodeStrategy.java | 4 +- .../CloudServersGetNodeMetadataStrategy.java | 2 +- .../CloudServersListNodesStrategy.java | 2 +- .../CloudServersRebootNodeStrategy.java | 4 +- ...muHostingBindComputeStrategiesByClass.java | 40 +++ ...imuHostingBindComputeSuppliersByClass.java | 37 +++ ...imuHostingComputeServiceContextModule.java | 66 +---- .../RimuHostingAddNodeWithTagStrategy.java | 2 +- .../RimuHostingDestroyNodeStrategy.java | 4 +- .../RimuHostingGetNodeMetadataStrategy.java | 2 +- .../RimuHostingListNodesStrategy.java | 2 +- .../RimuHostingRebootNodeStrategy.java | 4 +- .../org/jclouds/servermanager/Datacenter.java | 56 +++++ ...erManagerComputeServiceContextBuilder.java | 54 ++-- .../functions/DatacenterToLocation.java | 42 ++++ .../ServerManagerAddNodeWithTagStrategy.java | 89 ------- .../ServerManagerComputeServiceAdapter.java | 83 +++++++ .../ServerManagerDestroyNodeStrategy.java | 68 ----- .../ServerManagerGetAndListNodesStrategy.java | 70 ------ .../ServerManagerRebootNodeStrategy.java | 69 ------ ...SlicehostBindComputeStrategiesByClass.java | 65 +++++ .../SlicehostBindComputeSuppliersByClass.java | 33 +-- .../SlicehostComputeServiceContextModule.java | 52 +--- .../SlicehostAddNodeWithTagStrategy.java | 2 +- .../SlicehostDestroyNodeStrategy.java | 4 +- .../SlicehostGetNodeMetadataStrategy.java | 2 +- .../strategy/SlicehostListNodesStrategy.java | 2 +- .../strategy/SlicehostRebootNodeStrategy.java | 4 +- ...monVCloudBindComputeStrategiesByClass.java | 36 +++ ...mmonVCloudBindComputeSuppliersByClass.java | 52 ++++ ...mmonVCloudComputeServiceContextModule.java | 47 +--- .../VCloudBindComputeStrategiesByClass.java | 60 +++++ .../VCloudBindComputeSuppliersByClass.java | 37 +++ .../VCloudComputeServiceContextModule.java | 43 +--- ...udExpressBindComputeStrategiesByClass.java | 62 +++++ ...oudExpressComputeServiceContextModule.java | 35 +-- .../VCloudAddNodeWithTagStrategy.java | 4 +- .../strategy/VCloudDestroyNodeStrategy.java | 4 +- .../VCloudExpressAddNodeWithTagStrategy.java | 2 +- .../VCloudExpressDestroyNodeStrategy.java | 4 +- .../VCloudExpressGetNodeMetadataStrategy.java | 2 +- .../VCloudExpressListNodesStrategy.java | 4 +- .../VCloudExpressRebootNodeStrategy.java | 4 +- .../VCloudGetNodeMetadataStrategy.java | 2 +- .../strategy/VCloudListNodesStrategy.java | 4 +- .../strategy/VCloudRebootNodeStrategy.java | 4 +- ...TerremarkBindComputeStrategiesByClass.java | 41 ++++ .../TerremarkBindComputeSuppliersByClass.java | 39 +++ ...markVCloudComputeServiceContextModule.java | 23 +- ...TerremarkVCloudAddNodeWithTagStrategy.java | 2 +- 96 files changed, 2064 insertions(+), 1481 deletions(-) create mode 100644 aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2BindComputeStrategiesByClass.java create mode 100644 aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2BindComputeSuppliersByClass.java create mode 100644 compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java create mode 100644 compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java create mode 100644 compute/src/main/java/org/jclouds/compute/config/BindComputeStrategiesByClass.java create mode 100644 compute/src/main/java/org/jclouds/compute/config/BindComputeSuppliersByClass.java create mode 100644 compute/src/main/java/org/jclouds/compute/config/JCloudsNativeStandaloneComputeServiceContextModule.java create mode 100644 compute/src/main/java/org/jclouds/compute/strategy/impl/AdaptingComputeServiceStrategies.java create mode 100644 compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceAdapter.java rename skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerHardwareSupplier.java => compute/src/main/java/org/jclouds/compute/suppliers/DefaultLocationSupplier.java (52%) rename skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerLocationSupplier.java => compute/src/main/java/org/jclouds/compute/suppliers/LocationSupplier.java (61%) create mode 100644 gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridBindComputeStrategiesByClass.java create mode 100644 gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridBindComputeSuppliersByClass.java create mode 100644 rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersBindComputeStrategiesByClass.java create mode 100644 rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersBindComputeSuppliersByClass.java create mode 100644 rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeStrategiesByClass.java create mode 100644 rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeSuppliersByClass.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Datacenter.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/DatacenterToLocation.java delete mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerAddNodeWithTagStrategy.java create mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerComputeServiceAdapter.java delete mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerDestroyNodeStrategy.java delete mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerGetAndListNodesStrategy.java delete mode 100644 skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerRebootNodeStrategy.java create mode 100644 slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeStrategiesByClass.java rename skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerImageSupplier.java => slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeSuppliersByClass.java (53%) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeStrategiesByClass.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeSuppliersByClass.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudBindComputeStrategiesByClass.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudBindComputeSuppliersByClass.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressBindComputeStrategiesByClass.java create mode 100644 vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkBindComputeStrategiesByClass.java create mode 100644 vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkBindComputeSuppliersByClass.java diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2BindComputeStrategiesByClass.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2BindComputeStrategiesByClass.java new file mode 100644 index 0000000000..44a62e4651 --- /dev/null +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2BindComputeStrategiesByClass.java @@ -0,0 +1,79 @@ +/** + * + * 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 org.jclouds.aws.ec2.compute.strategy.EC2DestroyNodeStrategy; +import org.jclouds.aws.ec2.compute.strategy.EC2GetNodeMetadataStrategy; +import org.jclouds.aws.ec2.compute.strategy.EC2ListNodesStrategy; +import org.jclouds.aws.ec2.compute.strategy.EC2RebootNodeStrategy; +import org.jclouds.aws.ec2.compute.strategy.EC2RunNodesAndAddToSetStrategy; +import org.jclouds.compute.config.BindComputeStrategiesByClass; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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; + +/** + * @author Adrian Cole + */ +public class EC2BindComputeStrategiesByClass extends BindComputeStrategiesByClass { + @Override + protected Class defineRunNodesAndAddToSetStrategy() { + return EC2RunNodesAndAddToSetStrategy.class; + } + + /** + * not needed, as {@link EC2RunNodesAndAddToSetStrategy} is used and is already set-based. + */ + @Override + protected Class defineAddNodeWithTagStrategy() { + return null; + } + + /** + * not needed, as {@link EC2RunNodesAndAddToSetStrategy} is used and is already set-based. + */ + @Override + protected void bindAddNodeWithTagStrategy(Class clazz) { + } + + @Override + protected Class defineDestroyNodeStrategy() { + return EC2DestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return EC2GetNodeMetadataStrategy.class; + } + + @Override + protected Class defineListNodesStrategy() { + return EC2ListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return EC2RebootNodeStrategy.class; + } + +} \ No newline at end of file diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2BindComputeSuppliersByClass.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2BindComputeSuppliersByClass.java new file mode 100644 index 0000000000..5828736d97 --- /dev/null +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2BindComputeSuppliersByClass.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.aws.ec2.compute.config; + +import java.util.Set; + +import org.jclouds.aws.ec2.compute.suppliers.EC2HardwareSupplier; +import org.jclouds.aws.ec2.compute.suppliers.EC2ImageSupplier; +import org.jclouds.aws.ec2.compute.suppliers.EC2LocationSupplier; +import org.jclouds.compute.config.BindComputeSuppliersByClass; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.domain.Location; + +import com.google.common.base.Supplier; +/** + * @author Adrian Cole + */ +public class EC2BindComputeSuppliersByClass extends BindComputeSuppliersByClass { + @Override + protected Class>> defineHardwareSupplier() { + return EC2HardwareSupplier.class; + } + + @Override + protected Class>> defineImageSupplier() { + return EC2ImageSupplier.class; + } + + @Override + protected Class> defineDefaultLocationSupplier() { + return org.jclouds.aws.suppliers.DefaultLocationSupplier.class; + } + + @Override + protected Class>> defineLocationSupplier() { + return EC2LocationSupplier.class; + } +} \ No newline at end of file diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java index dd97e5bf22..7d8fde80ad 100755 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/config/EC2ComputeServiceContextModule.java @@ -25,7 +25,6 @@ import static org.jclouds.compute.domain.OsFamily.CENTOS; import static org.jclouds.compute.domain.OsFamily.UBUNTU; import java.util.Map; -import java.util.Set; import javax.inject.Named; import javax.inject.Singleton; @@ -33,30 +32,14 @@ import javax.inject.Singleton; import org.jclouds.aws.ec2.compute.EC2ComputeService; import org.jclouds.aws.ec2.compute.domain.RegionAndName; import org.jclouds.aws.ec2.compute.strategy.EC2DestroyLoadBalancerStrategy; -import org.jclouds.aws.ec2.compute.strategy.EC2DestroyNodeStrategy; -import org.jclouds.aws.ec2.compute.strategy.EC2GetNodeMetadataStrategy; -import org.jclouds.aws.ec2.compute.strategy.EC2ListNodesStrategy; import org.jclouds.aws.ec2.compute.strategy.EC2LoadBalanceNodesStrategy; -import org.jclouds.aws.ec2.compute.strategy.EC2RebootNodeStrategy; -import org.jclouds.aws.ec2.compute.strategy.EC2RunNodesAndAddToSetStrategy; -import org.jclouds.aws.ec2.compute.suppliers.EC2HardwareSupplier; -import org.jclouds.aws.ec2.compute.suppliers.EC2ImageSupplier; -import org.jclouds.aws.ec2.compute.suppliers.EC2LocationSupplier; import org.jclouds.aws.ec2.compute.suppliers.RegionAndNameToImageSupplier; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.compute.strategy.DestroyLoadBalancerStrategy; -import org.jclouds.compute.strategy.DestroyNodeStrategy; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.LoadBalanceNodesStrategy; -import org.jclouds.compute.strategy.RebootNodeStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; -import org.jclouds.domain.Location; import org.jclouds.rest.annotations.Provider; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; @@ -74,6 +57,8 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod @Override protected void configure() { install(new EC2ComputeServiceDependenciesModule()); + install(new EC2BindComputeStrategiesByClass()); + install(new EC2BindComputeSuppliersByClass()); super.configure(); } @@ -91,14 +76,14 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod @Provides @Singleton protected Supplier> provideRegionAndNameToImageSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final RegionAndNameToImageSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final RegionAndNameToImageSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); + authException, seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); } @Override @@ -106,64 +91,4 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod bind(LoadBalanceNodesStrategy.class).to(EC2LoadBalanceNodesStrategy.class); bind(DestroyLoadBalancerStrategy.class).to(EC2DestroyLoadBalancerStrategy.class); } - - @Override - protected Class defineRunNodesAndAddToSetStrategy() { - return EC2RunNodesAndAddToSetStrategy.class; - } - - /** - * not needed, as {@link EC2RunNodesAndAddToSetStrategy} is used and is already set-based. - */ - @Override - protected Class defineAddNodeWithTagStrategy() { - return null; - } - - /** - * not needed, as {@link EC2RunNodesAndAddToSetStrategy} is used and is already set-based. - */ - @Override - protected void bindAddNodeWithTagStrategy(Class clazz) { - } - - @Override - protected Class defineDestroyNodeStrategy() { - return EC2DestroyNodeStrategy.class; - } - - @Override - protected Class defineGetNodeMetadataStrategy() { - return EC2GetNodeMetadataStrategy.class; - } - - @Override - protected Class>> defineHardwareSupplier() { - return EC2HardwareSupplier.class; - } - - @Override - protected Class>> defineImageSupplier() { - return EC2ImageSupplier.class; - } - - @Override - protected Class defineListNodesStrategy() { - return EC2ListNodesStrategy.class; - } - - @Override - protected Class defineRebootNodeStrategy() { - return EC2RebootNodeStrategy.class; - } - - @Override - protected Class> defineDefaultLocationSupplier() { - return org.jclouds.aws.suppliers.DefaultLocationSupplier.class; - } - - @Override - protected Class>> defineLocationSupplier() { - return EC2LocationSupplier.class; - } } diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2DestroyNodeStrategy.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2DestroyNodeStrategy.java index d2331ca4dd..cae1d54ef1 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2DestroyNodeStrategy.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2DestroyNodeStrategy.java @@ -53,12 +53,12 @@ public class EC2DestroyNodeStrategy implements DestroyNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata destroyNode(String id) { String[] parts = parseHandle(id); String region = parts[0]; String instanceId = parts[1]; ec2Client.getInstanceServices().terminateInstancesInRegion(region, instanceId); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java index 001af59126..394a18a6cf 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java @@ -53,7 +53,7 @@ public class EC2GetNodeMetadataStrategy implements GetNodeMetadataStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata getNode(String id) { String[] parts = parseHandle(id); String region = parts[0]; String instanceId = parts[1]; diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2ListNodesStrategy.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2ListNodesStrategy.java index 3085055ab5..98b90b3e04 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2ListNodesStrategy.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2ListNodesStrategy.java @@ -77,7 +77,7 @@ public class EC2ListNodesStrategy implements ListNodesStrategy { } @Override - public Set list() { + public Set listNodes() { return listDetailsOnNodesMatching(NodePredicates.all()); } diff --git a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2RebootNodeStrategy.java b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2RebootNodeStrategy.java index 265a56329f..bfa3a879c6 100644 --- a/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2RebootNodeStrategy.java +++ b/aws/core/src/main/java/org/jclouds/aws/ec2/compute/strategy/EC2RebootNodeStrategy.java @@ -46,12 +46,12 @@ public class EC2RebootNodeStrategy implements RebootNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata rebootNode(String id) { String[] parts = parseHandle(id); String region = parts[0]; String instanceId = parts[1]; client.rebootInstancesInRegion(region, instanceId); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/compute/src/main/clojure/org/jclouds/modules.clj b/compute/src/main/clojure/org/jclouds/modules.clj index 10fbfc3dde..6e0f14e958 100644 --- a/compute/src/main/clojure/org/jclouds/modules.clj +++ b/compute/src/main/clojure/org/jclouds/modules.clj @@ -24,63 +24,33 @@ com.google.inject.Module org.jclouds.net.IPSocket [org.jclouds.compute ComputeService ComputeServiceContextFactory] - java.util.Set + [java.util Set Map] [org.jclouds.compute.domain NodeMetadata Template] [com.google.common.base Supplier Predicate] - [org.jclouds.compute.strategy AddNodeWithTagStrategy DestroyNodeStrategy RebootNodeStrategy GetNodeMetadataStrategy ListNodesStrategy] org.jclouds.compute.domain.NodeMetadataBuilder)) (defn compute-module [] - (.. (org.jclouds.compute.config.StandaloneComputeServiceContextModule$Builder.) - (defineAddNodeWithTagStrategy (defrecord ClojureAddNodeWithTagStrategy [] - AddNodeWithTagStrategy - (^NodeMetadata execute [this ^String tag ^String name ^Template template] - ()))) - (defineDestroyNodeStrategy (defrecord ClojureDestroyNodeStrategy [] - DestroyNodeStrategy - (^NodeMetadata execute [this ^String id] - ()))) - (defineRebootNodeStrategy (defrecord ClojureRebootNodeStrategy [] - RebootNodeStrategy - (^NodeMetadata execute [this ^String id] - ()))) - (defineGetNodeMetadataStrategy (defrecord ClojureGetNodeMetadataStrategy [] - GetNodeMetadataStrategy - (^NodeMetadata execute [this ^String id] - ()))) - (defineListNodesStrategy (defrecord ClojureListNodesStrategy [] - ListNodesStrategy - (^Iterable list [this ] + (org.jclouds.compute.config.JCloudsNativeStandaloneComputeServiceContextModule + (defrecord ClojureComputeServiceAdapter [] + org.jclouds.compute.JCloudsNativeComputeServiceAdapter + (^NodeMetadata createNodeAndStoreCredentials [this ^String tag ^String name ^Template template ^Map credentialStore] ()) - (^Iterable listDetailsOnNodesMatching [this ^Predicate filter] + (^Iterable listNodes [this ] ()) - )) - ;; this needs to return Set - - (defineHardwareSupplier - (defrecord HardwareSupplier [] - Supplier - (get [this] + (^Iterable listImages [this ] ()) - )) - ;; this needs to return Set - - (defineImageSupplier (defrecord ImageSupplier [] - Supplier - ( get [this] + (^Iterable listHardware [this ] ()) - )) - ;; this needs to return Set - (defineLocationSupplier (defrecord LocationSupplier [] - Supplier - ( get [this] + (^Iterable listLocations [this ] ()) - )) - (build) - - )) + (^NodeMetadata getNode [this ^String id] + ()) + (^void destroyNode [this ^String id] + ()) + (^void rebootNode [this ^String id] + ())))) (defn compute-context [module] (ComputeServiceContextFactory/createStandaloneContext module)) diff --git a/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java b/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java new file mode 100644 index 0000000000..21270fff0d --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.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.compute; + +import java.util.Map; + +import org.jclouds.compute.domain.Template; +import org.jclouds.domain.Credentials; + +/** + * A means of specifying the interface between the {@link ComputeServices} and a concrete compute + * cloud implementation, jclouds or otherwise. + * + * @author Adrian Cole + * + */ +public interface ComputeServiceAdapter { + N createNodeAndStoreCredentials(String tag, String name, Template template, Map credentialStore); + + Iterable listHardware(); + + Iterable listImages(); + + Iterable listLocations(); + + N getNode(String id); + + void destroyNode(String id); + + void rebootNode(String id); + + Iterable listNodes(); + +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java b/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java index 41987094b9..e447eab61d 100644 --- a/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java +++ b/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java @@ -69,7 +69,7 @@ public class ComputeServiceContextFactory { } public static ComputeServiceContext buildContextUnwrappingExceptions( - ComputeServiceContextBuilder builder) { + ComputeServiceContextBuilder builder) { try { return builder.buildComputeServiceContext(); } catch (Exception e) { @@ -82,7 +82,7 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(String provider, String identity, String credential) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, identity, credential)); + .createContextBuilder(provider, identity, credential)); return buildContextUnwrappingExceptions(builder); } @@ -91,7 +91,7 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(String provider, Properties overrides) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, overrides)); + .createContextBuilder(provider, overrides)); return buildContextUnwrappingExceptions(builder); } @@ -100,7 +100,7 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(String provider, Iterable modules, Properties overrides) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, modules, overrides)); + .createContextBuilder(provider, modules, overrides)); return buildContextUnwrappingExceptions(builder); } @@ -109,9 +109,9 @@ public class ComputeServiceContextFactory { * @see RestContextFactory#createContextBuilder(String, String,String, Iterable) */ public ComputeServiceContext createContext(String provider, @Nullable String identity, @Nullable String credential, - Iterable modules) { + Iterable modules) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, identity, credential, modules)); + .createContextBuilder(provider, identity, credential, modules)); return buildContextUnwrappingExceptions(builder); } @@ -119,9 +119,9 @@ public class ComputeServiceContextFactory { * @see RestContextFactory#createContextBuilder(String, String,String, Iterable, Properties) */ public ComputeServiceContext createContext(String provider, @Nullable String identity, @Nullable String credential, - Iterable modules, Properties overrides) { + Iterable modules, Properties overrides) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(contextFactory - .createContextBuilder(provider, identity, credential, modules, overrides)); + .createContextBuilder(provider, identity, credential, modules, overrides)); return buildContextUnwrappingExceptions(builder); } @@ -130,7 +130,7 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(ContextSpec contextSpec) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class - .cast(createContextBuilder(contextSpec)); + .cast(createContextBuilder(contextSpec)); return buildContextUnwrappingExceptions(builder); } @@ -140,21 +140,22 @@ public class ComputeServiceContextFactory { */ public ComputeServiceContext createContext(ContextSpec contextSpec, Properties overrides) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(createContextBuilder( - contextSpec, overrides)); + contextSpec, overrides)); return buildContextUnwrappingExceptions(builder); } - public static ComputeServiceContext createStandaloneContext(StandaloneComputeServiceContextModule contextModule) { + public static ComputeServiceContext createStandaloneContext( + StandaloneComputeServiceContextModule contextModule) { return createStandaloneContext(contextModule, ImmutableSet. of()); } @SuppressWarnings("unchecked") - public static ComputeServiceContext createStandaloneContext(StandaloneComputeServiceContextModule contextModule, - Iterable modules) { + public static ComputeServiceContext createStandaloneContext( + StandaloneComputeServiceContextModule contextModule, Iterable modules) { return new ComputeServiceContextFactory().createContext(RestContextFactory - . contextSpec("standalone", "standalone", "1", "standalone", null, - (Class) null, (Class) null, PropertiesBuilder.class, - (Class) StandaloneComputeServiceContextBuilder.class, ImmutableSet. builder().add( - contextModule).addAll(modules).build())); + . contextSpec("standalone", "standalone", "1", "standalone", null, + (Class) null, (Class) null, PropertiesBuilder.class, + (Class) StandaloneComputeServiceContextBuilder.class, + ImmutableSet. builder().add(contextModule).addAll(modules).build())); } } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java b/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java new file mode 100644 index 0000000000..d24a5842b6 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.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.compute; + +import java.util.Map; + +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.Template; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; + +/** + * A means of specifying the implementation of a service that uses jclouds types. + * + * @author Adrian Cole + * + */ +public interface JCloudsNativeComputeServiceAdapter extends + ComputeServiceAdapter { + @Override + NodeMetadata createNodeAndStoreCredentials(String tag, String name, Template template, + Map credentialStore); + + @Override + Iterable listNodes(); + + @Override + Iterable listImages(); + + @Override + Iterable listHardware(); + + @Override + Iterable listLocations(); + + @Override + NodeMetadata getNode(String id); + + @Override + void destroyNode(String id); + + @Override + void rebootNode(String id); + +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java index 2034b3e2e0..7c18b05c9b 100644 --- a/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java +++ b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextBuilder.java @@ -54,7 +54,7 @@ public class StandaloneComputeServiceContextBuilder extends @Override protected void addClientModule(List modules) { - modules.add(new StandaloneComputeServiceClientModule()); + modules.add(new StandaloneComputeServiceClientModule(ComputeService.class)); } } \ 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 71014c4317..d498dba1f4 100644 --- a/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/BaseComputeServiceContextModule.java @@ -26,7 +26,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; -import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; @@ -36,29 +35,18 @@ import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -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.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import com.google.common.base.Function; -import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; -import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.inject.AbstractModule; import com.google.inject.Injector; import com.google.inject.Provides; import com.google.inject.Scopes; -import com.google.inject.TypeLiteral; import com.google.inject.util.Providers; /** @@ -69,141 +57,13 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule { @Override protected void configure() { install(new ComputeServiceTimeoutsModule()); - bindRunNodesAndAddToSetStrategy(defineRunNodesAndAddToSetStrategy()); - bindAddNodeWithTagStrategy(defineAddNodeWithTagStrategy()); - bindListNodesStrategy(defineListNodesStrategy()); - bindGetNodeMetadataStrategy(defineGetNodeMetadataStrategy()); - bindRebootNodeStrategy(defineRebootNodeStrategy()); - bindDestroyNodeStrategy(defineDestroyNodeStrategy()); - bindImageSupplier(defineImageSupplier()); - bindLocationSupplier(defineLocationSupplier()); - bindHardwareSupplier(defineHardwareSupplier()); - bindDefaultLocationSupplier(defineDefaultLocationSupplier()); bindLoadBalancerService(); } - protected Class defineRunNodesAndAddToSetStrategy() { - return EncodeTagIntoNameRunNodesAndAddToSetStrategy.class; - } - - /** - * needed, if {@link RunNodesAndAddToSetStrategy} requires it - */ - protected abstract Class defineAddNodeWithTagStrategy(); - - protected abstract Class defineDestroyNodeStrategy(); - - protected abstract Class defineRebootNodeStrategy(); - - protected abstract Class defineGetNodeMetadataStrategy(); - - protected abstract Class defineListNodesStrategy(); - - protected abstract Class>> defineImageSupplier(); - - protected abstract Class>> defineHardwareSupplier(); - - protected Class>> defineLocationSupplier() { - return LocationSupplier.class; - } - - protected Class> defineDefaultLocationSupplier() { - return DefaultLocationSupplier.class; - } - protected void bindLoadBalancerService() { bind(LoadBalancerService.class).toProvider(Providers. of(null)).in(Scopes.SINGLETON); } - protected void bindRunNodesAndAddToSetStrategy(Class clazz) { - bind(RunNodesAndAddToSetStrategy.class).to(clazz).in(Scopes.SINGLETON); - } - - /** - * needed, if {@link RunNodesAndAddToSetStrategy} requires it - */ - protected void bindAddNodeWithTagStrategy(Class clazz) { - bind(AddNodeWithTagStrategy.class).to(clazz).in(Scopes.SINGLETON); - } - - protected void bindDestroyNodeStrategy(Class clazz) { - bind(DestroyNodeStrategy.class).to(clazz).in(Scopes.SINGLETON); - } - - protected void bindRebootNodeStrategy(Class clazz) { - bind(RebootNodeStrategy.class).to(clazz).in(Scopes.SINGLETON); - } - - protected void bindGetNodeMetadataStrategy(Class clazz) { - bind(GetNodeMetadataStrategy.class).to(clazz).in(Scopes.SINGLETON); - } - - protected void bindListNodesStrategy(Class clazz) { - bind(ListNodesStrategy.class).to(clazz).in(Scopes.SINGLETON); - } - - protected void bindImageSupplier(Class>> clazz) { - bind(new TypeLiteral>>() { - }).to(clazz).in(Scopes.SINGLETON); - } - - protected void bindLocationSupplier(Class>> clazz) { - bind(new TypeLiteral>>() { - }).to(clazz).in(Scopes.SINGLETON); - } - - protected void bindDefaultLocationSupplier(Class> clazz) { - bind(new TypeLiteral>() { - }).to(clazz).in(Scopes.SINGLETON); - } - - protected void bindHardwareSupplier(Class>> clazz) { - bind(new TypeLiteral>>() { - }).to(clazz).in(Scopes.SINGLETON); - } - - /** - * By default allows you to use a static set of locations bound to Set - */ - @Singleton - public static class LocationSupplier implements Supplier> { - private final Set locations; - - @Inject - LocationSupplier(Set locations) { - this.locations = locations; - } - - @Override - public Set get() { - return locations; - } - - } - - @Singleton - public static class DefaultLocationSupplier implements Supplier { - private final Supplier> locations; - - @Inject - DefaultLocationSupplier(@Memoized Supplier> locations) { - this.locations = locations; - } - - @Override - public Location get() { - return Iterables.find(locations.get(), new Predicate() { - - @Override - public boolean apply(Location input) { - return input.getScope() == LocationScope.ZONE; - } - - }); - } - - } - /** * The default template if none is provided. */ diff --git a/compute/src/main/java/org/jclouds/compute/config/BindComputeStrategiesByClass.java b/compute/src/main/java/org/jclouds/compute/config/BindComputeStrategiesByClass.java new file mode 100644 index 0000000000..98e09c682c --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/config/BindComputeStrategiesByClass.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.compute.config; + +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; + +import com.google.inject.AbstractModule; +import com.google.inject.Scopes; + +/** + * + * @author Adrian Cole + * + */ +public abstract class BindComputeStrategiesByClass extends AbstractModule { + protected void configure() { + bindRunNodesAndAddToSetStrategy(defineRunNodesAndAddToSetStrategy()); + bindAddNodeWithTagStrategy(defineAddNodeWithTagStrategy()); + bindListNodesStrategy(defineListNodesStrategy()); + bindGetNodeMetadataStrategy(defineGetNodeMetadataStrategy()); + bindRebootNodeStrategy(defineRebootNodeStrategy()); + bindDestroyNodeStrategy(defineDestroyNodeStrategy()); + } + + protected void bindRunNodesAndAddToSetStrategy(Class clazz) { + bind(RunNodesAndAddToSetStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + /** + * needed, if {@link RunNodesAndAddToSetStrategy} requires it + */ + protected void bindAddNodeWithTagStrategy(Class clazz) { + bind(AddNodeWithTagStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindDestroyNodeStrategy(Class clazz) { + bind(DestroyNodeStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindRebootNodeStrategy(Class clazz) { + bind(RebootNodeStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindGetNodeMetadataStrategy(Class clazz) { + bind(GetNodeMetadataStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindListNodesStrategy(Class clazz) { + bind(ListNodesStrategy.class).to(clazz).in(Scopes.SINGLETON); + } + + protected Class defineRunNodesAndAddToSetStrategy() { + return EncodeTagIntoNameRunNodesAndAddToSetStrategy.class; + } + + /** + * needed, if {@link RunNodesAndAddToSetStrategy} requires it + */ + protected abstract Class defineAddNodeWithTagStrategy(); + + protected abstract Class defineDestroyNodeStrategy(); + + protected abstract Class defineRebootNodeStrategy(); + + protected abstract Class defineGetNodeMetadataStrategy(); + + protected abstract Class defineListNodesStrategy(); +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/config/BindComputeSuppliersByClass.java b/compute/src/main/java/org/jclouds/compute/config/BindComputeSuppliersByClass.java new file mode 100644 index 0000000000..8e9651f0c3 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/config/BindComputeSuppliersByClass.java @@ -0,0 +1,79 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.compute.config; + +import java.util.Set; + +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.suppliers.DefaultLocationSupplier; +import org.jclouds.compute.suppliers.LocationSupplier; +import org.jclouds.domain.Location; + +import com.google.common.base.Supplier; +import com.google.inject.AbstractModule; +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; +/** + * @author Adrian Cole + */ +public abstract class BindComputeSuppliersByClass extends AbstractModule { + + @Override + protected void configure() { + bindImageSupplier(defineImageSupplier()); + bindLocationSupplier(defineLocationSupplier()); + bindHardwareSupplier(defineHardwareSupplier()); + bindDefaultLocationSupplier(defineDefaultLocationSupplier()); + } + + protected abstract Class>> defineImageSupplier(); + + protected abstract Class>> defineHardwareSupplier(); + + protected Class>> defineLocationSupplier() { + return LocationSupplier.class; + } + + protected Class> defineDefaultLocationSupplier() { + return DefaultLocationSupplier.class; + } + + protected void bindImageSupplier(Class>> clazz) { + bind(new TypeLiteral>>() { + }).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindLocationSupplier(Class>> clazz) { + bind(new TypeLiteral>>() { + }).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindDefaultLocationSupplier(Class> clazz) { + bind(new TypeLiteral>() { + }).to(clazz).in(Scopes.SINGLETON); + } + + protected void bindHardwareSupplier(Class>> clazz) { + bind(new TypeLiteral>>() { + }).to(clazz).in(Scopes.SINGLETON); + } + +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/config/JCloudsNativeStandaloneComputeServiceContextModule.java b/compute/src/main/java/org/jclouds/compute/config/JCloudsNativeStandaloneComputeServiceContextModule.java new file mode 100644 index 0000000000..1ef63a6ec6 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/config/JCloudsNativeStandaloneComputeServiceContextModule.java @@ -0,0 +1,43 @@ +package org.jclouds.compute.config; + +import org.jclouds.compute.ComputeServiceAdapter; +import org.jclouds.compute.config.StandaloneComputeServiceContextModule; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.domain.Location; + +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; + +public class JCloudsNativeStandaloneComputeServiceContextModule extends + StandaloneComputeServiceContextModule { + private final Class> adapter; + + public JCloudsNativeStandaloneComputeServiceContextModule( + Class> adapter) { + this.adapter = adapter; + } + + /** + * This binds the converters to {@link IdentityFunction} as that ensure the same value is + * returned. + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + protected void configure() { + bind(new TypeLiteral>() { + }).to(adapter); + bind(IdentityFunction.class).toInstance(IdentityFunction.INSTANCE); + bind(new TypeLiteral>() { + }).to((Class) StandaloneComputeServiceContextModule.IdentityFunction.class); + bind(new TypeLiteral>() { + }).to((Class) StandaloneComputeServiceContextModule.IdentityFunction.class); + bind(new TypeLiteral>() { + }).to((Class) StandaloneComputeServiceContextModule.IdentityFunction.class); + bind(new TypeLiteral>() { + }).to((Class) StandaloneComputeServiceContextModule.IdentityFunction.class); + super.configure(); + } + +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceClientModule.java b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceClientModule.java index 75378ae0c3..b671bae6c8 100644 --- a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceClientModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceClientModule.java @@ -19,17 +19,16 @@ package org.jclouds.compute.config; -import org.jclouds.compute.ComputeService; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.config.RestClientModule; @ConfiguresRestClient @RequiresHttp -public class StandaloneComputeServiceClientModule extends RestClientModule { +public class StandaloneComputeServiceClientModule extends RestClientModule { - public StandaloneComputeServiceClientModule() { - super(ComputeService.class, ComputeService.class); + public StandaloneComputeServiceClientModule(Class clazz) { + super(clazz, clazz); } @Override diff --git a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java index 9a2e766949..f924e8e62c 100644 --- a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java @@ -19,9 +19,16 @@ 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.compute.ComputeService; +import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; @@ -31,11 +38,13 @@ import org.jclouds.compute.strategy.DestroyNodeStrategy; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; +import org.jclouds.compute.strategy.impl.AdaptingComputeServiceStrategies; +import org.jclouds.compute.suppliers.DefaultLocationSupplier; import org.jclouds.domain.Location; +import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.Sets; -import com.google.inject.Module; +import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -43,125 +52,122 @@ import com.google.inject.TypeLiteral; * * @author Adrian Cole */ -public abstract class StandaloneComputeServiceContextModule extends BaseComputeServiceContextModule { +public class StandaloneComputeServiceContextModule extends BaseComputeServiceContextModule { + @Override protected void configure() { super.configure(); + bindDefaultLocation(); bind(new TypeLiteral() { }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); } - public static Builder builder() { - return new Builder(); + public class TransformingSetSupplier implements Supplier> { + private final Supplier> backingSupplier; + private final Function converter; + + 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)); + } + } - public static class Builder { - private Set modules = Sets.newLinkedHashSet(); - private Class addNodeWithTagStrategy; - private Class destroyNodeStrategy; - private Class getNodeMetadataStrategy; - private Class listNodesStrategy; - private Class rebootNodeStrategy; - private Class>> hardwareSupplier; - private Class>> imageSupplier; - private Class>> locationSupplier = LocationSupplier.class; + @Provides + @Singleton + protected Supplier> provideHardware(final ComputeServiceAdapter adapter, + Function transformer) { + return new TransformingSetSupplier(new Supplier>() { - public Builder install(Module module) { - this.modules.add(module); - return this; + @Override + public Iterable get() { + return adapter.listHardware(); + } + + }, transformer); + } + + @Provides + @Singleton + protected Supplier> provideImages(final ComputeServiceAdapter adapter, + Function transformer) { + return new TransformingSetSupplier(new Supplier>() { + + @Override + public Iterable get() { + return adapter.listImages(); + } + + }, transformer); + } + + protected void bindDefaultLocation() { + bind(new TypeLiteral>() { + }).to(DefaultLocationSupplier.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) { + return in; + } + + @Provides + @Singleton + protected DestroyNodeStrategy defineDestroyNodeStrategy(AdaptingComputeServiceStrategies in) { + return in; + } + + @Provides + @Singleton + protected GetNodeMetadataStrategy defineGetNodeMetadataStrategy(AdaptingComputeServiceStrategies in) { + return in; + } + + @Provides + @Singleton + protected ListNodesStrategy defineListNodesStrategy(AdaptingComputeServiceStrategies in) { + return in; + } + + @Provides + @Singleton + protected RebootNodeStrategy defineRebootNodeStrategy(AdaptingComputeServiceStrategies in) { + return in; + } + + // enum singleton pattern + public static enum IdentityFunction implements Function { + INSTANCE; + + public Object apply(Object o) { + return o; } - public Builder defineAddNodeWithTagStrategy(Class addNodeWithTagStrategy) { - this.addNodeWithTagStrategy = addNodeWithTagStrategy; - return this; - } - - public Builder defineDestroyNodeStrategy(Class destroyNodeStrategy) { - this.destroyNodeStrategy = destroyNodeStrategy; - return this; - } - - public Builder defineGetNodeMetadataStrategy(Class getNodeMetadataStrategy) { - this.getNodeMetadataStrategy = getNodeMetadataStrategy; - return this; - } - - public Builder defineListNodesStrategy(Class listNodesStrategy) { - this.listNodesStrategy = listNodesStrategy; - return this; - } - - public Builder defineRebootNodeStrategy(Class rebootNodeStrategy) { - this.rebootNodeStrategy = rebootNodeStrategy; - return this; - } - - public Builder defineHardwareSupplier(Class>> hardwareSupplier) { - this.hardwareSupplier = hardwareSupplier; - return this; - } - - public Builder defineImageSupplier(Class>> imageSupplier) { - this.imageSupplier = imageSupplier; - return this; - } - - public Builder defineLocationSupplier(Class>> locationSupplier) { - this.locationSupplier = locationSupplier; - return this; - } - - public StandaloneComputeServiceContextModule build() { - return new StandaloneComputeServiceContextModule() { - - @Override - protected Class defineAddNodeWithTagStrategy() { - return addNodeWithTagStrategy; - } - - @Override - protected Class defineDestroyNodeStrategy() { - return destroyNodeStrategy; - } - - @Override - protected Class defineGetNodeMetadataStrategy() { - return getNodeMetadataStrategy; - } - - @Override - protected Class>> defineHardwareSupplier() { - return hardwareSupplier; - } - - @Override - protected Class>> defineImageSupplier() { - return imageSupplier; - } - - @Override - protected Class defineListNodesStrategy() { - return listNodesStrategy; - } - - @Override - protected Class defineRebootNodeStrategy() { - return rebootNodeStrategy; - } - - protected Class>> defineLocationSupplier() { - return locationSupplier; - } - - @Override - protected void configure() { - for (Module module : modules) - install(module); - super.configure(); - } - - }; + @Override + public String toString() { + return "identity"; } } + } \ No newline at end of file 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 e148f0ccef..7becc0355c 100755 --- a/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java +++ b/compute/src/main/java/org/jclouds/compute/internal/BaseComputeService.java @@ -214,7 +214,7 @@ public class BaseComputeService implements ComputeService { @Override public boolean apply(String input) { try { - NodeMetadata md = destroyNodeStrategy.execute(id); + NodeMetadata md = destroyNodeStrategy.destroyNode(id); if (md != null) node.set(md); return true; @@ -269,7 +269,7 @@ public class BaseComputeService implements ComputeService { @Override public Set listNodes() { logger.debug(">> listing nodes"); - Set set = newLinkedHashSet(listNodesStrategy.list()); + Set set = newLinkedHashSet(listNodesStrategy.listNodes()); logger.debug("<< list(%d)", set.size()); return set; } @@ -324,7 +324,7 @@ public class BaseComputeService implements ComputeService { @Override public NodeMetadata getNodeMetadata(String id) { checkNotNull(id, "id"); - return getNodeMetadataStrategy.execute(id); + return getNodeMetadataStrategy.getNode(id); } /** @@ -334,7 +334,7 @@ public class BaseComputeService implements ComputeService { public void rebootNode(String id) { checkNotNull(id, "id"); logger.debug(">> rebooting node(%s)", id); - NodeMetadata node = rebootNodeStrategy.execute(id); + NodeMetadata node = rebootNodeStrategy.rebootNode(id); boolean successful = nodeRunning.apply(node); logger.debug("<< rebooted node(%s) success(%s)", id, successful); } diff --git a/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java index 167d7a5192..d4904ccf54 100644 --- a/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/AddNodeWithTagStrategy.java @@ -42,6 +42,6 @@ public interface AddNodeWithTagStrategy { * supplied by the user * @return NodeMetadata from the new object, most likely in some pending state. */ - NodeMetadata execute(String tag, String name, Template template); + NodeMetadata addNodeWithTag(String tag, String name, Template template); } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/strategy/DestroyNodeStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/DestroyNodeStrategy.java index 6797df0eab..609a3c6263 100644 --- a/compute/src/main/java/org/jclouds/compute/strategy/DestroyNodeStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/DestroyNodeStrategy.java @@ -32,6 +32,6 @@ public interface DestroyNodeStrategy { * * @return null if the node wasn't found */ - NodeMetadata execute(String id); + NodeMetadata destroyNode(String id); } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/strategy/GetNodeMetadataStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/GetNodeMetadataStrategy.java index cc63c82cf6..f6aaed0890 100644 --- a/compute/src/main/java/org/jclouds/compute/strategy/GetNodeMetadataStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/GetNodeMetadataStrategy.java @@ -28,6 +28,6 @@ import org.jclouds.compute.domain.NodeMetadata; */ public interface GetNodeMetadataStrategy { - NodeMetadata execute(String id); + NodeMetadata getNode(String id); } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/strategy/ListNodesStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/ListNodesStrategy.java index 688e1d2e95..a9844f207c 100755 --- a/compute/src/main/java/org/jclouds/compute/strategy/ListNodesStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/ListNodesStrategy.java @@ -30,7 +30,7 @@ import com.google.common.base.Predicate; */ public interface ListNodesStrategy { - Iterable list(); + Iterable listNodes(); Iterable listDetailsOnNodesMatching(Predicate filter); diff --git a/compute/src/main/java/org/jclouds/compute/strategy/RebootNodeStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/RebootNodeStrategy.java index fe37f82f4f..8e0032673a 100644 --- a/compute/src/main/java/org/jclouds/compute/strategy/RebootNodeStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/RebootNodeStrategy.java @@ -28,6 +28,6 @@ import org.jclouds.compute.domain.NodeMetadata; */ public interface RebootNodeStrategy { - NodeMetadata execute(String id); + NodeMetadata rebootNode(String id); } \ 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 new file mode 100644 index 0000000000..006bb771c0 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/strategy/impl/AdaptingComputeServiceStrategies.java @@ -0,0 +1,136 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.compute.strategy.impl; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +import java.util.Map; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.ComputeServiceAdapter; +import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.NodeMetadata; +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.DestroyNodeStrategy; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.ListNodesStrategy; +import org.jclouds.compute.strategy.RebootNodeStrategy; +import org.jclouds.domain.Credentials; +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + +/** + * @author Adrian Cole + * + */ +@Singleton +public class AdaptingComputeServiceStrategies implements AddNodeWithTagStrategy, DestroyNodeStrategy, + GetNodeMetadataStrategy, ListNodesStrategy, RebootNodeStrategy { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + private final Map credentialStore; + private final ComputeServiceAdapter client; + private final Function nodeMetadataAdapter; + + @Inject + public AdaptingComputeServiceStrategies(Map credentialStore, + ComputeServiceAdapter client, Function nodeMetadataAdapter) { + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.client = checkNotNull(client, "client"); + this.nodeMetadataAdapter = checkNotNull(nodeMetadataAdapter, "nodeMetadataAdapter"); + } + + @Override + public Iterable listNodes() { + return listDetailsOnNodesMatching(NodePredicates.all()); + } + + @Override + public Iterable listDetailsOnNodesMatching(Predicate filter) { + return Iterables.filter(Iterables.transform(client.listNodes(), nodeMetadataAdapter), filter); + } + + @Override + public NodeMetadata getNode(String id) { + N node = client.getNode(id); + return node == null ? null : nodeMetadataAdapter.apply(node); + } + + @Override + public NodeMetadata rebootNode(String id) { + + NodeMetadata node = getNode(id); + if (node == null || node.getState() == NodeState.TERMINATED) + return node; + + logger.debug(">> rebooting node(%s)", id); + client.rebootNode(id); + logger.debug("<< rebooted node(%s)", id); + + return node; + } + + @Override + public NodeMetadata destroyNode(String id) { + + NodeMetadata node = getNode(id); + if (node == null) + return node; + + logger.debug(">> destroying node(%s)", id); + client.destroyNode(id); + logger.debug("<< destroyed node(%s)", id); + + return node; + } + + /** + * {@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); + + logger.debug(">> instantiating node location(%s) name(%s) image(%s) hardware(%s)", + template.getLocation().getId(), name, template.getImage().getProviderId(), template.getHardware() + .getProviderId()); + + N from = client.createNodeAndStoreCredentials(tag, name, template, credentialStore); + NodeMetadata node = nodeMetadataAdapter.apply(from); + logger.debug("<< instantiated node(%s)", node.getId()); + return node; + } + +} \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/strategy/impl/EncodeTagIntoNameRunNodesAndAddToSetStrategy.java b/compute/src/main/java/org/jclouds/compute/strategy/impl/EncodeTagIntoNameRunNodesAndAddToSetStrategy.java index 121840d880..f0aacc8068 100755 --- a/compute/src/main/java/org/jclouds/compute/strategy/impl/EncodeTagIntoNameRunNodesAndAddToSetStrategy.java +++ b/compute/src/main/java/org/jclouds/compute/strategy/impl/EncodeTagIntoNameRunNodesAndAddToSetStrategy.java @@ -88,7 +88,7 @@ public class EncodeTagIntoNameRunNodesAndAddToSetStrategy implements RunNodesAnd public Void call() throws Exception { NodeMetadata node = null; logger.debug(">> starting node(%s) tag(%s)", name, tag); - node = addNodeWithTagStrategy.execute(tag, name, template); + node = addNodeWithTagStrategy.addNodeWithTag(tag, name, template); logger.debug("<< %s node(%s)", node.getState(), node.getId()); utils.runOptionsOnNodeAndAddToGoodSetOrPutExceptionIntoBadMap(node, badNodes, nodes, template.getOptions()).call(); @@ -111,7 +111,7 @@ public class EncodeTagIntoNameRunNodesAndAddToSetStrategy implements RunNodesAnd */ protected Set getNextNames(final String tag, final Template template, int count) { Set names = Sets.newHashSet(); - Iterable currentNodes = listNodesStrategy.list(); + Iterable currentNodes = listNodesStrategy.listNodes(); int maxTries = 100; int currentTries = 0; while (names.size() < count && currentTries++ < maxTries) { 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 new file mode 100644 index 0000000000..6e119fd6f1 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceAdapter.java @@ -0,0 +1,192 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.compute.stub.config; + +import java.util.Map; +import java.util.concurrent.ConcurrentMap; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; + +import org.jclouds.compute.ComputeServiceAdapter; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.domain.OperatingSystem; +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.rest.ResourceNotFoundException; + +import com.google.common.base.Supplier; +import com.google.common.base.Throwables; +import com.google.common.collect.ImmutableSet; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class StubComputeServiceAdapter implements ComputeServiceAdapter { + private final Supplier location; + private final ConcurrentMap nodes; + private final Provider idProvider; + private final String publicIpPrefix; + private final String privateIpPrefix; + private final String passwordPrefix; + private final String providerName; + + @Inject + public StubComputeServiceAdapter(ConcurrentMap nodes, Supplier location, + @Named("NODE_ID") Provider idProvider, @Named("PUBLIC_IP_PREFIX") String publicIpPrefix, + @Named("PRIVATE_IP_PREFIX") String privateIpPrefix, @Named("PASSWORD_PREFIX") String passwordPrefix, + @org.jclouds.rest.annotations.Provider String providerName) { + this.nodes = nodes; + this.location = location; + this.idProvider = idProvider; + this.publicIpPrefix = publicIpPrefix; + this.privateIpPrefix = privateIpPrefix; + this.passwordPrefix = passwordPrefix; + this.providerName = providerName; + } + + @Override + public NodeMetadata createNodeAndStoreCredentials(String tag, String name, Template template, + Map credentialStore) { + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + String id = idProvider.get() + ""; + builder.ids(id); + builder.name(name); + builder.tag(tag); + builder.location(location.get()); + builder.imageId(template.getImage().getId()); + builder.operatingSystem(template.getImage().getOperatingSystem()); + builder.state(NodeState.PENDING); + builder.publicAddresses(ImmutableSet. of(publicIpPrefix + id)); + builder.privateAddresses(ImmutableSet. of(privateIpPrefix + id)); + builder.credentials(new Credentials("root", passwordPrefix + id)); + NodeMetadata node = builder.build(); + nodes.put(node.getId(), node); + credentialStore.put(node.getId(), node.getCredentials()); + StubComputeServiceDependenciesModule.setState(node, NodeState.RUNNING, 100); + return node; + } + + @Override + public Iterable listHardware() { + return ImmutableSet. of(StubComputeServiceDependenciesModule.stub("small", 1, 1740, 160), + 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); + return ImmutableSet + . of( + new ImageBuilder() + .providerId("1") + .name(OsFamily.UBUNTU.name()) + .id(parentId + "/1") + .location(zone) + .operatingSystem( + new OperatingSystem(OsFamily.UBUNTU, "ubuntu 32", null, "X86_32", "ubuntu 32", false)) + .description("stub ubuntu 32").defaultCredentials(defaultCredentials).build(), // + new ImageBuilder() + .providerId("2") + .name(OsFamily.UBUNTU.name()) + .id(parentId + "/2") + .location(zone) + .operatingSystem( + new OperatingSystem(OsFamily.UBUNTU, "ubuntu 64", null, "X86_64", "ubuntu 64", true)) + .description("stub ubuntu 64").defaultCredentials(defaultCredentials).build(), // + new ImageBuilder() + .providerId("3") + .name(OsFamily.CENTOS.name()) + .id(parentId + "/3") + .location(zone) + .operatingSystem( + new OperatingSystem(OsFamily.CENTOS, "centos 64", null, "X86_64", "centos 64", true)) + .description("stub centos 64").defaultCredentials(defaultCredentials).build() // + + ); + } + + @Override + public Iterable listNodes() { + return nodes.values(); + } + + @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)); + } + + @Override + public NodeMetadata getNode(String id) { + return nodes.get(id); + } + + @Override + public void destroyNode(final String id) { + NodeMetadata node = nodes.get(id); + if (node == null) + return; + StubComputeServiceDependenciesModule.setState(node, NodeState.PENDING, 0); + StubComputeServiceDependenciesModule.setState(node, NodeState.TERMINATED, 50); + StubComputeServiceDependenciesModule.service.execute(new Runnable() { + + @Override + public void run() { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + Throwables.propagate(e); + } finally { + nodes.remove(id); + } + } + + }); + } + + @Override + public void rebootNode(String id) { + NodeMetadata node = nodes.get(id); + if (node == null) + throw new ResourceNotFoundException("node not found: " + id); + StubComputeServiceDependenciesModule.setState(node, NodeState.PENDING, 0); + StubComputeServiceDependenciesModule.setState(node, NodeState.RUNNING, 50); + } +} \ No newline at end of file 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 c8192f5dc9..d6ef62cdd8 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 @@ -19,72 +19,32 @@ package org.jclouds.compute.stub.config; -import java.util.Set; - -import org.jclouds.compute.config.StandaloneComputeServiceContextModule; +import org.jclouds.compute.ComputeServiceAdapter; +import org.jclouds.compute.config.JCloudsNativeStandaloneComputeServiceContextModule; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -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.stub.config.StubComputeServiceDependenciesModule.StubAddNodeWithTagStrategy; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubDestroyNodeStrategy; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubGetNodeMetadataStrategy; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubHardwareSupplier; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubImageSupplier; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubListNodesStrategy; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubRebootNodeStrategy; +import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.concurrent.SingleThreaded; +import org.jclouds.domain.Location; -import com.google.common.base.Supplier; +import com.google.inject.TypeLiteral; /** * * @author Adrian Cole */ @SingleThreaded -public class StubComputeServiceContextModule extends StandaloneComputeServiceContextModule { +public class StubComputeServiceContextModule extends JCloudsNativeStandaloneComputeServiceContextModule { + + public StubComputeServiceContextModule() { + super(StubComputeServiceAdapter.class); + } + @Override protected void configure() { install(new StubComputeServiceDependenciesModule()); + bind(new TypeLiteral>() { + }).to(StubComputeServiceAdapter.class); super.configure(); } - - @Override - protected Class defineAddNodeWithTagStrategy() { - return StubAddNodeWithTagStrategy.class; - } - - @Override - protected Class defineDestroyNodeStrategy() { - return StubDestroyNodeStrategy.class; - } - - @Override - protected Class defineGetNodeMetadataStrategy() { - return StubGetNodeMetadataStrategy.class; - } - - @Override - protected Class defineListNodesStrategy() { - return StubListNodesStrategy.class; - } - - @Override - protected Class defineRebootNodeStrategy() { - return StubRebootNodeStrategy.class; - } - - @Override - protected Class>> defineHardwareSupplier() { - return StubHardwareSupplier.class; - } - - @Override - protected Class>> defineImageSupplier() { - return StubImageSupplier.class; - } - } diff --git a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java index 3b87d025da..476c66a640 100644 --- a/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java +++ b/compute/src/main/java/org/jclouds/compute/stub/config/StubComputeServiceDependenciesModule.java @@ -19,10 +19,6 @@ package org.jclouds.compute.stub.config; -import static com.google.common.base.Preconditions.checkArgument; - -import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; @@ -31,43 +27,20 @@ import java.util.concurrent.atomic.AtomicInteger; import javax.inject.Inject; import javax.inject.Named; -import javax.inject.Provider; import javax.inject.Singleton; -import org.jclouds.Constants; -import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.ImageBuilder; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.Volume; import org.jclouds.compute.domain.internal.VolumeImpl; -import org.jclouds.compute.predicates.NodePredicates; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -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.domain.Credentials; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; import org.jclouds.net.IPSocket; import org.jclouds.predicates.SocketOpen; -import org.jclouds.rest.ResourceNotFoundException; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; import com.google.inject.AbstractModule; import com.google.inject.Provides; @@ -93,7 +66,7 @@ public class StubComputeServiceDependenciesModule extends AbstractModule { // STUB STUFF STATIC SO MULTIPLE CONTEXTS CAN SEE IT private static final AtomicInteger nodeIds = new AtomicInteger(0); - private static final ExecutorService service = Executors.newCachedThreadPool(); + static final ExecutorService service = Executors.newCachedThreadPool(); @Provides @Named("NODE_ID") @@ -150,53 +123,6 @@ public class StubComputeServiceDependenciesModule extends AbstractModule { } - @Singleton - public static class StubAddNodeWithTagStrategy implements AddNodeWithTagStrategy { - private final Supplier location; - private final ConcurrentMap nodes; - private final Provider idProvider; - private final String publicIpPrefix; - private final String privateIpPrefix; - private final String passwordPrefix; - private final Map credentialStore; - - @Inject - public StubAddNodeWithTagStrategy(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, - Map credentialStore) { - this.nodes = nodes; - this.location = location; - this.idProvider = idProvider; - this.publicIpPrefix = publicIpPrefix; - this.privateIpPrefix = privateIpPrefix; - this.passwordPrefix = passwordPrefix; - this.credentialStore = credentialStore; - } - - @Override - public NodeMetadata execute(String tag, String name, Template template) { - checkArgument(location.get().equals(template.getLocation()), "invalid location: " + template.getLocation()); - NodeMetadataBuilder builder = new NodeMetadataBuilder(); - String id = idProvider.get() + ""; - builder.ids(id); - builder.name(name); - builder.tag(tag); - builder.location(location.get()); - builder.imageId(template.getImage().getId()); - builder.operatingSystem(template.getImage().getOperatingSystem()); - builder.state(NodeState.PENDING); - builder.publicAddresses(ImmutableSet. of(publicIpPrefix + id)); - builder.privateAddresses(ImmutableSet. of(privateIpPrefix + id)); - builder.credentials(new Credentials("root", passwordPrefix + id)); - NodeMetadata node = builder.build(); - nodes.put(node.getId(), node); - credentialStore.put(node.getId(), node.getCredentials()); - setState(node, NodeState.RUNNING, 100); - return node; - } - } - protected static void nodeWithState(NodeMetadata node, NodeState state) { backing.put(node.getId(), NodeMetadataBuilder.fromNodeMetadata(node).state(state).build()); } @@ -220,158 +146,10 @@ public class StubComputeServiceDependenciesModule extends AbstractModule { }); } - @Singleton - public static class StubGetNodeMetadataStrategy implements GetNodeMetadataStrategy { - private final ConcurrentMap nodes; - - @Inject - protected StubGetNodeMetadataStrategy(ConcurrentMap nodes) { - this.nodes = nodes; - } - - @Override - public NodeMetadata execute(String id) { - return nodes.get(id); - } - } - - @Singleton - public static class StubListNodesStrategy implements ListNodesStrategy { - private final ConcurrentMap nodes; - - @Inject - protected StubListNodesStrategy(ConcurrentMap nodes) { - this.nodes = nodes; - } - - @Override - public Iterable list() { - return listDetailsOnNodesMatching(NodePredicates.all()); - } - - @Override - public Iterable listDetailsOnNodesMatching(Predicate filter) { - return Iterables.filter(nodes.values(), filter); - } - } - - @Singleton - public static class StubRebootNodeStrategy implements RebootNodeStrategy { - private final ConcurrentMap nodes; - - @Inject - protected StubRebootNodeStrategy(ConcurrentMap nodes) { - this.nodes = nodes; - } - - @Override - public NodeMetadata execute(String id) { - NodeMetadata node = nodes.get(id); - if (node == null) - throw new ResourceNotFoundException("node not found: " + id); - setState(node, NodeState.PENDING, 0); - setState(node, NodeState.RUNNING, 50); - return node; - } - } - - @Singleton - public static class StubDestroyNodeStrategy implements DestroyNodeStrategy { - private final ConcurrentMap nodes; - private final ExecutorService service; - - @Inject - protected StubDestroyNodeStrategy(ConcurrentMap nodes, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService service) { - this.nodes = nodes; - this.service = service; - } - - @Override - public NodeMetadata execute(final String id) { - NodeMetadata node = nodes.get(id); - if (node == null) - return node; - setState(node, NodeState.PENDING, 0); - setState(node, NodeState.TERMINATED, 50); - service.execute(new Runnable() { - - @Override - public void run() { - try { - Thread.sleep(200); - } catch (InterruptedException e) { - Throwables.propagate(e); - } finally { - nodes.remove(id); - } - } - - }); - return node; - } - } - - @Singleton - public static class StubImageSupplier implements Supplier> { - private final Supplier defaultLocation; - - @Inject - StubImageSupplier(Supplier defaultLocation) { - this.defaultLocation = defaultLocation; - } - - @Override - public Set get() { - Location zone = defaultLocation.get().getParent(); - String parentId = zone.getId(); - Credentials defaultCredentials = new Credentials("root", null); - return ImmutableSet - . of(new ImageBuilder().providerId("1").name(OsFamily.UBUNTU.name()).id(parentId + "/1") - .location(zone).operatingSystem( - new OperatingSystem(OsFamily.UBUNTU, "ubuntu 32", null, "X86_32", "ubuntu 32", - false)).description("stub ubuntu 32").defaultCredentials( - defaultCredentials).build(), // - new ImageBuilder().providerId("2").name(OsFamily.UBUNTU.name()).id(parentId + "/2") - .location(zone).operatingSystem( - new OperatingSystem(OsFamily.UBUNTU, "ubuntu 64", null, "X86_64", - "ubuntu 64", true)).description("stub ubuntu 64") - .defaultCredentials(defaultCredentials).build(), // - new ImageBuilder().providerId("3").name(OsFamily.CENTOS.name()).id(parentId + "/3") - .location(zone).operatingSystem( - new OperatingSystem(OsFamily.CENTOS, "centos 64", null, "X86_64", - "centos 64", true)).description("stub centos 64") - .defaultCredentials(defaultCredentials).build() // - - ); - } - - } - - @Provides - @Singleton - protected Set provideLocations(@org.jclouds.rest.annotations.Provider String providerName) { - 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)); - } - - @Singleton - public static class StubHardwareSupplier implements Supplier> { - - static Hardware stub(String type, int cores, int ram, float disk) { - return new org.jclouds.compute.domain.HardwareBuilder().ids(type).name(type).processors( - ImmutableList.of(new Processor(cores, 1.0))).ram(ram).volumes( - ImmutableList. of(new VolumeImpl(disk, true, false))).build(); - } - - @Override - public Set get() { - return ImmutableSet. of(stub("small", 1, 1740, 160), stub("medium", 4, 7680, 850), stub("large", 8, - 15360, 1690)); - } + static Hardware stub(String type, int cores, int ram, float disk) { + return new org.jclouds.compute.domain.HardwareBuilder().ids(type).name(type) + .processors(ImmutableList.of(new Processor(cores, 1.0))).ram(ram) + .volumes(ImmutableList. of(new VolumeImpl(disk, true, false))).build(); } } diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerHardwareSupplier.java b/compute/src/main/java/org/jclouds/compute/suppliers/DefaultLocationSupplier.java similarity index 52% rename from skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerHardwareSupplier.java rename to compute/src/main/java/org/jclouds/compute/suppliers/DefaultLocationSupplier.java index 1039c398ac..50d42c0847 100644 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerHardwareSupplier.java +++ b/compute/src/main/java/org/jclouds/compute/suppliers/DefaultLocationSupplier.java @@ -17,33 +17,45 @@ * ==================================================================== */ -package org.jclouds.servermanager.compute.suppliers; +package org.jclouds.compute.suppliers; + +import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; -import org.jclouds.collect.TransformingSetSupplier; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.servermanager.ServerManager; -import org.jclouds.servermanager.compute.functions.ServerManagerHardwareToHardware; +import org.jclouds.collect.Memoized; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; + +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; /** * * @author Adrian Cole + * */ @Singleton -public class ServerManagerHardwareSupplier extends - TransformingSetSupplier { - private final ServerManager client; +public class DefaultLocationSupplier implements Supplier { + private final Supplier> locations; @Inject - protected ServerManagerHardwareSupplier(ServerManager client, - ServerManagerHardwareToHardware serverManagerHardwareToHardware) { - super(serverManagerHardwareToHardware); - this.client = client; + DefaultLocationSupplier(@Memoized Supplier> locations) { + this.locations = locations; } - public Iterable supplyFrom() { - return client.listHardware(); + @Override + public Location get() { + return Iterables.find(locations.get(), new Predicate() { + + @Override + public boolean apply(Location input) { + return input.getScope() == LocationScope.ZONE; + } + + }); } -} + +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerLocationSupplier.java b/compute/src/main/java/org/jclouds/compute/suppliers/LocationSupplier.java similarity index 61% rename from skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerLocationSupplier.java rename to compute/src/main/java/org/jclouds/compute/suppliers/LocationSupplier.java index e40109c04a..8336082741 100644 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerLocationSupplier.java +++ b/compute/src/main/java/org/jclouds/compute/suppliers/LocationSupplier.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.servermanager.compute.suppliers; +package org.jclouds.compute.suppliers; import java.util.Set; @@ -25,30 +25,27 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.rest.annotations.Provider; import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableSet; /** * * @author Adrian Cole + * + * By default allows you to use a static set of locations bound to Set */ @Singleton -public class ServerManagerLocationSupplier implements Supplier> { - - private final String providerName; +public class LocationSupplier implements Supplier> { + private final Set locations; @Inject - ServerManagerLocationSupplier(@Provider String providerName) { - this.providerName = providerName; + LocationSupplier(Set locations) { + this.locations = locations; } @Override public Set get() { - Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); - return ImmutableSet.of(new LocationImpl(LocationScope.ZONE, "1", "SFO", provider)); + return locations; } + } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/util/ComputeUtils.java b/compute/src/main/java/org/jclouds/compute/util/ComputeUtils.java index 52d947d512..5ea1889a77 100644 --- a/compute/src/main/java/org/jclouds/compute/util/ComputeUtils.java +++ b/compute/src/main/java/org/jclouds/compute/util/ComputeUtils.java @@ -133,7 +133,7 @@ public class ComputeUtils { return node; if (nodeRunning.apply(node)) - node = NodeMetadataBuilder.fromNodeMetadata(getNode.execute(node.getId())) + node = NodeMetadataBuilder.fromNodeMetadata(getNode.getNode(node.getId())) .credentials(node.getCredentials()).build(); else throw new IllegalStateException(String.format( diff --git a/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java index d0338cab29..ece9c9916a 100644 --- a/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java +++ b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java @@ -19,16 +19,7 @@ package org.jclouds.compute; -import org.jclouds.compute.config.StandaloneComputeServiceContextModule; import org.jclouds.compute.stub.config.StubComputeServiceContextModule; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubAddNodeWithTagStrategy; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubDestroyNodeStrategy; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubGetNodeMetadataStrategy; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubHardwareSupplier; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubImageSupplier; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubListNodesStrategy; -import org.jclouds.compute.stub.config.StubComputeServiceDependenciesModule.StubRebootNodeStrategy; import org.testng.annotations.Test; /** @@ -42,20 +33,8 @@ public class ComputeServiceContextFactoryTest { @Test public void testStandalone() { ComputeServiceContext context = ComputeServiceContextFactory - .createStandaloneContext(new StubComputeServiceContextModule()); + .createStandaloneContext(new StubComputeServiceContextModule()); context.getComputeService().listNodes(); } - @Test - public void testStandaloneWithBuilder() { - ComputeServiceContext context = ComputeServiceContextFactory - .createStandaloneContext(StandaloneComputeServiceContextModule.builder().install( - new StubComputeServiceDependenciesModule()).defineAddNodeWithTagStrategy( - StubAddNodeWithTagStrategy.class).defineDestroyNodeStrategy(StubDestroyNodeStrategy.class) - .defineGetNodeMetadataStrategy(StubGetNodeMetadataStrategy.class).defineListNodesStrategy( - StubListNodesStrategy.class).defineRebootNodeStrategy(StubRebootNodeStrategy.class) - .defineHardwareSupplier(StubHardwareSupplier.class) - .defineImageSupplier(StubImageSupplier.class).build()); - context.getComputeService().listNodes(); - } } diff --git a/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java b/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java index e02c6c3a0c..f7fc29acb0 100644 --- a/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java +++ b/core/src/main/java/org/jclouds/collect/TransformingSetSupplier.java @@ -19,6 +19,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; @@ -31,18 +32,18 @@ import com.google.common.base.Supplier; * * @author Adrian Cole */ - -public abstract class TransformingSetSupplier implements Supplier> { +public class TransformingSetSupplier implements Supplier> { + private final Supplier> backingSupplier; private final Function converter; - public TransformingSetSupplier(Function converter) { - this.converter = converter; + public TransformingSetSupplier(Supplier> backingSupplier, Function converter) { + this.backingSupplier = checkNotNull(backingSupplier, "backingSupplier"); + this.converter = checkNotNull(converter, "converter"); } @Override public Set get() { - return newHashSet(transform(supplyFrom(), converter)); + return newHashSet(transform(backingSupplier.get(), converter)); } - public abstract Iterable supplyFrom(); } diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridBindComputeStrategiesByClass.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridBindComputeStrategiesByClass.java new file mode 100644 index 0000000000..e403aba469 --- /dev/null +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridBindComputeStrategiesByClass.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.gogrid.compute.config; + +import org.jclouds.compute.config.BindComputeStrategiesByClass; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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.gogrid.compute.strategy.GoGridAddNodeWithTagStrategy; +import org.jclouds.gogrid.compute.strategy.GoGridDestroyNodeStrategy; +import org.jclouds.gogrid.compute.strategy.GoGridGetNodeMetadataStrategy; +import org.jclouds.gogrid.compute.strategy.GoGridListNodesStrategy; +import org.jclouds.gogrid.compute.strategy.GoGridRebootNodeStrategy; + +/** + * + * @author Adrian Cole + * + */ +public class GoGridBindComputeStrategiesByClass extends BindComputeStrategiesByClass { + @Override + protected Class defineAddNodeWithTagStrategy() { + return GoGridAddNodeWithTagStrategy.class; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return GoGridDestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return GoGridGetNodeMetadataStrategy.class; + } + + @Override + protected Class defineListNodesStrategy() { + return GoGridListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return GoGridRebootNodeStrategy.class; + } +} \ No newline at end of file diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridBindComputeSuppliersByClass.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridBindComputeSuppliersByClass.java new file mode 100644 index 0000000000..ff203a648c --- /dev/null +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridBindComputeSuppliersByClass.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.gogrid.compute.config; + +import java.util.Set; + +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.gogrid.compute.suppliers.GoGridDefaultLocationSupplier; +import org.jclouds.gogrid.compute.suppliers.GoGridHardwareSupplier; +import org.jclouds.gogrid.compute.suppliers.GoGridImageSupplier; +import org.jclouds.gogrid.compute.suppliers.GoGridLocationSupplier; + +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + * + */ +public class GoGridBindComputeSuppliersByClass extends BindComputeSuppliersByClass { + @Override + protected Class>> defineHardwareSupplier() { + return GoGridHardwareSupplier.class; + } + + @Override + protected Class>> defineImageSupplier() { + return GoGridImageSupplier.class; + } + + @Override + protected Class> defineDefaultLocationSupplier() { + return GoGridDefaultLocationSupplier.class; + } + + @Override + protected Class>> defineLocationSupplier() { + return GoGridLocationSupplier.class; + } +} \ No newline at end of file diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModule.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModule.java index c1ddef2233..99f19cf8c6 100755 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModule.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/config/GoGridComputeServiceContextModule.java @@ -21,30 +21,10 @@ package org.jclouds.gogrid.compute.config; import static org.jclouds.compute.domain.OsFamily.CENTOS; -import java.util.Set; - import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -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.domain.Location; -import org.jclouds.gogrid.compute.strategy.GoGridAddNodeWithTagStrategy; -import org.jclouds.gogrid.compute.strategy.GoGridDestroyNodeStrategy; -import org.jclouds.gogrid.compute.strategy.GoGridGetNodeMetadataStrategy; -import org.jclouds.gogrid.compute.strategy.GoGridListNodesStrategy; -import org.jclouds.gogrid.compute.strategy.GoGridRebootNodeStrategy; -import org.jclouds.gogrid.compute.suppliers.GoGridDefaultLocationSupplier; -import org.jclouds.gogrid.compute.suppliers.GoGridHardwareSupplier; -import org.jclouds.gogrid.compute.suppliers.GoGridImageSupplier; -import org.jclouds.gogrid.compute.suppliers.GoGridLocationSupplier; -import com.google.common.base.Supplier; import com.google.inject.Injector; /** @@ -56,6 +36,8 @@ public class GoGridComputeServiceContextModule extends BaseComputeServiceContext @Override protected void configure() { install(new GoGridComputeServiceDependenciesModule()); + install(new GoGridBindComputeStrategiesByClass()); + install(new GoGridBindComputeSuppliersByClass()); super.configure(); } @@ -63,49 +45,4 @@ public class GoGridComputeServiceContextModule extends BaseComputeServiceContext protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { return template.osFamily(CENTOS).imageNameMatches(".*w/ None.*"); } - - @Override - protected Class defineAddNodeWithTagStrategy() { - return GoGridAddNodeWithTagStrategy.class; - } - - @Override - protected Class defineDestroyNodeStrategy() { - return GoGridDestroyNodeStrategy.class; - } - - @Override - protected Class defineGetNodeMetadataStrategy() { - return GoGridGetNodeMetadataStrategy.class; - } - - @Override - protected Class>> defineHardwareSupplier() { - return GoGridHardwareSupplier.class; - } - - @Override - protected Class>> defineImageSupplier() { - return GoGridImageSupplier.class; - } - - @Override - protected Class defineListNodesStrategy() { - return GoGridListNodesStrategy.class; - } - - @Override - protected Class defineRebootNodeStrategy() { - return GoGridRebootNodeStrategy.class; - } - - @Override - protected Class> defineDefaultLocationSupplier() { - return GoGridDefaultLocationSupplier.class; - } - - @Override - protected Class>> defineLocationSupplier() { - return GoGridLocationSupplier.class; - } } diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridAddNodeWithTagStrategy.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridAddNodeWithTagStrategy.java index 8a9e6e6525..221791acdd 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridAddNodeWithTagStrategy.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridAddNodeWithTagStrategy.java @@ -71,7 +71,7 @@ public class GoGridAddNodeWithTagStrategy implements AddNodeWithTagStrategy { } @Override - public NodeMetadata execute(String tag, String name, Template template) { + public NodeMetadata addNodeWithTag(String tag, String name, Template template) { Server addedServer = null; boolean notStarted = true; int numOfRetries = 20; diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridDestroyNodeStrategy.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridDestroyNodeStrategy.java index 7ca33398e7..439b34a3fe 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridDestroyNodeStrategy.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridDestroyNodeStrategy.java @@ -43,9 +43,9 @@ public class GoGridDestroyNodeStrategy implements DestroyNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata destroyNode(String id) { client.getServerServices().deleteById(new Long(id)); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridGetNodeMetadataStrategy.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridGetNodeMetadataStrategy.java index 992464f25b..aa1f8fa57c 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridGetNodeMetadataStrategy.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridGetNodeMetadataStrategy.java @@ -50,7 +50,7 @@ public class GoGridGetNodeMetadataStrategy implements GetNodeMetadataStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata getNode(String id) { try { Server server = Iterables.getOnlyElement(client.getServerServices().getServersById( new Long(checkNotNull(id, "id")))); diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridListNodesStrategy.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridListNodesStrategy.java index 58f81daeab..4e718b23db 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridListNodesStrategy.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridListNodesStrategy.java @@ -49,7 +49,7 @@ public class GoGridListNodesStrategy implements ListNodesStrategy { } @Override - public Iterable list() { + public Iterable listNodes() { return listDetailsOnNodesMatching(NodePredicates.all()); } diff --git a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridRebootNodeStrategy.java b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridRebootNodeStrategy.java index df365a3d4e..024c8af271 100644 --- a/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridRebootNodeStrategy.java +++ b/gogrid/src/main/java/org/jclouds/gogrid/compute/strategy/GoGridRebootNodeStrategy.java @@ -56,12 +56,12 @@ public class GoGridRebootNodeStrategy implements RebootNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata rebootNode(String id) { Server server = Iterables.getOnlyElement(client.getServerServices().getServersById(new Long(id))); client.getServerServices().power(server.getName(), PowerCommand.RESTART); serverLatestJobCompleted.apply(server); client.getServerServices().power(server.getName(), PowerCommand.START); serverLatestJobCompletedShort.apply(server); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersBindComputeStrategiesByClass.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersBindComputeStrategiesByClass.java new file mode 100644 index 0000000000..961129181c --- /dev/null +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersBindComputeStrategiesByClass.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.rackspace.cloudservers.compute.config; + +import org.jclouds.compute.config.BindComputeStrategiesByClass; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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.rackspace.cloudservers.compute.strategy.CloudServersAddNodeWithTagStrategy; +import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersDestroyNodeStrategy; +import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersGetNodeMetadataStrategy; +import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersListNodesStrategy; +import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersRebootNodeStrategy; + +/** + * + * @author Adrian Cole + * + */ +public class CloudServersBindComputeStrategiesByClass extends BindComputeStrategiesByClass { + + @Override + protected Class defineAddNodeWithTagStrategy() { + return CloudServersAddNodeWithTagStrategy.class; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return CloudServersDestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return CloudServersGetNodeMetadataStrategy.class; + } + + @Override + protected Class defineListNodesStrategy() { + return CloudServersListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return CloudServersRebootNodeStrategy.class; + } +} \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersBindComputeSuppliersByClass.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersBindComputeSuppliersByClass.java new file mode 100644 index 0000000000..be44ec71fd --- /dev/null +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersBindComputeSuppliersByClass.java @@ -0,0 +1,54 @@ +/** + * + * 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.rackspace.cloudservers.compute.config; + +import java.util.Set; + +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.rackspace.cloudservers.compute.suppliers.CloudServersHardwareSupplier; +import org.jclouds.rackspace.cloudservers.compute.suppliers.CloudServersImageSupplier; +import org.jclouds.rackspace.config.RackspaceLocationsSupplier; + +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + * + */ +public class CloudServersBindComputeSuppliersByClass extends BindComputeSuppliersByClass { + @Override + protected Class>> defineHardwareSupplier() { + return CloudServersHardwareSupplier.class; + } + + @Override + protected Class>> defineImageSupplier() { + return CloudServersImageSupplier.class; + } + + @Override + protected Class>> defineLocationSupplier() { + return RackspaceLocationsSupplier.class; + } +} \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java index 8f54b6431c..96e02eb531 100755 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/config/CloudServersComputeServiceContextModule.java @@ -21,29 +21,10 @@ package org.jclouds.rackspace.cloudservers.compute.config; import static org.jclouds.compute.domain.OsFamily.UBUNTU; -import java.util.Set; - import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.compute.internal.BaseComputeService; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -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.domain.Location; -import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersAddNodeWithTagStrategy; -import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersDestroyNodeStrategy; -import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersGetNodeMetadataStrategy; -import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersListNodesStrategy; -import org.jclouds.rackspace.cloudservers.compute.strategy.CloudServersRebootNodeStrategy; -import org.jclouds.rackspace.cloudservers.compute.suppliers.CloudServersHardwareSupplier; -import org.jclouds.rackspace.cloudservers.compute.suppliers.CloudServersImageSupplier; -import org.jclouds.rackspace.config.RackspaceLocationsSupplier; -import com.google.common.base.Supplier; import com.google.inject.Injector; /** @@ -57,6 +38,8 @@ public class CloudServersComputeServiceContextModule extends BaseComputeServiceC @Override protected void configure() { install(new CloudServersComputeServiceDependenciesModule()); + install(new CloudServersBindComputeStrategiesByClass()); + install(new CloudServersBindComputeSuppliersByClass()); super.configure(); } @@ -64,44 +47,4 @@ public class CloudServersComputeServiceContextModule extends BaseComputeServiceC protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { return template.osFamily(UBUNTU).imageNameMatches(".*10\\.?04.*"); } - - @Override - protected Class defineAddNodeWithTagStrategy() { - return CloudServersAddNodeWithTagStrategy.class; - } - - @Override - protected Class defineDestroyNodeStrategy() { - return CloudServersDestroyNodeStrategy.class; - } - - @Override - protected Class defineGetNodeMetadataStrategy() { - return CloudServersGetNodeMetadataStrategy.class; - } - - @Override - protected Class>> defineHardwareSupplier() { - return CloudServersHardwareSupplier.class; - } - - @Override - protected Class>> defineImageSupplier() { - return CloudServersImageSupplier.class; - } - - @Override - protected Class defineListNodesStrategy() { - return CloudServersListNodesStrategy.class; - } - - @Override - protected Class defineRebootNodeStrategy() { - return CloudServersRebootNodeStrategy.class; - } - - @Override - protected Class>> defineLocationSupplier() { - return RackspaceLocationsSupplier.class; - } } diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersAddNodeWithTagStrategy.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersAddNodeWithTagStrategy.java index 2a645e163f..a22c5fa862 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersAddNodeWithTagStrategy.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersAddNodeWithTagStrategy.java @@ -53,7 +53,7 @@ public class CloudServersAddNodeWithTagStrategy implements AddNodeWithTagStrateg } @Override - public NodeMetadata execute(String tag, String name, Template template) { + public NodeMetadata addNodeWithTag(String tag, String name, Template template) { Server from = client.createServer(name, Integer.parseInt(template.getImage().getProviderId()), Integer.parseInt(template.getHardware().getProviderId())); credentialStore.put(from.getId() + "", new Credentials("root", from.getAdminPass())); diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersDestroyNodeStrategy.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersDestroyNodeStrategy.java index 76c507cc5c..3d32e5fbf2 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersDestroyNodeStrategy.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersDestroyNodeStrategy.java @@ -42,11 +42,11 @@ public class CloudServersDestroyNodeStrategy implements DestroyNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata destroyNode(String id) { int serverId = Integer.parseInt(id); // if false server wasn't around in the first place client.deleteServer(serverId); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersGetNodeMetadataStrategy.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersGetNodeMetadataStrategy.java index c452c150ab..7424db360b 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersGetNodeMetadataStrategy.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersGetNodeMetadataStrategy.java @@ -46,7 +46,7 @@ public class CloudServersGetNodeMetadataStrategy implements GetNodeMetadataStrat } @Override - public NodeMetadata execute(String id) { + public NodeMetadata getNode(String id) { int serverId = Integer.parseInt(id); Server server = client.getServer(serverId); return server == null ? null : serverToNodeMetadata.apply(server); diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersListNodesStrategy.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersListNodesStrategy.java index d4c6da98e0..1c41ea6834 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersListNodesStrategy.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersListNodesStrategy.java @@ -50,7 +50,7 @@ public class CloudServersListNodesStrategy implements ListNodesStrategy { } @Override - public Iterable list() { + public Iterable listNodes() { return listDetailsOnNodesMatching(NodePredicates.all()); } diff --git a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersRebootNodeStrategy.java b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersRebootNodeStrategy.java index 10e5530125..ef7287d206 100644 --- a/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersRebootNodeStrategy.java +++ b/rackspace/src/main/java/org/jclouds/rackspace/cloudservers/compute/strategy/CloudServersRebootNodeStrategy.java @@ -43,11 +43,11 @@ public class CloudServersRebootNodeStrategy implements RebootNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata rebootNode(String id) { int serverId = Integer.parseInt(id); // if false server wasn't around in the first place client.rebootServer(serverId, RebootType.HARD); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeStrategiesByClass.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeStrategiesByClass.java new file mode 100644 index 0000000000..f3fd9bd44a --- /dev/null +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeStrategiesByClass.java @@ -0,0 +1,40 @@ +package org.jclouds.rimuhosting.miro.compute.config; + +import org.jclouds.compute.config.BindComputeStrategiesByClass; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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.rimuhosting.miro.compute.strategy.RimuHostingAddNodeWithTagStrategy; +import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingDestroyNodeStrategy; +import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingGetNodeMetadataStrategy; +import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingListNodesStrategy; +import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingRebootNodeStrategy; + +public class RimuHostingBindComputeStrategiesByClass extends BindComputeStrategiesByClass { + @Override + protected Class defineAddNodeWithTagStrategy() { + return RimuHostingAddNodeWithTagStrategy.class; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return RimuHostingDestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return RimuHostingGetNodeMetadataStrategy.class; + } + + @Override + protected Class defineListNodesStrategy() { + return RimuHostingListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return RimuHostingRebootNodeStrategy.class; + } +} \ No newline at end of file diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeSuppliersByClass.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeSuppliersByClass.java new file mode 100644 index 0000000000..d05d2d23c2 --- /dev/null +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingBindComputeSuppliersByClass.java @@ -0,0 +1,37 @@ +package org.jclouds.rimuhosting.miro.compute.config; + +import java.util.Set; + +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.rimuhosting.miro.compute.suppliers.RimuHostingDefaultLocationSupplier; +import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingHardwareSupplier; +import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingImageSupplier; +import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingLocationSupplier; + +import com.google.common.base.Supplier; + +public class RimuHostingBindComputeSuppliersByClass extends BindComputeSuppliersByClass { + + @Override + protected Class>> defineHardwareSupplier() { + return RimuHostingHardwareSupplier.class; + } + + @Override + protected Class>> defineImageSupplier() { + return RimuHostingImageSupplier.class; + } + + @Override + protected Class>> defineLocationSupplier() { + return RimuHostingLocationSupplier.class; + } + + @Override + protected Class> defineDefaultLocationSupplier() { + return RimuHostingDefaultLocationSupplier.class; + } +} \ No newline at end of file diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceContextModule.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceContextModule.java index 9784d12970..7013050370 100755 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceContextModule.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/config/RimuHostingComputeServiceContextModule.java @@ -21,29 +21,10 @@ package org.jclouds.rimuhosting.miro.compute.config; import static org.jclouds.compute.domain.OsFamily.UBUNTU; -import java.util.Set; import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -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.domain.Location; -import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingAddNodeWithTagStrategy; -import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingDestroyNodeStrategy; -import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingGetNodeMetadataStrategy; -import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingListNodesStrategy; -import org.jclouds.rimuhosting.miro.compute.strategy.RimuHostingRebootNodeStrategy; -import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingDefaultLocationSupplier; -import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingHardwareSupplier; -import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingImageSupplier; -import org.jclouds.rimuhosting.miro.compute.suppliers.RimuHostingLocationSupplier; -import com.google.common.base.Supplier; import com.google.inject.Injector; /** @@ -57,6 +38,8 @@ public class RimuHostingComputeServiceContextModule extends BaseComputeServiceCo @Override protected void configure() { install(new RimuHostingComputeServiceDependenciesModule()); + install(new RimuHostingBindComputeStrategiesByClass()); + install(new RimuHostingBindComputeSuppliersByClass()); super.configure(); } @@ -65,49 +48,4 @@ public class RimuHostingComputeServiceContextModule extends BaseComputeServiceCo return template.hardwareId("MIRO1B").osFamily(UBUNTU).os64Bit(false).imageNameMatches(".*10\\.?04.*"); } - @Override - protected Class defineAddNodeWithTagStrategy() { - return RimuHostingAddNodeWithTagStrategy.class; - } - - @Override - protected Class defineDestroyNodeStrategy() { - return RimuHostingDestroyNodeStrategy.class; - } - - @Override - protected Class defineGetNodeMetadataStrategy() { - return RimuHostingGetNodeMetadataStrategy.class; - } - - @Override - protected Class>> defineHardwareSupplier() { - return RimuHostingHardwareSupplier.class; - } - - @Override - protected Class>> defineImageSupplier() { - return RimuHostingImageSupplier.class; - } - - @Override - protected Class defineListNodesStrategy() { - return RimuHostingListNodesStrategy.class; - } - - @Override - protected Class defineRebootNodeStrategy() { - return RimuHostingRebootNodeStrategy.class; - } - - @Override - protected Class>> defineLocationSupplier() { - return RimuHostingLocationSupplier.class; - } - - @Override - protected Class> defineDefaultLocationSupplier() { - return RimuHostingDefaultLocationSupplier.class; - } - } diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java index e3adecf336..0b2f39efca 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingAddNodeWithTagStrategy.java @@ -55,7 +55,7 @@ public class RimuHostingAddNodeWithTagStrategy implements AddNodeWithTagStrategy } @Override - public NodeMetadata execute(String tag, String name, Template template) { + public NodeMetadata addNodeWithTag(String tag, String name, Template template) { NewServerResponse serverResponse = client.createServer(name, checkNotNull(template.getImage().getProviderId(), "imageId"), checkNotNull(template.getHardware().getProviderId(), "hardwareId")); diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingDestroyNodeStrategy.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingDestroyNodeStrategy.java index f086d31292..d7a66898ff 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingDestroyNodeStrategy.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingDestroyNodeStrategy.java @@ -43,10 +43,10 @@ public class RimuHostingDestroyNodeStrategy implements DestroyNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata destroyNode(String id) { Long serverId = Long.parseLong(id); client.destroyServer(serverId); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingGetNodeMetadataStrategy.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingGetNodeMetadataStrategy.java index b0b5db8af4..f5bcdac3f1 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingGetNodeMetadataStrategy.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingGetNodeMetadataStrategy.java @@ -47,7 +47,7 @@ public class RimuHostingGetNodeMetadataStrategy implements GetNodeMetadataStrate } @Override - public NodeMetadata execute(String id) { + public NodeMetadata getNode(String id) { long serverId = Long.parseLong(id); Server server = client.getServer(serverId); return server == null ? null : serverToNodeMetadata.apply(server); diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingListNodesStrategy.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingListNodesStrategy.java index 2852674b6f..0d3a36eed4 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingListNodesStrategy.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingListNodesStrategy.java @@ -50,7 +50,7 @@ public class RimuHostingListNodesStrategy implements ListNodesStrategy { } @Override - public Iterable list() { + public Iterable listNodes() { return listDetailsOnNodesMatching(NodePredicates.all()); } diff --git a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingRebootNodeStrategy.java b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingRebootNodeStrategy.java index 1e689665d0..7be53cac56 100644 --- a/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingRebootNodeStrategy.java +++ b/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/strategy/RimuHostingRebootNodeStrategy.java @@ -43,11 +43,11 @@ public class RimuHostingRebootNodeStrategy implements RebootNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata rebootNode(String id) { Long serverId = Long.parseLong(id); // if false server wasn't around in the first place client.restartServer(serverId).getState(); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Datacenter.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Datacenter.java new file mode 100644 index 0000000000..101c913868 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/Datacenter.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.servermanager; + +import com.google.common.base.Objects; + +/** + * This would be replaced with the real java object related to the underlying data center + * + * @author Adrian Cole + */ +public class Datacenter { + + public int id; + public String name; + + public Datacenter(int id, String name) { + this.id = id; + this.name = name; + } + + @Override + public int hashCode() { + return Objects.hashCode(id, name); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + return Objects.equal(this.toString(), that.toString()); + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("id", id).add("name", name).toString(); + } + +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilder.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilder.java index 36a1040ff2..e03059a9dd 100644 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilder.java +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilder.java @@ -22,17 +22,26 @@ package org.jclouds.servermanager.compute; import java.util.List; import java.util.Properties; +import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.StandaloneComputeServiceContextBuilder; import org.jclouds.compute.config.StandaloneComputeServiceContextModule; -import org.jclouds.servermanager.compute.strategy.ServerManagerAddNodeWithTagStrategy; -import org.jclouds.servermanager.compute.strategy.ServerManagerDestroyNodeStrategy; -import org.jclouds.servermanager.compute.strategy.ServerManagerGetAndListNodesStrategy; -import org.jclouds.servermanager.compute.strategy.ServerManagerRebootNodeStrategy; -import org.jclouds.servermanager.compute.suppliers.ServerManagerHardwareSupplier; -import org.jclouds.servermanager.compute.suppliers.ServerManagerImageSupplier; -import org.jclouds.servermanager.compute.suppliers.ServerManagerLocationSupplier; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.suppliers.DefaultLocationSupplier; +import org.jclouds.domain.Location; +import org.jclouds.servermanager.Datacenter; +import org.jclouds.servermanager.Hardware; +import org.jclouds.servermanager.Image; +import org.jclouds.servermanager.Server; +import org.jclouds.servermanager.compute.functions.DatacenterToLocation; +import org.jclouds.servermanager.compute.functions.ServerManagerHardwareToHardware; +import org.jclouds.servermanager.compute.functions.ServerManagerImageToImage; +import org.jclouds.servermanager.compute.functions.ServerToNodeMetadata; +import org.jclouds.servermanager.compute.strategy.ServerManagerComputeServiceAdapter; +import com.google.common.base.Function; +import com.google.common.base.Supplier; import com.google.inject.Module; +import com.google.inject.TypeLiteral; /** * @@ -49,16 +58,27 @@ public class ServerManagerComputeServiceContextBuilder extends StandaloneCompute modules.add(createContextModule()); } - public static StandaloneComputeServiceContextModule createContextModule() { - return StandaloneComputeServiceContextModule.builder() - .defineAddNodeWithTagStrategy(ServerManagerAddNodeWithTagStrategy.class) - .defineDestroyNodeStrategy(ServerManagerDestroyNodeStrategy.class) - .defineGetNodeMetadataStrategy(ServerManagerGetAndListNodesStrategy.class) - .defineListNodesStrategy(ServerManagerGetAndListNodesStrategy.class) - .defineRebootNodeStrategy(ServerManagerRebootNodeStrategy.class) - .defineHardwareSupplier(ServerManagerHardwareSupplier.class) - .defineLocationSupplier(ServerManagerLocationSupplier.class) - .defineImageSupplier(ServerManagerImageSupplier.class).build(); + public static StandaloneComputeServiceContextModule createContextModule() { + return new StandaloneComputeServiceContextModule() { + + @Override + protected void configure() { + super.configure(); + bind(new TypeLiteral>() { + }).to(ServerManagerComputeServiceAdapter.class); + bind(new TypeLiteral>() { + }).to(DefaultLocationSupplier.class); + bind(new TypeLiteral>() { + }).to(ServerToNodeMetadata.class); + bind(new TypeLiteral>() { + }).to(ServerManagerImageToImage.class); + bind(new TypeLiteral>() { + }).to(ServerManagerHardwareToHardware.class); + bind(new TypeLiteral>() { + }).to(DatacenterToLocation.class); + } + + }; } } diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/DatacenterToLocation.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/DatacenterToLocation.java new file mode 100644 index 0000000000..fd623025f4 --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/functions/DatacenterToLocation.java @@ -0,0 +1,42 @@ +/** + * + * 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.servermanager.compute.functions; + +import javax.inject.Singleton; + +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; +import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.servermanager.Datacenter; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class DatacenterToLocation implements Function { + + @Override + public Location apply(Datacenter from) { + return new LocationImpl(LocationScope.ZONE, from.id + "", from.name, null); + } + +} diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerAddNodeWithTagStrategy.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerAddNodeWithTagStrategy.java deleted file mode 100644 index a934b9afd3..0000000000 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerAddNodeWithTagStrategy.java +++ /dev/null @@ -1,89 +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.servermanager.compute.strategy; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; - -import java.util.Map; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -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.domain.Credentials; -import org.jclouds.logging.Logger; -import org.jclouds.servermanager.Server; -import org.jclouds.servermanager.ServerManager; -import org.jclouds.servermanager.compute.functions.ServerToNodeMetadata; - -/** - * This creates a node in the backend client. You create it with the parameters of the - * {@link Template} object. Then, convert it to a {@link NodeMetadata} object. - * - * @author Adrian Cole - * - */ -@Singleton -public class ServerManagerAddNodeWithTagStrategy implements AddNodeWithTagStrategy { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - private final Map credentialStore; - private final ServerManager client; - private final ServerToNodeMetadata serverToNodeMetadata; - - @Inject - public ServerManagerAddNodeWithTagStrategy(Map credentialStore, ServerManager client, - ServerToNodeMetadata serverToNodeMetadata) { - this.credentialStore = checkNotNull(credentialStore, "credentialStore"); - this.client = checkNotNull(client, "client"); - this.serverToNodeMetadata = checkNotNull(serverToNodeMetadata, "serverToNodeMetadata"); - } - - /** - * {@inheritDoc} - */ - @Override - public NodeMetadata execute(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); - - logger.debug(">> instantiating new server dc(%s) name(%s) image(%s) hardware(%s)", - template.getLocation().getId(), name, template.getImage().getProviderId(), template.getHardware() - .getProviderId()); - - // create the backend object using parameters from the template. - Server from = client.createServerInDC(template.getLocation().getId(), name, - Integer.parseInt(template.getImage().getProviderId()), - Integer.parseInt(template.getHardware().getProviderId())); - // store the credentials so that later functions can use them - credentialStore.put(from.id + "", new Credentials(from.loginUser, from.password)); - logger.debug("<< instantiated server(%s)", from.id); - return serverToNodeMetadata.apply(from); - } - -} \ No newline at end of file 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 new file mode 100644 index 0000000000..319f48571c --- /dev/null +++ b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerComputeServiceAdapter.java @@ -0,0 +1,83 @@ +package org.jclouds.servermanager.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.ComputeServiceAdapter; +import org.jclouds.compute.domain.Template; +import org.jclouds.domain.Credentials; +import org.jclouds.servermanager.Datacenter; +import org.jclouds.servermanager.Hardware; +import org.jclouds.servermanager.Image; +import org.jclouds.servermanager.Server; +import org.jclouds.servermanager.ServerManager; + +import com.google.common.collect.ImmutableSet; + +/** + * defines the connection between the {@link ServerManager} implementation and the jclouds + * {@link ComputeService} + * + */ +@Singleton +public class ServerManagerComputeServiceAdapter implements ComputeServiceAdapter { + private final ServerManager client; + + @Inject + public ServerManagerComputeServiceAdapter(ServerManager client) { + this.client = checkNotNull(client, "client"); + } + + @Override + public Server createNodeAndStoreCredentials(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, + Integer.parseInt(template.getImage().getProviderId()), + Integer.parseInt(template.getHardware().getProviderId())); + // store the credentials so that later functions can use them + credentialStore.put(from.id + "", new Credentials(from.loginUser, from.password)); + return from; + } + + @Override + public Iterable listHardware() { + return client.listHardware(); + } + + @Override + public Iterable listImages() { + return client.listImages(); + } + + @Override + public Iterable listNodes() { + return client.listServers(); + } + + @Override + public Iterable listLocations() { + return ImmutableSet.of(new Datacenter(1, "SFO")); + } + + @Override + public Server getNode(String id) { + int serverId = Integer.parseInt(id); + return client.getServer(serverId); + } + + @Override + public void destroyNode(String id) { + client.destroyServer(Integer.parseInt(id)); + } + + @Override + public void rebootNode(String id) { + client.rebootServer(Integer.parseInt(id)); + } +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerDestroyNodeStrategy.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerDestroyNodeStrategy.java deleted file mode 100644 index 50ae2286fb..0000000000 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerDestroyNodeStrategy.java +++ /dev/null @@ -1,68 +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.servermanager.compute.strategy; - -import static com.google.common.base.Preconditions.checkNotNull; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.compute.strategy.DestroyNodeStrategy; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.logging.Logger; -import org.jclouds.servermanager.ServerManager; - -/** - * - * @author Adrian Cole - */ -@Singleton -public class ServerManagerDestroyNodeStrategy implements DestroyNodeStrategy { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - private final ServerManager client; - private final GetNodeMetadataStrategy getNodeMetadataStrategy; - - @Inject - protected ServerManagerDestroyNodeStrategy(ServerManager client, GetNodeMetadataStrategy getNodeMetadataStrategy) { - this.client = checkNotNull(client, "client"); - this.getNodeMetadataStrategy = checkNotNull(getNodeMetadataStrategy, "getNodeMetadataStrategy"); - } - - @Override - public NodeMetadata execute(String id) { - - NodeMetadata node = getNodeMetadataStrategy.execute(id); - if (node == null) - return node; - - logger.debug(">> destroying server(%s)", id); - client.destroyServer(Integer.parseInt(id)); - logger.debug("<< destroyed server(%s)", id); - - return node; - } -} diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerGetAndListNodesStrategy.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerGetAndListNodesStrategy.java deleted file mode 100644 index e28e578d76..0000000000 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerGetAndListNodesStrategy.java +++ /dev/null @@ -1,70 +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.servermanager.compute.strategy; - -import static com.google.common.base.Preconditions.checkNotNull; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.ComputeMetadata; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.predicates.NodePredicates; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.compute.strategy.ListNodesStrategy; -import org.jclouds.servermanager.Server; -import org.jclouds.servermanager.ServerManager; -import org.jclouds.servermanager.compute.functions.ServerToNodeMetadata; - -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; - -/** - * - * @author Adrian Cole - */ -@Singleton -public class ServerManagerGetAndListNodesStrategy implements ListNodesStrategy, GetNodeMetadataStrategy { - private final ServerManager client; - private final ServerToNodeMetadata serverToNodeMetadata; - - @Inject - protected ServerManagerGetAndListNodesStrategy(ServerManager client, ServerToNodeMetadata serverToNodeMetadata) { - this.client = checkNotNull(client, "client"); - this.serverToNodeMetadata = checkNotNull(serverToNodeMetadata, "serverToNodeMetadata"); - } - - @Override - public NodeMetadata execute(String id) { - int serverId = Integer.parseInt(id); - Server server = client.getServer(serverId); - return server == null ? null : serverToNodeMetadata.apply(server); - } - - @Override - public Iterable list() { - return listDetailsOnNodesMatching(NodePredicates.all()); - } - - @Override - public Iterable listDetailsOnNodesMatching(Predicate filter) { - return Iterables.filter(Iterables.transform(client.listServers(), serverToNodeMetadata), filter); - } -} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerRebootNodeStrategy.java b/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerRebootNodeStrategy.java deleted file mode 100644 index 6420a5a222..0000000000 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/strategy/ServerManagerRebootNodeStrategy.java +++ /dev/null @@ -1,69 +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.servermanager.compute.strategy; - -import static com.google.common.base.Preconditions.checkNotNull; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.compute.strategy.RebootNodeStrategy; -import org.jclouds.logging.Logger; -import org.jclouds.servermanager.ServerManager; - -/** - * - * @author Adrian Cole - */ -@Singleton -public class ServerManagerRebootNodeStrategy implements RebootNodeStrategy { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - private final ServerManager client; - private final GetNodeMetadataStrategy getNodeMetadataStrategy; - - @Inject - protected ServerManagerRebootNodeStrategy(ServerManager client, GetNodeMetadataStrategy getNodeMetadataStrategy) { - this.client = checkNotNull(client, "client"); - this.getNodeMetadataStrategy = checkNotNull(getNodeMetadataStrategy, "getNodeMetadataStrategy"); - } - - @Override - public NodeMetadata execute(String id) { - - NodeMetadata node = getNodeMetadataStrategy.execute(id); - if (node == null || node.getState() == NodeState.TERMINATED) - return node; - - logger.debug(">> rebooting server(%s)", id); - client.rebootServer(Integer.parseInt(id)); - logger.debug("<< rebooted server(%s)", id); - - return node; - } -} diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeStrategiesByClass.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeStrategiesByClass.java new file mode 100644 index 0000000000..7591190016 --- /dev/null +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeStrategiesByClass.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.slicehost.compute.config; + +import org.jclouds.compute.config.BindComputeStrategiesByClass; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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.slicehost.compute.strategy.SlicehostAddNodeWithTagStrategy; +import org.jclouds.slicehost.compute.strategy.SlicehostDestroyNodeStrategy; +import org.jclouds.slicehost.compute.strategy.SlicehostGetNodeMetadataStrategy; +import org.jclouds.slicehost.compute.strategy.SlicehostListNodesStrategy; +import org.jclouds.slicehost.compute.strategy.SlicehostRebootNodeStrategy; + +/** + * + * @author Adrian Cole + * + */ +public class SlicehostBindComputeStrategiesByClass extends BindComputeStrategiesByClass { + + @Override + protected Class defineAddNodeWithTagStrategy() { + return SlicehostAddNodeWithTagStrategy.class; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return SlicehostDestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return SlicehostGetNodeMetadataStrategy.class; + } + + @Override + protected Class defineListNodesStrategy() { + return SlicehostListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return SlicehostRebootNodeStrategy.class; + } +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerImageSupplier.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeSuppliersByClass.java similarity index 53% rename from skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerImageSupplier.java rename to slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeSuppliersByClass.java index 666addfa42..c5ff3e2ef4 100644 --- a/skeletons/standalone-compute/src/main/java/org/jclouds/servermanager/compute/suppliers/ServerManagerImageSupplier.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostBindComputeSuppliersByClass.java @@ -17,31 +17,32 @@ * ==================================================================== */ -package org.jclouds.servermanager.compute.suppliers; +package org.jclouds.slicehost.compute.config; -import javax.inject.Inject; -import javax.inject.Singleton; +import java.util.Set; -import org.jclouds.collect.TransformingSetSupplier; +import org.jclouds.compute.config.BindComputeSuppliersByClass; +import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; -import org.jclouds.servermanager.ServerManager; -import org.jclouds.servermanager.compute.functions.ServerManagerImageToImage; +import org.jclouds.slicehost.compute.suppliers.SlicehostHardwareSupplier; +import org.jclouds.slicehost.compute.suppliers.SlicehostImageSupplier; + +import com.google.common.base.Supplier; /** * * @author Adrian Cole + * */ -@Singleton -public class ServerManagerImageSupplier extends TransformingSetSupplier { - private final ServerManager client; +public class SlicehostBindComputeSuppliersByClass extends BindComputeSuppliersByClass { - @Inject - protected ServerManagerImageSupplier(ServerManager client, ServerManagerImageToImage serverManagerImageToImage) { - super(serverManagerImageToImage); - this.client = client; + @Override + protected Class>> defineHardwareSupplier() { + return SlicehostHardwareSupplier.class; } - public Iterable supplyFrom() { - return client.listImages(); + @Override + protected Class>> defineImageSupplier() { + return SlicehostImageSupplier.class; } -} +} \ No newline at end of file diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModule.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModule.java index 18e83cb3ce..ca21e49616 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModule.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/config/SlicehostComputeServiceContextModule.java @@ -24,27 +24,12 @@ import java.util.Set; import javax.inject.Singleton; import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.internal.BaseComputeService; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -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.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; import org.jclouds.rest.annotations.Provider; -import org.jclouds.slicehost.compute.strategy.SlicehostAddNodeWithTagStrategy; -import org.jclouds.slicehost.compute.strategy.SlicehostDestroyNodeStrategy; -import org.jclouds.slicehost.compute.strategy.SlicehostGetNodeMetadataStrategy; -import org.jclouds.slicehost.compute.strategy.SlicehostListNodesStrategy; -import org.jclouds.slicehost.compute.strategy.SlicehostRebootNodeStrategy; -import org.jclouds.slicehost.compute.suppliers.SlicehostHardwareSupplier; -import org.jclouds.slicehost.compute.suppliers.SlicehostImageSupplier; -import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; @@ -71,41 +56,8 @@ public class SlicehostComputeServiceContextModule extends BaseComputeServiceCont @Override protected void configure() { install(new SlicehostComputeServiceDependenciesModule()); + install(new SlicehostBindComputeStrategiesByClass()); + install(new SlicehostBindComputeSuppliersByClass()); super.configure(); } - - @Override - protected Class defineAddNodeWithTagStrategy() { - return SlicehostAddNodeWithTagStrategy.class; - } - - @Override - protected Class defineDestroyNodeStrategy() { - return SlicehostDestroyNodeStrategy.class; - } - - @Override - protected Class defineGetNodeMetadataStrategy() { - return SlicehostGetNodeMetadataStrategy.class; - } - - @Override - protected Class>> defineHardwareSupplier() { - return SlicehostHardwareSupplier.class; - } - - @Override - protected Class>> defineImageSupplier() { - return SlicehostImageSupplier.class; - } - - @Override - protected Class defineListNodesStrategy() { - return SlicehostListNodesStrategy.class; - } - - @Override - protected Class defineRebootNodeStrategy() { - return SlicehostRebootNodeStrategy.class; - } } diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java index ac14176dab..8da557a654 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostAddNodeWithTagStrategy.java @@ -54,7 +54,7 @@ public class SlicehostAddNodeWithTagStrategy implements AddNodeWithTagStrategy { } @Override - public NodeMetadata execute(String tag, String name, Template template) { + public NodeMetadata addNodeWithTag(String tag, String name, Template template) { Slice from = client.createSlice(name, Integer.parseInt(template.getImage().getProviderId()), Integer.parseInt(template.getHardware().getProviderId())); credentialStore.put(from.getId() + "", new Credentials("root", from.getRootPassword())); diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostDestroyNodeStrategy.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostDestroyNodeStrategy.java index 18f64c48e4..d61aaf1d79 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostDestroyNodeStrategy.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostDestroyNodeStrategy.java @@ -43,11 +43,11 @@ public class SlicehostDestroyNodeStrategy implements DestroyNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata destroyNode(String id) { int sliceId = Integer.parseInt(id); // if false slice wasn't around in the first place client.destroySlice(sliceId); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostGetNodeMetadataStrategy.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostGetNodeMetadataStrategy.java index 86d335de37..f87938f54d 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostGetNodeMetadataStrategy.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostGetNodeMetadataStrategy.java @@ -46,7 +46,7 @@ public class SlicehostGetNodeMetadataStrategy implements GetNodeMetadataStrategy } @Override - public NodeMetadata execute(String id) { + public NodeMetadata getNode(String id) { int sliceId = Integer.parseInt(id); Slice slice = client.getSlice(sliceId); return slice == null ? null : sliceToNodeMetadata.apply(slice); diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostListNodesStrategy.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostListNodesStrategy.java index 7b8fc420e0..3c6ea195b4 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostListNodesStrategy.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostListNodesStrategy.java @@ -49,7 +49,7 @@ public class SlicehostListNodesStrategy implements ListNodesStrategy { } @Override - public Iterable list() { + public Iterable listNodes() { return listDetailsOnNodesMatching(NodePredicates.all()); } diff --git a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostRebootNodeStrategy.java b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostRebootNodeStrategy.java index bd3925cac6..7cc5bec0a6 100644 --- a/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostRebootNodeStrategy.java +++ b/slicehost/src/main/java/org/jclouds/slicehost/compute/strategy/SlicehostRebootNodeStrategy.java @@ -43,10 +43,10 @@ public class SlicehostRebootNodeStrategy implements RebootNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata rebootNode(String id) { int sliceId = Integer.parseInt(id); client.hardRebootSlice(sliceId); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeStrategiesByClass.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeStrategiesByClass.java new file mode 100644 index 0000000000..07df6bccc1 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeStrategiesByClass.java @@ -0,0 +1,36 @@ +/** + * + * 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.compute.config; + +import org.jclouds.compute.config.BindComputeStrategiesByClass; +import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; + +/** + * @author Adrian Cole + */ +public abstract class CommonVCloudBindComputeStrategiesByClass extends BindComputeStrategiesByClass { + + @Override + protected Class defineRunNodesAndAddToSetStrategy() { + return EncodeTagIntoNameRunNodesAndAddToSetStrategy.class; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeSuppliersByClass.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeSuppliersByClass.java new file mode 100644 index 0000000000..31922c31a3 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeSuppliersByClass.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.vcloud.compute.config; + +import java.util.Set; + +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.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; +import org.jclouds.vcloud.compute.suppliers.StaticHardwareSupplier; +import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; + +import com.google.common.base.Supplier; + +/** + * @author Adrian Cole + */ +public class CommonVCloudBindComputeSuppliersByClass extends BindComputeSuppliersByClass { + @Override + protected Class>> defineHardwareSupplier() { + return StaticHardwareSupplier.class; + } + + @Override + protected Class>> defineImageSupplier() { + return VCloudImageSupplier.class; + } + + @Override + protected Class>> defineLocationSupplier() { + return OrgAndVDCToLocationSupplier.class; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java index 551a27d8ce..c4936facfe 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java @@ -20,24 +20,16 @@ package org.jclouds.vcloud.compute.config; import java.util.Map; -import java.util.Set; import javax.inject.Singleton; import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Image; +import org.jclouds.compute.config.BindComputeStrategiesByClass; +import org.jclouds.compute.config.BindComputeSuppliersByClass; import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; -import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; -import org.jclouds.domain.Location; -import org.jclouds.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; -import org.jclouds.vcloud.compute.suppliers.StaticHardwareSupplier; -import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; import org.jclouds.vcloud.domain.Status; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; import com.google.inject.Provides; @@ -50,13 +42,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 @@ -67,25 +59,12 @@ public abstract class CommonVCloudComputeServiceContextModule extends BaseComput @Override protected void configure() { super.configure(); + install(defineComputeStrategyModule()); + install(defineComputeSupplierModule()); } - @Override - protected Class defineRunNodesAndAddToSetStrategy() { - return EncodeTagIntoNameRunNodesAndAddToSetStrategy.class; - } + public abstract BindComputeStrategiesByClass defineComputeStrategyModule(); - @Override - protected Class>> defineHardwareSupplier() { - return StaticHardwareSupplier.class; - } + public abstract BindComputeSuppliersByClass defineComputeSupplierModule(); - @Override - protected Class>> defineImageSupplier() { - return VCloudImageSupplier.class; - } - - @Override - protected Class>> defineLocationSupplier() { - return OrgAndVDCToLocationSupplier.class; - } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudBindComputeStrategiesByClass.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudBindComputeStrategiesByClass.java new file mode 100644 index 0000000000..f522687df4 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudBindComputeStrategiesByClass.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.vcloud.compute.config; + +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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.vcloud.compute.strategy.VCloudAddNodeWithTagStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudDestroyNodeStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudGetNodeMetadataStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudListNodesStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; +/** + * @author Adrian Cole + */ +public class VCloudBindComputeStrategiesByClass extends CommonVCloudBindComputeStrategiesByClass { + @Override + protected Class defineAddNodeWithTagStrategy() { + return VCloudAddNodeWithTagStrategy.class; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return VCloudDestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return VCloudGetNodeMetadataStrategy.class; + } + + @Override + protected Class defineListNodesStrategy() { + return VCloudListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return VCloudRebootNodeStrategy.class; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudBindComputeSuppliersByClass.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudBindComputeSuppliersByClass.java new file mode 100644 index 0000000000..08f463c851 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudBindComputeSuppliersByClass.java @@ -0,0 +1,37 @@ +/** + * + * 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.compute.config; + +import java.util.Set; + +import org.jclouds.compute.domain.Hardware; +import org.jclouds.vcloud.compute.suppliers.VCloudHardwareSupplier; + +import com.google.common.base.Supplier; +/** + * @author Adrian Cole + */ +public class VCloudBindComputeSuppliersByClass extends CommonVCloudBindComputeSuppliersByClass { + + @Override + protected Class>> defineHardwareSupplier() { + return VCloudHardwareSupplier.class; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java index 798c631ef1..16a2ba0a81 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java @@ -19,21 +19,17 @@ package org.jclouds.vcloud.compute.config; -import java.util.Set; import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.config.BindComputeStrategiesByClass; +import org.jclouds.compute.config.BindComputeSuppliersByClass; 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.internal.ComputeServiceContextImpl; import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -import org.jclouds.compute.strategy.DestroyNodeStrategy; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; -import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.vcloud.VCloudClient; @@ -44,17 +40,10 @@ import org.jclouds.vcloud.compute.functions.VAppToNodeMetadata; import org.jclouds.vcloud.compute.internal.VCloudTemplateBuilderImpl; import org.jclouds.vcloud.compute.options.VCloudTemplateOptions; import org.jclouds.vcloud.compute.strategy.GetLoginCredentialsFromGuestConfiguration; -import org.jclouds.vcloud.compute.strategy.VCloudAddNodeWithTagStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudDestroyNodeStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudGetNodeMetadataStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudListNodesStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; -import org.jclouds.vcloud.compute.suppliers.VCloudHardwareSupplier; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.VApp; import com.google.common.base.Function; -import com.google.common.base.Supplier; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -92,32 +81,12 @@ public class VCloudComputeServiceContextModule extends CommonVCloudComputeServic } @Override - protected Class>> defineHardwareSupplier() { - return VCloudHardwareSupplier.class; + public BindComputeStrategiesByClass defineComputeStrategyModule() { + return new VCloudBindComputeStrategiesByClass(); } @Override - protected Class defineAddNodeWithTagStrategy() { - return VCloudAddNodeWithTagStrategy.class; - } - - @Override - protected Class defineDestroyNodeStrategy() { - return VCloudDestroyNodeStrategy.class; - } - - @Override - protected Class defineGetNodeMetadataStrategy() { - return VCloudGetNodeMetadataStrategy.class; - } - - @Override - protected Class defineListNodesStrategy() { - return VCloudListNodesStrategy.class; - } - - @Override - protected Class defineRebootNodeStrategy() { - return VCloudRebootNodeStrategy.class; + public BindComputeSuppliersByClass defineComputeSupplierModule() { + return new VCloudBindComputeSuppliersByClass(); } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressBindComputeStrategiesByClass.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressBindComputeStrategiesByClass.java new file mode 100644 index 0000000000..9db991f7a6 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressBindComputeStrategiesByClass.java @@ -0,0 +1,62 @@ +/** + * + * 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.compute.config; + +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +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.vcloud.compute.strategy.VCloudExpressAddNodeWithTagStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; + +/** + * @author Adrian Cole + */ +public class VCloudExpressBindComputeStrategiesByClass extends CommonVCloudBindComputeStrategiesByClass { + + @Override + protected Class defineAddNodeWithTagStrategy() { + return VCloudExpressAddNodeWithTagStrategy.class; + } + + @Override + protected Class defineDestroyNodeStrategy() { + return VCloudExpressDestroyNodeStrategy.class; + } + + @Override + protected Class defineGetNodeMetadataStrategy() { + return VCloudExpressGetNodeMetadataStrategy.class; + } + + @Override + protected Class defineListNodesStrategy() { + return VCloudExpressListNodesStrategy.class; + } + + @Override + protected Class defineRebootNodeStrategy() { + return VCloudExpressRebootNodeStrategy.class; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java index 19d6b905f6..9eb35ffdf7 100755 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java @@ -22,14 +22,11 @@ package org.jclouds.vcloud.compute.config; import javax.inject.Singleton; import org.jclouds.compute.ComputeServiceContext; +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.internal.ComputeServiceContextImpl; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -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.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.vcloud.VCloudExpressClient; @@ -38,11 +35,6 @@ import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.compute.functions.ImagesInVCloudExpressOrg; import org.jclouds.vcloud.compute.functions.VCloudExpressVAppToNodeMetadata; import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; -import org.jclouds.vcloud.compute.strategy.VCloudExpressAddNodeWithTagStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.VCloudExpressVApp; @@ -86,27 +78,12 @@ public class VCloudExpressComputeServiceContextModule extends CommonVCloudComput } @Override - protected Class defineAddNodeWithTagStrategy() { - return VCloudExpressAddNodeWithTagStrategy.class; + public BindComputeStrategiesByClass defineComputeStrategyModule() { + return new VCloudExpressBindComputeStrategiesByClass(); } @Override - protected Class defineDestroyNodeStrategy() { - return VCloudExpressDestroyNodeStrategy.class; - } - - @Override - protected Class defineGetNodeMetadataStrategy() { - return VCloudExpressGetNodeMetadataStrategy.class; - } - - @Override - protected Class defineListNodesStrategy() { - return VCloudExpressListNodesStrategy.class; - } - - @Override - protected Class defineRebootNodeStrategy() { - return VCloudExpressRebootNodeStrategy.class; + public BindComputeSuppliersByClass defineComputeSupplierModule() { + return new CommonVCloudBindComputeSuppliersByClass(); } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudAddNodeWithTagStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudAddNodeWithTagStrategy.java index 2ff6a73af7..000ef311eb 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudAddNodeWithTagStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudAddNodeWithTagStrategy.java @@ -68,7 +68,7 @@ public class VCloudAddNodeWithTagStrategy implements AddNodeWithTagStrategy { } @Override - public NodeMetadata execute(String tag, String name, Template template) { + public NodeMetadata addNodeWithTag(String tag, String name, Template template) { InstantiateVAppTemplateOptions options = processorCount((int) getCores(template.getHardware())).memory( template.getHardware().getRam()).disk( (long) ((template.getHardware().getVolumes().get(0).getSize()) * 1024 * 1024l)); @@ -132,6 +132,6 @@ public class VCloudAddNodeWithTagStrategy implements AddNodeWithTagStrategy { } logger.debug("<< ready vApp(%s)", vAppResponse.getName()); } - return getNode.execute(vAppResponse.getHref().toASCIIString()); + return getNode.getNode(vAppResponse.getHref().toASCIIString()); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudDestroyNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudDestroyNodeStrategy.java index 38a28a85e4..55973b110b 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudDestroyNodeStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudDestroyNodeStrategy.java @@ -63,7 +63,7 @@ public class VCloudDestroyNodeStrategy implements DestroyNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata destroyNode(String id) { URI vappId = URI.create(checkNotNull(id, "node.id")); VApp vApp = client.getVApp(vappId); if (vApp == null) @@ -72,7 +72,7 @@ public class VCloudDestroyNodeStrategy implements DestroyNodeStrategy { vApp = undeployVAppIfDeployed(vApp); deleteVApp(vappId); try { - return getNode.execute(id); + return getNode.getNode(id); } catch (AuthorizationException e) { logger.trace("authorization error getting %s after deletion: %s", id, e.getMessage()); return null; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java index fea8c28b5e..6501eba028 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java @@ -55,7 +55,7 @@ public class VCloudExpressAddNodeWithTagStrategy implements AddNodeWithTagStrate } @Override - public NodeMetadata execute(String tag, String name, Template template) { + public NodeMetadata addNodeWithTag(String tag, String name, Template template) { InstantiateVAppTemplateOptions options = processorCount((int) getCores(template.getHardware())).memory( template.getHardware().getRam()).disk( (long) ((template.getHardware().getVolumes().get(0).getSize()) * 1024 * 1024l)); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java index a65c5fabcb..14541a86d9 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java @@ -47,9 +47,9 @@ public class VCloudExpressDestroyNodeStrategy implements DestroyNodeStrategy { } @Override - public NodeMetadata execute(String id) { + public NodeMetadata destroyNode(String id) { computeClient.stop(URI.create(checkNotNull(id, "node.id"))); - return getNode.execute(id); + return getNode.getNode(id); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java index 19e4eb2ee7..73d89d5b26 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java @@ -49,7 +49,7 @@ public class VCloudExpressGetNodeMetadataStrategy implements GetNodeMetadataStra this.vAppToNodeMetadata = vAppToNodeMetadata; } - public NodeMetadata execute(String in) { + public NodeMetadata getNode(String in) { URI id = URI.create(in); VCloudExpressVApp from = client.getVApp(id); if (from == null) diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java index 0688edce5d..206ed9ff2d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java @@ -82,7 +82,7 @@ public class VCloudExpressListNodesStrategy implements ListNodesStrategy { } @Override - public Iterable list() { + public Iterable listNodes() { Set nodes = Sets.newHashSet(); for (String org : orgNameToEndpoint.get().keySet()) { for (ReferenceType vdc : client.findOrgNamed(org).getVDCs().values()) { @@ -130,7 +130,7 @@ public class VCloudExpressListNodesStrategy implements ListNodesStrategy { int i = 0; while (node == null && i++ < 3) { try { - node = getNodeMetadata.execute(resource.getHref().toASCIIString()); + node = getNodeMetadata.getNode(resource.getHref().toASCIIString()); nodes.add(node); } catch (NullPointerException e) { logger.warn("vApp %s not yet present in vdc %s", resource.getName(), vdc.getName()); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java index 24ffd4aa74..8252b662b9 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java @@ -52,10 +52,10 @@ public class VCloudExpressRebootNodeStrategy implements RebootNodeStrategy { } @Override - public NodeMetadata execute(String in) { + public NodeMetadata rebootNode(String in) { URI id = URI.create(checkNotNull(in, "node.id")); Task task = client.resetVApp(id); taskTester.apply(task.getHref()); - return getNode.execute(in); + return getNode.getNode(in); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java index db18b535e1..e6b3baf78c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java @@ -48,7 +48,7 @@ public class VCloudGetNodeMetadataStrategy implements GetNodeMetadataStrategy { this.vAppToNodeMetadata = checkNotNull(vAppToNodeMetadata, "vAppToNodeMetadata"); } - public NodeMetadata execute(String in) { + public NodeMetadata getNode(String in) { URI id = URI.create(in); VApp from = client.getVApp(id); if (from == null) diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java index d1faba4277..6d5751ca4e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java @@ -82,7 +82,7 @@ public class VCloudListNodesStrategy implements ListNodesStrategy { } @Override - public Iterable list() { + public Iterable listNodes() { Set nodes = Sets.newHashSet(); for (String org : orgNameToEndpoint.get().keySet()) { for (ReferenceType vdc : client.findOrgNamed(org).getVDCs().values()) { @@ -130,7 +130,7 @@ public class VCloudListNodesStrategy implements ListNodesStrategy { int i = 0; while (node == null && i++ < 3) { try { - node = getNodeMetadata.execute(resource.getHref().toASCIIString()); + node = getNodeMetadata.getNode(resource.getHref().toASCIIString()); nodes.add(node); } catch (NullPointerException e) { logger.warn("vApp %s not yet present in vdc %s", resource.getName(), vdc.getName()); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudRebootNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudRebootNodeStrategy.java index 2d4c56f612..fc7effdc6c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudRebootNodeStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudRebootNodeStrategy.java @@ -52,10 +52,10 @@ public class VCloudRebootNodeStrategy implements RebootNodeStrategy { } @Override - public NodeMetadata execute(String in) { + public NodeMetadata rebootNode(String in) { URI id = URI.create(checkNotNull(in, "node.id")); Task task = client.resetVAppOrVm(id); taskTester.apply(task.getHref()); - return getNode.execute(in); + return getNode.getNode(in); } } \ No newline at end of file diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkBindComputeStrategiesByClass.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkBindComputeStrategiesByClass.java new file mode 100644 index 0000000000..ddda7bfd16 --- /dev/null +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkBindComputeStrategiesByClass.java @@ -0,0 +1,41 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.vcloud.terremark.compute.config; + +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.vcloud.compute.config.VCloudExpressBindComputeStrategiesByClass; +import org.jclouds.vcloud.terremark.compute.strategy.TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy; +import org.jclouds.vcloud.terremark.compute.strategy.TerremarkVCloudAddNodeWithTagStrategy; + +/** + * @author Adrian Cole + */ +public class TerremarkBindComputeStrategiesByClass extends VCloudExpressBindComputeStrategiesByClass { + @Override + protected Class defineRunNodesAndAddToSetStrategy() { + return TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.class; + } + + @Override + protected Class defineAddNodeWithTagStrategy() { + return TerremarkVCloudAddNodeWithTagStrategy.class; + } +} \ No newline at end of file diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkBindComputeSuppliersByClass.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkBindComputeSuppliersByClass.java new file mode 100644 index 0000000000..5ff205484f --- /dev/null +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkBindComputeSuppliersByClass.java @@ -0,0 +1,39 @@ +/** + * + * Copyright (C) 2010 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.vcloud.terremark.compute.config; + +import java.util.Set; + +import org.jclouds.compute.domain.Image; +import org.jclouds.vcloud.compute.config.CommonVCloudBindComputeSuppliersByClass; +import org.jclouds.vcloud.terremark.compute.suppliers.VAppTemplatesInOrgs; + +import com.google.common.base.Supplier; + +/** + * @author Adrian Cole + */ +public class TerremarkBindComputeSuppliersByClass extends CommonVCloudBindComputeSuppliersByClass { + @Override + protected Class>> defineImageSupplier() { + return VAppTemplatesInOrgs.class; + } + +} \ No newline at end of file diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java index dffc0a5464..bf4a97843c 100755 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java @@ -20,7 +20,6 @@ package org.jclouds.vcloud.terremark.compute.config; import java.security.SecureRandom; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -28,12 +27,11 @@ import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.ComputeService; -import org.jclouds.compute.domain.Image; +import org.jclouds.compute.config.BindComputeStrategiesByClass; +import org.jclouds.compute.config.BindComputeSuppliersByClass; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.compute.config.VCloudExpressComputeServiceContextModule; import org.jclouds.vcloud.domain.VCloudExpressVApp; @@ -45,9 +43,6 @@ import org.jclouds.vcloud.terremark.compute.functions.NodeMetadataToOrgAndName; import org.jclouds.vcloud.terremark.compute.functions.TerremarkVCloudExpressVAppToNodeMetadata; import org.jclouds.vcloud.terremark.compute.options.TerremarkVCloudTemplateOptions; import org.jclouds.vcloud.terremark.compute.strategy.ParseVAppTemplateDescriptionToGetDefaultLoginCredentials; -import org.jclouds.vcloud.terremark.compute.strategy.TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy; -import org.jclouds.vcloud.terremark.compute.strategy.TerremarkVCloudAddNodeWithTagStrategy; -import org.jclouds.vcloud.terremark.compute.suppliers.VAppTemplatesInOrgs; import com.google.common.base.Function; import com.google.common.base.Supplier; @@ -84,7 +79,7 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom bind(ComputeService.class).to(TerremarkVCloudComputeService.class); bind(VCloudExpressComputeClient.class).to(TerremarkVCloudComputeClient.class); bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to( - ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.class); + ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.class); bind(SecureRandom.class).toInstance(new SecureRandom()); } @@ -95,13 +90,13 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom } @Override - protected Class defineRunNodesAndAddToSetStrategy() { - return TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.class; + public BindComputeStrategiesByClass defineComputeStrategyModule() { + return new TerremarkBindComputeStrategiesByClass(); } @Override - protected Class defineAddNodeWithTagStrategy() { - return TerremarkVCloudAddNodeWithTagStrategy.class; + public BindComputeSuppliersByClass defineComputeSupplierModule() { + return new TerremarkBindComputeSuppliersByClass(); } @Provides @@ -124,8 +119,4 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom return random.nextLong() + ""; } - @Override - protected Class>> defineImageSupplier() { - return VAppTemplatesInOrgs.class; - } } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudAddNodeWithTagStrategy.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudAddNodeWithTagStrategy.java index 4b70b38474..5ca330f099 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudAddNodeWithTagStrategy.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudAddNodeWithTagStrategy.java @@ -54,7 +54,7 @@ public class TerremarkVCloudAddNodeWithTagStrategy implements AddNodeWithTagStra } @Override - public NodeMetadata execute(String tag, String name, Template template) { + public NodeMetadata addNodeWithTag(String tag, String name, Template template) { TerremarkInstantiateVAppTemplateOptions options = getOptions.apply(template); VCloudExpressVApp vApp = computeClient.start(URI.create(template.getLocation().getId()), URI.create(template.getImage().getId()), name, options, template.getOptions().getInboundPorts()); From 61c95831363f81701553ea19c72e0ef432b40bf7 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 22 Oct 2010 21:39:20 -0500 Subject: [PATCH 10/17] Issue 385 made jclouds stub implement the correct interface --- .../compute/stub/config/StubComputeServiceAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 6e119fd6f1..91342b1208 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 @@ -27,7 +27,7 @@ import javax.inject.Named; import javax.inject.Provider; import javax.inject.Singleton; -import org.jclouds.compute.ComputeServiceAdapter; +import org.jclouds.compute.JCloudsNativeComputeServiceAdapter; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.ImageBuilder; @@ -52,7 +52,7 @@ import com.google.common.collect.ImmutableSet; * @author Adrian Cole */ @Singleton -public class StubComputeServiceAdapter implements ComputeServiceAdapter { +public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAdapter { private final Supplier location; private final ConcurrentMap nodes; private final Provider idProvider; From 78e39c688a3daf70936ced57043f791913889fb2 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 24 Oct 2010 11:02:18 -0500 Subject: [PATCH 11/17] Issue 382 started libvirt --- sandbox/libvirt/pom.xml | 128 ++++++++++++++++ .../java/org/jclouds/libvirt/Datacenter.java | 56 +++++++ .../java/org/jclouds/libvirt/Hardware.java | 63 ++++++++ .../main/java/org/jclouds/libvirt/Image.java | 56 +++++++ .../LibvirtComputeServiceContextBuilder.java | 54 +++++++ .../LibvirtComputeServiceContextModule.java | 81 ++++++++++ .../functions/DatacenterToLocation.java | 42 ++++++ .../functions/DomainToNodeMetadata.java | 141 ++++++++++++++++++ .../functions/LibvirtHardwareToHardware.java | 50 +++++++ .../functions/LibvirtImageToImage.java | 62 ++++++++ .../LibvirtComputeServiceAdapter.java | 90 +++++++++++ ...bvirtComputeServiceContextBuilderTest.java | 63 ++++++++ sandbox/libvirt/src/test/resources/log4j.xml | 136 +++++++++++++++++ 13 files changed, 1022 insertions(+) create mode 100644 sandbox/libvirt/pom.xml create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/Datacenter.java create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/Hardware.java create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/Image.java create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilder.java create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/domain/LibvirtComputeServiceContextModule.java create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DatacenterToLocation.java create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtHardwareToHardware.java create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtImageToImage.java create mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java create mode 100644 sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilderTest.java create mode 100755 sandbox/libvirt/src/test/resources/log4j.xml diff --git a/sandbox/libvirt/pom.xml b/sandbox/libvirt/pom.xml new file mode 100644 index 0000000000..ea5ff6124d --- /dev/null +++ b/sandbox/libvirt/pom.xml @@ -0,0 +1,128 @@ + + + + + 4.0.0 + + org.jclouds + jclouds-project + 1.0-SNAPSHOT + ../../project/pom.xml + + jclouds-libvirt + jclouds example components for a libvirt provider + + + trmkrun-ccc,test.trmk-924 + https://libvirt.com + 1.0 + FIXME + + + + org.libvirt + libvirt + 0.4.1 + + + ${project.groupId} + jclouds-core + ${project.version} + test-jar + test + + + ${project.groupId} + jclouds-compute + ${project.version} + + + ${project.groupId} + jclouds-compute + ${project.version} + test-jar + test + + + log4j + log4j + 1.2.14 + test + + + ${project.groupId} + jclouds-log4j + ${project.version} + test + + + ${project.groupId} + jclouds-jsch + ${project.version} + test + + + + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration + integration-test + + test + + + + + test.libvirt.endpoint + ${test.libvirt.endpoint} + + + test.libvirt.apiversion + ${test.libvirt.apiversion} + + + test.libvirt.identity + ${test.libvirt.identity} + + + jclouds.compute.blacklist.nodes + ${jclouds.compute.blacklist.nodes} + + + + + + + + + + + + diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Datacenter.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Datacenter.java new file mode 100644 index 0000000000..ee0042e445 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Datacenter.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.libvirt; + +import com.google.common.base.Objects; + +/** + * This would be replaced with the real java object related to the underlying data center + * + * @author Adrian Cole + */ +public class Datacenter { + + public int id; + public String name; + + public Datacenter(int id, String name) { + this.id = id; + this.name = name; + } + + @Override + public int hashCode() { + return Objects.hashCode(id, name); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + return Objects.equal(this.toString(), that.toString()); + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("id", id).add("name", name).toString(); + } + +} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Hardware.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Hardware.java new file mode 100644 index 0000000000..96709a2626 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Hardware.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.libvirt; + +import com.google.common.base.Objects; + +/** + * This would be replaced with the real java object related to the underlying hardware + * + * @author Adrian Cole + */ +public class Hardware { + + public int id; + public String name; + public int cores; + public int ram; + public float disk; + + public Hardware(int id, String name, int cores, int ram, float disk) { + this.id = id; + this.name = name; + this.cores = cores; + this.ram = ram; + this.disk = disk; + } + + @Override + public int hashCode() { + return Objects.hashCode(id, name, cores, ram, disk); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + return Objects.equal(this.toString(), that.toString()); + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("id", id).add("name", name).add("cores", cores).add("ram", ram) + .add("disk", disk).toString(); + } + +} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Image.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Image.java new file mode 100644 index 0000000000..50eabf51b0 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Image.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.libvirt; + +import com.google.common.base.Objects; + +/** + * This would be replaced with the real java object related to the underlying image + * + * @author Adrian Cole + */ +public class Image { + + public int id; + public String name; + + public Image(int id, String name) { + this.id = id; + this.name = name; + } + + @Override + public int hashCode() { + return Objects.hashCode(id, name); + } + + @Override + public boolean equals(Object that) { + if (that == null) + return false; + return Objects.equal(this.toString(), that.toString()); + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("id", id).add("name", name).toString(); + } + +} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilder.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilder.java new file mode 100644 index 0000000000..b6832a0343 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilder.java @@ -0,0 +1,54 @@ +/** + * + * 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.libvirt.compute; + +import java.util.List; +import java.util.Properties; + +import org.jclouds.compute.StandaloneComputeServiceContextBuilder; +import org.jclouds.compute.config.StandaloneComputeServiceContextModule; +import org.jclouds.libvirt.Datacenter; +import org.jclouds.libvirt.Hardware; +import org.jclouds.libvirt.Image; +import org.jclouds.libvirt.compute.domain.LibvirtComputeServiceContextModule; +import org.libvirt.Domain; + +import com.google.inject.Module; + +/** + * + * @author Adrian Cole + */ +public class LibvirtComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder { + + public LibvirtComputeServiceContextBuilder(Properties props) { + super(props); + } + + @Override + protected void addContextModule(List modules) { + modules.add(createContextModule()); + } + + public StandaloneComputeServiceContextModule createContextModule() { + return new LibvirtComputeServiceContextModule(); + } + +} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/domain/LibvirtComputeServiceContextModule.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/domain/LibvirtComputeServiceContextModule.java new file mode 100644 index 0000000000..1a9e256465 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/domain/LibvirtComputeServiceContextModule.java @@ -0,0 +1,81 @@ +/** + * + * 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.libvirt.compute.domain; + +import java.net.URI; + +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.ComputeServiceAdapter; +import org.jclouds.compute.config.StandaloneComputeServiceContextModule; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.suppliers.DefaultLocationSupplier; +import org.jclouds.domain.Location; +import org.jclouds.libvirt.Datacenter; +import org.jclouds.libvirt.Hardware; +import org.jclouds.libvirt.Image; +import org.jclouds.libvirt.compute.functions.DatacenterToLocation; +import org.jclouds.libvirt.compute.functions.DomainToNodeMetadata; +import org.jclouds.libvirt.compute.functions.LibvirtHardwareToHardware; +import org.jclouds.libvirt.compute.functions.LibvirtImageToImage; +import org.jclouds.libvirt.compute.strategy.LibvirtComputeServiceAdapter; +import org.jclouds.rest.annotations.Provider; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.LibvirtException; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.inject.Provides; +import com.google.inject.TypeLiteral; + +/** + * + * @author Adrian Cole + */ +public class LibvirtComputeServiceContextModule extends + StandaloneComputeServiceContextModule { + @Override + protected void configure() { + super.configure(); + bind(new TypeLiteral>() { + }).to(LibvirtComputeServiceAdapter.class); + bind(new TypeLiteral>() { + }).to(DefaultLocationSupplier.class); + bind(new TypeLiteral>() { + }).to(DomainToNodeMetadata.class); + bind(new TypeLiteral>() { + }).to(LibvirtImageToImage.class); + bind(new TypeLiteral>() { + }).to(LibvirtHardwareToHardware.class); + bind(new TypeLiteral>() { + }).to(DatacenterToLocation.class); + } + + @Provides + @Singleton + protected Connect createConnection(@Provider URI endpoint, @Named(Constants.PROPERTY_IDENTITY) String identity, + @Named(Constants.PROPERTY_CREDENTIAL) String credential) throws LibvirtException { + // ConnectAuth connectAuth = null; + return new Connect(endpoint.toASCIIString()); + } +} \ No newline at end of file diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DatacenterToLocation.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DatacenterToLocation.java new file mode 100644 index 0000000000..abf2b4ccf2 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DatacenterToLocation.java @@ -0,0 +1,42 @@ +/** + * + * 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.libvirt.compute.functions; + +import javax.inject.Singleton; + +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; + +/** + * @author Adrian Cole + */ +@Singleton +public class DatacenterToLocation implements Function { + + @Override + public Location apply(Datacenter from) { + return new LocationImpl(LocationScope.ZONE, from.id + "", from.name, null); + } + +} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java new file mode 100644 index 0000000000..58a6a44417 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java @@ -0,0 +1,141 @@ +/** + * + * 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.libvirt.compute.functions; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; + +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.collect.FindResourceInSet; +import org.jclouds.collect.Memoized; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; +import org.libvirt.Domain; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +/** + * @author Adrian Cole + */ +@Singleton +public class DomainToNodeMetadata implements Function { + + // public static final Map serverStatusToNodeState = ImmutableMap + // . builder().put(Domain.Status.ACTIVE, NodeState.RUNNING)// + // .put(Domain.Status.BUILD, NodeState.PENDING)// + // .put(Domain.Status.TERMINATED, NodeState.TERMINATED)// + // .put(Domain.Status.UNRECOGNIZED, NodeState.UNRECOGNIZED)// + // .build(); + + private final FindHardwareForDomain findHardwareForDomain; + private final FindLocationForDomain findLocationForDomain; + private final FindImageForDomain findImageForDomain; + private final Map credentialStore; + + @Inject + DomainToNodeMetadata(Map credentialStore, FindHardwareForDomain findHardwareForDomain, + FindLocationForDomain findLocationForDomain, FindImageForDomain findImageForDomain) { + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.findHardwareForDomain = checkNotNull(findHardwareForDomain, "findHardwareForDomain"); + this.findLocationForDomain = checkNotNull(findLocationForDomain, "findLocationForDomain"); + this.findImageForDomain = checkNotNull(findImageForDomain, "findImageForDomain"); + } + + @Override + public NodeMetadata apply(Domain from) { + // convert the result object to a jclouds NodeMetadata + NodeMetadataBuilder builder = new NodeMetadataBuilder(); + // builder.ids(from.id + ""); + // builder.name(from.name); + // builder.location(findLocationForDomain.apply(from)); + // builder.tag(parseTagFromName(from.name)); + // builder.imageId(from.imageId + ""); + // Image image = findImageForDomain.apply(from); + // if (image != null) + // builder.operatingSystem(image.getOperatingSystem()); + // builder.hardware(findHardwareForDomain.apply(from)); + // builder.state(serverStatusToNodeState.get(from.status)); + // builder.publicAddresses(ImmutableSet. of(from.publicAddress)); + // builder.privateAddresses(ImmutableSet. of(from.privateAddress)); + // builder.credentials(credentialStore.get(from.id + "")); + return builder.build(); + } + + @Singleton + public static class FindHardwareForDomain extends FindResourceInSet { + + @Inject + public FindHardwareForDomain(@Memoized Supplier> hardware) { + super(hardware); + } + + @Override + public boolean matches(Domain from, Hardware input) { + // TODO + // return input.getProviderId().equals(from.hardwareId + ""); + return true; + } + } + + @Singleton + public static class FindImageForDomain extends FindResourceInSet { + + @Inject + public FindImageForDomain(@Memoized Supplier> hardware) { + super(hardware); + } + + @Override + public boolean matches(Domain from, Image input) { + // TODO + // return input.getProviderId().equals(from.imageId + ""); + return true; + } + } + + @Singleton + public static class FindLocationForDomain extends FindResourceInSet { + + @Inject + public FindLocationForDomain(@Memoized Supplier> hardware) { + super(hardware); + } + + @Override + public boolean matches(Domain from, Location input) { + // TODO + // return input.getId().equals(from.datacenter + ""); + return true; + } + } +} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtHardwareToHardware.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtHardwareToHardware.java new file mode 100644 index 0000000000..b913efe545 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtHardwareToHardware.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.libvirt.compute.functions; + +import javax.inject.Singleton; + +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.internal.VolumeImpl; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; + +/** + * @author Adrian Cole + */ +@Singleton +public class LibvirtHardwareToHardware implements Function { + + @Override + public Hardware apply(org.jclouds.libvirt.Hardware from) { + HardwareBuilder builder = new HardwareBuilder(); + builder.ids(from.id + ""); + builder.name(from.name); + builder.processors(ImmutableList.of(new Processor(from.cores, 1.0))); + builder.ram(from.ram); + builder.volumes(ImmutableList. of(new VolumeImpl(from.disk, true, false))); + return builder.build(); + } + +} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtImageToImage.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtImageToImage.java new file mode 100644 index 0000000000..08eac2ab88 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtImageToImage.java @@ -0,0 +1,62 @@ +/** + * + * 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.libvirt.compute.functions; + +import javax.annotation.Resource; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystemBuilder; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class LibvirtImageToImage implements Function { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + @Override + public Image apply(org.jclouds.libvirt.Image from) { + + ImageBuilder builder = new ImageBuilder(); + builder.ids(from.id + ""); + builder.name(from.name); + builder.description(from.name); + + OsFamily family = null; + try { + family = OsFamily.fromValue(from.name); + builder.operatingSystem(new OperatingSystemBuilder().name(from.name).family(family).build()); + } catch (IllegalArgumentException e) { + logger.debug("<< didn't match os(%s)", from); + } + return builder.build(); + } + +} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java new file mode 100644 index 0000000000..7b818bc958 --- /dev/null +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java @@ -0,0 +1,90 @@ +package org.jclouds.libvirt.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.ComputeServiceAdapter; +import org.jclouds.compute.domain.Template; +import org.jclouds.domain.Credentials; +import org.jclouds.libvirt.Datacenter; +import org.jclouds.libvirt.Hardware; +import org.jclouds.libvirt.Image; +import org.libvirt.Domain; +import org.libvirt.jna.Libvirt; + +import com.google.common.collect.ImmutableSet; + +/** + * defines the connection between the {@link Libvirt} implementation and the jclouds + * {@link ComputeService} + * + */ +@Singleton +public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter { + private final Libvirt client; + + @Inject + public LibvirtComputeServiceAdapter(Libvirt client) { + this.client = checkNotNull(client, "client"); + } + + @Override + public Domain createNodeAndStoreCredentials(String tag, String name, Template template, + Map credentialStore) { + // create the backend object using parameters from the template. + // Domain from = client.createDomainInDC(template.getLocation().getId(), name, + // Integer.parseInt(template.getImage().getProviderId()), + // Integer.parseInt(template.getHardware().getProviderId())); + // store the credentials so that later functions can use them + // credentialStore.put(from.id + "", new Credentials(from.loginUser, from.password)); + return null; + } + + @Override + public Iterable listHardware() { + return ImmutableSet.of(); + // TODO + // return client.listHardware(); + } + + @Override + public Iterable listImages() { + return ImmutableSet.of(); + // TODO + // return client.listImages(); + } + + @Override + public Iterable listNodes() { + return ImmutableSet.of(); + // TODO + // return client.listDomains(); + } + + @Override + public Iterable listLocations() { + return ImmutableSet.of(new Datacenter(1, "SFO")); + } + + @Override + public Domain getNode(String id) { + // int serverId = Integer.parseInt(id); + // return client.getDomain(serverId); + return null; + } + + @Override + public void destroyNode(String id) { + // client.destroyDomain(Integer.parseInt(id)); + } + + @Override + public void rebootNode(String id) { + // client.rebootDomain(Integer.parseInt(id)); + } +} diff --git a/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilderTest.java b/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilderTest.java new file mode 100644 index 0000000000..dba6e22333 --- /dev/null +++ b/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilderTest.java @@ -0,0 +1,63 @@ +package org.jclouds.libvirt.compute; + +import static org.testng.Assert.assertNotNull; + +import java.net.URI; +import java.util.Properties; + +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.compute.config.StandaloneComputeServiceContextModule; +import org.jclouds.libvirt.Datacenter; +import org.jclouds.libvirt.Hardware; +import org.jclouds.libvirt.Image; +import org.jclouds.libvirt.compute.domain.LibvirtComputeServiceContextModule; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.LibvirtException; +import org.testng.annotations.Test; + +/** + * + * @author Adrian Cole + * + */ +@Test(groups = "unit") +public class LibvirtComputeServiceContextBuilderTest { +// +// @Test +// public void testCreateContextModule() { +// assertNotNull(new LibvirtComputeServiceContextBuilder(new Properties()).createContextModule()); +// } +// +// @Test +// public void testCanBuildDirectly() { +// ComputeServiceContext context = new LibvirtComputeServiceContextBuilder(new Properties()) { +// +// @Override +// public StandaloneComputeServiceContextModule createContextModule() { +// return new StubLibvirtComputeServiceContextModule(); +// } +// +// }.buildComputeServiceContext(); +// context.close(); +// } +// +// @Test +// public void testCanBuildWithComputeService() { +// ComputeServiceContext context = ComputeServiceContextFactory +// .createStandaloneContext(new StubLibvirtComputeServiceContextModule()); +// context.close(); +// +// } + + private static class StubLibvirtComputeServiceContextModule extends LibvirtComputeServiceContextModule { + + @Override + protected Connect createConnection(URI endpoint, String identity, String credential) throws LibvirtException { + // TODO replace with mock + return null; + } + + } +} diff --git a/sandbox/libvirt/src/test/resources/log4j.xml b/sandbox/libvirt/src/test/resources/log4j.xml new file mode 100755 index 0000000000..f7337defb9 --- /dev/null +++ b/sandbox/libvirt/src/test/resources/log4j.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From ed6c6e2605a3006bf616b2e4ddc3b469b6b793e1 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 24 Oct 2010 19:21:47 -0500 Subject: [PATCH 12/17] added missing toString on anonymous predicates --- .../domain/internal/TemplateBuilderImpl.java | 93 ++++++++++--------- 1 file changed, 48 insertions(+), 45 deletions(-) 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 5d81b7ae83..cd2deda64e 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 @@ -116,9 +116,9 @@ public class TemplateBuilderImpl implements TemplateBuilder { @Inject protected TemplateBuilderImpl(@Memoized Supplier> locations, - @Memoized Supplier> images, @Memoized Supplier> hardwares, - Supplier defaultLocation2, Provider optionsProvider, - @Named("DEFAULT") Provider defaultTemplateProvider) { + @Memoized Supplier> images, @Memoized Supplier> hardwares, + Supplier defaultLocation2, Provider optionsProvider, + @Named("DEFAULT") Provider defaultTemplateProvider) { this.locations = locations; this.images = images; this.hardwares = hardwares; @@ -140,7 +140,7 @@ 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()); return returnVal; } @@ -180,6 +180,10 @@ public class TemplateBuilderImpl implements TemplateBuilder { return returnVal; } + @Override + public String toString() { + return "osFamily(" + osFamily + ")"; + } }; private final Predicate osNamePredicate = new Predicate() { @@ -210,7 +214,7 @@ public class TemplateBuilderImpl implements TemplateBuilder { returnVal = false; else returnVal = input.getDescription().contains(osDescription) - || input.getDescription().matches(osDescription); + || input.getDescription().matches(osDescription); } return returnVal; } @@ -324,8 +328,8 @@ public class TemplateBuilderImpl implements TemplateBuilder { returnVal = false; else returnVal = input.getDescription().equals(imageDescription) - || input.getDescription().contains(imageDescription) - || input.getDescription().matches(imageDescription); + || input.getDescription().contains(imageDescription) + || input.getDescription().matches(imageDescription); } return returnVal; } @@ -380,12 +384,12 @@ public class TemplateBuilderImpl implements TemplateBuilder { } }; private final Predicate hardwarePredicate = and(hardwareIdPredicate, locationPredicate, - hardwareCoresPredicate, hardwareRamPredicate); + hardwareCoresPredicate, hardwareRamPredicate); static final Ordering DEFAULT_SIZE_ORDERING = new Ordering() { public int compare(Hardware left, Hardware right) { return ComparisonChain.start().compare(getCores(left), getCores(right)).compare(left.getRam(), right.getRam()) - .compare(getSpace(left), getSpace(right)).result(); + .compare(getSpace(left), getSpace(right)).result(); } }; static final Ordering BY_CORES_ORDERING = new Ordering() { @@ -395,16 +399,16 @@ public class TemplateBuilderImpl implements TemplateBuilder { }; static final Ordering DEFAULT_IMAGE_ORDERING = new Ordering() { public int compare(Image left, Image right) { - return ComparisonChain.start().compare(left.getName(), right.getName(), - Ordering. natural().nullsLast()).compare(left.getVersion(), right.getVersion(), - Ordering. natural().nullsLast()).compare(left.getOperatingSystem().getName(), - right.getOperatingSystem().getName(),// - Ordering. natural().nullsLast()).compare(left.getOperatingSystem().getVersion(), - right.getOperatingSystem().getVersion(),// - Ordering. natural().nullsLast()).compare(left.getOperatingSystem().getDescription(), - right.getOperatingSystem().getDescription(),// - Ordering. natural().nullsLast()).compare(left.getOperatingSystem().getArch(), - right.getOperatingSystem().getArch()).result(); + return ComparisonChain.start() + .compare(left.getName(), right.getName(), Ordering. natural().nullsLast()) + .compare(left.getVersion(), right.getVersion(), Ordering. natural().nullsLast()) + .compare(left.getOperatingSystem().getName(), right.getOperatingSystem().getName(),// + Ordering. natural().nullsLast()) + .compare(left.getOperatingSystem().getVersion(), right.getOperatingSystem().getVersion(),// + Ordering. natural().nullsLast()) + .compare(left.getOperatingSystem().getDescription(), right.getOperatingSystem().getDescription(),// + Ordering. natural().nullsLast()) + .compare(left.getOperatingSystem().getArch(), right.getOperatingSystem().getArch()).result(); } }; @@ -535,7 +539,7 @@ public class TemplateBuilderImpl implements TemplateBuilder { Iterable supportedImages = filter(images, buildImagePredicate()); if (Iterables.size(supportedImages) == 0) throw new NoSuchElementException(String.format( - "no image matched predicate %s images that didn't match below:\n%s", imagePredicate, images)); + "no image matched predicate %s images that didn't match below:\n%s", imagePredicate, images)); Hardware hardware = resolveSize(hardwareSorter(), supportedImages); Image image = resolveImage(hardware, supportedImages); logger.debug("<< matched image(%s)", image); @@ -548,29 +552,29 @@ public class TemplateBuilderImpl implements TemplateBuilder { Hardware hardware; try { Iterable hardwaresThatAreCompatibleWithOurImages = filter(hardwaresl, - new Predicate() { - @Override - public boolean apply(final Hardware hardware) { - return Iterables.any(images, new Predicate() { + new Predicate() { + @Override + public boolean apply(final Hardware hardware) { + return Iterables.any(images, new Predicate() { - @Override - public boolean apply(Image input) { - return hardware.supportsImage().apply(input); - } + @Override + public boolean apply(Image input) { + return hardware.supportsImage().apply(input); + } - @Override - public String toString() { - return "hardware(" + hardware + ").supportsImage()"; - } + @Override + public String toString() { + return "hardware(" + hardware + ").supportsImage()"; + } - }); + }); - } - }); + } + }); hardware = hardwareOrdering.max(filter(hardwaresThatAreCompatibleWithOurImages, hardwarePredicate)); } catch (NoSuchElementException exception) { throw new NoSuchElementException("hardwares don't support any images: " + toString() + "\n" + hardwaresl - + "\n" + images); + + "\n" + images); } logger.debug("<< matched hardware(%s)", hardware); return hardware; @@ -637,7 +641,7 @@ public class TemplateBuilderImpl implements TemplateBuilder { @Override public String toString() { - return locationPredicate.toString(); + return "location(" + location + ")"; } }); @@ -678,7 +682,7 @@ public class TemplateBuilderImpl implements TemplateBuilder { // looks verbose, but explicit type needed for this to compile // properly Predicate imagePredicate = predicates.size() == 1 ? Iterables.> get(predicates, 0) - : Predicates. and(predicates); + : Predicates. and(predicates); return imagePredicate; } @@ -826,9 +830,8 @@ public class TemplateBuilderImpl implements TemplateBuilder { @VisibleForTesting boolean nothingChangedExceptOptions() { return osFamily == null && location == null && imageId == null && hardwareId == null && osName == null - && osDescription == null && imageVersion == null && osVersion == null && osArch == null - && os64Bit == null && imageName == null && imageDescription == null && minCores == 0 && minRam == 0 - && !biggest && !fastest; + && osDescription == null && imageVersion == null && osVersion == null && osArch == null && os64Bit == null + && imageName == null && imageDescription == null && minCores == 0 && minRam == 0 && !biggest && !fastest; } /** @@ -842,10 +845,10 @@ public class TemplateBuilderImpl implements TemplateBuilder { @Override public String toString() { return "[biggest=" + biggest + ", fastest=" + fastest + ", imageName=" + imageName + ", imageDescription=" - + imageDescription + ", imageId=" + imageId + ", imageVersion=" + imageVersion + ", location=" - + location + ", minCores=" + minCores + ", minRam=" + minRam + ", osFamily=" + osFamily + ", osName=" - + osName + ", osDescription=" + osDescription + ", osVersion=" + osVersion + ", osArch=" + osArch - + ", os64Bit=" + os64Bit + ", hardwareId=" + hardwareId + "]"; + + imageDescription + ", imageId=" + imageId + ", imageVersion=" + imageVersion + ", location=" + location + + ", minCores=" + minCores + ", minRam=" + minRam + ", osFamily=" + osFamily + ", osName=" + osName + + ", osDescription=" + osDescription + ", osVersion=" + osVersion + ", osArch=" + osArch + ", os64Bit=" + + os64Bit + ", hardwareId=" + hardwareId + "]"; } @Override From f5729cfb4e0de8b5b8a6bdcdd6e8be20a421563c Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 24 Oct 2010 19:28:28 -0500 Subject: [PATCH 13/17] change to choose the first ec2 region when a match cannot be found --- .../aws/config/AWSRestClientModule.java | 59 +++++----- .../aws/config/AWSRestClientModuleTest.java | 63 ++++++++++ .../org/jclouds/logging/jdk/JDKLogger.java | 110 +++++++++--------- 3 files changed, 150 insertions(+), 82 deletions(-) create mode 100644 aws/core/src/test/java/org/jclouds/aws/config/AWSRestClientModuleTest.java diff --git a/aws/core/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java b/aws/core/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java index f35743e14b..566f12f412 100644 --- a/aws/core/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java +++ b/aws/core/src/main/java/org/jclouds/aws/config/AWSRestClientModule.java @@ -19,12 +19,16 @@ package org.jclouds.aws.config; +import static com.google.common.collect.Iterables.find; +import static com.google.common.collect.Iterables.get; +import static com.google.common.collect.Maps.newLinkedHashMap; import static org.jclouds.aws.reference.AWSConstants.PROPERTY_REGIONS; import java.net.URI; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.NoSuchElementException; +import java.util.Set; import javax.inject.Singleton; @@ -39,14 +43,13 @@ 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.logging.Logger.LoggerFactory; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.annotations.Provider; import org.jclouds.rest.config.RestClientModule; import com.google.common.base.Predicate; import com.google.common.base.Splitter; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Provides; @@ -61,8 +64,7 @@ import com.google.inject.name.Names; @RequiresHttp public class AWSRestClientModule extends RestClientModule { - public AWSRestClientModule(Class syncClientType, Class
asyncClientType, - Map, Class> delegates) { + public AWSRestClientModule(Class syncClientType, Class asyncClientType, Map, Class> delegates) { super(syncClientType, asyncClientType, delegates); } @@ -74,12 +76,13 @@ public class AWSRestClientModule extends RestClientModule { @Singleton @Region protected Map provideRegions(Injector injector) { - String regionString = injector.getInstance(Key.get(String.class, Names - .named(PROPERTY_REGIONS))); - Map regions = Maps.newLinkedHashMap(); + String regionString = injector.getInstance(Key.get(String.class, Names.named(PROPERTY_REGIONS))); + Map regions = newLinkedHashMap(); for (String region : Splitter.on(',').split(regionString)) { - regions.put(region, URI.create(injector.getInstance(Key.get(String.class, Names - .named(Constants.PROPERTY_ENDPOINT + "." + region))))); + regions.put( + region, + URI.create(injector.getInstance(Key.get(String.class, + Names.named(Constants.PROPERTY_ENDPOINT + "." + region))))); } return regions; } @@ -94,33 +97,35 @@ public class AWSRestClientModule extends RestClientModule { @Provides @Singleton @Region - protected String getDefaultRegion(@Provider final URI uri, @Region Map map) { - return Iterables.find(map.entrySet(), new Predicate>() { + protected String getDefaultRegion(@Provider final URI uri, @Region Map map, LoggerFactory logFactory) { + try { + return find(map.entrySet(), new Predicate>() { - @Override - public boolean apply(Entry input) { - return input.getValue().equals(uri); - } + @Override + public boolean apply(Entry input) { + return input.getValue().equals(uri); + } - }).getKey(); + }).getKey(); + } catch (NoSuchElementException e) { + String region = get(map.keySet(), 0); + logFactory.getLogger("jclouds.compute").warn( + "failed to find region for current endpoint %s in %s; choosing first: %s", uri, map, region); + return region; + } } @Override protected void bindErrorHandlers() { - bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to( - ParseAWSErrorFromXmlContent.class); - bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to( - ParseAWSErrorFromXmlContent.class); - bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to( - ParseAWSErrorFromXmlContent.class); + bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ParseAWSErrorFromXmlContent.class); + bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(ParseAWSErrorFromXmlContent.class); + bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ParseAWSErrorFromXmlContent.class); } @Override protected void bindRetryHandlers() { - bind(HttpRetryHandler.class).annotatedWith(Redirection.class).to( - AWSRedirectionRetryHandler.class); - bind(HttpRetryHandler.class).annotatedWith(ClientError.class).to( - AWSClientErrorRetryHandler.class); + bind(HttpRetryHandler.class).annotatedWith(Redirection.class).to(AWSRedirectionRetryHandler.class); + bind(HttpRetryHandler.class).annotatedWith(ClientError.class).to(AWSClientErrorRetryHandler.class); } } \ No newline at end of file diff --git a/aws/core/src/test/java/org/jclouds/aws/config/AWSRestClientModuleTest.java b/aws/core/src/test/java/org/jclouds/aws/config/AWSRestClientModuleTest.java new file mode 100644 index 0000000000..f155553465 --- /dev/null +++ b/aws/core/src/test/java/org/jclouds/aws/config/AWSRestClientModuleTest.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.aws.config; + +import static org.testng.Assert.assertEquals; + +import java.net.URI; +import java.util.Map; + +import org.jclouds.aws.ec2.EC2AsyncClient; +import org.jclouds.aws.ec2.EC2Client; +import org.jclouds.logging.jdk.JDKLogger; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; + +/** + * + * @author Adrian Cole + */ +@Test(sequential = true, groups = { "unit" }, testName = "aws.AWSRestClientModuleTest") +public class AWSRestClientModuleTest { + + @Test + public void testDefaultRegionWhenThereIsAMatch() { + AWSRestClientModule module = new AWSRestClientModule( + EC2Client.class, EC2AsyncClient.class); + + URI currentEndpoint = URI.create("http://region1"); + Map map = ImmutableMap.of("region1", currentEndpoint, "region2", URI.create("http://region2")); + + assertEquals("region1", module.getDefaultRegion(currentEndpoint, map, new JDKLogger.JDKLoggerFactory())); + } + + @Test + public void testDefaultRegionWhenThereIsNoMatch() { + AWSRestClientModule module = new AWSRestClientModule( + EC2Client.class, EC2AsyncClient.class); + + URI currentEndpoint = URI.create("http://region3"); + Map map = ImmutableMap.of("region1", currentEndpoint, "region2", URI.create("http://region2")); + + assertEquals("region1", module.getDefaultRegion(currentEndpoint, map, new JDKLogger.JDKLoggerFactory())); + } + +} diff --git a/core/src/main/java/org/jclouds/logging/jdk/JDKLogger.java b/core/src/main/java/org/jclouds/logging/jdk/JDKLogger.java index da9e82905b..cb17589ab9 100644 --- a/core/src/main/java/org/jclouds/logging/jdk/JDKLogger.java +++ b/core/src/main/java/org/jclouds/logging/jdk/JDKLogger.java @@ -31,74 +31,74 @@ import org.jclouds.logging.Logger; * */ public class JDKLogger extends BaseLogger { - private final java.util.logging.Logger logger; + private final java.util.logging.Logger logger; - public static class JDKLoggerFactory implements LoggerFactory { - public Logger getLogger(String category) { - return new JDKLogger(java.util.logging.Logger.getLogger(category)); - } - } + public static class JDKLoggerFactory implements LoggerFactory { + public Logger getLogger(String category) { + return new JDKLogger(java.util.logging.Logger.getLogger(category)); + } + } - public JDKLogger(java.util.logging.Logger logger) { - this.logger = logger; - } + public JDKLogger(java.util.logging.Logger logger) { + this.logger = logger; + } - @Override - protected void logTrace(String message) { - logger.finest(message); - } + @Override + protected void logTrace(String message) { + logger.finest(message); + } - public boolean isTraceEnabled() { - return logger.isLoggable(Level.FINEST); - } + public boolean isTraceEnabled() { + return logger.isLoggable(Level.FINEST); + } - @Override - protected void logDebug(String message) { - logger.fine(message); - } + @Override + protected void logDebug(String message) { + logger.fine(message); + } - public boolean isDebugEnabled() { - return logger.isLoggable(Level.FINE); - } + public boolean isDebugEnabled() { + return logger.isLoggable(Level.FINE); + } - @Override - protected void logInfo(String message) { - logger.info(message); - } + @Override + protected void logInfo(String message) { + logger.info(message); + } - public boolean isInfoEnabled() { - return logger.isLoggable(Level.INFO); - } + public boolean isInfoEnabled() { + return logger.isLoggable(Level.INFO); + } - @Override - protected void logWarn(String message) { - logger.warning(message); - } + @Override + protected void logWarn(String message) { + logger.warning(message); + } - @Override - protected void logWarn(String message, Throwable e) { - logger.log(Level.WARNING, message, e); - } + @Override + protected void logWarn(String message, Throwable e) { + logger.log(Level.WARNING, message, e); + } - public boolean isWarnEnabled() { - return logger.isLoggable(Level.WARNING); - } + public boolean isWarnEnabled() { + return logger.isLoggable(Level.WARNING); + } - @Override - protected void logError(String message) { - logger.severe(message); - } + @Override + protected void logError(String message) { + logger.severe(message); + } - @Override - protected void logError(String message, Throwable e) { - logger.log(Level.SEVERE, message, e); - } + @Override + protected void logError(String message, Throwable e) { + logger.log(Level.SEVERE, message, e); + } - public boolean isErrorEnabled() { - return logger.isLoggable(Level.SEVERE); - } + public boolean isErrorEnabled() { + return logger.isLoggable(Level.SEVERE); + } - public String getCategory() { - return logger.getName(); - } + public String getCategory() { + return logger.getName(); + } } \ No newline at end of file From 9d91b1704d9a7c10b2e2b547e907ac987583ff10 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 24 Oct 2010 22:58:21 -0500 Subject: [PATCH 14/17] Issue 382: correct libvirt dependencies --- sandbox/libvirt/pom.xml | 8 +++++++- .../compute/strategy/LibvirtComputeServiceAdapter.java | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/sandbox/libvirt/pom.xml b/sandbox/libvirt/pom.xml index ea5ff6124d..4d1b3d36c0 100644 --- a/sandbox/libvirt/pom.xml +++ b/sandbox/libvirt/pom.xml @@ -41,8 +41,14 @@ org.libvirt libvirt - 0.4.1 + 0.4.6 + + com.sun.jna + jna + 3.0.9 + provided + ${project.groupId} jclouds-core diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java index 7b818bc958..1a2c9049eb 100644 --- a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java @@ -14,6 +14,7 @@ import org.jclouds.domain.Credentials; import org.jclouds.libvirt.Datacenter; import org.jclouds.libvirt.Hardware; import org.jclouds.libvirt.Image; +import org.libvirt.Connect; import org.libvirt.Domain; import org.libvirt.jna.Libvirt; @@ -26,10 +27,10 @@ import com.google.common.collect.ImmutableSet; */ @Singleton public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter { - private final Libvirt client; + private final Connect client; @Inject - public LibvirtComputeServiceAdapter(Libvirt client) { + public LibvirtComputeServiceAdapter(Connect client) { this.client = checkNotNull(client, "client"); } From fb93e8130146ed3d470ecb3b148bcd84da845c02 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 24 Oct 2010 22:59:01 -0500 Subject: [PATCH 15/17] refactored to create typed contextspec objects --- .../saas/AtmosStorageAsyncClientTest.java | 4 +- .../blobstore/AtmosBlobRequestSignerTest.java | 4 +- .../cloudwatch/CloudWatchAsyncClientTest.java | 4 +- .../ec2/services/BaseEC2AsyncClientTest.java | 4 +- .../jclouds/aws/elb/ELBAsyncClientTest.java | 4 +- .../jclouds/aws/s3/BaseS3AsyncClientTest.java | 4 +- .../s3/blobstore/S3BlobRequestSignerTest.java | 4 +- .../jclouds/aws/sqs/SQSAsyncClientTest.java | 4 +- .../blob/AzureBlobAsyncClientTest.java | 4 +- .../blobstore/AzureBlobRequestSignerTest.java | 4 +- .../queue/AzureQueueAsyncClientTest.java | 4 +- .../blobstore/BlobStoreContextBuilder.java | 1 - .../blobstore/BlobStoreContextFactory.java | 10 +- .../TransientBlobRequestSignerTest.java | 4 +- .../src/main/clojure/org/jclouds/modules.clj | 10 +- .../compute/ComputeServiceContextFactory.java | 33 +-- .../StandaloneComputeServiceContextSpec.java | 43 +++ .../ComputeServiceContextFactoryTest.java | 15 +- .../org/jclouds/rest/RestContextFactory.java | 250 +++++------------- .../org/jclouds/rest/RestContextSpec.java | 106 ++++++++ .../java/org/jclouds/http/BaseJettyTest.java | 4 +- .../jclouds/rest/InputParamValidatorTest.java | 3 +- .../java/org/jclouds/rest/RestClientTest.java | 5 +- .../jclouds/rest/RestContextFactoryTest.java | 23 +- .../internal/RestAnnotationProcessorTest.java | 6 +- .../services/BaseGoGridAsyncClientTest.java | 4 +- .../RackspaceAuthAsyncClientTest.java | 4 +- .../CloudFilesBlobRequestSignerTest.java | 4 +- .../CloudServersAsyncClientTest.java | 4 +- .../miro/RimuHostingAsyncClientTest.java | 4 +- sandbox/libvirt/README.txt | 2 + ...bvirtComputeServiceContextBuilderTest.java | 49 ++-- ...nagerComputeServiceContextBuilderTest.java | 15 +- .../slicehost/SlicehostAsyncClientTest.java | 4 +- .../jclouds/vcloud/VCloudAsyncClientTest.java | 4 +- .../vcloud/VCloudExpressAsyncClientTest.java | 4 +- .../vcloud/VCloudLoginAsyncClientTest.java | 4 +- .../vcloud/VCloudVersionsAsyncClientTest.java | 4 +- .../TerremarkECloudAsyncClientTest.java | 4 +- ...TerremarkVCloudExpressAsyncClientTest.java | 4 +- 40 files changed, 353 insertions(+), 318 deletions(-) create mode 100644 compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextSpec.java create mode 100644 core/src/main/java/org/jclouds/rest/RestContextSpec.java create mode 100644 sandbox/libvirt/README.txt diff --git a/atmos/src/test/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClientTest.java b/atmos/src/test/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClientTest.java index 1636d957d5..d30356c52c 100644 --- a/atmos/src/test/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClientTest.java +++ b/atmos/src/test/java/org/jclouds/atmosonline/saas/AtmosStorageAsyncClientTest.java @@ -49,7 +49,7 @@ import org.jclouds.http.options.GetOptions; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.rest.internal.RestAnnotationProcessor; @@ -270,7 +270,7 @@ public class AtmosStorageAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("atmosonline", "identity", "credential", new Properties()); } diff --git a/atmos/src/test/java/org/jclouds/atmosonline/saas/blobstore/AtmosBlobRequestSignerTest.java b/atmos/src/test/java/org/jclouds/atmosonline/saas/blobstore/AtmosBlobRequestSignerTest.java index b7672ebdda..91fa367e17 100644 --- a/atmos/src/test/java/org/jclouds/atmosonline/saas/blobstore/AtmosBlobRequestSignerTest.java +++ b/atmos/src/test/java/org/jclouds/atmosonline/saas/blobstore/AtmosBlobRequestSignerTest.java @@ -36,7 +36,7 @@ import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -139,7 +139,7 @@ public class AtmosBlobRequestSignerTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("atmosonline", "identity", "credential", new Properties()); } diff --git a/aws/core/src/test/java/org/jclouds/aws/cloudwatch/CloudWatchAsyncClientTest.java b/aws/core/src/test/java/org/jclouds/aws/cloudwatch/CloudWatchAsyncClientTest.java index aaf574f03a..9c3b11b049 100644 --- a/aws/core/src/test/java/org/jclouds/aws/cloudwatch/CloudWatchAsyncClientTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/cloudwatch/CloudWatchAsyncClientTest.java @@ -39,7 +39,7 @@ import org.jclouds.http.functions.ParseSax; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.Test; @@ -101,7 +101,7 @@ public class CloudWatchAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("cloudwatch", "identity", "credential", new Properties()); } diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/services/BaseEC2AsyncClientTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/services/BaseEC2AsyncClientTest.java index 0a540be06e..da56c739a6 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/services/BaseEC2AsyncClientTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/services/BaseEC2AsyncClientTest.java @@ -40,7 +40,7 @@ import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.testng.annotations.BeforeTest; import com.google.common.collect.ImmutableMap; @@ -102,7 +102,7 @@ public abstract class BaseEC2AsyncClientTest extends RestClientTest { } @Override - public ContextSpec createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("ec2", "identity", "credential", new Properties()); } diff --git a/aws/core/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java b/aws/core/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java index 1cbbc69023..7626f036da 100644 --- a/aws/core/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/elb/ELBAsyncClientTest.java @@ -38,7 +38,7 @@ import org.jclouds.http.functions.ParseSax; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.Test; @@ -103,7 +103,7 @@ public class ELBAsyncClientTest extends RestClientTest { } @Override - public ContextSpec createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("elb", "identity", "credential", new Properties()); } diff --git a/aws/core/src/test/java/org/jclouds/aws/s3/BaseS3AsyncClientTest.java b/aws/core/src/test/java/org/jclouds/aws/s3/BaseS3AsyncClientTest.java index e65f33c1e7..dc921fe0c4 100644 --- a/aws/core/src/test/java/org/jclouds/aws/s3/BaseS3AsyncClientTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/s3/BaseS3AsyncClientTest.java @@ -29,7 +29,7 @@ import org.jclouds.aws.s3.filters.RequestAuthorizeSignature; import org.jclouds.http.HttpRequest; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.BeforeClass; @@ -65,7 +65,7 @@ public abstract class BaseS3AsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("s3", "identity", "credential", new Properties()); } diff --git a/aws/core/src/test/java/org/jclouds/aws/s3/blobstore/S3BlobRequestSignerTest.java b/aws/core/src/test/java/org/jclouds/aws/s3/blobstore/S3BlobRequestSignerTest.java index 4e696ba94f..93ef1a7b3a 100644 --- a/aws/core/src/test/java/org/jclouds/aws/s3/blobstore/S3BlobRequestSignerTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/s3/blobstore/S3BlobRequestSignerTest.java @@ -36,7 +36,7 @@ import org.jclouds.io.payloads.PhantomPayload; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -135,7 +135,7 @@ public class S3BlobRequestSignerTest extends RestClientTest { } @Override - public ContextSpec createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("s3", "identity", "credential", new Properties()); } diff --git a/aws/core/src/test/java/org/jclouds/aws/sqs/SQSAsyncClientTest.java b/aws/core/src/test/java/org/jclouds/aws/sqs/SQSAsyncClientTest.java index f80023e868..0db2cac132 100644 --- a/aws/core/src/test/java/org/jclouds/aws/sqs/SQSAsyncClientTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/sqs/SQSAsyncClientTest.java @@ -44,7 +44,7 @@ import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.Test; @@ -170,7 +170,7 @@ public class SQSAsyncClientTest extends RestClientTest { } @Override - public ContextSpec createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("sqs", "identity", "credential", new Properties()); } diff --git a/azure/src/test/java/org/jclouds/azure/storage/blob/AzureBlobAsyncClientTest.java b/azure/src/test/java/org/jclouds/azure/storage/blob/AzureBlobAsyncClientTest.java index 742c5b9eeb..f708935c90 100644 --- a/azure/src/test/java/org/jclouds/azure/storage/blob/AzureBlobAsyncClientTest.java +++ b/azure/src/test/java/org/jclouds/azure/storage/blob/AzureBlobAsyncClientTest.java @@ -47,7 +47,7 @@ import org.jclouds.http.functions.ReturnTrueOn404; import org.jclouds.http.options.GetOptions; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.Test; @@ -277,7 +277,7 @@ public class AzureBlobAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("azureblob", "identity", "credential", new Properties()); } } diff --git a/azure/src/test/java/org/jclouds/azure/storage/blob/blobstore/AzureBlobRequestSignerTest.java b/azure/src/test/java/org/jclouds/azure/storage/blob/blobstore/AzureBlobRequestSignerTest.java index b8c724cc57..1fb4a52b13 100644 --- a/azure/src/test/java/org/jclouds/azure/storage/blob/blobstore/AzureBlobRequestSignerTest.java +++ b/azure/src/test/java/org/jclouds/azure/storage/blob/blobstore/AzureBlobRequestSignerTest.java @@ -35,7 +35,7 @@ import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -133,7 +133,7 @@ public class AzureBlobRequestSignerTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("azureblob", "identity", "credential", new Properties()); } diff --git a/azure/src/test/java/org/jclouds/azure/storage/queue/AzureQueueAsyncClientTest.java b/azure/src/test/java/org/jclouds/azure/storage/queue/AzureQueueAsyncClientTest.java index 8e4e993b2f..e396735aad 100644 --- a/azure/src/test/java/org/jclouds/azure/storage/queue/AzureQueueAsyncClientTest.java +++ b/azure/src/test/java/org/jclouds/azure/storage/queue/AzureQueueAsyncClientTest.java @@ -42,7 +42,7 @@ import org.jclouds.http.functions.ReleasePayloadAndReturn; import org.jclouds.http.functions.ReturnTrueIf2xx; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.Test; @@ -233,7 +233,7 @@ public class AzureQueueAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("azurequeue", "identity", "credential", new Properties()); } diff --git a/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContextBuilder.java b/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContextBuilder.java index 132681b0e8..1f5e7bc084 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContextBuilder.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContextBuilder.java @@ -41,7 +41,6 @@ public abstract class BlobStoreContextBuilder extends RestContextBuilder syncClientType, Class asyncClientType, Properties properties) { super(syncClientType, asyncClientType, properties); - } public BlobStoreContext buildBlobStoreContext() { diff --git a/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContextFactory.java b/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContextFactory.java index dbd43361a2..ffbb4b4ddd 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContextFactory.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/BlobStoreContextFactory.java @@ -27,7 +27,7 @@ import java.util.Properties; import javax.annotation.Nullable; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import com.google.inject.Module; @@ -124,18 +124,18 @@ public class BlobStoreContextFactory { } /** - * @see RestContextFactory#createContextBuilder(ContextSpec) + * @see RestContextFactory#createContextBuilder(RestContextSpec) */ - public BlobStoreContext createContext(ContextSpec contextSpec) { + public BlobStoreContext createContext(RestContextSpec contextSpec) { BlobStoreContextBuilder builder = BlobStoreContextBuilder.class.cast(createContextBuilder(contextSpec)); return buildContextUnwrappingExceptions(builder); } /** - * @see RestContextFactory#createContextBuilder(ContextSpec, Properties) + * @see RestContextFactory#createContextBuilder(RestContextSpec, Properties) */ - public BlobStoreContext createContext(ContextSpec contextSpec, Properties overrides) { + public BlobStoreContext createContext(RestContextSpec contextSpec, Properties overrides) { BlobStoreContextBuilder builder = BlobStoreContextBuilder.class.cast(createContextBuilder(contextSpec, overrides)); return buildContextUnwrappingExceptions(builder); diff --git a/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java b/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java index aa85d627c8..940b52f1c6 100644 --- a/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java +++ b/blobstore/src/test/java/org/jclouds/blobstore/TransientBlobRequestSignerTest.java @@ -30,7 +30,7 @@ import org.jclouds.http.HttpRequest; import org.jclouds.io.payloads.PhantomPayload; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -97,7 +97,7 @@ public class TransientBlobRequestSignerTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("transient", "identity", "credential", new Properties()); } diff --git a/compute/src/main/clojure/org/jclouds/modules.clj b/compute/src/main/clojure/org/jclouds/modules.clj index 6e0f14e958..b8e1c3ba9a 100644 --- a/compute/src/main/clojure/org/jclouds/modules.clj +++ b/compute/src/main/clojure/org/jclouds/modules.clj @@ -22,8 +22,9 @@ (:import [org.jclouds.ssh SshClient ExecResponse] com.google.inject.Module + com.google.common.collect.ImmutableSet org.jclouds.net.IPSocket - [org.jclouds.compute ComputeService ComputeServiceContextFactory] + [org.jclouds.compute ComputeService ComputeServiceContextFactory StandaloneComputeServiceContextSpec] [java.util Set Map] [org.jclouds.compute.domain NodeMetadata Template] [com.google.common.base Supplier Predicate] @@ -52,8 +53,11 @@ (^void rebootNode [this ^String id] ())))) -(defn compute-context [module] - (ComputeServiceContextFactory/createStandaloneContext module)) +(defn compute-context [^RestContextSpec spec] + (.createContext (ComputeServiceContextFactory.) spec)) + +(^RestContextSpec defn context-spec [^StandaloneComputeServiceContextModule module] + (StandaloneComputeServiceContextSpec. "servermanager", "http://host", "1", "identity", "credential", module, (ImmutableSet/of))) (defrecord NodeListComputeService [node-list] diff --git a/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java b/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java index e447eab61d..61280f4d14 100644 --- a/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java +++ b/compute/src/main/java/org/jclouds/compute/ComputeServiceContextFactory.java @@ -26,12 +26,9 @@ import java.util.Properties; import javax.annotation.Nullable; -import org.jclouds.PropertiesBuilder; -import org.jclouds.compute.config.StandaloneComputeServiceContextModule; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; -import com.google.common.collect.ImmutableSet; import com.google.inject.Module; /** @@ -126,9 +123,9 @@ public class ComputeServiceContextFactory { } /** - * @see RestContextFactory#createContextBuilder(ContextSpec) + * @see RestContextFactory#createContextBuilder(RestContextSpec) */ - public ComputeServiceContext createContext(ContextSpec contextSpec) { + public ComputeServiceContext createContext(RestContextSpec contextSpec) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class .cast(createContextBuilder(contextSpec)); return buildContextUnwrappingExceptions(builder); @@ -136,26 +133,22 @@ public class ComputeServiceContextFactory { } /** - * @see RestContextFactory#createContextBuilder(ContextSpec, Properties) + * @see RestContextFactory#createContextBuilder(RestContextSpec, Properties) */ - public ComputeServiceContext createContext(ContextSpec contextSpec, Properties overrides) { + public ComputeServiceContext createContext(RestContextSpec contextSpec, Properties overrides) { ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(createContextBuilder( contextSpec, overrides)); return buildContextUnwrappingExceptions(builder); } - public static ComputeServiceContext createStandaloneContext( - StandaloneComputeServiceContextModule contextModule) { - return createStandaloneContext(contextModule, ImmutableSet. of()); + /** + * @see RestContextFactory#createContextBuilder(RestContextSpec, Iterable, Properties) + */ + public ComputeServiceContext createContext(RestContextSpec contextSpec, Iterable modules, + Properties overrides) { + ComputeServiceContextBuilder builder = ComputeServiceContextBuilder.class.cast(createContextBuilder( + contextSpec, modules, overrides)); + return buildContextUnwrappingExceptions(builder); } - @SuppressWarnings("unchecked") - public static ComputeServiceContext createStandaloneContext( - StandaloneComputeServiceContextModule contextModule, Iterable modules) { - return new ComputeServiceContextFactory().createContext(RestContextFactory - . contextSpec("standalone", "standalone", "1", "standalone", null, - (Class) null, (Class) null, PropertiesBuilder.class, - (Class) StandaloneComputeServiceContextBuilder.class, - ImmutableSet. builder().add(contextModule).addAll(modules).build())); - } } \ No newline at end of file diff --git a/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextSpec.java b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextSpec.java new file mode 100644 index 0000000000..0dc354a0e2 --- /dev/null +++ b/compute/src/main/java/org/jclouds/compute/StandaloneComputeServiceContextSpec.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.compute; + +import org.jclouds.PropertiesBuilder; +import org.jclouds.compute.config.StandaloneComputeServiceContextModule; +import org.jclouds.rest.RestContextSpec; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.inject.Module; + +/** + * @author Adrian Cole + */ +public class StandaloneComputeServiceContextSpec extends RestContextSpec { + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public StandaloneComputeServiceContextSpec(String provider, String endpoint, String apiVersion, String identity, + String credential, StandaloneComputeServiceContextModule contextModule, Iterable modules) { + super(provider, endpoint, apiVersion, identity, credential, ComputeService.class, ComputeService.class, + PropertiesBuilder.class, (Class) StandaloneComputeServiceContextBuilder.class, Iterables.concat( + ImmutableSet.of(contextModule), modules)); + } + +} \ No newline at end of file diff --git a/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java index ece9c9916a..c3a72d6917 100644 --- a/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java +++ b/compute/src/test/java/org/jclouds/compute/ComputeServiceContextFactoryTest.java @@ -19,9 +19,16 @@ package org.jclouds.compute; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.stub.config.StubComputeServiceContextModule; +import org.jclouds.domain.Location; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + /** * * @author Adrian Cole @@ -32,9 +39,11 @@ public class ComputeServiceContextFactoryTest { @Test public void testStandalone() { - ComputeServiceContext context = ComputeServiceContextFactory - .createStandaloneContext(new StubComputeServiceContextModule()); + ComputeServiceContext context = new ComputeServiceContextFactory() + .createContext(new StandaloneComputeServiceContextSpec("stub", + "stub", "1", "identity", "credential", new StubComputeServiceContextModule(), ImmutableSet + . of())); + context.getComputeService().listNodes(); } - } diff --git a/core/src/main/java/org/jclouds/rest/RestContextFactory.java b/core/src/main/java/org/jclouds/rest/RestContextFactory.java index b1f2134f9c..37aca2af06 100644 --- a/core/src/main/java/org/jclouds/rest/RestContextFactory.java +++ b/core/src/main/java/org/jclouds/rest/RestContextFactory.java @@ -19,7 +19,6 @@ package org.jclouds.rest; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Throwables.propagate; import static com.google.common.collect.Iterables.concat; @@ -73,143 +72,24 @@ import com.google.inject.Module; */ public class RestContextFactory { - public static ContextSpec contextSpec(String provider, String endpoint, String apiVersion, - String identity, String credential, Class sync, Class async, - Class propertiesBuilderClass, Class> contextBuilderClass, - Iterable modules) { - return new ContextSpec(provider, endpoint, apiVersion, 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, + Class propertiesBuilderClass, Class> contextBuilderClass, + Iterable modules) { + return new RestContextSpec(provider, endpoint, apiVersion, identity, credential, sync, async, + propertiesBuilderClass, contextBuilderClass, modules); } - public static ContextSpec contextSpec(String provider, String endpoint, String apiVersion, - String identity, String credential, Class sync, Class async) { - return new ContextSpec(provider, endpoint, apiVersion, identity, credential, sync, async); + 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); } @SuppressWarnings("unchecked") - public static ContextSpec contextSpec(String provider, String endpoint, String apiVersion, - String identity, String credential, Class sync, Class async, Iterable modules) { - return new ContextSpec(provider, endpoint, apiVersion, identity, credential, sync, async, - PropertiesBuilder.class, (Class) RestContextBuilder.class, modules); - } - - public static class ContextSpec { - final String provider; - final String endpoint; - final String apiVersion; - final String identity; - final String credential; - final Class sync; - final Class async; - final Class propertiesBuilderClass; - final Class> contextBuilderClass; - final Iterable modules; - - ContextSpec(String provider, String endpoint, String apiVersion, 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.sync = sync; - this.async = async; - checkArgument(RestContextBuilder.class.isAssignableFrom(contextBuilderClass), contextBuilderClass.getName() - + " is not a subclass of " + RestContextBuilder.class.getName()); - checkArgument(PropertiesBuilder.class.isAssignableFrom(propertiesBuilderClass), propertiesBuilderClass - .getName() - + " is not a subclass of " + PropertiesBuilder.class.getName()); - this.propertiesBuilderClass = propertiesBuilderClass; - this.contextBuilderClass = contextBuilderClass; - this.modules = modules; - } - - @SuppressWarnings("unchecked") - public ContextSpec(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); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((apiVersion == null) ? 0 : apiVersion.hashCode()); - result = prime * result + ((async == null) ? 0 : async.hashCode()); - result = prime * result + ((contextBuilderClass == null) ? 0 : contextBuilderClass.hashCode()); - result = prime * result + ((credential == null) ? 0 : credential.hashCode()); - result = prime * result + ((endpoint == null) ? 0 : endpoint.hashCode()); - result = prime * result + ((identity == null) ? 0 : identity.hashCode()); - result = prime * result + ((propertiesBuilderClass == null) ? 0 : propertiesBuilderClass.hashCode()); - result = prime * result + ((provider == null) ? 0 : provider.hashCode()); - result = prime * result + ((sync == null) ? 0 : sync.hashCode()); - return result; - } - - @Override - public String toString() { - return "[provider=" + provider + ", endpoint=" + endpoint + ", apiVersion=" + apiVersion + ", identity=" - + identity + "]"; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ContextSpec other = (ContextSpec) obj; - if (apiVersion == null) { - if (other.apiVersion != null) - return false; - } else if (!apiVersion.equals(other.apiVersion)) - return false; - if (async == null) { - if (other.async != null) - return false; - } else if (!async.equals(other.async)) - return false; - if (contextBuilderClass == null) { - if (other.contextBuilderClass != null) - return false; - } else if (!contextBuilderClass.equals(other.contextBuilderClass)) - return false; - if (credential == null) { - if (other.credential != null) - return false; - } else if (!credential.equals(other.credential)) - return false; - if (endpoint == null) { - if (other.endpoint != null) - return false; - } else if (!endpoint.equals(other.endpoint)) - return false; - if (identity == null) { - if (other.identity != null) - return false; - } else if (!identity.equals(other.identity)) - return false; - if (propertiesBuilderClass == null) { - if (other.propertiesBuilderClass != null) - return false; - } else if (!propertiesBuilderClass.equals(other.propertiesBuilderClass)) - return false; - if (provider == null) { - if (other.provider != null) - return false; - } else if (!provider.equals(other.provider)) - return false; - if (sync == null) { - if (other.sync != null) - return false; - } else if (!sync.equals(other.sync)) - return false; - return true; - } + 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); } private final static Properties NO_PROPERTIES = new Properties(); @@ -300,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 @@ -318,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); } @@ -349,13 +229,13 @@ 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"); - ContextSpec contextSpec = createContextSpec(providerName, identity, credential, wiring, _overrides); + RestContextSpec contextSpec = createContextSpec(providerName, identity, credential, wiring, _overrides); return createContextBuilder(contextSpec, _overrides); } - public static Properties toProperties(ContextSpec contextSpec) { + public static Properties toProperties(RestContextSpec contextSpec) { checkNotNull(contextSpec, "contextSpec"); Properties props = new Properties(); @@ -368,37 +248,37 @@ public class RestContextFactory { 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 ContextSpec createContextSpec(String providerName, String identity, String credential, - Properties _overrides) { + public RestContextSpec createContextSpec(String providerName, String identity, String credential, + Properties _overrides) { return createContextSpec(providerName, identity, credential, EMPTY_LIST, _overrides); } @SuppressWarnings("unchecked") - public ContextSpec createContextSpec(String providerName, String identity, String credential, - Iterable wiring, Properties _overrides) { + public RestContextSpec createContextSpec(String providerName, String identity, String credential, + Iterable wiring, Properties _overrides) { checkNotNull(providerName, "providerName"); checkNotNull(_overrides, "overrides"); @@ -409,8 +289,8 @@ public class RestContextFactory { String endpoint = props.getProperty(providerName + ".endpoint", 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(modulesForProviderInProperties(providerName, props), wiring); @@ -429,8 +309,8 @@ public class RestContextFactory { assert false : "exception should have propogated " + e; return null; } - ContextSpec contextSpec = new ContextSpec(providerName, endpoint, apiVersion, identity, credential, - sync, async, propertiesBuilderClass, contextBuilderClass, modules); + RestContextSpec contextSpec = new RestContextSpec(providerName, endpoint, apiVersion, identity, + credential, sync, async, propertiesBuilderClass, contextBuilderClass, modules); return contextSpec; } @@ -440,7 +320,7 @@ public class RestContextFactory { else if (properties.containsKey(property + ".resource")) try { return toStringAndClose(RestContextFactory.class.getResourceAsStream(properties.getProperty(property - + ".resource"))); + + ".resource"))); } catch (IOException e) { throw new RuntimeException("error reading resource: " + properties.getProperty(property + ".resource")); } @@ -454,26 +334,26 @@ public class RestContextFactory { return credential; } - public static RestContextBuilder createContextBuilder(ContextSpec contextSpec) { + public static RestContextBuilder createContextBuilder(RestContextSpec contextSpec) { return createContextBuilder(contextSpec, NO_PROPERTIES); } @SuppressWarnings("unchecked") - public static RestContextBuilder createContextBuilder(ContextSpec contextSpec, - Properties overrides) { + public static RestContextBuilder createContextBuilder(RestContextSpec contextSpec, + Properties overrides) { return createContextBuilder(contextSpec, EMPTY_LIST, overrides); } - public static RestContextBuilder createContextBuilder(ContextSpec contextSpec, - Iterable modules) { + public static RestContextBuilder createContextBuilder(RestContextSpec contextSpec, + Iterable modules) { return createContextBuilder(contextSpec, modules, NO_PROPERTIES); } - public static RestContextBuilder createContextBuilder(ContextSpec contextSpec, - Iterable modules, Properties overrides) { + public static RestContextBuilder createContextBuilder(RestContextSpec contextSpec, + Iterable modules, Properties overrides) { try { PropertiesBuilder builder = contextSpec.propertiesBuilderClass.getConstructor(Properties.class).newInstance( - overrides); + overrides); builder.provider(contextSpec.provider); if (contextSpec.apiVersion != null) @@ -484,7 +364,7 @@ public class RestContextFactory { builder.endpoint(contextSpec.endpoint); RestContextBuilder contextBuilder = initContextBuilder(contextSpec.contextBuilderClass, - contextSpec.sync, contextSpec.async, builder.build()); + contextSpec.sync, contextSpec.async, builder.build()); contextBuilder.withModules(concat(modules, contextSpec.modules)); @@ -522,7 +402,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); } @@ -531,7 +411,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); } @@ -540,7 +420,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); } @@ -549,40 +429,40 @@ 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); } /** - * @see RestContextFactory#createContextBuilder(ContextSpec) + * @see RestContextFactory#createContextBuilder(RestContextSpec) */ - public static RestContext createContext(ContextSpec contextSpec) { + public static RestContext createContext(RestContextSpec contextSpec) { RestContextBuilder builder = createContextBuilder(contextSpec); return buildContextUnwrappingExceptions(builder); } /** - * @see RestContextFactory#createContextBuilder(ContextSpec, Properties) + * @see RestContextFactory#createContextBuilder(RestContextSpec, Properties) */ - public static RestContext createContext(ContextSpec contextSpec, Properties overrides) { + public static RestContext createContext(RestContextSpec contextSpec, Properties overrides) { RestContextBuilder builder = createContextBuilder(contextSpec, overrides); return buildContextUnwrappingExceptions(builder); } /** - * @see RestContextFactory#createContextBuilder(ContextSpec, Iterable) + * @see RestContextFactory#createContextBuilder(RestContextSpec, Iterable) */ - public static RestContext createContext(ContextSpec contextSpec, Iterable modules) { + public static RestContext createContext(RestContextSpec contextSpec, Iterable modules) { RestContextBuilder builder = createContextBuilder(contextSpec, modules); return buildContextUnwrappingExceptions(builder); } /** - * @see RestContextFactory#createContextBuilder(ContextSpec, Iterable, Properties) + * @see RestContextFactory#createContextBuilder(RestContextSpec, Iterable, Properties) */ - public static RestContext createContext(ContextSpec contextSpec, Iterable modules, - Properties overrides) { + public static RestContext createContext(RestContextSpec contextSpec, Iterable modules, + 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 new file mode 100644 index 0000000000..8d4f42b37b --- /dev/null +++ b/core/src/main/java/org/jclouds/rest/RestContextSpec.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.rest; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Collections.EMPTY_LIST; + +import org.jclouds.PropertiesBuilder; + +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableList; +import com.google.inject.Module; + +/** + * @author Adrian Cole + */ +public class RestContextSpec { + protected final String provider; + protected final String endpoint; + protected final String apiVersion; + protected final String identity; + protected final String credential; + protected final Class sync; + protected final Class async; + protected final Class propertiesBuilderClass; + 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) { + this.provider = checkNotNull(provider, "provider"); + this.endpoint = endpoint; + this.apiVersion = apiVersion; + this.identity = identity; + this.credential = credential; + this.sync = sync; + this.async = async; + checkArgument(RestContextBuilder.class.isAssignableFrom(contextBuilderClass), contextBuilderClass.getName() + + " is not a subclass of " + RestContextBuilder.class.getName()); + checkArgument(PropertiesBuilder.class.isAssignableFrom(propertiesBuilderClass), propertiesBuilderClass.getName() + + " is not a subclass of " + PropertiesBuilder.class.getName()); + this.propertiesBuilderClass = propertiesBuilderClass; + this.contextBuilderClass = contextBuilderClass; + this.modules = ImmutableList.copyOf(modules); + } + + @SuppressWarnings("unchecked") + 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); + } + + /** + * this uses the inefficient {@link Objects} implementation as the object count will be + * relatively small and therefore efficiency is not a concern. + */ + @Override + public int hashCode() { + return Objects.hashCode(provider, endpoint, apiVersion, identity, credential, sync, async, + propertiesBuilderClass, contextBuilderClass, modules); + } + + /** + * this uses the inefficient {@link Objects} implementation as the object count will be + * relatively small and therefore efficiency is not a concern. + */ + @Override + public boolean equals(Object that) { + if (that == null) + return false; + return Objects.equal(this.toString(), that.toString()); + } + + /** + * this uses the inefficient {@link Objects} implementation as the object count will be + * relatively small and therefore efficiency is not a concern. + */ + @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(); + } + +} \ No newline at end of file diff --git a/core/src/test/java/org/jclouds/http/BaseJettyTest.java b/core/src/test/java/org/jclouds/http/BaseJettyTest.java index 7f4711c34f..94878ff126 100644 --- a/core/src/test/java/org/jclouds/http/BaseJettyTest.java +++ b/core/src/test/java/org/jclouds/http/BaseJettyTest.java @@ -51,7 +51,7 @@ import org.jclouds.crypto.CryptoStreams; import org.jclouds.io.InputSuppliers; import org.jclouds.rest.RestContext; import org.jclouds.rest.RestContextBuilder; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Request; @@ -264,7 +264,7 @@ public abstract class BaseJettyTest { Properties properties, Module... connectionModules) { properties.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true"); properties.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true"); - ContextSpec contextSpec = contextSpec("test", + RestContextSpec contextSpec = contextSpec("test", "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 e6b8dd57d6..327e80d89a 100644 --- a/core/src/test/java/org/jclouds/rest/InputParamValidatorTest.java +++ b/core/src/test/java/org/jclouds/rest/InputParamValidatorTest.java @@ -33,7 +33,6 @@ import org.jclouds.concurrent.Timeout; import org.jclouds.http.IntegrationTestAsyncClient; import org.jclouds.http.IntegrationTestClient; import org.jclouds.predicates.validators.AllLowerCaseValidator; -import org.jclouds.rest.RestContextFactory.ContextSpec; import org.jclouds.rest.annotations.ParamValidators; import org.jclouds.rest.annotations.SkipEncoding; import org.jclouds.rest.internal.RestAnnotationProcessor; @@ -145,7 +144,7 @@ public class InputParamValidatorTest { @BeforeClass void setupFactory() { - ContextSpec contextSpec = contextSpec("test", + RestContextSpec contextSpec = contextSpec("test", "http://localhost:9999", "1", "userFoo", null, IntegrationTestClient.class, IntegrationTestAsyncClient.class); diff --git a/core/src/test/java/org/jclouds/rest/RestClientTest.java b/core/src/test/java/org/jclouds/rest/RestClientTest.java index 58392dbfc9..44f22d9beb 100644 --- a/core/src/test/java/org/jclouds/rest/RestClientTest.java +++ b/core/src/test/java/org/jclouds/rest/RestClientTest.java @@ -27,7 +27,6 @@ import java.util.Properties; import org.jclouds.http.HttpRequest; import org.jclouds.http.functions.ParseSax; import org.jclouds.logging.config.NullLoggingModule; -import org.jclouds.rest.RestContextFactory.ContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.BeforeClass; @@ -45,7 +44,7 @@ public abstract class RestClientTest extends BaseRestClientTest { protected abstract void checkFilters(HttpRequest request); - abstract public ContextSpec createContextSpec(); + abstract public RestContextSpec createContextSpec(); protected Module createModule() { return new Module() { @@ -60,7 +59,7 @@ public abstract class RestClientTest extends BaseRestClientTest { @BeforeClass protected void setupFactory() throws IOException { - ContextSpec contextSpec = createContextSpec(); + RestContextSpec contextSpec = createContextSpec(); injector = createContextBuilder(contextSpec, ImmutableSet.of(new MockModule(), new NullLoggingModule(), createModule()), getProperties()).buildInjector(); diff --git a/core/src/test/java/org/jclouds/rest/RestContextFactoryTest.java b/core/src/test/java/org/jclouds/rest/RestContextFactoryTest.java index 179f7ea596..63d71a4a78 100644 --- a/core/src/test/java/org/jclouds/rest/RestContextFactoryTest.java +++ b/core/src/test/java/org/jclouds/rest/RestContextFactoryTest.java @@ -34,7 +34,6 @@ import org.jclouds.PropertiesBuilder; import org.jclouds.http.IntegrationTestAsyncClient; import org.jclouds.http.IntegrationTestClient; import org.jclouds.http.RequiresHttp; -import org.jclouds.rest.RestContextFactory.ContextSpec; import org.jclouds.rest.config.RestClientModule; import org.testng.annotations.Test; @@ -54,14 +53,14 @@ public class RestContextFactoryTest { private static final String provider = "test"; public void testBuilder() { - ContextSpec contextSpec = contextSpec(provider, + RestContextSpec contextSpec = contextSpec(provider, "http://localhost", "1", "dummy", null, IntegrationTestClient.class, IntegrationTestAsyncClient.class); createContextBuilder(contextSpec); } public void testBuilderProperties() { - ContextSpec contextSpec = contextSpec(provider, + RestContextSpec contextSpec = contextSpec(provider, "http://localhost", "1", "dummy", null, IntegrationTestClient.class, IntegrationTestAsyncClient.class); Properties props = RestContextFactory.toProperties(contextSpec); @@ -79,7 +78,7 @@ public class RestContextFactoryTest { } public void testBuilderPropertiesWithCredential() { - ContextSpec contextSpec = contextSpec(provider, + RestContextSpec contextSpec = contextSpec(provider, "http://localhost", "1", "dummy", "credential", IntegrationTestClient.class, IntegrationTestAsyncClient.class); @@ -99,7 +98,7 @@ public class RestContextFactoryTest { @SuppressWarnings("unchecked") public void testBuilderPropertiesWithContextBuilder() { - ContextSpec contextSpec = contextSpec(provider, + RestContextSpec contextSpec = contextSpec(provider, "http://localhost", "1", "dummy", null, (Class) null, (Class) null, PropertiesBuilder.class, (Class) IntegrationTestContextBuilder.class, Collections.EMPTY_LIST); @@ -119,7 +118,7 @@ public class RestContextFactoryTest { @SuppressWarnings("unchecked") public void testBuilderPropertiesWithModule() { - ContextSpec contextSpec = contextSpec(provider, + RestContextSpec contextSpec = contextSpec(provider, "http://localhost", "1", "dummy", null, (Class) null, (Class) null, PropertiesBuilder.class, (Class) IntegrationTestContextBuilder.class, Collections. singleton(new A())); @@ -139,7 +138,7 @@ public class RestContextFactoryTest { @SuppressWarnings("unchecked") public void testBuilderPropertiesWithModules() { - ContextSpec contextSpec = contextSpec(provider, + RestContextSpec contextSpec = contextSpec(provider, "http://localhost", "1", "dummy", null, (Class) null, (Class) null, PropertiesBuilder.class, (Class) IntegrationTestContextBuilder.class, Arrays. asList(new A(), new B())); @@ -174,9 +173,9 @@ public class RestContextFactoryTest { @SuppressWarnings("hiding") @Override - public ContextSpec createContextSpec(String providerName, String identity, String credential, + public RestContextSpec createContextSpec(String providerName, String identity, String credential, Iterable wiring, Properties _overrides) { - ContextSpec spec = super.createContextSpec(providerName, identity, credential, wiring, _overrides); + RestContextSpec spec = super.createContextSpec(providerName, identity, credential, wiring, _overrides); assertEquals(spec.identity, "foo"); assertEquals(spec.credential, "bar"); assertEquals(Iterables.size(spec.modules), 2); @@ -206,9 +205,9 @@ public class RestContextFactoryTest { @SuppressWarnings("hiding") @Override - public ContextSpec createContextSpec(String providerName, String identity, String credential, + public RestContextSpec createContextSpec(String providerName, String identity, String credential, Iterable wiring, Properties _overrides) { - ContextSpec spec = super.createContextSpec(providerName, identity, credential, wiring, _overrides); + RestContextSpec spec = super.createContextSpec(providerName, identity, credential, wiring, _overrides); assertEquals(spec.identity, "foo"); assertEquals(spec.credential, "bar"); assertEquals(Iterables.size(spec.modules), 2); @@ -240,7 +239,7 @@ public class RestContextFactoryTest { @Test(expectedExceptions = IllegalArgumentException.class) public void testBuilderPropertiesWithWrongConfig() { @SuppressWarnings("unused") - ContextSpec contextSpec = contextSpec(provider, + RestContextSpec contextSpec = contextSpec(provider, "http://localhost", "1", "dummy", null, (Class) null, (Class) null, (Class) IntegrationTestContextBuilder.class, (Class) PropertiesBuilder.class, Collections.EMPTY_LIST); } 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 6b942b1dc5..7b2d4fa9f0 100755 --- a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java +++ b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java @@ -108,7 +108,7 @@ import org.jclouds.logging.config.NullLoggingModule; import org.jclouds.rest.BaseRestClientTest; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.InvocationContext; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.annotations.BinderParam; import org.jclouds.rest.annotations.Delegate; import org.jclouds.rest.annotations.Endpoint; @@ -278,7 +278,7 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest { private Injector injectorForClient() { - ContextSpec contextSpec = contextSpec("test", "http://localhost:9999", "1", "userfoo", null, + RestContextSpec contextSpec = contextSpec("test", "http://localhost:9999", "1", "userfoo", null, Caller.class, AsyncCaller.class, ImmutableSet. of(new MockModule(), new NullLoggingModule(), new CallerCalleeModule())); @@ -2081,7 +2081,7 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest { @BeforeClass void setupFactory() { - ContextSpec contextSpec = contextSpec("test", "http://localhost:9999", "1", "userfoo", null, + RestContextSpec contextSpec = contextSpec("test", "http://localhost:9999", "1", "userfoo", null, String.class, Integer.class, ImmutableSet. of(new MockModule(), new NullLoggingModule(), new AbstractModule() { diff --git a/gogrid/src/test/java/org/jclouds/gogrid/services/BaseGoGridAsyncClientTest.java b/gogrid/src/test/java/org/jclouds/gogrid/services/BaseGoGridAsyncClientTest.java index 3a22535321..a1df9e142b 100644 --- a/gogrid/src/test/java/org/jclouds/gogrid/services/BaseGoGridAsyncClientTest.java +++ b/gogrid/src/test/java/org/jclouds/gogrid/services/BaseGoGridAsyncClientTest.java @@ -31,7 +31,7 @@ import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import com.google.common.base.Supplier; import com.google.inject.Module; @@ -67,7 +67,7 @@ public abstract class BaseGoGridAsyncClientTest extends RestClientTest { } @Override - public ContextSpec createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("gogrid", "foo", "bar", new Properties()); } diff --git a/rackspace/src/test/java/org/jclouds/rackspace/RackspaceAuthAsyncClientTest.java b/rackspace/src/test/java/org/jclouds/rackspace/RackspaceAuthAsyncClientTest.java index 1142ed9e21..b1ab128f4b 100755 --- a/rackspace/src/test/java/org/jclouds/rackspace/RackspaceAuthAsyncClientTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/RackspaceAuthAsyncClientTest.java @@ -30,7 +30,7 @@ import org.jclouds.http.HttpRequest; import org.jclouds.rackspace.RackspaceAuthAsyncClient.AuthenticationResponse; import org.jclouds.rackspace.functions.ParseAuthenticationResponseFromHeaders; import org.jclouds.rest.RestClientTest; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.Test; @@ -60,7 +60,7 @@ public class RackspaceAuthAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return contextSpec("test", "http://localhost:8080", "1", "identity", "credential", RackspaceAuthClient.class, RackspaceAuthAsyncClient.class); } diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesBlobRequestSignerTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesBlobRequestSignerTest.java index 6ff04d956b..704853ce62 100644 --- a/rackspace/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesBlobRequestSignerTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudfiles/blobstore/CloudFilesBlobRequestSignerTest.java @@ -33,7 +33,7 @@ import org.jclouds.rackspace.cloudfiles.config.CloudFilesRestClientModule; import org.jclouds.rackspace.cloudservers.TestRackspaceAuthenticationRestClientModule; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -110,7 +110,7 @@ public class CloudFilesBlobRequestSignerTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("cloudfiles", "identity", "credential", new Properties()); } diff --git a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/CloudServersAsyncClientTest.java b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/CloudServersAsyncClientTest.java index 6659eec176..03776e66d5 100755 --- a/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/CloudServersAsyncClientTest.java +++ b/rackspace/src/test/java/org/jclouds/rackspace/cloudservers/CloudServersAsyncClientTest.java @@ -54,7 +54,7 @@ import org.jclouds.rackspace.filters.AddTimestampQuery; import org.jclouds.rackspace.filters.AuthenticateRequest; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions; import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; import org.jclouds.rest.functions.ReturnFalseOnNotFoundOr404; @@ -863,7 +863,7 @@ public class CloudServersAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("cloudservers", "user", "password", new Properties()); } diff --git a/rimuhosting/src/test/java/org/jclouds/rimuhosting/miro/RimuHostingAsyncClientTest.java b/rimuhosting/src/test/java/org/jclouds/rimuhosting/miro/RimuHostingAsyncClientTest.java index 558a986ee9..919e2fe870 100644 --- a/rimuhosting/src/test/java/org/jclouds/rimuhosting/miro/RimuHostingAsyncClientTest.java +++ b/rimuhosting/src/test/java/org/jclouds/rimuhosting/miro/RimuHostingAsyncClientTest.java @@ -29,7 +29,7 @@ import org.jclouds.http.HttpRequest; import org.jclouds.http.functions.UnwrapOnlyJsonValue; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.rimuhosting.miro.binder.CreateServerOptions; @@ -80,7 +80,7 @@ public class RimuHostingAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("rimuhosting", "apikey", "null", new Properties()); } } diff --git a/sandbox/libvirt/README.txt b/sandbox/libvirt/README.txt new file mode 100644 index 0000000000..a6c9289a57 --- /dev/null +++ b/sandbox/libvirt/README.txt @@ -0,0 +1,2 @@ +install libvirt on your os + * if os/x, see http://github.com/justinclift/libvirt diff --git a/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilderTest.java b/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilderTest.java index dba6e22333..e9c1ad1606 100644 --- a/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilderTest.java +++ b/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilderTest.java @@ -1,5 +1,6 @@ package org.jclouds.libvirt.compute; +import static org.easymock.classextension.EasyMock.createMock; import static org.testng.Assert.assertNotNull; import java.net.URI; @@ -7,7 +8,7 @@ import java.util.Properties; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeServiceContextFactory; -import org.jclouds.compute.config.StandaloneComputeServiceContextModule; +import org.jclouds.compute.StandaloneComputeServiceContextSpec; import org.jclouds.libvirt.Datacenter; import org.jclouds.libvirt.Hardware; import org.jclouds.libvirt.Image; @@ -17,6 +18,9 @@ import org.libvirt.Domain; import org.libvirt.LibvirtException; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + /** * * @author Adrian Cole @@ -24,39 +28,26 @@ import org.testng.annotations.Test; */ @Test(groups = "unit") public class LibvirtComputeServiceContextBuilderTest { -// -// @Test -// public void testCreateContextModule() { -// assertNotNull(new LibvirtComputeServiceContextBuilder(new Properties()).createContextModule()); -// } -// -// @Test -// public void testCanBuildDirectly() { -// ComputeServiceContext context = new LibvirtComputeServiceContextBuilder(new Properties()) { -// -// @Override -// public StandaloneComputeServiceContextModule createContextModule() { -// return new StubLibvirtComputeServiceContextModule(); -// } -// -// }.buildComputeServiceContext(); -// context.close(); -// } -// -// @Test -// public void testCanBuildWithComputeService() { -// ComputeServiceContext context = ComputeServiceContextFactory -// .createStandaloneContext(new StubLibvirtComputeServiceContextModule()); -// context.close(); -// -// } + + @Test + public void testCreateContextModule() { + assertNotNull(new LibvirtComputeServiceContextBuilder(new Properties()).createContextModule()); + } + + @Test + public void testCanBuildWithComputeService() { + ComputeServiceContext context = new ComputeServiceContextFactory() + .createContext(new StandaloneComputeServiceContextSpec("libvirt", + "stub", "1", "identity", "credential", new StubLibvirtComputeServiceContextModule(), ImmutableSet + . of())); + context.close(); + } private static class StubLibvirtComputeServiceContextModule extends LibvirtComputeServiceContextModule { @Override protected Connect createConnection(URI endpoint, String identity, String credential) throws LibvirtException { - // TODO replace with mock - return null; + return createMock(Connect.class); } } diff --git a/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilderTest.java b/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilderTest.java index 5c45742b6c..2538a36a72 100644 --- a/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilderTest.java +++ b/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerComputeServiceContextBuilderTest.java @@ -6,8 +6,16 @@ import java.util.Properties; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.compute.StandaloneComputeServiceContextSpec; +import org.jclouds.servermanager.Datacenter; +import org.jclouds.servermanager.Hardware; +import org.jclouds.servermanager.Image; +import org.jclouds.servermanager.Server; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + /** * * @author Adrian Cole @@ -30,8 +38,11 @@ public class ServerManagerComputeServiceContextBuilderTest { @Test public void testCanBuildWithComputeService() { - ComputeServiceContext context = ComputeServiceContextFactory - .createStandaloneContext(ServerManagerComputeServiceContextBuilder.createContextModule()); + ComputeServiceContext context = new ComputeServiceContextFactory() + .createContext(new StandaloneComputeServiceContextSpec( + "servermanager", "http://host", "1", "identity", "credential", + ServerManagerComputeServiceContextBuilder.createContextModule(), ImmutableSet. of())); + context.close(); } diff --git a/slicehost/src/test/java/org/jclouds/slicehost/SlicehostAsyncClientTest.java b/slicehost/src/test/java/org/jclouds/slicehost/SlicehostAsyncClientTest.java index c86d980d2e..51cfb064c5 100644 --- a/slicehost/src/test/java/org/jclouds/slicehost/SlicehostAsyncClientTest.java +++ b/slicehost/src/test/java/org/jclouds/slicehost/SlicehostAsyncClientTest.java @@ -30,7 +30,7 @@ import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ReleasePayloadAndReturn; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.internal.RestAnnotationProcessor; @@ -252,7 +252,7 @@ public class SlicehostAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("slicehost", "apikey", null, new Properties()); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java index 494bfdb857..a5b1707481 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java @@ -45,7 +45,7 @@ import org.jclouds.http.functions.ReturnInputStream; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; @@ -809,7 +809,7 @@ public class VCloudAsyncClientTest extends RestClientTest { } @Override - public ContextSpec createContextSpec() { + public RestContextSpec createContextSpec() { Properties overrides = new Properties(); overrides.setProperty("vcloud.endpoint", "https://vcenterprise.bluelock.com/api/v1.0"); return new RestContextFactory().createContextSpec("vcloud", "identity", "credential", overrides); diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java index 1236cb64e1..783427decb 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java @@ -43,7 +43,7 @@ import org.jclouds.http.functions.ReleasePayloadAndReturn; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.rest.internal.RestAnnotationProcessor; @@ -637,7 +637,7 @@ public class VCloudExpressAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { Properties overrides = new Properties(); overrides.setProperty("vcloudexpress.endpoint", "https://vcloud.safesecureweb.com/api/v0.8"); return new RestContextFactory().createContextSpec("vcloudexpress", "identity", "credential", overrides); diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java index 61dc5ece55..be429290f6 100755 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java @@ -33,7 +33,7 @@ import org.jclouds.concurrent.Timeout; import org.jclouds.http.HttpRequest; import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.rest.RestClientTest; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.annotations.Provider; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.vcloud.domain.VCloudSession; @@ -109,7 +109,7 @@ public class VCloudLoginAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return contextSpec("test", "http://localhost:8080/login", "1", "identity", "credential", VCloudLoginClient.class, VCloudExpressLoginAsyncClient.class); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java index 4f190d5f46..c81a834d3d 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java @@ -32,7 +32,7 @@ import org.jclouds.concurrent.Timeout; import org.jclouds.http.HttpRequest; import org.jclouds.http.functions.ParseSax; import org.jclouds.rest.RestClientTest; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.vcloud.xml.SupportedVersionsHandler; import org.testng.annotations.Test; @@ -82,7 +82,7 @@ public class VCloudVersionsAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return contextSpec("test", "http://localhost:8080", "1", "identity", "credential", VCloudVersionsClient.class, VCloudVersionsAsyncClient.class); } diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java index 167f28a44e..3aadb4eea9 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java @@ -42,7 +42,7 @@ import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; @@ -493,7 +493,7 @@ public class TerremarkECloudAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("trmk-vcloudexpress", "identity", "credential", new Properties()); } diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java index 06e58b4632..6adc67405b 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java @@ -42,7 +42,7 @@ import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.RestContextSpec; import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; @@ -595,7 +595,7 @@ public class TerremarkVCloudExpressAsyncClientTest extends RestClientTest createContextSpec() { + public RestContextSpec createContextSpec() { return new RestContextFactory().createContextSpec("trmk-vcloudexpress", "identity", "credential", new Properties()); } From 2291c42b45b78de1f85e8890b5c887b991330d4c Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 24 Oct 2010 23:51:39 -0500 Subject: [PATCH 16/17] Issue 382: stubbed out live testing for libvirt --- sandbox/libvirt/pom.xml | 7 +- .../java/org/jclouds/libvirt/Hardware.java | 63 ---------------- .../LibvirtComputeServiceContextBuilder.java | 3 +- .../LibvirtComputeServiceContextModule.java | 12 +-- ...eToHardware.java => DomainToHardware.java} | 34 ++++++--- .../functions/DomainToNodeMetadata.java | 74 +++++++++---------- .../LibvirtComputeServiceAdapter.java | 51 +++++++++---- ...bvirtComputeServiceContextBuilderTest.java | 20 +---- .../compute/LibvirtExperimentLiveTest.java | 74 +++++++++++++++++++ .../ServerManagerExperimentLiveTest.java | 74 +++++++++++++++++++ 10 files changed, 262 insertions(+), 150 deletions(-) delete mode 100644 sandbox/libvirt/src/main/java/org/jclouds/libvirt/Hardware.java rename sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/{LibvirtHardwareToHardware.java => DomainToHardware.java} (59%) create mode 100644 sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtExperimentLiveTest.java create mode 100644 skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerExperimentLiveTest.java diff --git a/sandbox/libvirt/pom.xml b/sandbox/libvirt/pom.xml index 4d1b3d36c0..a8aec9a1d6 100644 --- a/sandbox/libvirt/pom.xml +++ b/sandbox/libvirt/pom.xml @@ -33,9 +33,10 @@ trmkrun-ccc,test.trmk-924 - https://libvirt.com + test:///default 1.0 FIXME + FIXME @@ -117,6 +118,10 @@ test.libvirt.identity ${test.libvirt.identity} + + test.libvirt.credential + ${test.libvirt.credential} + jclouds.compute.blacklist.nodes ${jclouds.compute.blacklist.nodes} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Hardware.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Hardware.java deleted file mode 100644 index 96709a2626..0000000000 --- a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/Hardware.java +++ /dev/null @@ -1,63 +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.libvirt; - -import com.google.common.base.Objects; - -/** - * This would be replaced with the real java object related to the underlying hardware - * - * @author Adrian Cole - */ -public class Hardware { - - public int id; - public String name; - public int cores; - public int ram; - public float disk; - - public Hardware(int id, String name, int cores, int ram, float disk) { - this.id = id; - this.name = name; - this.cores = cores; - this.ram = ram; - this.disk = disk; - } - - @Override - public int hashCode() { - return Objects.hashCode(id, name, cores, ram, disk); - } - - @Override - public boolean equals(Object that) { - if (that == null) - return false; - return Objects.equal(this.toString(), that.toString()); - } - - @Override - public String toString() { - return Objects.toStringHelper(this).add("id", id).add("name", name).add("cores", cores).add("ram", ram) - .add("disk", disk).toString(); - } - -} diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilder.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilder.java index b6832a0343..49c9021c36 100644 --- a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilder.java +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/LibvirtComputeServiceContextBuilder.java @@ -25,7 +25,6 @@ import java.util.Properties; import org.jclouds.compute.StandaloneComputeServiceContextBuilder; import org.jclouds.compute.config.StandaloneComputeServiceContextModule; import org.jclouds.libvirt.Datacenter; -import org.jclouds.libvirt.Hardware; import org.jclouds.libvirt.Image; import org.jclouds.libvirt.compute.domain.LibvirtComputeServiceContextModule; import org.libvirt.Domain; @@ -47,7 +46,7 @@ public class LibvirtComputeServiceContextBuilder extends StandaloneComputeServic modules.add(createContextModule()); } - public StandaloneComputeServiceContextModule createContextModule() { + public StandaloneComputeServiceContextModule createContextModule() { return new LibvirtComputeServiceContextModule(); } diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/domain/LibvirtComputeServiceContextModule.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/domain/LibvirtComputeServiceContextModule.java index 1a9e256465..7c53514e75 100644 --- a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/domain/LibvirtComputeServiceContextModule.java +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/domain/LibvirtComputeServiceContextModule.java @@ -27,15 +27,15 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.config.StandaloneComputeServiceContextModule; +import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.suppliers.DefaultLocationSupplier; import org.jclouds.domain.Location; import org.jclouds.libvirt.Datacenter; -import org.jclouds.libvirt.Hardware; import org.jclouds.libvirt.Image; import org.jclouds.libvirt.compute.functions.DatacenterToLocation; +import org.jclouds.libvirt.compute.functions.DomainToHardware; import org.jclouds.libvirt.compute.functions.DomainToNodeMetadata; -import org.jclouds.libvirt.compute.functions.LibvirtHardwareToHardware; import org.jclouds.libvirt.compute.functions.LibvirtImageToImage; import org.jclouds.libvirt.compute.strategy.LibvirtComputeServiceAdapter; import org.jclouds.rest.annotations.Provider; @@ -53,11 +53,11 @@ import com.google.inject.TypeLiteral; * @author Adrian Cole */ public class LibvirtComputeServiceContextModule extends - StandaloneComputeServiceContextModule { + StandaloneComputeServiceContextModule { @Override protected void configure() { super.configure(); - bind(new TypeLiteral>() { + bind(new TypeLiteral>() { }).to(LibvirtComputeServiceAdapter.class); bind(new TypeLiteral>() { }).to(DefaultLocationSupplier.class); @@ -65,8 +65,8 @@ public class LibvirtComputeServiceContextModule extends }).to(DomainToNodeMetadata.class); bind(new TypeLiteral>() { }).to(LibvirtImageToImage.class); - bind(new TypeLiteral>() { - }).to(LibvirtHardwareToHardware.class); + bind(new TypeLiteral>() { + }).to(DomainToHardware.class); bind(new TypeLiteral>() { }).to(DatacenterToLocation.class); } diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtHardwareToHardware.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToHardware.java similarity index 59% rename from sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtHardwareToHardware.java rename to sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToHardware.java index b913efe545..1fa132c22b 100644 --- a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/LibvirtHardwareToHardware.java +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToHardware.java @@ -19,31 +19,45 @@ package org.jclouds.libvirt.compute.functions; +import java.util.List; + import javax.inject.Singleton; 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.internal.VolumeImpl; +import org.libvirt.Domain; +import org.libvirt.LibvirtException; import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; /** * @author Adrian Cole */ @Singleton -public class LibvirtHardwareToHardware implements Function { +public class DomainToHardware implements Function { @Override - public Hardware apply(org.jclouds.libvirt.Hardware from) { + public Hardware apply(Domain from) { HardwareBuilder builder = new HardwareBuilder(); - builder.ids(from.id + ""); - builder.name(from.name); - builder.processors(ImmutableList.of(new Processor(from.cores, 1.0))); - builder.ram(from.ram); - builder.volumes(ImmutableList. of(new VolumeImpl(from.disk, true, false))); + try { + builder.id(from.getUUIDString()); + + builder.providerId(from.getID() + ""); + builder.name(from.getName()); + List processors = Lists.newArrayList(); + for (int i = 0; i < from.getInfo().nrVirtCpu; i++) { + processors.add(new Processor(i + 1, 1)); + } + builder.processors(processors); + + builder.ram((int) from.getInfo().maxMem); + // TODO volumes + } catch (LibvirtException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } return builder.build(); } diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java index 58a6a44417..98907bdfb7 100644 --- a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/functions/DomainToNodeMetadata.java @@ -35,14 +35,16 @@ import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.domain.OperatingSystemBuilder; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.libvirt.Domain; +import org.libvirt.DomainInfo; +import org.libvirt.LibvirtException; import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; /** * @author Adrian Cole @@ -50,20 +52,25 @@ import com.google.common.collect.ImmutableSet; @Singleton public class DomainToNodeMetadata implements Function { - // public static final Map serverStatusToNodeState = ImmutableMap - // . builder().put(Domain.Status.ACTIVE, NodeState.RUNNING)// - // .put(Domain.Status.BUILD, NodeState.PENDING)// - // .put(Domain.Status.TERMINATED, NodeState.TERMINATED)// - // .put(Domain.Status.UNRECOGNIZED, NodeState.UNRECOGNIZED)// - // .build(); + public static final Map domainStateToNodeState = ImmutableMap + . builder() + .put(DomainInfo.DomainState.VIR_DOMAIN_RUNNING, NodeState.RUNNING)// + .put(DomainInfo.DomainState.VIR_DOMAIN_BLOCKED, NodeState.PENDING)// + .put(DomainInfo.DomainState.VIR_DOMAIN_PAUSED, NodeState.SUSPENDED)// + .put(DomainInfo.DomainState.VIR_DOMAIN_SHUTDOWN, NodeState.SUSPENDED)// + .put(DomainInfo.DomainState.VIR_DOMAIN_SHUTOFF, NodeState.SUSPENDED)// + .put(DomainInfo.DomainState.VIR_DOMAIN_CRASHED, NodeState.ERROR)// - private final FindHardwareForDomain findHardwareForDomain; + .put(DomainInfo.DomainState.VIR_DOMAIN_NOSTATE, NodeState.UNRECOGNIZED)// + .build(); + + private final Function findHardwareForDomain; private final FindLocationForDomain findLocationForDomain; private final FindImageForDomain findImageForDomain; private final Map credentialStore; @Inject - DomainToNodeMetadata(Map credentialStore, FindHardwareForDomain findHardwareForDomain, + DomainToNodeMetadata(Map credentialStore, Function findHardwareForDomain, FindLocationForDomain findLocationForDomain, FindImageForDomain findImageForDomain) { this.credentialStore = checkNotNull(credentialStore, "credentialStore"); this.findHardwareForDomain = checkNotNull(findHardwareForDomain, "findHardwareForDomain"); @@ -73,40 +80,31 @@ public class DomainToNodeMetadata implements Function { @Override public NodeMetadata apply(Domain from) { + // convert the result object to a jclouds NodeMetadata NodeMetadataBuilder builder = new NodeMetadataBuilder(); - // builder.ids(from.id + ""); - // builder.name(from.name); - // builder.location(findLocationForDomain.apply(from)); - // builder.tag(parseTagFromName(from.name)); - // builder.imageId(from.imageId + ""); - // Image image = findImageForDomain.apply(from); - // if (image != null) - // builder.operatingSystem(image.getOperatingSystem()); - // builder.hardware(findHardwareForDomain.apply(from)); - // builder.state(serverStatusToNodeState.get(from.status)); - // builder.publicAddresses(ImmutableSet. of(from.publicAddress)); - // builder.privateAddresses(ImmutableSet. of(from.privateAddress)); - // builder.credentials(credentialStore.get(from.id + "")); + try { + builder.id(from.getUUIDString()); + builder.providerId(from.getID() + ""); + builder.name(from.getName()); + builder.location(findLocationForDomain.apply(from)); + builder.tag(parseTagFromName(from.getName())); + + builder.operatingSystem(new OperatingSystemBuilder().description(from.getOSType()).build()); + builder.hardware(findHardwareForDomain.apply(from)); + + builder.state(domainStateToNodeState.get(from.getInfo().state)); + // builder.publicAddresses(ImmutableSet. of(from.publicAddress)); + // builder.privateAddresses(ImmutableSet. of(from.privateAddress)); + builder.credentials(credentialStore.get(from.getUUIDString())); + + } catch (LibvirtException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } return builder.build(); } - @Singleton - public static class FindHardwareForDomain extends FindResourceInSet { - - @Inject - public FindHardwareForDomain(@Memoized Supplier> hardware) { - super(hardware); - } - - @Override - public boolean matches(Domain from, Hardware input) { - // TODO - // return input.getProviderId().equals(from.hardwareId + ""); - return true; - } - } - @Singleton public static class FindImageForDomain extends FindResourceInSet { diff --git a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java index 1a2c9049eb..3c140283a3 100644 --- a/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java +++ b/sandbox/libvirt/src/main/java/org/jclouds/libvirt/compute/strategy/LibvirtComputeServiceAdapter.java @@ -2,6 +2,7 @@ package org.jclouds.libvirt.compute.strategy; import static com.google.common.base.Preconditions.checkNotNull; +import java.util.List; import java.util.Map; import javax.inject.Inject; @@ -12,13 +13,15 @@ import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.domain.Template; import org.jclouds.domain.Credentials; import org.jclouds.libvirt.Datacenter; -import org.jclouds.libvirt.Hardware; import org.jclouds.libvirt.Image; import org.libvirt.Connect; import org.libvirt.Domain; +import org.libvirt.LibvirtException; import org.libvirt.jna.Libvirt; +import com.google.common.base.Throwables; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; /** * defines the connection between the {@link Libvirt} implementation and the jclouds @@ -26,7 +29,7 @@ import com.google.common.collect.ImmutableSet; * */ @Singleton -public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter { +public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter { private final Connect client; @Inject @@ -47,10 +50,8 @@ public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter listHardware() { - return ImmutableSet.of(); - // TODO - // return client.listHardware(); + public Iterable listHardware() { + return listNodes(); } @Override @@ -62,9 +63,21 @@ public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter listNodes() { - return ImmutableSet.of(); - // TODO - // return client.listDomains(); + try { + List domains = Lists.newArrayList(); + for (int domain : client.listDomains()) { + domains.add(client.domainLookupByID(domain)); + } + return domains; + } catch (LibvirtException e) { + return propogate(e); + } + } + + protected T propogate(LibvirtException e) { + Throwables.propagate(e); + assert false; + return null; } @Override @@ -74,18 +87,28 @@ public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter("libvirt", - "stub", "1", "identity", "credential", new StubLibvirtComputeServiceContextModule(), ImmutableSet - . of())); + .createContext(new StandaloneComputeServiceContextSpec("libvirt", + "test:///default", "1", "identity", "credential", new LibvirtComputeServiceContextModule(), + ImmutableSet. of())); + System.err.println(context.getComputeService().listNodes()); context.close(); } - private static class StubLibvirtComputeServiceContextModule extends LibvirtComputeServiceContextModule { - - @Override - protected Connect createConnection(URI endpoint, String identity, String credential) throws LibvirtException { - return createMock(Connect.class); - } - - } } diff --git a/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtExperimentLiveTest.java b/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtExperimentLiveTest.java new file mode 100644 index 0000000000..56618b5e6b --- /dev/null +++ b/sandbox/libvirt/src/test/java/org/jclouds/libvirt/compute/LibvirtExperimentLiveTest.java @@ -0,0 +1,74 @@ +/** + * + * 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.libvirt.compute; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.compute.StandaloneComputeServiceContextSpec; +import org.jclouds.libvirt.Datacenter; +import org.jclouds.libvirt.Image; +import org.jclouds.libvirt.compute.domain.LibvirtComputeServiceContextModule; +import org.libvirt.Domain; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + +/** + * + * @author Adrian Cole + */ +@Test(groups = "live", testName = "libvirt.LibvirtExperimentLiveTest") +public class LibvirtExperimentLiveTest { + protected String provider = "libvirt"; + 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"); + } + + @Test + public void testAndExperiment() { + ComputeServiceContext context = null; + try { + context = new ComputeServiceContextFactory() + .createContext(new StandaloneComputeServiceContextSpec("libvirt", + endpoint, apiversion, identity, credential, new LibvirtComputeServiceContextModule(), ImmutableSet + . of())); + + context.getComputeService().listNodes(); + + } finally { + if (context != null) + context.close(); + } + } + +} \ No newline at end of file diff --git a/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerExperimentLiveTest.java b/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerExperimentLiveTest.java new file mode 100644 index 0000000000..fa3716e3da --- /dev/null +++ b/skeletons/standalone-compute/src/test/java/org/jclouds/servermanager/compute/ServerManagerExperimentLiveTest.java @@ -0,0 +1,74 @@ +/** + * + * 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.servermanager.compute; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.compute.StandaloneComputeServiceContextSpec; +import org.jclouds.servermanager.Datacenter; +import org.jclouds.servermanager.Hardware; +import org.jclouds.servermanager.Image; +import org.jclouds.servermanager.Server; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + +/** + * + * @author Adrian Cole + */ +@Test(groups = "live", testName = "servermanager.ServerManagerExperimentLiveTest") +public class ServerManagerExperimentLiveTest { + protected String provider = "servermanager"; + 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"); + } + + @Test + public void testAndExperiment() { + ComputeServiceContext context = null; + try { + context = new ComputeServiceContextFactory() + .createContext(new StandaloneComputeServiceContextSpec( + "servermanager", endpoint, apiversion, identity, credential, + ServerManagerComputeServiceContextBuilder.createContextModule(), ImmutableSet. of())); + + context.getComputeService().listNodes(); + + } finally { + if (context != null) + context.close(); + } + } + +} \ No newline at end of file From e5315d3348119321414dc4562bf3794d462cf14e Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 25 Oct 2010 15:19:46 -0500 Subject: [PATCH 17/17] Issue 385: started on javadoc and renamed methods to correspond to jclouds compute service --- .../src/main/clojure/org/jclouds/modules.clj | 4 +- .../compute/ComputeServiceAdapter.java | 50 ++++++++++++++++++- .../JCloudsNativeComputeServiceAdapter.java | 28 ++++++++++- ...StandaloneComputeServiceContextModule.java | 2 +- .../AdaptingComputeServiceStrategies.java | 2 +- .../config/StubComputeServiceAdapter.java | 4 +- .../ServerManagerComputeServiceAdapter.java | 4 +- 7 files changed, 82 insertions(+), 12 deletions(-) diff --git a/compute/src/main/clojure/org/jclouds/modules.clj b/compute/src/main/clojure/org/jclouds/modules.clj index b8e1c3ba9a..d7f3aa1140 100644 --- a/compute/src/main/clojure/org/jclouds/modules.clj +++ b/compute/src/main/clojure/org/jclouds/modules.clj @@ -36,13 +36,13 @@ (org.jclouds.compute.config.JCloudsNativeStandaloneComputeServiceContextModule (defrecord ClojureComputeServiceAdapter [] org.jclouds.compute.JCloudsNativeComputeServiceAdapter - (^NodeMetadata createNodeAndStoreCredentials [this ^String tag ^String name ^Template template ^Map credentialStore] + (^NodeMetadata runNodeWithTagAndNameAndStoreCredentials [this ^String tag ^String name ^Template template ^Map credentialStore] ()) (^Iterable listNodes [this ] ()) (^Iterable listImages [this ] ()) - (^Iterable listHardware [this ] + (^Iterable listHardwareProfiles [this ] ()) (^Iterable listLocations [this ] ()) diff --git a/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java b/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java index 21270fff0d..82d80c1f62 100644 --- a/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java +++ b/compute/src/main/java/org/jclouds/compute/ComputeServiceAdapter.java @@ -32,10 +32,56 @@ import org.jclouds.domain.Credentials; * */ public interface ComputeServiceAdapter { - N createNodeAndStoreCredentials(String tag, String name, Template template, Map credentialStore); - Iterable listHardware(); + /** + * {@link ComputeService#runNodesWithTag(String, int, Template)} generates the parameters passed + * into this method such that each node in the set has a unique name. + *

+ * Your responsibility is to create a node with the underlying library and return after storing + * its credentials in the supplied map. + *

+ * Note that it is intentional to return the library native node object, as generic type + * {@code N}. If you are not using library-native objects (such as libvirt {@code Domain}) use + * {@link JCloudsNativeComputeServiceAdapter} instead. + * + * @param tag + * used to aggregate nodes with identical configuration + * @param name + * unique supplied name for the node, which has the tag encoded into it. + * @param template + * includes {@code imageId}, {@code locationId}, and {@code hardwareId} used to start + * the instance. + * @param credentialStore + * once the node is started, its login user and password will be encoded based on the + * node {@code id} + * @return library-native representation of a node. + * + * @see ComputeService#runNodesWithTag(String, int, Template) + */ + N runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, + Map credentialStore); + /** + * Hardware profiles describe available cpu, memory, and disk configurations that can be used to + * run a node. + *

+ * To implement this method, return the library native hardware profiles available to the user. + * These will be used to launch nodes as a part of the template. + * + * @return a non-null iterable of available hardware profiles. + * @see ComputeService#listHardwareProfiles() + */ + Iterable listHardwareProfiles(); + + /** + * Images are the available configured operating systems that someone can run a node with. * + *

+ * To implement this method, return the library native images available to the user. These will + * be used to launch nodes as a part of the template. + * + * @return a non-null iterable of available images. + * @see ComputeService#listImages() + */ Iterable listImages(); Iterable listLocations(); diff --git a/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java b/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java index d24a5842b6..dfa70466ab 100644 --- a/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java +++ b/compute/src/main/java/org/jclouds/compute/JCloudsNativeComputeServiceAdapter.java @@ -36,28 +36,52 @@ import org.jclouds.domain.Location; */ public interface JCloudsNativeComputeServiceAdapter extends ComputeServiceAdapter { + /** + * {@inheritDoc} + */ @Override - NodeMetadata createNodeAndStoreCredentials(String tag, String name, Template template, + NodeMetadata runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, Map credentialStore); + /** + * {@inheritDoc} + */ @Override Iterable listNodes(); + /** + * {@inheritDoc} + */ @Override Iterable listImages(); + /** + * {@inheritDoc} + */ @Override - Iterable listHardware(); + Iterable listHardwareProfiles(); + /** + * {@inheritDoc} + */ @Override Iterable listLocations(); + /** + * {@inheritDoc} + */ @Override NodeMetadata getNode(String id); + /** + * {@inheritDoc} + */ @Override void destroyNode(String id); + /** + * {@inheritDoc} + */ @Override void rebootNode(String id); diff --git a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java index f924e8e62c..04b17ba9e0 100644 --- a/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java +++ b/compute/src/main/java/org/jclouds/compute/config/StandaloneComputeServiceContextModule.java @@ -87,7 +87,7 @@ public class StandaloneComputeServiceContextModule extends BaseCompu @Override public Iterable get() { - return adapter.listHardware(); + return adapter.listHardwareProfiles(); } }, transformer); 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 006bb771c0..c819bfd317 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 @@ -127,7 +127,7 @@ public class AdaptingComputeServiceStrategies implements AddNodeWith template.getLocation().getId(), name, template.getImage().getProviderId(), template.getHardware() .getProviderId()); - N from = client.createNodeAndStoreCredentials(tag, name, template, credentialStore); + N from = client.runNodeWithTagAndNameAndStoreCredentials(tag, name, template, credentialStore); NodeMetadata node = nodeMetadataAdapter.apply(from); logger.debug("<< instantiated node(%s)", node.getId()); return node; 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 91342b1208..27d53921d4 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 @@ -76,7 +76,7 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda } @Override - public NodeMetadata createNodeAndStoreCredentials(String tag, String name, Template template, + public NodeMetadata runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, Map credentialStore) { NodeMetadataBuilder builder = new NodeMetadataBuilder(); String id = idProvider.get() + ""; @@ -98,7 +98,7 @@ public class StubComputeServiceAdapter implements JCloudsNativeComputeServiceAda } @Override - public Iterable listHardware() { + public Iterable listHardwareProfiles() { return ImmutableSet. of(StubComputeServiceDependenciesModule.stub("small", 1, 1740, 160), StubComputeServiceDependenciesModule.stub("medium", 4, 7680, 850), StubComputeServiceDependenciesModule.stub("large", 8, 15360, 1690)); 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 319f48571c..93734226c9 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 createNodeAndStoreCredentials(String tag, String name, Template template, + public Server runNodeWithTagAndNameAndStoreCredentials(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, @@ -46,7 +46,7 @@ public class ServerManagerComputeServiceAdapter implements ComputeServiceAdapter } @Override - public Iterable listHardware() { + public Iterable listHardwareProfiles() { return client.listHardware(); }