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;
+   }
+
+}

Reply via email to