Repository: jclouds Updated Branches: refs/heads/1.7.x 5cc4659bc -> eb000b2c1
JCLOUDS-467. Properly iterate over node names for EC2 instance creation. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/eb000b2c Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/eb000b2c Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/eb000b2c Branch: refs/heads/1.7.x Commit: eb000b2c1d25a3f18f9d773c7a28c613369681ad Parents: 5cc4659 Author: Andrew Bayer <[email protected]> Authored: Fri Feb 14 14:23:30 2014 -0800 Committer: Ignasi Barrera <[email protected]> Committed: Mon May 26 00:05:53 2014 +0200 ---------------------------------------------------------------------- .../jclouds/ec2/compute/EC2ComputeService.java | 48 ++++---- .../compute/EC2ComputeServiceExpectTest.java | 69 +++++++++-- .../describe_instances_running-named.xml | 114 ++++++++++++++++++- 3 files changed, 197 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb000b2c/apis/ec2/src/main/java/org/jclouds/ec2/compute/EC2ComputeService.java ---------------------------------------------------------------------- diff --git a/apis/ec2/src/main/java/org/jclouds/ec2/compute/EC2ComputeService.java b/apis/ec2/src/main/java/org/jclouds/ec2/compute/EC2ComputeService.java index 9a81a94..2dc2197 100644 --- a/apis/ec2/src/main/java/org/jclouds/ec2/compute/EC2ComputeService.java +++ b/apis/ec2/src/main/java/org/jclouds/ec2/compute/EC2ComputeService.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Strings.emptyToNull; import static com.google.common.collect.Iterables.concat; import static com.google.common.collect.Iterables.transform; +import static com.google.common.collect.Lists.newArrayList; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.SECONDS; import static org.jclouds.compute.config.ComputeServiceProperties.RESOURCENAME_DELIMITER; @@ -32,16 +33,33 @@ import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_GENERATE_INSTA import static org.jclouds.ec2.util.Tags.resourceToTagsAsMap; import static org.jclouds.util.Predicates2.retry; +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReference; -import javax.inject.Named; -import javax.inject.Provider; -import javax.inject.Singleton; - +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.base.Supplier; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableMultimap.Builder; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.inject.Inject; import org.jclouds.Constants; import org.jclouds.aws.util.AWSUtils; import org.jclouds.collect.Memoized; @@ -85,23 +103,6 @@ import org.jclouds.ec2.util.TagFilterBuilder; import org.jclouds.scriptbuilder.functions.InitAdminAccess; import org.jclouds.util.Strings2; -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.base.Supplier; -import com.google.common.cache.LoadingCache; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.ImmutableMultimap.Builder; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; -import com.google.common.collect.Multimap; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.inject.Inject; - /** * @author Adrian Cole */ @@ -175,12 +176,13 @@ public class EC2ComputeService extends BaseComputeService { Map<String, ? extends NodeMetadata> instancesById = Maps.uniqueIndex(input, instanceId); ImmutableSet.Builder<NodeMetadata> builder = ImmutableSet.<NodeMetadata> builder(); + List<String> namesToUse = newArrayList(nodeNames); if (generateInstanceNames && !common.containsKey("Name")) { for (Map.Entry<String, ? extends NodeMetadata> entry : instancesById.entrySet()) { String id = entry.getKey(); String name; - if (!nodeNames.isEmpty()) { - name = Iterables.get(nodeNames, 0); + if (!namesToUse.isEmpty()) { + name = namesToUse.remove(0); } else { name = id.replaceAll(".*-", group + "-"); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb000b2c/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceExpectTest.java ---------------------------------------------------------------------- diff --git a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceExpectTest.java b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceExpectTest.java index cdc832d..c2d386b 100644 --- a/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceExpectTest.java +++ b/apis/ec2/src/test/java/org/jclouds/ec2/compute/EC2ComputeServiceExpectTest.java @@ -22,6 +22,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import javax.ws.rs.core.MediaType; +import java.util.Set; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; @@ -190,8 +191,8 @@ public class EC2ComputeServiceExpectTest extends BaseEC2ComputeServiceExpectTest assertEquals(node.getCredentials().getUser(), "ec2-user", "User should be ec2-user"); } - public void testCreateNodeWithSpecifiedName() throws Exception { - HttpRequest createNamedTagsRequest = + public void testCreateThreeNodesWithSpecifiedName() throws Exception { + HttpRequest createFirstNamedTagRequest = formSigner.filter(HttpRequest.builder() .method("POST") .endpoint("https://ec2.us-east-1.amazonaws.com/") @@ -199,7 +200,7 @@ public class EC2ComputeServiceExpectTest extends BaseEC2ComputeServiceExpectTest .payload( payloadFromStringWithContentType( "Action=CreateTags" + - "&ResourceId.1=i-2baa5550" + + "&ResourceId.1=i-2ba64342" + "&Signature=Trp5e5%2BMqeBeBZbLYa9s9gxahQ9nkx6ETfsGl82IV8Y%3D" + "&SignatureMethod=HmacSHA256" + "&SignatureVersion=2" + @@ -211,6 +212,46 @@ public class EC2ComputeServiceExpectTest extends BaseEC2ComputeServiceExpectTest "application/x-www-form-urlencoded")) .build()); + HttpRequest createSecondNamedTagRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .payload( + payloadFromStringWithContentType( + "Action=CreateTags" + + "&ResourceId.1=i-2bc64242" + + "&Signature=Trp5e5%2BMqeBeBZbLYa9s9gxahQ9nkx6ETfsGl82IV8Y%3D" + + "&SignatureMethod=HmacSHA256" + + "&SignatureVersion=2" + + "&Tag.1.Key=Name" + + "&Tag.1.Value=second-node" + + "&Timestamp=2012-04-16T15%3A54%3A08.897Z" + + "&Version=2010-08-31" + + "&AWSAccessKeyId=identity", + "application/x-www-form-urlencoded")) + .build()); + + HttpRequest createThirdNamedTagRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .payload( + payloadFromStringWithContentType( + "Action=CreateTags" + + "&ResourceId.1=i-2be64332" + + "&Signature=Trp5e5%2BMqeBeBZbLYa9s9gxahQ9nkx6ETfsGl82IV8Y%3D" + + "&SignatureMethod=HmacSHA256" + + "&SignatureVersion=2" + + "&Tag.1.Key=Name" + + "&Tag.1.Value=third-node" + + "&Timestamp=2012-04-16T15%3A54%3A08.897Z" + + "&Version=2010-08-31" + + "&AWSAccessKeyId=identity", + "application/x-www-form-urlencoded")) + .build()); + HttpResponse describeNamedInstanceResponse = HttpResponse.builder().statusCode(200) .payload(payloadFromResourceWithContentType( @@ -226,19 +267,27 @@ public class EC2ComputeServiceExpectTest extends BaseEC2ComputeServiceExpectTest requestResponseMap.put(describeSecurityGroupRequest, describeSecurityGroupResponse); requestResponseMap.put(authorizeSecurityGroupIngressRequest22, authorizeSecurityGroupIngressResponse); requestResponseMap.put(authorizeSecurityGroupIngressRequestGroup, authorizeSecurityGroupIngressResponse); - requestResponseMap.put(runInstancesRequest, runInstancesResponse); + requestResponseMap.put(runThreeInstancesRequest, runThreeInstancesResponse); requestResponseMap.put(describeInstanceRequest, describeNamedInstanceResponse); - requestResponseMap.put(describeInstanceMultiIdsRequest, describeInstanceMultiIdsResponse); + requestResponseMap.put(describeInstanceThreeIdsRequest, describeInstanceThreeIdsResponse); requestResponseMap.put(describeImageRequest, describeImagesResponse); - requestResponseMap.put(createNamedTagsRequest, createTagsResponse); + requestResponseMap.put(createFirstNamedTagRequest, createTagsResponse); + requestResponseMap.put(createSecondNamedTagRequest, createTagsResponse); + requestResponseMap.put(createThirdNamedTagRequest, createTagsResponse); ComputeService apiThatCreatesNode = requestsSendResponses(requestResponseMap.build()); - NodeMetadata node = Iterables.getOnlyElement(apiThatCreatesNode.createNodesInGroup("test", 1, - blockUntilRunning(false).overrideLoginUser("ec2-user").nodeNames(ImmutableSet.of("test-node")))); - assertEquals(node.getCredentials().getUser(), "ec2-user"); - assertNotNull(node.getCredentials().getPrivateKey()); + Set<? extends NodeMetadata> nodes = apiThatCreatesNode.createNodesInGroup("test", 3, + maxCount(3).blockUntilRunning(false).overrideLoginUser("ec2-user").nodeNames(ImmutableSet.of("test-node", "second-node", "third-node"))); + + NodeMetadata node = Iterables.get(nodes, 0); assertEquals(node.getName(), "test-node"); + + NodeMetadata secondNode = Iterables.get(nodes, 1); + assertEquals(secondNode.getName(), "second-node"); + + NodeMetadata thirdNode = Iterables.get(nodes, 2); + assertEquals(thirdNode.getName(), "third-node"); } //FIXME - issue-1051 http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb000b2c/apis/ec2/src/test/resources/describe_instances_running-named.xml ---------------------------------------------------------------------- diff --git a/apis/ec2/src/test/resources/describe_instances_running-named.xml b/apis/ec2/src/test/resources/describe_instances_running-named.xml index 4f46ada..4a43279 100644 --- a/apis/ec2/src/test/resources/describe_instances_running-named.xml +++ b/apis/ec2/src/test/resources/describe_instances_running-named.xml @@ -13,7 +13,7 @@ </groupSet> <instancesSet> <item> - <instanceId>i-2baa5550</instanceId> + <instanceId>i-2ba64342</instanceId> <imageId>ami-aecd60c7</imageId> <instanceState> <code>16</code> @@ -68,6 +68,118 @@ </tagSet> <hypervisor>xen</hypervisor> </item> + <item> + <instanceId>i-2bc64242</instanceId> + <imageId>ami-aecd60c7</imageId> + <instanceState> + <code>16</code> + <name>running</name> + </instanceState> + <privateDnsName>ip-10-28-89-195.ec2.internal</privateDnsName> + <dnsName>ec2-50-16-1-166.compute-1.amazonaws.com</dnsName> + <reason/> + <keyName>jclouds#mygroup2#81</keyName> + <amiLaunchIndex>0</amiLaunchIndex> + <productCodes/> + <instanceType>t1.micro</instanceType> + <launchTime>2012-08-02T04:28:30.000Z</launchTime> + <placement> + <availabilityZone>us-east-1e</availabilityZone> + <groupName/> + <tenancy>default</tenancy> + </placement> + <kernelId>aki-88aa75e1</kernelId> + <monitoring> + <state>disabled</state> + </monitoring> + <privateIpAddress>10.28.89.195</privateIpAddress> + <ipAddress>50.16.1.166</ipAddress> + <groupSet> + <item> + <groupId>sg-3c6ef654</groupId> + <groupName>jclouds#mygroup2</groupName> + </item> + </groupSet> + <architecture>x86_64</architecture> + <rootDeviceType>ebs</rootDeviceType> + <rootDeviceName>/dev/sda1</rootDeviceName> + <blockDeviceMapping> + <item> + <deviceName>/dev/sda1</deviceName> + <ebs> + <volumeId>vol-f2d7c993</volumeId> + <status>attached</status> + <attachTime>2012-08-02T04:28:56.000Z</attachTime> + <deleteOnTermination>true</deleteOnTermination> + </ebs> + </item> + </blockDeviceMapping> + <virtualizationType>paravirtual</virtualizationType> + <clientToken/> + <tagSet> + <item> + <key>Name</key> + <value>second-node</value> + </item> + </tagSet> + <hypervisor>xen</hypervisor> + </item> + <item> + <instanceId>i-2be64332</instanceId> + <imageId>ami-aecd60c7</imageId> + <instanceState> + <code>16</code> + <name>running</name> + </instanceState> + <privateDnsName>ip-10-28-89-195.ec2.internal</privateDnsName> + <dnsName>ec2-50-16-1-166.compute-1.amazonaws.com</dnsName> + <reason/> + <keyName>jclouds#mygroup2#81</keyName> + <amiLaunchIndex>0</amiLaunchIndex> + <productCodes/> + <instanceType>t1.micro</instanceType> + <launchTime>2012-08-02T04:28:30.000Z</launchTime> + <placement> + <availabilityZone>us-east-1e</availabilityZone> + <groupName/> + <tenancy>default</tenancy> + </placement> + <kernelId>aki-88aa75e1</kernelId> + <monitoring> + <state>disabled</state> + </monitoring> + <privateIpAddress>10.28.89.195</privateIpAddress> + <ipAddress>50.16.1.166</ipAddress> + <groupSet> + <item> + <groupId>sg-3c6ef654</groupId> + <groupName>jclouds#mygroup2</groupName> + </item> + </groupSet> + <architecture>x86_64</architecture> + <rootDeviceType>ebs</rootDeviceType> + <rootDeviceName>/dev/sda1</rootDeviceName> + <blockDeviceMapping> + <item> + <deviceName>/dev/sda1</deviceName> + <ebs> + <volumeId>vol-f2d7c993</volumeId> + <status>attached</status> + <attachTime>2012-08-02T04:28:56.000Z</attachTime> + <deleteOnTermination>true</deleteOnTermination> + </ebs> + </item> + </blockDeviceMapping> + <virtualizationType>paravirtual</virtualizationType> + <clientToken/> + <tagSet> + <item> + <key>Name</key> + <value>third-node</value> + </item> + </tagSet> + <hypervisor>xen</hypervisor> + </item> </instancesSet> </item> </reservationSet>
