Updated Branches: refs/heads/master 55b21b644 -> 2077da287
http://git-wip-us.apache.org/repos/asf/jclouds/blob/2077da28/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/SpotInstanceApi.java ---------------------------------------------------------------------- diff --git a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/SpotInstanceApi.java b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/SpotInstanceApi.java index 2d728e4..aee2c9d 100644 --- a/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/SpotInstanceApi.java +++ b/providers/aws-ec2/src/main/java/org/jclouds/aws/ec2/features/SpotInstanceApi.java @@ -38,6 +38,7 @@ import org.jclouds.aws.ec2.xml.DescribeSpotPriceHistoryResponseHandler; import org.jclouds.aws.ec2.xml.SpotInstanceHandler; import org.jclouds.aws.ec2.xml.SpotInstancesHandler; import org.jclouds.aws.filters.FormSigner; +import org.jclouds.ec2.binders.BindFiltersToIndexedFormParams; import org.jclouds.javax.annotation.Nullable; import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull; import org.jclouds.rest.annotations.BinderParam; @@ -48,6 +49,8 @@ import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.VirtualHost; import org.jclouds.rest.annotations.XMLResponseParser; +import com.google.common.collect.Multimap; + /** * Provides access to EC2 Spot Instances via their REST API. * <p/> @@ -89,6 +92,36 @@ public interface SpotInstanceApi { @BinderParam(BindSpotInstanceRequestIdsToIndexedFormParams.class) String... requestIds); /** + * Describes Spot Instance requests. Spot Instances are instances that Amazon EC2 starts on your + * behalf when the maximum price that you specify exceeds the current Spot Price. Amazon EC2 + * periodically sets the Spot Price based on available Spot Instance capacity and current spot + * instance requests. For conceptual information about Spot Instances, refer to the Amazon + * Elastic Compute Cloud Developer Guide or Amazon Elastic Compute Cloud User Guide. + * + * @param region + * Region where the spot instance service is running + * @param filter + * Mulitmap of filter key/values. + * + * @see #requestSpotInstancesInRegion + * @see #cancelSpotInstanceRequestsInRegion + * @see #describeSpotPriceHistoryInRegion + * @see <a href= + * "http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSpotInstanceRequests.html" + * /> + * @return TODO + */ + @Named("DescribeSpotInstanceRequests") + @POST + @Path("/") + @FormParams(keys = ACTION, values = "DescribeSpotInstanceRequests") + @Fallback(EmptySetOnNotFoundOr404.class) + @XMLResponseParser(SpotInstancesHandler.class) + Set<SpotInstanceRequest> describeSpotInstanceRequestsInRegionWithFilter( + @EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region, + @BinderParam(BindFiltersToIndexedFormParams.class) Multimap<String, String> filter); + + /** * request a single spot instance * * @param region http://git-wip-us.apache.org/repos/asf/jclouds/blob/2077da28/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiLiveTest.java index 468de54..c617439 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/AWSInstanceApiLiveTest.java @@ -21,7 +21,6 @@ import static org.testng.Assert.assertNotNull; import java.util.Set; import org.jclouds.aws.ec2.AWSEC2Api; -import org.jclouds.aws.ec2.AWSEC2ApiMetadata; import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; import org.jclouds.ec2.domain.Reservation; import org.jclouds.ec2.domain.RunningInstance; @@ -58,5 +57,4 @@ public class AWSInstanceApiLiveTest extends BaseComputeServiceContextLiveTest { assert allResults.size() >= 0 : allResults.size(); } } - } http://git-wip-us.apache.org/repos/asf/jclouds/blob/2077da28/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiExpectTest.java ---------------------------------------------------------------------- diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiExpectTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiExpectTest.java new file mode 100644 index 0000000..32502b7 --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiExpectTest.java @@ -0,0 +1,78 @@ +/* + * 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.aws.ec2.features; + +import static com.google.common.collect.Iterables.getOnlyElement; +import static org.testng.Assert.assertEquals; + +import org.jclouds.aws.ec2.AWSEC2Api; +import org.jclouds.aws.ec2.compute.internal.BaseAWSEC2ComputeServiceExpectTest; +import org.jclouds.aws.ec2.domain.PlacementGroup; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; + +/** + * @author Andrew Bayer + */ +@Test(groups = "unit", testName = "PlacementGroupApiExpectTest") +public class PlacementGroupApiExpectTest extends BaseAWSEC2ComputeServiceExpectTest { + + HttpRequest filter = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "DescribePlacementGroups") + .addFormParam("Filter.1.Name", "strategy") + .addFormParam("Filter.1.Value.1", "cluster") + .addFormParam("Signature", "SaA7Un1BE3m9jIEKyjXNdQPzFh/QAJSCebvKXiwUEK0%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2012-04-16T15%3A54%3A08.897Z") + .addFormParam("Version", "2012-06-01") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testFilterWhenResponseIs2xx() { + HttpResponse filterResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType("/describe_placement_groups.xml", "text/xml")).build(); + + AWSEC2Api apiWhenExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, filter, filterResponse) + .getContext().unwrapApi(AWSEC2Api.class); + + PlacementGroup group = getOnlyElement(apiWhenExist.getPlacementGroupApi().get().describePlacementGroupsInRegionWithFilter("us-east-1", + ImmutableMultimap.<String, String>builder() + .put("strategy", "cluster") + .build())); + + assertEquals(group.getName(), "XYZ-cluster"); + } + + public void testFilterWhenResponseIs404() { + HttpResponse filterResponse = HttpResponse.builder().statusCode(404).build(); + + AWSEC2Api apiWhenNotExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, filter, filterResponse) + .getContext().unwrapApi(AWSEC2Api.class); + + assertEquals(apiWhenNotExist.getPlacementGroupApi().get().describePlacementGroupsInRegionWithFilter("us-east-1", + ImmutableMultimap.<String, String>builder() + .put("strategy", "cluster") + .build()), + ImmutableSet.of()); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds/blob/2077da28/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java index 9c699e9..ae4d842 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/PlacementGroupApiLiveTest.java @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.Set; import java.util.SortedSet; +import org.jclouds.aws.AWSResponseException; import org.jclouds.aws.domain.Region; import org.jclouds.aws.ec2.AWSEC2Api; import org.jclouds.aws.ec2.domain.PlacementGroup; @@ -53,6 +54,7 @@ import org.testng.annotations.Test; import com.google.common.base.Predicate; import com.google.common.base.Throwables; +import com.google.common.collect.ImmutableMultimap; import com.google.inject.Module; /** @@ -84,7 +86,7 @@ public class PlacementGroupApiLiveTest extends BaseComputeServiceContextLiveTest } @Test - void testDescribe() { + public void testDescribe() { for (String region : supportedRegions) { SortedSet<PlacementGroup> allResults = newTreeSet(client.getPlacementGroupApi().get() .describePlacementGroupsInRegion(region)); @@ -110,7 +112,42 @@ public class PlacementGroupApiLiveTest extends BaseComputeServiceContextLiveTest } @Test - void testCreatePlacementGroup() { + public void testFilter() { + for (String region : supportedRegions) { + SortedSet<PlacementGroup> allResults = newTreeSet(client.getPlacementGroupApi().get() + .describePlacementGroupsInRegion(region)); + assertNotNull(allResults); + if (allResults.size() >= 1) { + PlacementGroup group = allResults.last(); + SortedSet<PlacementGroup> result = newTreeSet(client.getPlacementGroupApi().get() + .describePlacementGroupsInRegionWithFilter(region, + ImmutableMultimap.<String, String>builder() + .put("group-name", group.getName()).build())); + assertNotNull(result); + PlacementGroup compare = result.last(); + assertEquals(compare, group); + } + } + } + + @Test(expectedExceptions = AWSResponseException.class) + public void testFilterInvalid() { + for (String region : supportedRegions) { + SortedSet<PlacementGroup> allResults = newTreeSet(client.getPlacementGroupApi().get() + .describePlacementGroupsInRegion(region)); + assertNotNull(allResults); + if (allResults.size() >= 1) { + PlacementGroup group = allResults.last(); + SortedSet<PlacementGroup> result = newTreeSet(client.getPlacementGroupApi().get() + .describePlacementGroupsInRegionWithFilter(region, + ImmutableMultimap.<String, String>builder() + .put("invalid-filter", group.getName()).build())); + } + } + } + + @Test + public void testCreatePlacementGroup() { String groupName = PREFIX + "1"; for (String region : supportedRegions) { http://git-wip-us.apache.org/repos/asf/jclouds/blob/2077da28/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/SpotInstanceApiExpectTest.java ---------------------------------------------------------------------- diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/SpotInstanceApiExpectTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/SpotInstanceApiExpectTest.java new file mode 100644 index 0000000..08c852b --- /dev/null +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/SpotInstanceApiExpectTest.java @@ -0,0 +1,78 @@ +/* + * 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.aws.ec2.features; + +import static com.google.common.collect.Iterables.getOnlyElement; +import static org.testng.Assert.assertEquals; + +import org.jclouds.aws.ec2.AWSEC2Api; +import org.jclouds.aws.ec2.compute.internal.BaseAWSEC2ComputeServiceExpectTest; +import org.jclouds.aws.ec2.domain.SpotInstanceRequest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; + +/** + * @author Andrew Bayer + */ +@Test(groups = "unit", testName = "SpotInstanceApiExpectTest") +public class SpotInstanceApiExpectTest extends BaseAWSEC2ComputeServiceExpectTest { + + HttpRequest filter = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "DescribeSpotInstanceRequests") + .addFormParam("Filter.1.Name", "instance-id") + .addFormParam("Filter.1.Value.1", "i-ef308e8e") + .addFormParam("Signature", "wQtGpumMCDEzvlldKepCKeEjD9iE7eAyiRBlQztcJMA%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2012-04-16T15%3A54%3A08.897Z") + .addFormParam("Version", "2012-06-01") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testFilterWhenResponseIs2xx() { + HttpResponse filterResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType("/describe_spot_instance.xml", "text/xml")).build(); + + AWSEC2Api apiWhenExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, filter, filterResponse) + .getContext().unwrapApi(AWSEC2Api.class); + + SpotInstanceRequest request = getOnlyElement(apiWhenExist.getSpotInstanceApi().get().describeSpotInstanceRequestsInRegionWithFilter("us-east-1", + ImmutableMultimap.<String, String>builder() + .put("instance-id", "i-ef308e8e") + .build())); + + assertEquals(request.getId(), "sir-1ede0012"); + } + + public void testFilterWhenResponseIs404() { + HttpResponse filterResponse = HttpResponse.builder().statusCode(404).build(); + + AWSEC2Api apiWhenNotExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, filter, filterResponse) + .getContext().unwrapApi(AWSEC2Api.class); + + assertEquals(apiWhenNotExist.getSpotInstanceApi().get().describeSpotInstanceRequestsInRegionWithFilter("us-east-1", + ImmutableMultimap.<String, String>builder() + .put("instance-id", "i-ef308e8e") + .build()), + ImmutableSet.of()); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds/blob/2077da28/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/SpotInstanceApiLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/SpotInstanceApiLiveTest.java b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/SpotInstanceApiLiveTest.java index 88257cd..ca6ee0a 100644 --- a/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/SpotInstanceApiLiveTest.java +++ b/providers/aws-ec2/src/test/java/org/jclouds/aws/ec2/features/SpotInstanceApiLiveTest.java @@ -30,6 +30,7 @@ import java.util.Set; import java.util.SortedSet; import java.util.concurrent.TimeUnit; +import org.jclouds.aws.AWSResponseException; import org.jclouds.aws.domain.Region; import org.jclouds.aws.ec2.AWSEC2Api; import org.jclouds.aws.ec2.domain.AWSRunningInstance; @@ -44,6 +45,7 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedSet; @@ -74,7 +76,7 @@ public class SpotInstanceApiLiveTest extends BaseComputeServiceContextLiveTest } @Test - void testDescribeSpotRequestsInRegion() { + public void testDescribeSpotRequestsInRegion() { for (String region : Region.DEFAULT_REGIONS) { SortedSet<SpotInstanceRequest> allResults = ImmutableSortedSet.copyOf(client.getSpotInstanceApi().get() .describeSpotInstanceRequestsInRegion(region)); @@ -92,7 +94,45 @@ public class SpotInstanceApiLiveTest extends BaseComputeServiceContextLiveTest } @Test - void testDescribeSpotPriceHistoryInRegion() { + public void testDescribeSpotRequestsInRegionFilter() { + for (String region : Region.DEFAULT_REGIONS) { + SortedSet<SpotInstanceRequest> allResults = ImmutableSortedSet.copyOf(client.getSpotInstanceApi().get() + .describeSpotInstanceRequestsInRegion(region)); + assertNotNull(allResults); + if (allResults.size() >= 1) { + SpotInstanceRequest request = allResults.last(); + SortedSet<SpotInstanceRequest> result = ImmutableSortedSet.copyOf(client.getSpotInstanceApi().get() + .describeSpotInstanceRequestsInRegionWithFilter(region, + ImmutableMultimap.<String, String>builder() + .put("spot-instance-request-id", request.getId()).build())); + + assertNotNull(result); + SpotInstanceRequest compare = result.last(); + assertEquals(compare, request); + } + } + + } + + @Test(expectedExceptions = AWSResponseException.class) + public void testDescribeSpotRequestsInRegionFilterInvalid() { + for (String region : Region.DEFAULT_REGIONS) { + SortedSet<SpotInstanceRequest> allResults = ImmutableSortedSet.copyOf(client.getSpotInstanceApi().get() + .describeSpotInstanceRequestsInRegion(region)); + assertNotNull(allResults); + if (allResults.size() >= 1) { + SpotInstanceRequest request = allResults.last(); + SortedSet<SpotInstanceRequest> result = ImmutableSortedSet.copyOf(client.getSpotInstanceApi().get() + .describeSpotInstanceRequestsInRegionWithFilter(region, + ImmutableMultimap.<String, String>builder() + .put("invalid-filter", request.getId()).build())); + } + } + + } + + @Test + public void testDescribeSpotPriceHistoryInRegion() { for (String region : Region.DEFAULT_REGIONS) { Set<Spot> spots = client.getSpotInstanceApi().get().describeSpotPriceHistoryInRegion(region, from(new Date())); assertNotNull(spots); @@ -115,7 +155,7 @@ public class SpotInstanceApiLiveTest extends BaseComputeServiceContextLiveTest } @Test(enabled = true) - void testCreateSpotInstance() { + public void testCreateSpotInstance() { String launchGroup = PREFIX + "1"; for (String region : Region.DEFAULT_REGIONS) for (SpotInstanceRequest request : client.getSpotInstanceApi().get().describeSpotInstanceRequestsInRegion(
