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(

Reply via email to