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/compute/config/EC2ComputeServiceContextModuleTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/config/EC2ComputeServiceContextModuleTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/config/EC2ComputeServiceContextModuleTest.java new file mode 100644 index 0000000..cd0170c --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/config/EC2ComputeServiceContextModuleTest.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.config; + +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.testng.Assert.fail; + +import org.jclouds.compute.domain.Image; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.loaders.RegionAndIdToImage; +import org.jclouds.rest.AuthorizationException; +import org.testng.annotations.Test; + +import com.google.common.base.Supplier; +import com.google.common.cache.CacheLoader; + +@Test(groups = "unit") +public class EC2ComputeServiceContextModuleTest { + + @Test + public void testCacheLoaderDoesNotReloadAfterAuthorizationException() throws Exception { + EC2ComputeServiceContextModule module = new EC2ComputeServiceContextModule() { + public Supplier<CacheLoader<RegionAndName, Image>> provideRegionAndNameToImageSupplierCacheLoader(RegionAndIdToImage delegate) { + return super.provideRegionAndNameToImageSupplierCacheLoader(delegate); + } + }; + + RegionAndName regionAndName = new RegionAndName("myregion", "myname"); + AuthorizationException authException = new AuthorizationException(); + + RegionAndIdToImage mockRegionAndIdToImage = createMock(RegionAndIdToImage.class); + expect(mockRegionAndIdToImage.load(regionAndName)).andThrow(authException).once(); + replay(mockRegionAndIdToImage); + + CacheLoader<RegionAndName, Image> cacheLoader = module.provideRegionAndNameToImageSupplierCacheLoader(mockRegionAndIdToImage).get(); + + for (int i = 0; i < 2; i++) { + try { + Image image = cacheLoader.load(regionAndName); + fail("Expected Authorization exception, but got " + image); + } catch (AuthorizationException e) { + // success + } + } + } +}
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/compute/extensions/EC2ImageExtensionExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2ImageExtensionExpectTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2ImageExtensionExpectTest.java new file mode 100644 index 0000000..4ca6c62 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2ImageExtensionExpectTest.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.extensions; + +import static org.testng.Assert.assertEquals; + +import javax.ws.rs.core.MediaType; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.ImageTemplate; +import org.jclouds.compute.extensions.ImageExtension; +import org.jclouds.ec2.compute.internal.BaseEC2ComputeServiceExpectTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; +import com.google.common.util.concurrent.Futures; + +@Test(groups = "unit", testName = "EC2ImageExtensionExpectTest") +public class EC2ImageExtensionExpectTest extends BaseEC2ComputeServiceExpectTest { + + public void testCreateImage() { + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeImagesRequest, describeImagesResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + requestResponseMap.put(describeSecurityGroupRequest, describeSecurityGroupResponse); + requestResponseMap.put(authorizeSecurityGroupIngressRequest22, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(authorizeSecurityGroupIngressRequestGroup, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(describeInstanceRequest, describeInstanceResponse); + + HttpRequest createImageRequest = formSigner.filter(HttpRequest.builder().method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "CreateImage") + .addFormParam("InstanceId", "i-2baa5550") + .addFormParam("Name", "test").build()); + + HttpResponse createImageResponse = HttpResponse.builder() + .statusCode(200) + .payload(payloadFromStringWithContentType( + "<CreateImageResponse><imageId>ami-be3adfd7</imageId></CreateImageResponse>", MediaType.APPLICATION_XML)).build(); + + requestResponseMap.put(createImageRequest, createImageResponse); + + HttpRequest describeImageRequest = formSigner.filter(HttpRequest.builder().method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeImages") + .addFormParam("ImageId.1", "ami-be3adfd7").build()); + + requestResponseMap.put(describeImageRequest, describeImagesResponse); + + ImageExtension apiThatCreatesImage = requestsSendResponses(requestResponseMap.build()).getImageExtension().get(); + + ImageTemplate newImageTemplate = apiThatCreatesImage.buildImageTemplateFromNode("test", "us-east-1/i-2baa5550"); + + Image image = Futures.getUnchecked(apiThatCreatesImage.createImage(newImageTemplate)); + assertEquals(image.getId(), "us-east-1/ami-be3adfd7"); + } + +} 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/compute/extensions/EC2ImageExtensionLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2ImageExtensionLiveTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2ImageExtensionLiveTest.java new file mode 100644 index 0000000..3be04db --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2ImageExtensionLiveTest.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.extensions; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Properties; + +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.domain.TemplateBuilderSpec; +import org.jclouds.compute.extensions.internal.BaseImageExtensionLiveTest; +import org.jclouds.sshj.config.SshjSshClientModule; +import org.testng.annotations.Test; + +import com.google.inject.Module; + +/** + * Live test for ec2 {@link ImageExtension} implementation + */ +@Test(groups = "live", singleThreaded = true, testName = "EC2ImageExtensionLiveTest") +public class EC2ImageExtensionLiveTest extends BaseImageExtensionLiveTest { + protected TemplateBuilderSpec ebsTemplate; + + public EC2ImageExtensionLiveTest() { + provider = "ec2"; + } + + @Override + protected Properties setupProperties() { + Properties overrides = super.setupProperties(); + String ebsSpec = checkNotNull(setIfTestSystemPropertyPresent(overrides, provider + ".ebs-template"), provider + + ".ebs-template"); + ebsTemplate = TemplateBuilderSpec.parse(ebsSpec); + return overrides; + } + + @Override + public Template getNodeTemplate() { + return view.getComputeService().templateBuilder().from(ebsTemplate).build(); + } + + @Override + protected Module getSshModule() { + return new SshjSshClientModule(); + } + +} 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/compute/extensions/EC2SecurityGroupExtensionExpectTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2SecurityGroupExtensionExpectTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2SecurityGroupExtensionExpectTest.java new file mode 100644 index 0000000..5bb73bb --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2SecurityGroupExtensionExpectTest.java @@ -0,0 +1,579 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.extensions; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import java.util.Set; + +import javax.ws.rs.core.MediaType; + +import org.jclouds.compute.domain.SecurityGroup; +import org.jclouds.compute.domain.SecurityGroupBuilder; +import org.jclouds.compute.extensions.SecurityGroupExtension; +import org.jclouds.domain.LocationBuilder; +import org.jclouds.domain.LocationScope; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.compute.internal.BaseEC2ComputeServiceExpectTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.net.domain.IpPermission; +import org.jclouds.net.domain.IpProtocol; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; + +@Test(groups = "unit", testName = "EC2SecurityGroupExtensionExpectTest") +public class EC2SecurityGroupExtensionExpectTest extends BaseEC2ComputeServiceExpectTest { + + public void testListSecurityGroups() { + HttpRequest describeSecurityGroupsAllRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups").build()); + + HttpResponse describeSecurityGroupsAllResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_new.xml", MediaType.APPLICATION_XML)).build(); + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsAllRequest, describeSecurityGroupsAllResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequest22, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(authorizeSecurityGroupIngressRequestGroup, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(describeInstanceRequest, describeInstanceResponse); + + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + Set<SecurityGroup> groups = extension.listSecurityGroups(); + assertEquals(2, groups.size()); + } + + public void testListSecurityGroupsInLocation() { + HttpRequest describeSecurityGroupsAllRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups").build()); + + HttpResponse describeSecurityGroupsAllResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_new.xml", MediaType.APPLICATION_XML)).build(); + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsAllRequest, describeSecurityGroupsAllResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequest22, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(authorizeSecurityGroupIngressRequestGroup, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(describeInstanceRequest, describeInstanceResponse); + + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + Set<SecurityGroup> groups = extension.listSecurityGroupsInLocation(new LocationBuilder() + .scope(LocationScope.REGION) + .id(region) + .description("region") + .build()); + assertEquals(2, groups.size()); + } + + + public void testListSecurityGroupsForNode() { + HttpRequest describeSecurityGroupsSingleRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups") + .addFormParam("GroupName.1", "sg-3c6ef654").build()); + + HttpResponse describeSecurityGroupsSingleResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_single.xml", MediaType.APPLICATION_XML)).build(); + + HttpResponse describeInstanceWithSGResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_instances_running_securitygroups.xml", MediaType.APPLICATION_XML)).build(); + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsSingleRequest, describeSecurityGroupsSingleResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequest22, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(authorizeSecurityGroupIngressRequestGroup, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(describeInstanceRequest, describeInstanceWithSGResponse); + + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + Set<SecurityGroup> groups = extension.listSecurityGroupsForNode(new RegionAndName(region, "i-2baa5550").slashEncode()); + assertEquals(1, groups.size()); + } + + public void testGetSecurityGroupById() { + HttpRequest describeSecurityGroupsSingleRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups") + .addFormParam("GroupName.1", "jclouds#some-group").build()); + + HttpResponse describeSecurityGroupsSingleResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_single.xml", MediaType.APPLICATION_XML)).build(); + + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsSingleRequest, describeSecurityGroupsSingleResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequest22, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(authorizeSecurityGroupIngressRequestGroup, authorizeSecurityGroupIngressResponse); + + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + SecurityGroup group = extension.getSecurityGroupById(new RegionAndName(region, "jclouds#some-group").slashEncode()); + assertEquals("sg-3c6ef654", group.getProviderId()); + assertEquals(region + "/jclouds#some-group", group.getId()); + } + + public void testCreateSecurityGroup() { + HttpRequest createSecurityGroupExtRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "CreateSecurityGroup") + .addFormParam("GroupDescription", "jclouds#some-group") + .addFormParam("GroupName", "jclouds#some-group").build()); + + HttpRequest describeSecurityGroupsSingleRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups") + .addFormParam("GroupName.1", "jclouds#some-group").build()); + + HttpResponse describeSecurityGroupsSingleResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_single.xml", MediaType.APPLICATION_XML)).build(); + + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsSingleRequest, describeSecurityGroupsSingleResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupExtRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequest22, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(authorizeSecurityGroupIngressRequestGroup, authorizeSecurityGroupIngressResponse); + + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + SecurityGroup group = extension.createSecurityGroup("some-group", new LocationBuilder() + .scope(LocationScope.REGION) + .id(region) + .description("region") + .build()); + + assertEquals("sg-3c6ef654", group.getProviderId()); + assertEquals(region + "/jclouds#some-group", group.getId()); + } + + public void testRemoveSecurityGroup() { + HttpRequest describeSecurityGroupsSingleRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups") + .addFormParam("GroupName.1", "jclouds#some-group").build()); + + HttpResponse describeSecurityGroupsSingleResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_single.xml", MediaType.APPLICATION_XML)).build(); + + HttpRequest deleteSecurityGroupRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DeleteSecurityGroup") + .addFormParam("GroupName", "jclouds#some-group").build()); + + HttpResponse deleteSecurityGroupResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/delete_securitygroup.xml", MediaType.APPLICATION_XML)).build(); + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsSingleRequest, describeSecurityGroupsSingleResponse); + requestResponseMap.put(deleteSecurityGroupRequest, deleteSecurityGroupResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequest22, authorizeSecurityGroupIngressResponse); + requestResponseMap.put(authorizeSecurityGroupIngressRequestGroup, authorizeSecurityGroupIngressResponse); + + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + assertTrue(extension.removeSecurityGroup(new RegionAndName(region, "jclouds#some-group").slashEncode())); + } + + public void testAddIpPermissionCidrFromIpPermission() { + HttpRequest describeSecurityGroupsSingleRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups") + .addFormParam("GroupName.1", "jclouds#some-group").build()); + + HttpResponse describeSecurityGroupsSingleResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_cidr.xml", MediaType.APPLICATION_XML)).build(); + + + HttpRequest authorizeSecurityGroupIngressRequestRange = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "AuthorizeSecurityGroupIngress") + .addFormParam("CidrIp", "0.0.0.0/0") + .addFormParam("FromPort", "22") + .addFormParam("ToPort", "40") + .addFormParam("GroupName", "jclouds#some-group") + .addFormParam("IpProtocol", "tcp").build()); + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsSingleRequest, describeSecurityGroupsSingleResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequestRange, authorizeSecurityGroupIngressResponse); + + IpPermission.Builder builder = IpPermission.builder(); + + builder.ipProtocol(IpProtocol.TCP); + builder.fromPort(22); + builder.toPort(40); + builder.cidrBlock("0.0.0.0/0"); + + IpPermission perm = builder.build(); + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + SecurityGroupBuilder groupBuilder = new SecurityGroupBuilder(); + groupBuilder.id("jclouds#some-group"); + groupBuilder.providerId("sg-3c6ef654"); + groupBuilder.name("jclouds#some-group"); + groupBuilder.location(new LocationBuilder() + .scope(LocationScope.REGION) + .id(region) + .description("region") + .build()); + + SecurityGroup origGroup = groupBuilder.build(); + + SecurityGroup newGroup = extension.addIpPermission(perm, origGroup); + + assertEquals(1, newGroup.getIpPermissions().size()); + + IpPermission newPerm = Iterables.getOnlyElement(newGroup.getIpPermissions()); + + assertNotNull(newPerm); + assertEquals(IpProtocol.TCP, newPerm.getIpProtocol()); + assertEquals(22, newPerm.getFromPort()); + assertEquals(40, newPerm.getToPort()); + assertEquals(1, newPerm.getCidrBlocks().size()); + assertTrue(newPerm.getCidrBlocks().contains("0.0.0.0/0")); + } + + public void testAddIpPermissionCidrFromParams() { + HttpRequest describeSecurityGroupsSingleRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups") + .addFormParam("GroupName.1", "jclouds#some-group").build()); + + HttpResponse describeSecurityGroupsSingleResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_cidr.xml", MediaType.APPLICATION_XML)).build(); + + + HttpRequest authorizeSecurityGroupIngressRequestRange = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "AuthorizeSecurityGroupIngress") + .addFormParam("CidrIp", "0.0.0.0/0") + .addFormParam("FromPort", "22") + .addFormParam("ToPort", "40") + .addFormParam("GroupName", "jclouds#some-group") + .addFormParam("IpProtocol", "tcp").build()); + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsSingleRequest, describeSecurityGroupsSingleResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequestRange, authorizeSecurityGroupIngressResponse); + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + SecurityGroupBuilder groupBuilder = new SecurityGroupBuilder(); + groupBuilder.id("jclouds#some-group"); + groupBuilder.providerId("sg-3c6ef654"); + groupBuilder.name("jclouds#some-group"); + groupBuilder.location(new LocationBuilder() + .scope(LocationScope.REGION) + .id(region) + .description("region") + .build()); + + SecurityGroup origGroup = groupBuilder.build(); + + SecurityGroup newGroup = extension.addIpPermission(IpProtocol.TCP, + 22, + 40, + emptyMultimap(), + ImmutableSet.of("0.0.0.0/0"), + emptyStringSet(), + origGroup); + + assertEquals(1, newGroup.getIpPermissions().size()); + + IpPermission newPerm = Iterables.getOnlyElement(newGroup.getIpPermissions()); + + assertNotNull(newPerm); + assertEquals(IpProtocol.TCP, newPerm.getIpProtocol()); + assertEquals(22, newPerm.getFromPort()); + assertEquals(40, newPerm.getToPort()); + assertEquals(1, newPerm.getCidrBlocks().size()); + assertTrue(newPerm.getCidrBlocks().contains("0.0.0.0/0")); + } + + + public void testAddIpPermissionGroupFromIpPermission() { + HttpRequest describeSecurityGroupsSingleRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups") + .addFormParam("GroupName.1", "jclouds#some-group").build()); + + HttpResponse describeSecurityGroupsSingleResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_group.xml", MediaType.APPLICATION_XML)).build(); + + + HttpRequest authorizeSecurityGroupIngressRequestGroupTenant = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "AuthorizeSecurityGroupIngress") + .addFormParam("SourceSecurityGroupName", "jclouds#some-group") + .addFormParam("SourceSecurityGroupOwnerId", "993194456877") + .addFormParam("GroupName", "jclouds#some-group").build()); + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsSingleRequest, describeSecurityGroupsSingleResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequestGroupTenant, authorizeSecurityGroupIngressResponse); + + IpPermission.Builder builder = IpPermission.builder(); + + builder.ipProtocol(IpProtocol.TCP); + builder.fromPort(22); + builder.toPort(40); + builder.tenantIdGroupNamePair("993194456877", "jclouds#some-group"); + + IpPermission perm = builder.build(); + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + SecurityGroupBuilder groupBuilder = new SecurityGroupBuilder(); + groupBuilder.id("jclouds#some-group"); + groupBuilder.providerId("sg-3c6ef654"); + groupBuilder.name("jclouds#some-group"); + groupBuilder.location(new LocationBuilder() + .scope(LocationScope.REGION) + .id(region) + .description("region") + .build()); + groupBuilder.ownerId("993194456877"); + + SecurityGroup origGroup = groupBuilder.build(); + + SecurityGroup newGroup = extension.addIpPermission(perm, origGroup); + + assertEquals(1, newGroup.getIpPermissions().size()); + + IpPermission newPerm = Iterables.getOnlyElement(newGroup.getIpPermissions()); + + assertNotNull(newPerm); + assertEquals(IpProtocol.TCP, newPerm.getIpProtocol()); + assertEquals(22, newPerm.getFromPort()); + assertEquals(40, newPerm.getToPort()); + assertEquals(0, newPerm.getCidrBlocks().size()); + assertEquals(1, newPerm.getTenantIdGroupNamePairs().size()); + assertTrue(newPerm.getTenantIdGroupNamePairs().keySet().contains(origGroup.getOwnerId())); + assertTrue(newPerm.getTenantIdGroupNamePairs().values().contains(origGroup.getName())); + } + + public void testAddIpPermissionGroupFromParams() { + HttpRequest describeSecurityGroupsSingleRequest = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "DescribeSecurityGroups") + .addFormParam("GroupName.1", "jclouds#some-group").build()); + + HttpResponse describeSecurityGroupsSingleResponse = + HttpResponse.builder().statusCode(200) + .payload(payloadFromResourceWithContentType( + "/describe_securitygroups_extension_group.xml", MediaType.APPLICATION_XML)).build(); + + + HttpRequest authorizeSecurityGroupIngressRequestGroupTenant = + formSigner.filter(HttpRequest.builder() + .method("POST") + .endpoint("https://ec2." + region + ".amazonaws.com/") + .addHeader("Host", "ec2." + region + ".amazonaws.com") + .addFormParam("Action", "AuthorizeSecurityGroupIngress") + .addFormParam("SourceSecurityGroupName", "jclouds#some-group") + .addFormParam("SourceSecurityGroupOwnerId", "993194456877") + .addFormParam("GroupName", "jclouds#some-group").build()); + + Builder<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder(); + requestResponseMap.put(describeRegionsRequest, describeRegionsResponse); + requestResponseMap.put(describeAvailabilityZonesRequest, describeAvailabilityZonesResponse); + requestResponseMap.put(describeSecurityGroupsSingleRequest, describeSecurityGroupsSingleResponse); + requestResponseMap.put(createKeyPairRequest, createKeyPairResponse); + requestResponseMap.put(createSecurityGroupRequest, createSecurityGroupResponse); + + requestResponseMap.put(authorizeSecurityGroupIngressRequestGroupTenant, authorizeSecurityGroupIngressResponse); + + SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get(); + + SecurityGroupBuilder groupBuilder = new SecurityGroupBuilder(); + groupBuilder.id("jclouds#some-group"); + groupBuilder.providerId("sg-3c6ef654"); + groupBuilder.name("jclouds#some-group"); + groupBuilder.ownerId("993194456877"); + groupBuilder.location(new LocationBuilder() + .scope(LocationScope.REGION) + .id(region) + .description("region") + .build()); + + SecurityGroup origGroup = groupBuilder.build(); + + ImmutableMultimap.Builder<String, String> permBuilder = ImmutableMultimap.builder(); + permBuilder.put(origGroup.getOwnerId(), origGroup.getName()); + + SecurityGroup newGroup = extension.addIpPermission(IpProtocol.TCP, + 22, + 40, + permBuilder.build(), + emptyStringSet(), + emptyStringSet(), + origGroup); + + assertEquals(1, newGroup.getIpPermissions().size()); + + IpPermission newPerm = Iterables.getOnlyElement(newGroup.getIpPermissions()); + + assertNotNull(newPerm); + assertEquals(IpProtocol.TCP, newPerm.getIpProtocol()); + assertEquals(22, newPerm.getFromPort()); + assertEquals(40, newPerm.getToPort()); + assertEquals(0, newPerm.getCidrBlocks().size()); + assertEquals(1, newPerm.getTenantIdGroupNamePairs().size()); + assertTrue(newPerm.getTenantIdGroupNamePairs().keySet().contains(origGroup.getOwnerId())); + assertTrue(newPerm.getTenantIdGroupNamePairs().values().contains(origGroup.getName())); + } + + private Multimap<String, String> emptyMultimap() { + return LinkedHashMultimap.create(); + } + + private Set<String> emptyStringSet() { + return Sets.newLinkedHashSet(); + } +} 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/compute/extensions/EC2SecurityGroupExtensionLiveTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2SecurityGroupExtensionLiveTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2SecurityGroupExtensionLiveTest.java new file mode 100644 index 0000000..7020a93 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/extensions/EC2SecurityGroupExtensionLiveTest.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.extensions; + +import org.jclouds.compute.extensions.internal.BaseSecurityGroupExtensionLiveTest; +import org.testng.annotations.Test; + + +/** + * Live test for ec2 {@link SecurityGroupExtension} implementation + */ +@Test(groups = "live", singleThreaded = true, testName = "EC2SecurityGroupExtensionLiveTest") +public class EC2SecurityGroupExtensionLiveTest extends BaseSecurityGroupExtensionLiveTest { + + public EC2SecurityGroupExtensionLiveTest() { + provider = "ec2"; + } + +} 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/compute/functions/AddElasticIpsToNodemetadataTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/AddElasticIpsToNodemetadataTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/AddElasticIpsToNodemetadataTest.java new file mode 100644 index 0000000..015b5a7 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/AddElasticIpsToNodemetadataTest.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.functions; + +import static org.testng.Assert.assertEquals; + +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; +import org.jclouds.compute.domain.NodeMetadata.Status; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.testng.annotations.Test; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + +@Test(groups = "unit", singleThreaded = true, testName = "AddElasticIpsToNodemetadataTest") +public class AddElasticIpsToNodemetadataTest { + + NodeMetadata node = new NodeMetadataBuilder().status(Status.RUNNING).group("zkclustertest").name("foo").hostname( + "ip-10-212-81-7").privateAddresses(ImmutableSet.of("10.212.81.7")).publicAddresses( + ImmutableSet.of("174.129.173.155")).imageId("us-east-1/ami-63be790a").id("us-east-1/i-911444f0") + .providerId("i-911444f0").tags(ImmutableSet.of("Empty")).userMetadata(ImmutableMap.of("Name", "foo")) + .build(); + + @Test + public void testReturnsNodeWithElasticIpWhenFoundInCacheAndNodeHadAPublicIp() throws Exception { + RegionAndName key = new RegionAndName("us-east-1", node.getProviderId()); + String val = "1.1.1.1"; + LoadingCache<RegionAndName, String> cache = cacheOf(key, val); + + AddElasticIpsToNodemetadata fn = new AddElasticIpsToNodemetadata(cache); + + assertEquals(fn.apply(node).getPublicAddresses(), ImmutableSet.of("1.1.1.1")); + } + + @Test + public void testReturnsNodeWithIpWhenFoundInCacheAndNodeHadNoPublicIp() throws Exception { + RegionAndName key = new RegionAndName("us-east-1", node.getProviderId()); + String val = "1.1.1.1"; + LoadingCache<RegionAndName, String> cache = cacheOf(key, val); + + AddElasticIpsToNodemetadata fn = new AddElasticIpsToNodemetadata(cache); + + assertEquals(fn.apply( + NodeMetadataBuilder.fromNodeMetadata(node).publicAddresses(ImmutableSet.<String> of()).build()) + .getPublicAddresses(), ImmutableSet.of("1.1.1.1")); + } + + @Test + public void testReturnsSameNodeWhenNotFoundInCache() throws Exception { + RegionAndName key = new RegionAndName("us-east-1", node.getProviderId()); + String val = null; + LoadingCache<RegionAndName, String> cache = cacheOf(key, val); + + AddElasticIpsToNodemetadata fn = new AddElasticIpsToNodemetadata(cache); + + assertEquals(fn.apply(node).getPublicAddresses(), ImmutableSet.of("174.129.173.155")); + } + + private LoadingCache<RegionAndName, String> cacheOf(final RegionAndName key, final String val) { + return CacheBuilder.newBuilder().build(new CacheLoader<RegionAndName, String>() { + + @Override + public String load(RegionAndName in) throws Exception { + return key.equals(in) ? val : null; + } + + }); + } +} 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/compute/functions/CreateUniqueKeyPairTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/CreateUniqueKeyPairTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/CreateUniqueKeyPairTest.java new file mode 100644 index 0000000..5870e4e --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/CreateUniqueKeyPairTest.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.functions; + +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; +import static org.testng.Assert.assertEquals; + +import java.net.UnknownHostException; + +import org.jclouds.ec2.EC2ApiMetadata; +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.domain.KeyPair; +import org.jclouds.ec2.features.KeyPairApi; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.TypeLiteral; +import com.google.inject.name.Names; + +@Test(groups = "unit", testName = "CreateUniqueKeyPairTest") +public class CreateUniqueKeyPairTest { + + @Test + public void testApply() throws UnknownHostException { + final EC2Api client = createMock(EC2Api.class); + KeyPairApi keyClient = createMock(KeyPairApi.class); + KeyPair pair = createMock(KeyPair.class); + + expect(client.getKeyPairApi()).andReturn((Optional) Optional.of(keyClient)).atLeastOnce(); + + expect(keyClient.createKeyPairInRegion("region", "jclouds#group#1")).andReturn(pair); + + replay(client); + replay(keyClient); + + CreateUniqueKeyPair parser = Guice.createInjector(new AbstractModule() { + + @Override + protected void configure() { + Names.bindProperties(binder(), new EC2ApiMetadata().getDefaultProperties()); + bind(new TypeLiteral<Supplier<String>>() { + }).toInstance(Suppliers.ofInstance("1")); + bind(EC2Api.class).toInstance(client); + } + + }).getInstance(CreateUniqueKeyPair.class); + + assertEquals(parser.createNewKeyPairInRegion("region", "group"), pair); + + verify(client); + verify(keyClient); + } + + @SuppressWarnings( { "unchecked" }) + @Test + public void testApplyWithIllegalStateException() throws UnknownHostException { + final EC2Api client = createMock(EC2Api.class); + KeyPairApi keyClient = createMock(KeyPairApi.class); + final Supplier<String> uniqueIdSupplier = createMock(Supplier.class); + + KeyPair pair = createMock(KeyPair.class); + + expect(client.getKeyPairApi()).andReturn((Optional) Optional.of(keyClient)).atLeastOnce(); + + expect(uniqueIdSupplier.get()).andReturn("1"); + expect(keyClient.createKeyPairInRegion("region", "jclouds#group#1")).andThrow(new IllegalStateException()); + expect(uniqueIdSupplier.get()).andReturn("2"); + expect(keyClient.createKeyPairInRegion("region", "jclouds#group#2")).andReturn(pair); + + replay(client); + replay(keyClient); + replay(uniqueIdSupplier); + + CreateUniqueKeyPair parser = Guice.createInjector(new AbstractModule() { + + @Override + protected void configure() { + Names.bindProperties(binder(), new EC2ApiMetadata().getDefaultProperties()); + bind(new TypeLiteral<Supplier<String>>() { + }).toInstance(uniqueIdSupplier); + bind(EC2Api.class).toInstance(client); + } + + }).getInstance(CreateUniqueKeyPair.class); + + assertEquals(parser.createNewKeyPairInRegion("region", "group"), pair); + + verify(client); + verify(keyClient); + verify(uniqueIdSupplier); + } +} 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/compute/functions/EC2ImageParserTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/EC2ImageParserTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/EC2ImageParserTest.java new file mode 100644 index 0000000..aadc030 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/EC2ImageParserTest.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.functions; + +import static org.testng.Assert.assertEquals; + +import java.util.Map; +import java.util.Set; + +import org.jclouds.compute.config.BaseComputeServiceContextModule; +import org.jclouds.compute.domain.Image.Status; +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; +import org.jclouds.domain.LocationScope; +import org.jclouds.domain.LoginCredentials; +import org.jclouds.ec2.compute.config.EC2ComputeServiceDependenciesModule; +import org.jclouds.ec2.compute.strategy.EC2PopulateDefaultLoginCredentialsForImageStrategy; +import org.jclouds.ec2.compute.strategy.ReviseParsedImage; +import org.jclouds.ec2.domain.Image; +import org.jclouds.ec2.xml.DescribeImagesResponseHandlerTest; +import org.jclouds.json.Json; +import org.jclouds.json.config.GsonModule; +import org.testng.annotations.Test; + +import com.google.common.base.Predicates; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import com.google.inject.Guice; + +@Test(groups = "unit", testName = "EC2ImageParserTest") +public class EC2ImageParserTest { + + public void testParseAmznImage() { + + Set<org.jclouds.compute.domain.Image> result = convertImages("/amzn_images.xml"); + for (org.jclouds.compute.domain.Image image : result) { + assertEquals(image.getStatus(), Status.AVAILABLE); + assertEquals(image.getBackendStatus(), "available"); + } + + assertImageEquals(Iterables.get(result, 0), new ImageBuilder().operatingSystem( + new OperatingSystem.Builder().family(OsFamily.UNRECOGNIZED).arch("paravirtual").version("").description( + "137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()).description("Amazon") + .defaultCredentials(LoginCredentials.builder().user("ec2-user").build()).id("us-east-1/ami-82e4b5c7").name( + "amzn-ami-0.9.7-beta.i386-ebs").providerId("ami-82e4b5c7").location(defaultLocation) + .userMetadata(ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).status( + Status.AVAILABLE).backendStatus("available").build()); + + assertImageEquals(Iterables.get(result, 3), new ImageBuilder().operatingSystem( + new OperatingSystem.Builder().family(OsFamily.UNRECOGNIZED).arch("paravirtual").version("").description( + "amzn-ami-us-west-1/amzn-ami-0.9.7-beta.x86_64.manifest.xml").is64Bit(true).build()) + .description("Amazon Linux AMI x86_64 S3").defaultCredentials(LoginCredentials.builder().user("ec2-user").build()) + .id("us-east-1/ami-f2e4b5b7").providerId("ami-f2e4b5b7").name("amzn-ami-0.9.7-beta.x86_64-S3").location( + defaultLocation) + .userMetadata(ImmutableMap.of("owner", "137112412989", "rootDeviceType", "ebs")).status( + Status.AVAILABLE).backendStatus("available").build()); + + assertImageEquals(Iterables.get(result, 4), new ImageBuilder().operatingSystem( + new OperatingSystem.Builder().family(OsFamily.WINDOWS).arch("hvm").version("2008").description( + "amazon/NameGivesNoClue_Server-2008-R2_SP1-Language_Packs-64Bit-Base-2012.05.10") + .is64Bit(true).build()) + .description("Microsoft Windows Server 2008 R2 SP1 Datacenter 64-bit Multi-language AMI provided by Amazon") + .defaultCredentials(LoginCredentials.builder().user("root").build()) + .id("us-east-1/ami-85457ff1").providerId("ami-85457ff1").name("NameGivesNoClue_Server-2008-R2_SP1-Language_Packs-64Bit-Base-2012.05.10") + .location(defaultLocation) + .userMetadata(ImmutableMap.of("owner", "801119661308", "rootDeviceType", "ebs")) + .status(Status.AVAILABLE).backendStatus("available").build()); + + } + + private void assertImageEquals(org.jclouds.compute.domain.Image actual, org.jclouds.compute.domain.Image expected) { + // Note that ImageImpl.equals does not compare operating system etc; there's an explicit comment: + // equals from super is sufficient to establish identity equivalence + assertEquals(actual, expected); + assertEquals(actual.getOperatingSystem(), expected.getOperatingSystem()); + assertEquals(actual.getStatus(), expected.getStatus()); + assertEquals(actual.getBackendStatus(), expected.getBackendStatus()); + assertEquals(actual.getVersion(), expected.getVersion()); + assertEquals(actual.getDescription(), expected.getDescription()); + assertEquals(actual.getDefaultCredentials(), expected.getDefaultCredentials()); + } + + static Location defaultLocation = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1").description( + "us-east-1").build(); + + public static Set<org.jclouds.compute.domain.Image> convertImages(String resource) { + + Map<OsFamily, Map<String, String>> map = new BaseComputeServiceContextModule() { + }.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule()) + .getInstance(Json.class)); + + Set<Image> result = DescribeImagesResponseHandlerTest.parseImages(resource); + EC2ImageParser parser = new EC2ImageParser(EC2ComputeServiceDependenciesModule.toPortableImageStatus, + new EC2PopulateDefaultLoginCredentialsForImageStrategy(), map, Suppliers + .<Set<? extends Location>> ofInstance(ImmutableSet.<Location> of(defaultLocation)), Suppliers + .ofInstance(defaultLocation), new ReviseParsedImage.NoopReviseParsedImage()); + return Sets.newLinkedHashSet(Iterables.filter(Iterables.transform(result, parser), Predicates.notNull())); + } + +} 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/compute/functions/EC2SecurityGroupToSecurityGroupTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroupTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroupTest.java new file mode 100644 index 0000000..fde86fa --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/EC2SecurityGroupToSecurityGroupTest.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.functions; + +import static org.testng.Assert.assertEquals; + +import java.util.Set; + +import org.jclouds.compute.domain.SecurityGroup; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; +import org.jclouds.domain.LocationScope; +import org.jclouds.ec2.util.IpPermissions; +import org.jclouds.net.domain.IpPermission; +import org.testng.annotations.Test; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableSet; + +@Test(groups = "unit", testName = "EC2SecurityGroupToSecurityGroupTest") +public class EC2SecurityGroupToSecurityGroupTest { + + static Location provider = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1") + .description("us-east-1").build(); + + @Test + public void testApply() { + IpPermissions authorization = IpPermissions.permitAnyProtocol(); + + org.jclouds.ec2.domain.SecurityGroup origGroup = org.jclouds.ec2.domain.SecurityGroup.builder() + .region("us-east-1") + .id("some-id") + .name("some-group") + .ownerId("some-owner") + .description("some-description") + .ipPermission(authorization) + .build(); + + EC2SecurityGroupToSecurityGroup parser = createGroupParser(ImmutableSet.of(provider)); + + SecurityGroup group = parser.apply(origGroup); + + assertEquals(group.getLocation(), provider); + assertEquals(group.getId(), provider.getId() + "/" + origGroup.getName()); + assertEquals(group.getProviderId(), origGroup.getId()); + assertEquals(group.getName(), origGroup.getName()); + assertEquals(group.getIpPermissions(), (Set<IpPermission>)origGroup); + assertEquals(group.getOwnerId(), origGroup.getOwnerId()); + } + + private EC2SecurityGroupToSecurityGroup createGroupParser(final ImmutableSet<Location> locations) { + Supplier<Set<? extends Location>> locationSupplier = new Supplier<Set<? extends Location>>() { + + @Override + public Set<? extends Location> get() { + return locations; + } + + }; + + EC2SecurityGroupToSecurityGroup parser = new EC2SecurityGroupToSecurityGroup(locationSupplier); + + return parser; + } + +} 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/compute/functions/PresentInstancesTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/PresentInstancesTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/PresentInstancesTest.java new file mode 100644 index 0000000..0abdc0e --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/PresentInstancesTest.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.functions; + +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; +import static org.testng.Assert.assertEquals; + +import java.util.Set; + +import org.jclouds.ec2.EC2Api; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.domain.Reservation; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.ec2.features.InstanceApi; +import org.testng.annotations.Test; + +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableSet; + +@Test(groups = "unit") +public class PresentInstancesTest { + RunningInstance instance1 = createMock(RunningInstance.class); + RunningInstance instance2 = createMock(RunningInstance.class); + + @SuppressWarnings("unchecked") + @Test + public void testWhenInstancesPresentSingleCall() { + + EC2Api client = createMock(EC2Api.class); + InstanceApi instanceClient = createMock(InstanceApi.class); + + expect(client.getInstanceApi()).andReturn((Optional) Optional.of(instanceClient)); + + // avoid imatcher fail. if you change this, be sure to check multiple jres + expect(instanceClient.describeInstancesInRegion("us-east-1", "i-aaaa", "i-bbbb")).andReturn( + Set.class.cast(ImmutableSet.of(Reservation.builder().region("us-east-1") + .instances(ImmutableSet.of(instance1, instance2)).build()))); + + replay(client, instanceClient); + + PresentInstances fn = new PresentInstances(client); + + assertEquals(fn.apply(ImmutableSet.of(new RegionAndName("us-east-1", "i-aaaa"), new RegionAndName("us-east-1", + "i-bbbb"))), ImmutableSet.of(instance1, instance2)); + + verify(client, instanceClient); + } + +} 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/compute/functions/RunningInstanceToNodeMetadataTest.java ---------------------------------------------------------------------- diff --git a/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java new file mode 100644 index 0000000..4228da0 --- /dev/null +++ b/dependencies/jclouds/apis/ec2/1.8.0-stratos/src/test/java/org/jclouds/ec2/compute/functions/RunningInstanceToNodeMetadataTest.java @@ -0,0 +1,295 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.ec2.compute.functions; + +import static org.jclouds.ec2.compute.domain.EC2HardwareBuilder.m1_small; +import static org.testng.Assert.assertEquals; + +import java.net.UnknownHostException; +import java.util.Map; +import java.util.Set; + +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeMetadataBuilder; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.NodeMetadata.Status; +import org.jclouds.compute.functions.GroupNamingConvention; +import org.jclouds.domain.Credentials; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; +import org.jclouds.domain.LocationScope; +import org.jclouds.domain.LoginCredentials; +import org.jclouds.ec2.EC2ApiMetadata; +import org.jclouds.ec2.compute.config.EC2ComputeServiceDependenciesModule; +import org.jclouds.ec2.compute.domain.RegionAndName; +import org.jclouds.ec2.domain.InstanceState; +import org.jclouds.ec2.domain.RunningInstance; +import org.jclouds.ec2.xml.DescribeInstancesResponseHandlerTest; +import org.jclouds.javax.annotation.Nullable; +import org.testng.annotations.Test; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.name.Names; + +@Test(groups = "unit", testName = "RunningInstanceToNodeMetadataTest") +public class RunningInstanceToNodeMetadataTest { + + public void testAllStatesCovered() { + + for (InstanceState status : InstanceState.values()) { + assert EC2ComputeServiceDependenciesModule.toPortableNodeStatus.containsKey(status) : status; + } + + } + + @Test + public void testPrivateIpAddressIncorrectlyInPublicAddressFieldGoesToPrivateAddressCollection() { + RunningInstance instance = RunningInstance.builder().instanceId("id").imageId("image").instanceType("m1.small") + .instanceState(InstanceState.RUNNING).rawState("running").region("us-east-1").ipAddress("10.1.1.1").build(); + + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet + .<Location> of(), ImmutableSet.<Image> of(), ImmutableMap.<String, Credentials> of()); + + assertEquals(parser.apply(instance).toString(), new NodeMetadataBuilder().status(Status.RUNNING).backendStatus("running").publicAddresses( + ImmutableSet.<String> of()).privateAddresses(ImmutableSet.of("10.1.1.1")).id("us-east-1/id").imageId( + "us-east-1/image").providerId("id").build().toString()); + } + + @Test + public void testPublicIpAddressIncorrectlyInPrivateAddressFieldGoesToPublicAddressCollection() { + RunningInstance instance = RunningInstance.builder().instanceId("id").imageId("image").instanceType("m1.small") + .instanceState(InstanceState.RUNNING).rawState("running").region("us-east-1").privateIpAddress("1.1.1.1").build(); + + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet + .<Location> of(), ImmutableSet.<Image> of(), ImmutableMap.<String, Credentials> of()); + + assertEquals(parser.apply(instance).toString(), new NodeMetadataBuilder().status(Status.RUNNING).backendStatus("running").privateAddresses( + ImmutableSet.<String> of()).publicAddresses(ImmutableSet.of("1.1.1.1")).id("us-east-1/id").imageId( + "us-east-1/image").providerId("id").build().toString()); + } + + static Location provider = new LocationBuilder().scope(LocationScope.REGION).id("us-east-1") + .description("us-east-1").build(); + + @Test + public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationNotFoundButCredentialsFound() + throws UnknownHostException { + LoginCredentials creds = LoginCredentials.builder().user("root").password("abdce").build(); + + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet + .<Location> of(), ImmutableSet.<Image> of(), ImmutableMap.<String, Credentials> of( + "node#us-east-1/i-0799056f", creds)); + + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); + + assertEquals( + parser.apply(server).toString(), + new NodeMetadataBuilder().status(Status.RUNNING).backendStatus("running").hostname("ip-10-243-42-70") + .publicAddresses(ImmutableSet.<String> of()).privateAddresses(ImmutableSet.of("10.243.42.70")) + .publicAddresses(ImmutableSet.of("174.129.81.68")).credentials(creds) + .imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f").providerId("i-0799056f").build().toString()); + } + + @Test + public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationNotFound() throws UnknownHostException { + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet + .<Location> of(), ImmutableSet.<Image> of(), ImmutableMap.<String, Credentials> of()); + + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); + + assertEquals(parser.apply(server).toString(), + new NodeMetadataBuilder().hostname("ip-10-243-42-70").status(Status.RUNNING).backendStatus("running") + .publicAddresses(ImmutableSet.<String> of()).privateAddresses(ImmutableSet.of("10.243.42.70")) + .publicAddresses(ImmutableSet.of("174.129.81.68")).imageId("us-east-1/ami-82e4b5c7") + .id("us-east-1/i-0799056f").providerId("i-0799056f").build().toString()); + } + + @Test + public void testApplyWhereTagDoesntMatchAndLocationFoundAndImageAndHardwareNotFound() throws UnknownHostException { + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet.of(provider), + ImmutableSet.<Image> of(), ImmutableMap.<String, Credentials> of()); + + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); + NodeMetadata expected = new NodeMetadataBuilder().hostname("ip-10-243-42-70").status(Status.RUNNING).backendStatus("running") + .privateAddresses(ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")) + .imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f").providerId("i-0799056f") + .location(provider).build(); + + assertEquals(parser.apply(server).toString(), expected.toString()); + } + + @Test + public void testApplyWhereTagDoesntMatchAndImageAndLocationFoundAndHardwareNotFound() throws UnknownHostException { + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet.of(provider), + EC2ImageParserTest.convertImages("/amzn_images.xml"), ImmutableMap.<String, Credentials> of()); + + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); + + assertEquals( + parser.apply(server).toString(), + new NodeMetadataBuilder() + .status(Status.RUNNING).backendStatus("running") + .hostname("ip-10-243-42-70") + .privateAddresses(ImmutableSet.of("10.243.42.70")) + .publicAddresses(ImmutableSet.of("174.129.81.68")) + .imageId("us-east-1/ami-82e4b5c7") + .operatingSystem( + new OperatingSystem.Builder().family(OsFamily.UNRECOGNIZED).version("").arch("paravirtual") + .description("137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()) + .id("us-east-1/i-0799056f").providerId("i-0799056f").location(provider).build().toString()); + } + + @Test + public void testApplyWhereTagDoesntMatchAndImageHardwareAndLocationFound() throws UnknownHostException { + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.of(m1_small().build()), ImmutableSet + .of(provider), EC2ImageParserTest.convertImages("/amzn_images.xml"), ImmutableMap + .<String, Credentials> of()); + + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); + + assertEquals( + parser.apply(server).toString(), + new NodeMetadataBuilder() + .hostname("ip-10-243-42-70") + .status(Status.RUNNING).backendStatus("running") + .privateAddresses(ImmutableSet.of("10.243.42.70")) + .publicAddresses(ImmutableSet.of("174.129.81.68")) + .imageId("us-east-1/ami-82e4b5c7") + .hardware(m1_small().build()) + .operatingSystem( + new OperatingSystem.Builder().family(OsFamily.UNRECOGNIZED).version("").arch("paravirtual") + .description("137112412989/amzn-ami-0.9.7-beta.i386-ebs").is64Bit(false).build()) + .id("us-east-1/i-0799056f").providerId("i-0799056f").location(provider).build().toString()); + } + + @Test + public void testHandleMissingAMIs() { + + // Handle the case when the installed AMI no longer can be found in AWS. + + // Create a null-returning function to simulate that the AMI can't be found. + CacheLoader<RegionAndName, Image> nullReturningFunction = new CacheLoader<RegionAndName, Image>() { + + @Override + public Image load(@Nullable RegionAndName from) { + return null; + } + }; + LoadingCache<RegionAndName, Image> instanceToImage = CacheBuilder.newBuilder().build(nullReturningFunction); + + RunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.of(m1_small().build()), ImmutableSet + .of(provider), ImmutableMap.<String, Credentials> of(), + EC2ComputeServiceDependenciesModule.toPortableNodeStatus, instanceToImage); + + RunningInstance server = firstInstanceFromResource("/describe_instances_running.xml"); + + assertEquals( + parser.apply(server).toString(), + new NodeMetadataBuilder().hostname("ip-10-243-42-70").status(Status.RUNNING).backendStatus("running") + .privateAddresses(ImmutableSet.of("10.243.42.70")).publicAddresses(ImmutableSet.of("174.129.81.68")) + .imageId("us-east-1/ami-82e4b5c7").id("us-east-1/i-0799056f").providerId("i-0799056f") + .hardware(m1_small().build()).location(provider).build().toString()); + } + + @Test + public void testGroupNameIsSetWhenCustomKeyNameIsSetAndSecurityGroupIsGenerated() { + checkGroupName(RunningInstance.builder().instanceId("id").imageId("image").instanceType("m1.small") + .instanceState(InstanceState.RUNNING).rawState("running").region("us-east-1").keyName("custom-key") + .groupName("jclouds#groupname").build()); + } + + @Test + public void testGroupNameIsSetWhenCustomSecurityGroupIsSetAndKeyNameIsGenerated() { + checkGroupName(RunningInstance.builder().instanceId("id").imageId("image").instanceType("m1.small") + .instanceState(InstanceState.RUNNING).rawState("running").region("us-east-1").groupName("custom-sec") + .keyName("jclouds#groupname#23").build()); + } + + protected RunningInstance firstInstanceFromResource(String resource) { + return Iterables.get(Iterables.get(DescribeInstancesResponseHandlerTest.parseRunningInstances(resource), 0), 0); + } + + protected RunningInstanceToNodeMetadata createNodeParser(final ImmutableSet<Hardware> hardware, + final ImmutableSet<Location> locations, final Set<org.jclouds.compute.domain.Image> images, + Map<String, Credentials> credentialStore) { + Map<InstanceState, Status> instanceToNodeStatus = EC2ComputeServiceDependenciesModule.toPortableNodeStatus; + + CacheLoader<RegionAndName, Image> getRealImage = new CacheLoader<RegionAndName, Image>() { + + @Override + public Image load(@Nullable RegionAndName from) { + return ImagesToRegionAndIdMap.imagesToMap(images).get(from); + } + }; + LoadingCache<RegionAndName, Image> instanceToImage = CacheBuilder.newBuilder().build(getRealImage); + return createNodeParser(hardware, locations, credentialStore, instanceToNodeStatus, instanceToImage); + } + + private void checkGroupName(RunningInstance instance) { + assertEquals("groupname", createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet + .<Location> of(), ImmutableSet.<Image> of(), ImmutableMap.<String, Credentials> of()) + .apply(instance).getGroup()); + } + + private RunningInstanceToNodeMetadata createNodeParser(final ImmutableSet<Hardware> hardware, + final ImmutableSet<Location> locations, Map<String, Credentials> credentialStore, + Map<InstanceState, Status> instanceToNodeStatus, LoadingCache<RegionAndName, Image> instanceToImage) { + Supplier<Set<? extends Location>> locationSupplier = new Supplier<Set<? extends Location>>() { + + @Override + public Set<? extends Location> get() { + return locations; + } + + }; + Supplier<Set<? extends Hardware>> hardwareSupplier = new Supplier<Set<? extends Hardware>>() { + + @Override + public Set<? extends Hardware> get() { + return hardware; + } + + }; + + GroupNamingConvention.Factory namingConvention = Guice.createInjector(new AbstractModule() { + + @Override + protected void configure() { + Names.bindProperties(binder(), new EC2ApiMetadata().getDefaultProperties()); + } + + }).getInstance(GroupNamingConvention.Factory.class); + + RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(instanceToNodeStatus, credentialStore, + Suppliers.<LoadingCache<RegionAndName, ? extends Image>> ofInstance(instanceToImage), locationSupplier, + hardwareSupplier, namingConvention); + return parser; + } + +}
