http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticBlockStoreApiTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticBlockStoreApiTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticBlockStoreApiTest.java new file mode 100644 index 0000000..f47e65b --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticBlockStoreApiTest.java @@ -0,0 +1,399 @@ +/* + * 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.features; + +import static org.jclouds.ec2.options.DescribeSnapshotsOptions.Builder.ownedBy; +import static org.jclouds.ec2.options.DetachVolumeOptions.Builder.fromInstance; +import static org.jclouds.reflect.Reflection2.method; + +import java.io.IOException; + +import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404; +import org.jclouds.ec2.EC2Fallbacks.VoidOnVolumeAvailable; +import org.jclouds.ec2.options.CreateSnapshotOptions; +import org.jclouds.ec2.options.DescribeSnapshotsOptions; +import org.jclouds.ec2.options.DetachVolumeOptions; +import org.jclouds.ec2.xml.AttachmentHandler; +import org.jclouds.ec2.xml.DescribeSnapshotsResponseHandler; +import org.jclouds.ec2.xml.DescribeVolumesResponseHandler; +import org.jclouds.ec2.xml.PermissionHandler; +import org.jclouds.ec2.xml.SnapshotHandler; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ReleasePayloadAndReturn; +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import com.google.common.reflect.Invokable; +/** + * Tests behavior of {@code ElasticBlockStoreApi} + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +@Test(groups = "unit", testName = "ElasticBlockStoreApiTest") +public class ElasticBlockStoreApiTest extends BaseEC2ApiTest<ElasticBlockStoreApi> { + + public void testDeleteVolume() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "deleteVolumeInRegion", String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "id")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=DeleteVolume&VolumeId=id", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest describeVolumes = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "DescribeVolumes") + .addFormParam("Signature", "nNxWg5dwYZEQu1QCzCtNp7iDmPR8wXXdKhWmLEKFLGI%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testDescribeVolumes() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "describeVolumesInRegion", String.class, + String[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList((String) null)); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, describeVolumes.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, DescribeVolumesResponseHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testDescribeVolumesArgs() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "describeVolumesInRegion", String.class, + String[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=DescribeVolumes&VolumeId.1=1&VolumeId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, DescribeVolumesResponseHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest attachVolume = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "AttachVolume") + .addFormParam("Device", "/device") + .addFormParam("InstanceId", "instanceId") + .addFormParam("Signature", "0%2BUY5oCQzoJapEHq4Dl2R/0nAA8uXEHqvHbnnNI5NcA%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Version", "2010-08-31") + .addFormParam("VolumeId", "id") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testAttachVolume() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "attachVolumeInRegion", String.class, String.class, + String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "id", "instanceId", "/device")); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, attachVolume.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, AttachmentHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest detachVolume = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "DetachVolume") + .addFormParam("Force", "false") + .addFormParam("Signature", "tfNB1g2WVqb3EwvBJlk4duU1H1fDOa1SBstsm1elpbg%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Version", "2010-08-31") + .addFormParam("VolumeId", "id") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testDetachVolume() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "detachVolumeInRegion", String.class, String.class, + boolean.class, DetachVolumeOptions[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "id", false)); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, detachVolume.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, VoidOnVolumeAvailable.class); + + checkFilters(request); + } + + HttpRequest detachVolumeOptions = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "DetachVolume") + .addFormParam("Device", "/device") + .addFormParam("Force", "true") + .addFormParam("InstanceId", "instanceId") + .addFormParam("Signature", "VFhgwdkKBKXr/dEn2gvk6Vqq3JIunw4zZgM2Tt/ouME%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Version", "2010-08-31") + .addFormParam("VolumeId", "id") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testDetachVolumeOptions() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "detachVolumeInRegion", String.class, String.class, + boolean.class, DetachVolumeOptions[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "id", true, fromInstance("instanceId").fromDevice( + "/device"))); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, detachVolumeOptions.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, VoidOnVolumeAvailable.class); + + checkFilters(request); + } + + public void testCreateSnapshot() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "createSnapshotInRegion", String.class, + String.class, CreateSnapshotOptions[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "volumeId")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=CreateSnapshot&VolumeId=volumeId", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, SnapshotHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testCreateSnapshotOptions() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "createSnapshotInRegion", String.class, + String.class, CreateSnapshotOptions[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "volumeId", CreateSnapshotOptions.Builder + .withDescription("description"))); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Action=CreateSnapshot&VolumeId=volumeId&Description=description", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, SnapshotHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testDescribeSnapshots() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "describeSnapshotsInRegion", String.class, + DescribeSnapshotsOptions[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList((String) null)); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=DescribeSnapshots", "application/x-www-form-urlencoded", + false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, DescribeSnapshotsResponseHandler.class); + assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testDescribeSnapshotsArgs() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "describeSnapshotsInRegion", String.class, + DescribeSnapshotsOptions[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, ownedBy("o1", "o2").restorableBy("r1", "r2") + .snapshotIds("s1", "s2"))); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Action=DescribeSnapshots&Owner.1=o1&Owner.2=o2&RestorableBy.1=r1&RestorableBy.2=r2&SnapshotId.1=s1&SnapshotId.2=s2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, DescribeSnapshotsResponseHandler.class); + assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testGetCreateVolumePermissionForSnapshot() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "getCreateVolumePermissionForSnapshotInRegion", + String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "snapshotId")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Action=DescribeSnapshotAttribute&Attribute=createVolumePermission&SnapshotId=snapshotId", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, PermissionHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest addCreateVolumePermissionsToSnapshot = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "ModifySnapshotAttribute") + .addFormParam("Attribute", "createVolumePermission") + .addFormParam("OperationType", "add") + .addFormParam("Signature", "s8m8DqQRXmecWguuRjxfl3Ibd%2B1AjjktGzTlJLUTcPc%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("SnapshotId", "snapshotId") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("UserGroup.1", "all") + .addFormParam("UserId.1", "bob") + .addFormParam("UserId.2", "sue") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testAddCreateVolumePermissionsToSnapshot() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "addCreateVolumePermissionsToSnapshotInRegion", + String.class, Iterable.class, Iterable.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, ImmutableList.of("bob", "sue"), ImmutableList + .of("all"), "snapshotId")); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, addCreateVolumePermissionsToSnapshot.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest removeCreateVolumePermissionsFromSnapshot = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "ModifySnapshotAttribute") + .addFormParam("Attribute", "createVolumePermission") + .addFormParam("OperationType", "remove") + .addFormParam("Signature", "RzxHUIWV80cyhQDtrMiHDWUosS1g8cn1%2B7ONLJCe1dg%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("SnapshotId", "snapshotId") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("UserGroup.1", "all") + .addFormParam("UserId.1", "bob") + .addFormParam("UserId.2", "sue") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testRemoveCreateVolumePermissionsFromSnapshot() throws SecurityException, NoSuchMethodException, + IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "removeCreateVolumePermissionsFromSnapshotInRegion", + String.class, Iterable.class, Iterable.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, ImmutableList.of("bob", "sue"), ImmutableList + .of("all"), "snapshotId")); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, removeCreateVolumePermissionsFromSnapshot.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testResetCreateVolumePermissionsOnSnapshot() throws SecurityException, NoSuchMethodException, + IOException { + Invokable<?, ?> method = method(ElasticBlockStoreApi.class, "resetCreateVolumePermissionsOnSnapshotInRegion", + String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "snapshotId")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Action=ResetSnapshotAttribute&Attribute=createVolumePermission&SnapshotId=snapshotId", + "application/x-www-form-urlencoded", false); + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } +}
http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiExpectTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiExpectTest.java new file mode 100644 index 0000000..f96610b --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiExpectTest.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.features; + +import static com.google.common.collect.Iterables.getOnlyElement; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.Properties; + +import org.jclouds.Constants; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.domain.PublicIpInstanceIdPair; +import org.jclouds.ec2.internal.BaseEC2ApiExpectTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.rest.internal.BaseRestApiExpectTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; + +/** + * + * @see org.jclouds.ec2.features.ElasticIPAddressApi + */ +@Test(groups = "unit") +public class ElasticIPAddressApiExpectTest extends BaseEC2ApiExpectTest<EC2Api> { + + protected Properties setupProperties() { + Properties props = super.setupProperties(); + props.put(Constants.PROPERTY_API_VERSION, "2010-08-31"); + return props; + } + + HttpRequest filter = + HttpRequest.builder() + .method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .payload(BaseRestApiExpectTest.payloadFromStringWithContentType( + "Action=DescribeAddresses" + + "&Filter.1.Name=instance-id" + + "&Filter.1.Value.1=i-f15ebb98" + + "&Signature=dJbTUsBGHSrarQQAwmLm8LLI255R/lzdE7ZcYJucOzI%3D" + + "&SignatureMethod=HmacSHA256" + + "&SignatureVersion=2" + + "&Timestamp=2012-04-16T15%3A54%3A08.897Z" + + "&Version=2010-08-31" + + "&AWSAccessKeyId=identity", + "application/x-www-form-urlencoded")) + .build(); + + public void testFilterWhenResponseIs2xx() throws Exception { + + HttpResponse filterResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType("/describe_addresses_single.xml", "text/xml")).build(); + + + EC2Api apiWhenExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, + filter, filterResponse); + + PublicIpInstanceIdPair address = getOnlyElement(apiWhenExist.getElasticIPAddressApi() + .get().describeAddressesInRegionWithFilter("us-east-1", + ImmutableMultimap.<String, String>builder() + .put("instance-id", "i-f15ebb98") + .build())); + assertNotNull(address, "address should not be null"); + + assertEquals(address.getPublicIp(), "67.202.55.255"); + } + + public void testFilterWhenResponseIs404() throws Exception { + + HttpResponse filterResponse = HttpResponse.builder().statusCode(404).build(); + + EC2Api apiWhenDontExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, + filter, filterResponse); + + assertEquals(apiWhenDontExist.getElasticIPAddressApi() + .get().describeAddressesInRegionWithFilter("us-east-1", + ImmutableMultimap.<String, String>builder() + .put("instance-id", "i-f15ebb98") + .build()), ImmutableSet.of()); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiLiveTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiLiveTest.java new file mode 100644 index 0000000..f2e7c69 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiLiveTest.java @@ -0,0 +1,75 @@ +/* + * 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.features; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.SortedSet; + +import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.domain.PublicIpInstanceIdPair; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Sets; + +/** + * Tests behavior of {@code ElasticIPAddressApi} + */ +@Test(groups = "live", singleThreaded = true, testName = "ElasticIPAddressApiLiveTest") +public class ElasticIPAddressApiLiveTest extends BaseComputeServiceContextLiveTest { + public ElasticIPAddressApiLiveTest() { + provider = "ec2"; + } + + private EC2Api ec2Api; + private ElasticIPAddressApi client; + + @Override + @BeforeClass(groups = { "integration", "live" }) + public void setupContext() { + super.setupContext(); + ec2Api = view.unwrapApi(EC2Api.class); + client = ec2Api.getElasticIPAddressApi().get(); + } + + @Test + void testDescribeAddresses() { + for (String region : ec2Api.getConfiguredRegions()) { + SortedSet<PublicIpInstanceIdPair> allResults = Sets.newTreeSet(client.describeAddressesInRegion(region)); + assertNotNull(allResults); + if (!allResults.isEmpty()) { + PublicIpInstanceIdPair pair = allResults.last(); + SortedSet<PublicIpInstanceIdPair> result = Sets.newTreeSet(client.describeAddressesInRegion(region, pair + .getPublicIp())); + assertNotNull(result); + PublicIpInstanceIdPair compare = result.last(); + assertEquals(compare, pair); + + SortedSet<PublicIpInstanceIdPair> filterResult = Sets.newTreeSet(client.describeAddressesInRegionWithFilter( + region, ImmutableMultimap.<String, String>builder().put("public-ip", pair.getPublicIp()).build())); + assertNotNull(filterResult); + PublicIpInstanceIdPair filterCompare = filterResult.last(); + assertEquals(filterCompare, pair); + } + } + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiTest.java new file mode 100644 index 0000000..48f7b4c --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/ElasticIPAddressApiTest.java @@ -0,0 +1,138 @@ +/* + * 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.features; + +import static org.jclouds.reflect.Reflection2.method; + +import java.io.IOException; + +import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404; +import org.jclouds.ec2.xml.AllocateAddressResponseHandler; +import org.jclouds.ec2.xml.DescribeAddressesResponseHandler; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ReleasePayloadAndReturn; +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.testng.annotations.Test; + +import com.google.common.collect.Lists; +import com.google.common.reflect.Invokable; +/** + * Tests behavior of {@code ElasticIPAddressApi} + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +@Test(groups = "unit", testName = "ElasticIPAddressApiTest") +public class ElasticIPAddressApiTest extends BaseEC2ApiTest<ElasticIPAddressApi> { + + public void testDisassociateAddress() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticIPAddressApi.class, "disassociateAddressInRegion", String.class, + String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "127.0.0.1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=DisassociateAddress&PublicIp=127.0.0.1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest associateAddress = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "AssociateAddress") + .addFormParam("InstanceId", "me") + .addFormParam("PublicIp", "127.0.0.1") + .addFormParam("Signature", "nLU6xGLqXtT/dmyAvkN4BdL/3CxQlDWJYeskikhl54k%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testAssociateAddress() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticIPAddressApi.class, "associateAddressInRegion", String.class, + String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "127.0.0.1", "me")); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, associateAddress.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testReleaseAddress() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticIPAddressApi.class, "releaseAddressInRegion", String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "127.0.0.1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=ReleaseAddress&PublicIp=127.0.0.1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testDescribeAddresses() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticIPAddressApi.class, "describeAddressesInRegion", String.class, + String[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "127.0.0.1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=DescribeAddresses&PublicIp.1=127.0.0.1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, DescribeAddressesResponseHandler.class); + assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testAllocateAddress() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(ElasticIPAddressApi.class, "allocateAddressInRegion", String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList((String) null)); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=AllocateAddress", "application/x-www-form-urlencoded", + false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, AllocateAddressResponseHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiExpectTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiExpectTest.java new file mode 100644 index 0000000..a862e30 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiExpectTest.java @@ -0,0 +1,100 @@ +/* + * 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.features; + +import static com.google.common.collect.Iterables.getOnlyElement; +import static org.testng.Assert.assertNotNull; + +import java.util.Properties; + +import org.jclouds.Constants; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.ec2.internal.BaseEC2ApiExpectTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.rest.internal.BaseRestApiExpectTest; +import org.jclouds.util.Strings2; +import org.testng.Assert; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; + +/** + * + * @see InstanceApi + */ +@Test(groups = "unit") +public class InstanceApiExpectTest extends BaseEC2ApiExpectTest<EC2Api> { + + protected Properties setupProperties() { + Properties props = super.setupProperties(); + props.put(Constants.PROPERTY_API_VERSION, "2010-08-31"); + return props; + } + + HttpRequest filter = + HttpRequest.builder() + .method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .payload(BaseRestApiExpectTest.payloadFromStringWithContentType( + "Action=DescribeInstances" + + "&Filter.1.Name=key-name" + + "&Filter.1.Value.1=" + Strings2.urlEncode("adriancole.ec21") + + "&Signature=%2B2ktAljlAPNUMAJUFh3poQrTvwcwWytuQFBg/ktKdTc%3D" + + "&SignatureMethod=HmacSHA256" + + "&SignatureVersion=2" + + "&Timestamp=2012-04-16T15%3A54%3A08.897Z" + + "&Version=2010-08-31" + + "&AWSAccessKeyId=identity", + "application/x-www-form-urlencoded")) + .build(); + + public void testFilterWhenResponseIs2xx() throws Exception { + + HttpResponse filterResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType("/describe_instances_running.xml", "text/xml")).build(); + + + EC2Api apiWhenExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, + filter, filterResponse); + + RunningInstance instance = getOnlyElement(getOnlyElement(apiWhenExist.getInstanceApi().get().describeInstancesInRegionWithFilter("us-east-1", + ImmutableMultimap.<String, String>builder() + .put("key-name", "adriancole.ec21") + .build()))); + assertNotNull(instance, "Instance should not be null"); + + Assert.assertEquals(instance.getId(), "i-0799056f"); + } + + public void testFilterWhenResponseIs404() throws Exception { + + HttpResponse filterResponse = HttpResponse.builder().statusCode(404).build(); + + EC2Api apiWhenDontExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, + filter, filterResponse); + + Assert.assertEquals(apiWhenDontExist.getInstanceApi().get().describeInstancesInRegionWithFilter("us-east-1", + ImmutableMultimap.<String, String>builder() + .put("key-name", "adriancole.ec21") + .build()), ImmutableSet.of()); + } + +} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiLiveTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiLiveTest.java new file mode 100644 index 0000000..f8ce897 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiLiveTest.java @@ -0,0 +1,95 @@ +/* + * 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.features; + +import static com.google.common.collect.Iterables.getFirst; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import java.util.Set; + +import org.jclouds.aws.AWSResponseException; +import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.domain.Reservation; +import org.jclouds.ec2.domain.RunningInstance; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMultimap; + +/** + * Tests behavior of {@code EC2Api} + */ +@Test(groups = "live", singleThreaded = true, testName = "InstanceApiLiveTest") +public class InstanceApiLiveTest extends BaseComputeServiceContextLiveTest { + public InstanceApiLiveTest() { + provider = "ec2"; + } + + private EC2Api ec2Api; + private InstanceApi client; + + @Override + @BeforeClass(groups = { "integration", "live" }) + public void setupContext() { + super.setupContext(); + ec2Api = view.unwrapApi(EC2Api.class); + client = ec2Api.getInstanceApi().get(); + } + + @Test + void testDescribeInstances() { + for (String region : ec2Api.getConfiguredRegions()) { + Set<? extends Reservation<? extends RunningInstance>> allResults = client.describeInstancesInRegion(region); + assertNotNull(allResults); + } + } + + @Test + void testFilterInstances() { + for (String region : view.unwrapApi(EC2Api.class).getAvailabilityZoneAndRegionApi().get().describeRegions().keySet()) { + Set<? extends Reservation<? extends RunningInstance>> allResults = client.describeInstancesInRegion(region); + assertNotNull(allResults); + + if (!allResults.isEmpty()) { + RunningInstance instance = getFirst(getFirst(allResults, null), null); + + assertNotNull(instance); + + Set<? extends Reservation<? extends RunningInstance>> filterResults = client.describeInstancesInRegionWithFilter(region, + ImmutableMultimap.<String, String>builder() + .put("key-name", instance.getKeyName()) + .build()); + + assertNotNull(filterResults); + assertTrue(!filterResults.isEmpty(), "No results found for filter, but there should be."); + + } + } + } + + @Test(expectedExceptions = AWSResponseException.class) + void testInvalidFilterInstances() { + for (String region : view.unwrapApi(EC2Api.class).getAvailabilityZoneAndRegionApi().get().describeRegions().keySet()) { + Set<? extends Reservation<? extends RunningInstance>> filterResults = client.describeInstancesInRegionWithFilter(region, + ImmutableMultimap.<String, String>builder() + .put("invalid-key", "some-value") + .build()); + + } + }} http://git-wip-us.apache.org/repos/asf/stratos/blob/397d9926/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiTest.java new file mode 100644 index 0000000..8a68517 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/features/InstanceApiTest.java @@ -0,0 +1,591 @@ +/* + * 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.features; + +import static org.jclouds.reflect.Reflection2.method; + +import java.io.IOException; +import java.util.Map; + +import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404; +import org.jclouds.ec2.domain.BlockDevice; +import org.jclouds.ec2.domain.InstanceType; +import org.jclouds.ec2.domain.Volume.InstanceInitiatedShutdownBehavior; +import org.jclouds.ec2.options.RunInstancesOptions; +import org.jclouds.ec2.xml.BlockDeviceMappingHandler; +import org.jclouds.ec2.xml.BooleanValueHandler; +import org.jclouds.ec2.xml.DescribeInstancesResponseHandler; +import org.jclouds.ec2.xml.GetConsoleOutputResponseHandler; +import org.jclouds.ec2.xml.InstanceInitiatedShutdownBehaviorHandler; +import org.jclouds.ec2.xml.InstanceStateChangeHandler; +import org.jclouds.ec2.xml.InstanceTypeHandler; +import org.jclouds.ec2.xml.RunInstancesResponseHandler; +import org.jclouds.ec2.xml.StringValueHandler; +import org.jclouds.ec2.xml.UnencodeStringValueHandler; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ReleasePayloadAndReturn; +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.reflect.Invokable; +/** + * Tests behavior of {@code InstanceApi} + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +@Test(groups = "unit", testName = "InstanceApiTest") +public class InstanceApiTest extends BaseEC2ApiTest<InstanceApi> { + public void testDescribeInstances() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "describeInstancesInRegion", String.class, String[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList((String) null)); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=DescribeInstances", "application/x-www-form-urlencoded", + false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, DescribeInstancesResponseHandler.class); + assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testDescribeInstancesArgs() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "describeInstancesInRegion", String.class, String[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=DescribeInstances&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, DescribeInstancesResponseHandler.class); + assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testTerminateInstances() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "terminateInstancesInRegion", String.class, + String[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=TerminateInstances&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceStateChangeHandler.class); + assertFallbackClassEquals(method, EmptySetOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testRunInstances() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "runInstancesInRegion", String.class, String.class, + String.class, int.class, int.class, RunInstancesOptions[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, null, "ami-voo", 1, 1)); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + try { + assertPayloadEquals(request, "Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=1", + "application/x-www-form-urlencoded", false); + } catch (AssertionError e) { + // mvn 3.0 osx 10.6.5 somehow sorts differently + assertPayloadEquals(request, "Action=RunInstances&ImageId=ami-voo&MaxCount=1&MinCount=1", + "application/x-www-form-urlencoded", false); + } + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, RunInstancesResponseHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testRunInstancesOptions() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "runInstancesInRegion", String.class, String.class, + String.class, int.class, int.class, RunInstancesOptions[].class); + GeneratedHttpRequest request = processor.createRequest(method, ImmutableList.<Object> of("eu-west-1", "eu-west-1a", "ami-voo", + 1, 5, new RunInstancesOptions().withKernelId("kernelId").withSecurityGroups("group1", "group2"))); + + assertRequestLineEquals(request, "POST https://ec2.eu-west-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.eu-west-1.amazonaws.com\n"); + try { + assertPayloadEquals( + request, + "Action=RunInstances&ImageId=ami-voo&MinCount=1&MaxCount=5&KernelId=kernelId&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.AvailabilityZone=eu-west-1a", + "application/x-www-form-urlencoded", false); + } catch (AssertionError e) { + // mvn 3.0 osx 10.6.5 somehow sorts differently + assertPayloadEquals( + request, + "Action=RunInstances&ImageId=ami-voo&MaxCount=5&MinCount=1&KernelId=kernelId&SecurityGroup.1=group1&SecurityGroup.2=group2&Placement.AvailabilityZone=eu-west-1a", + "application/x-www-form-urlencoded", false); + } + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, RunInstancesResponseHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testStopInstances() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "stopInstancesInRegion", String.class, boolean.class, + String[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, true, "1", "2")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=StopInstances&Force=true&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceStateChangeHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testRebootInstances() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "rebootInstancesInRegion", String.class, String[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=RebootInstances&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testStartInstances() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "startInstancesInRegion", String.class, String[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "2")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=StartInstances&InstanceId.1=1&InstanceId.2=2", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceStateChangeHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testGetUserDataForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "getUserDataForInstanceInRegion", String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Action=DescribeInstanceAttribute&Attribute=userData&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, UnencodeStringValueHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testGetRootDeviceNameForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "getRootDeviceNameForInstanceInRegion", String.class, + String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Action=DescribeInstanceAttribute&Attribute=rootDeviceName&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, StringValueHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testGetRamdiskForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "getRamdiskForInstanceInRegion", String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Action=DescribeInstanceAttribute&Attribute=ramdisk&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, StringValueHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testGetDisableApiTerminationForInstanceInRegion() throws SecurityException, NoSuchMethodException, + IOException { + Invokable<?, ?> method = method(InstanceApi.class, "isApiTerminationDisabledForInstanceInRegion", String.class, + String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Action=DescribeInstanceAttribute&Attribute=disableApiTermination&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, BooleanValueHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testGetKernelForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "getKernelForInstanceInRegion", String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, "Action=DescribeInstanceAttribute&Attribute=kernel&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, StringValueHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testGetInstanceTypeForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "getInstanceTypeForInstanceInRegion", String.class, + String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Action=DescribeInstanceAttribute&Attribute=instanceType&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceTypeHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testGetInstanceInitiatedShutdownBehaviorForInstanceInRegion() throws SecurityException, + NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "getInstanceInitiatedShutdownBehaviorForInstanceInRegion", + String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals( + request, + "Action=DescribeInstanceAttribute&Attribute=instanceInitiatedShutdownBehavior&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, InstanceInitiatedShutdownBehaviorHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + public void testGetBlockDeviceMappingForInstanceInRegion() throws SecurityException, NoSuchMethodException, + IOException { + Invokable<?, ?> method = method(InstanceApi.class, "getBlockDeviceMappingForInstanceInRegion", String.class, + String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Action=DescribeInstanceAttribute&Attribute=blockDeviceMapping&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, BlockDeviceMappingHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest setUserDataForInstance = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "ModifyInstanceAttribute") + .addFormParam("Attribute", "userData") + .addFormParam("InstanceId", "1") + .addFormParam("Signature", "SfxT/1i/WokibleyEHo0zHizHisLzbDzzRxfOdnr1vY%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Value", "dGVzdA%3D%3D") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testSetUserDataForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "setUserDataForInstanceInRegion", String.class, String.class, + byte[].class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "test".getBytes())); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, setUserDataForInstance.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest setRamdiskForInstance = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "ModifyInstanceAttribute") + .addFormParam("Attribute", "ramdisk") + .addFormParam("InstanceId", "1") + .addFormParam("Signature", "aMQzFsknmQt1OA8Rb8aIzZoFXGK23UvrMIy8imNVUeQ%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Value", "test") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testSetRamdiskForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "setRamdiskForInstanceInRegion", String.class, String.class, + String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "test")); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, setRamdiskForInstance.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest setKernelForInstance = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "ModifyInstanceAttribute") + .addFormParam("Attribute", "kernel") + .addFormParam("InstanceId", "1") + .addFormParam("Signature", "GaQ9sC0uXHlN5JAMWQpYx%2Bc3XaF38qZgJex/kyqdR1E%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Value", "test") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testSetKernelForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "setKernelForInstanceInRegion", String.class, String.class, + String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", "test")); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, setKernelForInstance.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest setApiTerminationDisabled = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "ModifyInstanceAttribute") + .addFormParam("Attribute", "disableApiTermination") + .addFormParam("InstanceId", "1") + .addFormParam("Signature", "hErzi%2Bf4jBADviJ%2BLVTTGhlHWhMR/pyPUSBZgaHC79I%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Value", "true") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testSetApiTerminationDisabledForInstanceInRegion() throws SecurityException, NoSuchMethodException, + IOException { + Invokable<?, ?> method = method(InstanceApi.class, "setApiTerminationDisabledForInstanceInRegion", String.class, + String.class, boolean.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", true)); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, setApiTerminationDisabled.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest instanceTypeForInstance = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "ModifyInstanceAttribute") + .addFormParam("Attribute", "instanceType") + .addFormParam("InstanceId", "1") + .addFormParam("Signature", "OYJQ1w79NoxkcrawNK6U71k3Wl78kqz2ikzTXmQCX2E%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Value", "c1.medium") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testSetInstanceTypeForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "setInstanceTypeForInstanceInRegion", String.class, + String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", InstanceType.C1_MEDIUM)); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, instanceTypeForInstance.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest setInstanceInitiatedShutdownBehavior = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "ModifyInstanceAttribute") + .addFormParam("Attribute", "instanceInitiatedShutdownBehavior") + .addFormParam("InstanceId", "1") + .addFormParam("Signature", "2Tgi9M9AcCv5Y%2BEXwq0SD6g8bBGtPPEgjdTtfdGZQlI%3D") + .addFormParam("SignatureMethod", "HmacSHA256") + .addFormParam("SignatureVersion", "2") + .addFormParam("Timestamp", "2009-11-08T15%3A54%3A08.897Z") + .addFormParam("Value", "terminate") + .addFormParam("Version", "2010-08-31") + .addFormParam("AWSAccessKeyId", "identity").build(); + + public void testSetInstanceInitiatedShutdownBehaviorForInstanceInRegion() throws SecurityException, + NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "setInstanceInitiatedShutdownBehaviorForInstanceInRegion", + String.class, String.class, InstanceInitiatedShutdownBehavior.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", InstanceInitiatedShutdownBehavior.TERMINATE)); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, setInstanceInitiatedShutdownBehavior.getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } + + HttpRequest setBlockDeviceMapping = HttpRequest.builder().method("POST") + .endpoint("https://ec2.us-east-1.amazonaws.com/") + .addHeader("Host", "ec2.us-east-1.amazonaws.com") + .addFormParam("Action", "ModifyInstanceAttribute") + .addFormParam("BlockDeviceMapping.1.DeviceName", "/dev/sda1") + .addFormParam("BlockDeviceMapping.1.Ebs.DeleteOnTermination", "true") + .addFormParam("BlockDeviceMapping.1.Ebs.VolumeId", "vol-test1") + .addFormParam("InstanceId", "1").build(); + + public void testSetBlockDeviceMappingForInstanceInRegion() throws SecurityException, NoSuchMethodException, + IOException { + Invokable<?, ?> method = method(InstanceApi.class, "setBlockDeviceMappingForInstanceInRegion", String.class, + String.class, Map.class); + + Map<String, BlockDevice> mapping = Maps.newLinkedHashMap(); + mapping.put("/dev/sda1", new BlockDevice("vol-test1", true)); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1", mapping)); + + request = (GeneratedHttpRequest) request.getFilters().get(0).filter(request); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, filter.filter(setBlockDeviceMapping).getPayload().getRawContent().toString(), + "application/x-www-form-urlencoded", false); + + + checkFilters(request); + } + + public void testGetConsoleOutputForInstanceInRegion() throws SecurityException, NoSuchMethodException, IOException { + Invokable<?, ?> method = method(InstanceApi.class, "getConsoleOutputForInstanceInRegion", String.class, String.class); + GeneratedHttpRequest request = processor.createRequest(method, Lists.<Object> newArrayList(null, "1")); + + assertRequestLineEquals(request, "POST https://ec2.us-east-1.amazonaws.com/ HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Host: ec2.us-east-1.amazonaws.com\n"); + assertPayloadEquals(request, + "Action=GetConsoleOutput&InstanceId=1", + "application/x-www-form-urlencoded", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, GetConsoleOutputResponseHandler.class); + assertFallbackClassEquals(method, null); + + checkFilters(request); + } +}
