http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/DescribeImagesParallel.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/DescribeImagesParallel.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/DescribeImagesParallel.java new file mode 100644 index 0000000..9640e4b --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/DescribeImagesParallel.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import static com.google.common.collect.Iterables.concat; +import static com.google.common.collect.Iterables.transform; +import static com.google.common.util.concurrent.Futures.allAsList; +import static com.google.common.util.concurrent.Futures.getUnchecked; + +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.Callable; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.options.DescribeImagesOptions; +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; + +@Singleton +public class DescribeImagesParallel implements + Function<Iterable<Entry<String, DescribeImagesOptions>>, Iterable<? extends org.jclouds.ec2.domain.Image>> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + protected final EC2Api api; + final ListeningExecutorService userExecutor; + + @Inject + public DescribeImagesParallel(EC2Api api, @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) { + this.api = api; + this.userExecutor = userExecutor; + } + + @Override + public Iterable<? extends org.jclouds.ec2.domain.Image> apply( + final Iterable<Entry<String, DescribeImagesOptions>> queries) { + ListenableFuture<List<Set<? extends org.jclouds.ec2.domain.Image>>> futures + = allAsList(transform( + queries, + new Function<Entry<String, DescribeImagesOptions>, + ListenableFuture<? extends Set<? extends org.jclouds.ec2.domain.Image>>>() { + public ListenableFuture<Set<? extends org.jclouds.ec2.domain.Image>> apply( + final Entry<String, DescribeImagesOptions> from) { + return userExecutor.submit(new Callable<Set<? extends org.jclouds.ec2.domain.Image>>() { + @Override + public Set<? extends org.jclouds.ec2.domain.Image> call() throws Exception { + return api.getAMIApi().get().describeImagesInRegion(from.getKey(), from.getValue()); + } + }); + } + })); + logger.trace("amis"); + + return concat(getUnchecked(futures)); + } +}
http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2CreateNodesInGroupThenAddToSet.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2CreateNodesInGroupThenAddToSet.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2CreateNodesInGroupThenAddToSet.java new file mode 100644 index 0000000..e41c0f8 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2CreateNodesInGroupThenAddToSet.java @@ -0,0 +1,252 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.concat; +import static com.google.common.collect.Iterables.size; +import static com.google.common.collect.Iterables.transform; +import static com.google.common.collect.Sets.difference; +import static com.google.common.util.concurrent.Atomics.newReference; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; +import static org.jclouds.compute.functions.DefaultCredentialsFromImageOrOverridingCredentials.overrideDefaultCredentialsWithOptionsIfPresent; +import static org.jclouds.ec2.compute.util.EC2ComputeUtils.getZoneFromLocationOrNull; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +import com.google.common.util.concurrent.ListenableFuture; +import org.jclouds.aws.util.AWSUtils; +import org.jclouds.compute.config.CustomizationResponse; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet; +import org.jclouds.compute.util.ComputeUtils; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.LoginCredentials; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.functions.PresentInstances; +import org.jclouds.ec2.compute.options.EC2TemplateOptions; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.ec2.options.RunInstancesOptions; +import org.jclouds.ec2.reference.EC2Constants; +import org.jclouds.logging.Logger; + +/** + * creates futures that correlate to + */ +@Singleton +public class EC2CreateNodesInGroupThenAddToSet implements CreateNodesInGroupThenAddToSet { + + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + @Inject + @Named(EC2Constants.PROPERTY_EC2_AUTO_ALLOCATE_ELASTIC_IPS) + @VisibleForTesting + boolean autoAllocateElasticIps = false; + + @VisibleForTesting + final EC2Api client; + @VisibleForTesting + final Predicate<AtomicReference<NodeMetadata>> nodeRunning; + @VisibleForTesting + final LoadingCache<RegionAndName, String> elasticIpCache; + @VisibleForTesting + final CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize; + @VisibleForTesting + final Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata; + @VisibleForTesting + final ComputeUtils utils; + final PresentInstances presentInstances; + final LoadingCache<RunningInstance, Optional<LoginCredentials>> instanceToCredentials; + final Map<String, Credentials> credentialStore; + + @Inject + protected EC2CreateNodesInGroupThenAddToSet( + EC2Api client, + @Named("ELASTICIP") LoadingCache<RegionAndName, String> elasticIpCache, + @Named(TIMEOUT_NODE_RUNNING) Predicate<AtomicReference<NodeMetadata>> nodeRunning, + CreateKeyPairAndSecurityGroupsAsNeededAndReturnRunOptions createKeyPairAndSecurityGroupsAsNeededAndReturncustomize, + PresentInstances presentInstances, Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata, + LoadingCache<RunningInstance, Optional<LoginCredentials>> instanceToCredentials, + Map<String, Credentials> credentialStore, ComputeUtils utils) { + this.client = checkNotNull(client, "client"); + this.elasticIpCache = checkNotNull(elasticIpCache, "elasticIpCache"); + this.nodeRunning = checkNotNull(nodeRunning, "nodeRunning"); + this.presentInstances = checkNotNull(presentInstances, "presentInstances"); + this.createKeyPairAndSecurityGroupsAsNeededAndReturncustomize = checkNotNull( + createKeyPairAndSecurityGroupsAsNeededAndReturncustomize, + "createKeyPairAndSecurityGroupsAsNeededAndReturncustomize"); + this.runningInstanceToNodeMetadata = checkNotNull(runningInstanceToNodeMetadata, "runningInstanceToNodeMetadata"); + this.instanceToCredentials = checkNotNull(instanceToCredentials, "instanceToCredentials"); + this.credentialStore = checkNotNull(credentialStore, "credentialStore"); + this.utils = checkNotNull(utils, "utils"); + } + + public static final Function<RunningInstance, RegionAndName> instanceToRegionAndName = new Function<RunningInstance, RegionAndName>() { + @Override + public RegionAndName apply(RunningInstance from) { + return new RegionAndName(from.getRegion(), from.getId()); + } + }; + + @Override + public Map<?, ListenableFuture<Void>> execute(String group, int count, Template template, Set<NodeMetadata> goodNodes, + Map<NodeMetadata, Exception> badNodes, Multimap<NodeMetadata, CustomizationResponse> customizationResponses) { + + Template mutableTemplate = template.clone(); + + Set<RunningInstance> started = runInstancesAndWarnOnInvisible(group, count, mutableTemplate); + if (started.size() == 0) { + logger.warn("<< unable to start instances(%s)", mutableTemplate); + return ImmutableMap.of(); + } + populateCredentials(started, template.getOptions()); + + if (autoAllocateElasticIps) // before customization as the elastic ips may be needed + blockUntilRunningAndAssignElasticIpsToInstancesOrPutIntoBadMap(started, badNodes); + + return utils.customizeNodesAndAddToGoodMapOrPutExceptionIntoBadMap(mutableTemplate.getOptions(), + transform(started, runningInstanceToNodeMetadata), goodNodes, badNodes, customizationResponses); + } + + /** + * attempts to start the specified count of instances. eventual consistency might cause a problem where instances + * aren't immediately visible to the api. This method will warn when that occurs. + */ + private Set<RunningInstance> runInstancesAndWarnOnInvisible(String group, int count, Template mutableTemplate) { + Set<RunningInstance> started = createKeyPairAndSecurityGroupsAsNeededThenRunInstances(group, count, + mutableTemplate); + Set<RegionAndName> startedIds = ImmutableSet.copyOf(transform(started, instanceToRegionAndName)); + if (startedIds.size() == 0) { + return ImmutableSet.copyOf(started); + } + logger.debug("<< started instances(%s)", startedIds); + Set<RunningInstance> visible = presentInstances.apply(startedIds); + Set<RegionAndName> visibleIds = ImmutableSet.copyOf(transform(visible, instanceToRegionAndName)); + logger.trace("<< visible instances(%s)", visibleIds); + + // add an exception for each of the nodes we cannot customize + Set<RegionAndName> invisibleIds = difference(startedIds, visibleIds); + if (invisibleIds.size() > 0) { + logger.warn("<< not api visible instances(%s)", invisibleIds); + } + return started; + } + + private void populateCredentials(Set<RunningInstance> input, TemplateOptions options) { + LoginCredentials credentials = null; + for (RunningInstance instance : input) { + credentials = instanceToCredentials.getUnchecked(instance).orNull(); + if (credentials != null) + break; + } + credentials = overrideDefaultCredentialsWithOptionsIfPresent(credentials, options); + if (credentials != null) + for (RegionAndName instance : transform(input, instanceToRegionAndName)) + credentialStore.put("node#" + instance.slashEncode(), credentials); + } + + private void blockUntilRunningAndAssignElasticIpsToInstancesOrPutIntoBadMap(Set<RunningInstance> input, + Map<NodeMetadata, Exception> badNodes) { + Map<RegionAndName, RunningInstance> instancesById = Maps.uniqueIndex(input, instanceToRegionAndName); + for (Map.Entry<RegionAndName, RunningInstance> entry : instancesById.entrySet()) { + RegionAndName id = entry.getKey(); + RunningInstance instance = entry.getValue(); + try { + logger.debug("<< allocating elastic IP instance(%s)", id); + String ip = client.getElasticIPAddressApi().get().allocateAddressInRegion(id.getRegion()); + // block until instance is running + logger.debug(">> awaiting status running instance(%s)", id); + AtomicReference<NodeMetadata> node = newReference(runningInstanceToNodeMetadata + .apply(instance)); + nodeRunning.apply(node); + logger.trace("<< running instance(%s)", id); + logger.debug(">> associating elastic IP %s to instance %s", ip, id); + client.getElasticIPAddressApi().get().associateAddressInRegion(id.getRegion(), ip, id.getName()); + logger.trace("<< associated elastic IP %s to instance %s", ip, id); + // add mapping of instance to ip into the cache + elasticIpCache.put(id, ip); + } catch (RuntimeException e) { + badNodes.put(runningInstanceToNodeMetadata.apply(instancesById.get(id)), e); + } + } + } + + private Set<RunningInstance> createKeyPairAndSecurityGroupsAsNeededThenRunInstances(String group, int count, + Template template) { + String region = AWSUtils.getRegionFromLocationOrNull(template.getLocation()); + String zone = getZoneFromLocationOrNull(template.getLocation()); + RunInstancesOptions instanceOptions = createKeyPairAndSecurityGroupsAsNeededAndReturncustomize.execute(region, + group, template); + return createNodesInRegionAndZone(region, zone, group, count, template, instanceOptions); + } + + protected Set<RunningInstance> createNodesInRegionAndZone(String region, String zone, String group, + int count, Template template, + RunInstancesOptions instanceOptions) { + int countStarted = 0; + int tries = 0; + Set<RunningInstance> started = ImmutableSet.<RunningInstance> of(); + + int maxCount = EC2TemplateOptions.class.cast(template.getOptions()).getMaxCount(); + int countToProvision; + + if (maxCount == 0) { + maxCount = count; + countToProvision = 1; + } else { + countToProvision = count; + } + + while (countStarted < count && tries++ < count) { + if (logger.isDebugEnabled()) + logger.debug(">> running %d instance region(%s) zone(%s) ami(%s) params(%s)", count - countStarted, region, + zone, template.getImage().getProviderId(), instanceOptions.buildFormParameters()); + + started = ImmutableSet.copyOf(concat( + started, + client.getInstanceApi().get().runInstancesInRegion(region, zone, template.getImage().getProviderId(), + countToProvision, maxCount - countStarted, instanceOptions))); + + countStarted = size(started); + if (countStarted < count) + logger.debug(">> not enough instances (%d/%d) started, attempting again", countStarted, count); + } + return started; + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2DestroyNodeStrategy.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2DestroyNodeStrategy.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2DestroyNodeStrategy.java new file mode 100644 index 0000000..b8a1b5c --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2DestroyNodeStrategy.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.concurrent.ExecutionException; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.aws.util.AWSUtils; +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.ec2.EC2Api; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.reference.EC2Constants; +import org.jclouds.logging.Logger; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +@Singleton +public class EC2DestroyNodeStrategy implements DestroyNodeStrategy { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + protected final EC2Api client; + protected final GetNodeMetadataStrategy getNode; + protected final LoadingCache<RegionAndName, String> elasticIpCache; + + @Inject + @Named(EC2Constants.PROPERTY_EC2_AUTO_ALLOCATE_ELASTIC_IPS) + @VisibleForTesting + boolean autoAllocateElasticIps = false; + + @Inject + protected EC2DestroyNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode, + @Named("ELASTICIP") LoadingCache<RegionAndName, String> elasticIpCache) { + this.client = checkNotNull(client, "client"); + this.getNode = checkNotNull(getNode, "getNode"); + this.elasticIpCache = checkNotNull(elasticIpCache, "elasticIpCache"); + } + + @Override + public NodeMetadata destroyNode(String id) { + String[] parts = AWSUtils.parseHandle(id); + String region = parts[0]; + String instanceId = parts[1]; + + // TODO: can there be multiple? + releaseAnyPublicIpForInstanceInRegion(instanceId, region); + destroyInstanceInRegion(instanceId, region); + return getNode.getNode(id); + } + + protected void releaseAnyPublicIpForInstanceInRegion(String instanceId, String region) { + if (!autoAllocateElasticIps) + return; + try { + String ip = elasticIpCache.get(new RegionAndName(region, instanceId)); + logger.debug(">> disassociating elastic IP %s", ip); + client.getElasticIPAddressApi().get().disassociateAddressInRegion(region, ip); + logger.trace("<< disassociated elastic IP %s", ip); + elasticIpCache.invalidate(new RegionAndName(region, instanceId)); + logger.debug(">> releasing elastic IP %s", ip); + client.getElasticIPAddressApi().get().releaseAddressInRegion(region, ip); + logger.trace("<< released elastic IP %s", ip); + } catch (CacheLoader.InvalidCacheLoadException e) { + // no ip was found + return; + } catch (ExecutionException e) { + // don't propagate as we need to clean up the node regardless + logger.warn(e, "error cleaning up elastic ip for instance %s/%s", region, instanceId); + } + + } + + protected void destroyInstanceInRegion(String instanceId, String region) { + client.getInstanceApi().get().terminateInstancesInRegion(region, instanceId); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2GetImageStrategy.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2GetImageStrategy.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2GetImageStrategy.java new file mode 100644 index 0000000..55a7889 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2GetImageStrategy.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.getOnlyElement; + +import java.util.NoSuchElementException; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.aws.util.AWSUtils; +import org.jclouds.compute.strategy.GetImageStrategy; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.domain.Image; +import org.jclouds.ec2.options.DescribeImagesOptions; + +import com.google.common.base.Function; + +@Singleton +public class EC2GetImageStrategy implements GetImageStrategy { + + private final EC2Api client; + private final Function<Image, org.jclouds.compute.domain.Image> imageToImage; + + @Inject + protected EC2GetImageStrategy(EC2Api client, Function<Image, org.jclouds.compute.domain.Image> imageToImage) { + this.client = checkNotNull(client, "client"); + this.imageToImage = checkNotNull(imageToImage, "imageToImage"); + } + + @Override + public org.jclouds.compute.domain.Image getImage(String id) { + checkNotNull(id, "id"); + String[] parts = AWSUtils.parseHandle(id); + String region = parts[0]; + String instanceId = parts[1]; + try { + Image image = getImageInRegion(region, instanceId); + return imageToImage.apply(image); + } catch (NoSuchElementException e) { + return null; + } + } + + public Image getImageInRegion(String region, String id) { + return getOnlyElement(client.getAMIApi().get().describeImagesInRegion(region, + DescribeImagesOptions.Builder.imageIds(id))); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java new file mode 100644 index 0000000..0d7fa77 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2GetNodeMetadataStrategy.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.getOnlyElement; + +import java.util.NoSuchElementException; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.aws.util.AWSUtils; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.domain.RunningInstance; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; + +@Singleton +public class EC2GetNodeMetadataStrategy implements GetNodeMetadataStrategy { + + private final EC2Api client; + private final Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata; + + @Inject + protected EC2GetNodeMetadataStrategy(EC2Api client, + Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata) { + this.client = checkNotNull(client, "client"); + this.runningInstanceToNodeMetadata = checkNotNull(runningInstanceToNodeMetadata, "runningInstanceToNodeMetadata"); + } + + @Override + public NodeMetadata getNode(String id) { + checkNotNull(id, "id"); + String[] parts = AWSUtils.parseHandle(id); + String region = parts[0]; + String instanceId = parts[1]; + try { + RunningInstance runningInstance = getRunningInstanceInRegion(region, instanceId); + return runningInstanceToNodeMetadata.apply(runningInstance); + } catch (NoSuchElementException e) { + return null; + } + } + + public RunningInstance getRunningInstanceInRegion(String region, String id) { + return getOnlyElement(Iterables.concat(client.getInstanceApi().get().describeInstancesInRegion(region, id))); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2ListNodesStrategy.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2ListNodesStrategy.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2ListNodesStrategy.java new file mode 100644 index 0000000..2f0204a --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2ListNodesStrategy.java @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Predicates.and; +import static com.google.common.base.Predicates.in; +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.toArray; +import static com.google.common.collect.Iterables.transform; +import static com.google.common.collect.Multimaps.filterKeys; +import static com.google.common.collect.Multimaps.index; +import static com.google.common.collect.Multimaps.transformValues; + +import java.util.Set; + +import javax.annotation.Resource; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.aws.util.AWSUtils; +import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.predicates.NodePredicates; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.compute.strategy.ListNodesStrategy; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.domain.Reservation; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.location.Region; +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.ImmutableSet; +import com.google.common.collect.Multimap; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.inject.Inject; + +@Singleton +public class EC2ListNodesStrategy implements ListNodesStrategy { + + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + @Inject(optional = true) + @Named(Constants.PROPERTY_REQUEST_TIMEOUT) + protected static Long maxTime; + + protected final EC2Api client; + protected final Supplier<Set<String>> regions; + protected final Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata; + protected final ListeningExecutorService userExecutor; + + @Inject + protected EC2ListNodesStrategy(EC2Api client, @Region Supplier<Set<String>> regions, + Function<RunningInstance, NodeMetadata> runningInstanceToNodeMetadata, + @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor) { + this.client = checkNotNull(client, "client"); + this.regions = checkNotNull(regions, "regions"); + this.runningInstanceToNodeMetadata = checkNotNull(runningInstanceToNodeMetadata, "runningInstanceToNodeMetadata"); + this.userExecutor = checkNotNull(userExecutor, "userExecutor"); + } + + @Override + public Set<? extends ComputeMetadata> listNodes() { + return listDetailsOnNodesMatching(NodePredicates.all()); + } + + @Override + public Set<? extends NodeMetadata> listNodesByIds(Iterable<String> ids) { + Multimap<String, String> idsByHandles = index(ids, splitHandle(1)); + Multimap<String, String> idsByRegions = transformValues(idsByHandles, splitHandle(0)); + Multimap<String, String> idsByConfiguredRegions = filterKeys(idsByRegions, in(regions.get())); + + if (idsByConfiguredRegions.isEmpty()) { + return ImmutableSet.of(); + } + + Iterable<? extends RunningInstance> instances = pollRunningInstancesByRegionsAndIds(idsByConfiguredRegions); + Iterable<? extends NodeMetadata> nodes = transform(filter(instances, notNull()), + runningInstanceToNodeMetadata); + return ImmutableSet.copyOf(nodes); + } + + @Override + public Set<? extends NodeMetadata> listDetailsOnNodesMatching(Predicate<ComputeMetadata> filter) { + Iterable<? extends RunningInstance> instances = pollRunningInstances(); + Iterable<? extends NodeMetadata> nodes = filter(transform(filter(instances, notNull()), + runningInstanceToNodeMetadata), and(notNull(), filter)); + return ImmutableSet.copyOf(nodes); + } + + protected Iterable<? extends RunningInstance> pollRunningInstances() { + Iterable<? extends Set<? extends Reservation<? extends RunningInstance>>> reservations + = transform(regions.get(), allInstancesInRegion()); + + return concat(concat(reservations)); + } + + protected Iterable<? extends RunningInstance> pollRunningInstancesByRegionsAndIds(final Multimap<String, String> idsByRegions) { + Iterable<? extends Set<? extends Reservation<? extends RunningInstance>>> reservations + = transform(idsByRegions.keySet(), instancesByIdInRegion(idsByRegions)); + + return concat(concat(reservations)); + } + + protected Function<String, String> splitHandle(final int pos) { + return new Function<String, String>() { + + @Override + public String apply(String handle) { + return AWSUtils.parseHandle(handle)[pos]; + } + }; + } + + protected Function<String, Set<? extends Reservation<? extends RunningInstance>>> allInstancesInRegion() { + return new Function<String, Set<? extends Reservation<? extends RunningInstance>>>() { + + @Override + public Set<? extends Reservation<? extends RunningInstance>> apply(String from) { + return client.getInstanceApi().get().describeInstancesInRegion(from); + } + + }; + } + + protected Function<String, Set<? extends Reservation<? extends RunningInstance>>> + instancesByIdInRegion(final Multimap<String, String> idsByRegions) { + return new Function<String, Set<? extends Reservation<? extends RunningInstance>>>() { + + @Override + public Set<? extends Reservation<? extends RunningInstance>> apply(String from) { + return client.getInstanceApi().get() + .describeInstancesInRegion(from, toArray(idsByRegions.get(from), String.class)); + } + + }; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java new file mode 100644 index 0000000..91eaaa9 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2PopulateDefaultLoginCredentialsForImageStrategy.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import static com.google.common.base.Preconditions.checkArgument; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.strategy.impl.ReturnCredentialsBoundToImage; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.LoginCredentials; +import org.jclouds.domain.LoginCredentials.Builder; +import org.jclouds.ec2.domain.Image; +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.collect.ImmutableMap; + +@Singleton +public class EC2PopulateDefaultLoginCredentialsForImageStrategy extends ReturnCredentialsBoundToImage { + public EC2PopulateDefaultLoginCredentialsForImageStrategy() { + this(null, ImmutableMap.<String, Credentials> of(), ImmutableMap.<OsFamily, LoginCredentials>of()); + } + + @Inject + public EC2PopulateDefaultLoginCredentialsForImageStrategy(@Nullable @Named("image") LoginCredentials creds, + Map<String, Credentials> credentialStore, Map<OsFamily, LoginCredentials> osFamilyToCredentials) { + super(creds, credentialStore, osFamilyToCredentials); + } + + @Override + public LoginCredentials apply(Object resourceToAuthenticate) { + if (creds != null) + return creds; + Builder credentials = LoginCredentials.builder().user("root"); + if (resourceToAuthenticate != null) { + 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 (owner.matches("063491364108|099720109477")) { + credentials.user("ubuntu"); + // http://typepad.com/2010/09/introducing-amazon-linux-ami.html + } else if (owner.equals("137112412989")) { + credentials.user("ec2-user"); + } + } + return credentials.build(); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2RebootNodeStrategy.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2RebootNodeStrategy.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2RebootNodeStrategy.java new file mode 100644 index 0000000..fbc8096 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2RebootNodeStrategy.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.aws.util.AWSUtils; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.RebootNodeStrategy; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.features.InstanceApi; + +@Singleton +public class EC2RebootNodeStrategy implements RebootNodeStrategy { + private final InstanceApi client; + private final GetNodeMetadataStrategy getNode; + + @Inject + protected EC2RebootNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode) { + this.client = client.getInstanceApi().get(); + this.getNode = getNode; + } + + @Override + public NodeMetadata rebootNode(String id) { + String[] parts = AWSUtils.parseHandle(id); + String region = parts[0]; + String instanceId = parts[1]; + client.rebootInstancesInRegion(region, instanceId); + return getNode.getNode(id); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2ResumeNodeStrategy.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2ResumeNodeStrategy.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2ResumeNodeStrategy.java new file mode 100644 index 0000000..6c5a093 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2ResumeNodeStrategy.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.aws.util.AWSUtils; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.ResumeNodeStrategy; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.features.InstanceApi; + +@Singleton +public class EC2ResumeNodeStrategy implements ResumeNodeStrategy { + private final InstanceApi client; + private final GetNodeMetadataStrategy getNode; + + @Inject + protected EC2ResumeNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode) { + this.client = client.getInstanceApi().get(); + this.getNode = getNode; + } + + @Override + public NodeMetadata resumeNode(String id) { + String[] parts = AWSUtils.parseHandle(id); + String region = parts[0]; + String instanceId = parts[1]; + client.startInstancesInRegion(region, instanceId); + return getNode.getNode(id); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2SuspendNodeStrategy.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2SuspendNodeStrategy.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2SuspendNodeStrategy.java new file mode 100644 index 0000000..ec737a2 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/EC2SuspendNodeStrategy.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.aws.util.AWSUtils; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.SuspendNodeStrategy; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.features.InstanceApi; + +@Singleton +public class EC2SuspendNodeStrategy implements SuspendNodeStrategy { + private final InstanceApi client; + private final GetNodeMetadataStrategy getNode; + + @Inject + protected EC2SuspendNodeStrategy(EC2Api client, GetNodeMetadataStrategy getNode) { + this.client = client.getInstanceApi().get(); + this.getNode = getNode; + } + + @Override + public NodeMetadata suspendNode(String id) { + String[] parts = AWSUtils.parseHandle(id); + String region = parts[0]; + String instanceId = parts[1]; + client.stopInstancesInRegion(region, true, instanceId); + return getNode.getNode(id); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/ReviseParsedImage.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/ReviseParsedImage.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/ReviseParsedImage.java new file mode 100644 index 0000000..18dabd7 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/strategy/ReviseParsedImage.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.strategy; + +import javax.inject.Singleton; + +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; + +import com.google.inject.ImplementedBy; + +@ImplementedBy(ReviseParsedImage.NoopReviseParsedImage.class) +public interface ReviseParsedImage { + void reviseParsedImage(org.jclouds.ec2.domain.Image from, ImageBuilder builder, OsFamily family, + OperatingSystem.Builder osBuilder); + + @Singleton + public static class NoopReviseParsedImage implements ReviseParsedImage { + + @Override + public void reviseParsedImage(org.jclouds.ec2.domain.Image from, ImageBuilder builder, OsFamily family, + OperatingSystem.Builder osBuilder) { + } + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/EC2HardwareSupplier.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/EC2HardwareSupplier.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/EC2HardwareSupplier.java new file mode 100644 index 0000000..7ba4d1c --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/EC2HardwareSupplier.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.suppliers; + +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.c1_medium; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.c1_xlarge; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_large; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_small; +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_xlarge; + +import java.util.Set; + +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Hardware; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableSet; + +@Singleton +public class EC2HardwareSupplier implements Supplier<Set<? extends Hardware>> { + + @Override + public Set<? extends Hardware> get() { + return ImmutableSet.<Hardware> of(m1_small().build(), c1_medium().build(), c1_xlarge() + .build(), m1_large().build(), m1_xlarge().build()); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/EC2ImageSupplier.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/EC2ImageSupplier.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/EC2ImageSupplier.java new file mode 100644 index 0000000..4fd4d6c --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/EC2ImageSupplier.java @@ -0,0 +1,116 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.suppliers; + +import static com.google.common.collect.Iterables.filter; +import static com.google.common.collect.Iterables.transform; +import static org.jclouds.ec2.options.DescribeImagesOptions.Builder.ownedBy; +import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_AMI_OWNERS; + +import java.util.Map; +import java.util.Map.Entry; +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.Image; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.functions.EC2ImageParser; +import org.jclouds.ec2.compute.functions.ImagesToRegionAndIdMap; +import org.jclouds.ec2.compute.strategy.DescribeImagesParallel; +import org.jclouds.ec2.options.DescribeImagesOptions; +import org.jclouds.location.Region; +import org.jclouds.logging.Logger; + +import com.google.common.base.Predicates; +import com.google.common.base.Supplier; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; + +@Singleton +public class EC2ImageSupplier implements Supplier<Set<? extends Image>> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + private final Supplier<Set<String>> regions; + private final DescribeImagesParallel describer; + private final String[] amiOwners; + private final EC2ImageParser parser; + private final Supplier<LoadingCache<RegionAndName, ? extends Image>> cache; + + @Inject + protected EC2ImageSupplier(@Region Supplier<Set<String>> regions, DescribeImagesParallel describer, + @Named(PROPERTY_EC2_AMI_OWNERS) String[] amiOwners, Supplier<LoadingCache<RegionAndName, ? extends Image>> cache, + EC2ImageParser parser) { + this.regions = regions; + this.describer = describer; + this.amiOwners = amiOwners; + this.cache = cache; + this.parser = parser; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public Set<? extends Image> get() { + if (amiOwners.length == 0) { + logger.debug(">> no owners specified, skipping image parsing"); + return ImmutableSet.of(); + + } else { + logger.debug(">> providing images"); + + Iterable<Entry<String, DescribeImagesOptions>> queries = getDescribeQueriesForOwnersInRegions(regions.get(), + amiOwners); + + Iterable<? extends Image> parsedImages = ImmutableSet.copyOf(filter(transform(describer.apply(queries), parser), Predicates + .notNull())); + + Map<RegionAndName, ? extends Image> imageMap = ImagesToRegionAndIdMap.imagesToMap(parsedImages); + cache.get().invalidateAll(); + cache.get().asMap().putAll((Map)imageMap); + logger.debug("<< images(%d)", imageMap.size()); + + return Sets.newLinkedHashSet(imageMap.values()); + } + } + + public Iterable<Entry<String, DescribeImagesOptions>> getDescribeQueriesForOwnersInRegions(Set<String> regions, + String[] amiOwners) { + DescribeImagesOptions options = getOptionsForOwners(amiOwners); + Builder<String, DescribeImagesOptions> builder = ImmutableMap.builder(); + for (String region : regions) + builder.put(region, options); + return builder.build().entrySet(); + } + + public DescribeImagesOptions getOptionsForOwners(String... amiOwners) { + DescribeImagesOptions options; + if (amiOwners.length == 1 && amiOwners[0].equals("*")) + options = new DescribeImagesOptions(); + else + options = ownedBy(amiOwners); + return options; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/RegionAndNameToImageSupplier.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/RegionAndNameToImageSupplier.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/RegionAndNameToImageSupplier.java new file mode 100644 index 0000000..ae9daea --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/suppliers/RegionAndNameToImageSupplier.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.suppliers; + +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; + +import java.util.concurrent.TimeUnit; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Image; +import org.jclouds.ec2.compute.domain.RegionAndName; + +import com.google.common.base.Supplier; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +@Singleton +public class RegionAndNameToImageSupplier implements Supplier<LoadingCache<RegionAndName, ? extends Image>> { + private final LoadingCache<RegionAndName, Image> cache; + + @Inject + protected RegionAndNameToImageSupplier(CacheLoader<RegionAndName, Image> regionAndIdToImage, + @Named(PROPERTY_SESSION_INTERVAL) long expirationSecs) { + cache = CacheBuilder.newBuilder().expireAfterWrite(expirationSecs, TimeUnit.SECONDS).build(regionAndIdToImage); + } + + @Override + public LoadingCache<RegionAndName, ? extends Image> get() { + return cache; + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/util/EC2ComputeUtils.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/util/EC2ComputeUtils.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/util/EC2ComputeUtils.java new file mode 100644 index 0000000..766da1c --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/compute/util/EC2ComputeUtils.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.util; + +import javax.inject.Singleton; + +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; + +@Singleton +public class EC2ComputeUtils { + + public static String getZoneFromLocationOrNull(Location location) { + return location.getScope() == LocationScope.ZONE ? location.getId() : null; + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/config/BaseEC2HttpApiModule.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/config/BaseEC2HttpApiModule.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/config/BaseEC2HttpApiModule.java new file mode 100644 index 0000000..5db1728 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/config/BaseEC2HttpApiModule.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.config; + + + + +import org.jclouds.aws.config.FormSigningHttpApiModule; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.suppliers.DescribeAvailabilityZonesInRegion; +import org.jclouds.ec2.suppliers.DescribeRegionsForRegionURIs; +import org.jclouds.location.config.LocationModule; +import org.jclouds.location.suppliers.RegionIdToURISupplier; +import org.jclouds.location.suppliers.RegionIdToZoneIdsSupplier; +import org.jclouds.location.suppliers.RegionIdsSupplier; +import org.jclouds.location.suppliers.ZoneIdToURISupplier; +import org.jclouds.location.suppliers.ZoneIdsSupplier; +import org.jclouds.location.suppliers.derived.RegionIdsFromRegionIdToURIKeySet; +import org.jclouds.location.suppliers.derived.ZoneIdToURIFromJoinOnRegionIdToURI; +import org.jclouds.location.suppliers.derived.ZoneIdsFromRegionIdToZoneIdsValues; +import org.jclouds.rest.ConfiguresHttpApi; + +import com.google.inject.Scopes; + +/** + * Configures the EC2 connection. + */ +@ConfiguresHttpApi +public abstract class BaseEC2HttpApiModule<A extends EC2Api> extends + FormSigningHttpApiModule<A> { + + protected BaseEC2HttpApiModule(Class<A> api) { + super(api); + } + + @Override + protected void installLocations() { + install(new LocationModule()); + bind(RegionIdToZoneIdsSupplier.class).to(DescribeAvailabilityZonesInRegion.class).in(Scopes.SINGLETON); + bind(RegionIdToURISupplier.class).to(DescribeRegionsForRegionURIs.class).in(Scopes.SINGLETON); + bind(ZoneIdsSupplier.class).to(ZoneIdsFromRegionIdToZoneIdsValues.class).in(Scopes.SINGLETON); + bind(RegionIdsSupplier.class).to(RegionIdsFromRegionIdToURIKeySet.class).in(Scopes.SINGLETON); + bind(ZoneIdToURISupplier.class).to(ZoneIdToURIFromJoinOnRegionIdToURI.class).in(Scopes.SINGLETON); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/config/EC2HttpApiModule.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/config/EC2HttpApiModule.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/config/EC2HttpApiModule.java new file mode 100644 index 0000000..9980513 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/config/EC2HttpApiModule.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.config; + + + + +import org.jclouds.ec2.EC2Api; +import org.jclouds.rest.ConfiguresHttpApi; + + +/** + * Configures the EC2 connection. + */ +@ConfiguresHttpApi +public class EC2HttpApiModule extends BaseEC2HttpApiModule<EC2Api> { + + public EC2HttpApiModule() { + super(EC2Api.class); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/Attachment.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/Attachment.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/Attachment.java new file mode 100644 index 0000000..23f2722 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/Attachment.java @@ -0,0 +1,225 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Date; + +/** + * @see <a href= + * "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateVolume.html" + * /> + */ +public class Attachment implements Comparable<Attachment> { + public static enum Status { + ATTACHING, ATTACHED, DETACHING, DETACHED, BUSY, UNRECOGNIZED; + + public String value() { + return name().toLowerCase(); + } + + @Override + public String toString() { + return value(); + } + + public static Status fromValue(String status) { + try { + return valueOf(checkNotNull(status, "status").toUpperCase()); + } catch (IllegalArgumentException e) { + return UNRECOGNIZED; + } + } + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private String region; + private String volumeId; + private String instanceId; + private String device; + private Status status; + private Date attachTime; + + public Builder region(String region) { + this.region = region; + return this; + } + + public Builder volumeId(String volumeId) { + this.volumeId = volumeId; + return this; + } + + public Builder instanceId(String instanceId) { + this.instanceId = instanceId; + return this; + } + + public Builder device(String device) { + this.device = device; + return this; + } + + public Builder status(Status status) { + this.status = status; + return this; + } + + public Builder attachTime(Date attachTime) { + this.attachTime = attachTime; + return this; + } + + public Attachment build() { + return new Attachment(region, volumeId, instanceId, device, status, attachTime); + } + } + + private final String region; + private final String volumeId; + private final String instanceId; + private final String device; + private final Status status; + private final Date attachTime; + + public Attachment(String region, String volumeId, String instanceId, String device, Status status, Date attachTime) { + this.region = checkNotNull(region, "region"); + this.volumeId = volumeId; + this.instanceId = instanceId; + this.device = device; + this.status = status; + this.attachTime = attachTime; + } + + /** + * To be removed in jclouds 1.6 <h4>Warning</h4> + * + * Especially on EC2 clones that may not support regions, this value is fragile. Consider + * alternate means to determine context. + */ + @Deprecated + public String getRegion() { + return region; + } + + /** + * The ID of the volume. + */ + public String getVolumeId() { + return volumeId; + } + + /** + * The ID of the instance. + */ + public String getId() { + return instanceId; + } + + /** + * The device as it is exposed to the instance. + */ + public String getDevice() { + return device; + } + + /** + * Volume state. + */ + public Status getStatus() { + return status; + } + + /** + * Time stamp when the attachment initiated. + */ + public Date getAttachTime() { + return attachTime; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((attachTime == null) ? 0 : attachTime.hashCode()); + result = prime * result + ((device == null) ? 0 : device.hashCode()); + result = prime * result + ((instanceId == null) ? 0 : instanceId.hashCode()); + result = prime * result + ((region == null) ? 0 : region.hashCode()); + result = prime * result + ((status == null) ? 0 : status.hashCode()); + result = prime * result + ((volumeId == null) ? 0 : volumeId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Attachment other = (Attachment) obj; + if (attachTime == null) { + if (other.attachTime != null) + return false; + } else if (!attachTime.equals(other.attachTime)) + return false; + if (device == null) { + if (other.device != null) + return false; + } else if (!device.equals(other.device)) + return false; + if (instanceId == null) { + if (other.instanceId != null) + return false; + } else if (!instanceId.equals(other.instanceId)) + return false; + if (region == null) { + if (other.region != null) + return false; + } else if (!region.equals(other.region)) + return false; + if (status == null) { + if (other.status != null) + return false; + } else if (!status.equals(other.status)) + return false; + if (volumeId == null) { + if (other.volumeId != null) + return false; + } else if (!volumeId.equals(other.volumeId)) + return false; + return true; + } + + @Override + public String toString() { + return "Attachment [region=" + region + ", volumeId=" + volumeId + ", instanceId=" + instanceId + ", device=" + + device + ", attachTime=" + attachTime + ", status=" + status + "]"; + } + + @Override + public int compareTo(Attachment o) { + return attachTime.compareTo(o.attachTime); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/AvailabilityZoneInfo.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/AvailabilityZoneInfo.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/AvailabilityZoneInfo.java new file mode 100644 index 0000000..dcc9432 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/AvailabilityZoneInfo.java @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Set; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; + +/** + * + * @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-AvailabilityZoneItemType.html" + * /> + */ +public class AvailabilityZoneInfo implements Comparable<AvailabilityZoneInfo> { + + private final String zone; + private final String state; + private final String region; + private final Set<String> messages = Sets.newHashSet(); + + public AvailabilityZoneInfo(String zone, String zoneState, + String region, Iterable<String> messages) { + this.zone = checkNotNull(zone, "zone"); + this.state = checkNotNull(zoneState, "zoneState"); + this.region = checkNotNull(region, "region"); + Iterables.addAll(this.messages, checkNotNull(messages, "messages")); + } + + /** + * the Availability Zone. + */ + public String getZone() { + return zone; + } + + /** + * State of the Availability Zone. + */ + public String getState() { + return state; + } + + /** + * Name of the Region. + */ + public String getRegion() { + return region; + } + + /** + * Messages + */ + public Set<String> getMessages() { + return messages; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((messages == null) ? 0 : messages.hashCode()); + result = prime * result + ((region == null) ? 0 : region.hashCode()); + result = prime * result + ((state == null) ? 0 : state.hashCode()); + result = prime * result + ((zone == null) ? 0 : zone.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AvailabilityZoneInfo other = (AvailabilityZoneInfo) obj; + if (messages == null) { + if (other.messages != null) + return false; + } else if (!messages.equals(other.messages)) + return false; + if (region == null) { + if (other.region != null) + return false; + } else if (!region.equals(other.region)) + return false; + if (state == null) { + if (other.state != null) + return false; + } else if (!state.equals(other.state)) + return false; + if (zone == null) { + if (other.zone != null) + return false; + } else if (!zone.equals(other.zone)) + return false; + return true; + } + + @Override + public String toString() { + return "AvailabilityZoneInfo [messages=" + messages + ", region=" + region + ", state=" + + state + ", zone=" + zone + "]"; + } + + @Override + public int compareTo(AvailabilityZoneInfo that) { + return zone.compareTo(that.zone); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/BlockDevice.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/BlockDevice.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/BlockDevice.java new file mode 100644 index 0000000..b4a2710 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/main/java/org/jclouds/ec2/domain/BlockDevice.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.domain; + +import java.util.Date; + +import org.jclouds.ec2.domain.Attachment.Status; + +/** + * + * @see <a href= + * "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-ItemType-RunningInstancesItemType.html" + * /> + */ +public class BlockDevice { + private final String volumeId; + private final Attachment.Status attachmentStatus; + private final Date attachTime; + private final boolean deleteOnTermination; + + public BlockDevice(String volumeId, Status attachmentStatus, Date attachTime, boolean deleteOnTermination) { + this.volumeId = volumeId; + this.attachmentStatus = attachmentStatus; + this.attachTime = attachTime; + this.deleteOnTermination = deleteOnTermination; + } + + public BlockDevice(String volumeId, boolean deleteOnTermination) { + this(volumeId, null, null, deleteOnTermination); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((attachTime == null) ? 0 : attachTime.hashCode()); + result = prime * result + ((attachmentStatus == null) ? 0 : attachmentStatus.hashCode()); + result = prime * result + (deleteOnTermination ? 1231 : 1237); + result = prime * result + ((volumeId == null) ? 0 : volumeId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + BlockDevice other = (BlockDevice) obj; + if (attachTime == null) { + if (other.attachTime != null) + return false; + } else if (!attachTime.equals(other.attachTime)) + return false; + if (attachmentStatus == null) { + if (other.attachmentStatus != null) + return false; + } else if (!attachmentStatus.equals(other.attachmentStatus)) + return false; + if (deleteOnTermination != other.deleteOnTermination) + return false; + if (volumeId == null) { + if (other.volumeId != null) + return false; + } else if (!volumeId.equals(other.volumeId)) + return false; + return true; + } + + public String getVolumeId() { + return volumeId; + } + + public Attachment.Status getAttachmentStatus() { + return attachmentStatus; + } + + public Date getAttachTime() { + return attachTime; + } + + public boolean isDeleteOnTermination() { + return deleteOnTermination; + } + + @Override + public String toString() { + return "[volumeId=" + volumeId + ", attachmentStatus=" + attachmentStatus + ", attachTime=" + + attachTime + ", deleteOnTermination=" + deleteOnTermination + "]"; + } + +}
