You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by la...@apache.org on 2014/03/27 23:45:55 UTC

[07/13] Forking jclouds provider/aws-ec2 for STRATOS-559

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java
new file mode 100644
index 0000000..3cbad70
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/AWSEC2TemplateBuilderLiveTest.java
@@ -0,0 +1,367 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.compute;
+
+import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
+import static org.jclouds.http.internal.TrackingJavaUrlHttpCommandExecutorService.getInvokerOfRequestAtIndex;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+
+import org.jclouds.aws.domain.Region;
+import org.jclouds.aws.ec2.AWSEC2Api;
+import org.jclouds.aws.ec2.reference.AWSEC2Constants;
+import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.compute.domain.OsFamily;
+import org.jclouds.compute.domain.OsFamilyVersion64Bit;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.compute.EC2TemplateBuilderLiveTest;
+import org.jclouds.ec2.compute.predicates.EC2ImagePredicates;
+import org.jclouds.ec2.domain.InstanceType;
+import org.jclouds.ec2.domain.RootDeviceType;
+import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
+import org.jclouds.ec2.options.DescribeAvailabilityZonesOptions;
+import org.jclouds.ec2.options.DescribeRegionsOptions;
+import org.jclouds.ec2.reference.EC2Constants;
+import org.jclouds.http.HttpCommand;
+import org.jclouds.http.internal.TrackingJavaUrlHttpCommandExecutorService;
+import org.jclouds.location.reference.LocationConstants;
+import org.jclouds.logging.log4j.config.Log4JLoggingModule;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.inject.Module;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Test(groups = "live", testName = "AWSEC2TemplateBuilderLiveTest")
+public class AWSEC2TemplateBuilderLiveTest extends EC2TemplateBuilderLiveTest {
+
+   public AWSEC2TemplateBuilderLiveTest() {
+      provider = "aws-ec2";
+   }
+
+   @Override
+   protected Predicate<OsFamilyVersion64Bit> defineUnsupportedOperatingSystems() {
+      return Predicates.not(new Predicate<OsFamilyVersion64Bit>() {
+         @Override
+         public boolean apply(OsFamilyVersion64Bit input) {
+            switch (input.family) {
+            case UBUNTU:
+               return true;
+            case DEBIAN:
+               return true;
+            case RHEL:
+                  return input.version.equals("5.6") || input.version.equals("")
+                           || (input.version.matches("[56].0") && input.is64Bit);
+            case CENTOS:
+               return input.version.matches("5.[0246]") || (input.version.equals("6.0") && input.is64Bit)
+                     || input.version.equals("");
+            case WINDOWS:
+               return input.version.matches("200[38]") || (input.version.equals("7") && !input.is64Bit)
+                     || input.version.equals("");
+            default:
+               return false;
+            }
+         }
+
+      });
+   }
+
+   @Test
+   public void testTemplateBuilderM1MEDIUMWithNegativeLookaroundDoesntMatchTestImages() {
+
+      Template template = view.getComputeService().templateBuilder().hardwareId(InstanceType.M1_MEDIUM)
+      // need to select versions with double-digits so that lexicographic
+      // doesn't end up prefering 9.x vs 11.x
+            .osVersionMatches("1[012].[10][04]")
+            // negative lookahead for daily and testing, but ensure match
+            // ubuntu-images
+            // http://www.regular-expressions.info/lookaround.html
+            .imageDescriptionMatches("^(?!.*(daily|testing)).*ubuntu-images.*$").osFamily(OsFamily.UBUNTU).build();
+
+      assert template.getImage().getProviderId().startsWith("ami-") : template;
+      assert template.getImage().getDescription().indexOf("test") == -1 : template;
+      assert template.getImage().getDescription().indexOf("daily") == -1 : template;
+      assertEquals(template.getImage().getVersion(), "20100224");
+      assertEquals(template.getImage().getOperatingSystem().getVersion(), "10.04");
+      assertEquals(template.getImage().getOperatingSystem().is64Bit(), false);
+      assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
+      assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store");
+      assertEquals(template.getLocation().getId(), "us-east-1");
+      assertEquals(getCores(template.getHardware()), 1.0d);
+      assertEquals(template.getHardware().getId(), InstanceType.M1_MEDIUM);
+      assertEquals(template.getImage().getOperatingSystem().getArch(), "paravirtual");
+   }
+
+   @Test
+   public void testUbuntuInstanceStoreGoesM1SmallNegativeLookaroundDoesntMatchTestImages() {
+
+      Template template = view.getComputeService().templateBuilder()
+            .imageMatches(EC2ImagePredicates.rootDeviceType(RootDeviceType.INSTANCE_STORE))
+            // need to select versions with double-digits so that lexicographic
+            // doesn't end up prefering 9.x vs 11.x
+            .osVersionMatches("1[012].[10][04]")
+            // negative lookahead for daily and testing, but ensure match
+            // ubuntu-images
+            // http://www.regular-expressions.info/lookaround.html
+            .imageDescriptionMatches("^(?!.*(daily|testing)).*ubuntu-images.*$").osFamily(OsFamily.UBUNTU).build();
+
+      assert template.getImage().getProviderId().startsWith("ami-") : template;
+      assert template.getImage().getDescription().indexOf("test") == -1 : template;
+      assert template.getImage().getDescription().indexOf("daily") == -1 : template;
+      assertEquals(template.getImage().getOperatingSystem().getVersion(), "10.04");
+      assertEquals(template.getImage().getOperatingSystem().is64Bit(), false);
+      assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
+      assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store");
+      assertEquals(template.getLocation().getId(), "us-east-1");
+      assertEquals(getCores(template.getHardware()), 1.0d);
+      assertEquals(template.getHardware().getId(), InstanceType.M1_SMALL);
+      assertEquals(template.getImage().getOperatingSystem().getArch(), "paravirtual");
+   }
+
+   @Test
+   public void testTemplateBuilderCanUseImageIdAndhardwareIdAndAZ() {
+
+      Template template = view.getComputeService().templateBuilder().imageId("us-east-1/ami-ccb35ea5")
+            .hardwareId(InstanceType.M2_2XLARGE).locationId("us-east-1a").build();
+
+      assert template.getImage().getProviderId().startsWith("ami-") : template;
+      assertEquals(template.getImage().getOperatingSystem().getVersion(), "5.4");
+      assertEquals(template.getImage().getOperatingSystem().is64Bit(), true);
+      assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS);
+      assertEquals(template.getImage().getVersion(), "4.4.10");
+      assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store");
+      assertEquals(template.getLocation().getId(), "us-east-1a");
+      assertEquals(template.getImage().getLocation().getId(), "us-east-1");
+      assertEquals(getCores(template.getHardware()), 4.0d);
+      assertEquals(template.getHardware().getId(), InstanceType.M2_2XLARGE);
+      assertEquals(template.getImage().getOperatingSystem().getArch(), "paravirtual");
+   }
+
+   @Test
+   public void testDefaultTemplateBuilder() throws IOException {
+      Template defaultTemplate = view.getComputeService().templateBuilder().build();
+      assert defaultTemplate.getImage().getProviderId().startsWith("ami-") : defaultTemplate;
+      assertTrue(defaultTemplate.getImage().getOperatingSystem().getVersion().contains("pv-201"),
+              "Default template version should include 'pv-201' but is "
+                      + defaultTemplate.getImage().getOperatingSystem().getVersion());
+      assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
+      assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX);
+      assertEquals(defaultTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs");
+      assertEquals(defaultTemplate.getLocation().getId(), "us-east-1");
+      assertEquals(getCores(defaultTemplate.getHardware()), 1.0d);
+      assertEquals(defaultTemplate.getImage().getOperatingSystem().getArch(), "paravirtual");
+   }
+
+   @Test
+   public void testAmazonLinuxInstanceStore() throws IOException {
+
+      Template defaultTemplate = view.getComputeService().templateBuilder().osFamily(OsFamily.AMZN_LINUX)
+            .imageMatches(EC2ImagePredicates.rootDeviceType(RootDeviceType.INSTANCE_STORE)).build();
+      assert defaultTemplate.getImage().getProviderId().startsWith("ami-") : defaultTemplate;
+      assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "pv-2013.09.rc-1");
+      assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
+      assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX);
+      assertEquals(defaultTemplate.getImage().getUserMetadata().get("rootDeviceType"), "instance-store");
+      assertEquals(defaultTemplate.getLocation().getId(), "us-east-1");
+      assertEquals(getCores(defaultTemplate.getHardware()), 1.0d);
+      assertEquals(defaultTemplate.getImage().getOperatingSystem().getArch(), "paravirtual");
+   }
+
+   @Test
+   public void testFastestTemplateBuilder() throws IOException {
+      Template fastestTemplate = view.getComputeService().templateBuilder().fastest().osFamily(OsFamily.AMZN_LINUX)
+            .build();
+      assert fastestTemplate.getImage().getProviderId().startsWith("ami-") : fastestTemplate;
+      assertEquals(fastestTemplate.getHardware().getProviderId(), InstanceType.CC2_8XLARGE);
+      assertEquals(fastestTemplate.getImage().getOperatingSystem().getVersion(), "2011.09.2");
+      assertEquals(fastestTemplate.getImage().getOperatingSystem().is64Bit(), true);
+      assertEquals(fastestTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX);
+      assertEquals(fastestTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs");
+      assertEquals(fastestTemplate.getLocation().getId(), "us-east-1");
+      assertEquals(getCores(fastestTemplate.getHardware()), 16.0d);
+      assertEquals(fastestTemplate.getImage().getOperatingSystem().getArch(), "hvm");
+   }
+
+   @Test
+   public void testTemplateBuilderMicro() throws IOException {
+
+      Template microTemplate = view.getComputeService().templateBuilder().hardwareId(InstanceType.T1_MICRO)
+            .osFamily(OsFamily.UBUNTU).osVersionMatches("10.10").os64Bit(true).build();
+
+      assert microTemplate.getImage().getProviderId().startsWith("ami-") : microTemplate;
+      assertEquals(microTemplate.getImage().getOperatingSystem().getVersion(), "10.10");
+      assertEquals(microTemplate.getImage().getOperatingSystem().is64Bit(), true);
+      assertEquals(microTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
+      assertEquals(microTemplate.getImage().getUserMetadata().get("rootDeviceType"), "ebs");
+      assertEquals(microTemplate.getLocation().getId(), "us-east-1");
+      assertEquals(getCores(microTemplate.getHardware()), 1.0d);
+      assertEquals(microTemplate.getImage().getOperatingSystem().getArch(), "paravirtual");
+   }
+
+   @Test
+   public void testTemplateBuilderWithNoOwnersParsesImageOnDemand() throws IOException {
+      ComputeServiceContext context = null;
+      try {
+         Properties overrides = setupProperties();
+         // set owners to nothing
+         overrides.setProperty(AWSEC2Constants.PROPERTY_EC2_AMI_QUERY, "");
+         overrides.setProperty(AWSEC2Constants.PROPERTY_EC2_CC_AMI_QUERY, "");
+
+         context = createView(overrides, setupModules());
+
+         assertEquals(context.getComputeService().listImages().size(), 0);
+
+         Template template = context.getComputeService().templateBuilder().imageId("us-east-1/ami-ccb35ea5").build();
+         assert template.getImage().getProviderId().startsWith("ami-") : template;
+         assertEquals(template.getImage().getOperatingSystem().getVersion(), "5.4");
+         assertEquals(template.getImage().getOperatingSystem().is64Bit(), true);
+         assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS);
+         assertEquals(template.getImage().getVersion(), "4.4.10");
+         assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store");
+         assertEquals(template.getLocation().getId(), "us-east-1");
+         assertEquals(getCores(template.getHardware()), 1.0d);
+         assertEquals(template.getHardware().getId(), "m1.small");
+
+         // ensure we cache the new image for next time
+         assertEquals(context.getComputeService().listImages().size(), 1);
+
+      } finally {
+         if (context != null)
+            context.close();
+      }
+   }
+
+   @Test
+   public void testTemplateBuilderWithNoOwnersParsesImageOnDemandDeprecated() throws IOException {
+      ComputeServiceContext context = null;
+      try {
+         Properties overrides = setupProperties();
+         // set owners to nothing
+         overrides.setProperty(EC2Constants.PROPERTY_EC2_AMI_OWNERS, "");
+         overrides.setProperty(AWSEC2Constants.PROPERTY_EC2_CC_AMI_QUERY, "");
+
+         context = createView(overrides, setupModules());
+
+         assertEquals(context.getComputeService().listImages().size(), 0);
+
+         Template template = context.getComputeService().templateBuilder().imageId("us-east-1/ami-ccb35ea5").build();
+         assert template.getImage().getProviderId().startsWith("ami-") : template;
+         assertEquals(template.getImage().getOperatingSystem().getVersion(), "5.4");
+         assertEquals(template.getImage().getOperatingSystem().is64Bit(), true);
+         assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS);
+         assertEquals(template.getImage().getVersion(), "4.4.10");
+         assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store");
+         assertEquals(template.getLocation().getId(), "us-east-1");
+         assertEquals(getCores(template.getHardware()), 1.0d);
+         assertEquals(template.getHardware().getId(), "m1.small");
+
+         // ensure we cache the new image for next time
+         assertEquals(context.getComputeService().listImages().size(), 1);
+
+      } finally {
+         if (context != null)
+            context.close();
+      }
+   }
+
+   @Test
+   public void testTemplateBuilderWithLessRegions() throws IOException, SecurityException, NoSuchMethodException {
+      ComputeServiceContext context = null;
+      try {
+         Properties overrides = setupProperties();
+         // set regions to only 1
+         overrides.setProperty(LocationConstants.PROPERTY_REGIONS, Region.EU_WEST_1);
+         overrides.setProperty(AWSEC2Constants.PROPERTY_EC2_CC_REGIONS, "");
+         overrides.setProperty(AWSEC2Constants.PROPERTY_EC2_AMI_QUERY, "");
+         overrides.setProperty(AWSEC2Constants.PROPERTY_EC2_CC_AMI_QUERY, "");
+
+         final List<HttpCommand> commandsInvoked = Lists.newArrayList();
+         
+         context = createView(
+               overrides,
+               ImmutableSet.<Module> of(new Log4JLoggingModule(),
+                     TrackingJavaUrlHttpCommandExecutorService.newTrackingModule(commandsInvoked)));
+
+         assert context.getComputeService().listAssignableLocations().size() < this.view.getComputeService()
+               .listAssignableLocations().size();
+
+         assertOnlyOneRegionQueriedForAvailabilityZone(commandsInvoked);
+
+         assert context.getComputeService().listImages().size() < this.view.getComputeService().listImages().size();
+
+         Template template = context.getComputeService().templateBuilder().imageId("eu-west-1/ami-a33b06d7").build();
+         assert template.getImage().getProviderId().startsWith("ami-") : template;
+         assertEquals(template.getImage().getOperatingSystem().getVersion(), "2011.09.2");
+         assertEquals(template.getImage().getOperatingSystem().is64Bit(), true);
+         assertEquals(template.getImage().getOperatingSystem().getFamily(), OsFamily.AMZN_LINUX);
+         assertEquals(template.getImage().getVersion(), "2011.09.2");
+         assertEquals(template.getImage().getUserMetadata().get("rootDeviceType"), "instance-store");
+         assertEquals(template.getLocation().getId(), "eu-west-1");
+         assertEquals(getCores(template.getHardware()), 1.0d);
+         assertEquals(template.getHardware().getId(), "m1.small");
+
+      } finally {
+         if (context != null)
+            context.close();
+      }
+   }
+
+   private static void assertOnlyOneRegionQueriedForAvailabilityZone(List<HttpCommand> commandsInvoked)
+         throws NoSuchMethodException {
+      assert commandsInvoked.size() == 2 : commandsInvoked;
+      assertEquals(getInvokerOfRequestAtIndex(commandsInvoked, 0),
+            AvailabilityZoneAndRegionApi.class.getMethod("describeRegions", DescribeRegionsOptions[].class));
+      assertEquals(getInvokerOfRequestAtIndex(commandsInvoked, 1),
+            AvailabilityZoneAndRegionApi.class.getMethod("describeAvailabilityZonesInRegion", String.class,
+                  DescribeAvailabilityZonesOptions[].class));
+   }
+
+   @Test
+   public void testTemplateBuilderCanUseImageIdFromNonDefaultOwner() {
+      // This is the id of a public image, not owned by one of the four default
+      // owners
+      String imageId = "us-east-1/ami-44d02f2d";
+      Template defaultTemplate = view.getComputeService().templateBuilder().imageId(imageId)
+            .imageMatches(EC2ImagePredicates.rootDeviceType(RootDeviceType.INSTANCE_STORE)).build();
+      assert defaultTemplate.getImage().getProviderId().startsWith("ami-") : defaultTemplate;
+      assertEquals(defaultTemplate.getImage().getId(), imageId);
+   }
+   
+   @Test
+   public void testAssignability() {
+      view.unwrapApi(EC2Api.class);
+      view.unwrapApi(AWSEC2Api.class);
+   }
+
+   @Override
+   protected Set<String> getIso3166Codes() {
+      return ImmutableSet.<String> of("US-VA", "US-CA", "US-OR", "BR-SP", "IE", "SG", "AU-NSW", "JP-13");
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModuleTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModuleTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModuleTest.java
new file mode 100644
index 0000000..27e3e57
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/config/AWSEC2ComputeServiceContextModuleTest.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.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;
+
+/**
+ * @author Aled Sage
+ */
+@Test(groups = "unit")
+public class AWSEC2ComputeServiceContextModuleTest {
+   
+   @Test
+   public void testCacheLoaderDoesNotReloadAfterAuthorizationException() throws Exception {
+      AWSEC2ComputeServiceContextModule module = new AWSEC2ComputeServiceContextModule() {
+         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/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.java
new file mode 100644
index 0000000..4ae398b
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2ImageExtensionLiveTest.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.aws.ec2.compute.extensions;
+
+import static com.google.common.collect.Iterables.transform;
+
+import org.jclouds.aws.ec2.AWSEC2Api;
+import org.jclouds.aws.util.AWSUtils;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.extensions.internal.BaseImageExtensionLiveTest;
+import org.jclouds.ec2.compute.functions.EC2ImageParser;
+import org.jclouds.ec2.options.DescribeImagesOptions;
+import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.Test;
+
+import com.google.inject.Module;
+
+/**
+ * Live test for aws-ec2 {@link ImageExtension} implementation
+ * 
+ * @author David Alves
+ * 
+ */
+@Test(groups = "live", singleThreaded = true, testName = "AWSEC2ImageExtensionLiveTest")
+public class AWSEC2ImageExtensionLiveTest extends BaseImageExtensionLiveTest {
+
+   public AWSEC2ImageExtensionLiveTest() {
+      provider = "aws-ec2";
+   }
+
+   @Override
+   protected Iterable<? extends Image> listImages() {
+      AWSEC2Api client = view.unwrapApi(AWSEC2Api.class);
+      String[] parts = AWSUtils.parseHandle(imageId);
+      String region = parts[0];
+      String imageId = parts[1];
+      EC2ImageParser parser = view.utils().injector().getInstance(EC2ImageParser.class);
+      return transform(
+                       client.getAMIApi().get().describeImagesInRegion(region, new DescribeImagesOptions().imageIds(imageId)),
+            parser);
+   }
+
+   @Override
+   protected Module getSshModule() {
+      return new SshjSshClientModule();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionExpectTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionExpectTest.java
new file mode 100644
index 0000000..f13737a
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionExpectTest.java
@@ -0,0 +1,364 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.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.aws.ec2.compute.internal.BaseAWSEC2ComputeServiceExpectTest;
+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.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;
+
+/**
+ * 
+ * @author Andrew Bayer
+ */
+@Test(groups = "unit", testName = "AWSEC2SecurityGroupExtensionExpectTest")
+public class AWSEC2SecurityGroupExtensionExpectTest extends BaseAWSEC2ComputeServiceExpectTest {
+
+   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("GroupId.1", "sg-3c6ef654").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("GroupId", "sg-3c6ef654")
+                                 .addFormParam("IpPermissions.0.FromPort", "22")
+                                 .addFormParam("IpPermissions.0.IpProtocol", "tcp")
+                                 .addFormParam("IpPermissions.0.IpRanges.0.CidrIp", "0.0.0.0/0")
+                                 .addFormParam("IpPermissions.0.ToPort", "40")
+                                 .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("us-east-1/sg-3c6ef654");
+      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("GroupId.1", "sg-3c6ef654").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("GroupId", "sg-3c6ef654")
+                                 .addFormParam("IpPermissions.0.FromPort", "22")
+                                 .addFormParam("IpPermissions.0.IpProtocol", "tcp")
+                                 .addFormParam("IpPermissions.0.IpRanges.0.CidrIp", "0.0.0.0/0")
+                                 .addFormParam("IpPermissions.0.ToPort", "40")
+                                 .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("us-east-1/sg-3c6ef654");
+      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("GroupId.1", "sg-3c6ef654").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("GroupId", "sg-3c6ef654")
+                                 .addFormParam("IpPermissions.0.FromPort", "22")
+                                 .addFormParam("IpPermissions.0.Groups.0.GroupId", "sg-3c6ef654")
+                                 .addFormParam("IpPermissions.0.Groups.0.UserId", "993194456877")
+                                 .addFormParam("IpPermissions.0.IpProtocol", "tcp")
+                                 .addFormParam("IpPermissions.0.ToPort", "40")
+                                 .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", "sg-3c6ef654");
+
+      IpPermission perm = builder.build();
+
+      SecurityGroupExtension extension = requestsSendResponses(requestResponseMap.build()).getSecurityGroupExtension().get();
+
+      SecurityGroupBuilder groupBuilder = new SecurityGroupBuilder();
+      groupBuilder.id("us-east-1/sg-3c6ef654");
+      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.getProviderId()));
+   }
+
+
+   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("GroupId.1", "sg-3c6ef654").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("GroupId", "sg-3c6ef654")
+                                 .addFormParam("IpPermissions.0.FromPort", "22")
+                                 .addFormParam("IpPermissions.0.Groups.0.GroupId", "sg-3c6ef654")
+                                 .addFormParam("IpPermissions.0.Groups.0.UserId", "993194456877")
+                                 .addFormParam("IpPermissions.0.IpProtocol", "tcp")
+                                 .addFormParam("IpPermissions.0.ToPort", "40")
+                                 .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("us-east-1/sg-3c6ef654");
+      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.getId());
+      
+      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.getProviderId()));
+   }
+
+   private Multimap<String, String> emptyMultimap() {
+      return LinkedHashMultimap.create();
+   }
+
+   private Set<String> emptyStringSet() {
+      return Sets.newLinkedHashSet();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionLiveTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionLiveTest.java
new file mode 100644
index 0000000..c3d77eb
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/extensions/AWSEC2SecurityGroupExtensionLiveTest.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.compute.extensions;
+
+
+import org.jclouds.compute.extensions.internal.BaseSecurityGroupExtensionLiveTest;
+import org.testng.annotations.Test;
+
+
+/**
+ * Live test for aws-ec2 {@link SecurityGroupExtension} implementation
+ * 
+ * @author Andrew Bayer
+ * 
+ */
+@Test(groups = "live", singleThreaded = true, testName = "AWSEC2SecurityGroupExtensionLiveTest")
+public class AWSEC2SecurityGroupExtensionLiveTest extends BaseSecurityGroupExtensionLiveTest {
+
+   public AWSEC2SecurityGroupExtensionLiveTest() {
+      provider = "aws-ec2";
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/AWSEC2SecurityGroupToSecurityGroupTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/AWSEC2SecurityGroupToSecurityGroupTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/AWSEC2SecurityGroupToSecurityGroupTest.java
new file mode 100644
index 0000000..8c0bc44
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/AWSEC2SecurityGroupToSecurityGroupTest.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.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;
+
+/**
+ * @author Andrew Bayer
+ */
+@Test(groups = "unit", testName = "AWSEC2SecurityGroupToSecurityGroupTest")
+public class AWSEC2SecurityGroupToSecurityGroupTest {
+
+   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();
+
+      AWSEC2SecurityGroupToSecurityGroup parser = createGroupParser(ImmutableSet.of(provider));
+
+      SecurityGroup group = parser.apply(origGroup);
+      
+      assertEquals(group.getLocation(), provider);
+      assertEquals(group.getId(), provider.getId() + "/" + origGroup.getId());
+      assertEquals(group.getProviderId(), origGroup.getId());
+      assertEquals(group.getName(), origGroup.getName());
+      assertEquals(group.getIpPermissions(), (Set<IpPermission>)origGroup);
+      assertEquals(group.getOwnerId(), origGroup.getOwnerId());
+   }
+
+   private AWSEC2SecurityGroupToSecurityGroup createGroupParser(final ImmutableSet<Location> locations) {
+      Supplier<Set<? extends Location>> locationSupplier = new Supplier<Set<? extends Location>>() {
+
+         @Override
+         public Set<? extends Location> get() {
+            return locations;
+         }
+
+      };
+
+      AWSEC2SecurityGroupToSecurityGroup parser = new AWSEC2SecurityGroupToSecurityGroup(locationSupplier);
+
+      return parser;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/AWSRunningInstanceToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/AWSRunningInstanceToNodeMetadataTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/AWSRunningInstanceToNodeMetadataTest.java
new file mode 100644
index 0000000..f231882
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/AWSRunningInstanceToNodeMetadataTest.java
@@ -0,0 +1,220 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.compute.functions;
+
+import static org.testng.Assert.assertEquals;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.jclouds.aws.ec2.AWSEC2ApiMetadata;
+import org.jclouds.aws.ec2.domain.AWSRunningInstance;
+import org.jclouds.aws.ec2.domain.MonitoringState;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.NodeMetadataBuilder;
+import org.jclouds.compute.domain.NodeMetadata.Status;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.date.DateService;
+import org.jclouds.domain.Credentials;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.ec2.compute.config.EC2ComputeServiceDependenciesModule;
+import org.jclouds.ec2.compute.domain.RegionAndName;
+import org.jclouds.ec2.compute.functions.ImagesToRegionAndIdMap;
+import org.jclouds.ec2.domain.Attachment;
+import org.jclouds.ec2.domain.BlockDevice;
+import org.jclouds.ec2.domain.Hypervisor;
+import org.jclouds.ec2.domain.InstanceState;
+import org.jclouds.ec2.domain.RootDeviceType;
+import org.testng.annotations.BeforeTest;
+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;
+
+/**
+ * @author Adrian Cole
+ */
+@Test(groups = "unit")
+public class AWSRunningInstanceToNodeMetadataTest {
+
+   private static final String defaultRegion = "us-east-1";
+   static Location provider = new LocationBuilder().scope(LocationScope.REGION).id(defaultRegion).description(
+            defaultRegion).build();
+
+   private DateService dateService;
+
+   @BeforeTest
+   protected void setUpInjector() {
+      dateService = Guice.createInjector().getInstance(DateService.class);
+      assert dateService != null;
+   }
+
+   @Test
+   public void test2Nodes() {
+
+      AWSRunningInstanceToNodeMetadata parser = createNodeParser(ImmutableSet.<Hardware> of(), ImmutableSet
+               .<Location> of(), ImmutableSet.<Image> of(), ImmutableMap.<String, Credentials> of());
+
+      ImmutableSet<AWSRunningInstance> contents = ImmutableSet.of(new AWSRunningInstance.Builder()
+               .region(defaultRegion)
+               .instanceId("i-911444f0")
+               .imageId("ami-63be790a")
+               .instanceState(InstanceState.RUNNING)
+               .rawState("running")
+               .privateDnsName("ip-10-212-81-7.ec2.internal")
+               .dnsName("ec2-174-129-173-155.compute-1.amazonaws.com")
+               .keyName("jclouds#zkclustertest#23")
+               .amiLaunchIndex("0")
+               .instanceType("t1.micro")
+               .launchTime(dateService.iso8601DateParse("2011-08-16T13:40:50.000Z"))
+               .availabilityZone("us-east-1c")
+               .kernelId("aki-427d952b")
+               .monitoringState(MonitoringState.DISABLED)
+               .privateIpAddress("10.212.81.7")
+               .ipAddress("174.129.173.155")
+               .securityGroupIdToNames(ImmutableMap.<String, String> of("sg-ef052b86", "jclouds#zkclustertest"))
+               .rootDeviceType(RootDeviceType.EBS)
+               .rootDeviceName("/dev/sda1")
+               .device("/dev/sda1", new BlockDevice("vol-5829fc32", Attachment.Status.ATTACHED, dateService.iso8601DateParse("2011-08-16T13:41:19.000Z"), true))
+               .virtualizationType("paravirtual")
+               .tag("Name", "foo")
+               .tag("Empty", "")
+               .hypervisor(Hypervisor.XEN)
+               .build(),//
+               new AWSRunningInstance.Builder()
+                        .region(defaultRegion)
+                        .instanceId("i-931444f2")
+                        .imageId("ami-63be790a")
+                        .instanceState(InstanceState.RUNNING)
+                        .rawState("running")
+                        .privateDnsName("ip-10-212-185-8.ec2.internal")
+                        .dnsName("ec2-50-19-207-248.compute-1.amazonaws.com")
+                        .keyName("jclouds#zkclustertest#23")
+                        .amiLaunchIndex("0")
+                        .instanceType("t1.micro")
+                        .launchTime(dateService.iso8601DateParse("2011-08-16T13:40:50.000Z"))
+                        .availabilityZone("us-east-1c")
+                        .kernelId("aki-427d952b")
+                        .monitoringState(MonitoringState.DISABLED)
+                        .privateIpAddress("10.212.185.8")
+                        .ipAddress("50.19.207.248")
+                        .securityGroupIdToNames(ImmutableMap.<String, String>of("sg-ef052b86", "jclouds#zkclustertest"))
+                        .rootDeviceType(RootDeviceType.EBS)
+                        .rootDeviceName("/dev/sda1")
+                        .device("/dev/sda1", new BlockDevice("vol-5029fc3a", Attachment.Status.ATTACHED, dateService.iso8601DateParse("2011-08-16T13:41:19.000Z"), true))
+                        .virtualizationType("paravirtual")
+                        .hypervisor(Hypervisor.XEN)
+                        .build());
+
+      assertEquals(
+            parser.apply(Iterables.get(contents, 0)).toString(),
+            new NodeMetadataBuilder()
+                  .status(Status.RUNNING)
+                  .backendStatus("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().toString());
+      assertEquals(
+              parser.apply(Iterables.get(contents, 1)).toString(), 
+              new NodeMetadataBuilder()
+                  .status(Status.RUNNING)
+                  .backendStatus("running")
+                  .group("zkclustertest")
+                  .hostname("ip-10-212-185-8")
+                  .privateAddresses(ImmutableSet.of("10.212.185.8"))
+                  .publicAddresses(ImmutableSet.of("50.19.207.248"))
+                  .imageId("us-east-1/ami-63be790a")
+                  .id("us-east-1/i-931444f2")
+                  .providerId("i-931444f2")
+                  .build().toString());
+   }
+
+   protected AWSRunningInstanceToNodeMetadata createNodeParser(final ImmutableSet<Hardware> hardware,
+            final ImmutableSet<Location> locations, Set<org.jclouds.compute.domain.Image> images,
+            Map<String, Credentials> credentialStore) {
+      Map<InstanceState, Status> instanceToNodeStatus = EC2ComputeServiceDependenciesModule.toPortableNodeStatus;
+
+      final Map<RegionAndName, ? extends Image> backing = ImagesToRegionAndIdMap.imagesToMap(images);
+
+      LoadingCache<RegionAndName, Image> instanceToImage = CacheBuilder.newBuilder().build(new CacheLoader<RegionAndName, Image>() {
+    
+         @Override
+         public Image load(RegionAndName key) throws Exception {
+            return backing.get(key);
+         }
+         
+      });
+            
+          
+      return createNodeParser(hardware, locations, credentialStore, instanceToNodeStatus, instanceToImage);
+   }
+
+   private AWSRunningInstanceToNodeMetadata createNodeParser(final ImmutableSet<Hardware> hardware,
+            final ImmutableSet<Location> locations, Map<String, Credentials> credentialStore,
+            Map<InstanceState, Status> instanceToNodeStatus, LoadingCache<RegionAndName, ? extends 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 AWSEC2ApiMetadata().getDefaultProperties());
+         }
+
+      }).getInstance(GroupNamingConvention.Factory.class);
+
+      AWSRunningInstanceToNodeMetadata parser = new AWSRunningInstanceToNodeMetadata(instanceToNodeStatus,
+            credentialStore, Suppliers.<LoadingCache<RegionAndName, ? extends Image>> ofInstance(instanceToImage),
+            locationSupplier, hardwareSupplier, namingConvention);
+      return parser;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/PresentSpotRequestsAndInstancesTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/PresentSpotRequestsAndInstancesTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/PresentSpotRequestsAndInstancesTest.java
new file mode 100644
index 0000000..babe978
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/functions/PresentSpotRequestsAndInstancesTest.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.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.aws.ec2.AWSEC2Api;
+import org.jclouds.aws.ec2.domain.AWSRunningInstance;
+import org.jclouds.aws.ec2.domain.SpotInstanceRequest;
+import org.jclouds.aws.ec2.features.AWSInstanceApi;
+import org.jclouds.aws.ec2.features.SpotInstanceApi;
+import org.jclouds.ec2.compute.domain.RegionAndName;
+import org.jclouds.ec2.domain.Reservation;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Function;
+import com.google.common.base.Functions;
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * @author Adrian Cole
+ */
+@Test(groups = "unit")
+public class PresentSpotRequestsAndInstancesTest {
+   AWSRunningInstance instance1 = createMock(AWSRunningInstance.class);
+   AWSRunningInstance instance2 = createMock(AWSRunningInstance.class);
+
+   @SuppressWarnings("unchecked")
+   @Test
+   public void testWhenInstancesPresentSingleCall() {
+
+      AWSEC2Api client = createMock(AWSEC2Api.class);
+      AWSInstanceApi instanceApi = createMock(AWSInstanceApi.class);
+      Function<SpotInstanceRequest, AWSRunningInstance> converter = createMock(Function.class);
+
+      expect(client.getInstanceApi()).andReturn((Optional) Optional.of(instanceApi));
+      
+      // avoid imatcher fail.  if you change this, be sure to check multiple jres
+      expect(instanceApi.describeInstancesInRegion("us-east-1", "i-aaaa", "i-bbbb")).andReturn(
+            Set.class.cast(ImmutableSet.of(Reservation.<AWSRunningInstance> builder().region("us-east-1")
+                  .instances(ImmutableSet.of(instance1, instance2)).build())));
+
+      replay(client, instanceApi, converter);
+
+      PresentSpotRequestsAndInstances fn = new PresentSpotRequestsAndInstances(client, converter);
+
+      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, instanceApi, converter);
+   }
+
+   SpotInstanceRequest spot1 = createMock(SpotInstanceRequest.class);
+   SpotInstanceRequest spot2 = createMock(SpotInstanceRequest.class);
+
+   @Test
+   public void testWhenSpotsPresentSingleCall() {
+
+      Function<SpotInstanceRequest, AWSRunningInstance> converter = Functions.forMap(ImmutableMap.of(spot1, instance1,
+            spot2, instance2));
+
+      AWSEC2Api client = createMock(AWSEC2Api.class);
+      SpotInstanceApi spotApi = createMock(SpotInstanceApi.class);
+
+      expect(client.getSpotInstanceApi()).andReturn((Optional) Optional.of(spotApi));
+      expect(spotApi.describeSpotInstanceRequestsInRegion("us-east-1", "sir-aaaa", "sir-bbbb")).andReturn(
+            ImmutableSet.of(spot1, spot2));
+
+      replay(client, spotApi);
+
+      PresentSpotRequestsAndInstances fn = new PresentSpotRequestsAndInstances(client, converter);
+
+      assertEquals(fn.apply(ImmutableSet.of(new RegionAndName("us-east-1", "sir-aaaa"), new RegionAndName("us-east-1",
+            "sir-bbbb"))), ImmutableSet.of(instance1, instance2));
+
+      verify(client, spotApi);
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/internal/BaseAWSEC2ComputeServiceExpectTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/internal/BaseAWSEC2ComputeServiceExpectTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/internal/BaseAWSEC2ComputeServiceExpectTest.java
new file mode 100644
index 0000000..c5f9838
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/internal/BaseAWSEC2ComputeServiceExpectTest.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.compute.internal;
+
+import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMI_QUERY;
+import static org.jclouds.ec2.reference.EC2Constants.PROPERTY_EC2_GENERATE_INSTANCE_NAMES;
+
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.jclouds.aws.ec2.config.AWSEC2HttpApiModule;
+import org.jclouds.date.DateService;
+import org.jclouds.ec2.compute.internal.BaseEC2ComputeServiceExpectTest;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.ConfiguresHttpApi;
+import org.testng.annotations.BeforeClass;
+
+import com.google.common.base.Supplier;
+import com.google.inject.Module;
+import com.google.inject.Provides;
+import com.google.inject.TypeLiteral;
+
+/**
+ * Tests the compute service abstraction of the EC2 api.
+ * 
+ * @author Adrian Cole
+ */
+public abstract class BaseAWSEC2ComputeServiceExpectTest extends BaseEC2ComputeServiceExpectTest {
+
+   protected HttpRequest describeSecurityGroupByIdRequest;
+
+   public BaseAWSEC2ComputeServiceExpectTest() {
+      provider = "aws-ec2";
+   }
+
+   @Override
+   protected Properties setupProperties() {
+      Properties properties = super.setupProperties();
+      // zero out cluster image query for now
+      properties.setProperty(PROPERTY_EC2_CC_AMI_QUERY, "");
+      properties.setProperty(PROPERTY_EC2_GENERATE_INSTANCE_NAMES, "false");
+      return properties;
+   }
+
+   @BeforeClass
+   @Override
+   protected void setupDefaultRequests() {
+      super.setupDefaultRequests();
+
+      describeSecurityGroupByIdRequest =
+              formSigner.filter(HttpRequest.builder()
+                      .method("POST")
+                      .endpoint("https://ec2." + region + ".amazonaws.com/")
+                      .addHeader("Host", "ec2." + region + ".amazonaws.com")
+                      .addFormParam("Action", "DescribeSecurityGroups")
+                      .addFormParam("GroupId.1", "sg-3c6ef654").build());
+
+      authorizeSecurityGroupIngressRequestGroup =
+              formSigner.filter(HttpRequest.builder()
+                      .method("POST")
+                      .endpoint("https://ec2." + region + ".amazonaws.com/")
+                      .addHeader("Host", "ec2." + region + ".amazonaws.com")
+                      .addFormParam("Action", "AuthorizeSecurityGroupIngress")
+                      .addFormParam("SourceSecurityGroupId", "sg-3c6ef654")
+                      .addFormParam("SourceSecurityGroupOwnerId", "993194456877")
+                      .addFormParam("GroupName", "jclouds#test").build());
+
+      authorizeSecurityGroupIngressRequest22 = 
+         formSigner.filter(HttpRequest.builder()
+                           .method("POST")
+                           .endpoint("https://ec2." + region + ".amazonaws.com/")
+                           .addHeader("Host", "ec2." + region + ".amazonaws.com")
+                           .addFormParam("Action", "AuthorizeSecurityGroupIngress")
+                           .addFormParam("GroupId", "sg-3c6ef654")
+                           .addFormParam("IpPermissions.0.FromPort", "22")
+                           .addFormParam("IpPermissions.0.ToPort", "22")
+                           .addFormParam("IpPermissions.0.IpRanges.0.CidrIp", "0.0.0.0/0")
+                           .addFormParam("IpPermissions.0.IpProtocol", "tcp")
+                           .addFormParam("IpPermissions.1.FromPort", "0")
+                           .addFormParam("IpPermissions.1.ToPort", "65535")
+                           .addFormParam("IpPermissions.1.Groups.0.GroupId", "sg-3c6ef654")
+                           .addFormParam("IpPermissions.1.Groups.0.UserId", "993194456877")
+                           .addFormParam("IpPermissions.1.IpProtocol", "tcp")
+                           .addFormParam("IpPermissions.2.FromPort", "0")
+                           .addFormParam("IpPermissions.2.ToPort", "65535")
+                           .addFormParam("IpPermissions.2.Groups.0.GroupId", "sg-3c6ef654")
+                           .addFormParam("IpPermissions.2.Groups.0.UserId", "993194456877")
+                           .addFormParam("IpPermissions.2.IpProtocol", "udp")
+                           .build());
+
+      describeImagesRequest = 
+               formSigner.filter(HttpRequest.builder()
+                          .method("POST")
+                          .endpoint("https://ec2." + region + ".amazonaws.com/")
+                          .addHeader("Host", "ec2." + region + ".amazonaws.com")
+                          .addFormParam("Action", "DescribeImages")
+                          .addFormParam("Filter.1.Name", "owner-id")
+                          .addFormParam("Filter.1.Value.1", "137112412989")
+                          .addFormParam("Filter.1.Value.2", "801119661308")
+                          .addFormParam("Filter.1.Value.3", "063491364108")
+                          .addFormParam("Filter.1.Value.4", "099720109477")
+                          .addFormParam("Filter.1.Value.5", "411009282317")
+                          .addFormParam("Filter.2.Name", "state")
+                          .addFormParam("Filter.2.Value.1", "available")
+                          .addFormParam("Filter.3.Name", "image-type")
+                          .addFormParam("Filter.3.Value.1", "machine").build());
+   }
+
+   @ConfiguresHttpApi
+   protected static class TestAWSEC2HttpApiModule extends AWSEC2HttpApiModule {
+
+      @Override
+      protected void configure() {
+         super.configure();
+         // predicatable node names
+         final AtomicInteger suffix = new AtomicInteger();
+         bind(new TypeLiteral<Supplier<String>>() {
+         }).toInstance(new Supplier<String>() {
+
+            @Override
+            public String get() {
+               return suffix.getAndIncrement() + "";
+            }
+
+         });
+      }
+
+      @Override
+      @Provides
+      protected String provideTimeStamp(DateService dateService) {
+         return CONSTANT_DATE;
+      }
+   }
+
+   @Override
+   protected Module createModule() {
+      return new TestAWSEC2HttpApiModule();
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/60b2f3fa/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeededTest.java
----------------------------------------------------------------------
diff --git a/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeededTest.java b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeededTest.java
new file mode 100644
index 0000000..60f86f5
--- /dev/null
+++ b/dependencies/jclouds/provider/aws-ec2/1.7.1-stratos/src/test/java/org/jclouds/aws/ec2/compute/loaders/AWSEC2CreateSecurityGroupIfNeededTest.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.aws.ec2.compute.loaders;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
+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 java.util.concurrent.ExecutionException;
+
+import org.jclouds.aws.ec2.features.AWSSecurityGroupApi;
+import org.jclouds.ec2.compute.domain.RegionAndName;
+import org.jclouds.ec2.compute.domain.RegionNameAndIngressRules;
+import org.jclouds.ec2.compute.functions.EC2SecurityGroupIdFromName;
+import org.jclouds.ec2.domain.SecurityGroup;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * @author Adrian Cole
+ * @author Andrew Bayer
+ */
+@Test(groups = "unit", singleThreaded = true, testName = "AWSEC2CreateSecurityGroupIfNeeded")
+public class AWSEC2CreateSecurityGroupIfNeededTest {
+
+   @SuppressWarnings("unchecked")
+   @Test
+   public void testWhenPort22AndToItselfAuthorizesIngressOnce() throws ExecutionException {
+
+      AWSSecurityGroupApi client = createMock(AWSSecurityGroupApi.class);
+      Predicate<RegionAndName> tester = Predicates.alwaysTrue();
+
+      SecurityGroup group = createNiceMock(SecurityGroup.class);
+      Set<SecurityGroup> groups = ImmutableSet.<SecurityGroup> of(group);
+
+      EC2SecurityGroupIdFromName groupIdFromName = createMock(EC2SecurityGroupIdFromName.class);
+
+      ImmutableSet.Builder<IpPermission> permissions = ImmutableSet.builder();
+
+      permissions.add(IpPermission.builder()
+                      .fromPort(22)
+                      .toPort(22)
+                      .ipProtocol(IpProtocol.TCP)
+                      .cidrBlock("0.0.0.0/0")
+                      .build());
+
+      permissions.add(IpPermission.builder()
+                      .fromPort(0)
+                      .toPort(65535)
+                      .ipProtocol(IpProtocol.TCP)
+                      .tenantIdGroupNamePair("ownerId", "sg-123456")
+                      .build());
+      permissions.add(IpPermission.builder()
+                      .fromPort(0)
+                      .toPort(65535)
+                      .ipProtocol(IpProtocol.UDP)
+                      .tenantIdGroupNamePair("ownerId", "sg-123456")
+                      .build());
+      
+      client.createSecurityGroupInRegion("region", "group", "group");
+      expect(group.getOwnerId()).andReturn("ownerId");
+      expect(groupIdFromName.apply("region/group")).andReturn("sg-123456");
+      client.authorizeSecurityGroupIngressInRegion("region", "sg-123456", permissions.build());
+      expect(client.describeSecurityGroupsInRegion("region", "group")).andReturn(Set.class.cast(groups));
+
+
+      replay(client);
+      replay(group);
+      replay(groupIdFromName);
+
+      AWSEC2CreateSecurityGroupIfNeeded function = new AWSEC2CreateSecurityGroupIfNeeded(client, groupIdFromName, tester);
+
+      assertEquals("group", function.load(new RegionNameAndIngressRules("region", "group", new int[] { 22 }, true)));
+
+      verify(client);
+      verify(group);
+      verify(groupIdFromName);
+
+   }
+}